Imported Upstream version 2.6.7 upstream/2.6.7
authorBowon Ryu <bowon.ryu@samsung.com>
Tue, 22 Dec 2020 07:48:00 +0000 (16:48 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Tue, 22 Dec 2020 07:48:00 +0000 (16:48 +0900)
1292 files changed:
BUILD.md
CMakeLists.txt
CONFIG.md
COPYING
ChangeLog
Makefile.am
Makefile.in
NEWS
README
README.md
README.mingw.md [deleted file]
RELEASING.md
TESTING.md
aclocal.m4
ar-lib
compile
config.guess
config.h.in
config.sub
configure
configure.ac
depcomp
docs/HarfBuzz.png
docs/HarfBuzz.svg
docs/Makefile.am
docs/Makefile.in
docs/harfbuzz-docs.xml
docs/harfbuzz-sections.txt
docs/harfbuzz.types [deleted file]
docs/html/HarfBuzz.png
docs/html/HarfBuzz.svg
docs/html/a-clustering-example-for-levels-0-and-1.html
docs/html/aat-shaping.html
docs/html/adding-text-to-the-buffer.html
docs/html/annotation-glossary.html
docs/html/api-index-full.html
docs/html/buffers-language-script-and-direction.html
docs/html/building.html
docs/html/ch01s03.html
docs/html/ch03s02.html
docs/html/ch03s03.html
docs/html/ch11.html [deleted file]
docs/html/ch12.html
docs/html/ch13.html
docs/html/ch14.html
docs/html/ch15.html [new file with mode: 0644]
docs/html/clusters.html
docs/html/complex-scripts.html
docs/html/customizing-unicode-functions.html
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-face.html
docs/html/harfbuzz-hb-font.html
docs/html/harfbuzz-hb-ft.html
docs/html/harfbuzz-hb-glib.html
docs/html/harfbuzz-hb-gobject.html
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-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-unicode.html
docs/html/harfbuzz-hb-uniscribe.html
docs/html/harfbuzz-hb-version.html
docs/html/harfbuzz.devhelp2
docs/html/index.html
docs/html/install-harfbuzz.html
docs/html/integration-coretext.html [new file with mode: 0644]
docs/html/integration-freetype.html [new file with mode: 0644]
docs/html/integration-icu.html [new file with mode: 0644]
docs/html/integration-python.html [new file with mode: 0644]
docs/html/integration-uniscribe.html [new file with mode: 0644]
docs/html/integration.html [new file with mode: 0644]
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-shaping-models.html
docs/html/pt01.html
docs/html/pt02.html
docs/html/reordering-in-levels-0-and-1.html
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.css
docs/html/text-runs.html
docs/html/the-distinction-between-levels-0-and-1.html
docs/html/unicode-character-categories.html
docs/html/utilities-common-types-apis.html
docs/html/utilities-ucdn.html
docs/html/utilities.html
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 [new file with mode: 0644]
docs/usermanual-buffers-language-script-and-direction.xml
docs/usermanual-install-harfbuzz.xml
docs/usermanual-integration.xml [new file with mode: 0644]
docs/usermanual-object-model.xml
docs/usermanual-utilities.xml
docs/version.xml
install-sh
ltmain.sh
m4/ax_cxx_compile_stdcxx.m4
m4/libtool.m4
m4/ltoptions.m4
m4/ltsugar.m4
m4/ltversion.m4
m4/lt~obsolete.m4
meson-cc-tests/intel-atomic-primitives-test.c [new file with mode: 0644]
meson-cc-tests/solaris-atomic-operations.c [new file with mode: 0644]
meson.build [new file with mode: 0644]
meson_options.txt [new file with mode: 0644]
mingw-configure.sh [deleted file]
mingw-ldd.py [deleted file]
mingw32.sh [deleted file]
mingw64.sh [deleted file]
missing
src/Makefile.am
src/Makefile.in
src/Makefile.sources
src/check-c-linkage-decls.py [new file with mode: 0755]
src/check-c-linkage-decls.sh [deleted file]
src/check-externs.py [new file with mode: 0755]
src/check-externs.sh [deleted file]
src/check-header-guards.py [new file with mode: 0755]
src/check-header-guards.sh [deleted file]
src/check-includes.py [new file with mode: 0755]
src/check-includes.sh [deleted file]
src/check-libstdc++.py [new file with mode: 0755]
src/check-libstdc++.sh [deleted file]
src/check-static-inits.py [new file with mode: 0755]
src/check-static-inits.sh [deleted file]
src/check-symbols.py [new file with mode: 0755]
src/check-symbols.sh [deleted file]
src/fix_get_types.py [new file with mode: 0644]
src/gen-arabic-table.py
src/gen-def.py
src/gen-emoji-table.py
src/gen-harfbuzzcc.py [new file with mode: 0755]
src/gen-hb-version.py [new file with mode: 0755]
src/gen-indic-table.py
src/gen-os2-unicode-ranges.py
src/gen-ragel-artifacts.py [new file with mode: 0755]
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
src/hb-aat-layout-ankr-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
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.hh
src/hb-aat-map.cc
src/hb-aat-map.hh
src/hb-algs.hh
src/hb-array.hh
src/hb-bimap.hh
src/hb-blob.cc
src/hb-buffer.cc
src/hb-buffer.h
src/hb-buffer.hh
src/hb-cff-interp-common.hh
src/hb-cff-interp-cs-common.hh
src/hb-cff-interp-dict-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-coretext.h
src/hb-debug.hh
src/hb-directwrite.cc
src/hb-draw.cc [new file with mode: 0644]
src/hb-draw.h [new file with mode: 0644]
src/hb-draw.hh [new file with mode: 0644]
src/hb-face.cc
src/hb-face.hh
src/hb-font.cc
src/hb-font.h
src/hb-font.hh
src/hb-ft.cc
src/hb-ft.h
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-gobject.h
src/hb-graphite2.cc
src/hb-graphite2.h
src/hb-icu.cc
src/hb-kern.hh
src/hb-machinery.hh
src/hb-map.cc
src/hb-map.hh
src/hb-meta.hh
src/hb-null.hh
src/hb-number-parser.hh
src/hb-number-parser.rl
src/hb-number.cc
src/hb-open-file.hh
src/hb-open-type.hh
src/hb-ot-cff-common.hh
src/hb-ot-cff1-std-str.hh [new file with mode: 0644]
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-cpal-table.hh
src/hb-ot-color-sbix-table.hh
src/hb-ot-color-svg-table.hh
src/hb-ot-font.cc
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-hhea-table.hh
src/hb-ot-hmtx-table.hh
src/hb-ot-kern-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.hh
src/hb-ot-math-table.hh
src/hb-ot-maxp-table.hh
src/hb-ot-meta-table.hh
src/hb-ot-name-language-static.hh
src/hb-ot-name-table.hh
src/hb-ot-os2-table.hh
src/hb-ot-os2-unicode-ranges.hh
src/hb-ot-post-table.hh
src/hb-ot-shape-complex-arabic-fallback.hh
src/hb-ot-shape-complex-arabic-table.hh
src/hb-ot-shape-complex-arabic.cc
src/hb-ot-shape-complex-default.cc
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-myanmar-machine.rl
src/hb-ot-shape-complex-use-table.cc
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.cc
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-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-vorg-table.hh
src/hb-pool.hh
src/hb-sanitize.hh
src/hb-serialize.hh
src/hb-set.cc
src/hb-set.hh
src/hb-shape-plan.cc
src/hb-shaper.hh
src/hb-static.cc
src/hb-string-array.hh
src/hb-subset-cff-common.cc
src/hb-subset-cff-common.hh
src/hb-subset-cff1.cc
src/hb-subset-cff1.hh
src/hb-subset-cff2.cc
src/hb-subset-cff2.hh
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.hh
src/hb-uniscribe.cc
src/hb-vector.hh
src/hb-version.h
src/hb.h
src/hb.hh
src/main.cc
src/meson.build [new file with mode: 0644]
src/test-array.cc [new file with mode: 0644]
src/test-buffer-serialize.cc
src/test-iter.cc
src/test-meta.cc
src/test-number.cc
src/test-ot-color.cc [deleted file]
src/test-ot-glyphname.cc [new file with mode: 0644]
subprojects/expat.wrap [new file with mode: 0644]
subprojects/fontconfig.wrap [new file with mode: 0644]
subprojects/freetype2.wrap [new file with mode: 0644]
subprojects/glib.wrap [new file with mode: 0644]
subprojects/libffi.wrap [new file with mode: 0644]
subprojects/proxy-libintl.wrap [new file with mode: 0644]
subprojects/zlib.wrap [new file with mode: 0644]
test-driver
test/CMakeLists.txt [deleted file]
test/Makefile.am
test/Makefile.in
test/api/CMakeLists.txt [deleted file]
test/api/Makefile.am
test/api/Makefile.in
test/api/fonts/AdobeVFPrototype-Subset.otf [new file with mode: 0644]
test/api/fonts/AdobeVFPrototype.WA.gpos.otf [new file with mode: 0644]
test/api/fonts/AdobeVFPrototype.WAV.gpos.otf [new file with mode: 0644]
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/Estedad-VF.ttf [new file with mode: 0644]
test/api/fonts/Mada-VF.ttf [new file with mode: 0644]
test/api/fonts/Mplus1p-Regular-cmap4-testing.ttf [new file with mode: 0644]
test/api/fonts/Mplus1p-Regular.ttf [new file with mode: 0644]
test/api/fonts/NotoColorEmoji.cmap.38,AE,2049.ttf [new file with mode: 0644]
test/api/fonts/NotoColorEmoji.cmap.ttf [new file with mode: 0644]
test/api/fonts/NotoColorEmoji.subset.default.2049.ttf [new file with mode: 0644]
test/api/fonts/NotoColorEmoji.subset.default.39.ttf [new file with mode: 0644]
test/api/fonts/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf [new file with mode: 0644]
test/api/fonts/NotoColorEmoji.subset.index_format3.ttf [new file with mode: 0644]
test/api/fonts/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf [new file with mode: 0644]
test/api/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf [new file with mode: 0644]
test/api/fonts/NotoColorEmoji.subset.ttf [new file with mode: 0644]
test/api/fonts/NotoNastaliqUrdu-Regular.ttf [new file with mode: 0644]
test/api/fonts/NotoSansCJKkr-Regular-subset-colon.ttf [new file with mode: 0644]
test/api/fonts/OpenSans-Regular.ttf [new file with mode: 0644]
test/api/fonts/README
test/api/fonts/RanaKufi-Regular.subset.otf [new file with mode: 0644]
test/api/fonts/Roboto-Regular-gpos-.aw.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular-gpos-aw.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular.empty.ttf [new file with mode: 0644]
test/api/fonts/SourceHanSans-Regular.41,4C2E.retaingids.otf
test/api/fonts/SourceSansPro-Regular.otf [new file with mode: 0644]
test/api/fonts/SourceSansVariable-Roman-modHVAR.abc.ttf [new file with mode: 0644]
test/api/fonts/SourceSansVariable-Roman-modHVAR.ac.ttf [new file with mode: 0644]
test/api/fonts/SourceSansVariable-Roman.abc.ttf [new file with mode: 0644]
test/api/fonts/SourceSansVariable-Roman.ac.retaingids.ttf [new file with mode: 0644]
test/api/fonts/SourceSansVariable-Roman.ac.ttf [new file with mode: 0644]
test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.retaingids.ttf [new file with mode: 0644]
test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.ttf [new file with mode: 0644]
test/api/fonts/Stroking.otf [new file with mode: 0644]
test/api/fonts/Stroking.ttf [new file with mode: 0644]
test/api/fonts/TestGVAREight.ttf [new file with mode: 0644]
test/api/fonts/TestGVARFour.ttf [new file with mode: 0644]
test/api/fonts/TestGVAROne.ttf [new file with mode: 0644]
test/api/fonts/TestGVARThree.ttf [new file with mode: 0644]
test/api/fonts/TestGVARTwo.ttf [new file with mode: 0644]
test/api/fonts/TwemojiMozilla.subset.default.32,3299.ttf [new file with mode: 0644]
test/api/fonts/TwemojiMozilla.subset.default.32.ttf [new file with mode: 0644]
test/api/fonts/TwemojiMozilla.subset.default.3297.ttf [new file with mode: 0644]
test/api/fonts/TwemojiMozilla.subset.ttf [new file with mode: 0644]
test/api/fonts/cff1_expert.2D,F6E9,FB00.otf
test/api/fonts/glyphs.ttf [new file with mode: 0644]
test/api/fonts/sbix.ttf [new file with mode: 0644]
test/api/fonts/sbix_X.ttf [new file with mode: 0644]
test/api/hb-subset-test.h
test/api/hb-test.h
test/api/meson.build [new file with mode: 0644]
test/api/test-draw.c [new file with mode: 0644]
test/api/test-ot-face.c
test/api/test-ot-glyphname.c [new file with mode: 0644]
test/api/test-ot-ligature-carets.c
test/api/test-ot-metrics-tt-var.c
test/api/test-ot-tag.c
test/api/test-set.c
test/api/test-subset-cbdt.c [new file with mode: 0644]
test/api/test-subset-cmap.c
test/api/test-subset-colr.c [new file with mode: 0644]
test/api/test-subset-gpos.c [new file with mode: 0644]
test/api/test-subset-gvar.c [new file with mode: 0644]
test/api/test-subset-hvar.c [new file with mode: 0644]
test/api/test-subset-sbix.c [new file with mode: 0644]
test/api/test-subset-vvar.c [new file with mode: 0644]
test/api/test-unicode.c
test/api/test-var-coords.c [new file with mode: 0644]
test/fuzzing/CMakeLists.txt [deleted file]
test/fuzzing/Makefile.am
test/fuzzing/Makefile.in
test/fuzzing/fonts/1746cad6bc3fb2b355db50a5af37c9b58d9ad376 [new file with mode: 0644]
test/fuzzing/fonts/NotoColorEmoji.subset.index_format3.ttf [new file with mode: 0644]
test/fuzzing/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf [new file with mode: 0644]
test/fuzzing/fonts/NotoColorEmoji.subset.ttf [new file with mode: 0644]
test/fuzzing/fonts/TwemojiMozilla.subset.ttf [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-4822416500195328 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-5598263003840512 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-6327734241591296 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5072750494875648 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5638729035677696 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5643643755429888 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5644258942386176 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5657878543728640 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5680362806575104 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5689920685867008 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5641053680173056 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5686749313892352 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5756332481708032 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4601449528688640 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4684060812378112 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4710179695493120 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4850271066914816 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4977194146988032 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5012913062150144 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5017946948370432 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5103148350963712 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5151890782027776 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5157039562162176 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5163560220753920 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5170405903695872 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5180622648770560 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5221177988743168 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5334300410773504 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5644474732249088 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5677289226108928 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5719356528656384 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5740518101090304 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5952939792531456 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6107935408390144 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6120104833843200 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6128803416637440 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6142466903506944 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6198448785981440 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6223034666713088 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6462232674959360 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6600932143136768 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6603291950841856 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6712347260092416 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer.exe-5470269447340032 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5088336521986048 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5668491560747008 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5681465586352128 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5686960406659072 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5703524300357632 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5712313459146752 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5750654771658752 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-set-fuzzer-6255224052514816 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5154718402215936 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5158673602314240 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5196560812474368 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5632586529898496 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5642666339991552 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5642899625082880 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5648999235715072 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5652700541222912 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5658272078495744 [moved from test/api/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5658272078495744 with 100% similarity]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5666162551029760 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5711096049041408 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5711472756260864 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5712050577211392 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5742079188140032 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5749627240841216 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5769590820044800 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-6306977171374080 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5121706490593280 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5148388450631680 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5160311461511168 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5167653459329024 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5169035432165376 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5206191479455744 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5640452927127552 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5640889218629632 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641053680173056 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641370503217152 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5642531954229248 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5650879734874112 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5662792105590784 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5674228796358656 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5675720390475776
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5678476148867072 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5684014636859392 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5685097303375872 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695865298092032 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695925913911296 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5697351339999232 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5704307501694976 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708063625969664 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708764082864128 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5711849555755008 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5713850117914624 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5715299773186048 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5719588814979072 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5733203291144192 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5735719311507456 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5741295280848896 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5745268385906688 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747028458209280 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747280156295168 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5753173985984512 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5756658848890880 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5758358618898432 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5759725666041856 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5759783999635456 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5764020596899840 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6276691949518848 [new file with mode: 0644]
test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb_shape_fuzzer-5633785895911424 [new file with mode: 0644]
test/fuzzing/fonts/fuzz-0-harfbuzz_fuzzer [new file with mode: 0644]
test/fuzzing/fonts/fuzz-0-harfbuzz_hb-fuzzer [new file with mode: 0644]
test/fuzzing/fonts/fuzz-1-harfbuzz_fuzzer [new file with mode: 0644]
test/fuzzing/fonts/fuzz-1-harfbuzz_fuzzer(1) [new file with mode: 0644]
test/fuzzing/fonts/fuzz-2-harfbuzz_fuzzer [new file with mode: 0644]
test/fuzzing/fonts/fuzz-2-harfbuzz_fuzzer(1) [new file with mode: 0644]
test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer [new file with mode: 0644]
test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(1) [new file with mode: 0644]
test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(2) [new file with mode: 0644]
test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(3) [new file with mode: 0644]
test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(4) [new file with mode: 0644]
test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(5) [new file with mode: 0644]
test/fuzzing/fonts/kanit.ttf [new file with mode: 0644]
test/fuzzing/fonts/sbix.ttf [new file with mode: 0644]
test/fuzzing/hb-draw-fuzzer.cc [new file with mode: 0644]
test/fuzzing/hb-set-fuzzer.cc [new file with mode: 0644]
test/fuzzing/hb-shape-fuzzer.cc
test/fuzzing/main.cc
test/fuzzing/meson.build [new file with mode: 0644]
test/fuzzing/run-draw-fuzzer-tests.py [new file with mode: 0755]
test/fuzzing/run-shape-fuzzer-tests.py
test/fuzzing/run-subset-fuzzer-tests.py
test/meson.build [new file with mode: 0644]
test/shaping/CMakeLists.txt [deleted file]
test/shaping/Makefile.am
test/shaping/Makefile.in
test/shaping/data/Makefile.in
test/shaping/data/aots/Makefile.am
test/shaping/data/aots/Makefile.in
test/shaping/data/aots/update.py [new file with mode: 0755]
test/shaping/data/in-house/Makefile.in
test/shaping/data/in-house/Makefile.sources
test/shaping/data/in-house/fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf [new file with mode: 0644]
test/shaping/data/in-house/tests/indic-joiners.tests
test/shaping/data/in-house/tests/macos.tests
test/shaping/data/in-house/tests/rotation.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/use.tests
test/shaping/data/text-rendering-tests/DISABLED [new file with mode: 0644]
test/shaping/data/text-rendering-tests/Makefile.am
test/shaping/data/text-rendering-tests/Makefile.in
test/shaping/data/text-rendering-tests/Makefile.sources
test/shaping/data/text-rendering-tests/extract-tests.py [deleted file]
test/shaping/data/text-rendering-tests/fonts/TestAVAR.ttf
test/shaping/data/text-rendering-tests/fonts/TestCMAP14.otf
test/shaping/data/text-rendering-tests/fonts/TestGPOSThree.ttf
test/shaping/data/text-rendering-tests/fonts/TestGPOSTwo.otf
test/shaping/data/text-rendering-tests/fonts/TestGSUBThree.ttf
test/shaping/data/text-rendering-tests/fonts/TestGVARNine.ttf
test/shaping/data/text-rendering-tests/fonts/TestHVAROne.otf
test/shaping/data/text-rendering-tests/fonts/TestKERNOne.otf
test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXEighteen.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXFour.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXFourtyone.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXOne.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXSeventeen.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXSixteen.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfour.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyone.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThirtythree.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThirtytwo.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXThree.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwelve.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwenty.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyeight.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfive.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfour.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentynine.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyone.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyseven.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentysix.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentythree.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentytwo.ttf
test/shaping/data/text-rendering-tests/fonts/TestMORXTwo.ttf
test/shaping/data/text-rendering-tests/fonts/TestSFNTOne.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestSFNTTwo.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestSVGgradientTransform.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestSVGgzip.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestSVGmultiGlyphs.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestShapeLana.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestTRAKOne.ttf
test/shaping/data/text-rendering-tests/meson.build [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/SFNT-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/SFNT-2.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/update.py [new file with mode: 0755]
test/shaping/data/text-rendering-tests/update.sh [deleted file]
test/shaping/hb-diff
test/shaping/hb-diff-colorize
test/shaping/hb-diff-filter-failures
test/shaping/hb-diff-stat
test/shaping/hb-unicode-decode
test/shaping/hb-unicode-encode
test/shaping/hb-unicode-prettyname
test/shaping/hb_test_tools.py
test/shaping/meson.build [new file with mode: 0644]
test/shaping/record-test.sh
test/shaping/run-tests.py
test/subset/CMakeLists.txt [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 [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.gids.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 [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.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 [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.gids.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.gids.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.gids.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.gids.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,AE,2049.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.39.ttf [new file with mode: 0644]
test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf [new file with mode: 0644]
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.61,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.1FC,21,41,20,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.61,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.1FC,21,41,20,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.61,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.61,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.61,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.61,62,63.otf
test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf
test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,62.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,62.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEE6,FECF.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,62.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,62.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,62.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.gids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font1.gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.default.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.default.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.default.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.default.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.default.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.default.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.default.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.drop-hints.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.gids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.name-ids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E02,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E05,4E07.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02,4E03,4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E03.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E05,4E07,4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08,4E09.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08.otf [new file with mode: 0644]
test/subset/data/expected/cmap14/cmap14_font2.retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.default.32.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.default.3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297,3299.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297.ttf [new file with mode: 0644]
test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3299.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 [new file with mode: 0644]
test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf [new file with mode: 0644]
test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf [new file with mode: 0644]
test/subset/data/expected/japanese/Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf [new file with mode: 0644]
test/subset/data/expected/japanese/Mplus1p-Regular.default.25771.ttf [new file with mode: 0644]
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 [new file with mode: 0644]
test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.25771.ttf [new file with mode: 0644]
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 [new file with mode: 0644]
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.25771.ttf [new file with mode: 0644]
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,3048,304A,304B.ttf [new file with mode: 0644]
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf [new file with mode: 0644]
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf [new file with mode: 0644]
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf [new file with mode: 0644]
test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E.ttf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.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 [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.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 [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A01.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A05,A06.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A07,A1B.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A01.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A05,A06.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A07,A1B.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A01.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,56,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.42,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,56,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.42,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.42,57.otf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.default.1E00,303.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.default.303.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.default.309,20,30F.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.default.323.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.default.41,42,43.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.1E00,303.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.303.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.309,20,30F.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.323.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.41,42,43.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.1E00,303.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.303.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.323.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.41,42,43.ttf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.42,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.42,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.43,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.41,42,43.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 [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44,45,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44,45,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.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 [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44,45,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44,45,46.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,45.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.retain-all-codepoint.otf [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 [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.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 [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.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 [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.30,31,32,33.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9,53F1.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53F1.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9,53F1.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53F1.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.retain-all-codepoint.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.41,42,43.otf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.default.58,59.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.default.58.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.default.59.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58,59.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.59.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.drop-hints.58,59.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.drop-hints.58.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.drop-hints.59.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.retain-gids.58,59.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.retain-gids.58.ttf [new file with mode: 0644]
test/subset/data/expected/sbix/sbix.retain-gids.59.ttf [new file with mode: 0644]
test/subset/data/fonts/AdobeBlank-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/AdobeVFPrototype.otf [new file with mode: 0644]
test/subset/data/fonts/IndicTestJalandhar-Regular.ttf [new file with mode: 0644]
test/subset/data/fonts/NanumMyeongjo-Regular-subset.ttf [new file with mode: 0644]
test/subset/data/fonts/NotoColorEmoji.subset.gap.ttf [new file with mode: 0644]
test/subset/data/fonts/NotoColorEmoji.subset.index_format3.ttf [new file with mode: 0644]
test/subset/data/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf [new file with mode: 0644]
test/subset/data/fonts/NotoColorEmoji.subset.ttf [new file with mode: 0644]
test/subset/data/fonts/SourceSerifVariable-Roman.ttf [new file with mode: 0644]
test/subset/data/fonts/TwemojiMozilla.subset.ttf [new file with mode: 0644]
test/subset/data/fonts/cmap14_font2.otf [new file with mode: 0644]
test/subset/data/fonts/gpos4_multiple_anchors_1.otf [new file with mode: 0644]
test/subset/data/fonts/gpos6_font1.otf [new file with mode: 0644]
test/subset/data/fonts/gpos_chaining1_multiple_subrules_f1.otf [new file with mode: 0644]
test/subset/data/fonts/gpos_chaining2_multiple_subrules_f1.otf [new file with mode: 0644]
test/subset/data/fonts/gpos_chaining3_simple_f1.otf [new file with mode: 0644]
test/subset/data/fonts/gpos_context1_multiple_subrules_f1.otf [new file with mode: 0644]
test/subset/data/fonts/gpos_context2_multiple_subrules_f1.otf [new file with mode: 0644]
test/subset/data/fonts/gpos_context3_simple_f1.otf [new file with mode: 0644]
test/subset/data/fonts/gsub_alternate_substitution.otf [new file with mode: 0644]
test/subset/data/fonts/sbix.ttf [new file with mode: 0644]
test/subset/data/profiles/gids.txt [new file with mode: 0644]
test/subset/data/profiles/keep-gdef-gpos.txt [new file with mode: 0644]
test/subset/data/profiles/keep-gdef.txt [new file with mode: 0644]
test/subset/data/profiles/name-languages.txt [new file with mode: 0644]
test/subset/data/profiles/name-legacy.txt [new file with mode: 0644]
test/subset/data/tests/basics.tests
test/subset/data/tests/cbdt.tests [new file with mode: 0644]
test/subset/data/tests/cmap.tests [new file with mode: 0644]
test/subset/data/tests/cmap14.tests
test/subset/data/tests/colr.tests [new file with mode: 0644]
test/subset/data/tests/full-font.tests
test/subset/data/tests/japanese.tests
test/subset/data/tests/layout.gpos.tests [deleted file]
test/subset/data/tests/layout.gpos2.tests [deleted file]
test/subset/data/tests/layout.gpos3.tests [deleted file]
test/subset/data/tests/layout.gsub6.tests [deleted file]
test/subset/data/tests/layout.tests [deleted file]
test/subset/data/tests/sbix.tests [new file with mode: 0644]
test/subset/meson.build [new file with mode: 0644]
test/subset/run-tests.py
test/subset/subset_test_suite.py
util/Makefile.am
util/Makefile.in
util/ansi-print.cc
util/hb-subset.cc
util/meson.build [new file with mode: 0644]
util/options-subset.cc
util/options.cc
util/options.hh
util/view-cairo.cc

index 4c1c306..652d8af 100644 (file)
--- a/BUILD.md
+++ b/BUILD.md
@@ -7,11 +7,8 @@ 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
 
-on Windows, consider using [vcpkg](https://github.com/Microsoft/vcpkg),
-provided by Microsoft, for building HarfBuzz and other open-source libraries
-but if you need to build harfbuzz from source, put ragel binary on your
-PATH and follow appveyor CI's cmake
-[build steps](https://github.com/harfbuzz/harfbuzz/blob/master/appveyor.yml).
+on Windows, consider using [vcpkg](https://github.com/Microsoft/vcpkg)
+or `meson build && ninja -Cbuild`.
 
 on macOS, using MacPorts:
 
index 2a8fd8b..71830b6 100644 (file)
@@ -1,7 +1,7 @@
 cmake_minimum_required(VERSION 2.8.0)
 project(harfbuzz)
 
-enable_testing()
+message("HarfBuzz has a Meson port also and tries to migrate all the other build systems to it, please consider using it.")
 
 ## Limit framework build to Xcode generator
 if (BUILD_FRAMEWORK)
@@ -53,7 +53,6 @@ if (HB_BUILD_UTILS)
 endif ()
 
 option(HB_BUILD_SUBSET "Build harfbuzz-subset" ON)
-option(HB_BUILD_TESTS "Build harfbuzz tests" ON)
 
 option(HB_HAVE_GOBJECT "Enable GObject Bindings" OFF)
 if (HB_HAVE_GOBJECT)
@@ -66,25 +65,6 @@ if (HB_HAVE_INTROSPECTION)
   set (HB_HAVE_GLIB ON)
 endif ()
 
-option(HB_CHECK OFF "Do a configuration suitable for testing (shared library and enable all options)")
-if (HB_CHECK)
-  set (BUILD_SHARED_LIBS ON)
-  set (HB_BUILD_UTILS ON)
-  set (HB_HAVE_ICU)
-  set (HB_HAVE_GLIB ON)
-  #set (HB_HAVE_GOBJECT ON)
-  #set (HB_HAVE_INTROSPECTION ON)
-  set (HB_HAVE_FREETYPE ON)
-  set (HB_HAVE_GRAPHITE2 ON)
-  if (WIN32)
-    set (HB_HAVE_UNISCRIBE ON)
-    set (HB_HAVE_GDI ON)
-    set (HB_HAVE_DIRECTWRITE ON)
-  elseif (APPLE)
-    set (HB_HAVE_CORETEXT ON)
-  endif ()
-endif ()
-
 include_directories(AFTER
   ${PROJECT_SOURCE_DIR}/src
   ${PROJECT_BINARY_DIR}/src
@@ -108,7 +88,7 @@ endmacro ()
 if (UNIX)
   list(APPEND CMAKE_REQUIRED_LIBRARIES m)
 endif ()
-check_funcs(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l roundf)
+check_funcs(atexit mprotect sysconf getpagesize mmap isatty roundf)
 check_include_file(unistd.h HAVE_UNISTD_H)
 if (${HAVE_UNISTD_H})
   add_definitions(-DHAVE_UNISTD_H)
@@ -117,10 +97,6 @@ check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
 if (${HAVE_SYS_MMAN_H})
   add_definitions(-DHAVE_SYS_MMAN_H)
 endif ()
-check_include_file(xlocale.h HAVE_XLOCALE_H)
-if (${HAVE_XLOCALE_H})
-  add_definitions(-DHAVE_XLOCALE_H)
-endif ()
 check_include_file(stdbool.h HAVE_STDBOOL_H)
 if (${HAVE_STDBOOL_H})
   add_definitions(-DHAVE_STDBOOL_H)
@@ -147,7 +123,7 @@ function (extract_make_variable variable makefile_source)
   set (${variable} ${listVar} PARENT_SCOPE)
 endfunction ()
 
-# http://stackoverflow.com/a/27630120
+# https://stackoverflow.com/a/27630120
 function (add_prefix_to_list var prefix)
   set (listVar "")
   foreach (f ${${var}})
@@ -465,6 +441,19 @@ endif ()
 add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers})
 target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})
 
+
+## Define harfbuzz-icu library
+if (HB_HAVE_ICU)
+  add_library(harfbuzz-icu ${PROJECT_SOURCE_DIR}/src/hb-icu.cc ${PROJECT_SOURCE_DIR}/src/hb-icu.h)
+  add_dependencies(harfbuzz-icu harfbuzz)
+  target_link_libraries(harfbuzz-icu harfbuzz ${THIRD_PARTY_LIBS})
+
+  if (BUILD_SHARED_LIBS)
+    set_target_properties(harfbuzz harfbuzz-icu PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE)
+  endif ()
+endif ()
+
+
 ## Define harfbuzz-subset library
 if (HB_BUILD_SUBSET)
   add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers})
@@ -615,12 +604,14 @@ if (HB_HAVE_INTROSPECTION)
     POST_BUILD
     COMMAND ${G_IR_SCANNER_CMD}
       --warn-all --no-libtool --verbose
-      -n hb
       --namespace=HarfBuzz
       --nsversion=0.0
+      --symbol-prefix=hb
+      --symbol-prefix=hb_gobject
       --identifier-prefix=hb_
       --include GObject-2.0
-      --pkg-export=harfbuzz
+      --pkg-export=harfbuzz-gobject
+      --c-include=hb-gobject.h
       --cflags-begin
       -I${PROJECT_SOURCE_DIR}/src
       -I${PROJECT_BINARY_DIR}/src
@@ -723,6 +714,14 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
       NAMESPACE harfbuzz::
       DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/harfbuzz
   )
+  if (HB_HAVE_ICU)
+    install(TARGETS harfbuzz-icu
+      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+      FRAMEWORK DESTINATION Library/Frameworks
+    )
+  endif ()
   if (HB_BUILD_UTILS)
     if (WIN32 AND BUILD_SHARED_LIBS)
       install(TARGETS harfbuzz-subset
@@ -767,54 +766,3 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
     endif ()
   endif ()
 endif ()
-
-if (HB_BUILD_TESTS)
-  ## src/ executables
-  foreach (prog main test test-gsub-would-substitute test-gpos-size-params test-buffer-serialize test-unicode-ranges) # hb-ot-tag
-    set (prog_name ${prog})
-    if (${prog_name} STREQUAL "test")
-      # test can not be used as a valid executable name on cmake, lets special case it
-      set (prog_name test-test)
-    endif ()
-    add_executable(${prog_name} ${PROJECT_SOURCE_DIR}/src/${prog}.cc)
-    target_link_libraries(${prog_name} harfbuzz ${THIRD_PARTY_LIBS})
-  endforeach ()
-  # set_target_properties(hb-ot-tag PROPERTIES COMPILE_FLAGS "-DMAIN")
-
-  ## Tests
-  if (UNIX OR MINGW)
-    if (BUILD_SHARED_LIBS)
-      # generate harfbuzz.def after build completion
-      add_custom_command(TARGET harfbuzz POST_BUILD
-        COMMAND "${PYTHON_EXECUTABLE}" ${PROJECT_SOURCE_DIR}/src/gen-def.py ${PROJECT_BINARY_DIR}/harfbuzz.def ${project_headers}
-        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src)
-
-      add_test(NAME check-static-inits.sh
-        COMMAND ${PROJECT_SOURCE_DIR}/src/check-static-inits.sh
-        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/harfbuzz.dir/src # ugly hack
-      )
-      add_test(NAME check-libstdc++.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-libstdc++.sh)
-      add_test(NAME check-symbols.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-symbols.sh)
-
-      set_tests_properties(
-        check-static-inits.sh check-libstdc++.sh check-symbols.sh
-        PROPERTIES
-          ENVIRONMENT "libs=.;srcdir=${PROJECT_SOURCE_DIR}/src"
-          SKIP_RETURN_CODE 77)
-    endif ()
-
-    add_test(NAME check-c-linkage-decls.sh COMMAND ./check-c-linkage-decls.sh)
-    add_test(NAME check-header-guards.sh COMMAND ./check-header-guards.sh)
-    add_test(NAME check-externs.sh COMMAND ./check-externs.sh)
-    add_test(NAME check-includes.sh COMMAND ./check-includes.sh)
-    set_tests_properties(
-      check-c-linkage-decls.sh check-header-guards.sh check-externs.sh check-includes.sh
-      PROPERTIES
-        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src
-        SKIP_RETURN_CODE 77)
-  endif ()
-
-  # Needs to come last so that variables defined above are passed to
-  # subdirectories.
-  add_subdirectory(test)
-endif ()
index 46971b0..8aa9b1b 100644 (file)
--- a/CONFIG.md
+++ b/CONFIG.md
@@ -1,7 +1,7 @@
 # Configuring HarfBuzz
 
 Most of the time you will not need any custom configuration.  The configuration
-options provided by `configure` or `cmake` should be enough.  In particular,
+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.
 
diff --git a/COPYING b/COPYING
index 0278e60..5734316 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -2,8 +2,9 @@ HarfBuzz is licensed under the so-called "Old MIT" license.  Details follow.
 For parts of HarfBuzz that are licensed under different licenses see individual
 files names COPYING in subdirectories where applicable.
 
-Copyright © 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019  Google, Inc.
-Copyright © 2019  Facebook, Inc.
+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 © 2012  Mozilla Foundation
 Copyright © 2011  Codethink Limited
 Copyright © 2008,2010  Nokia Corporation and/or its subsidiary(-ies)
index ec56461..2817d07 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
-commit 3a74ee528255cc027d84b204a87b5c25e47bff79
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Oct 29 12:27:03 2019 -0700
+commit fb46a32ed0322d3f617dbfc7b982ff26f47d789c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jun 3 12:54:26 2020 +0430
 
-    2.6.4
+    2.6.7
 
- NEWS             | 7 +++++++
- configure.ac     | 2 +-
- src/hb-version.h | 4 ++--
- 3 files changed, 10 insertions(+), 3 deletions(-)
+ NEWS             | 12 ++++++++++++
+ configure.ac     |  2 +-
+ meson.build      |  2 +-
+ src/hb-common.h  |  2 +-
+ src/hb-version.h |  4 ++--
+ 5 files changed, 17 insertions(+), 5 deletions(-)
 
-commit 3958f6fb2378d83dd5107d62a8464187c93707b0
+commit 23091864683390d49ca710373b205e89004ef065
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 29 22:36:50 2019 +0330
+Date:   Tue Jun 2 21:52:57 2020 +0430
 
-    Add in_range in hb_bytes_t to merge range_checker_t with it
+    Move unicode tables update script to its own make file
+    
+    Also downloads things needed for unicode tables generators
 
- src/hb-array.hh             |  9 +++++++++
- src/hb-ot-glyf-table.hh     | 28 ++++++++++++--------------
- src/hb-ot-var-gvar-table.hh | 49 +++++++++++++++------------------------------
- 3 files changed, 38 insertions(+), 48 deletions(-)
+ src/Makefile.am                | 35 +------------------------
+ src/update-unicode-tables.make | 59 ++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 60 insertions(+), 34 deletions(-)
 
-commit 7915c5d6fa3efac99df08a54d4437eca0b780033
+commit 19ecabed37914bfff22dd79c633021fd5c1abd93
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 29 22:55:34 2019 +0330
+Date:   Tue Jun 2 20:01:03 2020 +0430
 
-    [ci] Check the recipt introduce in 7152ac3
+    minor, fix hb-version.h generation for out-of-tree builds
 
- .circleci/config.yml | 1 +
- 1 file changed, 1 insertion(+)
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit aa3831e295540083350c640d4a630f53e70d822f
+commit 9737170b6fa7dcc29e3295b9491ea8bfef484ab8
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 29 21:37:07 2019 +0330
+Date:   Tue Jun 2 19:18:35 2020 +0430
 
-    [glyf] Use contour_bounds_t::empty to simplify get_extents logic
+    minor fixes on src gen scripts
 
- src/hb-ot-glyf-table.hh | 20 ++++++--------------
- 1 file changed, 6 insertions(+), 14 deletions(-)
+ src/gen-harfbuzzcc.py | 2 ++
+ src/gen-hb-version.py | 4 +++-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
 
-commit d59ae5836d1349b885db980cbb741da33caebfde
+commit 6058ede3ae983c53d1d6f5352d4235bafce3499a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 1 12:58:31 2020 +0430
+
+    Build win32 artifacts using meson
+    
+    As a part of meson migration, this builds hb-shape dependencies
+    using meson subprojects and removes different unrelated mingw
+    files we've put on source root about things that aren't really our
+    concern. This also simplifies all the instructions we've put in
+    README.mingw.md and makes it easy to build the project on
+    distros that no mingw libraries (such i686-win32-{freetype,glib,...}
+    are packaged. The known catch is however lack of hb-view as its need
+    for build of cairo which apparently isn't that straightforward.
+
+ .ci/build-win32.sh             | 15 +++++++++++
+ .ci/win32-cross-file.txt       | 20 +++++++++++++++
+ .ci/win64-cross-file.txt       | 20 +++++++++++++++
+ .circleci/config.yml           | 28 +++++++++------------
+ Makefile.am                    | 19 --------------
+ README.mingw.md                | 29 +++++-----------------
+ RELEASING.md                   |  6 +----
+ meson-mingw-cross.txt          | 17 -------------
+ meson.build                    |  3 +++
+ mingw-configure.sh             | 28 ---------------------
+ mingw-ldd.py                   | 56 ------------------------------------------
+ mingw-meson.sh                 | 33 -------------------------
+ mingw32.sh                     |  2 --
+ mingw64.sh                     |  2 --
+ subprojects/fontconfig.wrap    |  1 +
+ subprojects/freetype2.wrap     |  1 +
+ subprojects/glib.wrap          |  1 +
+ subprojects/libffi.wrap        |  3 ++-
+ subprojects/proxy-libintl.wrap |  1 +
+ subprojects/zlib.wrap          |  1 +
+ 20 files changed, 84 insertions(+), 202 deletions(-)
+
+commit bb719915d95e5822b3da5f92d9192de08ce5532f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun May 31 12:57:26 2020 +0430
+
+    [tests/aots] move the update script to update.py
+
+ test/shaping/data/aots/Makefile.am | 18 +-----------------
+ test/shaping/data/aots/update.py   | 29 +++++++++++++++++++++++++++++
+ 2 files changed, 30 insertions(+), 17 deletions(-)
+
+commit b318229993cb681027f403e491cc1e652441864c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 29 21:30:04 2019 +0330
+Date:   Sun May 31 12:52:53 2020 +0430
 
-    [glyf] Refactor contour_bounds_t use to make its fields protected
+    [tests/test-rendering-tests] run git pull on correct dir
 
src/hb-ot-glyf-table.hh | 47 ++++++++++++++++++++++++++---------------------
- 1 file changed, 26 insertions(+), 21 deletions(-)
test/shaping/data/text-rendering-tests/update.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 773ee8041e8905bfb06c1a71d2b4fc99110b3dc6
-Merge: 47b4074d 0efbda7a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Oct 29 10:58:56 2019 -0700
+commit 8a9a802636728f47f42cc0d58a8c98c1b22f9609
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun May 31 10:51:24 2020 +0430
 
-    Merge pull request #2038 from ebraminio/glyf-contour
-    
-    Remove contour_point_t so we won't need to zero its unused var
+    minor, fix extra dist list
 
-commit 0efbda7a40742cbdf30d5a85061ffb6a0a55bcc0
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 29 21:03:26 2019 +0330
+ test/shaping/data/text-rendering-tests/Makefile.am | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
-    Remove contour_point_t so we won't need to zero its unused var
+commit 419c2d0a00d6f5c5c8a3a8ecd705aa1fa97c4768
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun May 31 02:33:36 2020 +0430
 
- src/hb-ot-glyf-table.hh | 27 +++++++++++++--------------
- 1 file changed, 13 insertions(+), 14 deletions(-)
+    [test/text-rendering-tests] Adopt the update script with meson
 
-commit 47b4074d5f98d71d2983470602eff9b93f102af4
-Merge: dd8a8460 dd288840
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Oct 29 03:16:34 2019 -0700
+ test/shaping/data/text-rendering-tests/meson.build | 95 ++++++++++++++++++++++
+ test/shaping/data/text-rendering-tests/update.py   |  8 ++
+ test/shaping/meson.build                           | 87 +-------------------
+ 3 files changed, 105 insertions(+), 85 deletions(-)
 
-    Merge pull request #2034 from khaledhosny/cmap-notdef
-    
-    [cmap] Check GID before adding ranges in format 4 & 12
+commit 2681656073f1bddc82f49019aeb49f0cb8dd7b5a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun May 31 02:23:49 2020 +0430
 
-commit dd8a8460377ca54207877ea9da96931175dbb15f
-Author: jfkthame <jfkthame@gmail.com>
-Date:   Tue Oct 29 09:20:41 2019 +0000
+    [test/text-rendering-tests] Update from upstream
 
-    Use proper y-scale factor for height value
+ test/shaping/data/text-rendering-tests/DISABLED    |  12 ++++
+ .../data/text-rendering-tests/Makefile.sources     |  24 +++++---
+ .../data/text-rendering-tests/fonts/TestAVAR.ttf   | Bin 1608 -> 1608 bytes
+ .../data/text-rendering-tests/fonts/TestCMAP14.otf | Bin 1628 -> 1628 bytes
+ .../text-rendering-tests/fonts/TestGPOSThree.ttf   | Bin 3500 -> 3500 bytes
+ .../text-rendering-tests/fonts/TestGPOSTwo.otf     | Bin 1680 -> 1680 bytes
+ .../text-rendering-tests/fonts/TestGSUBThree.ttf   | Bin 1504 -> 1504 bytes
+ .../text-rendering-tests/fonts/TestGVARNine.ttf    | Bin 2168 -> 2168 bytes
+ .../text-rendering-tests/fonts/TestHVAROne.otf     | Bin 3984 -> 3984 bytes
+ .../text-rendering-tests/fonts/TestKERNOne.otf     | Bin 1380 -> 1380 bytes
+ .../text-rendering-tests/fonts/TestMORXEight.ttf   | Bin 2184 -> 2184 bytes
+ .../fonts/TestMORXEighteen.ttf                     | Bin 3256 -> 3256 bytes
+ .../text-rendering-tests/fonts/TestMORXEleven.ttf  | Bin 1624 -> 1624 bytes
+ .../text-rendering-tests/fonts/TestMORXForty.ttf   | Bin 2408 -> 2408 bytes
+ .../text-rendering-tests/fonts/TestMORXFour.ttf    | Bin 4764 -> 4764 bytes
+ .../fonts/TestMORXFourteen.ttf                     | Bin 1816 -> 1816 bytes
+ .../fonts/TestMORXFourtyone.ttf                    | Bin 2248 -> 2248 bytes
+ .../text-rendering-tests/fonts/TestMORXNine.ttf    | Bin 1624 -> 1624 bytes
+ .../text-rendering-tests/fonts/TestMORXOne.ttf     | Bin 2404 -> 2404 bytes
+ .../fonts/TestMORXSeventeen.ttf                    | Bin 1788 -> 1788 bytes
+ .../text-rendering-tests/fonts/TestMORXSixteen.ttf | Bin 1812 -> 1812 bytes
+ .../text-rendering-tests/fonts/TestMORXTen.ttf     | Bin 1620 -> 1620 bytes
+ .../fonts/TestMORXThirteen.ttf                     | Bin 1820 -> 1820 bytes
+ .../fonts/TestMORXThirtyeight.ttf                  | Bin 2444 -> 2444 bytes
+ .../fonts/TestMORXThirtyfive.ttf                   | Bin 1968 -> 1968 bytes
+ .../fonts/TestMORXThirtyfour.ttf                   | Bin 3608 -> 3608 bytes
+ .../fonts/TestMORXThirtynine.ttf                   | Bin 2436 -> 2436 bytes
+ .../fonts/TestMORXThirtyone.ttf                    | Bin 2964 -> 2964 bytes
+ .../fonts/TestMORXThirtyseven.ttf                  | Bin 2444 -> 2444 bytes
+ .../fonts/TestMORXThirtysix.ttf                    | Bin 1836 -> 1836 bytes
+ .../fonts/TestMORXThirtythree.ttf                  | Bin 1520 -> 1520 bytes
+ .../fonts/TestMORXThirtytwo.ttf                    | Bin 2948 -> 2948 bytes
+ .../text-rendering-tests/fonts/TestMORXThree.ttf   | Bin 4104 -> 4104 bytes
+ .../text-rendering-tests/fonts/TestMORXTwelve.ttf  | Bin 2200 -> 2200 bytes
+ .../text-rendering-tests/fonts/TestMORXTwenty.ttf  | Bin 3232 -> 3232 bytes
+ .../fonts/TestMORXTwentyeight.ttf                  | Bin 2660 -> 2660 bytes
+ .../fonts/TestMORXTwentyfive.ttf                   | Bin 3260 -> 3260 bytes
+ .../fonts/TestMORXTwentyfour.ttf                   | Bin 1828 -> 1828 bytes
+ .../fonts/TestMORXTwentynine.ttf                   | Bin 3012 -> 3012 bytes
+ .../fonts/TestMORXTwentyone.ttf                    | Bin 3244 -> 3244 bytes
+ .../fonts/TestMORXTwentyseven.ttf                  | Bin 2432 -> 2432 bytes
+ .../fonts/TestMORXTwentysix.ttf                    | Bin 3252 -> 3252 bytes
+ .../fonts/TestMORXTwentythree.ttf                  | Bin 1836 -> 1836 bytes
+ .../fonts/TestMORXTwentytwo.ttf                    | Bin 3256 -> 3256 bytes
+ .../text-rendering-tests/fonts/TestMORXTwo.ttf     | Bin 4960 -> 4960 bytes
+ .../text-rendering-tests/fonts/TestSFNTOne.otf     | Bin 0 -> 3228 bytes
+ .../text-rendering-tests/fonts/TestSFNTTwo.ttf     | Bin 0 -> 3228 bytes
+ .../fonts/TestSVGgradientTransform.otf             | Bin 0 -> 48292 bytes
+ .../text-rendering-tests/fonts/TestSVGgzip.otf     | Bin 0 -> 3024 bytes
+ .../fonts/TestSVGmultiGlyphs.otf                   | Bin 0 -> 10876 bytes
+ .../text-rendering-tests/fonts/TestShapeLana.ttf   | Bin 0 -> 87032 bytes
+ .../text-rendering-tests/fonts/TestTRAKOne.ttf     | Bin 1752 -> 1752 bytes
+ .../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/SFNT-1.tests   |   2 +
+ .../data/text-rendering-tests/tests/SFNT-2.tests   |   2 +
+ .../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/SHKNDA-2.tests |  32 +++++------
+ .../data/text-rendering-tests/tests/SHKNDA-3.tests |  62 ++++++++++-----------
+ .../data/text-rendering-tests/tests/SHLANA-1.tests |  52 +++++++++++++++++
+ .../text-rendering-tests/tests/SHLANA-10.tests     |  47 ++++++++++++++++
+ .../data/text-rendering-tests/tests/SHLANA-2.tests |  37 ++++++++++++
+ .../data/text-rendering-tests/tests/SHLANA-3.tests |  13 +++++
+ .../data/text-rendering-tests/tests/SHLANA-4.tests |   3 +
+ .../data/text-rendering-tests/tests/SHLANA-5.tests |  13 +++++
+ .../data/text-rendering-tests/tests/SHLANA-6.tests |   7 +++
+ .../data/text-rendering-tests/tests/SHLANA-7.tests |  18 ++++++
+ .../data/text-rendering-tests/tests/SHLANA-8.tests |  13 +++++
+ .../data/text-rendering-tests/tests/SHLANA-9.tests |   6 ++
+ 80 files changed, 433 insertions(+), 198 deletions(-)
+
+commit ff89ba6e4d8e0e7e3545bc386bbc32d3153faab8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun May 31 02:20:53 2020 +0430
+
+    [tests] Port text-rendering-tests update script to python
+
+ .../data/text-rendering-tests/extract-tests.py     |  61 -----------
+ test/shaping/data/text-rendering-tests/update.py   | 112 +++++++++++++++++++++
+ test/shaping/data/text-rendering-tests/update.sh   |  46 ---------
+ 3 files changed, 112 insertions(+), 107 deletions(-)
+
+commit a9d13463b554981cc48349de64bf6d44147ff754
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 30 14:17:56 2020 +0430
+
+    [meson] Categorize tests using `suite: [...]`
+    
+    So one can run a category of interested tests like
+    
+      meson test -Cbuild --suite aots --suite src --print-errorlogs
+    
+    Intead issuing particular tests which also is possible like
+    
+      meson test -Cbuild test-shape --print-errorlogs
+
+ src/meson.build          |  8 ++++++--
+ test/api/meson.build     |  2 +-
+ test/fuzzing/meson.build | 12 +++++++++---
+ test/shaping/meson.build |  3 +++
+ test/subset/meson.build  |  1 +
+ 5 files changed, 20 insertions(+), 6 deletions(-)
+
+commit 9d13124cfd6db1396f2a0ad5f7a9633825432898
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 30 14:45:22 2020 +0430
+
+    [ci] fix alpine build issue
 
src/hb-ot-cff1-table.cc | 2 +-
.circleci/config.yml | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 7152ac3fcfe8a599aa0d20f8d02ef38c69111231
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Oct 28 17:12:55 2019 -0700
+commit 7250adee263f068634f6110b2c8d94f105294c13
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri May 29 12:34:30 2020 +0430
 
-    Fix build
-    
-    $ make CPPFLAGS="-DHB_TINY -DHB_NO_OT_FONT" libharfbuzz-subset.la
+    [tests] Port check scripts to python
 
- src/hb-subset-plan.cc | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
+ src/Makefile.am              | 14 ++++-----
+ src/check-c-linkage-decls.py | 26 ++++++++++++++++
+ src/check-c-linkage-decls.sh | 27 ----------------
+ src/check-externs.py         | 20 ++++++++++++
+ src/check-externs.sh         | 22 -------------
+ src/check-header-guards.py   | 22 +++++++++++++
+ src/check-header-guards.sh   | 24 ---------------
+ src/check-includes.py        | 39 +++++++++++++++++++++++
+ src/check-includes.sh        | 44 --------------------------
+ src/check-libstdc++.py       | 41 +++++++++++++++++++++++++
+ src/check-libstdc++.sh       | 43 --------------------------
+ src/check-static-inits.py    | 38 +++++++++++++++++++++++
+ src/check-static-inits.sh    | 49 -----------------------------
+ src/check-symbols.py         | 73 ++++++++++++++++++++++++++++++++++++++++++++
+ src/check-symbols.sh         | 61 ------------------------------------
+ src/meson.build              | 61 +++++++++++++++++-------------------
+ 16 files changed, 294 insertions(+), 310 deletions(-)
 
-commit dd288840d6f87acd13b99b71408dcdb35a2be9cb
-Author: Khaled Hosny <khaledhosny@eglug.org>
-Date:   Tue Oct 29 01:45:49 2019 +0200
+commit 5eb6cafd2eff067ee2915d084c14e872691dffac
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri May 29 23:54:14 2020 +0430
 
-    [cmap] Check GID before adding ranges in format 4 & 12
+    [meson] reflect chosen linker update
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/2031
-
- src/hb-ot-cmap-table.hh          |  32 ++++++++++++++++++++++++--------
- test/api/fonts/cmunrm.otf        | Bin 0 -> 330492 bytes
- test/api/test-collect-unicodes.c |  22 ++++++++++++++++++++++
- 3 files changed, 46 insertions(+), 8 deletions(-)
-
-commit fd71c045b46380281ba8a7e351fac7248938c74c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Oct 28 17:06:53 2019 -0700
+    As d9177a594bc2846b03a43b8d00949d23ab0d91c2
 
-    Hopefully fix up previous commit and bots
-
- src/hb.hh | 2 +-
+ meson_options.txt | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit e832dc4c642f604d2cbb8e6b2f0b8d37151936f1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Oct 28 17:02:40 2019 -0700
+commit 0d8442a55f6b34ca3b5f444de2a3cdcce27421ff
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri May 29 16:11:32 2020 +0430
 
-    [config] Make HB_NO_ERRNO work with systems defining errno as a macro
+    [meson] minor, find run-tests.py only once
 
src/hb.hh | 8 +++++---
test/shaping/meson.build | 8 +++++---
  1 file changed, 5 insertions(+), 3 deletions(-)
 
-commit ce11df1b5b8e49712bef249de19bc4768f3a691c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Oct 28 14:45:31 2019 -0700
+commit 3c5bdd9bb8eb97b8ff7109884cbf03c645e4eaa7
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Feb 18 10:02:19 2020 -0800
 
-    2.6.3
+    [subset] GDEF AttachList subsetting support
 
- NEWS             | 8 ++++++++
- configure.ac     | 2 +-
- src/hb-font.cc   | 2 +-
- src/hb-version.h | 4 ++--
- 4 files changed, 12 insertions(+), 4 deletions(-)
+ src/hb-ot-layout-gdef-table.hh                     |  41 +++++++++++++++++++--
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ .../IndicTestJalandhar-Regular.default.A01.ttf     | Bin 0 -> 4088 bytes
+ .../IndicTestJalandhar-Regular.default.A05,A06.ttf | Bin 0 -> 4652 bytes
+ .../IndicTestJalandhar-Regular.default.A07,A1B.ttf | Bin 0 -> 4620 bytes
+ ...andhar-Regular.default.retain-all-codepoint.ttf | Bin 0 -> 28176 bytes
+ .../IndicTestJalandhar-Regular.drop-hints.A01.ttf  | Bin 0 -> 948 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A05,A06.ttf | Bin 0 -> 1244 bytes
+ ...dicTestJalandhar-Regular.drop-hints.A07,A1B.ttf | Bin 0 -> 1240 bytes
+ ...har-Regular.drop-hints.retain-all-codepoint.ttf | Bin 0 -> 15200 bytes
+ .../IndicTestJalandhar-Regular.keep-gdef.A01.ttf   | Bin 0 -> 4140 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf | Bin 0 -> 4716 bytes
+ ...ndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf | Bin 0 -> 4688 bytes
+ ...dhar-Regular.keep-gdef.retain-all-codepoint.ttf | Bin 0 -> 28604 bytes
+ .../data/fonts/IndicTestJalandhar-Regular.ttf      | Bin 0 -> 49816 bytes
+ .../subset/data/tests/layout.gdef-attachlist.tests |  13 +++++++
+ 17 files changed, 52 insertions(+), 4 deletions(-)
+
+commit 368ca306413da698f93562281926fec6f0e56863
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri May 29 00:42:32 2020 +0430
+
+    minor on python scripts
+    
+    * remove not needed imports
+    * remove semicolons
+
+ src/gen-harfbuzzcc.py            | 2 +-
+ src/gen-hb-version.py            | 2 +-
+ src/gen-os2-unicode-ranges.py    | 1 -
+ src/gen-ragel-artifacts.py       | 6 +++---
+ src/gen-ucd-table.py             | 2 +-
+ test/subset/run-tests.py         | 2 +-
+ test/subset/subset_test_suite.py | 4 ++--
+ 7 files changed, 9 insertions(+), 10 deletions(-)
+
+commit ad87155fd000aa05b5c6bf09c5a3ffbda658d60c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri May 29 00:11:19 2020 +0430
+
+    minor, use py3's open(encoding=)
+
+ src/gen-arabic-table.py                  | 4 ++--
+ src/gen-def.py                           | 4 ++--
+ src/gen-indic-table.py                   | 4 ++--
+ src/gen-os2-unicode-ranges.py            | 2 +-
+ src/gen-tag-table.py                     | 5 ++---
+ src/gen-use-table.py                     | 3 +--
+ src/gen-vowel-constraints.py             | 5 ++---
+ test/subset/generate-expected-outputs.py | 3 +--
+ test/subset/run-tests.py                 | 7 +++----
+ test/subset/subset_test_suite.py         | 3 +--
+ 10 files changed, 17 insertions(+), 23 deletions(-)
+
+commit cd5580e2d62038725f3ad3e828d326b6cd7934da
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 28 23:43:55 2020 +0430
+
+    minor, enable printing to stderr in run-tests.py
+    
+    As was originally intended https://github.com/harfbuzz/harfbuzz/blob/3ce6c7b/test/shaping/run-tests.sh
+
+ test/shaping/run-tests.py | 10 +++++-----
+ test/subset/run-tests.py  |  2 +-
+ 2 files changed, 6 insertions(+), 6 deletions(-)
 
-commit 5a59de2b983ed7a1c639ea3e4d23c341134cd6d5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Oct 28 14:02:47 2019 -0700
+commit 7554f618ecfbc0ba07937c7167ca6b456d55d712
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 28 22:51:29 2020 +0430
+
+    minor, use sys.exit print shorthand
+
+ mingw-ldd.py                                       |  3 +-
+ src/gen-arabic-table.py                            |  3 +-
+ src/gen-emoji-table.py                             |  3 +-
+ src/gen-harfbuzzcc.py                              |  2 +-
+ src/gen-indic-table.py                             |  3 +-
+ src/gen-tag-table.py                               |  3 +-
+ src/gen-ucd-table.py                               |  3 +-
+ src/gen-use-table.py                               |  3 +-
+ src/gen-vowel-constraints.py                       |  3 +-
+ test/fuzzing/run-draw-fuzzer-tests.py              |  9 ++----
+ test/fuzzing/run-shape-fuzzer-tests.py             |  9 ++----
+ test/fuzzing/run-subset-fuzzer-tests.py            |  9 ++----
+ .../data/text-rendering-tests/extract-tests.py     |  3 +-
+ test/shaping/hb-diff                               |  3 +-
+ test/shaping/hb_test_tools.py                      | 33 +++++++++-------------
+ test/shaping/run-tests.py                          |  3 +-
+ test/subset/run-tests.py                           |  9 ++----
+ 17 files changed, 39 insertions(+), 65 deletions(-)
+
+commit 08f1d95a50f9efc2864dddef2a7713f57d387a26
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 28 15:01:15 2020 +0430
+
+    minor, move scripts manuals to __doc__
+
+ src/gen-arabic-table.py       | 14 ++++++++------
+ src/gen-def.py                |  4 +++-
+ src/gen-emoji-table.py        | 11 +++++++----
+ src/gen-harfbuzzcc.py         |  4 +++-
+ src/gen-hb-version.py         |  4 +++-
+ src/gen-indic-table.py        | 13 ++++++++-----
+ src/gen-os2-unicode-ranges.py |  9 +++++----
+ src/gen-tag-table.py          | 12 +++++++-----
+ src/gen-ucd-table.py          | 11 +++++++----
+ src/gen-use-table.py          | 17 ++++++++++-------
+ src/gen-vowel-constraints.py  |  9 +++++----
+ 11 files changed, 66 insertions(+), 42 deletions(-)
+
+commit 593e58c84287968f5625c8aa0dd7c60f1a03b705
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed May 20 18:00:25 2020 -0700
 
-    Actually add +hb_font_get_nominal_glyphs()
-    
-    New API:
-    +hb_font_get_nominal_glyphs()
+    [subset] ChainContext subsetting fix: add lookup index remapping
 
- src/hb-font.cc | 23 +++++++++++++++++++++++
- src/hb-font.h  |  8 ++++++++
- 2 files changed, 31 insertions(+)
+ src/hb-ot-layout-gsubgpos.hh                       |  57 ++++++++++++++-------
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...ules_f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2408 bytes
+ ...ubrules_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2032 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3776 bytes
+ ...ultiple_subrules_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1944 bytes
+ ...1_multiple_subrules_f1.keep-layout.41,42,43.otf | Bin 0 -> 1332 bytes
+ ...ubrules_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3776 bytes
+ ...ules_f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2428 bytes
+ ...ubrules_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2032 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3808 bytes
+ ...ultiple_subrules_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1964 bytes
+ ...2_multiple_subrules_f1.keep-layout.41,42,43.otf | Bin 0 -> 1332 bytes
+ ...ubrules_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3808 bytes
+ ...mple_f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2400 bytes
+ ..._simple_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2008 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3744 bytes
+ ...chaining3_simple_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1936 bytes
+ ...os_chaining3_simple_f1.keep-layout.41,42,43.otf | Bin 0 -> 1308 bytes
+ ..._simple_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3744 bytes
+ .../fonts/gpos_chaining1_multiple_subrules_f1.otf  | Bin 0 -> 4772 bytes
+ .../fonts/gpos_chaining2_multiple_subrules_f1.otf  | Bin 0 -> 4860 bytes
+ .../subset/data/fonts/gpos_chaining3_simple_f1.otf | Bin 0 -> 4740 bytes
+ test/subset/data/tests/layout.gpos8.tests          |  13 +++++
+ 25 files changed, 53 insertions(+), 19 deletions(-)
 
-commit 03028a5fe512978a8f8e2396001cf8e425b44f72
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Oct 28 13:46:56 2019 -0700
+commit e3af529e511ca492284cdd9f4584666b88a9e00f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 23 22:13:32 2020 +0430
 
-    Revert "Don't include codepoint 0 in the results of collect_unicodes."
+    [meson] update generated headers only when the result is different
     
-    This reverts commit 14ad96ffbf77c33d8d33d2686d17c2375381989e.
+    This way it won't ruin incremental builds.
     
-    This was wrong.  My bad!
+    We need a better way to declare source altering tasks
+    https://github.com/mesonbuild/meson/issues/7156
+    yet this is good enough despite being not idiomatic.
     
-    https://github.com/harfbuzz/harfbuzz/issues/2031
-
- src/hb-ot-cmap-table.hh | 8 +-------
- 1 file changed, 1 insertion(+), 7 deletions(-)
+    It is however not that smooth yet as the change may is detected on the
+    next meson run. One of course can issue ./gen-ragel-artifacts.py
+    manually for better experience before running meson.
 
-commit 2714dc31b8d0ffe3c043935dd7619be0dd7b7635
-Merge: aca63902 14ad96ff
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Oct 28 13:01:34 2019 -0700
-
-    Merge pull request #2032 from googlefonts/collect_unicodes
-    
-    Don't include codepoint 0 in the results of collect_unicodes.
+ src/gen-hb-version.py      | 12 ++++++++++--
+ src/gen-ragel-artifacts.py | 26 ++++++++++++++++++++++----
+ src/meson.build            | 15 ++++++---------
+ 3 files changed, 38 insertions(+), 15 deletions(-)
 
-commit 14ad96ffbf77c33d8d33d2686d17c2375381989e
-Author: Garret Rieger <grieger@google.com>
-Date:   Mon Oct 28 12:56:04 2019 -0700
+commit b32d169d22278a108b0772ab1dc72fd0c344af52
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 23 13:03:06 2020 +0430
 
-    Don't include codepoint 0 in the results of collect_unicodes.
-    It is always assumed to be the notdef glyph.
+    [test] run aat APIs in shape fuzzer
 
- src/hb-ot-cmap-table.hh | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
+ test/api/test-ot-face.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
 
-commit aca63902814748b36bf6939421cfa95eed3a1ca7
+commit 1fbb7883262d4d6eb28d283d236c152d2216db50
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 22 00:06:46 2019 +0330
+Date:   Sat May 23 12:38:07 2020 +0430
 
-    [gpos] Don't move pointer when match_glyph_data is not set
+    [gdef] minor, use dagger in ligature carets fetch
 
- src/hb-ot-layout-gsubgpos.hh | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
+ src/hb-ot-layout-gdef-table.hh | 29 +++++++++++++++--------------
+ 1 file changed, 15 insertions(+), 14 deletions(-)
 
-commit defe9b6da018bc85750c999454c51fde0cadb9b2
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Fri Oct 25 10:07:26 2019 -0700
+commit 2264a7011f82140ac8dc12ec307ba5c563aad4a1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 23 12:14:40 2020 +0430
 
-    crash fix : Heap-buffer-overflow READ 2
-    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=18513
+    [tests] some more ligature carets tests
 
- src/hb-ot-layout-gpos-table.hh                            |  12 ++++++------
- ...z-testcase-minimized-hb-subset-fuzzer-5677906231033856 | Bin 0 -> 938 bytes
- 2 files changed, 6 insertions(+), 6 deletions(-)
+ test/api/test-ot-ligature-carets.c | 69 +++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 68 insertions(+), 1 deletion(-)
 
-commit b2fcca6e14afc8085cc1c2491b2d7c780dad1450
+commit d7c012a08e347dcfd1ed4229d70c0a4be496c02b
 Author: Qunxin Liu <qxliu@google.com>
-Date:   Thu Oct 24 15:15:26 2019 -0700
+Date:   Wed Feb 26 13:11:42 2020 -0800
+
+    [subset] GDEF Variation Store: step 2
+    do subset based on variation indices collected in step 1
+
+ src/hb-ot-layout-common.hh                         |  96 ++++++++++++++-
+ src/hb-ot-layout-gdef-table.hh                     |  28 +++--
+ src/hb-ot-layout-gpos-table.hh                     | 136 ++++++++++++---------
+ src/hb-ot-layout-gsubgpos.hh                       |   5 +-
+ src/hb-ot-layout.cc                                |  32 -----
+ src/hb-ot-layout.h                                 |   7 --
+ src/hb-subset-plan.cc                              |  22 +++-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ .../AdobeVFPrototype.default.41,42,43,57.otf       | Bin 0 -> 4960 bytes
+ .../AdobeVFPrototype.default.41,42,43.otf          | Bin 0 -> 4540 bytes
+ .../AdobeVFPrototype.default.41,42.otf             | Bin 0 -> 4132 bytes
+ .../AdobeVFPrototype.default.41,56,57.otf          | Bin 0 -> 4152 bytes
+ .../AdobeVFPrototype.default.41.otf                | Bin 0 -> 3468 bytes
+ .../AdobeVFPrototype.default.42,57.otf             | Bin 0 -> 4208 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43,57.otf    | Bin 0 -> 4772 bytes
+ .../AdobeVFPrototype.drop-hints.41,42,43.otf       | Bin 0 -> 4352 bytes
+ .../AdobeVFPrototype.drop-hints.41,42.otf          | Bin 0 -> 3944 bytes
+ .../AdobeVFPrototype.drop-hints.41,56,57.otf       | Bin 0 -> 3964 bytes
+ .../AdobeVFPrototype.drop-hints.41.otf             | Bin 0 -> 3280 bytes
+ .../AdobeVFPrototype.drop-hints.42,57.otf          | Bin 0 -> 4020 bytes
+ ...AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf | Bin 0 -> 5444 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf   | Bin 0 -> 4916 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,42.otf      | Bin 0 -> 4436 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf   | Bin 0 -> 4556 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.41.otf         | Bin 0 -> 3692 bytes
+ .../AdobeVFPrototype.keep-gdef-gpos.42,57.otf      | Bin 0 -> 4556 bytes
+ test/subset/data/fonts/AdobeVFPrototype.otf        | Bin 0 -> 120400 bytes
+ test/subset/data/tests/layout.gdef-varstore.tests  |  16 +++
+ 29 files changed, 232 insertions(+), 112 deletions(-)
+
+commit 8200e48ffc1918daa8aaa9432048334844f3b8a5
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Feb 26 13:11:42 2020 -0800
+
+    [subset] GDEF Variation Store: step 1
+    closure device variation indexes, create old->new variation idx mapping
+    and store them in subset-plan
+
+ src/hb-ot-layout-common.hh     |  47 ++++++
+ src/hb-ot-layout-gdef-table.hh |  60 ++++++++
+ src/hb-ot-layout-gpos-table.hh | 325 +++++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-layout-gsubgpos.hh   |  15 ++
+ src/hb-ot-layout.cc            |  31 ++++
+ src/hb-ot-layout.h             |   6 +
+ src/hb-subset-plan.cc          |  28 +++-
+ src/hb-subset-plan.hh          |   5 +
+ 8 files changed, 504 insertions(+), 13 deletions(-)
+
+commit 8ba0077ea3b946efff40cd96ee0bfb36c776dfca
+Author: Vincent Torri <vincent.torri@gmail.com>
+Date:   Thu May 21 19:53:42 2020 +0200
+
+    Add shell script and cross-compilation file to compile Harfbuzz with meson
+
+ meson-mingw-cross.txt | 17 +++++++++++++++++
+ mingw-meson.sh        | 33 +++++++++++++++++++++++++++++++++
+ 2 files changed, 50 insertions(+)
 
-     fuzzer crash fix
-     https://oss-fuzz.com/testcase-detail/5643107869917184
+commit d2e3a048d190330270af1c4f439d55b62d8df81d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 21:48:01 2020 +0430
 
- src/hb-ot-layout-gsubgpos.hh                             |  11 +++++++----
- ...-testcase-minimized-hb-subset-fuzzer-5643107869917184 | Bin 0 -> 3232 bytes
- 2 files changed, 7 insertions(+), 4 deletions(-)
+    [meson] Fix fix_get_types.py shabang, minor format
 
-commit 9815ca0338b47c6ea4e82f2fbd39d70e3456aca1
+ src/fix_get_types.py | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 887aa0214feade3f5b782ebb25e5c52704d0aa64
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Oct 24 21:05:38 2019 +0330
+Date:   Thu May 21 20:02:47 2020 +0430
 
-    [ci] Use custom subset fuzzer timeout for failing sanitizer bots
+    [meson] Use find_program for locating python script
+    
+    Apparently that is the simplest and supported way of finding python scripts.
 
.circleci/config.yml                    | 8 ++++----
test/fuzzing/run-shape-fuzzer-tests.py  | 3 ++-
- test/fuzzing/run-subset-fuzzer-tests.py | 3 ++-
- 3 files changed, 8 insertions(+), 6 deletions(-)
meson.build              | 2 --
src/meson.build          | 4 ++--
+ test/shaping/meson.build | 9 +++------
+ 3 files changed, 5 insertions(+), 10 deletions(-)
 
-commit b03b62cb304279195569180061cde745e0c9880a
+commit d9177a594bc2846b03a43b8d00949d23ab0d91c2
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Oct 23 12:18:21 2019 +0330
+Date:   Thu May 21 19:34:56 2020 +0430
 
-    [ci] Add HB_NO_MT on non HB_TINY no-build-system builds
+    [meson] Use a c linker for on Windows also
+    
+    Using a C linker was limited to non-Windows as 20a840c7, let's
+    revisit this while transition to meson.
+    
+    Packagers easily override that via the option and use a C++ linker
+    if needed.
 
.circleci/config.yml | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
src/meson.build | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
 
-commit 5e489670e15329f5eced16e5a76145c6149a265f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Oct 22 15:03:47 2019 -0700
+commit cc53fd158c09451a83cef7fda7371a84d906be20
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 19:33:18 2020 +0430
 
-    Remove hb-warning.cc
+    [meson] Normalize options names
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/2005
+    As https://github.com/harfbuzz/harfbuzz/pull/2412#discussion_r426275027
 
src/Makefile.sources |  1 -
src/harfbuzz.cc      |  1 -
src/hb-atomic.hh     | 16 +++++-----------
- src/hb-mutex.hh      | 25 ++++++-------------------
src/hb-warning.cc    | 37 -------------------------------------
- 5 files changed, 11 insertions(+), 69 deletions(-)
.circleci/config.yml    |  4 ++--
meson.build             |  4 ++--
meson_options.txt       | 10 +++++-----
+ src/meson.build         |  6 +++---
test/subset/meson.build |  2 +-
+ 5 files changed, 13 insertions(+), 13 deletions(-)
 
-commit 05bcdb39d8648c49f7984c404aee096f2ad1d655
-Author: Garret Rieger <grieger@google.com>
-Date:   Mon Oct 21 16:10:06 2019 -0700
+commit a9e8328ae2b14341c3dee1b6610bb454f50e34aa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 16:28:24 2020 +0430
 
-    Add a specialization of array_t:hash for hb_bytes_t and hb_ubytes_t.
+    [meson] Add build configuration summary just like autotools
 
- src/hb-array.hh              | 34 ++++++++++++++++++++++++----------
- src/hb-ot-layout-gsubgpos.hh |  2 --
- 2 files changed, 24 insertions(+), 12 deletions(-)
+ docs/meson.build |  2 ++
+ meson.build      | 27 +++++++++++++++++++++++++++
+ src/meson.build  |  1 +
+ 3 files changed, 30 insertions(+)
 
-commit 95ab110cd9a6083a854e538211618b2733aba643
-Author: Garret Rieger <grieger@google.com>
-Date:   Mon Oct 21 13:15:46 2019 -0700
+commit 99e2342a6b129cfc69f23081b9efb826f9aa950e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 17:41:45 2020 +0430
 
-    Optimize intersects_array to fix fuzzer timeout.
+    [ci] Install newer meson from pip
 
src/hb-ot-layout-gsubgpos.hh                           |  10 +++++-----
- ...estcase-minimized-hb-subset-fuzzer-5763024094232576 | Bin 0 -> 125681 bytes
- 2 files changed, 5 insertions(+), 5 deletions(-)
.circleci/config.yml | 8 ++++----
+ appveyor.yml         | 4 ++--
+ 2 files changed, 6 insertions(+), 6 deletions(-)
 
-commit be5cdcdfa21a2d956fc8c445452a78e77ede95fb
-Author: Garret Rieger <grieger@google.com>
-Date:   Tue Oct 22 11:55:04 2019 -0700
+commit f7562672f909d9cca8118659c017c552328796af
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 17:01:04 2020 +0430
 
-    Store the hash value of a key in item_t in hb_map to reduce the number of hash computations.
+    [meson] Use / instead join_paths
+    
+    We need some of the very recent features of meson, let's use the new features also
 
- src/hb-map.hh | 70 ++++++++++++++++++++++++++++++++++-------------------------
- 1 file changed, 40 insertions(+), 30 deletions(-)
+ docs/meson.build         |  4 ++--
+ meson.build              |  2 +-
+ src/meson.build          |  8 ++++----
+ test/fuzzing/meson.build |  6 +++---
+ test/shaping/meson.build | 12 ++++++------
+ test/subset/meson.build  |  4 ++--
+ 6 files changed, 18 insertions(+), 18 deletions(-)
 
-commit b33a0d628e5e76992fdd02fd4178906137e6153c
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Mon Oct 21 13:24:52 2019 -0700
+commit b8d1760bc00071580a41b1e41fca6675f1e4aa04
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 14:45:41 2020 +0430
 
-    fuzzer crash fix: Null-dereference WRITE
-    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=18363
+    [meson/ci] Increase cmap fuzzer timeout even more
 
- src/hb-ot-layout-common.hh                                |   4 +++-
- ...z-testcase-minimized-hb-subset-fuzzer-5659903036751872 | Bin 0 -> 781 bytes
- 2 files changed, 3 insertions(+), 1 deletion(-)
+ test/fuzzing/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit cf414e361a99decd9c1710f1012236bffd067878
-Author: Garret Rieger <grieger@google.com>
-Date:   Fri Sep 27 09:55:17 2019 -0700
+commit 4b12b8466faa14cd09d57ba5c3819c2d24e66b1e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 14:23:36 2020 +0430
 
-    Added profiling instructions to TESTING.md
+    [meson] Increase timeout in hope to resolve Actions' bot timeout
 
- TESTING.md | 11 +++++++++++
- 1 file changed, 11 insertions(+)
+ test/fuzzing/meson.build | 2 +-
+ test/subset/meson.build  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
 
-commit 1f0a9d9be979de01527c05f4dbe6fbc62799597c
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Tue Sep 17 11:10:08 2019 -0700
+commit 1c4dd79cfb2ce617f51778be96cd7fb99fda0382
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 08:49:14 2020 +0430
 
-    [subset] GPOS Lookup Type 2: PairPos
+    [ci] Increase timeout as gh bot issue isn't resolved by serial test
 
- src/hb-ot-layout-gpos-table.hh                     | 131 ++++++++++++++++++++-
- test/subset/data/Makefile.am                       |   1 +
- test/subset/data/Makefile.sources                  |   1 +
- ...s2_1_font7.keep-layout-retain-gids.21,23,25.otf | Bin 0 -> 1764 bytes
- ...gpos2_1_font7.keep-layout-retain-gids.21,23.otf | Bin 0 -> 1632 bytes
- ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3688 bytes
- .../gpos2_1_font7.keep-layout.21,23,25.otf         | Bin 0 -> 1428 bytes
- .../gpos2_1_font7.keep-layout.21,23.otf            | Bin 0 -> 1308 bytes
- ...s2_1_font7.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3688 bytes
- ...s2_2_font5.keep-layout-retain-gids.21,23,25.otf | Bin 0 -> 1776 bytes
- ...gpos2_2_font5.keep-layout-retain-gids.21,23.otf | Bin 0 -> 1644 bytes
- ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3684 bytes
- .../gpos2_2_font5.keep-layout.21,23,25.otf         | Bin 0 -> 1440 bytes
- .../gpos2_2_font5.keep-layout.21,23.otf            | Bin 0 -> 1320 bytes
- ...s2_2_font5.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3684 bytes
- test/subset/data/fonts/gpos2_1_font7.otf           | Bin 0 -> 4584 bytes
- test/subset/data/fonts/gpos2_2_font5.otf           | Bin 0 -> 4580 bytes
- test/subset/data/tests/layout.gpos2.tests          |  12 ++
- 18 files changed, 139 insertions(+), 6 deletions(-)
+ test/fuzzing/meson.build | 2 +-
+ test/subset/meson.build  | 3 +--
+ 2 files changed, 2 insertions(+), 3 deletions(-)
 
-commit e766783152b91fb20baf0c657586628fd7959b1b
+commit eac2c3bdb1953d42b4ba07292a4c8e6a9bf94cad
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Oct 21 22:17:06 2019 +0330
+Date:   Thu May 21 07:09:03 2020 +0430
 
-    [fuzz] Add https://crbug.com/oss-fuzz/17898 testcase
+    [ci] Enable sanitizer bots again
 
- ...sterfuzz-testcase-hb-subset-fuzzer-5717414645334016 | Bin 0 -> 310324 bytes
- 1 file changed, 0 insertions(+), 0 deletions(-)
+ .circleci/config.yml | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
 
-commit b66094ada0ae7e69d5d08ee8423554629eabccaf
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Mon Sep 30 16:19:18 2019 -0700
+commit f9b31ddaaa81b63c2f3be325aa879796703e5a18
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 08:37:44 2020 +0430
 
-    [subset] GSUB Lookup Type 6: ChainContextSubst
+    [build] State encoding explicitly for hb-version.h.in
+    
+    As https://circleci.com/gh/harfbuzz/harfbuzz/140481
+      Traceback (most recent call last):
+        File "./gen-hb-version.py", line 14, in <module>
+          output_file.write (input_file.read ()
+        File "/usr/lib/python3.4/encodings/ascii.py", line 26, in decode
+          return codecs.ascii_decode(input, self.errors)[0]
+      UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 16: ordinal not in range(128)
 
- src/hb-ot-layout-common.hh                         | 260 ++++++++++++++-------
- src/hb-ot-layout-gsubgpos.hh                       | 218 ++++++++++++++++-
- test/subset/data/Makefile.am                       |   1 +
- test/subset/data/Makefile.sources                  |   1 +
- ...ules_f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2380 bytes
- ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3748 bytes
- ...ultiple_subrules_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1916 bytes
- ...ubrules_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3748 bytes
- ...ules_f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2408 bytes
- ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3780 bytes
- ...ultiple_subrules_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1944 bytes
- ...ubrules_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3780 bytes
- ...mple_f2.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2368 bytes
- ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3716 bytes
- ...chaining3_simple_f2.keep-layout.30,31,32,33.otf | Bin 0 -> 1904 bytes
- ..._simple_f2.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3716 bytes
- .../fonts/gsub_chaining1_multiple_subrules_f1.otf  | Bin 0 -> 4700 bytes
- .../fonts/gsub_chaining2_multiple_subrules_f1.otf  | Bin 0 -> 4780 bytes
- .../subset/data/fonts/gsub_chaining3_simple_f2.otf | Bin 0 -> 4668 bytes
- test/subset/data/tests/layout.gsub6.tests          |  12 +
- 20 files changed, 405 insertions(+), 87 deletions(-)
+ src/gen-hb-version.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit eff91bbb4b1e6f4cc8401b1915d5ddad64e053bb
-Author: Garret Rieger <grieger@google.com>
-Date:   Wed Oct 16 16:58:57 2019 -0700
+commit 759ab4fe561b329d8a2d7682e42b8b4f85aa78f6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 08:24:15 2020 +0430
 
-    Add missing pop() for the failure case of script subsetting.
+    [meson] Use subdir_done to simplify test/api/meson.build
 
src/hb-ot-layout-common.hh | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
test/api/meson.build | 161 ++++++++++++++++++++++++++-------------------------
+ 1 file changed, 81 insertions(+), 80 deletions(-)
 
-commit eab191fd9c851cb7881163ddd5e11a2ebc58cef4
-Author: Garret Rieger <grieger@google.com>
-Date:   Wed Oct 2 14:28:53 2019 -0700
+commit a79d0e405b65c9c077a5e29b0b9313a606da691b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 07:32:58 2020 +0430
 
-    Rewrite hash and == function for hb_array_t as a plain loop.
+    [subset] minor, use a better type in iteration
     
-    Profling showed that the current implementation were accounting for nearly all processing time in some cases. These implementations look to be about 10x faster.
+    In file included from hb-ot-face.cc:34:
+    In file included from ./hb-ot-kern-table.hh:30:
+    In file included from ./hb-aat-layout-kerx-table.hh:31:
+    In file included from ./hb-kern.hh:32:
+    In file included from ./hb-ot-layout-gpos-table.hh:32:
+    ./hb-ot-layout-gsubgpos.hh:1878:63: error: loop variable '_' binds to a temporary value produced by a range of type 'decltype((hb_forward<hb_filter_iter_factory_t<hb_map_t &, const (anonymous struct at ./hb-algs.hh:331:1) &>>(rhs)(hb_forward<hb_zip_iter_t<hb_iota_iter_t<unsigned int, unsigned int>, hb_array_t<const OT::OffsetTo<OT::RuleSet, OT::IntType<unsigned short, 2>, true>>>>(lhs))))' (aka 'hb_filter_iter_t<hb_zip_iter_t<hb_iota_iter_t<unsigned int, unsigned int>, hb_array_t<const OT::OffsetTo<OT::RuleSet, OT::IntType<unsigned short, 2>, true>>>, hb_map_t &, const (anonymous struct at ./hb-algs.hh:331:1) &>') [-Werror,-Wrange-loop-bind-reference]
+        for (const hb_pair_t<unsigned, const OffsetTo<RuleSet>&>& _ : + hb_enumerate (ruleSet)
+                                                                  ^
+    ./hb-ot-layout-gsubgpos.hh:1878:10: note: use non-reference type 'hb_pair_t<unsigned int, const OffsetTo<OT::RuleSet> &>'
+        for (const hb_pair_t<unsigned, const OffsetTo<RuleSet>&>& _ : + hb_enumerate (ruleSet)
+             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
- src/hb-array.hh | 21 +++++++++++----------
- 1 file changed, 11 insertions(+), 10 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 831daf4c76aed87d229b1edfb59a0a37caa8e581
-Author: Garret Rieger <grieger@google.com>
-Date:   Tue Oct 1 17:46:27 2019 -0700
+commit 8667df552c640c41413cb34d2ef008eb037988d2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 07:19:37 2020 +0430
 
-    Enforce HB_MAX_LANGSYS limit during layout subsetting.
+    [meson] Unbreak the build, oops
 
src/hb-ot-layout-common.hh                         |  68 +++++++++++++--------
- ...ase-minimized-hb-subset-fuzzer-5721073428987904 | Bin 0 -> 349561 bytes
- 2 files changed, 41 insertions(+), 27 deletions(-)
test/fuzzing/meson.build | 2 +-
+ test/subset/meson.build  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
 
-commit 9871461bce9a1557807f69615300e5df4f6ae322
-Author: Garret Rieger <grieger@google.com>
-Date:   Tue Oct 1 16:29:24 2019 -0700
+commit 37f9cccc210dd17af93c71ef3a9327d4365181c0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 07:17:18 2020 +0430
 
-    Enforce HB_MAX_SCRIPTS during subsetting of the script table.
+    [meson] Don't run subset tests in parallel
+    
+    Hopefully resolves https://github.com/harfbuzz/harfbuzz/runs/695051808#step:6:700 for now
 
- src/hb-ot-layout-common.hh | 46 +++++++++++++++++++++++++++++++++++++++++-----
- 1 file changed, 41 insertions(+), 5 deletions(-)
+ test/subset/meson.build | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 029775bcbd0a25ee1cdb6c0653a2ce189774490a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Oct 9 11:00:09 2019 +0700
+commit 791debdc4ae18b2b22842b1fb28a26e93633ce7b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 07:15:09 2020 +0430
 
-    [buffer] Minor; improve HB_NO_BUFFER_MESSAGE
+    [meson][ci] Don't run subset fuzzer test in parallel
+    
+    resolves https://github.com/harfbuzz/harfbuzz/runs/695051808#step:6:595 failure
 
- src/hb-buffer.cc | 2 ++
- src/hb-buffer.hh | 2 +-
- 2 files changed, 3 insertions(+), 1 deletion(-)
+ test/fuzzing/meson.build | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 9a68e6b901967da14a5da5acb535c944794627b8
+commit 8a5368e2d6d136357f7114e638635a15e7759841
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Oct 16 13:28:15 2019 +0330
+Date:   Thu May 21 07:00:40 2020 +0430
 
-    [doc] minor
-    
-    Addresses https://github.com/harfbuzz/harfbuzz/pull/2013/files#r335196908
+    [tests] Enable more gid misc calls on draw fuzzer
 
src/hb-common.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
test/fuzzing/hb-draw-fuzzer.cc | 42 ++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 40 insertions(+), 2 deletions(-)
 
-commit b0b8551afc2ff86d027fdb380210601cb465af41
+commit c68ab4b52b898f5c168cf662137b3dce922c29d9
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Oct 12 21:12:19 2019 +0330
+Date:   Thu May 21 00:25:17 2020 +0430
 
-    [glyf] Use range_checker_t in composite_iter_t
+    Fix _get_ligature_caret's oob read issue
+    
+    AAT::Lookup has no other way to detect whether it is returned from
+    a real and sanitized font data or from a null pool, this checks if
+    the table has been recognized valid by sanitizer by checking
+    table's major version which is zero if returned from a null pool and
+    non-zero if is from a sanitized font data, it is expected the other
+    calls of the table (unlikely to have more calls however) also do a
+    similar version check before calling the lookups used on the table.
 
- src/hb-ot-glyf-table.hh     | 12 +++++++-----
- src/hb-ot-var-gvar-table.hh | 19 +++++++++----------
- 2 files changed, 16 insertions(+), 15 deletions(-)
+ src/hb-aat-layout-lcar-table.hh    |  9 +++++++++
+ test/api/test-ot-face.c            |  2 ++
+ test/api/test-ot-ligature-carets.c | 14 ++++----------
+ test/fuzzing/hb-draw-fuzzer.cc     |  3 +++
+ 4 files changed, 18 insertions(+), 10 deletions(-)
 
-commit 06e35ce052388e7ce079c0250db62428ae0c5bc8
+commit 57886e2162312b789dd5a1956a883c3fd2c1cee0
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Oct 12 15:16:31 2019 +0330
+Date:   Thu May 21 06:29:33 2020 +0430
 
-    [glyf] minor
+    [test] Enable tests fixed by 461cd5a which was regressed by b986fea
 
src/hb-ot-glyf-table.hh | 128 +++++++++++++++++++++++++-----------------------
- 1 file changed, 67 insertions(+), 61 deletions(-)
test/api/test-ot-ligature-carets.c | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
 
-commit d13bb4bd94a6ba8cdd4a03d40d8089a8f8b3a7ec
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Oct 12 12:13:57 2019 +0330
+commit 8b5d3ebd9653375025e5ff439191370332e1b346
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Apr 17 11:58:31 2020 -0700
 
-    [glyf] other cleanups
+    [subset] GSUB5/GPOS7 Contextual Subst/Pos Subtbale Subsetting support
 
- src/hb-ot-glyf-table.hh | 338 +++++++++++++++++++++++-------------------------
- 1 file changed, 160 insertions(+), 178 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh                       | 160 ++++++++++++++++++++-
+ src/hb-subset.cc                                   |   2 +-
+ src/hb-subset.hh                                   |   7 +-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...ubrules_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2140 bytes
+ ...e_subrules_f1.keep-layout-retain-gids.41,42.otf | Bin 0 -> 2028 bytes
+ ...e_subrules_f1.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2048 bytes
+ ...iple_subrules_f1.keep-layout-retain-gids.41.otf | Bin 0 -> 1916 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3756 bytes
+ ...1_multiple_subrules_f1.keep-layout.41,42,43.otf | Bin 0 -> 1440 bytes
+ ...ext1_multiple_subrules_f1.keep-layout.41,42.otf | Bin 0 -> 1324 bytes
+ ...ext1_multiple_subrules_f1.keep-layout.41,43.otf | Bin 0 -> 1332 bytes
+ ...ontext1_multiple_subrules_f1.keep-layout.41.otf | Bin 0 -> 1216 bytes
+ ...ubrules_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3756 bytes
+ ...ubrules_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2156 bytes
+ ...e_subrules_f1.keep-layout-retain-gids.41,42.otf | Bin 0 -> 2040 bytes
+ ...e_subrules_f1.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2048 bytes
+ ...iple_subrules_f1.keep-layout-retain-gids.41.otf | Bin 0 -> 1916 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3772 bytes
+ ...2_multiple_subrules_f1.keep-layout.41,42,43.otf | Bin 0 -> 1456 bytes
+ ...ext2_multiple_subrules_f1.keep-layout.41,42.otf | Bin 0 -> 1336 bytes
+ ...ext2_multiple_subrules_f1.keep-layout.41,43.otf | Bin 0 -> 1332 bytes
+ ...ontext2_multiple_subrules_f1.keep-layout.41.otf | Bin 0 -> 1216 bytes
+ ...ubrules_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3772 bytes
+ ..._simple_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2120 bytes
+ ...xt3_simple_f1.keep-layout-retain-gids.41,42.otf | Bin 0 -> 1912 bytes
+ ...xt3_simple_f1.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2028 bytes
+ ...ntext3_simple_f1.keep-layout-retain-gids.41.otf | Bin 0 -> 1896 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3736 bytes
+ ...pos_context3_simple_f1.keep-layout.41,42,43.otf | Bin 0 -> 1420 bytes
+ .../gpos_context3_simple_f1.keep-layout.41,42.otf  | Bin 0 -> 1208 bytes
+ .../gpos_context3_simple_f1.keep-layout.41,43.otf  | Bin 0 -> 1312 bytes
+ .../gpos_context3_simple_f1.keep-layout.41.otf     | Bin 0 -> 1196 bytes
+ ..._simple_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3736 bytes
+ .../fonts/gpos_context1_multiple_subrules_f1.otf   | Bin 0 -> 4760 bytes
+ .../fonts/gpos_context2_multiple_subrules_f1.otf   | Bin 0 -> 4780 bytes
+ test/subset/data/fonts/gpos_context3_simple_f1.otf | Bin 0 -> 4732 bytes
+ test/subset/data/tests/layout.context.tests        |  15 ++
+ 39 files changed, 176 insertions(+), 10 deletions(-)
+
+commit 00aba82a6d4b00b2d512e13ea1ee7aefea5d7441
+Merge: ca2705f1 461cd5a1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 00:10:33 2020 +0430
+
+    Merge pull request #2415 from pipcet/fix-ligature-carets
+    
+    minor: fix hb_ot_layout_get_ligature_carets
+
+commit ca2705f1fbd7e60fdabf59a93f8dc6c19fa2fcd0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 21 00:05:42 2020 +0430
+
+    [tests] Add more tests for _get_ligature_carets
+
+ test/api/fonts/NotoNastaliqUrdu-Regular.ttf | Bin 0 -> 497204 bytes
+ test/api/test-ot-ligature-carets.c          | 153 +++++++++++++++++++++++++---
+ 2 files changed, 138 insertions(+), 15 deletions(-)
+
+commit 461cd5a158cd01163c205e0e8cfeb366779c100e
+Author: Pip Cet <pipcet@gmail.com>
+Date:   Wed May 20 10:01:24 2020 +0000
+
+    minor: fix hb_ot_layout_get_ligature_carets
 
-commit e7aa8c5d22b034f3d7bcf187a63cdec27732fa8a
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Oct 12 11:25:32 2019 +0330
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    [glyf] Introduce glyf::Glyph, a hb_bytes_t/GlyphHeader pair
+commit 3dd7b2105b3f36ce08dfa5bdaed792dc4eb69ad3
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sun May 17 00:12:08 2020 +0100
 
- src/hb-ot-glyf-table.hh | 177 +++++++++++++++++++++++++-----------------------
- 1 file changed, 91 insertions(+), 86 deletions(-)
+    meson: build documentation with gtk-doc
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2409
 
-commit 546ffc9faf869b4971765e9a4fd232cfe0eecaea
+ docs/Makefile.am  |  2 +-
+ docs/meson.build  | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ meson.build       |  4 ++++
+ meson_options.txt |  2 ++
+ 4 files changed, 74 insertions(+), 1 deletion(-)
+
+commit 4fc6189a329cdf5fbf0b5bef34b37b726c4a6959
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Oct 12 09:51:57 2019 +0330
+Date:   Tue Apr 21 12:19:16 2020 +0430
 
-    [glyf] minor
+    [meson] Generate harfbuzz.cc, hb-version.h and ragel artifacts
 
- src/hb-ot-glyf-table.hh | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
+ src/Makefile.am            | 18 +++++++-----------
+ src/gen-harfbuzzcc.py      | 14 ++++++++++++++
+ src/gen-hb-version.py      | 19 +++++++++++++++++++
+ src/gen-ragel-artifacts.py | 22 ++++++++++++++++++++++
+ src/meson.build            | 30 ++++++++++++++++++++++++++++++
+ 5 files changed, 92 insertions(+), 11 deletions(-)
 
-commit 4299ea266e03b64db4e8a132983fed9fd0a967ee
+commit b19f927f967f50aecd64913dc37ee92085919644
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Sat May 16 09:27:05 2020 +0200
+
+    meson: error out if introspection is enabled but gobject isn't
+    
+    In case a user passed -Dintrospection=enabled the build would just ignore
+    it by default because gobject defaults to disabled and the introspection build
+    gets skipped.
+    
+    Instead, if introspection is explicitly enabled but gobject is for some reason
+    missing error out.
+    
+    Fixes #2404
+
+ src/meson.build | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit b207eab842bf7c18e3de49338726b26138c77c69
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Apr 30 11:53:21 2020 -0400
+
+    Round-trip OpenType tags through BCP 47
+
+ src/hb-algs.hh         |  6 ++++
+ src/hb-ot-tag.cc       | 74 +++++++++++++++++++++++++++++---------------------
+ test/api/test-ot-tag.c | 58 +++++++++++++++++++++++++++++----------
+ 3 files changed, 93 insertions(+), 45 deletions(-)
+
+commit 10d6605bbe6cdde66e8901e1b2aee63e664516ad
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri May 15 10:52:49 2020 -0700
+
+    [subset] don't use << operator in collect_mapping
+
+ src/hb-ot-cmap-table.hh | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit ba3c77ef23eab3d0ab597ed89a7811be12ca0a6a
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Oct 12 09:51:27 2019 +0330
+Date:   Fri May 15 12:14:23 2020 +0430
 
-    [glyf] Move get_contour_points to GlyphHeader
+    [docs] minor update on releasing
 
src/hb-ot-glyf-table.hh | 260 ++++++++++++++++++++++++++----------------------
- 1 file changed, 141 insertions(+), 119 deletions(-)
RELEASING.md | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
 
-commit b918cd8c76a6333e43b9be23178afc9e74e17024
-Author: Ben Wagner <bungeman@chromium.org>
-Date:   Thu Oct 10 15:30:48 2019 -0400
+commit 0722889a6ee9e3d2c186d53d2c414cc7b28ca4b0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri May 15 10:10:27 2020 +0430
 
-    Document hb_feature_t.
+    [meson] increase subset tests timeout
     
-    This documents hb_feature_t. This is motivated mostly by the ambiguity
-    of the units for 'start' and 'end' (clusters) and whether they are
-    inclusive or exclusive. This also documents that for lookup type 3 the
-    value is the one based index into the alternates and that in a list of
-    features later feature values override previous feature values with the
-    same tag.
+    https://github.com/harfbuzz/harfbuzz/runs/676665822#step:6:570
+    
+    fails because meson runs the tests in parallel, correct fix will be making the tests smaller
 
- src/hb-common.h | 15 +++++++++++++++
- src/hb-shape.cc |  4 +++-
- 2 files changed, 18 insertions(+), 1 deletion(-)
+ test/subset/meson.build | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
 
-commit e637a4b3de2fb8bdbc1b82e822f4a6cc579e794b
-Merge: 670fec23 e4464f44
+commit c15146448b534479de08b6aa8e6b1795221a2e1e
+Merge: 069c5de9 7a961692
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Oct 11 10:28:58 2019 +0700
+Date:   Thu May 14 19:12:41 2020 -0700
 
-    Merge pull request #2012 from harfbuzz/lepcha-oo
+    Merge pull request #2264 from harfbuzz/unicode-13
     
-    Reorder U+1C29 LEPCHA VOWEL SIGN OO
+    Update to Unicode 13.0.0
 
-commit 670fec231d31bf7417de590efd3485f337a7330f
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Oct 10 09:21:08 2019 +0330
+commit 069c5de9f8d95ac8fb1b909e3276af9887311222
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 14 18:58:53 2020 -0700
 
-    Minor, add a zero length tolerant memset, hb_memset
+    [util/hb-view] Add --font-extents
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2402
 
- src/hb-algs.hh   | 10 +++++++++-
- src/hb-buffer.cc |  3 +--
- 2 files changed, 10 insertions(+), 3 deletions(-)
+ util/options.cc    | 23 +++++++++++++++++++++++
+ util/options.hh    |  6 ++++++
+ util/view-cairo.cc | 25 ++++++++++++++++---------
+ 3 files changed, 45 insertions(+), 9 deletions(-)
 
-commit e4464f4484009b4efe7144570384d836cb6bbac8
+commit 7a961692e9568806221de8b2e2bf41bdfc1b8b3f
 Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Wed Oct 9 20:55:52 2019 -0400
+Date:   Wed Apr 1 17:26:07 2020 -0400
 
-    Reorder U+1C29 LEPCHA VOWEL SIGN OO
+    Update IANA Language Subtag Registry to 2020-05-12
 
- src/gen-use-table.py                 | 3 +++
- src/hb-ot-shape-complex-use-table.cc | 2 +-
- 2 files changed, 4 insertions(+), 1 deletion(-)
+ src/gen-tag-table.py   |   1 +
+ src/hb-ot-tag-table.hh | 125 ++++++++++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 119 insertions(+), 7 deletions(-)
 
-commit e17e7443007fc0debc4a26e5cf37d5d76c747fbf
-Author: Garret Rieger <grieger@google.com>
-Date:   Wed Oct 9 11:45:42 2019 -0700
+commit b2a965df5ef1a90a1260b40ff3b4775ae9a222f3
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Apr 22 15:58:41 2020 -0700
+
+    [subset] Add support for "--gids" option
+    cmap subsetting now retains entries associated with any glyph ids explicitly requested
+
+ src/hb-ot-cmap-table.hh                            | 205 +++++++++++++++++++--
+ src/hb-ot-os2-table.hh                             |  21 ++-
+ src/hb-subset-plan.cc                              |   2 +
+ src/hb-subset-plan.hh                              |   3 +
+ test/api/test-subset-cmap.c                        |   4 +-
+ test/subset/data/Makefile.sources                  |   2 +-
+ .../basics/Comfortaa-Regular-new.gids.61,62,63.ttf | Bin 0 -> 8296 bytes
+ .../basics/Comfortaa-Regular-new.gids.61,63.ttf    | Bin 0 -> 7944 bytes
+ .../basics/Comfortaa-Regular-new.gids.61.ttf       | Bin 0 -> 7588 bytes
+ .../basics/Comfortaa-Regular-new.gids.62.ttf       | Bin 0 -> 7528 bytes
+ .../basics/Comfortaa-Regular-new.gids.63.ttf       | Bin 0 -> 7516 bytes
+ ...ortaa-Regular-new.gids.retain-all-codepoint.ttf | Bin 0 -> 182876 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,62,63.ttf | Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61,63.ttf    | Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.61.ttf       | Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.62.ttf       | Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.gids.63.ttf       | Bin 0 -> 4128 bytes
+ ...jo-Regular-subset.gids.retain-all-codepoint.ttf | Bin 0 -> 9524 bytes
+ .../basics/Roboto-Regular.abc.gids.61,62,63.ttf    | Bin 0 -> 2168 bytes
+ .../basics/Roboto-Regular.abc.gids.61,63.ttf       | Bin 0 -> 2168 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.61.ttf | Bin 0 -> 2168 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.62.ttf | Bin 0 -> 2168 bytes
+ .../expected/basics/Roboto-Regular.abc.gids.63.ttf | Bin 0 -> 2168 bytes
+ ...oboto-Regular.abc.gids.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E02,4E03.otf    | Bin 0 -> 1388 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E03.otf         | Bin 0 -> 1380 bytes
+ .../cmap14/cmap14_font1.gids.4E00,4E05,4E07.otf    | Bin 0 -> 1620 bytes
+ .../cmap14/cmap14_font1.gids.4E02,4E03,4E08.otf    | Bin 0 -> 1744 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E02.otf     | Bin 0 -> 1312 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E03.otf     | Bin 0 -> 1352 bytes
+ .../cmap14_font1.gids.4E05,4E07,4E08,4E09.otf      | Bin 0 -> 2164 bytes
+ .../cmap14/cmap14_font1.gids.4E08,4E09.otf         | Bin 0 -> 2036 bytes
+ .../expected/cmap14/cmap14_font1.gids.4E08.otf     | Bin 0 -> 1704 bytes
+ .../cmap14_font1.gids.retain-all-codepoint.otf     | Bin 0 -> 2380 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E02,4E03.otf    | Bin 0 -> 1388 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E03.otf         | Bin 0 -> 1380 bytes
+ .../cmap14/cmap14_font2.gids.4E00,4E05,4E07.otf    | Bin 0 -> 1624 bytes
+ .../cmap14/cmap14_font2.gids.4E02,4E03,4E08.otf    | Bin 0 -> 1744 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E02.otf     | Bin 0 -> 1308 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E03.otf     | Bin 0 -> 1348 bytes
+ .../cmap14_font2.gids.4E05,4E07,4E08,4E09.otf      | Bin 0 -> 2164 bytes
+ .../cmap14/cmap14_font2.gids.4E08,4E09.otf         | Bin 0 -> 2032 bytes
+ .../expected/cmap14/cmap14_font2.gids.4E08.otf     | Bin 0 -> 1700 bytes
+ .../cmap14_font2.gids.retain-all-codepoint.otf     | Bin 0 -> 2376 bytes
+ .../japanese/Mplus1p-Regular.default.25771.ttf     | Bin 0 -> 1824 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf  | Bin 0 -> 1096 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttf   | Bin 0 -> 1860 bytes
+ test/subset/data/profiles/gids.txt                 |   1 +
+ test/subset/data/tests/basics.tests                |   1 +
+ test/subset/data/tests/cmap14.tests                |   1 +
+ test/subset/data/tests/japanese.tests              |   1 +
+ test/subset/meson.build                            |   3 +-
+ util/options-subset.cc                             |  61 ++++++
+ 53 files changed, 282 insertions(+), 23 deletions(-)
 
-    Convert existing uses of serialize_append in gsub subsetting to use subset_offset_array.
+commit 44d88cff95e9255fb851bf59b40f685b264dc082
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri May 8 15:33:34 2020 -0700
 
- src/hb-ot-layout-gsub-table.hh | 44 +++---------------------------------------
- 1 file changed, 3 insertions(+), 41 deletions(-)
+    [subset] fix intersects () for Context/ChainContext tables
+    return true only when all values in array are intersected with input
 
-commit 36f18cecbbaf8635a2179a827242ca99d5283666
-Author: Garret Rieger <grieger@google.com>
-Date:   Mon Oct 7 14:02:31 2019 -0700
+ src/hb-ot-layout-gsubgpos.hh | 38 +++++++++++++++++++-------------------
+ 1 file changed, 19 insertions(+), 19 deletions(-)
 
-    Add subset_offset_array helper function which simplifies subsetting offset arrays during stream operations.
+commit 42025680cb0a30eba4ed48d125586a4dda3c973e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue May 12 00:14:33 2020 +0430
 
- src/hb-ot-layout-common.hh     | 54 ++++++++++++++++++++++++++++++++++++++++++
- src/hb-ot-layout-gsub-table.hh | 15 +-----------
- 2 files changed, 55 insertions(+), 14 deletions(-)
+    2.6.6
 
-commit dc45f225212da7b8eca0ddcb3c9cd66e65983605
+ NEWS             | 7 +++++++
+ configure.ac     | 2 +-
+ meson.build      | 2 +-
+ src/hb-version.h | 4 ++--
+ 4 files changed, 11 insertions(+), 4 deletions(-)
+
+commit 57d67f177508c11a2a9b9e8aa5f2d3540b5319f5
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 8 23:27:37 2019 +0330
+Date:   Tue May 12 00:03:17 2020 +0430
 
-    [ot-metrics] Don't use mixed scaled and not scaled for generating extents
+    [RELEASE] minor update
 
- src/hb-ot-cff1-table.cc        | 4 ++--
- src/hb-ot-cff2-table.cc        | 4 ++--
- src/hb-ot-color-sbix-table.hh  | 7 +++++++
- src/hb-ot-glyf-table.hh        | 6 +++---
- test/api/test-ot-extents-cff.c | 6 +++---
- 5 files changed, 17 insertions(+), 10 deletions(-)
+ RELEASING.md | 20 +++++---------------
+ 1 file changed, 5 insertions(+), 15 deletions(-)
 
-commit b068e25f8f89d9b07963dddd5d5e14f61539556f
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 8 16:29:15 2019 +0330
+commit b169a52c1e3c5d16adcf3e80cba37bb86adcbe77
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon May 11 14:35:11 2020 +0200
 
-    [glyf] Address Behdad's reviews
-    
-    Addresses https://github.com/harfbuzz/harfbuzz/pull/1999#issuecomment-539298559
-    * Don't check against Null pool
-    * Remove cryptic _tt suffix
+    [blob] Fix build when HAVE_MMAP is not defined
 
- src/hb-ot-font.cc       |  4 ++--
- src/hb-ot-hmtx-table.hh | 16 ++++++++--------
- 2 files changed, 10 insertions(+), 10 deletions(-)
+ src/hb-blob.cc | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
 
-commit 6961766db2c53ea813079c61e4d996234ae8be4f
+commit a2ce96881b40c1689319c1f699f1469afc3ffe40
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 8 16:26:48 2019 +0330
+Date:   Mon May 11 17:15:37 2020 +0430
 
-    [glyf] fix scaling direction
+    [cff] remove the not used member
 
- src/hb-ot-glyf-table.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-subset-cff1.cc | 4 ----
+ 1 file changed, 4 deletions(-)
 
-commit 0527fda4c75e4354198df79275526d4726a3aacc
+commit 2cc78a58c3fecf7a3cb26c01949e9cd4d0cd9ee5
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 8 16:19:39 2019 +0330
+Date:   Mon May 11 15:56:54 2020 +0430
 
-    minor
+    [number] minor
 
- src/hb-subset-cff-common.cc | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
+ src/hb-number-parser.hh | 16 +++++++---------
+ src/hb-number-parser.rl |  8 +++-----
+ 2 files changed, 10 insertions(+), 14 deletions(-)
 
-commit b2628f1a3e3a6875dcdf7cb89f5b10a4ae76e6f9
+commit bb095e1bdd0f7f1de88651d6f7223bc04bf70d70
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 8 15:09:09 2019 +0330
+Date:   Sun May 10 22:00:05 2020 +0430
 
-    [glyf] Move glyph bytes drop hints logic to GlyphHeader
+    [meson] make -subset target dependent to deps to get libm dependency
 
- src/hb-ot-glyf-table.hh | 92 ++++++++++++++++++++-----------------------------
- 1 file changed, 37 insertions(+), 55 deletions(-)
+ src/meson.build | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 1fb9c3b6463fdee9eb4dac697beab4d3d7a5fdcf
+commit dca8ba6b6d637ebfc51d658a893e8dbda28b7709
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 8 13:50:16 2019 +0330
+Date:   Sun May 10 16:57:45 2020 +0430
 
-    [glyf] Implement depth limit for add_gid_and_children
+    [number] Make hb_parse_double simpler now that we don't have to mimic strtod
 
- src/hb-ot-glyf-table.hh | 8 +++++---
- 1 file changed, 5 insertions(+), 3 deletions(-)
+ src/hb-number-parser.hh | 23 ++++++++++++-----------
+ src/hb-number-parser.rl | 15 ++++++++-------
+ src/hb-number.cc        | 25 +++++++++++++------------
+ src/test-number.cc      | 20 --------------------
+ 4 files changed, 33 insertions(+), 50 deletions(-)
 
-commit be0eddd41896824cb093024c2b4929b612ee1fae
+commit 44fe1c8ff19048d11785ff154993d6637b447fdd
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 8 13:46:55 2019 +0330
+Date:   Wed Mar 25 16:36:48 2020 +0430
 
-    [glyf] Move add_gid_and_children to glyf table
+    Remove xlocale use now that isn't available in most distros
+    
+    Our CI bots don't detect it in Alpine, ArchLinux, Ubuntu and Fedora
+    so let's get rid of it use the fallback we are using anyway for a
+    long time.
 
- src/hb-ot-glyf-table.hh | 14 ++++++++++++++
- src/hb-subset-plan.cc   | 19 +------------------
- 2 files changed, 15 insertions(+), 18 deletions(-)
+ CMakeLists.txt     |  6 +----
+ configure.ac       |  4 +--
+ meson.build        |  3 ---
+ src/hb-number.cc   | 71 +-----------------------------------------------------
+ src/test-number.cc |  9 -------
+ 5 files changed, 4 insertions(+), 89 deletions(-)
 
-commit c7621cf21115aa563ee4fb9d2fcb601984848494
+commit eea99d7b7253027570f7afe64ca63962618553b7
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 8 13:24:26 2019 +0330
+Date:   Sun May 10 14:46:16 2020 +0430
 
-    Minor, replace hb_set_add with private API
+    [meson] Let name_prefix of exported libraries the default
+    
+    meson complains about this and it is the default per #2256
+    
+    Fixes #2256
 
- src/hb-ot-map.cc            |  2 +-
- src/hb-subset-cff-common.hh |  2 +-
- src/hb-subset-cff1.cc       |  2 +-
- src/hb-subset-cff2.cc       |  2 +-
- src/hb-subset-plan.cc       | 10 +++++-----
- 5 files changed, 9 insertions(+), 9 deletions(-)
+ src/meson.build | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
 
-commit ad86806dcb702b25fac6a3364cf0f85e1b8f4b2a
+commit 2ac4222022ee261269994ce4eaf4d7c070152492
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 8 12:14:14 2019 +0330
+Date:   Sun May 10 14:20:27 2020 +0430
 
-    [glyf] Move subset related methods inside GlyphHeader
+    [meson] specify preferred linker to avoid stdc++ linking
 
- src/hb-ot-glyf-table.hh | 428 ++++++++++++++++++++++++------------------------
- src/hb-subset-plan.cc   |   4 +-
- 2 files changed, 214 insertions(+), 218 deletions(-)
+ meson_options.txt |  2 ++
+ src/meson.build   | 19 ++++++++++++++++++-
+ 2 files changed, 20 insertions(+), 1 deletion(-)
 
-commit 7839e23558344f206175b5a798149e0f04f38266
+commit 15083c24ee7c69e17eee4d99ee9db121a150338b
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Oct 7 11:14:26 2019 +0330
+Date:   Sun May 10 14:12:20 2020 +0430
 
-    [glyf] minor
+    [meson] Reenable make check-symbols compatible with gcov
 
- src/hb-ot-glyf-table.hh | 38 +++++++++++++++-----------------------
- 1 file changed, 15 insertions(+), 23 deletions(-)
+ src/check-symbols.sh |  2 +-
+ src/meson.build      | 29 ++++++++++++++++++++---------
+ 2 files changed, 21 insertions(+), 10 deletions(-)
 
-commit cbefbb2439c1a2f4c20877e611f8986b3933234e
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Oct 7 10:15:18 2019 +0330
+commit 68855e4a6dedf40d643a1ec9ac89c9ae32ce763c
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri May 8 00:51:15 2020 +0200
 
-    [glyf] Move padding removal logic to GlyphHeader
+    [docs] Don’t recommend outdated FDO releases pages
 
src/hb-ot-glyf-table.hh | 219 +++++++++++++++++++++++-------------------------
- 1 file changed, 105 insertions(+), 114 deletions(-)
docs/usermanual-install-harfbuzz.xml | 10 ++--------
+ 1 file changed, 2 insertions(+), 8 deletions(-)
 
-commit 1ab8f9aa7a182fa078f6c6a5a78ef95686b1ac54
+commit 1ec77522d838dd751733d3927e3d9589bf298853
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Oct 7 08:24:12 2019 +0330
+Date:   Thu May 7 14:08:05 2020 +0430
 
-    [glyf] minor
+    [docs] Simplify logo's SVG source, down scale png version
+    
+    * SVG version is simplified using SVGO and some hand tweak
+    * PNG result of SVG logo is optimized using pngwolf-zopfli
+    * Down scaled to fit visually a little better on docs page
 
- src/hb-ot-glyf-table.hh | 15 +++++++++------
- 1 file changed, 9 insertions(+), 6 deletions(-)
+ docs/HarfBuzz.png | Bin 8814 -> 4740 bytes
+ docs/HarfBuzz.svg | 283 ++----------------------------------------------------
+ 2 files changed, 7 insertions(+), 276 deletions(-)
 
-commit 13fb5612ad545b419ca217f031864dde1b71c43f
+commit 0b261c5d0b38f1b9a564798ea26edb698e872841
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Oct 6 23:24:06 2019 +0330
+Date:   Thu May 7 10:28:24 2020 +0430
 
-    [glyf] Aggregate get_offsets uses
+    [ci] disable clang-{everthing,*san} bots
+    
+    are flaky, will enable them somewhere else
 
src/hb-ot-glyf-table.hh | 29 +++++++----------------------
- 1 file changed, 7 insertions(+), 22 deletions(-)
.circleci/config.yml | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
 
-commit 5179b96958f2db71c315c1d8c224bab87e2f4ae8
+commit 385d64eef1d5dd37187310a08ca6f0408a2e4625
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 8 11:09:12 2019 +0330
+Date:   Thu May 7 09:59:01 2020 +0430
 
-    [cff] minor on number_t
+    Add a not discardable bool type, hb_success_t
 
- src/hb-cff-interp-common.hh | 11 ++++-------
- 1 file changed, 4 insertions(+), 7 deletions(-)
+ src/hb-open-type.hh |  4 ++--
+ src/hb.hh           | 12 ++++++++++++
+ 2 files changed, 14 insertions(+), 2 deletions(-)
 
-commit d73cdcf3612ae6114a0f828e0f667d447ed1a964
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Oct 6 18:09:14 2019 +0330
+commit 1026b3d0b65fd101939ce8d2b74aaf074c44c3e6
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Wed May 6 21:32:24 2020 +0100
 
-    [ot-font] Apply font scaling before turning to int
+    [subset] Check vector resize() call for failure (#2389)
+    
+    Other .resize() calls are checked, presumably this one should be as well.
 
- src/hb-ot-cff1-table.cc        | 12 ++++-----
- src/hb-ot-cff1-table.hh        |  2 +-
- src/hb-ot-cff2-table.cc        |  8 +++---
- src/hb-ot-color-cbdt-table.hh  | 14 +++++-----
- src/hb-ot-color-sbix-table.hh  |  8 +++---
- src/hb-ot-font.cc              | 12 +++------
- src/hb-ot-glyf-table.hh        | 58 ++++++++++++++++++++----------------------
- src/hb-ot-hmtx-table.hh        |  2 +-
- src/hb-ot-var-hvar-table.hh    |  5 ++--
- test/api/test-ot-extents-cff.c | 20 +++++++--------
- 10 files changed, 66 insertions(+), 75 deletions(-)
+ src/hb-subset-cff2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit f2339964b713815c8e0e33699bf34ee24db12215
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Oct 6 16:41:52 2019 +0330
+commit 100d40c827eb8336b2b671856f151275d47e71ad
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Wed May 6 01:48:24 2020 +0100
 
-    [glyf] minor, remove GlyphHeader::simple_* helpers
+    [aat] Fix implementation of AAT kerning for Geeza Pro. (#2388)
+    
+    * [aat] Fix implementation of AAT kerning for Geeza Pro.
+    
+    Despite what the comment in the code used to say, it appears that Geeza Pro
+    does rely on accumulating kerning values from successive subtables. With
+    this change, the results now match Core Text rendering (and avoid the clear
+    visual breakage reported in #2358).
+    
+    Testcase: U+0644,U+064E,U+0645,U+064E,U+0651,U+0627
+    
+    Fixes #2358.
+    
+    * [aat] Update test expectations, add new testcase.
 
- src/hb-ot-glyf-table.hh | 16 +++-------------
- 1 file changed, 3 insertions(+), 13 deletions(-)
+ src/hb-aat-layout-kerx-table.hh              | 50 +++++++++++++---------------
+ test/shaping/data/in-house/tests/macos.tests | 12 ++++---
+ 2 files changed, 31 insertions(+), 31 deletions(-)
 
-commit 2d7ca6a76a754a42ec09a66319ac3e4ab5efc618
+commit 9fc774ab00be92dbfd1cc1c03b4e6cadcd9b7674
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Oct 6 16:31:29 2019 +0330
+Date:   Thu Apr 30 23:14:54 2020 +0430
 
-    [glyf] Move get_instruction_length inside GlyphHeader struct
+    minor spacing
 
- src/hb-ot-glyf-table.hh | 153 ++++++++++++++++++++++++++----------------------
- 1 file changed, 84 insertions(+), 69 deletions(-)
+ src/hb-blob.cc                |  4 ++--
+ src/hb-ot-color-cbdt-table.hh | 12 ++++++------
+ 2 files changed, 8 insertions(+), 8 deletions(-)
 
-commit 50aef4d7f80b6c8a19481ad3d0fa89c7c7f222c2
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Oct 6 14:00:07 2019 +0330
+commit 09b9d63e56eb8dac50db9684cf5a77a84eb31a60
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Apr 30 18:51:46 2020 +0200
 
-    [glyf] cleanup
+    [blob] Try to support resource fork fonts on macOS
+    
+    If the size of opened file is zero, try opening resource fork by
+    appending "/..namedfork/rsrc" to the file name. This is guarded with
+    __APPLE__ ifdef and uses _PATH_RSRCFORKSPEC macro from sys/paths.h.
+    
+    Defining HB_NO_RESOURCE_FORK will disable this fallback.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2383
 
- src/hb-ot-glyf-table.hh | 128 +++++++++++++++++++++---------------------------
- 1 file changed, 55 insertions(+), 73 deletions(-)
+ src/hb-blob.cc | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 50 insertions(+)
 
-commit ee3f4630d70099c42fd9c84796b29a236f6135b6
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Oct 6 13:56:35 2019 +0330
+commit fd748fac41366166307fd67a083759465d03bd64
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sun Mar 15 15:59:31 2020 -0400
+
+    Update to Unicode 13.0.0
+
+ src/Makefile.am                              |    2 +-
+ src/gen-arabic-table.py                      |    4 +-
+ src/gen-emoji-table.py                       |    4 +-
+ src/gen-indic-table.py                       |    2 +-
+ src/gen-tag-table.py                         |    2 +-
+ src/gen-ucd-table.py                         |    2 +-
+ src/gen-use-table.py                         |   20 +-
+ src/gen-vowel-constraints.py                 |    2 +-
+ src/hb-common.cc                             |    4 +
+ src/hb-common.h                              |    8 +
+ src/hb-ot-shape-complex-arabic-table.hh      |   56 +-
+ src/hb-ot-shape-complex-indic-table.cc       |   60 +-
+ src/hb-ot-shape-complex-indic.hh             |    1 +
+ src/hb-ot-shape-complex-use-table.cc         |   91 +-
+ src/hb-ot-shape-complex-vowel-constraints.cc |    4 +-
+ src/hb-ot-shape-complex.hh                   |    4 +
+ src/hb-ucd-table.hh                          | 6248 +++++++++++++-------------
+ src/hb-unicode-emoji-table.hh                |   12 +-
+ test/api/test-unicode.c                      |   12 +
+ 19 files changed, 3336 insertions(+), 3202 deletions(-)
 
-    [glyf] Remove get_composite_iter and refactor bytes_for_glyph for shape uses
+commit 28633b1979d1363c76888a7d8380e6e9e78bd837
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 29 11:15:25 2020 -0700
 
- src/hb-ot-glyf-table.hh | 42 ++++++++++++++++--------------------------
- src/hb-subset-plan.cc   |  2 +-
- 2 files changed, 17 insertions(+), 27 deletions(-)
+    [vowel-constraints] Simplify generated code
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2385
 
-commit 8378ab96e28fa34f154583850ff1c2c672a4310d
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Oct 6 13:49:45 2019 +0330
+ src/gen-vowel-constraints.py                 | 4 ++--
+ src/hb-ot-shape-complex-vowel-constraints.cc | 6 ++----
+ 2 files changed, 4 insertions(+), 6 deletions(-)
 
-    [glyf] Rewrite composite iterator to new iterators convention
+commit 665483c9790c2a45bbbd5f2d4fece369126b17f4
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Apr 1 17:28:12 2020 -0400
 
- src/hb-ot-glyf-table.hh | 201 ++++++++++++++++++++----------------------------
- src/hb-subset-plan.cc   |  10 +--
- 2 files changed, 85 insertions(+), 126 deletions(-)
+    Recognize Elymaic as a right-to-left script
 
-commit b7684fa9f42dffa6bd81acfade163123b30800b8
-Merge: 79ec65ae 21c80d95
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Oct 6 09:00:48 2019 +0330
+ src/hb-common.cc | 3 +++
+ 1 file changed, 3 insertions(+)
 
-    Merge pull request #1999 from ebraminio/glyf-var
-    
-    Implement gvar table and variable glyf
+commit d6ddb232fc9b8c3a04398360a1d3a0b7931033e3
+Author: René Meusel <rene.meusel@nexenio.com>
+Date:   Tue Apr 28 19:30:00 2020 +0200
 
-commit 21c80d955f69c1242c77e0ec7ccd852360dd54dd
+    FIX: -Wextra-semi-stmt in Clang9
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8ba8980222731a51f23ebc12b0145d29caee1a91
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Oct 5 23:58:52 2019 +0330
+Date:   Tue Apr 28 20:14:17 2020 +0430
 
-    [gvar] minor
+    [ci] enable experimental apis in coverity scan
 
src/hb-ot-var-gvar-table.hh | 43 +++++++++++++++++++++----------------------
- 1 file changed, 21 insertions(+), 22 deletions(-)
.github/workflows/coverity-scan.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 5752863640cf4292dec313edebb57aecd47496f3
+commit d63ee13a2a3d4e480bd563dcbac74817b675e812
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Oct 5 23:51:50 2019 +0330
+Date:   Tue Apr 28 20:01:11 2020 +0430
 
-    [glyf][gvar] Make HB_NO_VAR buildable
+    [ci] enable more on coverity
 
- src/hb-ot-font.cc       | 2 ++
- src/hb-ot-glyf-table.hh | 6 ++++++
- src/hb-ot-hmtx-table.hh | 8 ++++++++
- 3 files changed, 16 insertions(+)
+ .github/workflows/coverity-scan.yml | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
 
-commit 8e33510343d151afe49730f3a0b263a2853822b8
+commit ace202e17e7f41aa3347618426b334be3d9f0e17
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Oct 4 01:11:03 2019 +0330
+Date:   Tue Apr 28 19:38:04 2020 +0430
 
-    [gvar] minor
+    [ci] remove trigger-coverity.sh
+    
+    hopefully not needed, we are submitting it in a bot
 
src/hb-ot-var-gvar-table.hh | 132 ++++++++++++++++++++++----------------------
- 1 file changed, 66 insertions(+), 66 deletions(-)
.ci/trigger-coverity.sh | 11 -----------
+ 1 file changed, 11 deletions(-)
 
-commit b3afa8164460d63031a80d399200bcaa769c0fa1
+commit a22e6de0e96b68b28cd750e3041fdc864bf3331a
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Oct 4 00:32:04 2019 +0330
+Date:   Tue Apr 28 19:25:37 2020 +0430
 
-    [glyf] Use common convention of other tables access, format
+    [blob] close file reader handle
+    
+    fortunately it isn't in that use as having mmap reader as the default
 
- src/hb-ot-face-table-list.hh |  1 +
- src/hb-ot-glyf-table.hh      | 65 +++++++++++++++++++-------------------------
- 2 files changed, 29 insertions(+), 37 deletions(-)
+ src/hb-blob.cc | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 88bd342c0ff686daad88bb6b4f2968bbd8b01a24
+commit 39976ee660ba82c75e4fa757134f7925740b1c4d
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Oct 3 22:45:37 2019 +0330
+Date:   Tue Apr 28 18:50:33 2020 +0430
 
-    [glyf] minor
+    [ci] install fonttools in linux-ci bot
 
- src/hb-ot-glyf-table.hh     | 247 +++++++++++++++++++++++---------------------
- src/hb-ot-var-gvar-table.hh |  54 +++++-----
- 2 files changed, 155 insertions(+), 146 deletions(-)
+ .github/workflows/linux-ci.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit ee7610181cee5bbc0b5dc291228fbe032097bde4
+commit 1801489b49f4c2c6ef82fba89440d4e766de3555
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Oct 3 15:59:45 2019 +0330
+Date:   Tue Apr 28 18:47:39 2020 +0430
 
-    [hmtx] Use more conventional internal API style
+    [ci] Add coverity scan bot
 
- src/Makefile.sources    |  1 -
- src/harfbuzz.cc         |  1 -
- src/hb-ot-font.cc       | 12 ++++++++++++
- src/hb-ot-hmtx-table.cc | 42 ------------------------------------------
- src/hb-ot-hmtx-table.hh | 18 ++++++++++--------
- 5 files changed, 22 insertions(+), 52 deletions(-)
+ .github/workflows/coverity-scan.yml | 38 +++++++++++++++++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
 
-commit c9577a630fd5bd08482ee7b94bc03c91fcf366c7
+commit 156714f797fcb5bc07ff5e22ae8ee8d78a7cf79b
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Oct 3 15:48:35 2019 +0330
+Date:   Tue Apr 28 16:32:15 2020 +0430
 
-    [hmtx] Use more optimal way to access glyf table
+    [ci] fix linux-ci bot
+    
+    It shows some percentage of coverage regression
+    as the switch from lcov to gcovr and autotools to meson while this travis to github actions switch.
 
- src/hb-ot-hmtx-table.cc | 20 ++++----------------
- src/hb-ot-hmtx-table.hh |  4 ++--
- 2 files changed, 6 insertions(+), 18 deletions(-)
+ .github/workflows/linux-ci.yml | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
 
-commit b9ff43c162e8f61cff8e48d3dcbf7c1fe263d625
-Author: Michiharu Ariza <ariza@typekit.com>
-Date:   Tue Oct 1 16:13:40 2019 +0330
+commit 4b298cc6c4e3ecdde2d27dfa28e8cbb377a5e05d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 28 15:50:03 2020 +0430
 
-    Implement gvar table and variable glyf
+    [ci] remove travis's clang bot
     
-    Split from Ariza's "[subset] TrueType/CFF2 variable font" work on #1594
+    we are testing it on other bots, let's remove it from travis
 
- src/Makefile.sources                               |   2 +
- src/harfbuzz.cc                                    |   1 +
- src/hb-ot-font.cc                                  |   4 +-
- src/hb-ot-glyf-table.hh                            | 618 ++++++++++++++---
- src/hb-ot-hmtx-table.cc                            |  54 ++
- src/hb-ot-hmtx-table.hh                            |  33 +-
- src/hb-ot-var-gvar-table.hh                        | 734 +++++++++++++++++++++
- test/api/Makefile.am                               |   1 +
- .../SourceSansVariable-Roman-nohvar-41,C1.ttf      | Bin 0 -> 4696 bytes
- test/api/fonts/SourceSansVariable-Roman.anchor.ttf | Bin 0 -> 4708 bytes
- .../api/fonts/SourceSansVariable-Roman.modcomp.ttf | Bin 0 -> 3252 bytes
- .../fonts/SourceSerifVariable-Roman-VVAR.abc.ttf   | Bin 0 -> 5632 bytes
- test/api/test-ot-metrics-tt-var.c                  | 250 +++++++
- 13 files changed, 1588 insertions(+), 109 deletions(-)
+ .travis.yml | 24 ++----------------------
+ 1 file changed, 2 insertions(+), 22 deletions(-)
 
-commit 79ec65ae10f959aeddaa1e39eba5226c604a8c87
+commit 34a4ce98f4ccf7c6aa6cb7d4e4497da4cf2aeb0f
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Oct 3 14:27:51 2019 +0330
+Date:   Tue Apr 28 15:34:29 2020 +0430
 
-    [ot-font] Use var vmtx side bearing in calculating v-origin
+    [ci] run apt-get with sudo
 
src/hb-ot-font.cc | 2 +-
.github/workflows/linux-ci.yml | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 3fd555be543a3e9bf9fee509327dbbc9a7b51cdb
+commit f27c0065d42f22c3f1484d97cac34f727832ff78
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Oct 3 13:02:41 2019 +0330
+Date:   Tue Apr 28 15:30:25 2020 +0430
 
-    [hmtx] Prepare to fix and minor fixes
+    [ci] Add a GitHub CI bot
+    
+    Run coverage also
 
- src/hb-ot-hmtx-table.hh     | 41 ++++++++++++++++-------------------------
- src/hb-ot-var-hvar-table.hh |  9 +++++----
- 2 files changed, 21 insertions(+), 29 deletions(-)
+ .github/workflows/linux-ci.yml | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
 
-commit 6d09b5a8a0f6ed7a2a92d91ac3d027bd54c452be
-Author: Michiharu Ariza <ariza@typekit.com>
-Date:   Thu Oct 3 12:01:39 2019 +0330
+commit 482f4aafd53982d96f08eaebe9af6e7dd4419dc9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 28 15:29:19 2020 +0430
 
-    Implement hmtx/vmtx metrics read from hvar/vvar
+    [ci] Remove coverity and codecov
+    
+    * This coverity runner doesn't work from here but will try again in GitHub Actions bot
+    * Trying to move codecov to GitHub Actions
 
- src/hb-ot-hmtx-table.hh     | 46 ++++++++++++++++++++++++++++++++++++++++-----
- src/hb-ot-var-hvar-table.hh | 19 +++++++++++++------
- 2 files changed, 54 insertions(+), 11 deletions(-)
+ .travis.yml | 13 -------------
+ 1 file changed, 13 deletions(-)
 
-commit cfafee52e4ff0441a33530847533f1b1f6019006
+commit 6890554256f96d2dee43261ad5012e788695754c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Oct 2 09:22:46 2019 +0330
+Date:   Tue Apr 28 14:56:47 2020 +0430
 
-    Add Repology badges by @luzpaz
+    [ci/meson] temporarily disable check-symbols
     
-    fixes #2002
-    to track downstream packaging of harfbuzz
+    will enable again
 
- README.md | 9 +++++++++
- 1 file changed, 9 insertions(+)
+ src/meson.build | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 2d7221a0e3552b1d902629d4ab6c0ce22db983a6
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 1 15:05:02 2019 +0330
+commit e53c44e3260d6136e27635b5bbcb2da43bc4f1b1
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Apr 24 14:06:13 2020 -0700
 
-    [cff] minor
+    [subset] temporarily revert previous cmap commit
+    Required in https://github.com/harfbuzz/harfbuzz/issues/2356
 
- src/hb-ot-cff-common.hh | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
+ src/hb-ot-cmap-table.hh                                  |   3 ++-
+ test/api/test-subset-cmap.c                              |   4 +++-
+ test/subset/data/Makefile.sources                        |   2 +-
+ .../expected/japanese/Mplus1p-Regular.default.25771.ttf  | Bin 1824 -> 0 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf        | Bin 1096 -> 0 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttf         | Bin 1860 -> 0 bytes
+ test/subset/data/tests/japanese.tests                    |   1 -
+ test/subset/meson.build                                  |   1 -
+ 8 files changed, 6 insertions(+), 5 deletions(-)
 
-commit 0558413f27e9a18188c0e3d55f5ee57ea42b1548
+commit 08428a15c392e2fff267aa3bc92b343f566c983a
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 1 13:49:55 2019 +0330
+Date:   Fri Apr 24 23:45:17 2020 +0430
 
-    Minor, tweak spaces
+    minor, spacing
 
- src/hb-aat-layout-kerx-table.hh    |  4 ++--
- src/hb-array.hh                    |  4 ++--
- src/hb-buffer.hh                   |  3 +--
- src/hb-font.h                      |  4 ++--
- src/hb-font.hh                     |  8 ++++----
- src/hb-open-file.hh                |  2 +-
- src/hb-open-type.hh                | 10 +++++-----
- src/hb-ot-cff-common.hh            |  4 ++--
- src/hb-ot-cff1-table.cc            | 11 +++++------
- src/hb-ot-cff1-table.hh            | 24 ++++++++++++------------
- src/hb-ot-cff2-table.cc            |  4 ++--
- src/hb-ot-cmap-table.hh            |  6 ++----
- src/hb-ot-color-cbdt-table.hh      |  2 +-
- src/hb-ot-color-cpal-table.hh      |  2 +-
- src/hb-ot-kern-table.hh            | 12 ++++++------
- src/hb-ot-layout-common.hh         |  2 +-
- src/hb-ot-layout-gpos-table.hh     | 14 +++++++-------
- src/hb-ot-os2-table.hh             |  4 ++--
- src/hb-ot-shape-complex-myanmar.cc |  4 ++--
- src/hb-subset-cff-common.hh        |  2 +-
- src/hb-unicode.cc                  |  8 ++++----
- src/hb-unicode.h                   | 20 ++++++++++----------
- src/hb-vector.hh                   |  4 ++--
- src/main.cc                        | 37 +++++++++++++++++++++++--------------
- src/test-iter.cc                   |  2 +-
- 25 files changed, 101 insertions(+), 96 deletions(-)
+ src/hb-aat-fdsc-table.hh        |   4 +-
+ src/hb-aat-layout-just-table.hh |   8 +--
+ src/hb-aat-layout-opbd-table.hh |   4 +-
+ src/hb-aat-layout-trak-table.hh |   2 +-
+ src/hb-ot-cff-common.hh         |   3 +-
+ src/hb-ot-cmap-table.hh         |   4 +-
+ src/hb-ot-hdmx-table.hh         |  10 ++--
+ src/hb-ot-hhea-table.hh         |  61 ++++++++++---------
+ src/hb-ot-hmtx-table.hh         |  44 +++++++-------
+ src/hb-ot-kern-table.hh         |  37 +++++++-----
+ src/hb-ot-layout-gsubgpos.hh    |   2 +-
+ src/hb-ot-math-table.hh         | 130 ++++++++++++++++++++++------------------
+ src/hb-ot-maxp-table.hh         |   7 ++-
+ src/hb-ot-meta-table.hh         |   5 +-
+ src/hb-ot-name-table.hh         |   8 +--
+ src/hb-ot-post-table.hh         |   2 +-
+ src/hb-ot-stat-table.hh         |  14 ++---
+ src/hb-ot-var-fvar-table.hh     |   6 +-
+ src/hb-ot-vorg-table.hh         |   7 ++-
+ 19 files changed, 194 insertions(+), 164 deletions(-)
+
+commit 89ad3c6cc520517af15174391a9725e634929107
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 23 10:57:30 2020 -0700
+
+    Rename add_class to collect_class
+
+ src/hb-ot-layout-common.hh     | 10 +++++-----
+ src/hb-ot-layout-gdef-table.hh |  2 +-
+ src/hb-ot-layout-gsubgpos.hh   |  2 +-
+ 3 files changed, 7 insertions(+), 7 deletions(-)
 
-commit 51b720f686adf45bc1b6db3aa76b7d2e62ad1304
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Oct 1 12:06:22 2019 +0330
+commit 5cf53c06e66d3307d7b30ea32059437887abcab1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 23 10:55:41 2020 -0700
 
-    Fix -Wsizeof-array-div clang warning
+    Rename add_coverage to collect_coverage
 
- src/hb-ot-shape-complex-arabic-fallback.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-ot-layout-common.hh     | 28 ++++++++++++++--------------
+ src/hb-ot-layout-gpos-table.hh | 28 ++++++++++++++--------------
+ src/hb-ot-layout-gsub-table.hh | 20 ++++++++++----------
+ src/hb-ot-layout-gsubgpos.hh   | 30 +++++++++++++++---------------
+ 4 files changed, 53 insertions(+), 53 deletions(-)
 
-commit faace9437ea09d89ef5f5f9c9fc3ce0dbc672142
-Merge: e48ef080 f0dd724c
+commit 689f3f57fa26922af4f2ab451eb834ae6c3119b2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Sep 30 13:34:05 2019 -0700
+Date:   Thu Apr 23 10:51:12 2020 -0700
 
-    Merge pull request #1807 from harfbuzz/subset-varstore
-    
-    VariationStore serializer
+    [set] Add << overload for range-sink
 
-commit e48ef0804ad7e4abd35ff3646fa6ed10ad32f1ef
+ src/hb-set.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit a7df5a7bdaef870617b6bdb7350a26ebbec5824a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Sep 30 12:39:06 2019 -0700
+Date:   Thu Apr 23 10:50:02 2020 -0700
 
-    2.6.2
+    [hashmap] Minor
 
- NEWS             | 6 ++++++
- configure.ac     | 2 +-
- src/hb-version.h | 4 ++--
- 3 files changed, 9 insertions(+), 3 deletions(-)
+ src/hb-map.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit d6ad613159aabce42fc21d57f6f1a4762c5617bf
+commit cc1ed76f381531c800833cb0f5b41fc524ed20a3
+Merge: 5a0936f5 a11db0b9
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Sep 10 15:31:44 2019 -0700
+Date:   Fri Apr 24 08:15:32 2020 -0700
 
-    [docs] Misc fixes
+    Merge pull request #1729 from n8willis/usermanual-integration
+    
+    [Docs] Usermanual: Add OS/platform-integration chapter
 
- docs/harfbuzz-sections.txt | 4 ++--
- src/hb-gdi.cc              | 2 +-
- src/hb-ot-layout.cc        | 2 +-
- 3 files changed, 4 insertions(+), 4 deletions(-)
+commit 5a0936f53ef533787a91063c0884275cc121585f
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Apr 23 19:09:00 2020 -0400
 
-commit 2dce85ed06a8cc7ca20900c65662af659c53e717
+    Increase the size of the serialization buffer
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a11db0b9d4d3e7cc22a4a53374d4f8a049ce067e
+Merge: 1ed30515 19346524
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Apr 23 15:32:43 2020 -0700
+
+    Merge branch 'master' into usermanual-integration
+
+commit 19346524c698586c24b0461648b33373092c60df
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Sep 26 21:15:59 2019 +0330
+Date:   Thu Apr 23 14:22:33 2020 +0430
 
-    [icu] Remove HB_ICU_STMT (#1993)
-    
-    And ignore extra semicolon error to ICU versions < 65
+    minor, add an option to skip private APIs use in main.cc
 
- src/hb-icu.cc | 43 ++++++++++++++++++++++++-------------------
- 1 file changed, 24 insertions(+), 19 deletions(-)
+ src/main.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
 
-commit d6a83abd6a0c684bd9a27f593d5be388819022b7
-Author: Iceflower <iceflower@gmx.de>
-Date:   Thu Sep 26 11:42:11 2019 +0200
+commit 2e3dfdcd5fe6ebf38872d8fd817a562bfade8c46
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Apr 23 14:04:24 2020 +0430
 
-    Define HB_UNUSED for clang
+    [meson] make 'tests' option enabled by default
+    
+    Not sure what 'auto' can mean here but it makes my local test to not run properly
 
src/hb.hh | 2 +-
meson_options.txt | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit c4567968cd175dc367ab951c9e3141ab5c03c2d6
-Author: Iceflower <iceflower@gmx.de>
-Date:   Thu Sep 26 11:35:27 2019 +0200
+commit 6881939f77e2d89ceba4cb6ed08075b93de6e500
+Author: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
+Date:   Thu Apr 23 10:08:45 2020 +0200
 
-    [dwrite] Fix extra semicolon issue
+    src: meson: Reindent after last changes
 
- src/hb-directwrite.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/meson.build | 162 ++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 81 insertions(+), 81 deletions(-)
 
-commit b0c3eb06b64dcfcfee09a25dde8250804484f77d
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Wed Sep 18 16:11:44 2019 -0700
+commit e18858c68509e1d4576bb14c7a07a5e9818c50ae
+Author: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
+Date:   Thu Apr 23 10:06:20 2020 +0200
 
-    [subset] GPOS Lookup Type 3: CursivePos
+    src: Don't build tests when they are disabled
 
- src/hb-ot-layout-common.hh                         |  33 ++++++++
- src/hb-ot-layout-gpos-table.hh                     |  87 ++++++++++++++++++++-
- test/subset/data/Makefile.am                       |   1 +
- test/subset/data/Makefile.sources                  |   1 +
- .../gpos3_font3.keep-layout-retain-gids.28,29.otf  | Bin 0 -> 1712 bytes
- .../gpos3_font3.keep-layout-retain-gids.28,2B.otf  | Bin 0 -> 1860 bytes
- .../gpos3_font3.keep-layout-retain-gids.29,2B.otf  | Bin 0 -> 1772 bytes
- ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3692 bytes
- .../layout.gpos3/gpos3_font3.keep-layout.28,29.otf | Bin 0 -> 1328 bytes
- .../layout.gpos3/gpos3_font3.keep-layout.28,2B.otf | Bin 0 -> 1456 bytes
- .../layout.gpos3/gpos3_font3.keep-layout.29,2B.otf | Bin 0 -> 1368 bytes
- ...pos3_font3.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3692 bytes
- test/subset/data/fonts/gpos3_font3.otf             | Bin 0 -> 4624 bytes
- test/subset/data/tests/layout.gpos3.tests          |  12 +++
- 14 files changed, 132 insertions(+), 2 deletions(-)
+ src/meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 68d39ea4866a9d2bae60107619aad25dac6da241
+commit 0c65a232fa00a1eb09ca0e9d1d8d26747b27416e
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 24 13:52:46 2019 +0330
+Date:   Thu Apr 23 11:23:54 2020 +0430
 
-    Revert previous change and fix -Wrange-loop-analysis complains
+    minor, add unlikely around lookup_limit_exceeded checks
+    
+    addresses https://github.com/harfbuzz/harfbuzz/pull/2294#issuecomment-618022488
 
- src/hb-ot-layout-gpos-table.hh | 6 +++---
- src/hb-ot-vorg-table.hh        | 2 +-
- 2 files changed, 4 insertions(+), 4 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
 
-commit cbc0646a6cfc0f6a04804d6888636f12130cd51b
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 24 12:08:12 2019 +0330
+commit 3e686d24590fc0b30a4bbbf4dc762d6858de8e8f
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Wed Apr 22 13:44:53 2020 +0300
 
-    Minor, normalize for each calls
+    [kern] Refactoring.
 
- src/hb-ot-glyf-table.hh        |  5 +----
- src/hb-ot-layout-gpos-table.hh | 10 +++++-----
- src/hb-ot-name-table.hh        |  3 +--
- src/hb-ot-vorg-table.hh        |  3 +--
- 4 files changed, 8 insertions(+), 13 deletions(-)
+ src/hb-kern.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
 
-commit 22b6c6a5c7b9bebe123822c702b9661e144ebd6b
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 24 12:06:28 2019 +0330
+commit 186976ebd6cefdfe993b5ae400a559ca33c66688
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 21 22:37:56 2020 -0700
 
-    [serialize] use for each as #resolve_links, format
+    [autotools] C++11 requirement is mandatory
+    
+    How was this not updated?
 
src/hb-serialize.hh | 22 +++++++---------------
- 1 file changed, 7 insertions(+), 15 deletions(-)
configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 512551f27600adac875de3381533b52d78f6b22d
-Author: Qunxin Liu <48925186+qxliu76@users.noreply.github.com>
-Date:   Mon Sep 23 17:28:16 2019 -0700
+commit f4cd99f28eefe695b86876736166fd119e22e04e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 22 14:45:57 2020 -0700
 
-    memory leak fix in serializer (#1988)
+    Reordering fails when GDEF table is absent #2140
+    
+    Preserve glyph class if there's no GDEF and no guess.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2140
 
- src/hb-serialize.hh | 1 +
+ src/hb-ot-layout-gsubgpos.hh | 41 ++++++++++++++++++++++-------------------
+ src/hb-ot-layout.hh          |  8 ++++----
+ 2 files changed, 26 insertions(+), 23 deletions(-)
+
+commit 05be05eb65ed2a5d5d88df55f9e36d005408d66c
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Wed Apr 22 13:34:51 2020 +0300
+
+    [kern] Test format 3.
+
+ test/shaping/data/in-house/tests/macos.tests | 1 +
  1 file changed, 1 insertion(+)
 
-commit f0a7677993e51ba4076a0f9a0e7d032d99917d34
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Sep 23 21:09:39 2019 +0330
+commit c7afb6d7b83da9f7503a033d289d4bba6af2ae39
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Apr 22 15:18:40 2020 +0200
 
-    [gpos] minor
+    [docs] Fix broken link
 
- src/hb-ot-layout-gpos-table.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/hb-ot-layout.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 035ec3d1b46b8e60bea3aa8dcf29cf47a5a42d57
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Sep 23 20:51:43 2019 +0330
+commit bd8aa1b043a6fb9e1d5dce735715ae9530d9ff20
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 21 22:19:46 2020 -0700
 
-    [cmap] remove has_format14, minor format
-    
-    fixes #1986
+    Minor
 
- src/hb-ot-cmap-table.hh | 9 ++++-----
- 1 file changed, 4 insertions(+), 5 deletions(-)
+ src/hb-null.hh   | 4 ++--
+ src/hb-shaper.hh | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
 
-commit c1a585fab0c17fe47b0728cf67920791c2173019
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 21 23:30:52 2019 +0430
+commit b22f61d86a27e1dcbcab5ecdbbff579175dc5aaf
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Tue Apr 21 11:49:05 2020 -0400
 
-    [gpos] minor
+    Fix bug
 
- src/hb-ot-layout-gpos-table.hh | 22 +++++++---------------
- 1 file changed, 7 insertions(+), 15 deletions(-)
+ src/hb-ot-color-cbdt-table.hh                            |   7 ++++++-
+ ...-testcase-minimized-hb-subset-fuzzer-5684014636859392 | Bin 0 -> 7148 bytes
+ 2 files changed, 6 insertions(+), 1 deletion(-)
 
-commit d87d38998a4ff7bec3d8fb658dc9299f144a2fcb
+commit 1cd14b40e794721d594553614cf4ece11410a934
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 21 17:27:39 2019 +0430
+Date:   Tue Apr 21 14:42:17 2020 +0430
 
-    Fix clang -Wrange-loop-analysis complains
-    
-    ./hb-ot-layout-gpos-table.hh:674:43: error: loop variable '_' is always a copy because the range of type 'hb_zip_iter_t<hb_iter_type<hb_array_t<const OT::IntType<unsigned short, 2> > &>, hb_iter_type<hb_array_t<const OT::IntType<unsigned short, 2> > &> >' (aka 'hb_zip_iter_t<hb_array_t<const OT::IntType<unsigned short, 2> >, hb_array_t<const OT::IntType<unsigned short, 2> > >') does not return a reference [-Werror,-Wrange-loop-analysis]
-          for (const hb_pair_t<Value, Value>& _ : hb_zip (val_iter, first_val_iter))
-                                              ^
-    ./hb-ot-layout-gpos-table.hh:674:12: note: use non-reference type 'hb_pair_t<OT::Value, OT::Value>' (aka 'hb_pair_t<IntType<unsigned short, 2>, IntType<unsigned short, 2> >')
-          for (const hb_pair_t<Value, Value>& _ : hb_zip (val_iter, first_val_iter))
-    
-    and
-    
-    In file included from hb-subset.cc:44:
-    ./hb-ot-vorg-table.hh:87:34: error: loop variable '_' is always a copy because the range of type 'hb_map_iter_t<hb_filter_iter_t<hb_sorted_array_t<const OT::VertOriginMetric>, const hb_set_t *, OT::HBGlyphID OT::VertOriginMetric::*, nullptr>, (lambda at ./hb-ot-vorg-table.hh:100:15), hb_function_sortedness_t::NOT_SORTED, nullptr>' does not return a reference [-Werror,-Wrange-loop-analysis]
-        for (const VertOriginMetric& _ : it)
-                                     ^
-    ./hb-ot-vorg-table.hh:113:17: note: in instantiation of function template specialization 'OT::VORG::serialize<hb_map_iter_t<hb_filter_iter_t<hb_sorted_array_t<const OT::VertOriginMetric>, const hb_set_t *, OT::HBGlyphID OT::VertOriginMetric::*, nullptr>, (lambda at ./hb-ot-vorg-table.hh:100:15), hb_function_sortedness_t::NOT_SORTED, nullptr>, nullptr>' requested here
-        vorg_prime->serialize (c->serializer, it, defaultVertOriginY);
-                    ^
-    ./hb-ot-vorg-table.hh:87:10: note: use non-reference type 'OT::VertOriginMetric'
-        for (const VertOriginMetric& _ : it)
-             ^~~~~~~~~~~~~~~~~~~~~~~~~~~
+    minor, update ragel generated hb-number-parser.hh
 
- src/hb-ot-layout-gpos-table.hh | 2 +-
- src/hb-ot-vorg-table.hh        | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
+ src/hb-number-parser.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
 
-commit 6e42a418c8fe4231c3cc080bc771455578b0cce0
+commit 6d5e8e5ee49aac1f51a35f67335ee2f633470d76
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 21 16:25:54 2019 +0430
+Date:   Tue Apr 21 14:38:09 2020 +0430
 
-    Minor, turn more of hb_apply to for each
+    minor
+    
+    following to c37100e7d
 
- src/hb-ot-glyf-table.hh        |  5 ++---
- src/hb-ot-layout-gpos-table.hh | 42 ++++++++++++++----------------------------
- src/hb-ot-name-table.hh        |  5 ++---
- src/hb-ot-vorg-table.hh        |  5 ++---
- 4 files changed, 20 insertions(+), 37 deletions(-)
+ src/hb-number-parser.rl | 2 --
+ 1 file changed, 2 deletions(-)
 
-commit 0665dce1163317390adbed9394cce2b1325ddb6c
+commit 5b91c52083aee1653c0cf1e778923de00c08fa5d
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 21 17:22:02 2019 +0430
+Date:   Mon Apr 20 21:44:01 2020 +0000
 
-    [fuzzer] Don't process output in debug mode as it causes timeout
+    [ci] run experimental APIs tests
 
- test/fuzzing/run-shape-fuzzer-tests.py  | 7 ++++++-
- test/fuzzing/run-subset-fuzzer-tests.py | 7 ++++++-
- 2 files changed, 12 insertions(+), 2 deletions(-)
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit dc886f6638f50e45e73d01e49db77b4bcefc85e1
+commit 750bb73e32f967ce40e29751338e6a64042b5674
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 14 11:18:47 2019 +0430
+Date:   Tue Apr 21 01:13:13 2020 +0430
 
-    [ci] Re-enable debug builds on fedora bot
+    [meson] Add an experimental-api option
 
- .circleci/config.yml | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ .circleci/config.yml    |  4 ++--
+ meson.build             |  4 ++++
+ meson_options.txt       |  2 ++
+ src/gen-def.py          |  2 +-
+ src/main.cc             | 12 ++++++------
+ src/meson.build         |  8 +++++++-
+ test/subset/meson.build | 23 ++++++++++++++---------
+ 7 files changed, 36 insertions(+), 19 deletions(-)
 
-commit 70228f68ac413ee19281861e3039a82d90c17f2a
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 21 16:24:41 2019 +0430
+commit 262eced2adae740de7dd7bcbb4359e892471536b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 20 12:17:28 2020 -0700
 
-    [ci] Enable HB_WITH_WIN1256 on -Weverything bot
+    [subset] FeatureVariations subsetting is wrong
     
-    To catch its compile warnings, #1969 related
+    Never drop FeatureVariationRecord for now.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2334
 
- .circleci/config.yml | 2 +-
+ src/hb-ot-layout-common.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 2a549aadd334b43d37444fed37fdbf8ec673ec14
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 21 00:32:34 2020 +0430
+
+    minor
+
+ util/options.cc | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 385741d565de1cc90de23664f8e66fc77c31efae
+commit 2be859d289a9e04199a29bd4b8d393a502ed4791
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 21 15:26:14 2019 +0430
+Date:   Mon Apr 20 23:48:23 2020 +0430
 
-    [cmap] Turn hb_apply into foreach where possible
+    minor, replace nullptr checks with implicit ones
 
- src/hb-ot-cmap-table.hh | 151 +++++++++++++++++++-----------------------------
- 1 file changed, 61 insertions(+), 90 deletions(-)
+ src/hb-blob.cc                  | 12 ++++++------
+ src/hb-cff-interp-common.hh     |  6 +++---
+ src/hb-cff-interp-cs-common.hh  |  4 ++--
+ src/hb-cff2-interp-cs.hh        |  2 +-
+ src/hb-directwrite.cc           |  2 +-
+ src/hb-ot-cff-common.hh         | 18 ++++++++----------
+ src/hb-ot-cff1-table.hh         | 26 +++++++++++++-------------
+ src/hb-ot-cff2-table.hh         |  6 +++---
+ src/hb-ot-layout.cc             |  2 +-
+ src/hb-ot-os2-unicode-ranges.hh |  3 +--
+ src/hb-subset-cff-common.cc     |  6 +++---
+ src/hb-subset-cff-common.hh     | 22 +++++++++++-----------
+ src/hb-subset-cff1.cc           | 28 ++++++++++++++--------------
+ src/hb-subset-cff2.cc           | 17 ++++++++---------
+ src/main.cc                     |  4 ++--
+ src/test-buffer-serialize.cc    |  2 +-
+ util/hb-subset.cc               |  4 ++--
+ util/options.cc                 | 10 ++++++----
+ 18 files changed, 86 insertions(+), 88 deletions(-)
 
-commit 1023c2cc6de0f33602df8709134bef8cdb66ba0c
+commit 0181f03019ec13031c179727eb2a38c478c05f5c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 21 14:33:43 2019 +0430
+Date:   Mon Apr 20 17:07:09 2020 +0430
 
-    [cmap] minor
+    [test] Workaround Windows pipe issue by storing ttx in a file
 
src/hb-ot-cmap-table.hh | 62 ++++++++++++++++++-------------------------------
- 1 file changed, 22 insertions(+), 40 deletions(-)
test/subset/run-tests.py | 40 +++++++++++++++++++++++++++++-----------
+ 1 file changed, 29 insertions(+), 11 deletions(-)
 
-commit ead46eefe3bf2bea61c86689f4c5a1da9b7e446b
+commit 4cfb6cb9649fa58b606154e52bf7bb05d23f3f5b
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 21 14:25:11 2019 +0430
+Date:   Mon Apr 20 16:40:25 2020 +0430
 
-    minor, use internal API instead public hb_set_has
+    [ci] Switch msys2 bot to meson
 
- src/hb-ot-cmap-table.hh | 4 ++--
- src/hb-subset-plan.cc   | 2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
+ appveyor.yml | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
 
-commit d8af4e7701fe63d63f6669706ce7a5bb3a15a19d
+commit 2dda6dd744b192616c65ca4aa5fce8e90fd0ff30
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 21 14:19:14 2019 +0430
+Date:   Mon Apr 20 14:12:45 2020 +0430
 
-    [cmap] minor, turn 8 spaces to tab
+    minor, tweak spacing
+    
+    turn 8 spaces to tab, add space before Null/Crap
 
- src/hb-ot-cmap-table.hh | 228 ++++++++++++++++++++++++------------------------
- src/hb-subset-plan.cc   |   6 +-
- 2 files changed, 117 insertions(+), 117 deletions(-)
+ src/hb-aat-layout-ankr-table.hh            |   2 +-
+ src/hb-aat-layout-common.hh                |   6 +-
+ src/hb-aat-layout-morx-table.hh            |   6 +-
+ src/hb-aat-layout.cc                       |   2 +-
+ src/hb-aat-map.cc                          |  10 +--
+ src/hb-aat-map.hh                          |   4 +-
+ src/hb-blob.cc                             |   2 +-
+ src/hb-buffer.cc                           |   2 +-
+ src/hb-buffer.h                            |   2 +-
+ src/hb-buffer.hh                           |   4 +-
+ src/hb-cff-interp-common.hh                |   6 +-
+ src/hb-cff-interp-cs-common.hh             |   2 +-
+ src/hb-cff2-interp-cs.hh                   |   2 +-
+ src/hb-draw.hh                             |   2 +-
+ src/hb-face.cc                             |   2 +-
+ src/hb-font.cc                             |   2 +-
+ src/hb-font.hh                             |   2 +-
+ src/hb-machinery.hh                        |   2 +-
+ src/hb-map.cc                              |   2 +-
+ src/hb-map.hh                              |   4 +-
+ src/hb-null.hh                             |   8 +-
+ src/hb-open-file.hh                        |   4 +-
+ src/hb-ot-cff-common.hh                    |   4 +-
+ src/hb-ot-cff1-table.hh                    | 107 ++++++++++++------------
+ src/hb-ot-cff2-table.hh                    |  18 ++---
+ src/hb-ot-cmap-table.hh                    |  34 ++++----
+ src/hb-ot-color-cpal-table.hh              |   2 +-
+ src/hb-ot-glyf-table.hh                    |   4 +-
+ src/hb-ot-hmtx-table.hh                    |   2 +-
+ src/hb-ot-layout-common.hh                 | 126 ++++++++++++++---------------
+ src/hb-ot-layout-gdef-table.hh             |  10 +--
+ src/hb-ot-layout-gpos-table.hh             |  26 +++---
+ src/hb-ot-layout-gsubgpos.hh               |  70 ++++++++--------
+ src/hb-ot-layout.cc                        |  18 ++---
+ src/hb-ot-name-table.hh                    |   2 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh |   4 +-
+ src/hb-ot-shape-complex-arabic.cc          |   2 +-
+ src/hb-ot-var-hvar-table.hh                |   4 +-
+ src/hb-set.cc                              |  62 +++++++-------
+ src/hb-set.hh                              |  24 +++---
+ src/hb-shape-plan.cc                       |   2 +-
+ src/hb-subset-cff-common.hh                |   2 +-
+ src/hb-subset-cff1.cc                      |  12 +--
+ src/hb-subset-cff2.cc                      |   6 +-
+ src/hb-subset.hh                           |   2 +-
+ src/hb-unicode.cc                          |   2 +-
+ src/hb-vector.hh                           |   6 +-
+ src/test-iter.cc                           |   2 +-
+ 48 files changed, 316 insertions(+), 315 deletions(-)
 
-commit 4315666283a7d1b175d1c3ed43b5ac85fdc84a50
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Thu Aug 29 11:17:20 2019 -0700
+commit ac26f19c9ea1ff170cd5226470115f7d08860e02
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Apr 19 22:25:14 2020 +0430
 
-    [subset] updates according to review comments
+    Refactor test/api/meson.build and always run test-unicode test
 
src/hb-ot-cmap-table.hh | 95 ++++++++++++++++++++++++-------------------------
- 1 file changed, 47 insertions(+), 48 deletions(-)
test/api/meson.build | 39 ++++++++++-----------------------------
+ 1 file changed, 10 insertions(+), 29 deletions(-)
 
-commit bf66d1bf589b6af2ceb30c18619f210b718c9db9
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Wed Aug 21 14:24:33 2019 -0700
+commit 0133cb55e2d76c81ccfeef3baf4c46e31297665c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Apr 19 22:42:57 2020 +0430
 
-    [subset] Add integration tests for cmap14
+    Minor, use hb_sorted_array::bsearch where possible
 
- test/subset/data/Makefile.am                       |   1 +
- test/subset/data/Makefile.sources                  |   1 +
- .../cmap14/cmap14_font1.default.4E00,4E02,4E03.otf | Bin 0 -> 1360 bytes
- .../cmap14/cmap14_font1.default.4E00,4E03.otf      | Bin 0 -> 1236 bytes
- .../cmap14/cmap14_font1.default.4E00,4E05,4E07.otf | Bin 0 -> 1328 bytes
- .../cmap14/cmap14_font1.default.4E02,4E03,4E08.otf | Bin 0 -> 1576 bytes
- .../expected/cmap14/cmap14_font1.default.4E02.otf  | Bin 0 -> 996 bytes
- .../expected/cmap14/cmap14_font1.default.4E03.otf  | Bin 0 -> 1080 bytes
- .../cmap14_font1.default.4E05,4E07,4E08,4E09.otf   | Bin 0 -> 1848 bytes
- .../cmap14/cmap14_font1.default.4E08,4E09.otf      | Bin 0 -> 1720 bytes
- .../expected/cmap14/cmap14_font1.default.4E08.otf  | Bin 0 -> 1384 bytes
- .../cmap14_font1.default.retain-all-codepoint.otf  | Bin 0 -> 2348 bytes
- ...font1.drop-hints-retain-gids.4E00,4E02,4E03.otf | Bin 0 -> 1388 bytes
- ...ap14_font1.drop-hints-retain-gids.4E00,4E03.otf | Bin 0 -> 1272 bytes
- ...font1.drop-hints-retain-gids.4E00,4E05,4E07.otf | Bin 0 -> 1396 bytes
- ...font1.drop-hints-retain-gids.4E02,4E03,4E08.otf | Bin 0 -> 1720 bytes
- .../cmap14_font1.drop-hints-retain-gids.4E02.otf   | Bin 0 -> 1028 bytes
- .../cmap14_font1.drop-hints-retain-gids.4E03.otf   | Bin 0 -> 1124 bytes
- ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf | Bin 0 -> 1984 bytes
- ...ap14_font1.drop-hints-retain-gids.4E08,4E09.otf | Bin 0 -> 1872 bytes
- .../cmap14_font1.drop-hints-retain-gids.4E08.otf   | Bin 0 -> 1544 bytes
- ...drop-hints-retain-gids.retain-all-codepoint.otf | Bin 0 -> 2436 bytes
- .../cmap14_font1.drop-hints.4E00,4E02,4E03.otf     | Bin 0 -> 1292 bytes
- .../cmap14/cmap14_font1.drop-hints.4E00,4E03.otf   | Bin 0 -> 1168 bytes
- .../cmap14_font1.drop-hints.4E00,4E05,4E07.otf     | Bin 0 -> 1260 bytes
- .../cmap14_font1.drop-hints.4E02,4E03,4E08.otf     | Bin 0 -> 1512 bytes
- .../cmap14/cmap14_font1.drop-hints.4E02.otf        | Bin 0 -> 928 bytes
- .../cmap14/cmap14_font1.drop-hints.4E03.otf        | Bin 0 -> 1012 bytes
- ...cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.otf | Bin 0 -> 1780 bytes
- .../cmap14/cmap14_font1.drop-hints.4E08,4E09.otf   | Bin 0 -> 1652 bytes
- .../cmap14/cmap14_font1.drop-hints.4E08.otf        | Bin 0 -> 1316 bytes
- ...map14_font1.drop-hints.retain-all-codepoint.otf | Bin 0 -> 2280 bytes
- .../cmap14_font1.name-ids.4E00,4E02,4E03.otf       | Bin 0 -> 1292 bytes
- .../cmap14/cmap14_font1.name-ids.4E00,4E03.otf     | Bin 0 -> 1168 bytes
- .../cmap14_font1.name-ids.4E00,4E05,4E07.otf       | Bin 0 -> 1260 bytes
- .../cmap14_font1.name-ids.4E02,4E03,4E08.otf       | Bin 0 -> 1508 bytes
- .../expected/cmap14/cmap14_font1.name-ids.4E02.otf | Bin 0 -> 928 bytes
- .../expected/cmap14/cmap14_font1.name-ids.4E03.otf | Bin 0 -> 1012 bytes
- .../cmap14_font1.name-ids.4E05,4E07,4E08,4E09.otf  | Bin 0 -> 1780 bytes
- .../cmap14/cmap14_font1.name-ids.4E08,4E09.otf     | Bin 0 -> 1652 bytes
- .../expected/cmap14/cmap14_font1.name-ids.4E08.otf | Bin 0 -> 1316 bytes
- .../cmap14_font1.name-ids.retain-all-codepoint.otf | Bin 0 -> 2280 bytes
- .../cmap14_font1.retain-gids.4E00,4E02,4E03.otf    | Bin 0 -> 1452 bytes
- .../cmap14/cmap14_font1.retain-gids.4E00,4E03.otf  | Bin 0 -> 1340 bytes
- .../cmap14_font1.retain-gids.4E00,4E05,4E07.otf    | Bin 0 -> 1464 bytes
- .../cmap14_font1.retain-gids.4E02,4E03,4E08.otf    | Bin 0 -> 1788 bytes
- .../cmap14/cmap14_font1.retain-gids.4E02.otf       | Bin 0 -> 1096 bytes
- .../cmap14/cmap14_font1.retain-gids.4E03.otf       | Bin 0 -> 1192 bytes
- ...map14_font1.retain-gids.4E05,4E07,4E08,4E09.otf | Bin 0 -> 2048 bytes
- .../cmap14/cmap14_font1.retain-gids.4E08,4E09.otf  | Bin 0 -> 1940 bytes
- .../cmap14/cmap14_font1.retain-gids.4E08.otf       | Bin 0 -> 1608 bytes
- ...ap14_font1.retain-gids.retain-all-codepoint.otf | Bin 0 -> 2500 bytes
- test/subset/data/fonts/cmap14_font1.otf            | Bin 0 -> 4484 bytes
- test/subset/data/tests/cmap14.tests                |  21 +++++++++++++++++++++
- 54 files changed, 23 insertions(+)
+ src/hb-aat-layout.cc            | 2 +-
+ src/hb-ot-cff1-table.cc         | 4 ++--
+ src/hb-ot-os2-unicode-ranges.hh | 7 +++----
+ 3 files changed, 6 insertions(+), 7 deletions(-)
 
-commit 2583afa0eb90134274ddd92864ea5270eeebc52e
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Fri Aug 16 13:54:24 2019 -0700
+commit 1ed30515cb6308f1cf651cd502012ee5c8bd24ef
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sun Apr 19 15:38:52 2020 +0100
 
-    [subset] subsetting cmap14
+    [Docs, usernmanual] Fix with-icu=builtin explanation
 
src/hb-ot-cmap-table.hh | 295 +++++++++++++++++++++++++++++++++++++++++++-----
- 1 file changed, 265 insertions(+), 30 deletions(-)
docs/usermanual-integration.xml | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
 
-commit 078ddbd0f6ad660e740809b7f4c067e02309b98d
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Wed Aug 7 13:17:26 2019 -0700
+commit d6edd9a4083f523b6290ba29c1fcbb5a6b7f96bb
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sun Apr 19 15:26:28 2020 +0100
 
-    [subset] glyph closure for CMAP14
+    [Docs, usermanual] Reword hb_ft_font_create_referenced explanation
 
- src/hb-ot-cmap-table.hh | 34 +++++++++++++++++++++++++++++++++-
- src/hb-subset-plan.cc   | 10 ++++++++++
- 2 files changed, 43 insertions(+), 1 deletion(-)
+ docs/usermanual-integration.xml | 29 +++++++++++++++++++----------
+ 1 file changed, 19 insertions(+), 10 deletions(-)
 
-commit bbe878006d347893fc70e282c2aaafef5dd622b4
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 18 22:22:01 2019 +0430
+commit fb3acdbcb645f30671db0776577652d7545d21ed
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Sun Apr 19 14:57:04 2020 +0200
 
-    Avoid bitwise negate of enum value
+    meson: only install gobject/icu headers if the features are enabled
+
+ src/meson.build | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit ad5dcda0b5a7fe3acb09615c0ba020927cca5cee
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Sun Apr 19 14:53:05 2020 +0200
+
+    meson: install hb-icu.h header
+
+ src/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2cc85281c2cc4169b972e9c5d951ddfcded6ddde
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 18 16:29:32 2020 -0700
+
+    [serializer] Make snapshot()/revert() revert current object links
     
-    Fixes this -fno-sanitize-recover=undefined fail,
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2325
+
+ src/hb-serialize.hh | 38 +++++++++++++++++++++++++-------------
+ 1 file changed, 25 insertions(+), 13 deletions(-)
+
+commit 6f6e78a26ecdd874403b7fe397e335f386ac02e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 18 16:12:18 2020 -0700
+
+    Fix float-to-double warnings
     
-    hb-ot-map.hh:188:1: runtime error: load of value 4294967294, which is not a valid value for type 'hb_ot_map_feature_flags_t'
-        #0 0x7f62bfa9b227 in operator&=(hb_ot_map_feature_flags_t&, hb_ot_map_feature_flags_t) /home/ebrahim/Desktop/harfbuzz/src/./hb-ot-map.hh:188:1
-        #1 0x7f62bfa9b227 in hb_ot_map_builder_t::compile(hb_ot_map_t&, hb_ot_shape_plan_key_t const&) /home/ebrahim/Desktop/harfbuzz/src/hb-ot-map.cc:194
-        #2 0x7f62bface650 in hb_ot_shape_planner_t::compile(hb_ot_shape_plan_t&, hb_ot_shape_plan_key_t const&) /home/ebrahim/Desktop/harfbuzz/src/hb-ot-shape.cc:108:7
-        #3 0x7f62bfacec1e in hb_ot_shape_plan_t::init0(hb_face_t*, hb_shape_plan_key_t const*) /home/ebrahim/Desktop/harfbuzz/src/hb-ot-shape.cc:225:11
-        #4 0x7f62bfae1318 in hb_shape_plan_create2 /home/ebrahim/Desktop/harfbuzz/src/hb-shape-plan.cc:232:7
-        #5 0x7f62bfae1d2a in hb_shape_plan_create_cached2 /home/ebrahim/Desktop/harfbuzz/src/hb-shape-plan.cc:489:33
-        #6 0x7f62bfae2527 in hb_shape_full /home/ebrahim/Desktop/harfbuzz/src/hb-shape.cc:135:33
-        #7 0x55ed360b6588 in shape_options_t::shape(hb_font_t*, hb_buffer_t*, char const**) /home/ebrahim/Desktop/harfbuzz/util/./options.hh:242:10
-        #8 0x55ed360b5d9c in shape_consumer_t<output_buffer_t>::consume_line(char const*, unsigned int, char const*, char const*) /home/ebrahim/Desktop/harfbuzz/util/./shape-consumer.hh:67:19
-        #9 0x55ed360b549f in main_font_text_t<shape_consumer_t<output_buffer_t>, 2147483647, 0>::main(int, char**) /home/ebrahim/Desktop/harfbuzz/util/./main-font-text.hh:81:16
-        #10 0x55ed360b4e23 in main /home/ebrahim/Desktop/harfbuzz/util/hb-shape.cc:189:17
-        #11 0x7f62bf104ee2 in __libc_start_main (/usr/lib/libc.so.6+0x26ee2)
-        #12 0x55ed3608f7ad in _start (/home/ebrahim/Desktop/harfbuzz/util/.libs/lt-hb-shape+0xd7ad)
+    ./hb-ot-glyf-table.hh:978:37: warning: implicit conversion increases floating-point precision: 'float' to 'double' [-Wdouble-promotion]
 
- src/hb-ot-map.cc | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ src/hb-ot-glyf-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit e6909ee58d0f7b954f3bb227c2f90ca4cfd0c858
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 18 22:12:25 2019 +0430
+commit c37100e7d9a1bcce35c9db651f404a1a87c8a1a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Apr 18 16:02:55 2020 -0700
 
-    minor
+    Clean up math.h and float.h includes
 
- src/hb-buffer.cc | 2 +-
- src/hb-common.cc | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
+ src/hb-cff-interp-dict-common.hh | 2 --
+ src/hb-number-parser.hh          | 2 --
+ src/hb-ot-glyf-table.hh          | 2 --
+ src/hb.hh                        | 1 +
+ 4 files changed, 1 insertion(+), 6 deletions(-)
 
-commit bb41b74fd1fb42b08e9069c22ee046daeee98e6b
+commit c6b3f73b098225728d36448e15499473ff9419b8
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 18 00:55:24 2019 +0430
+Date:   Sun Apr 19 00:54:24 2020 +0430
 
-    Don't rely on undefined left shift of negative value behavior
+    [meson] Make harfbuzz-icu separate module optout-able
+
+ meson.build          |  3 +++
+ meson_options.txt    |  2 ++
+ src/meson.build      | 13 ++++++++++---
+ test/api/meson.build |  2 +-
+ 4 files changed, 16 insertions(+), 4 deletions(-)
+
+commit 8ae06c9489f132844cbede80b5fe8241ce47fc0e
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Sat Apr 18 20:22:45 2020 +0200
+
+    meson: build a separate library for harfbuzz-icu
     
-    Fixes this -fno-sanitize-recover=undefined check,
+    This adds a seperate library like with autotools.
     
-    hb-ft.cc:869:27: runtime error: left shift of negative value -16384
-        #0 0x7ff8f47da843 in hb_ft_font_set_funcs /home/ebrahim/Desktop/harfbuzz/src/hb-ft.cc:869:27
-        #1 0x55f20a66c7d6 in font_options_t::get_font() const /home/ebrahim/Desktop/harfbuzz/util/options.cc:731:3
-        #2 0x55f20a668c1f in shape_consumer_t<output_buffer_t>::init(hb_buffer_t*, font_options_t const*) /home/ebrahim/Desktop/harfbuzz/util/./shape-consumer.hh:47:42
-        #3 0x55f20a668441 in main_font_text_t<shape_consumer_t<output_buffer_t>, 2147483647, 0>::main(int, char**) /home/ebrahim/Desktop/harfbuzz/util/./main-font-text.hh:75:14
-        #4 0x55f20a667f91 in main /home/ebrahim/Desktop/harfbuzz/util/hb-shape.cc:180:21
-        #5 0x7ff8f3df7ee2 in __libc_start_main (/usr/lib/libc.so.6+0x26ee2)
-        #6 0x55f20a6427ad in _start (/home/ebrahim/Desktop/harfbuzz/util/.libs/lt-hb-shape+0xd7ad)
+    This also fixes the ico feature option which was just set to required:false
+    when disabled instead of really disabling it.
+    Disabling is still broken with msvc because it then tries to find the library
+    another way, but that's broken for all other deps as well so I left it as is.
+    
+    For tests only test-unicode.c is using icu specific functions so split it out
+    into its own category which depends on harfbuzz-icu.
+    
+    Fixes #2338
 
- src/hb-ft.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ meson.build          |  7 +++++--
+ src/meson.build      | 33 +++++++++++++++++++++++++++------
+ test/api/meson.build | 16 +++++++++++++++-
+ 3 files changed, 47 insertions(+), 9 deletions(-)
 
-commit b73313ade75130bf86ad1efbd312ce4106166089
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 18 00:50:32 2019 +0430
+commit 2354a90008043b0679e46c09165a9e53e47d39ab
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Sat Apr 18 20:28:25 2020 +0200
 
-    Don't seek of out-of-bound value even if the result is not used
+    tests: fix subset/run-tests.py under Windows
     
-    Fixes this -fno-sanitize-recover=undefined fail,
-    
-    /set/iter: hb-algs.hh:1016:60: runtime error: index 4294967295 out of bounds for type 'unsigned long long const[8]'
-        #0 0x4d1e09 in hb_vector_size_t<unsigned long long, 64u>::operator[](unsigned int) const /home/user/code/harfbuzz/src/./hb-algs.hh:1016:60
-        #1 0x4d8b5f in hb_set_t::page_t::previous(unsigned int*) const /home/user/code/harfbuzz/src/./hb-set.hh:139:53
-        #2 0x4d0ada in hb_set_t::previous(unsigned int*) const /home/user/code/harfbuzz/src/./hb-set.hh:602:36
-        #3 0x4cd76f in hb_set_previous /home/user/code/harfbuzz/src/hb-set.cc:494:15
-        #4 0x4ca8af in test_set_iter /home/user/code/harfbuzz/test/api/test-set.c:310:3
-        #5 0x7f3a4f3e0f49  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72f49)
-        #6 0x7f3a4f3e0e7a  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72e7a)
-        #7 0x7f3a4f3e1121 in g_test_run_suite (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73121)
-        #8 0x7f3a4f3e1140 in g_test_run (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73140)
-        #9 0x4c8894 in hb_test_run /home/user/code/harfbuzz/test/api/./hb-test.h:88:10
-        #10 0x4c8894 in main /home/user/code/harfbuzz/test/api/test-set.c:408:10
-        #11 0x7f3a4e3d2b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
-        #12 0x41e7d9 in _start (/home/user/code/harfbuzz/test/api/test-set+0x41e7d9)
+    It assumed that stdout of a subprocess in binary mode was using
+    utf-8 which isn't the case. Instead open stdout of the subprocess
+    in text mode and let Python handle the decoding.
 
src/hb-set.hh | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
test/subset/run-tests.py | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
-commit d8af9ee017ed1018343d30272f55b90dd03a3559
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 18 00:47:55 2019 +0430
+commit c1228990b9693226d8d14740414e4e93597f4a0f
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Sat Apr 18 15:29:56 2020 +0200
 
-    Don't rely on nullptr deref recovery
+    autotools: Add fix_get_types.py to EXTRA_DIST
     
-    Fixes this -fno-sanitize-recover=undefined fail,
+    So it ends up in the release tarball and can be used in the meson build.
     
-    /types/language: hb-common.cc:385:20: runtime error: member access within null pointer of type 'const struct hb_language_impl_t'
-        #0 0x4caa34 in hb_language_to_string /home/user/code/harfbuzz/src/hb-common.cc:385:20
-        #1 0x4c9be8 in test_types_language /home/user/code/harfbuzz/test/api/test-common.c:205:3
-        #2 0x7f9557e72f49  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72f49)
-        #3 0x7f9557e72e7a  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72e7a)
-        #4 0x7f9557e73121 in g_test_run_suite (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73121)
-        #5 0x7f9557e73140 in g_test_run (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73140)
-        #6 0x4c88a3 in hb_test_run /home/user/code/harfbuzz/test/api/./hb-test.h:88:10
-        #7 0x4c88a3 in main /home/user/code/harfbuzz/test/api/test-common.c:224:10
-        #8 0x7f9556e64b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
-        #9 0x41e7d9 in _start (/home/user/code/harfbuzz/test/api/test-common+0x41e7d9)
+    Fixes #2337
 
- src/hb-common.cc | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit bfb155a5f19b26f9dcff667a76a24cd5c3b83234
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 18 00:44:52 2019 +0430
+commit dced2fbee97a4f8af9572076306d3b2e6476640e
+Author: Christoph Reiter <reiter.christoph@gmail.com>
+Date:   Sat Apr 18 14:37:03 2020 +0200
 
-    Don't call memset when length is zero
+    meson: complete introspection build config
     
-    Fixes this -fno-sanitize-recover=undefined check,
+    Pass the same config to gobject-introspection as with cmake/autotools.
     
-    /buffer/positions/empty: hb-buffer.cc:327:11: runtime error: null pointer passed as argument 1, which is declared to never be null
+    This makes sure the c-include and package name is included in the gir
+    and also fixes the build because of the missing HB_AAT_H* defines.
     
-    /usr/include/string.h:60:62: note: nonnull attribute specified here
-        #0 0x4cf31c in hb_buffer_t::clear_positions() /home/user/code/harfbuzz/src/hb-buffer.cc:327:3
-        #1 0x4d4dd4 in hb_buffer_get_glyph_positions /home/user/code/harfbuzz/src/hb-buffer.cc:1418:13
-        #2 0x4cb553 in test_buffer_positions /home/user/code/harfbuzz/test/api/test-buffer.c:305:3
-        #3 0x7f324187bf49  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72f49)
-        #4 0x7f324187be7a  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72e7a)
-        #5 0x7f324187be7a  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72e7a)
-        #6 0x7f324187c121 in g_test_run_suite (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73121)
-        #7 0x7f324187c140 in g_test_run (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73140)
-        #8 0x4c8bd3 in hb_test_run /home/user/code/harfbuzz/test/api/./hb-test.h:88:10
-        #9 0x4c8bd3 in main /home/user/code/harfbuzz/test/api/test-buffer.c:884:10
-        #10 0x7f324086db96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
-        #11 0x41e919 in _start (/home/user/code/harfbuzz/test/api/test-buffer+0x41e919)
+    Fixes #2336
 
- src/hb-buffer.cc | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ src/meson.build | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
 
-commit 5a1cc199ab7b619935af04584ecc650216a83d66
+commit 22f7c61acf8073cb8db8db47e92aef18864a85c6
+Author: ariza <ariza@adobe.com>
+Date:   Fri Apr 17 23:49:51 2020 -0700
+
+    implement SID to glyph ID mapping with predefined Charset
+    Also fixes oss-fuzz 21769
+
+ src/hb-ot-cff1-table.cc                            |  99 +++++++++++++++++++++
+ src/hb-ot-cff1-table.hh                            |  29 +++++-
+ test/api/test-ot-glyphname.c                       |  15 ++++
+ ...case-minimized-hb-shape-fuzzer-5769590820044800 | Bin 0 -> 87807 bytes
+ 4 files changed, 142 insertions(+), 1 deletion(-)
+
+commit f9bc373381ddf8553f943b774596ae5a53bf2641
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 18 00:43:44 2019 +0430
+Date:   Fri Apr 17 22:37:48 2020 +0430
 
-    [ci] Run -fno-sanitize-recover=undefined checks
+    2.6.5
 
- .circleci/config.yml | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ NEWS             | 13 +++++++++++++
+ configure.ac     |  2 +-
+ meson.build      |  2 +-
+ src/hb-ft.cc     |  4 ++--
+ src/hb-version.h |  4 ++--
+ 5 files changed, 19 insertions(+), 6 deletions(-)
 
-commit c930ae2bd8b6f626ddec0628ae6b38e3134e3c97
+commit a8455292f4fc44ffee5a4efae04cd94195696908
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Sep 16 14:04:34 2019 +0430
+Date:   Fri Apr 17 22:50:48 2020 +0430
 
-    Avoid stdint.h in Kernel module compiles
+    [layout] minor on doc
 
- src/hb-common.h | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-ot-layout.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 412d6cac3a46d710159ed4b3cc3bb59fd5876d5f
+commit fefaa8c835cf42f3ee5327a927aac62a10165019
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Sep 16 13:50:11 2019 +0430
+Date:   Fri Apr 17 22:28:09 2020 +0430
 
-    Extract an avoid errno compile flag
+    [test] define G_APPROX_VALUE and EPSILON only when used
+    
+    resolves -Weverything bot complain
 
- src/hb-blob.cc   | 1 -
- src/hb-config.hh | 1 +
- src/hb.hh        | 9 +++++++--
- 3 files changed, 8 insertions(+), 3 deletions(-)
+ test/api/test-var-coords.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
 
-commit 8a16d6f1c13388e6d9ca844a309632ec583ee1a2
+commit 29c903223b31c30ad609a23c75a98231674c3a73
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Sep 15 20:43:33 2019 +0430
+Date:   Fri Apr 17 22:11:40 2020 +0430
 
-    [doc] fix minor typo
+    Move hb_ot_layout_closure_{features,lookups} behind EXPERIMENTAL flag
 
- src/hb-ot-layout.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/gen-def.py                    |  4 +++-
+ src/hb-ot-layout.cc               |  2 ++
+ src/hb-ot-layout.h                |  2 ++
+ src/hb-subset-plan.cc             |  6 ++++++
+ test/api/test-ot-face.c           |  4 ++++
+ test/api/test-subset-gpos.c       |  4 ++++
+ test/subset/data/Makefile.sources | 13 ++++++++-----
+ test/subset/meson.build           | 18 +++++++++---------
+ 8 files changed, 38 insertions(+), 15 deletions(-)
 
-commit aab279b33dda45ae0e45c887f2fad6381b5138dc
+commit 9b7fb5c23fb7b333e0e81b8c82160aac4a21b27e
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 14 11:20:09 2019 +0430
+Date:   Fri Apr 17 20:12:24 2020 +0430
 
-    [ci] Install cmake on macOS cmake/amalgam tester
+    Move hb_font_get_var_coords_design behind HB_EXPERIMENTAL_API
 
- .circleci/config.yml | 2 +-
+ src/gen-def.py             | 3 ++-
+ src/hb-font.cc             | 4 +++-
+ src/hb-font.h              | 2 ++
+ test/api/test-var-coords.c | 2 ++
+ 4 files changed, 9 insertions(+), 2 deletions(-)
+
+commit 41c671e701e13bdd4a196030b74172fe1c6b7ccf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 17 08:37:25 2020 -0700
+
+    [build] Adjust check-symbols for -flto
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2328
+
+ src/check-symbols.sh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit f3214df6f63919ebe73c713b1e80bba1097a0cea
+commit e7d5fa4a5891a4fb4c4a5d8ba0a05540c4358a33
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Fri Apr 17 15:54:40 2020 +0100
+
+    [Usermanual, utilities] - correct DocBook tags
+    
+    Changes stray <program> DocBook tags on this page to <command>. No instances found in the other docs.
+
+ docs/usermanual-utilities.xml | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+commit 8f6d0f8401ffd011332981fd9ba6d38d18b6cf3b
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 14 10:56:00 2019 +0430
+Date:   Fri Apr 17 11:30:27 2020 +0430
 
-    [coretext] Fix double promotion warnings by making casts explicit
+    [os2] minor, fix font_page_t enum naming
+    
+    As https://github.com/harfbuzz/harfbuzz/pull/986#pullrequestreview-395052800
 
- src/hb-coretext.cc | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-ot-os2-table.hh | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
 
-commit cbbb6fa45519a8670870c784841d7b9e1ab71dd1
+commit 818f109bdec9659c05f9fd9a1de1db85ece65cbe
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 14 10:53:12 2019 +0430
+Date:   Thu Apr 16 21:25:32 2020 +0430
 
-    [ci] Don't build cmake tests in macOS bot
+    Use float in avar calculation instead ints and checking their overflows
 
- .circleci/config.yml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh              | 12 ------------
+ src/hb-ot-var-avar-table.hh |  9 ++-------
+ src/hb.hh                   |  4 ----
+ 3 files changed, 2 insertions(+), 23 deletions(-)
 
-commit 6e4736a3c5acc0eea1b16c79b95d1a3082baa320
+commit 9ffa50fe5dfeb7e999a178e031d7092121e0c146
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 14 10:38:52 2019 +0430
+Date:   Thu Apr 16 21:25:32 2020 +0430
 
-    [name] Undef entry_{index,score} to avoid collision in amalgam builds
+    Add an appropriate fallback to hb_int_mul_overflows
 
- src/hb-ot-name-table.hh | 3 +++
- 1 file changed, 3 insertions(+)
+ src/hb-algs.hh              | 15 ++++++++-------
+ src/hb-ot-var-avar-table.hh |  6 +++---
+ src/hb.hh                   |  4 ++++
+ 3 files changed, 15 insertions(+), 10 deletions(-)
 
-commit d512087e4dfb5d9483b78eaf8443b4fa8724b8e1
+commit 32f431406e602e977bde17e335a4ad086064494e
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 14 10:36:29 2019 +0430
+Date:   Thu Apr 16 22:07:07 2020 +0430
 
-    Rename GlyphID to HBGlyphID
+    [docs] minor
     
-    Avoid collision with macOS's ATSUnicodeTypes.h GlyphID
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2321
 
- 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              |  4 +-
- src/hb-ot-glyf-table.hh                    |  2 +-
- src/hb-ot-layout-base-table.hh             |  2 +-
- src/hb-ot-layout-common.hh                 | 22 ++++-----
- src/hb-ot-layout-gpos-table.hh             |  2 +-
- src/hb-ot-layout-gsub-table.hh             | 72 +++++++++++++++---------------
- 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 +-
- 18 files changed, 103 insertions(+), 103 deletions(-)
+ docs/usermanual-buffers-language-script-and-direction.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit bf08611044d83b6f5d6dec443f5216db259b4085
+commit a5e5a79004c5ebdef52ab282c7772ab0d9cf354b
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 14 10:35:08 2019 +0430
+Date:   Thu Apr 16 01:38:43 2020 +0430
 
-    [ci] Update and compile cmake/amalgam on macOS bot
+    [tests] Enable the just added macOS test for older version
+    
+    The test is added in 7035c9cd but the same font is available in older versions of macOS
+    so let's run it in older versions also.
+    
+    It doesn't matter much, more for consistency reasons.
 
- .circleci/config.yml | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
+ test/shaping/data/in-house/tests/macos.tests | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit 229ef1d29d5c7a370ebb10a1131c04719f34dc81
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Sep 10 10:31:07 2019 -0700
+commit 7035c9cdfe38dd6654bd9b71e3bb5cbf49e4014d
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Fri Apr 3 19:00:42 2020 +0100
 
-    Rename Fixed to HBFixed
+    Add test for #2290.
     
-    Fixes(!!) https://github.com/harfbuzz/harfbuzz/issues/1966
+    This tests that we can set two separate Type=Ligature selectors at the same time,
+    common=off + discretionary=on.
 
- src/hb-aat-fdsc-table.hh        |  4 ++--
- src/hb-aat-layout-just-table.hh | 20 ++++++++++----------
- src/hb-aat-layout-trak-table.hh |  8 ++++----
- src/hb-open-type.hh             |  4 ++--
- src/hb-ot-post-table.hh         |  2 +-
- src/hb-ot-stat-table.hh         | 14 +++++++-------
- src/hb-ot-var-fvar-table.hh     | 16 ++++++++--------
- 7 files changed, 34 insertions(+), 34 deletions(-)
+ test/shaping/data/in-house/tests/macos.tests | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 170b5dd856b1ba8f26e79863fe0c64a52eb68951
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Sep 8 16:34:11 2019 -0400
+commit 573b6bf82692c5fdd54d55a512405f7f75556362
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Mar 30 23:20:30 2020 +0100
 
-    [aat] Minor
+    Handle non-exclusive features when mapping OpenType tags to AAT feature type/selector pairs.
+    
+    Fixes #2290.
 
- src/hb-aat-layout-morx-table.hh | 14 +++++---------
- 1 file changed, 5 insertions(+), 9 deletions(-)
+ src/hb-aat-layout-feat-table.hh |  2 ++
+ src/hb-aat-layout-morx-table.hh |  6 ++++--
+ src/hb-aat-map.cc               | 15 ++++++++++++---
+ src/hb-aat-map.hh               | 13 +++++++++----
+ 4 files changed, 27 insertions(+), 9 deletions(-)
 
-commit a0695687eb03bcf80c4dec19917127cdd8d8797d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Sep 8 16:32:12 2019 -0400
+commit b57b9042420538f998cc0941407be8059b6e7562
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Wed Apr 15 18:46:31 2020 +0100
 
-    [aat] Minor
+    Add detail to hb_ft_font_create inline comments
+    
+    Providing lengthier explanation for how the destroy function works on the hb_font_t but that destroying the FT_Face (and not destroying it too early) remains the client's responsibility.
 
- src/hb-aat-layout-morx-table.hh | 2 --
- 1 file changed, 2 deletions(-)
+ src/hb-ft.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
 
-commit 4905a2198b4c47c12c6356f72ae0d2b178630d25
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Sep 9 12:36:12 2019 +0430
+commit 1bca2be256ce1c2c4d74efac2286db80dbfa5c48
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Wed Apr 15 18:30:47 2020 +0100
 
-    [number] Add static to hb-number-parser.hh functions
+    Rewrite hb_ft_font_set_funcs inline explanation
 
- src/hb-number-parser.hh | 4 ++--
- src/hb-number-parser.rl | 4 ++--
- 2 files changed, 4 insertions(+), 4 deletions(-)
+ src/hb-ft.cc | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
 
-commit 30e5cdfbf1ce2aadadf29ccfd0733355ced2d065
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Sep 9 00:28:16 2019 +0430
+commit 80c01d768734faafe5701414bd63c63cd243a404
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Wed Apr 15 18:08:55 2020 +0100
 
-    [number] Optimize _pow10 constants (#1963)
+    Update hb-ft.cc
 
- src/hb-number-parser.hh | 43 +++++++++++++++++++------------------------
- src/hb-number-parser.rl | 31 +++++++++++++------------------
- 2 files changed, 32 insertions(+), 42 deletions(-)
+ src/hb-ft.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
 
-commit 3f2cdf07a417f81aeeb1e296db493b6e02d76ba8
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Sep 8 15:08:02 2019 -0400
+commit 9457b60edc6f3c7b3b4ccf7460d4569c072bc98e
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 17:01:15 2020 +0100
 
-    Change HB_VAR_ARRAY to 1 again
-    
-    To fix MSVC bots, while I work on changing this to 0 permanently.
+    Update usermanual-integration.xml
 
- src/hb.hh | 2 +-
+ docs/usermanual-integration.xml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 05b7bdb4dd57d1bf233379e0f4ae5ec6451113d7
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 16:59:41 2020 +0100
+
+    Update usermanual-integration.xml
+
+ docs/usermanual-integration.xml | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 39cf8e21be2bf69717cf60a339b3ad26c6f7985b
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 7 15:27:30 2019 +0430
+commit f782d736cefa7808ef31712bcc6a51cfa2d02826
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 16:57:36 2020 +0100
 
-    [number] Add overflow checks used to be done in parse_bcd
-    
-    Which were removed in 1083df8
+    Update usermanual-integration.xml
 
- src/hb-number-parser.hh | 60 +++++++++++++++++++++++++++++++++----------------
- src/hb-number-parser.rl | 38 ++++++++++++++++++++++++-------
- 2 files changed, 71 insertions(+), 27 deletions(-)
+ docs/usermanual-integration.xml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 47d82713a144e06e00a486b3aa7d3934d62d68fd
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Sep 6 20:33:10 2019 +0430
+commit 17b60efc38fbc32953424fa9a21daf3738ff8935
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 16:51:58 2020 +0100
 
-    Replace strtod with a ragel implementation
+    Update docs/usermanual-integration.xml
     
-    Use a ragel based number parser when strtod_l couldn't be found
-    as libc's strtod may is locale sensetivity which we need to not.
+    Co-Authored-By: Khaled Hosny <dr.khaled.hosny@gmail.com>
 
- src/Makefile.sources    |   2 +
- src/hb-number-parser.hh | 223 ++++++++++++++++++++++++++++++++++++++++++++++++
- src/hb-number-parser.rl | 122 ++++++++++++++++++++++++++
- src/hb-number.cc        |   3 +-
- src/test-number.cc      |  30 +++++++
- 5 files changed, 379 insertions(+), 1 deletion(-)
+ docs/usermanual-integration.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 80613e5b9ee31125f4390012719e6f39970118d3
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Sep 7 14:25:54 2019 +0430
+commit 9b91669cb4e92281f155e4b1b1cef26ba562e786
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 16:40:15 2020 +0100
 
-    Minor, remove unused header
+    Update hb-ft.cc
 
- src/hb-common.cc | 3 ---
- 1 file changed, 3 deletions(-)
+ src/hb-ft.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 5902198cee9b9939ae310f459f9f18f5f1b07424
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Sep 6 21:36:31 2019 -0400
+commit 3a47921e88ad20873e08e19dff22205ecdf48f98
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 15:42:00 2020 +0100
 
-    [kerx] Fix offset issue in kern format 2
-    
-    Fixes tests with HB_VAR_ARRAY != 1, as done in previous commit.
+    Update usermanual-integration.xml
 
- src/hb-aat-layout-common.hh     | 2 +-
- src/hb-aat-layout-kerx-table.hh | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
+ docs/usermanual-integration.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 861547d5315be4cb22f3a1e7cd59696d8657ca49
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Sep 6 16:55:00 2019 -0400
+commit a29578c17a10f409db651ed55f20ca3eb20953ae
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 15:30:18 2020 +0100
 
-    Change HB_VAR_ARRAY from 1 to 0
-    
-    Going to see which compilers it breaks and special-case those...
+    Update usermanual-integration.xml
 
src/hb.hh | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
docs/usermanual-integration.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 0e294c455e7f2e50172f65463ab016f1372d4c59
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Sep 6 16:54:27 2019 -0400
+commit c241e82f00dad423bf1d15cc8e365224fb7a8575
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 15:28:42 2020 +0100
 
-    Rename VAR to HB_VAR_ARRAY
+    Update docs/usermanual-integration.xml
+    
+    Co-Authored-By: Khaled Hosny <dr.khaled.hosny@gmail.com>
 
- src/hb-machinery.hh        | 2 +-
- src/hb-open-type.hh        | 8 ++++----
- src/hb-ot-cff-common.hh    | 6 +++---
- src/hb-ot-cff1-table.hh    | 4 ++--
- src/hb-ot-layout-common.hh | 2 +-
- src/hb-ot-maxp-table.hh    | 2 +-
- src/hb-string-array.hh     | 2 +-
- src/hb.hh                  | 2 +-
- 8 files changed, 14 insertions(+), 14 deletions(-)
+ docs/usermanual-integration.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit c379faed2bcca1cc1a81b0de132fc3c4f7f7a080
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Sep 6 16:41:12 2019 -0400
+commit fd59cc700ade05fa86b89d10cf07eef7f57c9973
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 15:15:00 2020 +0100
 
-    Fix a few struct size declarations
+    Update src/hb-glib.cc
     
-    Was wrong.  As excercised by defining VAR to other than 1 in hb.hh.
+    Co-Authored-By: Khaled Hosny <dr.khaled.hosny@gmail.com>
 
- src/hb-aat-layout-feat-table.hh | 2 +-
- src/hb-ot-cff-common.hh         | 2 +-
- src/hb-ot-color-sbix-table.hh   | 2 +-
- src/hb-ot-layout-common.hh      | 2 +-
- 4 files changed, 4 insertions(+), 4 deletions(-)
+ src/hb-glib.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 7d4da8b86242d5a541e501937ddf321716b43f07
-Author: Evgeniy Reizner <razrfalcon@gmail.com>
-Date:   Fri Sep 6 19:24:32 2019 +0300
+commit fb9d106797f4ae458717dd9e9d0b2c9eca4b89c2
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 15:14:42 2020 +0100
 
-    Remove duplicated tests from test-ot-tag (#1958)
+    Update src/hb-graphite2.cc
+    
+    Co-Authored-By: Khaled Hosny <dr.khaled.hosny@gmail.com>
 
test/api/test-ot-tag.c | 3 ---
- 1 file changed, 3 deletions(-)
src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 3aceee2527ad921e0d589e42a1fe451e0fc67ee0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Sep 6 12:17:18 2019 -0400
+commit a199eab20eca8710e58fab845b8c330aada797a3
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 15:14:28 2020 +0100
 
-    Revert "[null] Silence undefined-behavior complaints with too-small null bytes"
-    
-    This reverts commit 911c76abcdfe89770b252eb0d4eb621c0db00ad5.
+    Update src/hb-graphite2.cc
     
-    Broke tests.  I'm not sure I understand why.  At any rate, this was a
-    bad way to fix.  I'll look into understanding as well as better fix.
+    Co-Authored-By: Khaled Hosny <dr.khaled.hosny@gmail.com>
 
- src/hb-null.hh | 6 ------
- 1 file changed, 6 deletions(-)
+ src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 911c76abcdfe89770b252eb0d4eb621c0db00ad5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Sep 6 11:53:11 2019 -0400
+commit aff21795b2da558e8f595706e7a46f11b891f8be
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 15:14:06 2020 +0100
 
-    [null] Silence undefined-behavior complaints with too-small null bytes
+    Update src/hb-icu.cc
     
-    Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1577584
+    Co-Authored-By: Khaled Hosny <dr.khaled.hosny@gmail.com>
 
- src/hb-null.hh | 6 ++++++
- 1 file changed, 6 insertions(+)
+ src/hb-icu.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 3c81246f66585edd8ee4515d226b133c290e9d7c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Sep 1 19:25:50 2019 -0500
+commit ccc235698394aab2cea69bd2e00a0caa766d577b
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Mon Apr 13 15:13:56 2020 +0100
 
-    [subset] Use newer iter tools in SinglePosFormat1
+    Update src/hb-graphite2.h
+    
+    Co-Authored-By: Khaled Hosny <dr.khaled.hosny@gmail.com>
 
- src/hb-ot-layout-gpos-table.hh | 8 ++------
- 1 file changed, 2 insertions(+), 6 deletions(-)
+ src/hb-graphite2.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 9510e918f72d2496f5e2ec84c58e79af944c8a0b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Sep 1 16:25:33 2019 -0500
+commit 0d5695983e8bf3184ecd4cb92f737b9dfe5d6d25
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Sun Apr 5 18:44:26 2020 -0700
 
-    [iter] Partialize hb_zip()
+    [subset] fixes dangling object_t issue in FeatureVariationRecord
+    Fixes https://crbug.com/oss-fuzz/21560
+    revert () does not clean up useless object_t. Adjust the order of
+    subsetting substitutions and conditions to avoid dangling object_t.
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-layout-common.hh                                |   9 +++++----
+ ...z-testcase-minimized-hb-subset-fuzzer-5759725666041856 | Bin 0 -> 114 bytes
+ 2 files changed, 5 insertions(+), 4 deletions(-)
 
-commit 52d19ba4591e822708e52a8fc96d9821fe2668f4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Sep 1 19:42:08 2019 -0500
+commit 57b7de032f60d0499ae2debb293d0f8456acfdfb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Apr 5 17:07:48 2020 +0430
 
-    Minor
+    [subset] Fail ClassDefFormat1 serialization if no space available
+    
+    Fixes https://crbug.com/oss-fuzz/21580
 
- test/subset/Makefile.am | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ src/hb-ot-layout-common.hh                               |   2 +-
+ ...-testcase-minimized-hb-subset-fuzzer-5704307501694976 | Bin 0 -> 1062 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
 
-commit cad698568a36ea6c929b4c888bd5e8aafe8d39e3
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 4 10:59:19 2019 +0430
+commit c8cc1e378df500122d8082a2038d68179eec63d0
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Apr 2 16:57:01 2020 -0700
 
-    Use roundf to fix cast to int difference of msys2 w64
+    fix issues in ClassDefFormat1 serialize:
+    glyph ids in Iterator may be non-consecutive,
+    so the number in classValue might be larger than length of the Iterator
 
- src/test-number.cc | 14 +++++++-------
- 1 file changed, 7 insertions(+), 7 deletions(-)
+ src/hb-ot-layout-common.hh                          |  20 +++++++++++++++-----
+ src/hb-ot-layout-gpos-table.hh                      |   2 +-
+ ...f => Roboto-Regular.keep-gdef-gpos.1E00,303.ttf} | Bin 2520 -> 2648 bytes
+ ...03.ttf => Roboto-Regular.keep-gdef-gpos.303.ttf} | Bin 2192 -> 2240 bytes
+ ...=> Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf} | Bin 2288 -> 2336 bytes
+ ...23.ttf => Roboto-Regular.keep-gdef-gpos.323.ttf} | Bin 2084 -> 2132 bytes
+ ...f => Roboto-Regular.keep-gdef-gpos.41,42,43.ttf} | Bin 2536 -> 2736 bytes
+ test/subset/data/profiles/keep-gdef-gpos.txt        |   1 +
+ test/subset/data/tests/layout.gdef.tests            |   2 +-
+ 9 files changed, 18 insertions(+), 7 deletions(-)
 
-commit 88c73359da3f7078d02f27087790c7109ab4d248
+commit 4a49b36a9e244e176a8e6d9ae9d6caadabfbcc6c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 4 11:16:18 2019 +0430
+Date:   Fri Apr 3 19:36:48 2020 +0430
 
-    Check roundf availibity in autotools
-    
-    Hmm, not sure how I missed it.
+    [tests/macos] Adopt added Apple Chancery tests with older macos versions
 
configure.ac | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
test/shaping/data/in-house/tests/macos.tests | 30 ++++++++++++++++++++++------
+ 1 file changed, 24 insertions(+), 6 deletions(-)
 
-commit 1083df8b80b08aa1a4f2dabfe414aaa4a0ec8aa1
+commit 75cae46dc2702e4edd32a92fe59300172931ed9f
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 4 01:22:21 2019 +0430
+Date:   Fri Apr 3 20:04:16 2020 +0430
 
-    Use hb_parse_double in CFF::dict_opset_t::parse_bcd
+    [aat] minor spacing
 
- src/Makefile.sources             |   2 +
- src/hb-cff-interp-dict-common.hh | 136 +++++++++------------------------------
- 2 files changed, 31 insertions(+), 107 deletions(-)
+ src/hb-aat-map.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 57f88e11d4c48f40a2e56625a54bdfed4aae601a
+commit 37377763842c80bf261d7bc0b3502cd5213244a4
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Sep 4 01:20:50 2019 +0430
+Date:   Fri Apr 3 20:03:20 2020 +0430
 
-    [number] Turn hb_parse_float into hb_parse_double
+    [aat] add the bug link, minor
 
- src/hb-common.cc   |  6 +++++-
- src/hb-number.cc   | 16 ++++++++--------
- src/hb-number.hh   |  4 ++--
- src/test-number.cc | 44 ++++++++++++++++++++++----------------------
- 4 files changed, 37 insertions(+), 33 deletions(-)
+ src/hb-aat-map.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
-commit 65690b5a4bf1186a072e8e918c5e01464f918d46
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 3 23:09:47 2019 +0430
+commit 548a25259e183f95713c0fdf0ad8c9450af73252
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Fri Apr 3 16:18:20 2020 +0100
 
-    [number] Add whole buffer check and test it
+    Add a test for #2307.
 
- src/hb-algs.hh             |  6 ++----
- src/hb-buffer-serialize.cc | 12 ++++--------
- src/hb-number.cc           | 39 ++++++++++++++++++++++++---------------
- src/hb-number.hh           |  9 ++++++---
- src/test-number.cc         | 19 ++++++++++++++++---
- 5 files changed, 52 insertions(+), 33 deletions(-)
+ test/shaping/data/in-house/tests/macos.tests | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 3661eb6105a33a763736d8dc4a2cd95c01aa4332
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 3 19:43:14 2019 +0430
+commit 1faf0caae165f680689610b20c467b9308275308
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Fri Apr 3 16:10:34 2020 +0100
 
-    Don't check null terminaion of source in hb_codepoint_parse
+    Special-case 'smcp' when checking for exposed AAT features.
     
-    This isn't what intended originally, just checking if consumed
-    all the buffer is enough.
+    This may be implemented by selectors under either LETTER_CASE or LOWER_CASE feature types
+    in AAT, so we need to check for the presence of either one.
+    
+    Fixes #2307.
 
- src/hb-algs.hh     |  4 ++--
- src/test-number.cc | 32 +++++++++++++++++++++++++++++++-
- 2 files changed, 33 insertions(+), 3 deletions(-)
+ src/hb-aat-map.cc | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
 
-commit 3a162727501ad0c56d5d6561cace115d858eacb7
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 3 17:19:33 2019 +0430
+commit 120d86fa189ca4f3dbb8502e92f7ac63f66d0037
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Fri Apr 3 15:10:14 2020 +0100
 
-    [test] resolve msvc complain on signedness comparing
+    Add tests for #2305.
 
- src/test-number.cc | 14 +++++++-------
- 1 file changed, 7 insertions(+), 7 deletions(-)
+ test/shaping/data/in-house/tests/macos.tests | 5 +++++
+ 1 file changed, 5 insertions(+)
 
-commit 005389beb5a28e2a94b40d0bb8229e9598b84b1d
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 3 17:00:46 2019 +0430
+commit b87cf6e8d44aa60e162a68225394386cecb0e690
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Fri Apr 3 15:02:07 2020 +0100
 
-    Use hb_parse_uint in deserializer token parser
+    Fix sense of comparsion in hb_aat_map_builder_t::feature_info_t.
+    
+    This makes bsearch actually work for the features array.
+    
+    Fixes #2305.
 
- src/hb-buffer-serialize.cc | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
+ src/hb-aat-map.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 3d5b1df7ab689871db37ec9a2f5b1ff1665fdb20
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 3 16:58:16 2019 +0430
+commit b027cb518dc7e6ac7e41e617364476e3c7839792
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Mon Mar 30 18:47:22 2020 +0100
 
-    [number] Add test
+    Set sequence number when adding feature to aat map builder, to support stable sort.
+    
+    Fixes #2288.
 
- src/Makefile.am    |   6 +-
- src/test-number.cc | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 185 insertions(+), 1 deletion(-)
+ src/hb-aat-map.cc | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit b5e6805ee777347ae13ba0133ca0d64252ef9d55
+commit e0e77270641fb932552b36bbb35813fbc5cfac1e
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 3 15:23:40 2019 +0430
+Date:   Fri Apr 3 01:12:16 2020 +0430
 
-    [number] Minor tweak on parser related codes
+    [ci] Update macOS 10.15's version
 
- src/hb-algs.hh             |  6 +++---
- src/hb-buffer-serialize.cc |  6 ++----
- src/hb-common.cc           | 14 ++++++--------
- src/hb-number.cc           |  6 ++----
- 4 files changed, 13 insertions(+), 19 deletions(-)
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit e2cecf1f34fe1cc62fd8260172f9bd694a17fac5
+commit 89fa70f511a62fedc46e68f692b6f19e119d647e
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 3 15:14:21 2019 +0430
+Date:   Fri Apr 3 00:05:40 2020 +0430
 
-    [number] Remove parsing code duplication of the calls using lambda
+    [aat] minor over previous feat related changes
 
- src/hb-number.cc | 57 +++++++++++++++++++-------------------------------------
- 1 file changed, 19 insertions(+), 38 deletions(-)
+ src/hb-aat-layout-feat-table.hh              |  2 +-
+ src/hb-aat-map.cc                            | 12 +++++-------
+ test/shaping/data/in-house/tests/macos.tests | 14 ++++++++++++--
+ 3 files changed, 18 insertions(+), 10 deletions(-)
 
-commit a77bb7eb41d34b19a672bb4ede038cc1b19a3945
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 3 14:49:14 2019 +0430
+commit 58b4d18b53a530b1bbc2fea2c3123754b9be4868
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Apr 2 17:54:09 2020 +0100
 
-    Move hb_codepoint_parse to hb_parse_uint
+    Add a couple testcases for issue 2285.
+    
+    A few simple testcases to confirm that setting liga=0 does not break shaping with
+    the Tibetan AAT font Kokonor, but does still disable common ligatures in Times.
 
- src/hb-algs.hh             | 20 +++++++++-----------
- src/hb-buffer-serialize.cc |  1 -
- src/hb-common.cc           |  1 -
- src/hb-number.cc           | 26 +++++++++++++++++++++++---
- src/hb-number.hh           |  3 +++
- src/hb.hh                  |  3 ++-
- 6 files changed, 37 insertions(+), 17 deletions(-)
+ test/shaping/data/in-house/tests/macos.tests | 6 ++++++
+ 1 file changed, 6 insertions(+)
 
-commit 43372fbb5afe31ea1e66d450f29de718b6190828
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 3 01:02:40 2019 +0430
+commit b1c0b9da2ff105d3476fed411e1d7010decb394e
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Apr 2 14:39:13 2020 +0100
 
-    Merge and aggregate number parsing logics to form hb-number
+    [AAT] Don't map OT tags to AAT feature types that are not exposed.
+    
+    If an AAT feature type is not exposed in the 'feat' table, we assume it is not intended
+    to be user-controllable and so we should not map any OT feature tag requests to it.
+    
+    Fixes #2285.
 
- src/Makefile.sources       |   2 +
- src/harfbuzz.cc            |   1 +
- src/hb-buffer-serialize.cc |  41 +++++---------
- src/hb-common.cc           | 121 +++------------------------------------
- src/hb-number.cc           | 138 +++++++++++++++++++++++++++++++++++++++++++++
- src/hb-number.hh           |  35 ++++++++++++
- 6 files changed, 197 insertions(+), 141 deletions(-)
+ src/hb-aat-layout-feat-table.hh | 6 ++++++
+ src/hb-aat-map.cc               | 7 +++++++
+ 2 files changed, 13 insertions(+)
 
-commit d50d2fcbc7233f0473493e17ab3fb243d8d30edd
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Sep 3 05:02:06 2019 +0430
+commit e0c3979af1c84f82b8879c710a07f027fe32f564
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Apr 1 16:49:53 2020 -0700
 
-    Fallback if roundf didn't exist, like in dietlibc (#1953)
+    typo fix
 
CMakeLists.txt | 2 +-
- src/hb.hh      | 9 +++++++++
- 2 files changed, 10 insertions(+), 1 deletion(-)
src/hb-ot-layout-common.hh   | 2 +-
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
 
-commit d3b984d3790d61931d4427ad7c0ae6547f8f1076
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Sep 2 18:18:25 2019 +0430
+commit 65f413630366ded4867522ca9ffa0d7e936380ac
+Author: ariza <ariza@adobe.com>
+Date:   Wed Apr 1 19:49:18 2020 -0700
 
-    Revert in-house pow10 (d80a3ea) and fix oss-fuzz/16922
-    
-    Probably can be fixed but merging it was wrong so let's revert.
+    minor; fixes #2292
 
- src/hb-cff-interp-dict-common.hh                   |  37 ++-------------------
- ...ase-minimized-hb-subset-fuzzer-5728664968232960 | Bin 0 -> 28 bytes
- 2 files changed, 3 insertions(+), 34 deletions(-)
+ src/hb-serialize.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
 
-commit 41d6e95b0d47c874b73b314cd147e6ea8ec5ddfb
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Sep 2 01:41:48 2019 +0430
+commit 014e038b2c2fd55e0bffbe5c5adc893c07df187a
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 31 16:29:29 2020 -0700
 
-    [subset] Use internal API of hb_set_t
+    [subset] Bail out of context lookup expansion once the lookup limit is encountered.
 
- src/hb-subset.cc | 7 +++----
- 1 file changed, 3 insertions(+), 4 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh                           |   8 ++++++++
+ ...testcase-minimized-hb-shape-fuzzer-5158673602314240 | Bin 0 -> 881650 bytes
+ 2 files changed, 8 insertions(+)
 
-commit 8ccf328d548a51140e22fe61ba6fdae3f7194aa2
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Sep 2 00:02:06 2019 +0430
+commit 5d345d0cd169dcc8c0205918a6e064f03e4bc07a
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 31 17:46:19 2020 -0700
 
-    [subset] Run once for a tag
+    [subset] Limit the number of lookup indices processed subsetting Feature.
+    > Also, remove two unnessecary full iterations of the lookup index iterator during serialization of the index array. Fixes fuzzer found timeout.
 
- src/hb-subset.cc | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
+ src/hb-ot-layout-common.hh                         |  25 +++++++++++++++------
+ ...ase-minimized-hb-subset-fuzzer-5719588814979072 | Bin 0 -> 1048576 bytes
+ 2 files changed, 18 insertions(+), 7 deletions(-)
 
-commit 0954c8f7a003b4130cfdc1b3f29db8c57953a78f
+commit 1b64b73080994ac577a6d936a0109b3c6f5d21de
 Author: Khaled Hosny <khaledhosny@eglug.org>
-Date:   Sun Sep 1 17:09:08 2019 +0200
+Date:   Mon Mar 30 16:49:23 2020 +0200
 
-    [ft] Prefer symbol cmap subtable if found (#1948)
+    Revert "Add messages for GPOS/GSUB phases"
     
-    Similar to commit d304d60e4d49df14ed85d6646680085f27bafbf2 for ot-font.
+    This reverts commit b07714d6b53bb20a2796f5efa607dc32aac587f1.
 
- src/hb-ft.cc | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-ot-layout.cc | 2 --
+ 1 file changed, 2 deletions(-)
 
-commit 4375858792f3e3cc2fae72c3ae3327f52884f780
+commit 2e1bf61dd5afcef71957b349254b80e7cfd14e45
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Sep 1 15:13:05 2019 +0430
+Date:   Thu Mar 26 22:59:26 2020 +0430
 
-    [editorconfig] Treat Ragel files also as C sources
+    [gsubgpos] Use FeatureVariations::NOT_FOUND_INDEX instead Index::
+    
+    As noted by https://github.com/harfbuzz/harfbuzz/issues/2280#issuecomment-604386389
+    
+    Added on b143e34, fixed on 2571891
+    
+    Closes #2280
 
.editorconfig | 2 +-
src/hb-ot-layout-gsubgpos.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit d80a3ea983534e291aee273dba5b1c6e889dadfa
+commit 96d792ae80c448715ef317c9f69eb30dc3d34a10
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Sep 1 14:05:16 2019 +0430
+Date:   Tue Mar 24 14:05:47 2020 +0430
 
-    [cff] Implement in-house power of 10
-    
-    A minimal power only for natural numbers exponents of ten, for portability.
+    [avar] Prevent mul overflow
     
-    Found the idea in Tcl/Tk but wrote it myself after weeks and it turned out
-    being a different implementation, reverse direction, constexpr, etc.
+    Fixes https://crbug.com/oss-fuzz/21350
 
- src/hb-cff-interp-dict-common.hh | 37 ++++++++++++++++++++++++++++++++++---
- 1 file changed, 34 insertions(+), 3 deletions(-)
+ src/hb-algs.hh                                     |  29 ++++++++++++++++-----
+ src/hb-ot-var-avar-table.hh                        |  10 ++++---
+ ...tcase-minimized-hb-draw-fuzzer-5712313459146752 | Bin 0 -> 146696 bytes
+ 3 files changed, 30 insertions(+), 9 deletions(-)
 
-commit f441a7c00837fbe7843df6faedd5f6383c2258c3
+commit 18fc9197e23460f2599670b65548d07a522d5a73
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Sep 1 02:18:09 2019 +0430
+Date:   Thu Mar 26 13:34:28 2020 +0430
 
-    Don't allow reference blob be accessed using empty tag in hb_face_reference_table (#1947)
+    [meson] Run check-symbols.sh and check-static-inits.sh correctly
+    
+    * Search src/ build directory for objects in check-static-inits.sh
+    * Find .def files in src/ build directory in src/check-symbols.sh
+    * Pass builddir also in autotools also, we may just remove libs passing after autotools removal
+    * Move harfbuzz_subset_def target so can be referenced as a check-static-inits.sh dependency
 
- src/hb-face.cc   | 3 +++
- src/hb-subset.cc | 5 -----
- 2 files changed, 3 insertions(+), 5 deletions(-)
+ src/Makefile.am           |  1 +
+ src/check-static-inits.sh | 13 ++++++++--
+ src/check-symbols.sh      |  7 +++---
+ src/meson.build           | 63 +++++++++++++++++++++++++----------------------
+ 4 files changed, 50 insertions(+), 34 deletions(-)
 
-commit c9eb913f4cf3d9d4a28059c7ecf7145ad3c49c65
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 31 15:21:02 2019 -0500
+commit 9c2c9553eb85b272c2838f5fc60301aafe361549
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 26 13:24:38 2020 +0430
 
-    [iter] Simplify hb_chop()
+    [test] Check -subset also doesn't link to lib[std]c++
 
- src/hb-iter.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/check-libstdc++.sh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
 
-commit 67ec9fa9e48714f595ab17bb8a673b5ee7c73aa8
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 31 14:51:49 2019 -0500
+commit 25718913d4263ed709bd7142a107e128c9f91d4c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 26 14:04:37 2020 +0430
 
-    [iter] Add hb_chop()
+    [gsubgpos] minor build fix
 
- src/hb-iter.hh   | 14 ++++++++++++++
- src/test-iter.cc |  2 +-
- 2 files changed, 15 insertions(+), 1 deletion(-)
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 5828d8e83c023547f0add77b6413967056c2a13c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 31 14:36:44 2019 -0500
+commit b143e34ee1bb56d104e33b78abff70302a93d3d0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 26 11:58:45 2020 +0430
 
-    [iter] Add hb_take() specialization for arrays
+    [gsubgpos] Initialize variation index on HB_NO_VAR
+    
+    hb_shape_plan_key_t::equal expects hb_ot_shape_plan_key_t be initialized by
+    hb_ot_layout_table_find_feature_variations calls but it won't get initialized
+    when HB_NO_VAR build config is used.
+    
+    Related to https://github.com/harfbuzz/harfbuzz/issues/2280
 
- src/hb-iter.hh | 11 +++++++++++
- 1 file changed, 11 insertions(+)
+ src/hb-ot-layout-gsubgpos.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 398b296f3b205daa8964de1a63957efeb59f6bdf
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 31 12:44:24 2019 -0500
+commit 071e2e345fb0a78d13462744dca9b1a8b15e78cb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 26 12:01:53 2020 +0430
 
-    [iter] Add hb_len()
+    minor
 
- src/hb-iter.hh   | 8 ++++++++
- src/test-iter.cc | 2 +-
- 2 files changed, 9 insertions(+), 1 deletion(-)
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ src/hb-ot-shape.hh           | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
 
-commit 875131d47854c162c1d0a39a5c0f8f8d0c5f24e0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 31 12:42:52 2019 -0500
+commit cc977b6e5c263803abc47f52538b530458f08f16
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 26 11:18:02 2020 +0430
 
-    [iter] Add hb_take()
+    [gsubgpos] Minor simplification
+    
+    Just changed the order, no functional change
 
- src/hb-iter.hh   | 12 ++++++++++--
- src/test-iter.cc |  1 +
- 2 files changed, 11 insertions(+), 2 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh | 23 ++++++++++++-----------
+ 1 file changed, 12 insertions(+), 11 deletions(-)
 
-commit 1f88dae9f54d18cd740f149d020b2bb435dc9378
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 31 12:24:42 2019 -0500
+commit 1a48278511c396799693f23dde98c82b44a5f7d3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 26 11:15:09 2020 +0430
 
-    [iter] Make iota() accept invokable for increasing to next item
+    [gsubgpos] Minor style improve
 
- src/hb-iter.hh   | 21 ++++++++++++++++-----
- src/test-iter.cc |  1 +
- 2 files changed, 17 insertions(+), 5 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh | 24 ++++++------------------
+ 1 file changed, 6 insertions(+), 18 deletions(-)
 
-commit 3bc86fb237b668e738a78397be04c603e7cf083b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 30 16:39:52 2019 -0500
+commit 4ad686b9c0460bdc88663b882e5039b808bf8cce
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Mar 25 23:32:28 2020 -0700
 
-    [algs] Fix hb_inc/dec signature
+    [subset] fix fuzzer timeout in layout closure
+    
+    Bail out of chain context lookup expansion once the lookup limit is encountered.
 
- src/hb-algs.hh   | 5 +++--
- src/test-algs.cc | 4 ++++
- 2 files changed, 7 insertions(+), 2 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh                       |  26 +++++++++++++++++++++
+ ...ase-minimized-hb-subset-fuzzer-5713850117914624 | Bin 0 -> 1048576 bytes
+ 2 files changed, 26 insertions(+)
 
-commit b1378d8a217a53e17562abebee22276e09528f8c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 30 12:10:45 2019 -0500
+commit f0ce56bbd031a8b922e9695670c09c8a385c657f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 22:53:38 2020 +0430
 
-    [iter] Add hb_repeat()
+    [meson] Don't compile test-bimap on msvc either
+    
+    MSVC doens't like its NullPool,
+    
+    test-bimap.cc.obj : error LNK2019: unresolved external symbol "unsigned __int64 const * const _hb_NullPool" (?_hb_NullPool@@3QB_KB) referenced in function
 
- src/hb-iter.hh   | 37 +++++++++++++++++++++++++++++++++----
- src/test-iter.cc |  3 +++
- 2 files changed, 36 insertions(+), 4 deletions(-)
+ src/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 966a18b92a8b95d8024ae67bc237eeffe5019711
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 30 12:07:17 2019 -0500
+commit 22f311e100bf18728f3d697b724e643a4a5c917e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 22:43:02 2020 +0430
 
-    [iter] Remove some &&
+    [meson] Don't compile noinst_programs in msvc for now
 
- src/hb-iter.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/meson.build | 40 ++++++++++++++++++++++------------------
+ 1 file changed, 22 insertions(+), 18 deletions(-)
 
-commit de45775c37873dd5818058dfe316cc0e98590334
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 30 12:02:46 2019 -0500
+commit 7054b122068f14fda3442c1a3d2c05562ef8453d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 22:35:41 2020 +0430
 
-    [iter] Use hb_ridentity instead of lazy +
+    [meson] Mark rest of non-install executables explicitly
 
- src/hb-iter.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/meson.build          | 12 ++++++------
+ test/api/meson.build     |  2 ++
+ test/fuzzing/meson.build |  1 +
+ 3 files changed, 9 insertions(+), 6 deletions(-)
 
-commit ce4d63beec08995aaa6b8b45f7986f074a73f295
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 30 11:59:50 2019 -0500
+commit 68df3f7dacfa85d61fa7c059a13a09925b613484
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 20:58:38 2020 +0430
 
-    [iter] Separate hb_iota implementation from hb_range
+    [meson] test/api, separate subset tests
 
src/hb-iter.hh | 29 +++++++++++++++++++++++++++--
- 1 file changed, 27 insertions(+), 2 deletions(-)
test/api/meson.build | 20 ++++++++++++++++----
+ 1 file changed, 16 insertions(+), 4 deletions(-)
 
-commit 814dc3cbe5a5e51b48cb962a6f7053797bbb8e0d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 30 10:20:30 2019 -0500
+commit 600bf21fbc9076e1a7c276b41a7fcd610dae8adc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 20:08:40 2020 +0430
 
-    [iter] Rename
-    
-    Moving towards making iota useful for non-integers.
+    [meson] Add draw-fuzzer runner
 
src/hb-iter.hh | 35 ++++++++++++++++++-----------------
- 1 file changed, 18 insertions(+), 17 deletions(-)
test/fuzzing/meson.build | 22 ++++++++++++++--------
+ 1 file changed, 14 insertions(+), 8 deletions(-)
 
-commit 2d5643aed4a5a4bc3ea129d4af3dcbe7af7b9995
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 30 09:51:22 2019 -0500
+commit 466dbaa2583c9570016208655951b0b2466ac6c7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 19:52:43 2020 +0430
 
-    [algs] Add hb_inc() and hb_dec())
+    [meson] Add a note on meson stability status
 
src/hb-algs.hh | 12 ++++++++++++
- 1 file changed, 12 insertions(+)
meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 7eafe94705bb818aac71fbc142158a22da622d19
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 30 09:40:40 2019 -0500
+commit 28deb6b718997976a519e66e9aa8c15d8f117217
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 19:41:53 2020 +0430
 
-    Revert "[array] Add chop()"
-    
-    This reverts commit 545fe9d9f0870568c40c17591f3f224c228feba6.
-    
-    Breaks gcc 4.8 and MSVC all versions.
-    
-    Will add hb_chop() that works on all iterators instead.
+    [meson] test/fuzzing simplify
 
src/hb-array.hh | 14 --------------
- 1 file changed, 14 deletions(-)
test/fuzzing/meson.build | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
 
-commit 28c8dcb53f0af0dd3f4e7909285e67865a10b67b
+commit 78622231ac6da55bf86e598a7bca9e50471c03ab
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Aug 31 12:27:14 2019 +0430
+Date:   Tue Mar 24 19:39:42 2020 +0430
 
-    [subset] minor
+    [meson] More comment on tests are causing timeout failure
 
- src/hb-subset.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ test/fuzzing/meson.build | 3 ++-
+ test/subset/meson.build  | 5 +++--
+ 2 files changed, 5 insertions(+), 3 deletions(-)
 
-commit 545fe9d9f0870568c40c17591f3f224c228feba6
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Aug 29 15:48:21 2019 -0700
+commit 9bc792f416dddd4aabb99780c632010d97054f5d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 19:37:56 2020 +0430
 
-    [array] Add chop()
-    
-    Takes n, and returns iterator of iterators that contain up to
-    n items each.  Basically cuts the array into subarrays of size n.
-    The last sub-array might contain fewer.
-    
-    Ideally this should become a generic iter tool, not array-specific,
-    so we can use it in GPOS to chop a value matrix into rows and elements.
+    [meson] Don't set MALLOC_PERTURB_ as it is already set by meson
 
- src/hb-array.hh | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
+ test/api/meson.build | 9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
 
-commit c72589f13f24ca24a0613f7d9bc28b7fe1ef25c0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Aug 29 15:45:21 2019 -0700
+commit e8808c1c203c306f7b7667f9a0f32422c9f7abbb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 19:15:09 2020 +0430
 
-    [iter] Change item_size to get_item_size()
-    
-    By moving access to hb_static_size(Type) into a function instead of
-    a class-const, we can refer to iter types of incomplete types, which
-    come handy when a method of hb_array_t wants to return iterator
-    of hb_array_t.  That kind of stuff.   Next commit needs this to
-    build on clang...
+    [meson] Minor, replace tabs with spaces
 
- src/hb-array.hh | 8 ++++----
- src/hb-iter.hh  | 4 ++--
- 2 files changed, 6 insertions(+), 6 deletions(-)
+ .editorconfig            |  1 +
+ meson.build              |  4 ++--
+ src/meson.build          | 32 ++++++++++++++++----------------
+ test/shaping/meson.build | 16 ++++++++--------
+ 4 files changed, 27 insertions(+), 26 deletions(-)
 
-commit d58e248df62457bdc8a5bab743e5de26c6fc57be
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Aug 29 15:23:48 2019 -0700
+commit 4dfda9feaa431c2ab19d87cb177cc2502f5f0c21
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 19:33:31 2020 +0430
 
-    [array] Add truncate() method
+    [meson] Update and simplify test/shaping
 
- src/hb-array.hh | 4 ++++
- 1 file changed, 4 insertions(+)
+ test/shaping/meson.build | 538 +++++++++++++++++++++++------------------------
+ 1 file changed, 268 insertions(+), 270 deletions(-)
 
-commit a06edf1430ba73d24104fce5406f2bc787ce5f11
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Aug 29 15:21:18 2019 -0700
+commit f22e92bb300775c1d494c841c6fb26b0bbc96668
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 19:32:55 2020 +0430
 
-    [array] Use injected class name more
+    [meson] Update test/api from autotools
 
src/hb-array.hh | 24 ++++++++++++------------
- 1 file changed, 12 insertions(+), 12 deletions(-)
test/api/meson.build | 118 ++++++++++++++++++++++++++++++---------------------
+ 1 file changed, 70 insertions(+), 48 deletions(-)
 
-commit e0e0c8c10948212e97426e987b6f296dc4270c43
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Aug 29 14:58:16 2019 -0700
+commit e248a4e46c5c94b6de349d0fd0e1765b29acad99
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 18:56:49 2020 +0430
 
-    Minor
+    [make] Minor reordering on test/api/Makefile.am
 
src/hb-ot-layout-gpos-table.hh | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
test/api/Makefile.am | 30 +++++++++++-------------------
+ 1 file changed, 11 insertions(+), 19 deletions(-)
 
-commit 0313ef86e32a217e14950d46a3c3b98362a53dee
-Author: qxliu76 <48925186+qxliu76@users.noreply.github.com>
-Date:   Thu Aug 29 14:09:05 2019 -0700
+commit 2db8279162be7ac184ccf99982fad2aeeb0d7540
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 18:55:56 2020 +0430
 
-    bug fix in optimizing coverage table format (#1942)
-    
-    We are comparing number of shorts, NOT number of bytes.
+    [meson] Don't compile test-{algs,iter,meta} on msvc
 
- src/hb-ot-layout-common.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/meson.build | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
 
-commit 38f95baf6b7a74547906e8e813c826ee8f8c272f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Aug 29 13:40:46 2019 -0700
+commit 3385afacd3daabc98e69d1880dad558faa932842
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 24 18:55:01 2020 +0430
 
-    [subset] in SingleSubst subsetting, check for substitute in glyphset
-    
-    That matches what fonttools does and allows for specifying exact
-    glyphset for subset.
+    [meson] Don't run check-includes if is amalgam build
 
- src/hb-ot-layout-gsub-table.hh | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
+ src/meson.build | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
 
-commit 499029644f35be7feedca7edf4610b2594855f01
+commit 6a8a1dc5bb67e2acd3fb3e8aae4cb558e3b093f7
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Aug 29 15:09:39 2019 +0430
+Date:   Tue Mar 24 16:04:33 2020 +0430
 
-    [gsub] Fix clang's semicolon complains
+    [meson] Port src/ binary artifacts to meson
 
- src/hb-ot-layout-gsub-table.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/meson.build | 416 +++++++++++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 306 insertions(+), 110 deletions(-)
 
-commit 28620310b8a86092074d5a1c40c87fdc9a91ba61
+commit d57fc627e9923579aed3d451c8f3b15520805fc1
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Aug 29 14:55:54 2019 +0430
+Date:   Tue Mar 24 16:03:04 2020 +0430
 
-    [test] Avoid alloca use as clang complain
-    
-    Fixes https://circleci.com/gh/harfbuzz/harfbuzz/108171 complain
+    [meson] raise timeout value of subset fuzzer
 
- test/api/test-ot-color.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
+ test/fuzzing/meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 875985cd481f1609d10ad0472f1e77af075c93bc
+commit 4738dff18e7644306c3526b8cc9429fda6d6db0d
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Aug 29 14:51:22 2019 +0430
+Date:   Mon Mar 23 23:37:49 2020 +0430
 
-    [subset] Don't allow malicious fonts to insert unlimited table headers
-    
-    Fixes https://crbug.com/oss-fuzz/16810
+    [make] minor move on Makefile.am
 
- src/hb-subset.cc                                       |   5 +++++
- ...estcase-minimized-hb-subset-fuzzer-5675720390475776 | Bin 0 -> 299037 bytes
- 2 files changed, 5 insertions(+)
+ src/Makefile.am | 40 ++++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
 
-commit dc9222b1dd197ba50f7b63eb97f3fe0891a7b7b5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 15:38:46 2019 -0700
+commit b07714d6b53bb20a2796f5efa607dc32aac587f1
+Author: Simon Cozens <simon@simon-cozens.org>
+Date:   Sat Mar 14 17:55:27 2020 +0000
 
-    [subset] Implement AlternateSubst subsetting
+    Add messages for GPOS/GSUB phases
 
- src/hb-ot-layout-gsub-table.hh | 61 +++++++++++++++++++++++++++++++++++++-----
- 1 file changed, 55 insertions(+), 6 deletions(-)
+ src/hb-ot-layout.cc | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 23681b6da4368895fc049beda5a79af58aad8d69
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 15:30:37 2019 -0700
+commit 748e1cf8980e8c54b61ec86599f94450e98ad47a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 21 23:31:52 2020 +0430
 
-    Minor
+    [subset] Avoid linking to libstdc++ in libharfbuzz-subset.so
+    
+    Just like other targets (except harfbuzz-icu) avoid linking to libstdc++
 
- src/hb-ot-layout-gsub-table.hh | 21 ++++++++-------------
- 1 file changed, 8 insertions(+), 13 deletions(-)
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 33c8e2303c23e8dfacb79ac15d8a0e6c7f866c89
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 15:25:55 2019 -0700
+commit 761695264b309693346dd027d38e6bc53056c3ab
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 19 11:43:37 2020 +0330
 
-    [subset] Implement MultipleSubst subsetting
+    [tests] Remove py2 workaround for lack of timeout in subprocess
 
- src/hb-ot-layout-gsub-table.hh | 50 ++++++++++++++++++++++++++++++++++++++++--
- 1 file changed, 48 insertions(+), 2 deletions(-)
+ test/fuzzing/run-draw-fuzzer-tests.py   | 28 ++++++----------------------
+ test/fuzzing/run-shape-fuzzer-tests.py  | 28 ++++++----------------------
+ test/fuzzing/run-subset-fuzzer-tests.py | 32 ++++++++------------------------
+ 3 files changed, 20 insertions(+), 68 deletions(-)
 
-commit 5c43a7ba7e4cac229593f9cbe1017d3c55b111ac
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 15:09:58 2019 -0700
+commit b5526a09ff89780de4584ff422127cb962b138f3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 18 23:58:20 2020 +0330
 
-    [GSUB] Use dagger in Ligature::intersects()
+    [tools] Remove in-house 'which' now that we have py3
 
- src/hb-ot-layout-gsub-table.hh | 8 +-------
- 1 file changed, 1 insertion(+), 7 deletions(-)
+ test/fuzzing/run-draw-fuzzer-tests.py   | 22 ++--------------------
+ test/fuzzing/run-shape-fuzzer-tests.py  | 22 ++--------------------
+ test/fuzzing/run-subset-fuzzer-tests.py | 22 ++--------------------
+ test/subset/run-tests.py                | 22 +++-------------------
+ 4 files changed, 9 insertions(+), 79 deletions(-)
 
-commit b8c642c1f597fb28ef323ac3cd78541eb462a2f7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 15:06:45 2019 -0700
+commit a0c58be371f67aa03335f40b98aa7073f1968cab
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 18 23:40:59 2020 +0330
 
-    Minor
+    [tools] Remove py2 remains
 
- src/hb-ot-layout-gsub-table.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/gen-os2-unicode-ranges.py | 5 -----
+ src/gen-use-table.py          | 7 +------
+ test/shaping/hb_test_tools.py | 4 ----
+ 3 files changed, 1 insertion(+), 15 deletions(-)
 
-commit dc2c9aa0c398ac068e1385fffe1fb2b28c80d099
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 15:05:49 2019 -0700
+commit 2e29a4077b48e11d5c33a0d054dafcd17749ff07
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 14 16:34:36 2020 +0330
 
-    Rename
+    [ci/appveyor] Adopt with Meson
 
src/hb-open-type.hh | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
appveyor.yml | 59 +++++++++++++----------------------------------------------
+ 1 file changed, 13 insertions(+), 46 deletions(-)
 
-commit bc5ef765a874ecd9fc0634dccf0848d1ee839c9a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 14:51:28 2019 -0700
+commit 03564fd2cfa752c28a3f306994cfc8865d208cfd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 14 20:09:00 2020 +0330
 
-    [subset] Subset ligature substitutes!
-    
-    Test with:
-    
-    $ ./hb-subset -o out.ttf NotoSansArabic-Regular.ttf --drop-tables=  سلام && ./hb-view out.ttf سلام
+    [test] fix misspell
 
src/hb-ot-layout-gsub-table.hh | 79 ++++++++++++++++++++++++++++++++++++++++--
- 1 file changed, 76 insertions(+), 3 deletions(-)
test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 42d887bd221879f57ef939838d4f72bf38268943
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 14:47:14 2019 -0700
+commit 1b8a37f75f44bf6cd20250c0dcfc1c0a70879aa5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 14 20:06:41 2020 +0330
 
-    Beef up HeadlessArrayOf<>
+    [test] minor fix
     
-    Should be merged with ArrayOf...
-    https://github.com/harfbuzz/harfbuzz/issues/1937
+    oops...
 
src/hb-open-type.hh | 37 ++++++++++++++++++++++++++++++-------
- 1 file changed, 30 insertions(+), 7 deletions(-)
test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 3ca809e3623e59b9a99bc0b9e5d10b02238bba3c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 13:49:35 2019 -0700
+commit 0423da33732cda737354f52b37053809a80571b1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 14 20:05:23 2020 +0330
 
-    Add ArrayOf::pop()
+    [test] minor fix
+    
+    macos tests are using absolute path which aren't relevant in Windows
 
- src/hb-open-type.hh | 2 ++
- 1 file changed, 2 insertions(+)
+ test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 307bd6d79f11eb175f06c08c321947a447496291
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 13:49:17 2019 -0700
+commit 74fdd34f4d1912b506b2e640f52b3606dad4a3aa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 14 20:03:14 2020 +0330
 
-    Add arithmetic operators to IntType<>
+    [test] make run-tests.py work on Windows
 
- src/hb-open-type.hh | 8 ++++++++
- 1 file changed, 8 insertions(+)
+ test/shaping/run-tests.py | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
 
-commit 2e1d00c85bba98f08a728c4f6f8112d5a25d8062
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 13:49:04 2019 -0700
+commit 93b3e30215599fad6ec40351e5eef0a91e2ae031
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sat Mar 14 11:27:50 2020 +0000
 
-    [debug] Minor
+    [meson] fix icu-related linking errors in test with amalgam build
+    
+    test-unicode.c:960: undefined reference to `hb_icu_get_unicode_funcs'
+    test-unicode.c:961: undefined reference to `hb_icu_get_unicode_funcs'
+    
+    For now add the icu sources to libharfbuzz also for the amalgam
+    build, later we need to have a separate harfbuzz-icu module and
+    link against that, and/or generate harfbuzz.cc.
 
- src/hb-debug.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/meson.build | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
 
-commit 062cad5e28574f9f004f917afa7d010fa68fdad0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 28 13:33:08 2019 -0700
+commit a3892be70108adb0cbafcff9bf4c2ebc0f65acb0
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sat Mar 14 01:08:15 2020 +0000
 
-    Add ArrayOf::serialize_append
+    [meson] fix spurious warning when building test/api C sources
+    
+    Fixes compiler warning
+    
+      test-unicode.c:589:1: warning: ‘test_unicode_properties_lenient’ defined but not used
+    
+    which didn't happen with autotools.
+    
+    Reason it does with meson is that the setup for C was slightly wrong.
+    We would only add -DHAVE_CONFIG_H to cpp_args which is only valid when
+    compiling C++ code, but not plain C code, and many of these tests were
+    plain C.
+    
+    Instead pass -DHAVE_CONFIG_H via add_project_arguments() and make sure
+    to set both c_args and cpp_args when building test executables.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2257
 
- src/hb-open-type.hh | 12 ++++++++++++
- 1 file changed, 12 insertions(+)
+ meson.build          | 5 +++--
+ test/api/meson.build | 3 +--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
 
-commit b66076812d067f893a5a422af2656916ff479d8f
-Author: Adrian Wong <adrianwjw@gmail.com>
-Date:   Wed Aug 28 21:31:27 2019 +1000
+commit bb8aaa310887aa6b4a5ec2bfa9ee0330f1619c75
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sat Mar 14 01:05:38 2020 +0000
 
-    Adjustments to the generated Indic table output (#1936)
-    
-    * Add empty parentheses after print call
+    [meson] use add_project_arguments() instead of add_global_arguments()
     
-    * Minor: newlines. Move #pragma pop down one; #endif up one
-    
-    * Adjust #define ISC/IMC output
+    .. and simplify, can pass two languages in one go.
     
-    * Regenerate Indic table
+    add_global_arguments() won't work if harfbuzz is used as a
+    meson subproject.
 
- src/gen-indic-table.py                 |  21 ++++---
- src/hb-ot-shape-complex-indic-table.cc | 109 +++++++++++++++++----------------
- 2 files changed, 70 insertions(+), 60 deletions(-)
+ meson.build | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
 
-commit 4ef08dbce1a9acd7e941168245c96e010248ecb6
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Aug 27 14:49:46 2019 +0430
+commit 2f556c38c08d6d19bed115cc5ab5e0e369d9b4d0
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Mar 13 12:21:10 2020 -0700
 
-    Use hb_bytes_t as<T> in hb_blob_t
+    [subset] Fix crash when serializer runs out of room during gpos subsetting.
 
- src/hb-blob.hh | 8 ++------
- 1 file changed, 2 insertions(+), 6 deletions(-)
+ src/hb-ot-layout-gpos-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit dce42cef2b769379a0690053da0e7467ff086195
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Aug 27 14:32:05 2019 +0430
+commit 430bf696537a4cf19e3ad371c4485f9580b4433b
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Mar 13 11:20:34 2020 -0700
 
-    [glyf] Move GlyphHeader::from_bytes to hb_bytes_t, introduce .as<T> ()
+    Add potentially crashing font as a fuzzer seed.
 
- src/hb-array.hh         |  6 ++++++
- src/hb-ot-glyf-table.hh | 24 +++++++++---------------
- 2 files changed, 15 insertions(+), 15 deletions(-)
+ test/fuzzing/fonts/kanit.ttf | Bin 0 -> 160304 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit 6e82d59b4f72e8f2ff1830fb384907dcba95962a
+commit c54ab9ba791efe5492dac89c64ac449de308eb6f
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Aug 27 12:33:42 2019 +0430
+Date:   Fri Mar 13 14:41:28 2020 +0330
 
-    [glyf] Revert the way indexToLocFormat is set
+    Provide meson wrap files on release tarball
 
- src/hb-ot-glyf-table.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ Makefile.am | 7 +++++++
+ 1 file changed, 7 insertions(+)
 
-commit 88e9db19d29480fadcd4f49f0f4d9029ac64b429
+commit f1dd605cd9023b697c319b6640fdc25f78ef7e8c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Aug 27 02:44:26 2019 +0430
+Date:   Fri Mar 13 14:40:07 2020 +0330
 
-    [subset] Remove subset table size assertion
-    
-    As https://github.com/harfbuzz/harfbuzz/pull/1930#issuecomment-525036802
+    [docs] Update to mention meson
 
- src/hb-subset.cc | 1 -
- 1 file changed, 1 deletion(-)
+ BUILD.md   | 7 ++-----
+ CONFIG.md  | 2 +-
+ TESTING.md | 5 ++---
+ 3 files changed, 5 insertions(+), 9 deletions(-)
 
-commit a0b4ac4dce392326284138fc47cf3741e2798e21
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Aug 24 17:57:14 2019 +0430
+commit 838346c54a332cc7acafea676b4272ab8419c9e8
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 18:01:17 2020 +0800
 
-    Turn 8 spaces to tab across the project
+    meson: Support GDI integration
     
-    According to the current code style of the project
+    ...and supersede the configuration option uniscribe with gdi, as Uniscribe is
+    tightly tied to GDI.  This means that enabling GDI would also mean enabling
+    Uniscribe.
 
- src/hb-aat-layout-kerx-table.hh    |  12 +-
- src/hb-aat-layout-morx-table.hh    |  16 +--
- src/hb-aat-layout-trak-table.hh    |   6 +-
- src/hb-array.hh                    |   4 +-
- src/hb-blob.cc                     |   4 +-
- src/hb-buffer-serialize.cc         |   2 +-
- src/hb-buffer.cc                   |  22 ++--
- src/hb-buffer.h                    |   4 +-
- src/hb-common.cc                   |   4 +-
- src/hb-coretext.cc                 |  50 ++++----
- src/hb-dispatch.hh                 |   2 +-
- src/hb-font.cc                     |  16 +--
- src/hb-ft.cc                       |   2 +-
- src/hb-graphite2.cc                |  10 +-
- src/hb-iter.hh                     |   4 +-
- src/hb-kern.hh                     |   6 +-
- src/hb-machinery.hh                |   2 +-
- src/hb-object.hh                   |   2 +-
- src/hb-open-file.hh                |   4 +-
- src/hb-open-type.hh                |   2 +-
- src/hb-ot-cmap-table.hh            | 252 ++++++++++++++++++-------------------
- src/hb-ot-color-cbdt-table.hh      |   2 +-
- src/hb-ot-color-cpal-table.hh      |   2 +-
- src/hb-ot-color-sbix-table.hh      |   8 +-
- src/hb-ot-font.cc                  |  16 +--
- src/hb-ot-hmtx-table.hh            |  62 ++++-----
- src/hb-ot-layout-common.hh         |  16 +--
- src/hb-ot-layout-gdef-table.hh     |   4 +-
- src/hb-ot-layout-gpos-table.hh     |  74 +++++------
- src/hb-ot-layout.cc                |  26 ++--
- src/hb-ot-layout.h                 |  18 +--
- src/hb-ot-map.cc                   |   2 +-
- src/hb-ot-maxp-table.hh            |   2 +-
- src/hb-ot-name-table.hh            |   8 +-
- src/hb-ot-name.cc                  |   2 +-
- src/hb-ot-shape-complex-arabic.cc  |  14 +--
- src/hb-ot-shape-complex-hangul.cc  |  12 +-
- src/hb-ot-shape-complex-indic.cc   |  34 ++---
- src/hb-ot-shape-complex-khmer.cc   |   2 +-
- src/hb-ot-shape-complex-myanmar.cc |   2 +-
- src/hb-ot-shape-complex-use.cc     |   2 +-
- src/hb-ot-shape-fallback.cc        |  46 +++----
- src/hb-ot-shape-normalize.cc       |   4 +-
- src/hb-ot-shape.cc                 |  16 +--
- src/hb-ot-stat-table.hh            |   4 +-
- src/hb-ot-var-avar-table.hh        |   2 +-
- src/hb-ot-var-fvar-table.hh        |   6 +-
- src/hb-ot-vorg-table.hh            |  28 ++---
- src/hb-pool.hh                     |   2 +-
- src/hb-sanitize.hh                 |   6 +-
- src/hb-set.hh                      |  36 +++---
- src/hb-shape-plan.cc               |  50 ++++----
- src/hb-subset-cff2.cc              |  18 +--
- src/hb-subset-input.cc             |   2 +-
- src/hb-subset-plan.cc              |  34 ++---
- src/hb-subset-plan.hh              |   8 +-
- src/hb-subset.h                    |   2 +-
- src/hb-uniscribe.cc                |   8 +-
- src/hb-utf.hh                      |   8 +-
- src/hb-vector.hh                   |   2 +-
- src/hb.hh                          |  12 +-
- src/test-ot-color.cc               |   4 +-
- src/test-unicode-ranges.cc         |   6 +-
- test/api/hb-subset-test.h          |   6 +-
- test/api/test-buffer.c             |   2 +-
- test/api/test-object.c             |   2 +-
- test/api/test-ot-math.c            | 132 +++++++++----------
- test/api/test-unicode.c            |  16 +--
- util/ansi-print.cc                 |  26 ++--
- util/hb-fc-list.c                  |   2 +-
- util/hb-fc.cc                      |   4 +-
- util/hb-shape.cc                   |   2 +-
- util/hb-subset.cc                  |  10 +-
- util/helper-cairo-ansi.cc          |   4 +-
- util/helper-cairo.cc               |   2 +-
- util/options-subset.cc             |  26 ++--
- util/options.cc                    |  50 ++++----
- util/options.hh                    |   8 +-
- 78 files changed, 662 insertions(+), 668 deletions(-)
+ meson.build       | 9 +++++----
+ meson_options.txt | 4 ++--
+ src/meson.build   | 5 +++++
+ 3 files changed, 12 insertions(+), 6 deletions(-)
 
-commit 269a120f137ca69ca83b6fa00bb6a0ff1a87ae3e
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Aug 25 20:37:00 2019 +0430
+commit 9d0e6aef8abe12270df161d7535d6bc741cf4c31
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 16:56:55 2020 +0800
 
-    [subset] Raise the bar in new vs old table size
-    
-    https://crbug.com/oss-fuzz/16740
+    Meson: Look harder for Cairo on Visual Studio
     
-    This is actually an interesting thing that {h,v}mtx allocates as
-    much as a font pretends to have glyphs but the solution is not
-    that obvious as regular fonts can have less than actually containing
-    metrics in their {h,v}mtx. This change raises the bar to consider this
-    hmtx 4 byte for every glyph case.
+    Since Cairo's build system for Visual Studio does not generate pkg-config files
+    for us, look for cairo.h and cairo.lib manually if the pkg-config files cannot
+    be found.
     
-    Initially we wanted to just find things allocating crazy amount of
-    memory but having the assert has led to interesting findings also
-    so let's don't remove the assert and see what we can find elsewhere.
+    Also look for cairo-ft more carefully: ensure that we have cairo-ft.h, and one
+    of its symbols can be found in the same cairo.lib that we previously found.
 
- src/hb-subset.cc                                          |   2 +-
- ...z-testcase-minimized-hb-subset-fuzzer-5667673584697344 | Bin 0 -> 178 bytes
- 2 files changed, 1 insertion(+), 1 deletion(-)
+ meson.build | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
 
-commit 2f8e823331aca2c73b940f057f4b149a89af0502
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Aug 25 12:37:40 2019 +0430
+commit 5efce600ab3a8e4e7f429f5d683595c33d6cbe45
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 16:40:20 2020 +0800
 
-    [glyf] minor
+    Meson: Try harder to look for ICU on Visual Studio
+    
+    ICU's Visual Studio build files do not generate pkg-config files for us, unless
+    it is built with Cygwin instead of the project files.  If pkg-config files for
+    ICU cannot be found, look for its headers and .lib manually.
 
src/hb-ot-glyf-table.hh | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
meson.build | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
 
-commit 07e467a30e2bab9731900d72dbf926dbe6fc6e1d
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Aug 25 00:36:58 2019 +0430
+commit 7baa8e0dbe816769f1ceeffdc2e72af7797e5df9
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 16:21:25 2020 +0800
 
-    [glyf] Move GlyphHeader size checking to a static method
+    meson: Updates to Uniscribe and DirectWrite build support
+    
+    Update the DirectWrite support to look for dwrite_1.h, and give the green light
+    for both the DirectWrite and Uniscribe build options.
 
src/hb-ot-glyf-table.hh | 69 ++++++++++++++++++++++++++-----------------------
- 1 file changed, 36 insertions(+), 33 deletions(-)
meson.build | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 139d14dc899250cf06a8d03b70504687184d5c7f
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Aug 24 17:23:16 2019 +0430
+commit 733414b286b544b54c48e72ba8ae78d5584c157d
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 16:15:21 2020 +0800
 
-    [glyf] Move GlyphHeader related logics to its, making its fields protected
+    meson: Try harder to find FreeType on Visual Studio
+    
+    If we can't find FreeType via pkg-config or CMake, try looking for it manually,
+    before we attempt to build it as a fallback.
 
src/hb-ot-glyf-table.hh | 73 +++++++++++++++++++++++++------------------------
- 1 file changed, 38 insertions(+), 35 deletions(-)
meson.build | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
 
-commit d57819cbdbab18ccf20caa25cb72cd66efe30848
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Aug 24 16:26:42 2019 +0430
+commit 4b4d5c295d584809e0281b27687757e895e7edfc
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 16:00:09 2020 +0800
 
-    [glyf] format source
+    src/meson.build: Some cleanups for Visual Studio builds
+    
+    We don't actually need the .def files (vs_module_defs) entry when we are
+    building DLLs with Visual Studio as long as we have HB_DLL_EXPORT defined.
+    
+    Plus, to maintain compatibility with the CMake builds, for Visual Studio builds
+    we do not prefix the libraries with 'lib', nor have a '-0' suffix for the DLL
+    file name.
 
- src/hb-ot-glyf-table.hh | 282 ++++++++++++++++++++++++++----------------------
- 1 file changed, 154 insertions(+), 128 deletions(-)
+ src/meson.build | 26 +++++++++++++++-----------
+ 1 file changed, 15 insertions(+), 11 deletions(-)
 
-commit 2aef3013f3e6d71eacd0123f4faa63445034c32b
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Aug 24 02:59:18 2019 +0430
+commit da95a8c239bda7020716cc8c7ba34c380f68ffc3
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 15:49:08 2020 +0800
 
-    [subset] Consider instruction length place itself
+    Shaping tests: Skip FreeType tests if support not present
     
-    Now fixes https://crbug.com/oss-fuzz/16639 completely
+    HarfBuzz could have been built without FreeType, so we skip the test
+    when hb-shape reports that the font function `ft' is unknown
 
src/hb-ot-glyf-table.hh | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
test/shaping/run-tests.py | 40 +++++++++++++++++++++++++++-------------
+ 1 file changed, 27 insertions(+), 13 deletions(-)
 
-commit 922898c814b328712fac6c3259740804679dae11
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Aug 23 22:04:14 2019 +0430
+commit 91ca17e1fd8145e863a5df27092ddd20aa2599f5
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 12:19:32 2020 +0800
 
-    [subset] Fail on table grow more than 16x+4096
+    src/hb-gobject-enums.cc.tmpl: Replace © with (C)
+    
+    This was, we also avoid Visual Studio compiler warnings C4828 as that sign is
+    not favored when /utf-8 is enabled, which is the norm nowadays as Visual Studio
+    2015 or later is required to build harfbuzz nowadays.
 
- src/hb-subset.cc | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-gobject-enums.cc.tmpl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 28aba780c4035cc85a31b778db0f5553c896dd6a
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Aug 23 16:47:15 2019 +0430
+commit 62fb6738d5115298ee7c72a4da3d9858b08a7269
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 12:18:09 2020 +0800
 
-    [subset] Fix blob leak of _subset2 when returns early
+    Fix gen-def for harefbuzz-gobject
     
-    Fixes https://crbug.com/oss-fuzz/16639
+    The © sign is causing issues for the script, so replace those with (C)
 
- src/hb-subset.cc                                          |   2 ++
- ...z-testcase-minimized-hb-subset-fuzzer-5754526379802624 | Bin 0 -> 288 bytes
- 2 files changed, 2 insertions(+)
+ src/hb-gobject-enums.h.tmpl | 2 +-
+ src/hb-gobject-structs.h    | 2 +-
+ src/hb-gobject.h            | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
 
-commit 541f3c2d7dcae47eb55650082e372286369d4a55
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 23 12:25:58 2019 -0700
+commit 8d425ed446e6b6cce30c5da16d9ad7d492f0c368
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 12:15:28 2020 +0800
 
-    [debug] Fix extra semicolon issue
+    meson: Fix harfbuzz-gobject builds without introspection
     
-    https://github.com/harfbuzz/harfbuzz/issues/1923
+    Make the `sources:` field reflect the items depending on whether introspection
+    is being built
 
- src/hb-debug.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 4dcaca84115bf8de130fc2c9e03bd7e63fcf9607
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 23 12:24:15 2019 -0700
+commit 3341d5346e530cd67d23f93cbc85e21bba7e8d0e
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Fri Mar 13 12:07:06 2020 +0800
 
-    Whitespace
+    meson: Don't apply -DHB_DLL_EXPORT to all targets
+    
+    Only have it apply to the libraries when they are not built statically on
+    Visual Studio
 
- src/hb-debug.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ meson.build     |  1 -
+ src/meson.build | 11 ++++++++---
+ 2 files changed, 8 insertions(+), 4 deletions(-)
 
-commit 569426d861ac9336f4083e55f98284b4c647c795
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 23 11:54:20 2019 -0700
+commit a224f4179fea20b782cc131e4840c258cc3600ad
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 13 08:33:34 2020 +0330
 
-    [debug] Fix build with HB_DEBUG
+    Turn more of simple dagger chains to foreach
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1923
+    Less noise, as was agreed before and applied 385741d also
 
- src/hb-debug.hh | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
+ src/hb-ot-cff-common.hh |  21 ++++---
+ src/hb-ot-cmap-table.hh | 142 ++++++++++++++++++++++--------------------------
+ src/hb-ot-hdmx-table.hh |   7 +--
+ src/hb-pool.hh          |   4 +-
+ 4 files changed, 79 insertions(+), 95 deletions(-)
 
-commit f233e6c8014cde9b2396c5350c29a3277cd3a657
-Author: Khaled Hosny <khaledhosny@eglug.org>
-Date:   Fri Aug 23 13:15:37 2019 +0200
+commit 755a77d6608c5b6d4e9ee3374a4721c77ff693ac
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jan 29 22:26:04 2020 +0330
 
-    [doc] Update list of default features in the manual
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1921
+    Move outline draw API behind HB_EXPERIMENTAL_API directive
 
- docs/usermanual-opentype-features.xml | 8 +++++---
- 1 file changed, 5 insertions(+), 3 deletions(-)
+ .circleci/config.yml           |  2 ++
+ docs/harfbuzz-sections.txt     | 21 ---------------------
+ src/gen-def.py                 | 24 +++++++++++++++++++++++-
+ src/hb-draw.cc                 | 24 +++++++++++++-----------
+ src/hb-draw.h                  |  4 +++-
+ src/hb-draw.hh                 |  2 ++
+ src/hb-font.h                  |  2 ++
+ src/hb-ot-cff1-table.cc        |  2 ++
+ src/hb-ot-cff1-table.hh        |  2 ++
+ src/hb-ot-cff2-table.cc        |  2 ++
+ src/hb-ot-cff2-table.hh        |  2 ++
+ src/hb-ot-glyf-table.hh        |  2 ++
+ src/main.cc                    |  4 ++++
+ test/api/test-draw.c           |  7 +++++++
+ test/api/test-ot-face.c        |  2 ++
+ test/fuzzing/hb-draw-fuzzer.cc |  8 ++++++++
+ 16 files changed, 76 insertions(+), 34 deletions(-)
 
-commit be97e9d678017d4ec66625fa2b17ef3485552cad
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Aug 22 15:52:24 2019 -0700
+commit dfab7a254655f5ef5d68a2b92f0d5c197517c853
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 12 21:05:01 2020 +0330
 
-    2.6.1
+    [cmake] Bring it back to release tarball
 
- NEWS             | 11 +++++++++++
- configure.ac     |  2 +-
- src/hb-version.h |  4 ++--
- 3 files changed, 14 insertions(+), 3 deletions(-)
+ .circleci/config.yml | 6 ++++--
+ Makefile.am          | 3 ++-
+ 2 files changed, 6 insertions(+), 3 deletions(-)
 
-commit d304d60e4d49df14ed85d6646680085f27bafbf2
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 21 12:30:22 2019 -0700
+commit e860000db5c393139c546a1273ba37983c729b41
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 12 21:04:06 2020 +0330
 
-    [ot-font] Prefer symbol cmap subtable if found
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1918
-    
-    Hopefully doesn't break anyone...
+    [cmake] Suggest Meson port in CMake
 
- src/hb-ot-cmap-table.hh | 16 +++++++++-------
- 1 file changed, 9 insertions(+), 7 deletions(-)
+ CMakeLists.txt | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 2a3d4987a75fb2cd51ccf4c1d08baba383ceda7b
+commit b1c3d0b8b0f3d8f644e7bc2f0e4aae2d383f4d79
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 21 03:02:01 2019 +0430
+Date:   Thu Mar 12 20:59:18 2020 +0330
 
-    Remove hb_directwrite_shape_experimental_width public API
-    
-    I had specially exposed the API as I didn't know how to embed harfbuzz
-    easily elsewhere but now with harfbuzz.cc it has become very easy
-    and I don't like to see its use anywhere as it has a bad naming and
-    its Kashida adding is bogus and only useful to check where it should
-    be added, not visually useful however.
+    [cmake] cleanup
 
- src/hb-directwrite.cc | 29 ++++++-----------------------
- src/hb-directwrite.h  |  5 -----
- 2 files changed, 6 insertions(+), 28 deletions(-)
+ CMakeLists.txt | 21 ---------------------
+ 1 file changed, 21 deletions(-)
 
-commit 163a66dc737645852d7515381304d69706688e16
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 20 14:22:57 2019 -0700
+commit cc63eb66ce7e8579c92303f8b9d8a8183ec76513
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 12 14:53:26 2020 +0330
 
-    [test] Add test for aaa85931f3542639cd9d0dfb92fd6baab5b0298d
+    [editorconfig] Add meson config
 
test/api/test-shape.c | 48 ++++++++++++++++++++++++++++++------------------
- 1 file changed, 30 insertions(+), 18 deletions(-)
.editorconfig | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
 
-commit aaa85931f3542639cd9d0dfb92fd6baab5b0298d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 20 13:06:10 2019 -0700
+commit 1dd389668847bcbc5e94573c80bb71bb87ee0d9c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 12 13:41:10 2020 +0330
 
-    [font] Update multipliers when creating sub_font
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1910
+    [meson] Make it work on autotools dist
 
- src/hb-font.cc | 1 +
- 1 file changed, 1 insertion(+)
+ .circleci/config.yml | 3 ++-
+ Makefile.am          | 3 +++
+ src/Makefile.am      | 1 +
+ util/Makefile.am     | 2 ++
+ 4 files changed, 8 insertions(+), 1 deletion(-)
 
-commit bbad1b8298125d78c159ed7fdd7bde6a3f3fff56
+commit 47a047bd16c072d883a86a8dfc6ab22de9a4be5b
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Aug 20 14:46:48 2019 +0430
+Date:   Thu Mar 12 14:47:40 2020 +0330
 
-    [trak] minor, use roundf instead round to normalize the use
+    [ci] Remove the not used azure-pipelines.yml
     
-    The change to `round` wasn't intended
+    We will use GitHub Actions instead, same infrastructure anyway, or even better, CircleCI's Windows support
 
src/hb-aat-layout-trak-table.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
azure-pipelines.yml | 21 ---------------------
+ 1 file changed, 21 deletions(-)
 
-commit e67cb500e9c5f6717d0d1cd152de84d88ec7370e
+commit 834a224a507bc8b971b280483de3f067a709611f
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Mar 12 03:02:36 2020 -0700
+
+    [subset] Put a limit on the number of lookup indices that can be visited during closures
+    
+    Fixes https://crbug.com/oss-fuzz/21025
+
+ src/hb-ot-layout-common.hh                          |   3 +++
+ src/hb-ot-layout-gsubgpos.hh                        |  20 +++++++++++++++++---
+ ...case-minimized-hb-subset-fuzzer-5662792105590784 | Bin 0 -> 1047599 bytes
+ 3 files changed, 20 insertions(+), 3 deletions(-)
+
+commit 31218b41c6bf8e8d43220f7bc87af03a7c70783b
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Aug 20 13:30:34 2019 +0430
+Date:   Wed Mar 11 22:27:32 2020 +0330
 
-    [readme] add oss-fuzz badge
+    [meson] Explicit state C++11 for older compilers
     
-    Related:
-    https://github.com/google/oss-fuzz/pull/2513
-    https://github.com/systemd/systemd/commit/ce2098b7e9443cd6f31fb70af7f72308cd2962a3
+    Needed as https://circleci.com/gh/harfbuzz/harfbuzz/132417
 
README.md | 1 +
meson.build | 1 +
  1 file changed, 1 insertion(+)
 
-commit d59d89b28128cf644d76098c709b9309b834eb09
+commit 749cf378e81be77eb7d23ba1a4f26e5dbbc67037
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Aug 20 13:07:17 2019 +0430
+Date:   Wed Mar 11 22:25:27 2020 +0330
 
-    [test] Rebase 10.14 trak related test
+    [meson] test meson's own unity feature also
 
- test/shaping/data/in-house/tests/macos.tests | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ .circleci/config.yml | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 20b1a27c8a319d43a582c3efa8233b9f2c3cc73e
-Merge: 5ee1e451 37de38ad
+commit f8c8be05640618cadbbcb5e4717261e6360828d5
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Aug 20 13:04:51 2019 +0430
+Date:   Wed Mar 11 20:51:40 2020 +0330
 
-    Merge remove-coretext-96dpi-assumption, @drott
-    
-    Remove assumption about Core Text working in 96 DPI
+    [meson] Add amalgam build option
 
-commit 37de38adeae48e1855c2431a39639db873a74554
-Merge: f401f85a 5ee1e451
+ .circleci/config.yml | 7 +++++--
+ meson_options.txt    | 3 +++
+ src/meson.build      | 5 +++++
+ 3 files changed, 13 insertions(+), 2 deletions(-)
+
+commit 365d2d3cc32fc0117d88e4a161a34c952151ba58
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Aug 20 12:59:33 2019 +0430
+Date:   Wed Mar 11 20:16:36 2020 +0330
 
-    Merge branch 'master' into remove-coretext-96dpi-assumption
+    [meson] Add needed compiler flags
 
-commit 5ee1e451cfc75dc6ddbc3ae300ba7394a0cd560e
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 19 14:23:17 2019 -0700
+ meson.build | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
 
-    Minor touch-up for recent change
+commit 12df69e59c1e54137c36113a5ceb1e3000e0dc0f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 11 21:52:43 2020 +0330
 
- src/hb-ot-var-avar-table.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+    Minor, delete not needed cmake testing file
 
-commit 33489928444b94bdd2cc523dac14707eb29d667e
+ test/subset/CMakeLists.txt | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+commit 943bfeda53f6a8e0aa9b32c7cb0fcc9d01b7dcff
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 7 20:07:58 2019 +0430
+Date:   Wed Mar 11 20:30:41 2020 +0330
 
-    [avar] Implement inverse map, unmap
+    [meson] Enable more of the subset tests
 
src/hb-ot-var-avar-table.hh | 30 ++++++++++++++++++++++++------
- 1 file changed, 24 insertions(+), 6 deletions(-)
test/subset/meson.build | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
 
-commit 981f5a54c3cbc1de45ba941fdf5315c62d86b6f3
+commit c494d7abcd626c274477319859b9bcb873aca388
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 7 18:45:39 2019 +0430
+Date:   Wed Mar 11 19:44:13 2020 +0330
 
-    [fvar] Implement inverse normalize, unnormalize
+    Remove cmake testing and add meson build bot
+    
+    CMake tests are broken anyway as py3 changes so let's get rid of them
 
- src/hb-ot-var-fvar-table.hh | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
+ .circleci/config.yml        | 90 ++++-----------------------------------------
+ CMakeLists.txt              | 52 --------------------------
+ Makefile.am                 |  2 +-
+ test/CMakeLists.txt         |  4 --
+ test/Makefile.am            |  2 +-
+ test/api/CMakeLists.txt     | 36 ------------------
+ test/api/Makefile.am        |  2 +-
+ test/fuzzing/CMakeLists.txt | 27 --------------
+ test/fuzzing/Makefile.am    |  2 +-
+ test/shaping/CMakeLists.txt | 28 --------------
+ test/shaping/Makefile.am    |  2 +-
+ test/subset/Makefile.am     |  2 +-
+ 12 files changed, 13 insertions(+), 236 deletions(-)
 
-commit dcb4cd400fb44172872a20ba54baa011d748b61d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 19 11:35:37 2019 -0700
+commit 1c3f80ba136bffec00343bae87269bbc9c33ecde
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 11 19:29:47 2020 +0330
 
-    Minor
+    [meson] Minor updates
 
- src/hb-font.cc | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
+ meson.build              |  4 ++--
+ test/fuzzing/meson.build |  2 ++
+ test/subset/meson.build  | 22 +++++++++++++++++++++-
+ 3 files changed, 25 insertions(+), 3 deletions(-)
 
-commit ca54440324745afc388edac40ad1047e92567fdb
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Aug 18 11:58:04 2019 +0430
+commit 68f982415be747b8fd675d3eb55332a8277805e5
+Author: Aaron Boxer <aaron.boxer@collabora.com>
+Date:   Mon Jul 22 12:12:02 2019 -0600
 
-    Remove continuous development helper script
+    meson: update to latest master
+
+ meson_options.txt |  2 --
+ src/meson.build   | 21 ++++++++++++---------
+ util/meson.build  |  1 +
+ 3 files changed, 13 insertions(+), 11 deletions(-)
+
+commit 535186fd84d0fba3710cb33a4983efbbc074fcca
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Mon Dec 3 20:51:06 2018 +0100
+
+    meson: provide a harfbuzz-config for use from CMake
     
-    Not have used it personally for a long time, lets remove it
+    See #822 and #1437.
 
- src/dev-run.sh | 99 ----------------------------------------------------------
- 1 file changed, 99 deletions(-)
+ meson.build     | 16 ++++++++++++++++
+ src/meson.build | 14 +++++++++++++-
+ 2 files changed, 29 insertions(+), 1 deletion(-)
 
-commit 40aef1b473f63701ab901880d764e33682f13414
-Author: Khaled Hosny <khaledhosny@eglug.org>
-Date:   Fri Aug 16 01:00:30 2019 +0200
+commit 6afa7e1c3682b70ea49e3ec0f75a4e0b1deae3cc
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sun Dec 2 01:28:23 2018 +0000
 
-    [ot-shape] Keep horizontal_features array sorted
+    meson: update harfbuzz version
 
src/hb-ot-shape.cc | 2 +-
meson.build | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit da5118da77898ae4778af1ace4af52334b210dd6
-Author: Khaled Hosny <khaledhosny@eglug.org>
-Date:   Fri Aug 16 00:48:26 2019 +0200
+commit f1e5f4a78440b2f43a8a3fb753fe88971eddad8b
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sun Dec 2 00:33:43 2018 +0000
 
-    [ot-shape] Enable abvm/blwm features by default
-    
-    Core Text seems to apply them to Latin text, but Uniscribe doesn’t.
-    
-    See https://github.com/harfbuzz/harfbuzz/pull/1908#issuecomment-521819343
+    meson: tests: shaping: add aots tests
 
- src/hb-ot-shape-complex-indic.cc                   |   9 ---------
- src/hb-ot-shape-complex-khmer.cc                   |   9 ---------
- src/hb-ot-shape-complex-myanmar.cc                 |  21 ---------------------
- src/hb-ot-shape-complex-use.cc                     |  14 --------------
- src/hb-ot-shape.cc                                 |   2 ++
- test/shaping/data/in-house/Makefile.sources        |   2 +-
- .../ea3f63620511b2097200d23774ffef197e829e69.ttf   | Bin 0 -> 1804 bytes
- .../f79eb71df4e4c9c273b67b89a06e5ff9e3c1f834.ttf   | Bin 0 -> 1860 bytes
- test/shaping/data/in-house/tests/dist.tests        |   1 -
- .../data/in-house/tests/positioning-features.tests |   3 +++
- 10 files changed, 6 insertions(+), 55 deletions(-)
+ test/shaping/meson.build | 139 +++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 139 insertions(+)
 
-commit 2164bd6f29df265acdc04b84f5f94cf63b2cea8a
-Author: Khaled Hosny <khaledhosny@eglug.org>
-Date:   Fri Aug 16 00:28:41 2019 +0200
+commit 84725fb005777990890a85ba9e67566c7f2e0a74
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sun Dec 2 00:32:57 2018 +0000
 
-    [ot-shape] Enable dist feature by default (#1908)
+    meson: tests: shaping: add missing in-house tests
+
+ test/shaping/meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 8fc66dbf9f95c707f57c7714b0ee1c88338d4bd3
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sat Dec 1 21:15:33 2018 +0000
+
+    meson: tests: subset: no need to check for 'which' command any more
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1907
+    Test runner script now handles that.
 
- src/hb-ot-shape-complex-indic.cc                         |   2 --
- src/hb-ot-shape-complex-khmer.cc                         |   2 --
- src/hb-ot-shape-complex-myanmar.cc                       |   1 -
- src/hb-ot-shape-complex-use.cc                           |   1 -
- src/hb-ot-shape.cc                                       |   1 +
- test/shaping/data/in-house/Makefile.sources              |   1 +
- .../fonts/53a91c20e33a596f2be17fb68b382d6b7eb85d5c.ttf   | Bin 0 -> 2020 bytes
- test/shaping/data/in-house/tests/dist.tests              |   1 +
- 8 files changed, 3 insertions(+), 6 deletions(-)
+ test/subset/meson.build | 33 +++++++++++++--------------------
+ 1 file changed, 13 insertions(+), 20 deletions(-)
 
-commit bc27f86ffef537835f6c9dbbecbc2ee6792cb127
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 14 22:37:00 2019 +0430
+commit 0976300be4f4f3c049f48fdc29bcabb385b6e182
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sat Dec 1 21:10:57 2018 +0000
 
-    Move HB_NO_VAR to a better place in hb-font.cc
-    
-    Needed for other works
+    meson: pin glib wrap to 2.58.1 release
 
- src/hb-font.cc | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
+ subprojects/glib.wrap | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 1cc844da66ab527991ff96efdf10d97f6b626bfe
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 14 19:10:02 2019 +0430
+commit 0fcf098206e669ab4ca17e2e04c4aa52e6ef0e90
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sat Dec 1 18:22:46 2018 +0000
 
-    minor
-    
-    Use hb_font_t coords directly
+    meson: fix linking on MSVC
 
- src/hb-ot-cff2-table.cc | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
+ meson.build | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 6a194b6876db12f083ae5391ca01972168d4e68a
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 14 18:49:57 2019 +0430
+commit 4a47f1aabc300317a87c581b71e21048416d2c20
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Sat Dec 1 11:05:27 2018 +0000
 
-    Minor, remove trailing spaces in hb-font.{cc,h} as .editorconfig
+    meson: suppress some spurious compiler warnings with MSVC
 
- src/hb-font.cc | 338 ++++++++++++++++++++++++++++-----------------------------
- src/hb-font.h  |  26 ++---
- 2 files changed, 182 insertions(+), 182 deletions(-)
+ meson.build | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
 
-commit 3ae44645d60fe8271ad18b004434d475eaeb7ad6
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 14 14:34:55 2019 +0430
+commit 7eaf3754dc39f91295ba769714e01e37ddf23189
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Fri Nov 16 16:26:06 2018 +0000
 
-    Fix caret_count value when AAT is disabled
+    meson: update for changes in master
     
-    Set caret_count to zero as that is what we want to happen inside lcar when
-    there is no result.
+    And remove header files from sources list, Meson figures
+    out header dependencies by itself (via the compiler).
 
- src/hb-ot-layout.cc | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
+ src/meson.build | 104 +++++---------------------------------------------------
+ 1 file changed, 9 insertions(+), 95 deletions(-)
 
-commit a5aa67b9f288687e21ca7a9887483f7fe1cbce54
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 14 14:29:01 2019 +0430
+commit 04438554c838abcfc860a646df866cb3baed5621
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Nov 15 00:25:41 2018 +0200
 
-    [lcar] Use multiformat convention
+    meson: Update build files after rebase
 
- src/hb-aat-layout-lcar-table.hh | 115 +++++++++++++++++++++++++++++++---------
- 1 file changed, 90 insertions(+), 25 deletions(-)
+ src/meson.build          | 111 ++++++++++++++++++++++++++++++++++++++++++++---
+ test/api/meson.build     |  16 +++++--
+ test/fuzzing/meson.build |   2 -
+ test/shaping/meson.build |  64 ++++++++++++++++++++++++++-
+ 4 files changed, 181 insertions(+), 12 deletions(-)
 
-commit bfffe85dd7d7557e10ec9f9886b86fe0d8b4a7a2
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 14 13:55:49 2019 +0430
+commit 618584e9234c13369505b5064949214d0871e2d0
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Wed Nov 14 20:19:36 2018 +0000
 
-    [opbd] Use multiformat convention on the table
+    meson: rename incbase to incconfig
+    
+    Makes it clearer what it's for: config.h. See #4.
 
- src/hb-aat-layout-opbd-table.hh | 116 ++++++++++++++++++++++++++++++----------
- 1 file changed, 89 insertions(+), 27 deletions(-)
+ meson.build              | 2 +-
+ src/meson.build          | 6 +++---
+ test/api/meson.build     | 2 +-
+ test/fuzzing/meson.build | 2 +-
+ util/meson.build         | 8 ++++----
+ 5 files changed, 10 insertions(+), 10 deletions(-)
 
-commit d6206dbcc4e4ef8c034ee714e74d3a76c5333a12
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 14 11:24:06 2019 +0430
+commit 14b5c774c205a1f8db72fa68a3e626391e917e09
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 14 21:05:47 2018 +0200
 
-    [opbd] Turn OpticalBounds fields to FWORD
+    meson: Fix include directory when used as subproject
+    
+    HarfBuzz headers are under src/ not the root directory, without using
+    incsrc no headers will be found by the dependent project. I think
+    incbase is superfluous, it should be replaced by incsrc or dropped.
 
- src/hb-aat-layout-opbd-table.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/meson.build | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 6461143b44f81a4190d3f1cb02238750536f08e4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 13 22:20:54 2019 -0700
+commit 6abe7983edcf820d7b8b35e1a7dddaaf3d0f1346
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Wed Nov 14 13:49:03 2018 +0000
 
-    2.6.0
+    meson: add g-i introspection
 
- NEWS                   | 23 +++++++++++++++++++++++
- configure.ac           |  2 +-
- docs/harfbuzz-docs.xml |  4 ++++
- src/hb-font.cc         |  2 +-
- src/hb-gdi.cc          |  2 +-
- src/hb-ot-layout.cc    |  2 ++
- src/hb-ot-layout.h     |  2 +-
- src/hb-ot-meta.cc      |  4 ++--
- src/hb-ot-meta.h       |  2 +-
- src/hb-ot-metrics.cc   |  8 ++++----
- src/hb-ot-metrics.h    |  2 +-
- src/hb-version.h       |  6 +++---
- 12 files changed, 44 insertions(+), 15 deletions(-)
+ meson_options.txt |  4 ++--
+ src/meson.build   | 24 ++++++++++++++++++++++++
+ 2 files changed, 26 insertions(+), 2 deletions(-)
 
-commit e56d4ff43b97ca35a8324be2acf1c8644f3b0a24
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 13 21:02:47 2019 -0700
+commit 6147df337ee5a0b8135453443c696f85624dbfa3
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Wed Nov 14 10:12:40 2018 +0000
 
-    Rename hb_ot_meta_get_entries() to +hb_ot_meta_get_entry_tags()
+    meson: add option to disable tests
 
- docs/harfbuzz-sections.txt | 2 +-
- src/hb-ot-meta.cc          | 8 ++++----
- src/hb-ot-meta.h           | 8 ++++----
- src/test-ot-meta.cc        | 4 ++--
- test/api/test-ot-face.c    | 2 +-
- test/api/test-ot-meta.c    | 6 +++---
- 6 files changed, 15 insertions(+), 15 deletions(-)
+ meson.build       | 5 ++++-
+ meson_options.txt | 4 ++--
+ 2 files changed, 6 insertions(+), 3 deletions(-)
 
-commit aade9b70aabd8a97dd8a28cda2cf4d0694dd7350
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 13 16:09:20 2019 -0700
+commit d230a02048efb860190a6d694ecc2729d4c4fb12
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Mon Nov 12 19:41:39 2018 +0000
 
-    [pool] Fix alignment assertion
+    meson: generate .def file for MSVC symbol export on the fly
     
-    I *think* it should fix https://github.com/harfbuzz/harfbuzz/issues/1901
+    Fix symbol export with MSVC when features are disabled,
+    such as GLib. We need to generate the list of exported
+    symbols on the fly to make sure we only export symbols
+    that are actually available.
     
-    Ie. if on a system, alignof(void*) < sizeof(void*)...
+    Needs some minor modifications to the gen-def.py script:
+     - accept header list also via command line args; we can't
+       pass things to a configure_file() command via the environment
+       in Meson.
+     - strip any leading 'src/' from library filename. This might
+       be there because in Meson the script might be called from
+       the top-level directory and not the current source directory.
+    
+    Remove .def files again which had been checked in for earlier
+    versions of the Meson port.
 
- src/hb-pool.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/gen-def.py           |   2 +-
+ src/harfbuzz-gobject.def |  33 -----
+ src/harfbuzz-icu.def     |   5 -
+ src/harfbuzz-subset.def  |  12 --
+ src/harfbuzz.def         | 310 -----------------------------------------------
+ src/meson.build          |  56 ++++++---
+ 6 files changed, 38 insertions(+), 380 deletions(-)
 
-commit b31d627f151c8eeeb12ed84c3282392d6adbc5b4
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Aug 11 23:34:48 2019 +0430
+commit 4840c8237e484177b676e774ffebbdf40c654133
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Mon Nov 12 16:56:56 2018 +0000
 
-    Increase subset fuzzer timeout to 16s
+    meson: add option and build system plumbing for CoreText on macOS/iOS
     
-    To satisfy -valgrind and -tsan bots, very ugly
+    Untested though.
 
- test/fuzzing/run-subset-fuzzer-tests.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ meson.build       | 21 +++++++++++++++++++++
+ meson_options.txt |  2 ++
+ src/meson.build   |  9 +++++----
+ 3 files changed, 28 insertions(+), 4 deletions(-)
 
-commit 5b9cf191fe1fb13bd4bf914e0f4c03c3b2795a73
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Aug 11 23:07:29 2019 +0430
+commit 83ebbe4ade0c74ec83d62fcfc6ba04de87384ff5
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Mon Nov 12 16:56:56 2018 +0000
 
-    [ci] Disable vcpkg thus running the test suit in Windows
+    meson: add option and build system plumbing for DirectWrite on Windows
     
-    vcpkg apparently doesn't like to work the same way used to anymore, lets disable it
+    Untested though.
 
- appveyor.yml | 20 ++++++++++----------
- 1 file changed, 10 insertions(+), 10 deletions(-)
+ meson.build       | 10 ++++++++++
+ meson_options.txt |  2 ++
+ src/meson.build   |  9 +++++----
+ 3 files changed, 17 insertions(+), 4 deletions(-)
 
-commit 60d9f0097580a339c7ffe582cc0657698e315cea
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Aug 11 16:15:19 2019 +0430
+commit b7796a5d6984d40a44fbd828a6d3006c71f1cb3d
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Mon Nov 12 16:56:56 2018 +0000
 
-    Implement opbd table parsing
+    meson: add option and build system plumbing for uniscribe on Windows
     
-    https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6opbd.html
+    Untested though.
 
- src/Makefile.sources            |   1 +
- src/hb-aat-layout-opbd-table.hh | 111 ++++++++++++++++++++++++++++++++++++++++
- src/hb-ot-face-table-list.hh    |   1 +
- src/hb-ot-layout.cc             |   1 +
- 4 files changed, 114 insertions(+)
+ meson.build       | 14 ++++++++++++++
+ meson_options.txt |  2 ++
+ src/meson.build   |  9 +++++----
+ 3 files changed, 21 insertions(+), 4 deletions(-)
 
-commit 8762676e34cef13f4b263b377b485b199b66d4d1
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Aug 10 01:26:55 2019 +0430
+commit c81290b0c11a6bcc960ab5d043502ac3a5998abd
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Mon Nov 12 15:58:09 2018 +0000
 
-    [os2] Replace null pool addr compare by checking vital fields (#1896)
+    meson: add feature option for internal ucdn lib
 
- src/hb-ot-os2-table.hh | 4 ++--
+ meson_options.txt |  2 ++
+ src/meson.build   | 17 ++++++++---------
+ 2 files changed, 10 insertions(+), 9 deletions(-)
+
+commit 49ba211a9d4518ebba0c44e2d22946e23a2cead8
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Mon Nov 12 15:36:27 2018 +0000
+
+    meson: add options to enable/disable various features
+    
+    And fix build without GLib. Fixes #2.
+
+ meson.build       | 16 ++++++++--------
+ meson_options.txt | 21 +++++++++++++++++++++
+ util/meson.build  |  4 ++++
+ 3 files changed, 33 insertions(+), 8 deletions(-)
+
+commit c5f2e5e5abb9754460e9db37b54cd314b665a8d2
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Mon Nov 12 10:05:04 2018 +0000
+
+    meson: use proxy-libintl from frida
+
+ subprojects/proxy-libintl.wrap | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 1f926fb2b642094a15e686be6a910e709b15ebd0
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 7 20:22:20 2019 +0430
+commit 54417b127b3cfb4952788f8535ad5bfa788fb2b8
+Author: Tim-Philipp Müller <tim@centricular.com>
+Date:   Mon Nov 12 10:04:15 2018 +0000
 
-    [fvar] Use roundf instead hardcoding round logic
+    meson: fix glib git url
+    
+    It's on gitlab now.
+    
+    Fixes #1
 
- src/hb-ot-var-fvar-table.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ subprojects/glib.wrap | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 60485ab0473630c585bb96fcdc14dbe415edf4f2
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Aug 7 23:23:06 2019 +0430
+commit f65def4dc7bad244742be1f6aed2552c23d12b8f
+Author: Nirbheek Chauhan <nirbheek@centricular.com>
+Date:   Fri Oct 12 19:41:49 2018 +0530
 
-    [os2] Get defined lower/upper optical size
+    meson: Declare dependencies for use as a subproject
+    
+    Also use fallbacks for dependencies that have meson build files
 
- src/hb-ot-os2-table.hh | 17 +++++++++++++++++
- 1 file changed, 17 insertions(+)
+ meson.build     | 28 ++++++++++++++++++++++------
+ src/meson.build | 17 +++++++++++++++++
+ 2 files changed, 39 insertions(+), 6 deletions(-)
 
-commit 321d5588d4fa96bcc4aa558d2f982430031f242e
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Tue Jul 2 16:30:57 2019 -0700
+commit 14432b3ded153972b02fe2aed4f5c3d095ef5b4a
+Author: Mathieu Duponchelle <mathieu@centricular.com>
+Date:   Wed Jul 4 17:54:28 2018 +0200
 
-    [subset] Add subsetting for GPOS Lookup Type 1: Single Adjustment Positioning Subtable
+    meson: remove debug message
 
- src/hb-ot-layout-gpos-table.hh                     | 157 ++++++++++++++++++++-
- test/subset/data/Makefile.am                       |   1 +
- test/subset/data/Makefile.sources                  |   1 +
- .../gpos1_2_font.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2068 bytes
- .../gpos1_2_font.keep-layout-retain-gids.41,46.otf | Bin 0 -> 2232 bytes
- .../gpos1_2_font.keep-layout-retain-gids.43,46.otf | Bin 0 -> 2096 bytes
- ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3668 bytes
- test/subset/data/fonts/gpos1_2_font.otf            | Bin 0 -> 4564 bytes
- test/subset/data/tests/layout.gpos.tests           |  11 ++
- 9 files changed, 166 insertions(+), 4 deletions(-)
+ meson.build | 2 --
+ 1 file changed, 2 deletions(-)
 
-commit 37572882e7a685d804384eaf11f0f3e53af38341
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Tue Jun 25 13:17:30 2019 -0700
+commit 07cadc9c870c9ed49973ecf8828cbbe9e3e9daf2
+Author: Mathieu Duponchelle <mathieu@centricular.com>
+Date:   Mon Jun 18 17:18:05 2018 +0200
 
-    [subset] cmap table to use _subset2 and new iterator frameworks
+    meson: update minimum meson version
 
- src/hb-ot-cmap-table.hh                          | 670 +++++++++++------------
- src/hb-subset.cc                                 |   2 +-
- test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf | Bin 2816 -> 2532 bytes
- test/api/fonts/Roboto-Regular.abc.ttf            | Bin 2460 -> 2168 bytes
- test/api/fonts/Roboto-Regular.ac.ttf             | Bin 2268 -> 1988 bytes
- 5 files changed, 320 insertions(+), 352 deletions(-)
+ meson.build | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 06596cf90700ff76f23297141c656dfc317eece6
-Author: Khaled Hosny <khaledhosny@eglug.org>
-Date:   Sat Aug 3 13:55:34 2019 +0200
+commit 04bcdb9c73ff47a4b624608b69bde86b88505588
+Author: Mathieu Duponchelle <mathieu@centricular.com>
+Date:   Tue Jun 5 20:59:29 2018 +0200
 
-    Some styling
+    meson: misc fixes
 
README.python.md | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
meson.build | 24 +++++++++++++-----------
+ 1 file changed, 13 insertions(+), 11 deletions(-)
 
-commit 5848c890cf2f8a14c9d9e329c4f8283feac1f0c3
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Aug 3 14:19:28 2019 +0430
+commit 29c47d8eb5adf4967fe0b05013d0f53856066288
+Author: Mathieu Duponchelle <mathieu@centricular.com>
+Date:   Tue Jun 5 18:19:29 2018 +0200
 
-    [metrics] Add metrics tags documentation
+    meson: pass subdirs to pkgconfig.generate()
 
- src/hb-ot-metrics.h | 28 ++++++++++++++++++++++++++++
- 1 file changed, 28 insertions(+)
+ src/meson.build | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit 4d1872b8e019659a92a59b1d7cba6fd81ed3607d
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Aug 3 14:06:46 2019 +0430
+commit 484313ff3667f279f0a1d98021b2e5719508ad31
+Author: Mathieu Duponchelle <mathieu@centricular.com>
+Date:   Tue Jun 5 02:15:43 2018 +0200
 
-    [base] Add documentation for baseline tags from ot spec
+    meson: install
 
- src/hb-ot-layout.h | 19 ++++++++++++++++++-
- 1 file changed, 18 insertions(+), 1 deletion(-)
+ meson.build      |  1 +
+ src/meson.build  | 32 +++++++++++++++++++++++++++++---
+ util/meson.build | 14 +++++++++-----
+ 3 files changed, 39 insertions(+), 8 deletions(-)
 
-commit bbeee84a7f048633b0aaa95aa6129871a3a22164
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Aug 3 13:47:55 2019 +0430
+commit d4a723732791a4806d92828d55fd6138d857722d
+Author: Mathieu Duponchelle <mathieu@centricular.com>
+Date:   Thu May 17 16:25:22 2018 -0700
 
-    [meta] Add metadata tags documentation from ot spec
+    meson: all tests passing on Windows / MSVC
 
- src/hb-ot-meta.h | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
+ src/harfbuzz-gobject.def       |  33 +++++
+ src/harfbuzz-icu.def           |   5 +
+ src/harfbuzz-subset.def        |  12 ++
+ src/harfbuzz.def               | 310 +++++++++++++++++++++++++++++++++++++++++
+ subprojects/.gitignore         |   2 +
+ subprojects/proxy-libintl.wrap |   4 +
+ subprojects/zlib.wrap          |   4 +
+ test/fuzzing/meson.build       |   6 +-
+ test/shaping/meson.build       |   8 +-
+ test/subset/meson.build        |  27 ++--
+ 10 files changed, 393 insertions(+), 18 deletions(-)
 
-commit 521c7013abab84a0994fda3977ccd1ba3d496242
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 30 18:10:40 2019 +0430
+commit 99b26789d2ff2874ec8adf760416f2434e3093ad
+Author: Mathieu Duponchelle <mathieu@centricular.com>
+Date:   Thu May 17 14:53:20 2018 -0700
 
-    [cpal] revert port to dagger
+    meson: more windows fixes
+
+ src/meson.build  | 14 +++++++++++---
+ util/meson.build | 59 ++++++++++++++++++++++++++++++--------------------------
+ 2 files changed, 43 insertions(+), 30 deletions(-)
+
+commit 7ee650b173dc39fa998fb16aa10206dc8501a004
+Author: Mathieu Duponchelle <mathieu@centricular.com>
+Date:   Thu May 17 23:52:36 2018 +0200
+
+    meson: refactor fuzzing test
+
+ test/fuzzing/meson.build | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit fce88f9905f336aa83c934f346c44eb0829abeae
+Author: Mathieu Duponchelle <mathieu@centricular.com>
+Date:   Thu May 17 16:20:10 2018 +0200
+
+    meson: add subproject wraps for dependencies
+
+ meson.build                 | 29 ++++++++++-------------------
+ subprojects/.gitignore      |  6 ++++++
+ subprojects/expat.wrap      | 10 ++++++++++
+ subprojects/fontconfig.wrap |  5 +++++
+ subprojects/freetype2.wrap  |  5 +++++
+ subprojects/glib.wrap       |  5 +++++
+ subprojects/libffi.wrap     |  4 ++++
+ 7 files changed, 45 insertions(+), 19 deletions(-)
+
+commit 920efc0ef72eb4bb5dce02ee9f9adcdd5fdf8f7a
+Author: Mathieu Duponchelle <mathieu@centricular.com>
+Date:   Thu May 17 01:28:53 2018 +0200
+
+    Add Meson build definitions
+    
+    Fixes #490
+    
+    http://mesonbuild.com
+
+ meson-cc-tests/intel-atomic-primitives-test.c |   6 +
+ meson-cc-tests/solaris-atomic-operations.c    |   8 +
+ meson.build                                   | 189 ++++++++++++++++++++
+ src/fix_get_types.py                          |  15 ++
+ src/meson.build                               | 237 ++++++++++++++++++++++++++
+ test/api/meson.build                          |  51 ++++++
+ test/fuzzing/meson.build                      |  32 ++++
+ test/meson.build                              |   4 +
+ test/shaping/meson.build                      | 110 ++++++++++++
+ test/subset/meson.build                       |  20 +++
+ util/meson.build                              |  51 ++++++
+ 11 files changed, 723 insertions(+)
+
+commit 0615c7b64b63400b2a70a1a6dd8a57d0b0fff10c
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Mar 10 21:57:31 2020 +0200
+
+    Remove workaround for old pkg-config
     
-    It has a different semantic, maybe we should just do a zero memset,
-    letting Behdad to decide.
+    Add FreeType dependency to .pc, Ubuntu 14.4 is long dead.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1565
 
- src/hb-ot-color-cpal-table.hh | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
+ src/Makefile.am | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
 
-commit 8014ce198a09d20cb947e4a465c7d893a84c55be
+commit 78eabf247e3127413a80ad92f7d576b00a438687
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 30 17:31:34 2019 +0430
+Date:   Tue Mar 10 13:34:42 2020 +0330
 
-    [cpal] port to dagger (#1887)
+    [test] Enable OT funcs on tests that are working
 
- src/hb-ot-color-cpal-table.hh | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
+ .../data/in-house/tests/indic-joiners.tests        |  8 +--
+ test/shaping/data/in-house/tests/use.tests         |  2 +-
+ .../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/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/SHKNDA-2.tests | 32 +++++------
+ .../data/text-rendering-tests/tests/SHKNDA-3.tests | 62 +++++++++++-----------
+ 18 files changed, 196 insertions(+), 196 deletions(-)
 
-commit d67201da5a2142cb9d039a8cb2cb713556d945af
+commit 47f5a860362180f6655d49956d7d12e0d296463d
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 30 17:20:18 2019 +0430
+Date:   Tue Mar 10 13:57:46 2020 +0330
 
-    [colr] minor
+    minor, use NN on every OffsetTo<UnsizedArrayOf<>>
 
- src/hb-ot-color-colr-table.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-aat-layout-feat-table.hh | 2 +-
+ src/hb-aat-layout-trak-table.hh | 2 +-
+ src/hb-ot-meta-table.hh         | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
 
-commit 8c0a2e68ad91e55a11162da0cddb355810a4c8a0
+commit 648338c7d495f69a896348faabd2175c1e21981f
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 30 13:16:15 2019 +0430
+Date:   Tue Mar 10 13:12:00 2020 +0330
 
-    [fuzz] Add dummy call of the added APIs (#1886)
+    [gvar] Add fields docs from ot-spec as other tables
 
- test/api/test-ot-face.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
+ src/hb-ot-var-gvar-table.hh | 151 ++++++++++++++++++++++++++------------------
+ 1 file changed, 88 insertions(+), 63 deletions(-)
 
-commit e5cf9718c07c8bf1fc20cd573cef2d125c28281f
+commit 1b3b96973bc00294f00adc18104ab12997b75661
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 30 04:44:23 2019 +0430
+Date:   Tue Mar 10 12:46:09 2020 +0330
 
-    [colr][feat][meta] Port sub_array iteration to dagger (#1868)
+    [gvar] Don't copy shared tuples into gvar's accelerator
 
- src/hb-aat-layout-feat-table.hh | 37 ++++++++++++++++++-------------------
- src/hb-ot-color-colr-table.hh   | 14 ++++++--------
- src/hb-ot-meta-table.hh         |  8 +++++---
- 3 files changed, 29 insertions(+), 30 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 26 +++++++-------------------
+ 1 file changed, 7 insertions(+), 19 deletions(-)
 
-commit 9f2b4956b484b802eb37f36974c11785c90493ce
+commit 29dd1fe506d254abdf8b4cccd7dfdf48d6f5e7e6
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 30 04:42:51 2019 +0430
+Date:   Tue Mar 10 11:41:51 2020 +0330
 
-    [base] Add hb_ot_layout_get_baseline API
+    [gvar] Don't check again against face num glyph
+    
+    Done once by sanitize_shallow
 
- docs/harfbuzz-sections.txt   |  2 +
- src/hb-ot-face-table-list.hh |  6 ++-
- src/hb-ot-layout.cc          | 87 ++++++++++++--------------------------------
- src/hb-ot-layout.h           | 32 ++++++++++++++++
- test/api/test-baseline.c     |  4 +-
- 5 files changed, 63 insertions(+), 68 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 4 ----
+ 1 file changed, 4 deletions(-)
 
-commit 40a4b6ddbdc84a25f76bd4d7ff41b1322fe95b83
+commit d4b11817600e3ac444895336dd78a72dbeaf2a56
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 27 13:33:46 2019 +0430
+Date:   Tue Mar 10 11:29:56 2020 +0330
 
-    [var] Add a new API, hb_font_set_var_named_instance
+    [gvar] minor, rename gvar_table to table
 
- docs/harfbuzz-sections.txt     |  1 +
- src/hb-font.cc                 | 28 ++++++++++++++++++++++++++++
- src/hb-font.h                  |  4 ++++
- test/api/test-ot-extents-cff.c | 32 ++++++++++++++++++++++++++++++++
- 4 files changed, 65 insertions(+)
+ src/hb-ot-var-gvar-table.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
 
-commit b6a2281f1a2d29cc5797f4f266800f7141591585
+commit 5c376938644f820c7fd69991c8d2e9c4952145c4
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 30 03:45:45 2019 +0430
+Date:   Tue Mar 10 10:51:38 2020 +0330
 
-    [meta] Make values match their enum type naming
+    [gvar] Remove axisCount comparison with fvar as we runtime check that
 
- src/hb-ot-meta.h        | 10 +++++-----
- test/api/test-ot-meta.c |  4 ++--
- 2 files changed, 7 insertions(+), 7 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
 
-commit 20072a2eca8943a82e36cbb603ad31481cfc56cd
+commit ba22df36adf2d60df442330ac13618fe640f8d4c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 30 03:43:15 2019 +0430
+Date:   Tue Mar 10 10:42:20 2020 +0330
 
-    [metrics] Make values match their enum type naming
+    minor
+    
+    makes search for sanitize calls easier for me
 
- src/hb-ot-font.cc          |  12 +++---
- src/hb-ot-metrics.cc       | 100 ++++++++++++++++++++++-----------------------
- src/hb-ot-metrics.h        |  58 +++++++++++++-------------
- test/api/test-ot-metrics.c |  26 ++++++------
- 4 files changed, 98 insertions(+), 98 deletions(-)
+ src/hb-ot-color-svg-table.hh   | 2 +-
+ src/hb-ot-hmtx-table.hh        | 4 ++--
+ src/hb-ot-layout-gdef-table.hh | 4 ++--
+ src/hb-ot-layout-gsubgpos.hh   | 2 +-
+ src/hb-ot-name-table.hh        | 2 +-
+ 5 files changed, 7 insertions(+), 7 deletions(-)
 
-commit ed2965a8527ee89994c8eecf451bf71846b3ca86
+commit 8ca9df7acb6283eb68fcf3d66aacac6faafcc94c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 30 03:34:10 2019 +0430
+Date:   Tue Mar 10 10:40:05 2020 +0330
 
-    [base] Don't use enum inside the table
+    [subset] Remove not needed blob sanitize call
 
- src/hb-ot-layout-base-table.hh | 31 ++++++++++++++-----------------
- 1 file changed, 14 insertions(+), 17 deletions(-)
+ src/hb-subset-cff1.cc | 10 +++-------
+ src/hb-subset-cff2.cc | 11 +++--------
+ 2 files changed, 6 insertions(+), 15 deletions(-)
 
-commit 388fa9b32611a8726b9bbfe7ccf8cdbcd818fd70
+commit 07acd1a0426a5ba3f4924e3bb79a6715c164782c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 27 14:56:18 2019 +0430
+Date:   Sun Mar 8 23:39:24 2020 +0330
 
-    [lcar] flip for and switch position
+    [subset] Rename src_base args to base to match sanitize methods
+    
+    So it will become easier to follow that serialize methods signatures should
+    match with their sanitize methods counterparts.
 
- src/hb-aat-layout-lcar-table.hh | 16 ++++++++++------
- 1 file changed, 10 insertions(+), 6 deletions(-)
+ src/hb-open-type.hh            |  18 ++----
+ src/hb-ot-cmap-table.hh        |  37 ++++++-----
+ src/hb-ot-color-cbdt-table.hh  |   4 +-
+ src/hb-ot-layout-common.hh     | 135 +++++++++++++++++------------------------
+ src/hb-ot-layout-gpos-table.hh |  51 +++++++---------
+ src/hb-ot-layout-gsubgpos.hh   |   6 +-
+ src/hb-ot-name-table.hh        |   5 +-
+ 7 files changed, 108 insertions(+), 148 deletions(-)
 
-commit f0dd724c1e091f42f289efbebd2c50e830e59c6e
-Merge: 68ac767e 4e1da6bb
-Author: blueshade7 <ariza@typekit.com>
-Date:   Mon Jul 29 14:21:05 2019 -0700
+commit 188a0a47c225a0bf1869b2d4c14db96055c2099c
+Author: ariza <ariza@adobe.com>
+Date:   Sat Mar 7 11:02:36 2020 -0800
 
-    Merge branch 'master' into subset-varstore
+    removed default base; replaced w/ bias if required
 
-commit 4e1da6bb612b0c6386ab143dbb4ca19ff25bc2ba
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jul 29 22:03:56 2019 +0430
+ src/hb-open-type.hh            | 11 +++----
+ src/hb-ot-cmap-table.hh        | 18 +++++------
+ src/hb-ot-color-cbdt-table.hh  |  7 ++---
+ src/hb-ot-color-sbix-table.hh  | 10 +++---
+ src/hb-ot-layout-common.hh     | 70 +++++++++++++++++-------------------------
+ src/hb-ot-layout-gdef-table.hh | 20 ++++++------
+ src/hb-ot-layout-gpos-table.hh | 55 ++++++++++++++++-----------------
+ src/hb-ot-layout-gsub-table.hh |  8 ++---
+ src/hb-ot-layout-gsubgpos.hh   | 30 ++++++++----------
+ src/hb-ot-name-table.hh        |  2 +-
+ src/hb-serialize.hh            | 22 +++++--------
+ 11 files changed, 112 insertions(+), 141 deletions(-)
 
-    [metrics] Rename hb_ot_metrics_t to hb_ot_metrics_tag_t
+commit 4c3af7d406359d2addd51b2fc91d49b3a8d45c29
+Author: blueshade7 <ariza@typekit.com>
+Date:   Thu Mar 5 15:40:44 2020 -0800
 
- src/hb-ot-metrics.cc | 22 +++++++++++-----------
- src/hb-ot-metrics.h  | 16 ++++++++--------
- src/hb-ot-metrics.hh |  6 +++---
- 3 files changed, 22 insertions(+), 22 deletions(-)
+    add "add_link()" with bias arg
+    
+    issue #2227
 
-commit 2c2a2b97dbe24ae2e09018f435559c97a460bdcb
+ src/hb-ot-cff-common.hh |  2 +-
+ src/hb-serialize.hh     | 37 +++++++++++++++++++++----------------
+ 2 files changed, 22 insertions(+), 17 deletions(-)
+
+commit bdf372b24c19516c7e608b3eb254fb3720b36b6c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jul 29 22:01:13 2019 +0430
+Date:   Sun Mar 8 00:47:25 2020 +0330
 
-    [meta] Rename hb_ot_meta_t to hb_ot_meta_tag_t
+    [subset/cbdt] Release the referenced cbdt table on error
+    
+    Just accidentally spotted it, when the table has less than 4 bytes
 
- src/hb-ot-meta-table.hh | 10 +++++-----
- src/hb-ot-meta.cc       | 10 +++++-----
- src/hb-ot-meta.h        | 14 +++++++-------
- src/test-ot-meta.cc     |  4 ++--
- test/api/test-ot-meta.c |  6 +++---
- 5 files changed, 22 insertions(+), 22 deletions(-)
+ src/hb-ot-color-cbdt-table.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
 
-commit 7bcc5dfa97a43d9c5f6dfdb87b4f0d5a589ecd48
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Jul 28 20:55:50 2019 -0700
+commit 0d729b4b7237934abfca0b5738ad4383f3f22476
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 7 11:53:12 2020 +0330
 
-    [iter] Fix accumulate to accept const types
+    [avar] Fix out-of-bound read when input is bigger than all the coords
+    
+    'i' shouldn't become equal to array's length which as the increament
+    is happened at end of the loop, if the input is bigger than all the
+    table coords, it will be equal to array's length.
+    
+    Fixes https://crbug.com/oss-fuzz/21092
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-var-avar-table.hh                              |   2 +-
+ ...zz-testcase-minimized-hb-draw-fuzzer-5681465586352128 | Bin 0 -> 4448 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
 
-commit e21bdf500d4ecc3a5fd6f79aabf6232f3967035e
+commit 6924e29f62a320c91d987a91d4efa752d13c7660
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jul 28 22:59:09 2019 +0430
+Date:   Tue Mar 3 13:11:11 2020 +0330
 
-    Increase subset fuzzer timeout to 8s
+    [var] Fix hb_ot_var_get_axis_infos's offset semantic
     
-    Probably we should just remove timeout when running tsan and vaglrind here, the flaky bots
+    The API was adding offset to input's infos buffer index also which is
+    unusual between our APIs and wrong.
 
- test/fuzzing/run-subset-fuzzer-tests.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-var-fvar-table.hh | 26 ++++----------------------
+ test/api/test-var-coords.c  | 25 +++++++++++++++++++++++++
+ 2 files changed, 29 insertions(+), 22 deletions(-)
 
-commit 87454c447d705327a26c1f879e0a4f3002ae2667
+commit b7617f6b3cfa0abf10292ea79bcd53ef61a08e90
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jul 28 20:46:47 2019 +0430
+Date:   Thu Mar 5 12:07:33 2020 +0330
 
-    [base] fix logic
+    [glyf] Update to latests of ttf-parser
 
- src/hb-ot-layout-base-table.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-ot-glyf-table.hh | 45 +++++++++++++++++++++------------------------
+ 1 file changed, 21 insertions(+), 24 deletions(-)
 
-commit 69655d5bc3c7b240424545bdef197d9d7251e509
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jul 28 20:39:20 2019 +0430
+commit 0b290538646b08d391321fcbb9a1cb5f648d83ff
+Author: ariza <ariza@adobe.com>
+Date:   Wed Mar 4 22:31:21 2020 -0800
 
-    [base] minor
+    removed unused code
 
- src/hb-ot-layout-base-table.hh | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
+ src/hb-ot-cff1-table.hh     | 24 ++++++++++++------------
+ src/hb-ot-cff2-table.hh     | 10 +++++-----
+ src/hb-subset-cff-common.hh |  6 +++---
+ src/hb-subset-cff1.cc       | 16 ++++++++--------
+ 4 files changed, 28 insertions(+), 28 deletions(-)
 
-commit d9c44e7239daf59e283fecd4166c984b43d48e24
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jul 28 20:35:32 2019 +0430
+commit e8f010d7938b9f8c6065ca455c6b24968fcfd898
+Author: ariza <ariza@adobe.com>
+Date:   Wed Mar 4 16:54:27 2020 -0800
 
-    [base] Check if the returned base_coord is valid
+    removed unused code & data; rename
 
- src/hb-ot-layout-base-table.hh | 13 ++++++++-----
- 1 file changed, 8 insertions(+), 5 deletions(-)
+ src/hb-cff-interp-dict-common.hh | 13 --------
+ src/hb-ot-cff-common.hh          | 62 +-------------------------------------
+ src/hb-ot-cff1-table.hh          | 65 ++++++++--------------------------------
+ src/hb-ot-cff2-table.hh          | 44 ++++-----------------------
+ src/hb-subset-cff-common.hh      | 52 +++-----------------------------
+ src/hb-subset-cff1.cc            | 18 +++++------
+ 6 files changed, 31 insertions(+), 223 deletions(-)
 
-commit 53853c044a6382ece51393dfc3a4fe6a5f8a5a23
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jul 28 20:23:48 2019 +0430
+commit 14a7b6f1ab1926680369bf43efc9ee8d5f89402d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 26 15:09:04 2020 -0800
 
-    [meta] minor
+    Set hb_buffer_t to use array_t.reverse().
 
- src/hb-ot-meta-table.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/Makefile.am   |  6 ++++-
+ src/hb-array.hh   | 25 ++++++++++--------
+ src/hb-buffer.cc  | 18 ++-----------
+ src/test-array.cc | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 97 insertions(+), 28 deletions(-)
+
+commit 5935a1dc0b45d1256c81b214222125b47e3db345
+Author: ariza <ariza@adobe.com>
+Date:   Tue Mar 3 12:12:51 2020 -0800
+
+    add pop_discard() calls to errror returns
+
+ src/hb-subset-cff1.cc | 135 ++++++++++++++++++++++++++++++++++----------------
+ src/hb-subset-cff2.cc |  54 +++++++++++++-------
+ 2 files changed, 130 insertions(+), 59 deletions(-)
+
+commit c05458ec7f11753be95d1c3cdd7c377d07d7b981
+Author: ariza <ariza@adobe.com>
+Date:   Mon Mar 2 16:51:19 2020 -0800
+
+    update cff & cff2 subsetters
+
+ src/hb-ot-cff-common.hh                            | 201 ++++----
+ src/hb-ot-cff1-table.hh                            |  58 ++-
+ src/hb-ot-cff2-table.hh                            |   9 +-
+ src/hb-subset-cff-common.hh                        |  63 +--
+ src/hb-subset-cff1.cc                              | 526 ++++++---------------
+ src/hb-subset-cff2.cc                              | 320 ++++---------
+ test/api/fonts/AdobeVFPrototype.ac.nohints.otf     | Bin 6220 -> 4212 bytes
+ .../fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf  | Bin 6100 -> 4092 bytes
+ test/api/fonts/cff1_expert.2D,F6E9,FB00.otf        | Bin 3096 -> 1412 bytes
+ 9 files changed, 430 insertions(+), 747 deletions(-)
+
+commit 446d1e3bbce4627f2edf24bb991fe606465f2d7e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 4 23:32:50 2020 +0330
+
+    [fuzz] Add more of fixed cases
+
+ ...fuzz-testcase-hb-subset-fuzzer-5686749313892352 | Bin 0 -> 2808 bytes
+ ...case-minimized-harfbuzz_fuzzer-5017946948370432 | Bin 0 -> 1321 bytes
+ ...case-minimized-harfbuzz_fuzzer-5170405903695872 | Bin 0 -> 1271 bytes
+ ...case-minimized-harfbuzz_fuzzer-6223034666713088 | Bin 0 -> 1260 bytes
+ ...case-minimized-hb-shape-fuzzer-5154718402215936 | Bin 0 -> 226 bytes
+ ...case-minimized-hb-shape-fuzzer-5196560812474368 | Bin 0 -> 1816 bytes
+ ...case-minimized-hb-shape-fuzzer-5632586529898496 | Bin 0 -> 695 bytes
+ ...case-minimized-hb-shape-fuzzer-5642666339991552 | Bin 0 -> 32 bytes
+ ...case-minimized-hb-shape-fuzzer-5642899625082880 | Bin 0 -> 759578 bytes
+ ...case-minimized-hb-shape-fuzzer-5648999235715072 | Bin 0 -> 297 bytes
+ ...case-minimized-hb-shape-fuzzer-5652700541222912 | Bin 0 -> 232 bytes
+ ...case-minimized-hb-shape-fuzzer-5711096049041408 | Bin 0 -> 93 bytes
+ ...case-minimized-hb-shape-fuzzer-5711472756260864 | Bin 0 -> 154432 bytes
+ ...case-minimized-hb-shape-fuzzer-5742079188140032 | Bin 0 -> 16731 bytes
+ ...case-minimized-hb-shape-fuzzer-5749627240841216 | Bin 0 -> 99 bytes
+ ...case-minimized-hb-shape-fuzzer-6306977171374080 | Bin 0 -> 713443 bytes
+ ...ase-minimized-hb-subset-fuzzer-5160311461511168 | Bin 0 -> 68 bytes
+ ...ase-minimized-hb-subset-fuzzer-5640452927127552 | Bin 0 -> 32376 bytes
+ ...ase-minimized-hb-subset-fuzzer-5640889218629632 | Bin 0 -> 1490 bytes
+ ...ase-minimized-hb-subset-fuzzer-5641053680173056 | Bin 0 -> 2863 bytes
+ ...ase-minimized-hb-subset-fuzzer-5674228796358656 | Bin 0 -> 913 bytes
+ ...ase-minimized-hb-subset-fuzzer-5675720390475776 | Bin 299037 -> 131084 bytes
+ ...ase-minimized-hb-subset-fuzzer-5678476148867072 | Bin 0 -> 113915 bytes
+ ...ase-minimized-hb-subset-fuzzer-5685097303375872 | Bin 0 -> 134 bytes
+ ...ase-minimized-hb-subset-fuzzer-5695865298092032 | Bin 0 -> 139054 bytes
+ ...ase-minimized-hb-subset-fuzzer-5697351339999232 | Bin 0 -> 391689 bytes
+ ...ase-minimized-hb-subset-fuzzer-5708063625969664 | Bin 0 -> 155466 bytes
+ ...ase-minimized-hb-subset-fuzzer-5711849555755008 | Bin 0 -> 1896 bytes
+ ...ase-minimized-hb-subset-fuzzer-5733203291144192 | Bin 0 -> 34 bytes
+ ...ase-minimized-hb-subset-fuzzer-5735719311507456 | Bin 0 -> 879 bytes
+ ...ase-minimized-hb-subset-fuzzer-5745268385906688 | Bin 0 -> 291536 bytes
+ ...ase-minimized-hb-subset-fuzzer-5756658848890880 | Bin 0 -> 2734 bytes
+ ...ase-minimized-hb-subset-fuzzer-5758358618898432 | Bin 0 -> 20112 bytes
+ ...ase-minimized-hb-subset-fuzzer-5764020596899840 | Bin 0 -> 1766 bytes
+ test/fuzzing/fonts/fuzz-0-harfbuzz_hb-fuzzer       | Bin 0 -> 3266 bytes
+ 35 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 9004848560141d98dff61eda2dea01412ddc24ea
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 4 12:12:35 2020 +0330
+
+    [gvar] Make sure font's num_coords matches with gvar.axisCount
+
+ src/hb-ot-glyf-table.hh     |  2 +-
+ src/hb-ot-var-gvar-table.hh | 11 ++++++-----
+ 2 files changed, 7 insertions(+), 6 deletions(-)
 
-commit ed126d8c37c45d8d60eb0368143c6776d1fcfbff
+commit 1af3363f9e4b52d68e6dd5600cef4479614292d5
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jul 28 20:21:59 2019 +0430
+Date:   Wed Mar 4 11:32:01 2020 +0330
 
-    [base] fix build
+    [gvar] Use hb_array_t instead indexing raw pointers
 
- src/hb-ot-layout-base-table.hh | 3 +++
- 1 file changed, 3 insertions(+)
+ src/hb-ot-var-gvar-table.hh | 39 ++++++++++++++++++---------------------
+ 1 file changed, 18 insertions(+), 21 deletions(-)
 
-commit c7b22b96cc64c81248362a70f2d60d93ee520f2d
+commit 99b5b3f1b125010aea0cbb9183950fa18fe089b5
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jul 28 19:46:57 2019 +0430
+Date:   Wed Mar 4 11:15:46 2020 +0330
 
-    [base] minor
+    [gvar] Make sure TupleVarHeader has the needed size
+    
+    Fixes https://crbug.com/oss-fuzz/21026
 
- src/hb-ot-layout-base-table.hh | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
+ src/hb-ot-var-gvar-table.hh                              |   2 +-
+ ...zz-testcase-minimized-hb-draw-fuzzer-5703524300357632 | Bin 0 -> 1515 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
 
-commit a157342fce2616141ee62d68ad8e3fb93e52187e
+commit b398748d8bd61dbf61a3f8ec7e6aaf715bf57f65
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jul 28 18:54:13 2019 +0430
+Date:   Wed Mar 4 11:18:19 2020 +0330
 
-    [base] Fix use of bsearch
+    [algs] Add hb_clamp
+    
+    Similar to stl and glsl's clamp
 
- src/hb-ot-layout-base-table.hh | 94 ++++++++++++++----------------------------
- 1 file changed, 31 insertions(+), 63 deletions(-)
+ src/hb-algs.hh              | 7 +++++++
+ src/hb-ot-var-fvar-table.hh | 2 +-
+ src/hb-sanitize.hh          | 6 +++---
+ 3 files changed, 11 insertions(+), 4 deletions(-)
 
-commit eddd45653282ffff8ef002ad2163bcf8bf4f3df1
+commit 558f922788ccceaa80c31bf0e379be4c96598d13
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jul 28 02:21:54 2019 +0430
+Date:   Tue Mar 3 20:27:19 2020 +0330
 
-    [base] minor spacing
+    [fuzz] Avoid empty memcpy and ubsan complain by length checking before memcpy
 
src/hb-ot-layout-base-table.hh | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
test/fuzzing/hb-shape-fuzzer.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
 
-commit 0a18efd766b3b6cc987ee18785f7858fe2bd1c67
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 26 14:34:26 2019 -0700
+commit 6543d166fded5aefb223bcaf614985654a2dafc0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 3 20:26:46 2020 +0330
 
-    Minor
+    [fuzz] Remove the not yet fixed timeout, going to investigate
 
- src/hb-ot-layout-gsub-table.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ ...zz-testcase-minimized-harfbuzz_fuzzer-5754958982021120 | Bin 319 -> 0 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit 60d0fe2eda9c0eb67f50d61e905b584b8edc3e95
-Merge: 6d53cda1 658424b2
+commit 2bbf1c8673a549be22b316a8055c080787129f55
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 3 19:42:38 2020 +0330
+
+    [fuzz] Add more of supposed to already be fixed cases from Chromium bug tracker
+
+ ...usterfuzz-testcase-harfbuzz_fuzzer-4822416500195328 | Bin 0 -> 16800 bytes
+ ...usterfuzz-testcase-harfbuzz_fuzzer-5598263003840512 | Bin 0 -> 16800 bytes
+ ...usterfuzz-testcase-harfbuzz_fuzzer-6327734241591296 | Bin 0 -> 30 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-4601449528688640 | Bin 0 -> 99 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-4684060812378112 | Bin 0 -> 604 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-4710179695493120 | Bin 0 -> 982 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-4850271066914816 | Bin 0 -> 386 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-4977194146988032 | Bin 0 -> 520 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5012913062150144 | Bin 0 -> 283 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5103148350963712 | Bin 0 -> 112 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5151890782027776 | Bin 0 -> 318 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5157039562162176 | Bin 0 -> 363 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5163560220753920 | Bin 0 -> 520 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5180622648770560 | Bin 0 -> 110 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5221177988743168 | Bin 0 -> 936 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5334300410773504 | Bin 0 -> 99 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5644474732249088 | Bin 0 -> 568 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5677289226108928 | Bin 0 -> 47 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5719356528656384 | Bin 0 -> 330 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5754958982021120 | Bin 0 -> 319 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-5952939792531456 |   0
+ ...testcase-minimized-harfbuzz_fuzzer-6107935408390144 | Bin 0 -> 16800 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-6120104833843200 | Bin 0 -> 81 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-6128803416637440 | Bin 0 -> 4041 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-6142466903506944 | Bin 0 -> 926 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-6198448785981440 | Bin 0 -> 2357 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-6462232674959360 | Bin 0 -> 2738 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-6600932143136768 | Bin 0 -> 988 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-6603291950841856 | Bin 0 -> 1384 bytes
+ ...testcase-minimized-harfbuzz_fuzzer-6712347260092416 | Bin 0 -> 196336 bytes
+ ...case-minimized-harfbuzz_fuzzer.exe-5470269447340032 | Bin 0 -> 341 bytes
+ ...z-testcase-minimized-hb-set-fuzzer-6255224052514816 |   1 +
+ test/fuzzing/fonts/fuzz-0-harfbuzz_fuzzer              | Bin 0 -> 982 bytes
+ test/fuzzing/fonts/fuzz-1-harfbuzz_fuzzer              | Bin 0 -> 10424 bytes
+ test/fuzzing/fonts/fuzz-1-harfbuzz_fuzzer(1)           | Bin 0 -> 16144 bytes
+ test/fuzzing/fonts/fuzz-2-harfbuzz_fuzzer              | Bin 0 -> 1010 bytes
+ test/fuzzing/fonts/fuzz-2-harfbuzz_fuzzer(1)           | Bin 0 -> 1010 bytes
+ test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer              | Bin 0 -> 6791 bytes
+ test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(1)           | Bin 0 -> 2625 bytes
+ test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(2)           | Bin 0 -> 2813 bytes
+ test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(3)           | Bin 0 -> 2813 bytes
+ test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(4)           | Bin 0 -> 646 bytes
+ test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(5)           | Bin 0 -> 6791 bytes
+ 43 files changed, 1 insertion(+)
+
+commit f745777c60455e31d4f30ca0b06f06b8d062b013
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 3 19:14:41 2020 +0330
+
+    minor, debug bit, ops
+
+ src/hb-ot-layout-gsubgpos.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit f253f06cf368d74f1ec5d84c6439ae2a571e99f1
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 27 01:20:55 2019 +0430
+Date:   Tue Mar 3 18:57:13 2020 +0330
 
-    Merge pull request #1872 from darktohka/cmake-regex-fix
+    [fuzz] Add another fixed case
     
-    [cmake] Fix CMake build on newer CMake versions
+    https://crbug.com/oss-fuzz/14626
+    
+    another numerous subtables count which is fixed by d38360397
 
-commit 658424b29efbc758541a790193c42171bb7fa965
-Author: Derzsi Dániel <daniel@tohka.us>
-Date:   Fri Jul 26 22:52:03 2019 +0300
+ src/hb-ot-layout-gsubgpos.hh                           |   1 +
+ ...testcase-minimized-hb-shape-fuzzer-5712050577211392 | Bin 0 -> 647751 bytes
+ 2 files changed, 1 insertion(+)
 
-    [cmake] Fix CMake build on newer CMake versions
-    
-    Unfortunately, newer CMake versions die during regex variable extraction, causing the build to fail.
+commit d38360397609d2f3d2dd115bcb0f58d10a1bb4a3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 2 22:41:08 2020 +0330
+
+    Limit OT::Lookup subtables (#2219)
     
-    This is caused by the lack of escaping used around variables in the extract_make_variable function, causing these variables to be automatically unwrapped into empty strings.
+    Fixes https://crbug.com/oss-fuzz/13943
 
- CMakeLists.txt | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-ot-layout-common.hh                             |   7 +++++--
+ src/hb-sanitize.hh                                     |  13 +++++++++++--
+ ...testcase-minimized-hb-shape-fuzzer-5666162551029760 | Bin 0 -> 202319 bytes
+ 3 files changed, 16 insertions(+), 4 deletions(-)
 
-commit 6d53cda1baf130853e5725fe8fea1d1c5f766a79
-Author: Zero King <l2dy@icloud.com>
-Date:   Fri Jul 26 15:43:51 2019 +0000
+commit 29efd964f20625e12e697d74ae226b0d3b158aa5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 2 14:22:29 2020 +0330
 
-    [util] Fix memory leak
+    [fuzz] Add cases that marked as wontfix
+    
+    Let's see if they were really false alarms, if so, let's just have them.
 
- util/options.cc | 1 +
- 1 file changed, 1 insertion(+)
+ ...usterfuzz-testcase-hb-shape-fuzzer-5072750494875648 | Bin 0 -> 35 bytes
+ ...usterfuzz-testcase-hb-shape-fuzzer-5638729035677696 | Bin 0 -> 946 bytes
+ ...usterfuzz-testcase-hb-shape-fuzzer-5643643755429888 | Bin 0 -> 1776 bytes
+ ...usterfuzz-testcase-hb-shape-fuzzer-5644258942386176 | Bin 0 -> 61 bytes
+ ...usterfuzz-testcase-hb-shape-fuzzer-5657878543728640 | Bin 0 -> 1828 bytes
+ ...usterfuzz-testcase-hb-shape-fuzzer-5680362806575104 | Bin 0 -> 564 bytes
+ ...usterfuzz-testcase-hb-shape-fuzzer-5689920685867008 | Bin 0 -> 42 bytes
+ ...sterfuzz-testcase-hb-subset-fuzzer-5756332481708032 | Bin 0 -> 6065 bytes
+ ...estcase-minimized-hb-subset-fuzzer-5121706490593280 | Bin 0 -> 161328 bytes
+ ...estcase-minimized-hb-subset-fuzzer-5759783999635456 | Bin 0 -> 165952 bytes
+ 10 files changed, 0 insertions(+), 0 deletions(-)
 
-commit d3d99f8bb6ad77d1ac73901885acfffd3bb3e7f7
+commit 60262e4ca9dc8acd740e47b14d6e7b586c16ceac
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jul 26 16:46:04 2019 +0430
+Date:   Sat Feb 29 22:57:59 2020 +0330
 
-    [metrics] Expose raw OS2/HHEA asc/dsc values using private tags (#1867)
+    [var] Build end-points array on gvar itself
 
- src/hb-ot-metrics.cc | 16 ++++++++++++++++
- 1 file changed, 16 insertions(+)
+ src/hb-ot-glyf-table.hh     | 13 +++----------
+ src/hb-ot-var-gvar-table.hh |  8 ++++++--
+ 2 files changed, 9 insertions(+), 12 deletions(-)
 
-commit aaffe41094f8ddefad6f33e86cbd04a24dd9bfff
+commit cb65150fecee43b47cb706ed51be4f428b8f33df
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jul 26 01:14:37 2019 +0430
+Date:   Sat Feb 29 16:12:54 2020 +0330
 
-    [meta] minor, simplify iterator
+    [draw] minor
 
src/hb-ot-meta-table.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
test/fuzzing/hb-draw-fuzzer.cc | 6 ------
+ 1 file changed, 6 deletions(-)
 
-commit 62932c14bd256f10031380047ededd93a2aacd88
+commit 44169f3396af0c60ebc74fd4c624988d871dcf0f
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jul 26 00:30:29 2019 +0430
+Date:   Sat Feb 29 16:04:03 2020 +0330
 
-    [meta] Rename ot-metadata to ot-meta per review
+    [draw] Fix invalid rendering of some glyph on Estedad-VF
+    
+    Basically reverts 11f3fca so I can do the same tested and better later
+    
+    Fixes #2215
 
- docs/harfbuzz-sections.txt                      |  7 +++---
- src/Makefile.am                                 |  8 +++----
- src/Makefile.sources                            |  4 ++--
- src/harfbuzz.cc                                 |  2 +-
- src/hb-ot-meta-table.hh                         |  8 +++----
- src/{hb-ot-metadata.cc => hb-ot-meta.cc}        | 22 +++++++++---------
- src/{hb-ot-metadata.h => hb-ot-meta.h}          | 30 ++++++++++++-------------
- src/hb-ot.h                                     |  2 +-
- src/{test-ot-metadata.cc => test-ot-meta.cc}    | 10 ++++-----
- test/api/Makefile.am                            |  2 +-
- test/api/{test-ot-metadata.c => test-ot-meta.c} | 26 ++++++++++-----------
- 11 files changed, 61 insertions(+), 60 deletions(-)
+ src/hb-ot-glyf-table.hh       |  15 ++++++++---
+ src/hb-ot-var-gvar-table.hh   |  26 ++++++------------
+ test/api/fonts/Estedad-VF.ttf | Bin 0 -> 94364 bytes
+ test/api/fonts/README         |   2 ++
+ test/api/test-draw.c          |  61 ++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 83 insertions(+), 21 deletions(-)
 
-commit 821d9e9034c57c5c593741284b134c76cc3c7c0f
+commit 86c40b3a1d8c7d970ce1b450f4dfadef8d9d0126
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jul 26 00:08:58 2019 +0430
+Date:   Sat Feb 29 14:11:46 2020 +0330
 
-    Use .sub_array for DataMap tags iteration
+    [fuzz/draw] Call _get_glyph_extents
+    
+    Other render related APIs also may be added also later such
+    as ot-color and future rendering things.
 
src/hb-ot-meta-table.hh | 8 +++-----
- 1 file changed, 3 insertions(+), 5 deletions(-)
test/fuzzing/hb-draw-fuzzer.cc | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
 
-commit a250af98ae74c94ac3aa069e6e5958a937586bfc
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 24 03:10:41 2019 +0430
+commit 5ab50eebd7846b79528058a1e4e83bb181416c30
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Feb 29 01:32:29 2020 -0800
 
-    [meta] Add max value to hb_ot_metadata_t
+    collect_unicodes() with clamp, calling add_range()
+    
+    Use add_range instead an inner loop, clamp its input number by
+    number of glyphs a face has.
+    
+    Even the face cmap12 and 13 have 32-bit hb_codepoint_t, which is here
+    used to make timeout, face's maxp has 16-bit gid limitation at least for now,
+    using that makes sure we both fix and the timeout and don't need to change
+    much things here also in order to support 32-bit gids also someday.
+    
+    Fixes #2204
 
- src/hb-ot-metadata.h | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
+ src/hb-face.cc                                     |   2 +-
+ src/hb-ot-cmap-table.hh                            |  30 ++++++++++++---------
+ .../fonts/1746cad6bc3fb2b355db50a5af37c9b58d9ad376 | Bin 0 -> 23293 bytes
+ 3 files changed, 19 insertions(+), 13 deletions(-)
 
-commit 80e246a1f2b3c4e3c25a4a3ec042e7610944abd4
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 24 03:08:34 2019 +0430
+commit 414529e45a4cb3ee444c2dd5a2a9cbd6be0598af
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 28 15:15:55 2020 -0800
 
-    [meta] Add a test program for metadata
+    [subset] Limit the number of feature indices processed during script subsetting.
 
- src/Makefile.am         |  5 ++++
- src/test-ot-metadata.cc | 70 +++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 75 insertions(+)
+ src/hb-ot-layout-common.hh   | 20 ++++++++++++++++++--
+ src/hb-ot-layout-gsubgpos.hh |  2 +-
+ 2 files changed, 19 insertions(+), 3 deletions(-)
 
-commit bc65ebbce765545bc4455d8ae5ba4a6a99201e41
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 24 02:28:09 2019 +0430
+commit 75622b0d246eefe5d912a6918d14c7250ebaea78
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 28 14:11:48 2020 -0800
 
-    [meta] hb_ot_metadata_get_entries, tags iteration API
+    [subset] Limit the number of features processed in the feature closure.
 
- src/hb-ot-meta-table.hh     | 17 +++++++++++++++++
- src/hb-ot-metadata.cc       | 28 ++++++++++++++++++++++++----
- src/hb-ot-metadata.h        |  8 +++++++-
- test/api/test-ot-metadata.c | 26 ++++++++++++++++++++++++++
- 4 files changed, 74 insertions(+), 5 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
 
-commit 3ac03bd67cb9f4a72e636bf56bc4a79e04bcba62
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jul 22 23:35:08 2019 +0430
+commit 410b4881d088e924781385d1958878f2923645d0
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 28 10:38:27 2020 -0800
 
-    [meta] New API, hb_ot_metadata_reference_entry for fetching meta entries
+    [subset] Add fuzzer timeout testcase.
 
- docs/harfbuzz-sections.txt   |   6 +++++
- src/Makefile.sources         |   2 ++
- src/harfbuzz.cc              |   1 +
- src/hb-config.hh             |   1 +
- src/hb-ot-face-table-list.hh |   4 ++-
- src/hb-ot-face.cc            |   1 +
- src/hb-ot-layout.cc          |   1 -
- src/hb-ot-meta-table.hh      |  20 +++++++++++++++
- src/hb-ot-metadata.cc        |  57 ++++++++++++++++++++++++++++++++++++++++++
- src/hb-ot-metadata.h         |  57 ++++++++++++++++++++++++++++++++++++++++++
- src/hb-ot.h                  |   1 +
- test/api/Makefile.am         |   1 +
- test/api/fonts/meta.ttf      | Bin 0 -> 320 bytes
- test/api/test-ot-metadata.c  |  58 +++++++++++++++++++++++++++++++++++++++++++
- 14 files changed, 208 insertions(+), 2 deletions(-)
+ ...estcase-minimized-hb-subset-fuzzer-6276691949518848 | Bin 0 -> 184722 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit aab8e084873eb098c55ed2569c15bb308c59e436
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jul 26 02:19:22 2019 +0430
+commit c66ee213b70eb204b750675d60f25549d942d3d7
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 27 12:25:01 2020 -0800
 
-    minor spacing fix (#1869)
+    Limit the number of feature indices processed during feature collection.
 
- src/hb-open-type.hh     | 16 ++++++++--------
- src/hb-ot-vorg-table.hh |  2 +-
- src/hb-vector.hh        |  8 ++++----
- 3 files changed, 13 insertions(+), 13 deletions(-)
+ src/hb-ot-layout-common.hh |  5 +++++
+ src/hb-ot-layout.cc        | 14 +++++++++++---
+ 2 files changed, 16 insertions(+), 3 deletions(-)
 
-commit d791446a930f8e2009c5ab5ea389da98d1ed9b95
+commit e57ced5fc06bd14a579a983db73e94416f6fedf4
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jul 26 02:12:06 2019 +0430
+Date:   Fri Feb 28 23:29:05 2020 +0330
 
-    [feat] minor
+    [gvar] Add other possibly fixed fuzzer case
+    
+    Speculatively should've been fixed by 61208401
+    
+    https://crbug.com/oss-fuzz/20924 related
 
- src/hb-aat-layout-feat-table.hh | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
+ ...zz-testcase-minimized-hb-draw-fuzzer-5750654771658752 | Bin 0 -> 4004 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit 356b68a00afaf972908cb2a478170e3933eaf974
+commit 758fda728ba5c9d4542ea2385482f7d090ffda0d
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Jul 25 23:22:00 2019 +0430
+Date:   Fri Feb 28 23:19:06 2020 +0330
 
-    [metrics] Add a test that actually practices variation (#1858)
+    [glyf] Don't accept gids higher than maxp's glyphs number
+    
+    This specially becomes concerning on sub-components where a gvar table
+    that is sanitized using maxp's glyphs number overflows when a high gid
+    accepted here goes to it, maybe an additional check can be put there
+    also, this however feels to be enough.
+    
+    Fixes https://crbug.com/oss-fuzz/20944
 
- test/api/fonts/TestCFF2VF.otf | Bin 0 -> 3636 bytes
- test/api/test-ot-metrics.c    |  28 ++++++++++++++++++++++++++--
- 2 files changed, 26 insertions(+), 2 deletions(-)
+ src/hb-ot-glyf-table.hh                                  |   1 +
+ ...zz-testcase-minimized-hb-draw-fuzzer-5668491560747008 | Bin 0 -> 8771 bytes
+ 2 files changed, 1 insertion(+)
 
-commit a744fdc6c8217d0d4bfce30e638ed2e5200cf380
+commit e642aab1166cf7782fb55f1721eba057c2bfd609
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Jul 25 14:49:02 2019 +0430
+Date:   Fri Feb 28 22:24:25 2020 +0330
 
-    Add _MAX_VALUE to hb_ot_metrics_t (#1861)
+    [subset] Add source_blob as a hb_subset_context_t field (#2203)
+    
+    So no more double sanitizing source table.
 
- src/hb-ot-metrics.cc | 4 ++--
- src/hb-ot-metrics.h  | 4 +++-
- 2 files changed, 5 insertions(+), 3 deletions(-)
+ src/hb-ot-color-sbix-table.hh | 23 ++++++++---------------
+ src/hb-ot-var-gvar-table.hh   | 27 ++++++---------------------
+ src/hb-subset.cc              |  2 +-
+ src/hb-subset.hh              |  5 ++++-
+ 4 files changed, 19 insertions(+), 38 deletions(-)
 
-commit 069872c51b31fe1a618e3ca5c3b0ab8ccba0cf81
+commit e90213868b121af72d19b6022a671ebe72ff55aa
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Jul 25 14:27:43 2019 +0430
+Date:   Fri Feb 28 21:24:27 2020 +0330
 
-    minor
+    Revert "collect_unicodes() to check gid < num_glyphs with cmap 12"
+    
+    Didn't fix the case actually, making bots to fail.
+    
+    This reverts commit 15b43a410400c74a32d40f4b89dbea02fa7cd6e1.
 
- src/hb-ot-layout.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-face.cc                                     |   2 +-
+ src/hb-ot-cmap-table.hh                            |  30 +++++++++------------
+ .../fonts/1746cad6bc3fb2b355db50a5af37c9b58d9ad376 | Bin 23293 -> 0 bytes
+ 3 files changed, 13 insertions(+), 19 deletions(-)
 
-commit 737eb85a4ec8861791157d83dd170ac48fa2cfc7
+commit 61208401f41f5d41f32d436cee500c630706f6be
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Jul 25 14:26:30 2019 +0430
+Date:   Fri Feb 28 21:09:07 2020 +0330
 
-    Add _MAX_VALUE to disabled baseline types enum
+    [gvar] Use hb_bytes_t.check_range instead having in house one
+    
+    And use TupleVarHeader calculated size for validity check.
+    
+    Fixes https://crbug.com/oss-fuzz/20919 and possibly other gvar related issues
 
- src/hb-ot-layout.cc | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
+ src/hb-ot-var-gvar-table.hh                        |  36 ++++++++-------------
+ ...tcase-minimized-hb-draw-fuzzer-5686960406659072 | Bin 0 -> 4004 bytes
+ 2 files changed, 13 insertions(+), 23 deletions(-)
 
-commit dd9a0ed3f0c0a8a94e107689318463d62414cf60
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 24 00:47:19 2019 +0430
+commit 15b43a410400c74a32d40f4b89dbea02fa7cd6e1
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Feb 28 08:45:39 2020 -0800
 
-    Replace 0x7FFFFFFFu in enums with HB_TAG_MAX_SIGNED
+    collect_unicodes() to check gid < num_glyphs with cmap 12
+    
+    fixes #2204
 
- src/hb-aat-layout.h | 4 ++--
- src/hb-ot-var.h     | 2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
+ src/hb-face.cc                                     |   2 +-
+ src/hb-ot-cmap-table.hh                            |  30 ++++++++++++---------
+ .../fonts/1746cad6bc3fb2b355db50a5af37c9b58d9ad376 | Bin 0 -> 23293 bytes
+ 3 files changed, 19 insertions(+), 13 deletions(-)
 
-commit 636ae422372ed7f17b695e78c9c9015188b204e8
+commit 868ecf7b2660747f7628df2b3a17a8d68b0325eb
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jul 22 22:50:21 2019 +0430
+Date:   Fri Feb 28 19:50:30 2020 +0330
 
-    minor, comment out meta table in list till its use
+    [draw] Add fuzzer runner
 
- src/hb-ot-face-table-list.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ test/fuzzing/Makefile.am              |   3 +
+ test/fuzzing/run-draw-fuzzer-tests.py | 107 ++++++++++++++++++++++++++++++++++
+ 2 files changed, 110 insertions(+)
 
-commit 04c11a19b75663af35d16c827e295aa2e555d110
-Merge: 41ab56e0 c9796d15
-Author: Khaled Hosny <khaledhosny@eglug.org>
-Date:   Mon Jul 22 16:44:47 2019 +0200
+commit b0749bfaa53cdf34180b2d15c6e3840f03d5ece2
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Feb 14 13:49:44 2020 -0800
 
-    Merge pull request #1851 from khaledhosny/fix-sbix-extents
-    
-    Fix sbix glyph extents
+    [subset] GDEF LigCaretList subsetting support
 
-commit 41ab56e09586b675b1c5de745cf5f520a808bba1
+ src/hb-ot-layout-gdef-table.hh | 73 +++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 72 insertions(+), 1 deletion(-)
+
+commit 002f0e20c4c6e35e0ff379ff58cfe1e19067133a
+Author: ariza <ariza@adobe.com>
+Date:   Thu Feb 27 17:34:26 2020 -0800
+
+    reimplment serialize_int using check_assign()
+
+ src/hb-cff-interp-common.hh | 23 ++++++++++-------------
+ src/hb-ot-cff-common.hh     | 24 +++++++++++++-----------
+ src/hb-subset-cff1.cc       |  2 +-
+ 3 files changed, 24 insertions(+), 25 deletions(-)
+
+commit 14b134379d7a34af1a78b0ea930a6fab79779723
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jul 22 18:46:52 2019 +0430
+Date:   Thu Feb 27 15:58:58 2020 +0330
 
-    Implement meta table parsing
+    [gvar] Minor, check whether sub_array result also have enough room
 
- src/Makefile.sources         |  1 +
- src/hb-ot-face-table-list.hh |  1 +
- src/hb-ot-layout.cc          | 15 ++++----
- src/hb-ot-meta-table.hh      | 89 ++++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 99 insertions(+), 7 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
 
-commit a51aa951b5ad8da4ac7effc891437345e012a0ac
+commit 8eba66c1c6d19bcc779a3b4e7b68251511986ee8
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jul 22 18:35:55 2019 +0430
+Date:   Thu Feb 27 15:58:58 2020 +0330
 
-    [metrics] Fix _get_variation API to works with actual coord values
+    [gvar] Fix invalid memory access by refactoring GlyphVarData fetch logic
+    
+    Fixes https://crbug.com/oss-fuzz/20906
 
- src/hb-ot-metrics.cc       | 16 ++++++++--------
- src/hb-ot-metrics.h        |  2 +-
- test/api/test-ot-metrics.c |  2 +-
- 3 files changed, 10 insertions(+), 10 deletions(-)
+ src/hb-ot-var-gvar-table.hh                        |  70 +++++++++++----------
+ ...tcase-minimized-hb-draw-fuzzer-5088336521986048 | Bin 0 -> 1413 bytes
+ 2 files changed, 36 insertions(+), 34 deletions(-)
 
-commit 77141dff7d73fa6290f51c9e1ca56ce51a5deec0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jul 22 07:48:32 2019 -0400
+commit f44e1dc07d24abb4c9311d4a55725219665ca84c
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Thu Feb 27 02:02:22 2020 +0200
 
-    [metrics] _-prefix internal symbol
+    Fix spelling.
 
- src/hb-ot-font.cc    | 12 ++++++------
- src/hb-ot-metrics.cc |  8 ++++----
- src/hb-ot-metrics.hh |  6 +++---
- 3 files changed, 13 insertions(+), 13 deletions(-)
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 89228ccb9a81b728bc9955082c17c68c848c50c4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jul 22 07:07:37 2019 -0400
+commit 5ad761b943721c3541d0ca0472f34f7d54b89b5b
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Feb 11 13:05:40 2020 -0800
 
-    Fix warning on IBM compilers
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1852
+    [subset] GDEF MarkGlyphSets subsetting support
 
- src/hb.hh | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ src/hb-ot-layout-gdef-table.hh                     |  43 ++++++++++++++++++++-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ .../Roboto-Regular.default.1E00,303.ttf            | Bin 0 -> 2456 bytes
+ .../layout.gdef/Roboto-Regular.default.303.ttf     | Bin 0 -> 2128 bytes
+ .../Roboto-Regular.default.309,20,30F.ttf          | Bin 0 -> 2220 bytes
+ .../layout.gdef/Roboto-Regular.default.323.ttf     | Bin 0 -> 2020 bytes
+ .../Roboto-Regular.default.41,42,43.ttf            | Bin 0 -> 2480 bytes
+ .../Roboto-Regular.drop-hints.1E00,303.ttf         | Bin 0 -> 1204 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.303.ttf  | Bin 0 -> 1012 bytes
+ .../Roboto-Regular.drop-hints.309,20,30F.ttf       | Bin 0 -> 1068 bytes
+ .../layout.gdef/Roboto-Regular.drop-hints.323.ttf  | Bin 0 -> 952 bytes
+ .../Roboto-Regular.drop-hints.41,42,43.ttf         | Bin 0 -> 1188 bytes
+ .../Roboto-Regular.keep-gdef.1E00,303.ttf          | Bin 0 -> 2520 bytes
+ .../layout.gdef/Roboto-Regular.keep-gdef.303.ttf   | Bin 0 -> 2192 bytes
+ .../Roboto-Regular.keep-gdef.309,20,30F.ttf        | Bin 0 -> 2288 bytes
+ .../layout.gdef/Roboto-Regular.keep-gdef.323.ttf   | Bin 0 -> 2084 bytes
+ .../Roboto-Regular.keep-gdef.41,42,43.ttf          | Bin 0 -> 2536 bytes
+ test/subset/data/tests/layout.gdef.tests           |  14 +++++++
+ 19 files changed, 58 insertions(+), 1 deletion(-)
+
+commit fcd7f33bbb12d66b3a50caa448cb91ef7c0daa9e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Feb 10 10:36:50 2020 -0800
+
+    [subset] GDEF glyphClassDef subsetting support
+    glyphClassDef uses the same ClassDef format. However, glyphClassDef table
+    uses predefined class values so we do not remap class values.
+
+ src/hb-ot-layout-common.hh                         |  42 ++++++++++++---------
+ ...Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf | Bin 0 -> 2148 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.25771.ttf   | Bin 0 -> 1860 bytes
+ ...lar.keep-gdef.3042,3044,3046,3048,304A,304B.ttf | Bin 0 -> 2572 bytes
+ ...lar.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 0 -> 2816 bytes
+ .../Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf      | Bin 0 -> 2116 bytes
+ ...lar.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 0 -> 3112 bytes
+ .../japanese/Mplus1p-Regular.keep-gdef.660E.ttf    | Bin 0 -> 1852 bytes
+ test/subset/data/profiles/keep-gdef.txt            |   1 +
+ test/subset/data/tests/japanese.tests              |   1 +
+ 10 files changed, 26 insertions(+), 18 deletions(-)
+
+commit 50129b03a1cc0bb08231d46571a34aca85b7b14f
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 25 17:39:59 2020 -0800
 
-commit c9796d15e1ec5f8939f8b1ae368cb3352b6a9cb9
-Author: Khaled Hosny <khaledhosny@eglug.org>
-Date:   Mon Jul 22 03:57:24 2019 +0200
+    Add a reverse () call to hb_array_t.
 
-    Fix sbix glyph extents
-    
-    * The ‘height’ needs to be negated since the API returns “distance from
-      top to bottom side”.
-    * Similarly, the ‘y_offset‘ needs to be added to the height to get the
-      ‘y_bearing’, since sbix’s offset is “the point in the glyph relative
-      to its lower-left corner which corresponds to the origin” while
-      ‘y_bearing’ is the “top side of glyph from origin”.
-    
-    With these changes the sbix glyph metrics return values similar to other
-    tables, as they were otherwise unusable.
+ src/hb-array.hh         | 15 +++++++++++++++
+ src/hb-ot-cmap-table.hh | 26 +++++++++++++++-----------
+ 2 files changed, 30 insertions(+), 11 deletions(-)
 
- src/hb-ot-color-sbix-table.hh                            |   4 ++--
- test/api/test-ot-color.c                                 |   4 ++--
- .../fonts/fcbaa518d3cce441ed37ae3b1fed6a19e9b54efd.ttf   | Bin 0 -> 3128 bytes
- test/shaping/data/in-house/tests/color-fonts.tests       |   1 +
- 4 files changed, 5 insertions(+), 4 deletions(-)
+commit 38c6598c1c7d645b46970ec2e7f345d45dd38380
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 25 17:20:05 2020 -0800
 
-commit 759f3bd486c99bb09fb9fa5f42e621ec21399df8
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jul 22 02:06:07 2019 +0430
+    Switch to C style comments.
 
-    [metrics] Don't use metrics API in _common
-    
-    As it is exposed with a different condition
+ src/hb-ot-cmap-table.hh | 38 +++++++++++++++++++++-----------------
+ 1 file changed, 21 insertions(+), 17 deletions(-)
 
- src/hb-ot-metrics.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+commit 52b6e0baa0c479511d3e06d3a71a65f73e88cfdc
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 10 12:26:40 2020 -0800
 
-commit eb8bd2f7eccde483d33406f102c69260fde6fe23
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 16 22:27:01 2019 +0430
+    When serializing cmap14 order the offsets from smallest to largest.
+    Current versions of OTS fail fonts with cmap 14's who's last offset does not point to the a block at the end of the table.
 
-    Add hb_gdi_face_create API
-    
-    Based on Konstantin Ritt work posted on mailing list
+ src/hb-ot-cmap-table.hh | 115 ++++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 83 insertions(+), 32 deletions(-)
 
- CMakeLists.txt             |  8 +++++
- appveyor.yml               |  2 +-
- configure.ac               | 23 +++++++++++++++
- docs/harfbuzz-sections.txt |  5 ++++
- src/Makefile.am            |  8 +++++
- src/Makefile.sources       |  3 ++
- src/harfbuzz.cc            |  1 +
- src/hb-directwrite.cc      |  9 ++----
- src/hb-gdi.cc              | 73 ++++++++++++++++++++++++++++++++++++++++++++++
- src/hb-gdi.h               | 39 +++++++++++++++++++++++++
- src/hb-uniscribe.cc        |  7 -----
- src/hb.hh                  |  5 ++++
- 12 files changed, 168 insertions(+), 15 deletions(-)
+commit a99134c5bee945e144b9429ba4a4d58ff18313b4
+Author: ariza <ariza@adobe.com>
+Date:   Wed Feb 26 09:58:03 2020 -0800
 
-commit 3d03bb84d44bc9ef8a77e974d0e937a3385ffb92
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jul 21 12:38:04 2019 +0430
+    add oss-fuzz 20886 test file
 
-    [metrics] minor, tweak comment
+ ...-testcase-minimized-hb-subset-fuzzer-5641370503217152 | Bin 0 -> 3099 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
- src/hb-ot-metrics.cc | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+commit d0aaba5c5087781c7231e26fdd190c65baebde95
+Author: ariza <ariza@adobe.com>
+Date:   Wed Feb 26 09:35:32 2020 -0800
 
-commit e540d402f6120e8761ff655bdbffb07d91a5f643
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 19 11:19:31 2019 -0700
+    fixes oss-fuzz 20886
+    
+    hb_set_t::resize () is needed after compact()
 
-    [docs] Minor
+ src/hb-set.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
- docs/harfbuzz-sections.txt | 2 ++
- src/hb-ot-math.h           | 2 +-
- 2 files changed, 3 insertions(+), 1 deletion(-)
+commit 05a25c1a5bfbc70ed9151ab9c368ddc6aa4e8fd4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 26 19:35:27 2020 +0330
 
-commit 00e13985fbc5291850b8ea3d021e5f83c8a297e3
+    [cff] minor, remove unused fields
+
+ src/hb-ot-cff1-table.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 9fe0dc3464391e1cd51c01c499b6110d99895d25
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 23:03:51 2019 +0430
+Date:   Wed Feb 26 17:40:44 2020 +0330
 
-    Revert hhea fallback to OS/2 to its reverse way
+    [draw] Pass draw_helper_t itself around instead recreating it
     
-    As searching number of hhea having fonts beats the number of OS/2
-    having ones in macOS 10.14.2
+    Specially helpful if we want to change the design
 
- src/hb-ot-metrics.cc | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
+ src/hb-draw.cc          |  7 ++++---
+ src/hb-draw.hh          |  4 ++--
+ src/hb-ot-cff1-table.cc | 43 ++++++++++++++++++++-----------------------
+ src/hb-ot-cff1-table.hh |  4 ++--
+ src/hb-ot-cff2-table.cc | 23 ++++++++++-------------
+ src/hb-ot-cff2-table.hh |  4 ++--
+ src/hb-ot-glyf-table.hh | 42 ++++++++++++++++++++----------------------
+ 7 files changed, 60 insertions(+), 67 deletions(-)
 
-commit c13ef9cc64a447e74abfed75f4f418bf644be88d
+commit 1b8b8638980d4276f424e8c4f59731f50832d119
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 15:01:37 2019 +0430
+Date:   Wed Feb 26 16:36:48 2020 +0330
 
-    Bring back asc/desc abs logic used to be in hmtx table
+    minor
 
src/hb-ot-metrics.cc | 21 ++++++++++++++++++---
- 1 file changed, 18 insertions(+), 3 deletions(-)
test/fuzzing/hb-draw-fuzzer.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 772e62688cd72c02910f623653d2ec8ef6990928
+commit 4cdaa9d1f4ca4e9225fab6383f16d24f9a323995
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 14:50:31 2019 +0430
+Date:   Wed Feb 26 16:27:04 2020 +0330
 
-    Make HB_TINY builds work again by separating the always needed part
+    [glyf] Simplify contour end logic
+    
+    So no need for infinite loop here
 
- src/hb-ot-font.cc    | 12 +++++-----
- src/hb-ot-metrics.cc | 62 ++++++++++++++++++++++++++++++++++++++++------------
- src/hb-ot-metrics.hh |  5 +++++
- 3 files changed, 59 insertions(+), 20 deletions(-)
+ src/hb-ot-glyf-table.hh | 53 +++++++++++++++++++++----------------------------
+ 1 file changed, 23 insertions(+), 30 deletions(-)
 
-commit cb704337407ae9ccb57ae7631567002028b93c84
+commit 132fcfbc4733c521733e9fea84e19c58746980f2
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 14:33:57 2019 +0430
+Date:   Wed Feb 26 16:15:17 2020 +0330
 
-    Merge _get_position_internal into _get_position
+    [fuzz] minor don't abort main.cc when the file was empty or not found
 
- src/hb-ot-metrics.cc | 143 ++++++++++++++++++---------------------------------
- src/hb-ot-metrics.hh |   5 --
- 2 files changed, 49 insertions(+), 99 deletions(-)
+ test/fuzzing/main.cc | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
 
-commit ac3518af58464b33f1b16b34b8846c302b935208
+commit 84163c83d398665c694b1c90d1a94344e95464b7
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 14:03:36 2019 +0430
+Date:   Wed Feb 26 15:58:11 2020 +0330
 
-    Define post table only when used
+    [draw] Skip commands and paths not contributing anything
+    
+    They aren't contributing to rendering and making issue for stroking, let's skip them
+    ourselves as Skia does also https://skia-review.googlesource.com/c/skia/+/268166
+    
+    They are useful for extracting extents and so which that functionality won't be effected by this change.
 
- src/hb-ot-face-table-list.hh | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-draw.hh                 | 22 ++++++++++++++++------
+ test/api/test-draw.c           |  8 ++++----
+ test/fuzzing/hb-draw-fuzzer.cc |  8 +++++++-
+ 3 files changed, 27 insertions(+), 11 deletions(-)
 
-commit 471f798ace08b4551f0c9ead6855a4e49b72ba25
+commit 073d4954e01c45e8dd1cf63a53ad35563f46ef17
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 14:00:20 2019 +0430
+Date:   Wed Feb 26 15:40:40 2020 +0330
 
-    Merge ot-metrics-internal.cc with ot-metrics now that isn't needed in subset
+    [draw] Port glyf path extract to draw_helper_t
 
- src/Makefile.sources          |   3 --
- src/harfbuzz.cc               |   1 -
- src/hb-ot-metrics-internal.cc | 100 ------------------------------------------
- src/hb-ot-metrics.cc          |  71 +++++++++++++++++++++++++++++-
- 4 files changed, 70 insertions(+), 105 deletions(-)
+ src/hb-draw.hh          |  44 +++++++++++++-------
+ src/hb-ot-glyf-table.hh | 104 +++++++++++-------------------------------------
+ 2 files changed, 52 insertions(+), 96 deletions(-)
 
-commit 29444d7e9fd5007bf39efa2cf57a0117aabfc770
+commit 0ebf3a4e62f5f54f3557e954f4493b4de43990dd
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 13:52:21 2019 +0430
+Date:   Wed Feb 26 15:14:41 2020 +0330
 
-    Don't cache ascender/descender metrics
+    [draw] Move common CFF path building logic to draw_helper_t
 
- src/hb-ot-font.cc       | 24 ++++++++----------------
- src/hb-ot-hmtx-table.hh | 20 --------------------
- 2 files changed, 8 insertions(+), 36 deletions(-)
-
-commit 5e28c2654d030655d7b93ec0d6213d2b9fb2956e
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 14:08:11 2019 +0430
+ src/hb-draw.hh          | 70 +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cff1-table.cc | 60 +++++++++---------------------------------
+ src/hb-ot-cff2-table.cc | 67 ++++++++--------------------------------------
+ 3 files changed, 93 insertions(+), 104 deletions(-)
 
-    [doc] minor, improve hb-ot-metrics doc a bit
+commit c400cb8863abb5f894e021da5d524c1e28b1e980
+Merge: c21eb86b 4081439d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Feb 25 16:06:03 2020 -0800
 
- src/hb-ot-metrics.cc | 11 ++++++-----
- 1 file changed, 6 insertions(+), 5 deletions(-)
+    Re-implement hb_set_t::del_range (#2194)
+    
+    * optimize hb_set_del_range()
+    
+    fix issue #2193
+    
+    * fixed bug & added tests
+    
+    * coding & comment tweaks
 
-commit ac8b6e330a443a66c3e0fb83af9794310688d848
-Merge: ec8dde81 08b48e89
+commit c21eb86bfd671b04aca54395988cbfe6c9fd2e27
+Merge: 152000d9 4aa354be
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 13:16:16 2019 +0430
+Date:   Wed Feb 26 02:54:38 2020 +0330
 
-    Merge pull request #1844 from ebraminio/hhea
+    Merge pull request #2163 from harfbuzz/absolute-link
     
-    Fallback hhea's ascender/descender to OS2
+    added add_link_abs()
 
-commit 08b48e89d3c1bafe252badc7c65a9fc2f166a693
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 12:53:40 2019 +0430
+commit 4081439d2a49f5dfde2f9043b0e53f2008ff211f
+Author: ariza <ariza@adobe.com>
+Date:   Tue Feb 25 15:03:12 2020 -0800
 
-    [os2] minor spacing tweaks
+    tweak reflecting review & add test cases
 
- src/hb-ot-os2-table.hh | 11 +++++------
- 1 file changed, 5 insertions(+), 6 deletions(-)
+ src/hb-set.hh       | 37 ++++++++++++++++++++++---------------
+ test/api/test-set.c | 53 +++++++++++++++++++++++++++++++++++------------------
+ 2 files changed, 57 insertions(+), 33 deletions(-)
 
-commit 54b9ab704dbf62e2916f1d5276ffef2543bcc2a7
+commit 152000d9c761233261cfbfb22e771eb97576aab3
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jul 20 12:51:38 2019 +0430
+Date:   Tue Feb 25 20:07:25 2020 +0330
 
-    Fallback hhea's ascender/descender to OS2
+    [fuzz] Practice variations on font object
 
- src/hb-ot-metrics-internal.cc | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
+ test/api/test-ot-face.c         |  8 +++-----
+ test/fuzzing/hb-shape-fuzzer.cc | 16 ++++++++++++++--
+ 2 files changed, 17 insertions(+), 7 deletions(-)
 
-commit ec8dde8142fbf9e5bc0aee9318a7c4e73d61c758
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 19 11:13:50 2019 -0700
+commit 036d868913b2d4564880d588eb67c48924bd861b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 24 10:34:51 2020 +0330
 
-    [metrics] Fall back to hhea if OS2 metrics are empty
+    [draw] Add a fuzzer
     
-    Reinstates previous logic, even if it might be unnecessary.
+    Specially checks correctness of the API semantics:
+    * no move happens when a path is already opened with move-to.
+    * no path will be left open and close-path will happen at the end of opened paths.
+    * no path opens with a move-to and will be closed with no length.
+    * paths start and ending points matches.
+    * no line/quadratic/cubic command will be issued when no path is started.
 
- src/hb-ot-metrics-internal.cc | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
+ test/fuzzing/Makefile.am       |   9 ++++
+ test/fuzzing/hb-draw-fuzzer.cc | 117 +++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 126 insertions(+)
 
-commit 2e5b49d11d1dbfd44d8c640cb9ce5de7d26ca873
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jul 19 11:41:07 2019 +0430
+commit de896278f7534c876d28d9b5cf344c5d707d3490
+Author: ariza <ariza@adobe.com>
+Date:   Tue Feb 25 07:12:20 2020 -0800
 
-    Add HB_NO_METRICS and fix HB_TINY build (#1839)
+    coding & comment tweaks
 
- src/hb-config.hh              | 1 +
- src/hb-ot-face-table-list.hh  | 2 --
- src/hb-ot-metrics-internal.cc | 8 +++++++-
- src/hb-ot-metrics.cc          | 6 ++++++
- 4 files changed, 14 insertions(+), 3 deletions(-)
+ src/hb-set.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
 
-commit bdfdac0f26aafb3e9ff2db123116f0406fa49efc
+commit 2f97aa65e556b6ce0ce220c088a3da5504738189
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jul 19 10:33:00 2019 +0430
+Date:   Tue Feb 25 18:07:44 2020 +0330
 
-    [ci][fuzzer] print valgrind failure if an error happened
+    [cff] Make sure previous is ended on processing a seac
 
- test/fuzzing/run-shape-fuzzer-tests.py | 34 +++++++++++++++++-----------------
- 1 file changed, 17 insertions(+), 17 deletions(-)
+ src/hb-ot-cff1-table.cc | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit 2bd953ff4f656f042dba2845f0479a7fe7c439a6
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 18 14:25:45 2019 -0700
+commit acc2d4738eec3444b6f789ccbd30a7790383f2c8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 25 18:05:48 2020 +0330
 
-    [metrics] Fix weird use of xor
-    
-    I believe that was a try to use one approach as fallback to other.  But
-    felt wrong.  Just believe what's in OS/2 table to be correct.
+    [cff] Make path extract easier to read and more defensive
 
- src/hb-ot-metrics-internal.cc | 12 ++++++------
- src/hb-ot-os2-table.hh        |  2 +-
- 2 files changed, 7 insertions(+), 7 deletions(-)
+ src/hb-ot-cff1-table.cc | 8 ++++----
+ src/hb-ot-cff2-table.cc | 8 ++++----
+ 2 files changed, 8 insertions(+), 8 deletions(-)
 
-commit 9675a067bf1cc0e5d4707c1345736fda4be75b82
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 18 14:15:08 2019 -0700
+commit b59eb54f70c20d0260026067177a958e11c3a044
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 25 10:30:59 2020 +0330
 
-    [ot-metrics] Touch up
+    [glyf] Refactor, move get_points inside Glyph
 
- src/harfbuzz.cc         |  2 ++
- src/hb-ot-hmtx-table.hh | 19 +++++++++----------
- 2 files changed, 11 insertions(+), 10 deletions(-)
+ src/hb-ot-glyf-table.hh | 267 +++++++++++++++++++++++-------------------------
+ 1 file changed, 125 insertions(+), 142 deletions(-)
 
-commit 87e628436e32786635796fbb07ed200f8c0da68f
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Nov 20 23:26:46 2018 +0330
+commit 173b745da8bfd8bda710c90ab48427364068eeb5
+Author: ariza <ariza@adobe.com>
+Date:   Mon Feb 24 22:56:57 2020 -0800
 
-    Implement a simple API for fetching opentype metrics
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/pull/1432
+    fixed bug & added tests
 
- docs/harfbuzz-sections.txt    |   9 +++
- src/Makefile.sources          |   6 ++
- src/hb-ot-face-table-list.hh  |   2 +
- src/hb-ot-hhea-table.hh       |   2 +
- src/hb-ot-hmtx-table.hh       |  62 +++++++++----------
- src/hb-ot-layout.cc           |   1 -
- src/hb-ot-metrics-internal.cc |  94 +++++++++++++++++++++++++++++
- src/hb-ot-metrics.cc          | 135 ++++++++++++++++++++++++++++++++++++++++++
- src/hb-ot-metrics.h           |  92 ++++++++++++++++++++++++++++
- src/hb-ot-metrics.hh          |  35 +++++++++++
- src/hb-ot-os2-table.hh        |   4 ++
- src/hb-ot-post-table.hh       |   5 +-
- src/hb-ot.h                   |   1 +
- test/api/Makefile.am          |   1 +
- test/api/test-ot-metrics.c    |  54 +++++++++++++++++
- 15 files changed, 467 insertions(+), 36 deletions(-)
+ src/hb-set.hh       |  3 ++-
+ test/api/test-set.c | 10 ++++++----
+ 2 files changed, 8 insertions(+), 5 deletions(-)
 
-commit ed67efcc8c3638c625b2904833af3f27ef51db14
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Mon Jun 17 10:16:24 2019 -0400
+commit a5012e97c4a392d2788777580e0d08b44e036750
+Author: ariza <ariza@adobe.com>
+Date:   Mon Feb 24 17:09:48 2020 -0800
 
-    Revert "[Myanmar] Prevent reordering between Asat and Dot below"
+    optimize hb_set_del_range()
     
-    This reverts commit 1c8654ead41ca746d577549c92d2a41c594ab639.
+    fix issue #2193
 
- src/hb-unicode.hh | 3 ---
- 1 file changed, 3 deletions(-)
+ src/hb-set.hh       | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++---
+ test/api/test-set.c | 29 +++++++++++++++++++++++++++
+ 2 files changed, 82 insertions(+), 3 deletions(-)
 
-commit 504bb17287c978d60a4a515555852465319f74ed
+commit 96b71e802fe8d1fa9a14d1dece7935f4eb9789af
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 17 22:57:46 2019 +0430
+Date:   Mon Feb 24 23:00:58 2020 +0330
 
-    [ci] Bring back -linux-arm64 bot
+    [fuzz] make the custom loader to handle multiple files
     
-    Let's see if 576065b has fixed it
+    Actually this was the way it used to work :)
 
.circleci/config.yml | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
test/fuzzing/main.cc | 27 ++++++++++++---------------
+ 1 file changed, 12 insertions(+), 15 deletions(-)
 
-commit 6157bbe5127bbcbd17348622601976cffcd11c63
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jul 17 11:20:08 2019 -0700
+commit 1f5a54c768159e1bcf1c772ab236737994f638aa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 24 13:18:24 2020 +0330
 
-    Revert "Revert previous change"
+    [gvar] fix infinite loop introduced by 11f3fca
     
-    This reverts commit b8e90ca1a10fbd472eda1aa8cc3797011da52356.
-    
-    Works now.
+    The attempt on removing end_points had made the code unreadable
+    and has intrdouced infinite, fixed by making the code clear what
+    it tries to achieve.
 
- src/hb-subset-plan.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-var-gvar-table.hh       |  22 ++++++++++++++++------
+ test/api/fonts/TestGVAREight.ttf  | Bin 0 -> 4692 bytes
+ test/api/test-ot-metrics-tt-var.c |  18 ++++++++++++++++++
+ 3 files changed, 34 insertions(+), 6 deletions(-)
 
-commit 576065b4429109359c3af491b34b9ab0c6b149ee
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jul 17 11:19:34 2019 -0700
+commit f00eb4ebfa02dea593c4842a7672aa2640a6bbf2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 24 09:21:25 2020 +0330
 
-    [iter] Fix reduce type deduction
+    [gvar] Don't compare against Null address
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-var-gvar-table.hh | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
 
-commit 4552864c82c876da738ec3bf772cc089216f2fd2
+commit 19b78d56cdec354d4f35bf6ae529f670cba88fb3
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 17 22:08:39 2019 +0430
+Date:   Mon Feb 24 09:08:01 2020 +0330
 
-    [ci] Disable -linux-arm64 bot
-    
-    This is its failure https://circleci.com/gh/harfbuzz/harfbuzz/99864
-    
-    Trying to fix like ee05627, interestingly, makes the bot and the
-    others to fail like this https://circleci.com/gh/harfbuzz/harfbuzz/99841
+    [gvar] Accept coord_count even if is higher than gvar's axisCount
 
- .circleci/config.yml | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit b8e90ca1a10fbd472eda1aa8cc3797011da52356
+commit 197e2e929b7184b8c1365b08a1b275871fc08012
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 17 21:38:19 2019 +0430
+Date:   Mon Feb 24 08:53:53 2020 +0330
 
-    Revert previous change
-    
-    Interestingly all of the bots disagreed with the change and the complain is... weird.
+    [gvar] Return gracefully even if gvar wasn't used at all
 
- src/hb-subset-plan.cc | 2 +-
+ src/hb-ot-var-gvar-table.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit ee05627aff2993c51ed8a4bff3170450c000a28a
+commit 346ab9884b019ce919c2ab2ee3a3c373bec6fc33
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 17 21:28:25 2019 +0430
+Date:   Mon Feb 24 08:46:08 2020 +0330
 
-    Improve syntax to make out linux-arm64 a little happy
+    [gvar] Return gracefully even if coords_count != gvar's axis count
     
-    Decided to apply is we did the same on other places however this won't
-    fix all of its complains
+    It shouldn't be that common to have the situation, even so, no need to
+    reject entire a glyph even if gvar isn't used.
 
- src/hb-subset-plan.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-var-gvar-table.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
 
-commit 6a6bf7b7bc4a0b375fcf04ff7c674bf76e6d51aa
+commit 5f23a76e99f627f06ff7e56dddd9b53b4cbaae84
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 17 21:22:38 2019 +0430
+Date:   Mon Feb 24 08:23:23 2020 +0330
 
-    Downgrade -Wdeprecated-declarations to warning
+    [cff] Don't remove coords const qualification
     
-    Fixes #1834 at least till fix of #1829
+    We should find some way to audit all the const removals, perhaps by
+    enabling -Wold-style-cast warning on the project and turning all the
+    implicit const removals to const_cast.
 
- src/hb.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-cff2-interp-cs.hh   | 5 ++---
+ src/hb-ot-layout-common.hh | 4 ++--
+ 2 files changed, 4 insertions(+), 5 deletions(-)
 
-commit 25e2562fdff6c14a9cb70999a1ad71ee1bdff494
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jul 17 09:35:56 2019 -0700
+commit ff5223ba6075ea4d9c9844e3733ad7a0dc5875bd
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Feb 23 15:53:21 2020 -0800
 
-    [amalgam] Fix redundant-declaration warning/error
+    remove invalid glyphs from closure (#2188)
+    
+    fix issue #2186
 
- src/hb-unicode.cc | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit c184180228540c23405aaa03b6b571bb41103b45
-Author: Ali Javadi <ali.djavadi@gmail.com>
-Date:   Tue Jul 16 22:10:24 2019 +0430
+commit e17fd0d91cbd69fa9c01b20bd5c448d0a4fe0e67
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 23 23:58:39 2020 +0330
 
-    Fix C++20 compile warning on implicit capture of this with '=' default capture (#1833)
-    
-    Happens when compiled with -std=c++2a, the fix just makes the captures explicit to resolve the issue. Just adding this in addition to = doesn't work in C++11.
-    
-    src/hb-ot-layout-gpos-table.hh:737:18: warning: implicit capture of 'this' with a capture default of '=' is deprecated [-Wdeprecated-this-capture]
-                  { return (this+_).intersects (glyphs, valueFormat); })
-                            ^
-    src/hb-ot-layout-gpos-table.hh:736:16: note: add an explicit capture of 'this' to capture '*this' by reference
-        | hb_map ([=] (const OffsetTo<PairSet> &_)
-                   ^
-                    , this
+    [tools] More on py3 compatibility
 
- src/hb-ot-layout-gpos-table.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/gen-tag-table.py          | 23 +++++++----------------
+ src/gen-vowel-constraints.py  | 13 ++++---------
+ test/shaping/hb-diff          |  2 +-
+ test/shaping/hb_test_tools.py |  6 +++---
+ 4 files changed, 15 insertions(+), 29 deletions(-)
 
-commit 1f94388516befe137d265c261f687a47ce6f8e69
+commit 0cf050a7b13703e0d665f8dd263cc0d22a95c4f1
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jul 16 11:24:29 2019 +0430
+Date:   Sun Feb 23 23:00:48 2020 +0330
 
-    [usp] define atfree callback only if used
+    [draw] Merge consequent move-to commands of CFF/CFF2
 
- src/hb-uniscribe.cc | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ src/hb-ot-cff1-table.cc     |   4 ++--
+ src/hb-ot-cff2-table.cc     |   7 ++-----
+ test/api/fonts/Stroking.otf | Bin 0 -> 1060 bytes
+ test/api/test-draw.c        |  26 +++++++++++++++++++++++++-
+ 4 files changed, 29 insertions(+), 8 deletions(-)
 
-commit 1da1b4dc94c500e4c9c833ab74fced07364d13fb
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Wed Jun 26 13:23:24 2019 -0700
+commit 86bd5a0ba12e389eb0742bf63eb9c88ca3fd8786
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 23 22:46:26 2020 +0330
 
-    [subset] For option "--unicodes",  add support for "*" to retain all code points
+    [draw] End CFF paths with a line-to
+    
+    Issue a line-to command when start and end point of a path isn't same, matches freetype also.
 
- ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 0 -> 97204 bytes
- ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 0 -> 65976 bytes
- ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 0 -> 65936 bytes
- ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 0 -> 96948 bytes
- ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 97244 bytes
- ...to-Regular.abc.default.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
- ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 0 -> 924 bytes
- ...Regular.abc.drop-hints.retain-all-codepoint.ttf | Bin 0 -> 924 bytes
- ...o-Regular.abc.name-ids.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
- ...egular.abc.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
- test/subset/data/tests/basics.tests                |   1 +
- test/subset/subset_test_suite.py                   |  20 +++++++---
- util/hb-subset.cc                                  |   7 ++++
- util/options.cc                                    |  44 ++++++++++++---------
- 14 files changed, 48 insertions(+), 24 deletions(-)
+ src/hb-ot-cff1-table.cc | 35 ++++++++++++++++++++++++++++++++---
+ src/hb-ot-cff2-table.cc | 40 ++++++++++++++++++++++++++++++++++++----
+ test/api/test-draw.c    | 16 +++++++++-------
+ 3 files changed, 77 insertions(+), 14 deletions(-)
 
-commit 68ac767e430c4dfe4c556b2c4f962cc3dfc5d3e4
-Author: blueshade7 <ariza@typekit.com>
-Date:   Fri Jul 12 23:02:29 2019 -0700
+commit a46ba770ab6ce2f3fd2c420f550600d2589642d3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 22 17:15:00 2020 +0330
 
-    added skip(), get_next_value() to inc_bimap to subset VarStore with retain-gids
+    [number] minor
 
- src/hb-bimap.hh            | 25 ++++++++++++++++++++++++-
- src/hb-ot-layout-common.hh | 14 +++++++-------
- 2 files changed, 31 insertions(+), 8 deletions(-)
+ src/hb-number-parser.hh | 4 ++--
+ src/hb-number-parser.rl | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
 
-commit 4730b350b7ee90338caf3e962343af42412ce3df
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 12 15:38:35 2019 -0700
+commit 4aa354beba8b01f32257225de052b5e6a6feab3a
+Author: ariza <ariza@adobe.com>
+Date:   Thu Feb 20 05:03:15 2020 -0800
 
-    Revert "Update Graphite API to latest (#1215)"
-    
-    This reverts commit e4e74c2751ac24178086cce2811d34d8019b6f85.
-    
-    See https://github.com/harfbuzz/harfbuzz/issues/1829
+    chain second OffsetTo::serialize_copy() to first
 
- src/hb-graphite2.cc | 28 +---------------------------
- 1 file changed, 1 insertion(+), 27 deletions(-)
+ src/hb-open-type.hh | 18 ++----------------
+ 1 file changed, 2 insertions(+), 16 deletions(-)
 
-commit f8242b61ab01002e9f7374daa8755e92c6a92eb4
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Jul 11 15:10:36 2019 +0430
+commit 6120f50c8f52ff2e8e3c7d4f86f17fc259dcec50
+Author: ariza <ariza@adobe.com>
+Date:   Wed Feb 19 13:55:39 2020 -0800
 
-    [fuzz] Increase subset runner timeout for tsan bot
-    
-    Now is flaky let's just increase and maybe investigate later
+    fix Head with link.bias
 
test/fuzzing/run-subset-fuzzer-tests.py | 2 +-
src/hb-serialize.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit b65bad18aa527684af999b5808a9087404c0759a
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Jul 11 14:31:55 2019 +0430
+commit e65bff09433b66c207f1c40cd6e5b73c7f19d7cd
+Author: ariza <ariza@adobe.com>
+Date:   Wed Feb 19 13:38:04 2020 -0800
 
-    [fuzz] Don't fail when blob is empty
-    
-    And enable more tests able to trig the issue.
+    workaround whence_t as bit-field
 
- ...zz-testcase-minimized-hb-subset-fuzzer-5738978499624960 | Bin 0 -> 28 bytes
- test/fuzzing/hb-subset-fuzzer.cc                           |   2 +-
- test/fuzzing/run-subset-fuzzer-tests.py                    |   9 +++++----
- 3 files changed, 6 insertions(+), 5 deletions(-)
+ src/hb-serialize.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 7a9d643c297990f9889a2f7b4a470ef933bac131
+commit 1aed6d223ccf7e3cce5ed277200c57d4ecf9e2a7
+Author: ariza <ariza@adobe.com>
+Date:   Wed Feb 19 13:20:29 2020 -0800
+
+    fix whence=Head; position as 28 bits
+
+ src/hb-serialize.hh | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 4ca8e0d9891591c56ecca7e4cea3e06c6a5a8e38
+Author: ariza <ariza@adobe.com>
+Date:   Wed Feb 19 12:52:18 2020 -0800
+
+    re-implement Tail; rewrote name table with it
+
+ src/hb-open-type.hh     | 24 ++++++++++++++++++++
+ src/hb-ot-name-table.hh | 16 ++++----------
+ src/hb-serialize.hh     | 58 ++++++++++++++++++-------------------------------
+ 3 files changed, 49 insertions(+), 49 deletions(-)
+
+commit c1313e4be24017478deacfec1d9ee0284c411bbd
+Author: ariza <ariza@adobe.com>
+Date:   Mon Feb 17 17:33:18 2020 -0800
+
+    minor: undid unintended change
+
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9c65680b48fc993b31526c8aa9b9b71d772fdb52
+Author: ariza <ariza@adobe.com>
+Date:   Mon Feb 17 16:59:45 2020 -0800
+
+    rename enums to avoid conflict on win
+
+ src/hb-serialize.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 555f6f1daa5cc1365930e2b6ed7283c704b3b438
+Author: ariza <ariza@adobe.com>
+Date:   Mon Feb 17 16:29:40 2020 -0800
+
+    merge add_link_abs() into add_link()
+
+ src/hb-serialize.hh | 92 ++++++++++++++++++++++++++---------------------------
+ 1 file changed, 46 insertions(+), 46 deletions(-)
+
+commit 017cd945bf6351a89c661ba00b0f7e1dad69b52a
+Author: ariza <ariza@adobe.com>
+Date:   Thu Feb 6 16:11:58 2020 -0800
+
+    added add_link_abs()
+
+ src/hb-serialize.hh | 69 ++++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 58 insertions(+), 11 deletions(-)
+
+commit 07504569d5e7ca2f7da987fc016fc4141eeca263
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Jul 11 01:35:06 2019 +0430
+Date:   Fri Feb 21 13:05:44 2020 +0330
 
-    Fix unintialized memory read in cmap subset (#1826)
+    [gsub] minor format
 
- src/hb-ot-cmap-table.hh | 10 +++++++++-
- 1 file changed, 9 insertions(+), 1 deletion(-)
+ src/hb-ot-layout-gsub-table.hh | 19 +++++++++----------
+ 1 file changed, 9 insertions(+), 10 deletions(-)
 
-commit a6065d05cf38620c06b6dd10b8a841ed236f76c2
+commit 411225426ffca0b93f4e83f7a488a62a54b17880
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 20 13:43:06 2020 -0800
+
+    Fix glyph closure for alternate substitution.
+    It was not filtering on the glyphs to be retained.
+
+ src/hb-ot-layout-gsub-table.hh                           |   1 +
+ test/subset/data/Makefile.am                             |   1 +
+ test/subset/data/Makefile.sources                        |   1 +
+ ...te_substitution.keep-layout-retain-gids.53A9,53F1.otf | Bin 0 -> 5108 bytes
+ ...ternate_substitution.keep-layout-retain-gids.53A9.otf | Bin 0 -> 4676 bytes
+ ...ternate_substitution.keep-layout-retain-gids.53F1.otf | Bin 0 -> 3012 bytes
+ ...tion.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 6820 bytes
+ ...gsub_alternate_substitution.keep-layout.53A9,53F1.otf | Bin 0 -> 4984 bytes
+ .../gsub_alternate_substitution.keep-layout.53A9.otf     | Bin 0 -> 4524 bytes
+ .../gsub_alternate_substitution.keep-layout.53F1.otf     | Bin 0 -> 2816 bytes
+ ...ate_substitution.keep-layout.retain-all-codepoint.otf | Bin 0 -> 6728 bytes
+ test/subset/data/fonts/gsub_alternate_substitution.otf   | Bin 0 -> 8448 bytes
+ test/subset/data/tests/layout.gsub3.tests                |  12 ++++++++++++
+ 13 files changed, 15 insertions(+)
+
+commit da37880e172c207001ceff65c51276538a2d90db
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 20 19:01:43 2020 +0330
+
+    [draw] Add a private bit field instead null-checking quad-to callback
+    
+    This doesn't imply the the design is good or stable just is better
+    to not fail due to null quad-to callback so as our quad-cubic curves
+    translation is currently table limited which can be revisited anytime.
+
+ src/hb-draw.cc          | 9 ++++++++-
+ src/hb-draw.hh          | 1 +
+ src/hb-ot-glyf-table.hh | 4 ++--
+ 3 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 79b2b8a91fe5c011bda03a5350a3f482e053d0ba
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 10 16:41:40 2019 +0430
+Date:   Wed Feb 19 16:41:13 2020 +0330
 
-    Don't call memcpy when a table is empty
+    minor
 
- src/hb-open-file.hh | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
+ CMakeLists.txt              | 2 +-
+ m4/ax_cxx_compile_stdcxx.m4 | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
 
-commit c85f624b519df1db141bf55d9452bc2837ef35c4
+commit 8c652f72fc1323b811b5cde53604f0a71334efa2
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jul 10 14:28:06 2019 +0430
+Date:   Wed Feb 19 16:32:44 2020 +0330
 
-    Force blob generation and memory check in hb-subset-fuzzer
+    Minor, switch to https links where possible
 
- test/fuzzing/hb-subset-fuzzer.cc | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
+ src/gen-tag-table.py              | 2 +-
+ src/hb-ot-cff1-table.hh           | 2 +-
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ src/hb-unicode-emoji-table.hh     | 4 ++--
+ test/api/hb-test.h                | 8 ++++----
+ test/shaping/hb_test_tools.py     | 2 +-
+ 6 files changed, 10 insertions(+), 10 deletions(-)
 
-commit 2e7021da7d1726a37822e6a001b9218f82255bc8
-Author: Dominik Röttsches <drott@chromium.org>
-Date:   Mon Jul 8 10:19:49 2019 +0300
+commit bbcbcafc2579a3d4b1dbe743fa77a0167e3f949c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 19 16:21:47 2020 +0330
 
-    Revert "Minor" - revert moving extern "C" definitions in-function
-    
-    This reverts commit 62e60322cb9e18b3ee75f1b4a2a6d3069f587407 since it
-    breaks building HarfBuzz as part of Chromium.
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1821.
+    [tool] Minor, move input files link
 
- src/hb-unicode.cc | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
+ src/gen-tag-table.py | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
 
-commit f18ea1dd3a9961661a383b2966de57ea68a267e7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 5 13:56:45 2019 -0700
+commit 83db1e117e4d6f5624eafa6fe51b1622a8642b65
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 19 15:15:18 2020 +0330
 
-    [font] Remove division when scaling
+    [ci] Compatibility with Python 3
     
-    Yoohoo.  This seems to be precise enough!  Let's see if it sticks.
-    I'm asking Dominik to run this in Chrome test suite and report.
+    Disabled CMake test runners as it goes for Python 2 and updated the bots
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1801
+    Install Python 3 on macOS 10.12 bot
 
- src/hb-font.hh          | 23 +++++++++--------------
- src/hb-ot-math-table.hh | 16 ++++++++--------
- 2 files changed, 17 insertions(+), 22 deletions(-)
+ .circleci/config.yml | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
 
-commit b847769292aca13345fd1facae35aaf999198ad4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 5 13:52:09 2019 -0700
+commit 8d199077045bd28cc74d4dc66fc6e1a734ea3bda
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 19 14:56:55 2020 +0330
+
+    Remove python2 support from tests/utils scripts
+
+ mingw-ldd.py                                       |  3 +-
+ src/gen-arabic-table.py                            |  4 +-
+ src/gen-def.py                                     |  4 +-
+ src/gen-emoji-table.py                             |  3 +-
+ src/gen-indic-table.py                             |  4 +-
+ src/gen-os2-unicode-ranges.py                      |  6 +-
+ src/gen-tag-table.py                               | 10 +--
+ src/gen-ucd-table.py                               |  4 +-
+ src/gen-use-table.py                               |  4 +-
+ src/gen-vowel-constraints.py                       |  4 +-
+ src/sample.py                                      | 19 +----
+ test/fuzzing/run-shape-fuzzer-tests.py             |  4 +-
+ test/fuzzing/run-subset-fuzzer-tests.py            |  4 +-
+ .../data/text-rendering-tests/extract-tests.py     |  4 +-
+ test/shaping/hb-diff                               |  2 +-
+ test/shaping/hb-diff-colorize                      |  2 +-
+ test/shaping/hb-diff-filter-failures               |  2 +-
+ test/shaping/hb-diff-stat                          |  2 +-
+ test/shaping/hb-unicode-decode                     |  2 +-
+ test/shaping/hb-unicode-encode                     |  2 +-
+ test/shaping/hb-unicode-prettyname                 |  2 +-
+ test/shaping/hb_test_tools.py                      | 86 ++--------------------
+ test/shaping/record-test.sh                        |  2 +-
+ test/shaping/run-tests.py                          |  4 +-
+ test/subset/generate-expected-outputs.py           |  4 +-
+ test/subset/run-tests.py                           |  4 +-
+ test/subset/subset_test_suite.py                   |  2 +-
+ 27 files changed, 35 insertions(+), 158 deletions(-)
+
+commit 2c9fbf5561e4ca5abe93ce3990c0cca3982f3517
+Author: Rico Tzschichholz <ricotz@ubuntu.com>
+Date:   Wed Feb 12 14:59:52 2020 +0100
+
+    Improve GIR build
+
+ CMakeLists.txt  |  6 ++++--
+ src/Makefile.am | 11 ++++++++++-
+ 2 files changed, 14 insertions(+), 3 deletions(-)
 
-    [font] Keep font-space to user-space multiplier
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1801
+commit bd13470f23744a5bbe44b7b20846e112579abe0d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 19 13:19:38 2020 +0330
 
- src/hb-font.cc |  5 +++++
- src/hb-font.hh | 13 +++++++++++--
- 2 files changed, 16 insertions(+), 2 deletions(-)
+    [ci] Update Ubuntu bots versions
 
-commit df6edcd44ceb63d01d9c0d6d2aa06b6c6cbb914d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 5 13:45:15 2019 -0700
+ .circleci/config.yml | 40 ++++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
 
-    Make face immutable in hb_font_set_face()
+commit 493e40ff787222af598b4227f40af7718548f335
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Feb 18 13:09:08 2020 -0800
 
- src/hb-font.cc | 1 +
- 1 file changed, 1 insertion(+)
+    [subset] add one empty byte to glyf table
+    if it's going to end up empty after subsetting
+    This will make OTS happy and match what fontTools is doing now.
 
-commit 0d425e1eeaea97bf5e4fc9ce40e549332bc0cea1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 5 13:18:05 2019 -0700
+ src/hb-ot-glyf-table.hh                               |  12 ++++++++++++
+ .../colr/TwemojiMozilla.subset.default.32.ttf         | Bin 4660 -> 4664 bytes
+ ...wemojiMozilla.subset.drop-hints-retain-gids.32.ttf | Bin 4640 -> 4644 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttf      | Bin 4640 -> 4644 bytes
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttf     | Bin 4660 -> 4664 bytes
+ 5 files changed, 12 insertions(+)
 
-    [ot-font] Optimize rounding
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1801
-    
-    The assumption that compiler optimizes "upem/2" to a shift only
-    works if upem is unsigned...  Anyway, spoon-feed the compiler.
+commit a7dec0cb515d5f9ffc6cf39e712ed0b0b93bd1f0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 18 16:22:12 2020 +0330
 
- src/hb-font.hh | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
+    [glyf] Tweak path_builder_t
 
-commit 144326e215671a42fb3ac9f00ddef779ba354345
-Author: Simon Sapin <simon.sapin@exyr.org>
-Date:   Fri Jul 5 19:05:11 2019 +0200
+ src/hb-ot-glyf-table.hh | 66 ++++++++++++++++++++++++++++---------------------
+ 1 file changed, 38 insertions(+), 28 deletions(-)
 
-    Clusters are reversed based on the direction, not script
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1818
+commit d52ea2a42ce9332564cc2f049734545796e0c79b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 18 15:46:02 2020 +0330
 
- docs/usermanual-clusters.xml | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
+    [glyf] minor
 
-commit cf1a782a5ca82a880906cae3d4cb76b10ec2aad2
-Author: Simon Sapin <simon.sapin@exyr.org>
-Date:   Thu Jul 4 21:06:59 2019 +0200
+ src/hb-ot-glyf-table.hh | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
 
-    Docs: fix a typo in function name
+commit 3b0c58f811203ac59d96d94ab3675a1b85adb411
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 18 15:42:48 2020 +0330
 
- docs/usermanual-fonts-and-faces.xml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+    [glyf] minor, use private font coords to simplify
 
-commit ffa736f151f27adb76fb0bf91e18e1ec5cb8fe8d
-Author: Simon Sapin <simon.sapin@exyr.org>
-Date:   Thu Jul 4 23:05:50 2019 +0200
+ src/hb-ot-glyf-table.hh | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
 
-    hb_set_previous_range docs: fix presumed copy/paste error
+commit dcd2729e717f48013e07d0b93b64826507c049cc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 18 15:38:57 2020 +0330
 
- src/hb-set.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+    [glyf] Move contour_bounds_t into scope it is actually used
 
-commit 641f33738089ef7ccbedce09886309edcd2e1718
-Author: Simon Sapin <simon.sapin@exyr.org>
-Date:   Thu Jul 4 23:03:45 2019 +0200
+ src/hb-ot-glyf-table.hh | 81 ++++++++++++++++++++++++-------------------------
+ 1 file changed, 40 insertions(+), 41 deletions(-)
 
-    Docs typo fix: slower → lower
+commit 8bb47fa17d53d8e4c729d427b7a5d49d8e14953c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 18 15:06:43 2020 +0330
 
- src/hb-set.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+    [glyf] minor, spacing
 
-commit 9fea6b4dd41bfe2b85f788523162658a7ab9bd49
+ src/hb-ot-glyf-table.hh | 46 +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
+
+commit 21a5fe4f0981bbae8eaa9caec9c288e44c716470
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jul 5 18:46:41 2019 +0430
+Date:   Tue Feb 18 14:38:55 2020 +0330
 
-    [amalgam] Use it in cmake port and fix conflicts (#1812)
+    [glyf] Make returning phantoms to not require another vector
 
- .circleci/config.yml           |  8 ++---
- CMakeLists.txt                 | 74 ++++--------------------------------------
- src/Makefile.am                |  2 ++
- src/hb-cff-interp-common.hh    |  6 ++--
- src/hb-cff-interp-cs-common.hh |  2 +-
- src/hb-coretext.cc             |  4 +--
- src/hb-directwrite.cc          | 14 ++++----
- src/hb-ft.cc                   |  4 +--
- 8 files changed, 27 insertions(+), 87 deletions(-)
+ src/hb-ot-glyf-table.hh | 27 +++++++++++++--------------
+ 1 file changed, 13 insertions(+), 14 deletions(-)
 
-commit b240d701fd98efa59a7f772ff39654fc95b8fc8f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jul 3 12:17:57 2019 -0700
+commit 5c03fbe7e0b563ac0f1ce8f867bd747c5e72da86
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 18 13:55:28 2020 +0330
 
-    [amalgam] Include integration source files as well
-    
-    Just for those that are normally built into libharfbuzz itself.
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+    [glyf] do a phantom only iteration when possible
 
- src/Makefile.am | 12 ++++++++++--
- src/harfbuzz.cc |  6 ++++++
- 2 files changed, 16 insertions(+), 2 deletions(-)
+ src/hb-ot-glyf-table.hh | 50 +++++++++++++++++++++++++++++++------------------
+ 1 file changed, 32 insertions(+), 18 deletions(-)
 
-commit d51524204528b36907ab0f48bf2a48ec124c93d9
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jul 3 12:10:03 2019 -0700
+commit 11f3fca01d6840f3a690b59040ad7452e5343abf
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 18 12:53:20 2020 +0330
 
-    [amalgam] Rename hb.cc to harfbuzz.cc
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+    [glyf/gvar] Remove need of passing end points vector around
 
- src/Makefile.am            | 8 ++++----
- src/{hb.cc => harfbuzz.cc} | 0
- 2 files changed, 4 insertions(+), 4 deletions(-)
+ src/hb-ot-glyf-table.hh     | 30 +++++++++---------------------
+ src/hb-ot-var-gvar-table.hh | 24 ++++++++++++------------
+ 2 files changed, 21 insertions(+), 33 deletions(-)
 
-commit 4cb180d227c1adc32e921c241a93cd1f50a98d33
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 19:44:18 2019 -0700
+commit 0f2c2d989b6ad4ddd5bb7d64d90aa3e57dc85a68
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 18 11:52:16 2020 +0330
 
-    Revert "Use constexpr to replace passthru_ bools"
-    
-    This reverts commit c4aa10ebc8dc28b1f9c90af2ca2092a7535f8395.
-    
-    Broke several compilers... Sigh.  The version without constexpr
-    didn't fully optimize out the unreachable code on clang.
-    So, revert it is...
+    [glyf] Push consumer machine one more level further
 
- src/hb-algs.hh |  8 ++++++++
- src/hb-set.hh  | 18 ++++++++----------
- 2 files changed, 16 insertions(+), 10 deletions(-)
+ src/hb-ot-glyf-table.hh | 69 +++++++++++++++++++++++++------------------------
+ 1 file changed, 35 insertions(+), 34 deletions(-)
 
-commit c4aa10ebc8dc28b1f9c90af2ca2092a7535f8395
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 19:15:03 2019 -0700
+commit 11f5f7c59cbf5a430a99831c1d6f0a8ac93090b0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 17 23:44:31 2020 +0330
 
-    Use constexpr to replace passthru_ bools
+    [glyf] Adopt a state machine like style for the path builder
+    
+    Toward making glyf path reader alloc free at least on gvar absence.
 
- src/hb-algs.hh |  8 --------
- src/hb-set.hh  | 18 ++++++++++--------
- 2 files changed, 10 insertions(+), 16 deletions(-)
+ src/hb-ot-glyf-table.hh | 279 +++++++++++++++++++++++++-----------------------
+ 1 file changed, 145 insertions(+), 134 deletions(-)
 
-commit 2e48fd077954410f59156b3100c16bf56a507948
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 17:55:58 2019 -0700
+commit 60f8f384f9d272a8ae2795e3e7a533bdec452da9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 17 10:11:49 2020 +0330
 
-    Sprinkle constexpr around
+    [glyf] Switch to ttf-parser's glyf to path algorithm
     
-    Being conservative.  Also not sure it makes any real difference
-    in our codebase.
+    It consumes each point at a time and doesn't need to know contour size before hand
 
- src/hb-algs.hh | 48 ++++++++++++++++++++++++------------------------
src/hb-meta.hh | 18 +++++++++---------
- 2 files changed, 33 insertions(+), 33 deletions(-)
+ src/hb-ot-glyf-table.hh | 151 ++++++++++++++++-------
test/api/test-draw.c    | 309 +++++++++++++++++++++++-------------------------
+ 2 files changed, 254 insertions(+), 206 deletions(-)
 
-commit df4448064e370a410404708a15ce819daf1d9386
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 17:11:09 2019 -0700
+commit 3c792c2aa5ccbe5760a7415df24e8bf04edf7914
+Author: ariza <ariza@adobe.com>
+Date:   Mon Feb 17 07:18:08 2020 -0800
 
-    Remove unused 'inline' specifier
+    add test cases for hb_unwrap_type
 
- src/hb-ot-map.hh     |  4 ++--
- src/hb-shape-plan.hh | 18 +++++++++---------
- 2 files changed, 11 insertions(+), 11 deletions(-)
+ src/test-meta.cc | 5 +++++
+ 1 file changed, 5 insertions(+)
 
-commit 04a4957040380bba58880ff51d529c5cccf1d2c7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 16:19:18 2019 -0700
+commit 168ceeac496f15b4c81b106cfb790dd5739a0143
+Author: ariza <ariza@adobe.com>
+Date:   Fri Feb 14 11:56:56 2020 -0800
 
-    [amalgam] Add hb.cc to git
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+    renamed to hb_unrwap_type(); now recursive
 
- src/Makefile.am |  1 +
- src/hb.cc       | 44 ++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 45 insertions(+)
+ src/hb-meta.hh | 13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
 
-commit 62e60322cb9e18b3ee75f1b4a2a6d3069f587407
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 16:07:03 2019 -0700
+commit 71552ecc269c84aab46aa8f078526a546a288925
+Author: ariza <ariza@adobe.com>
+Date:   Thu Feb 13 12:58:22 2020 -0800
 
-    Minor
+    add hb_get_type
 
- src/hb-unicode.cc | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
+ src/hb-meta.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
 
-commit ceb4c212dc91a277f646c4a5354e4362f548a9f6
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 16:02:13 2019 -0700
+commit 65858463523aa5abb776d0181bf14da7bfb2931e
+Author: ariza <ariza@adobe.com>
+Date:   Sun Feb 16 17:16:29 2020 -0800
 
-    [amalgam] Fix UCD issue
-    
-    This actually makes it build now!
+    pop_pack(share=false) in end_serialize()
     
-    Part https://github.com/harfbuzz/harfbuzz/issues/1809
-    
-    Keeping open to add tests, CI, etc.
+    issue #2177
 
- src/hb-ucd.cc     | 5 +----
- src/hb-unicode.cc | 2 --
- src/hb-unicode.hh | 3 +++
- 3 files changed, 4 insertions(+), 6 deletions(-)
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 7ca54811f471a28163de6b3c561990c85aa39880
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 16:00:58 2019 -0700
+commit 39fb57c0e456ec352b2d0a6e6dc61b9bdee85665
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Feb 16 08:38:41 2020 -0800
 
-    [amalgam] Fix CFF
+    add share option to pop_pack() (#2176)
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+    as a solution for #2164
 
- src/hb-ot-cff1-table.cc | 18 +++++++++---------
- src/hb-ot-cff2-table.cc | 16 ++++++++--------
- 2 files changed, 17 insertions(+), 17 deletions(-)
+ src/hb-serialize.hh | 21 +++++++++++++++------
+ 1 file changed, 15 insertions(+), 6 deletions(-)
 
-commit 3724f13ba0292055197efdbfcacfe3d7b067175c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 15:23:00 2019 -0700
+commit 9c6499d9f4556b9755487c1755e4d2386979d82b
+Author: ariza <ariza@adobe.com>
+Date:   Sun Feb 16 00:56:31 2020 -0800
 
-    [amalgam] Finish fixing Indic-like shapers
+    rewrite read_points() to take lambda & consts args
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+    replacing awkward x/y_setter_t structs
 
- src/hb-ot-shape-complex-indic.cc   | 34 +++++++++++++++++-----------------
- src/hb-ot-shape-complex-indic.hh   |  9 ++++++++-
- src/hb-ot-shape-complex-khmer.cc   | 18 +++++++++---------
- src/hb-ot-shape-complex-khmer.hh   | 17 ++++++++---------
- src/hb-ot-shape-complex-myanmar.cc |  8 ++++----
- src/hb-ot-shape-complex-myanmar.hh | 16 ++++++++--------
- src/hb-ot-shape-complex-use.cc     | 14 +++++++-------
- 7 files changed, 61 insertions(+), 55 deletions(-)
+ src/hb-ot-glyf-table.hh | 35 ++++++++++++-----------------------
+ 1 file changed, 12 insertions(+), 23 deletions(-)
 
-commit eb37bc9d93b3abebee24390708940510fe37477a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 15:19:39 2019 -0700
+commit a94d1af193ac1601a1725266dbb0dd51195af98b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 12 19:25:10 2020 +0330
 
-    [use] Remove Syriac features
-    
-    This was non-standard, and unused anyway.
+    [fuzz] minor style fixes
 
src/hb-ot-shape-complex-use.cc | 7 +------
- 1 file changed, 1 insertion(+), 6 deletions(-)
test/fuzzing/hb-set-fuzzer.cc | 51 +++++++++++++++++++++----------------------
+ 1 file changed, 25 insertions(+), 26 deletions(-)
 
-commit dc480fc4717937d53cf38860a5c5d48211e8cbc8
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 15:17:56 2019 -0700
+commit 1c015d3e9f5d514da9647dab258af0a09b3ba550
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 12 19:19:37 2020 +0330
 
-    [amalgam] More Indic-like issues
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+    [fuzz] minor fuzzer case move, oops
 
- src/hb-ot-shape-complex-indic.cc | 76 +++++++++++++++++++++-------------------
- src/hb-ot-shape-complex-khmer.cc | 36 ++++++++++---------
- src/hb-ot-shape-complex-use.cc   | 32 ++++++++---------
- 3 files changed, 74 insertions(+), 70 deletions(-)
+ ...fuzz-testcase-minimized-hb-shape-fuzzer-5658272078495744 | Bin
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit d8b5353e07650cf243ba182dbf52e7f198719762
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 15:09:26 2019 -0700
+commit 49341faee27df689e1c155b1990874c2679b563f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 12 19:15:16 2020 +0330
 
-    [amalgam] More
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+    [fuzz] minor, move two fuzzer cases to their correct place
 
- src/hb-ot-shape-complex-myanmar.cc | 28 ++++++++++++++--------------
- src/hb-ot-shape-complex-use.cc     | 28 ++++++++++++++--------------
- 2 files changed, 28 insertions(+), 28 deletions(-)
+ ...fuzz-testcase-minimized-hb-shape-fuzzer-5658272078495744 | Bin
+ ...erfuzz-testcase-minimized-hb-set-fuzzer-6255224052514816 |   0
+ 2 files changed, 0 insertions(+), 0 deletions(-)
 
-commit d115a9e022c0b687fb402cfd2b90d516beded5c0
+commit d663e28af1b84f27bea9730a9a8f18212387bb7f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 14:42:45 2019 -0700
+Date:   Wed Feb 12 15:41:21 2020 +0000
 
-    [amalgam] Fix most duplicate-id instances in Indic-like shapers
+    [serialize] Catch signedness overflows in check_assign()
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+    Should address https://github.com/harfbuzz/harfbuzz/pull/2163#pullrequestreview-355137936
 
- src/hb-ot-layout.hh                        |  22 +++++
- src/hb-ot-shape-complex-indic-machine.hh   |   6 +-
- src/hb-ot-shape-complex-indic-machine.rl   |   6 +-
- src/hb-ot-shape-complex-indic.cc           | 130 +++++++++----------------
- src/hb-ot-shape-complex-indic.hh           |  26 +++++
- src/hb-ot-shape-complex-khmer-machine.hh   |   6 +-
- src/hb-ot-shape-complex-khmer-machine.rl   |   6 +-
- src/hb-ot-shape-complex-khmer.cc           |  97 ++++++-------------
- src/hb-ot-shape-complex-myanmar-machine.hh |   4 +-
- src/hb-ot-shape-complex-myanmar-machine.rl |   4 +-
- src/hb-ot-shape-complex-myanmar.cc         |  69 ++++++--------
- src/hb-ot-shape-complex-use-machine.hh     |   4 +-
- src/hb-ot-shape-complex-use-machine.rl     |   4 +-
- src/hb-ot-shape-complex-use.cc             | 148 ++++++++++++-----------------
- 14 files changed, 230 insertions(+), 302 deletions(-)
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit c073233f45da6ad8131dd38cb43b125f48c17432
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 14:26:45 2019 -0700
+commit 97229244ebd2e50ec0021ecd442e3c1c27156a5c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 12 15:41:22 2020 +0330
 
-    Add make rule to build hb.cc
+    [fuzzer] Fix hb-set-fuzzer minor overflow issue
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
-
- src/Makefile.am | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-commit f1d20d9b4dcbeead3757650b9286393918b4be8a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 2 14:18:38 2019 -0700
-
-    Add ucd-table make target
+    Size shouldn't be smaller than the struct not its pointer size.
+    
+    Fixes https://crbug.com/oss-fuzz/20655
 
- src/Makefile.am      | 23 +++++++++++++++--------
src/gen-ucd-table.py |  8 +++++---
- 2 files changed, 20 insertions(+), 11 deletions(-)
+ .../clusterfuzz-testcase-minimized-hb-set-fuzzer-6255224052514816 | 1 +
test/fuzzing/hb-set-fuzzer.cc                                     | 8 ++++----
+ 2 files changed, 5 insertions(+), 4 deletions(-)
 
-commit 634390ecaf600176245e3354edd8dfdcb7f64cc5
-Author: blueshade7 <ariza@typekit.com>
-Date:   Mon Jul 1 18:52:57 2019 -0700
+commit 7b42403c1c03e6f2f32fcc792b588ca5a42b1e19
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 11 12:25:57 2020 -0800
 
-    added VariationStore serializer to be used by HVAR/VVAR subsetters
+    Add explicit values to the set fuzzer enums.
 
src/hb-ot-layout-common.hh | 165 ++++++++++++++++++++++++++++++++++++++++++++-
- 1 file changed, 163 insertions(+), 2 deletions(-)
test/fuzzing/hb-set-fuzzer.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
 
-commit 040b261deeed8924edcb087e27a61392d1f85023
-Author: Michiharu Ariza <ariza@typekit.com>
-Date:   Sun Jun 30 16:13:07 2019 -0700
+commit e805923310af6b502e94903b504477266b55b028
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 11 12:20:54 2020 -0800
 
-    add bimap test along with bug fix/tweaks
+    Add a few basic seeds for the set fuzzer.
 
- src/Makefile.am   |  6 ++++-
- src/hb-bimap.hh   |  4 +++
- src/test-bimap.cc | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 85 insertions(+), 1 deletion(-)
+ test/fuzzing/sets/intersect_01      | Bin 0 -> 21 bytes
+ test/fuzzing/sets/subtract_01       | Bin 0 -> 21 bytes
+ test/fuzzing/sets/symmetric_diff_01 | Bin 0 -> 21 bytes
+ test/fuzzing/sets/union_01          | Bin 0 -> 21 bytes
+ 4 files changed, 0 insertions(+), 0 deletions(-)
 
-commit 9c93f5cc2de5c60d5464a65890fc7d8c25aa9702
-Merge: ad341d5f 4ab2d1d6
+commit ff984ed3cdd18290ed3a37c76961176d9f86c9cd
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jul 1 20:08:22 2019 +0430
+Date:   Tue Feb 11 19:50:51 2020 +0330
 
-    Merge pull request #1806 from carlo-bramini/master
+    Use multiplication to avoid undefined behaviour per clang
     
-    Make harfbuzz working on all existing versions of Windows
+    Newer versions of MSVC with /we4146 don't like putting negative sign behind a
+    unsigned number as https://github.com/harfbuzz/harfbuzz/pull/2069
+    That however have made https://crbug.com/1050424 this complain:
+      src/hb-ot-color-sbix-table.hh:304:28: runtime error: negation of -2147483648 cannot be represented in type 'int';
+                                            cast to an unsigned type to negate this value to itself
+    which apparently can be fixed using this change.
+    
+    Let's see if this won't make another ubsan complain!
 
-commit 4ab2d1d6767568c45495be515e016805cce0c69a
+ src/hb-ot-color-sbix-table.hh                             |   2 +-
+ ...zz-testcase-minimized-hb_shape_fuzzer-5633785895911424 | Bin 0 -> 582 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 21e1b1310ab20628d0a81c02b17cc5e49a56a4a7
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jul 1 19:30:21 2019 +0430
+Date:   Tue Feb 11 17:08:55 2020 +0330
 
-    [dwrite] Apply minor style improves
+    [colr] minor style fix
 
- src/hb-directwrite.cc | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
+ src/hb-ot-color-colr-table.hh | 87 ++++++++++++++++++++++---------------------
+ 1 file changed, 44 insertions(+), 43 deletions(-)
 
-commit 5ebd265e66cbcd167469837dcf8647484310dfb5
-Author: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com>
-Date:   Mon Jul 1 16:06:43 2019 +0200
+commit cbb45c3ee7be42091a04fc1edfd98a07cfcd864c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 11 16:46:14 2020 +0330
 
-    Fix error rised by GCC8+
+    [subset/colr] minor improve to resolve msvc complain
+    
+    MSVC says,
+      hb-ot-color-colr-table.hh(215): warning C4700: uninitialized local variable 'new_record' used [build\harfbuzz-subset.vcxproj]
+        harfbuzz-subset.vcxproj -> build\Debug\harfbuzz-subset.lib
 
- src/hb-directwrite.cc | 10 ++++++++++
- 1 file changed, 10 insertions(+)
+ src/hb-ot-color-colr-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
 
-commit 693dacbb1c0bc805e3e6aedaca5a57f04eb6ec9c
-Author: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com>
-Date:   Mon Jul 1 13:31:26 2019 +0200
+commit bca9bc6b92cfdba1118f74c1d1d6fdb1301f5c81
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 6 13:02:58 2020 -0800
 
-    Use lower case file name with #include
-    
-    I tried to cross compile harfbuzz for Windows and an error was generated because `DWrite_1.h` was not found.
-    This happened because the filesystem is case sensitive and for this reason that include file was not found.
-    The right name of the file to be used is `dwrite_1.h`, with all letters not capitalized:
-    https://docs.microsoft.com/en-us/windows/desktop/api/dwrite_1/
-    I also verified in the installation of VS2017 with Windows Kit v10 and in that place it was also lower case.
-    So, in my opinion it should be better to change this.
+    Add hb-set-fuzzer.
+    It fuzzes all of the hb_set process methods (intersection, subtraction, union, and symmetric difference).
 
- src/hb-directwrite.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ test/fuzzing/Makefile.am      | 11 +++++++
+ test/fuzzing/hb-set-fuzzer.cc | 77 +++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 88 insertions(+)
 
-commit a4543d408b31376c38bab878b2f72d4323abc564
-Author: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com>
-Date:   Sun Jun 30 15:06:30 2019 +0200
+commit 352ac63ef937629385da7517408cd3d6df7db08a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 11 03:03:03 2020 +0330
 
-    Empty DIRECTWRITE_LIBS
+    Fix an unlikely UAF on the deprecated _set_glyph_func API
     
-    Not used anymore since DWRITE is loaded dynamically.
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2168
 
configure.ac | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
src/hb-font.cc | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
 
-commit 601b6825b05f67354b48dd3629b95e0d8bf68a14
-Author: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com>
-Date:   Sun Jun 30 15:03:44 2019 +0200
+commit 6a390df8af534cc95c19a07ec2bbdd818ade6cac
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 10 17:19:23 2020 +0330
 
-    Dynamically load DWRITE
+    [tools] Print unicode links on gen-* tools output
     
-    Also checks if DWriteCreateFactory() has been executed successfully.
+    As Behdad's review
 
- src/hb-directwrite.cc | 41 +++++++++++++++++++++++++++++++++--------
- 1 file changed, 33 insertions(+), 8 deletions(-)
+ src/gen-arabic-table.py      | 13 +++++++------
+ src/gen-emoji-table.py       |  7 ++++---
+ src/gen-indic-table.py       | 12 ++++++------
+ src/gen-ucd-table.py         |  7 ++++---
+ src/gen-use-table.py         | 14 +++++++-------
+ src/gen-vowel-constraints.py |  6 ++++--
+ 6 files changed, 32 insertions(+), 27 deletions(-)
 
-commit ad341d5f1624f4e30b2d0eb2a171054a973053b5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jun 28 16:00:37 2019 -0700
+commit 4dc87365d79d9cb0ad85b351b6afe978c3abee3c
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Sun Feb 9 18:39:33 2020 +0200
 
-    [config] Fix CoreText build with NO_AAT
+    Add links to files used by python scripts.
+    
+    Closes #2150
 
- src/hb-aat-layout.cc | 8 +++++---
- 1 file changed, 5 insertions(+), 3 deletions(-)
+ src/gen-arabic-table.py      | 5 +++++
+ src/gen-emoji-table.py       | 2 ++
+ src/gen-indic-table.py       | 5 +++++
+ src/gen-tag-table.py         | 4 ++++
+ src/gen-ucd-table.py         | 2 ++
+ src/gen-use-table.py         | 6 ++++++
+ src/gen-vowel-constraints.py | 2 ++
+ 7 files changed, 26 insertions(+)
 
-commit 3f806673fbeacdbe1b31399394ccc26c773a794b
+commit 40166eb0e5d4095772059d509aa647ef4118f794
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jun 29 00:00:00 2019 +0430
+Date:   Sat Feb 8 13:17:06 2020 +0330
 
-    Apply some minor improves on CFFIndex
+    [var] Fix the just introduced hb_font_set_var_coords_design storing bug
+    
+    The memcpy call was using the current coords count which is zero initially so no copy at all.
+    
+    Sad that no test has caught it, should see why, will however with the upcoming style API tests.
 
- src/hb-ot-cff-common.hh | 38 +++++++++++++-------------------------
- 1 file changed, 13 insertions(+), 25 deletions(-)
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit ddd29e5594ccc9d0281e6da7373a1f115f6f6f3a
+commit 5c1a023f67806ee5316518d11f3c236c66fa5c87
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jun 28 23:44:14 2019 +0430
+Date:   Sat Feb 8 10:57:07 2020 +0330
 
-    minor, reuse StructAtOffset logic in StructAtOffsetOrNull
+    [tool] Optimize COLR glyph dump
+    
+    Move palette colors fetching out of gid iteration so not
+    fetching all the colors of a palette each time.
 
- src/hb-ot-cff-common.hh | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
+ src/main.cc | 91 +++++++++++++++++++++++++++++++------------------------------
+ 1 file changed, 46 insertions(+), 45 deletions(-)
 
-commit 9db7ce73d7ac6566837cdd70d38c45f3aefd7769
+commit 0b76e8130e1711754184118fdef8523e943d51c9
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jun 28 23:11:52 2019 +0430
+Date:   Tue Aug 20 15:15:22 2019 +0430
 
-    minor style improve in hb-cff-interp-common.hh
+    Don't use _normalize_variations to avoid twice axis fetch
 
- src/hb-cff-interp-common.hh | 91 +++++++++++++++------------------------------
- 1 file changed, 30 insertions(+), 61 deletions(-)
+ src/hb-font.cc | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
 
-commit 9a7b7bd9fc5bde7796ffdd997ee65cb33cbf6b29
+commit ab2d3ec542799baa0ac056cfcd264e5b3c301d82
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jun 28 22:53:51 2019 +0430
+Date:   Wed Aug 14 18:42:51 2019 +0430
 
-    style fix for pylint complain
+    [var] Implement hb_font_get_var_coords_design
+    
+    Hold design coords and simulate when normalized coords are set directly.
 
- src/gen-emoji-table.py | 20 ++++++++++----------
- 1 file changed, 10 insertions(+), 10 deletions(-)
+ docs/harfbuzz-sections.txt |   1 +
+ src/hb-font.cc             | 121 ++++++++++++++++++++++++++++++++++++---------
+ src/hb-font.h              |   4 ++
+ src/hb-font.hh             |   1 +
+ test/api/Makefile.am       |   1 +
+ test/api/test-var-coords.c |  76 ++++++++++++++++++++++++++++
+ 6 files changed, 180 insertions(+), 24 deletions(-)
 
-commit 8d36ef50c8712be476572514d73b7bddf43e5951
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jun 27 14:48:10 2019 -0700
+commit 5a10f3a0551c2e62bc0969fd857033ed53f10943
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 7 10:38:27 2020 -0800
 
-    [config] Add links
+    Use vector instead of map during page compaction in hb-set.
 
CONFIG.md | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
src/hb-set.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
 
-commit f53590971c5326dd15f4296764bfd1255ec0506a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jun 27 13:42:51 2019 -0700
+commit 2742c8162479a33d9276fa7a1e6deecc65fef5aa
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jan 28 13:55:31 2020 -0800
 
-    [test] Make Unicode tests strict against internal UCD
+    Fix page_map corruption in hb_set_t during process().
     
-    https://github.com/harfbuzz/harfbuzz/pull/1799
+    If a process operation results in less pages then the current set has, it will likely corrupt the page_map since it overwrites page_map entries ahead of where it's processing. This fixes that problem by removing page_map entries that will be dropped. Then dropping orphaned pages and re-indexing retained pages.
 
- test/api/test-unicode.c | 30 ++++++++++++++++++++++--------
- 1 file changed, 22 insertions(+), 8 deletions(-)
+ src/hb-set.hh       | 51 ++++++++++++++++++++++++++++++++--
+ test/api/test-set.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 127 insertions(+), 3 deletions(-)
 
-commit d42264f151a61a4a77e5d5712e535fc6e2daf338
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Wed Jun 26 21:10:11 2019 -0400
+commit eb7849a806699c1c5efc435cf39ee3a0eb9b9e1c
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Feb 5 15:29:03 2020 -0800
 
-    Test at least one character per Unicode version
+    [subset] GPOS6 MarkToMark subsetting support
 
- test/api/test-unicode.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++--
- 1 file changed, 138 insertions(+), 4 deletions(-)
+ src/hb-ot-layout-gpos-table.hh                     |  66 ++++++++++++++++++++-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...6_font1.keep-layout-retain-gids.41,42,43,44.otf | Bin 0 -> 2320 bytes
+ ...6_font1.keep-layout-retain-gids.41,42,43,45.otf | Bin 0 -> 2328 bytes
+ ...pos6_font1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2080 bytes
+ .../gpos6_font1.keep-layout-retain-gids.41,42.otf  | Bin 0 -> 1888 bytes
+ ...ont1.keep-layout-retain-gids.41,43,44,45,46.otf | Bin 0 -> 2688 bytes
+ ...pos6_font1.keep-layout-retain-gids.41,43,44.otf | Bin 0 -> 2324 bytes
+ ...pos6_font1.keep-layout-retain-gids.41,43,45.otf | Bin 0 -> 2336 bytes
+ .../gpos6_font1.keep-layout-retain-gids.41,43.otf  | Bin 0 -> 2092 bytes
+ .../gpos6_font1.keep-layout-retain-gids.41.otf     | Bin 0 -> 1872 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3748 bytes
+ .../gpos6_font1.keep-layout.41,42,43,44.otf        | Bin 0 -> 1616 bytes
+ .../gpos6_font1.keep-layout.41,42,43,45.otf        | Bin 0 -> 1608 bytes
+ .../gpos6_font1.keep-layout.41,42,43.otf           | Bin 0 -> 1380 bytes
+ .../layout.gpos6/gpos6_font1.keep-layout.41,42.otf | Bin 0 -> 1184 bytes
+ .../gpos6_font1.keep-layout.41,43,44,45,46.otf     | Bin 0 -> 1968 bytes
+ .../gpos6_font1.keep-layout.41,43,44.otf           | Bin 0 -> 1608 bytes
+ .../gpos6_font1.keep-layout.41,43,45.otf           | Bin 0 -> 1608 bytes
+ .../layout.gpos6/gpos6_font1.keep-layout.41,43.otf | Bin 0 -> 1376 bytes
+ .../layout.gpos6/gpos6_font1.keep-layout.41.otf    | Bin 0 -> 1172 bytes
+ ...pos6_font1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3748 bytes
+ test/subset/data/fonts/gpos6_font1.otf             | Bin 0 -> 4688 bytes
+ test/subset/data/tests/layout.gpos6.tests          |  18 ++++++
+ 25 files changed, 84 insertions(+), 2 deletions(-)
+
+commit 82afc75835364338b8db4e978ad8a0c466e41225
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Feb 4 13:24:37 2020 -0800
 
-commit 7185bd6ffb4dd8c0efebdab5b930e62c5695e3ab
-Merge: cd65305b 8341c0b3
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Jun 27 22:09:28 2019 +0430
+    [subset] GPOS4 MarkBase subsetting support
 
-    Merge pull request #1800 from harfbuzz/harfbuzz/cffnull_fix2
+ src/hb-open-type.hh                                |   7 +
+ src/hb-ot-layout-gpos-table.hh                     | 145 ++++++++++++++++++++-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...chors_1.keep-layout-retain-gids.41,42,43,44.otf | Bin 0 -> 2344 bytes
+ ...chors_1.keep-layout-retain-gids.41,42,43,45.otf | Bin 0 -> 2352 bytes
+ ..._anchors_1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2104 bytes
+ ...ple_anchors_1.keep-layout-retain-gids.41,42.otf | Bin 0 -> 1912 bytes
+ ...rs_1.keep-layout-retain-gids.41,43,44,45,46.otf | Bin 0 -> 2712 bytes
+ ..._anchors_1.keep-layout-retain-gids.41,43,44.otf | Bin 0 -> 2348 bytes
+ ..._anchors_1.keep-layout-retain-gids.41,43,45.otf | Bin 0 -> 2360 bytes
+ ...ple_anchors_1.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2116 bytes
+ ...ltiple_anchors_1.keep-layout-retain-gids.41.otf | Bin 0 -> 1896 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3772 bytes
+ ..._multiple_anchors_1.keep-layout.41,42,43,44.otf | Bin 0 -> 1640 bytes
+ ..._multiple_anchors_1.keep-layout.41,42,43,45.otf | Bin 0 -> 1632 bytes
+ ...os4_multiple_anchors_1.keep-layout.41,42,43.otf | Bin 0 -> 1404 bytes
+ .../gpos4_multiple_anchors_1.keep-layout.41,42.otf | Bin 0 -> 1208 bytes
+ ...ltiple_anchors_1.keep-layout.41,43,44,45,46.otf | Bin 0 -> 1992 bytes
+ ...os4_multiple_anchors_1.keep-layout.41,43,44.otf | Bin 0 -> 1632 bytes
+ ...os4_multiple_anchors_1.keep-layout.41,43,45.otf | Bin 0 -> 1632 bytes
+ .../gpos4_multiple_anchors_1.keep-layout.41,43.otf | Bin 0 -> 1400 bytes
+ .../gpos4_multiple_anchors_1.keep-layout.41.otf    | Bin 0 -> 1196 bytes
+ ..._anchors_1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3772 bytes
+ .../subset/data/fonts/gpos4_multiple_anchors_1.otf | Bin 0 -> 4712 bytes
+ test/subset/data/tests/layout.gpos4.tests          |  18 +++
+ 26 files changed, 169 insertions(+), 3 deletions(-)
+
+commit 4dc3db7344b464695d3c8cfdb7f3e5d518b4a6ac
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 6 12:12:41 2020 +0330
+
+    Minor, fix warnings raised when built with -std=c++2a
+    
+    Follow up to c184180,
+    
+    It was raising,
+    
+      src/hb-ot-layout-common.hh:1067:63: warning: implicit capture of 'this' with a capture default of '=' is deprecated [-Wdeprecated-this-capture]
+          | hb_filter ([=] (const OffsetTo<TSubTable> &_) { return (this+_).intersects (glyphset, lookup_type); })
+                                                                    ^
+      src/hb-ot-layout-common.hh:1067:19: note: add an explicit capture of 'this' to capture '*this' by reference
+          | hb_filter ([=] (const OffsetTo<TSubTable> &_) { return (this+_).intersects (glyphset, lookup_type); })
+                        ^
+                         , this
     
-    [CFF] fix for Subrs null ptr access
+    and
+    
+      src/hb-ot-layout-common.hh:2626:38: warning: implicit capture of 'this' with a capture default of '=' is deprecated [-Wdeprecated-this-capture]
+                      { r.collect_lookups (this, lookup_indexes); })
+                                           ^
+      src/hb-ot-layout-common.hh:2625:18: note: add an explicit capture of 'this' to capture '*this' by reference
+          | hb_apply ([=] (const FeatureTableSubstitutionRecord& r)
+                       ^
+                        , this
+    
+    and
+    
+      src/hb-ot-hdmx-table.hh:141:44: error: implicit capture of 'this' with a capture default of '=' is deprecated [-Werror,-Wdeprecated-this-capture]
+                              return device_record->widthsZ.as_array (get_num_glyphs ()) [_];
+                                                                      ^
+      src/hb-ot-hdmx-table.hh:137:17: note: add an explicit capture of 'this' to capture '*this' by reference
+                  | hb_map ([=] (hb_codepoint_t _)
+                             ^
+                              , this
+
+ .circleci/config.yml       |  4 +++-
+ src/hb-ot-hdmx-table.hh    |  4 ++--
+ src/hb-ot-layout-common.hh | 18 ++++++++----------
+ 3 files changed, 13 insertions(+), 13 deletions(-)
 
-commit 8341c0b304ee3bb0b7d150bcfb42a8b9e6448687
-Author: Michiharu Ariza <ariza@typekit.com>
-Date:   Thu Jun 27 08:43:31 2019 -0700
+commit b4d3bf1d8a97b77cbea6dd770a16aea618af7aee
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 2 14:32:38 2020 +0330
 
-    add test case file
+    [draw] Add hb_draw_funcs_is_immutable and hb_draw_funcs_make_immutable
 
- ...z-testcase-minimized-harfbuzz_fuzzer-5093685255077888 | Bin 0 -> 1160 bytes
- 1 file changed, 0 insertions(+), 0 deletions(-)
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-draw.cc             | 32 ++++++++++++++++++++++++++++++++
+ src/hb-draw.h              |  6 ++++++
+ test/api/test-draw.c       | 13 +++++++++++++
+ 4 files changed, 53 insertions(+)
 
-commit 01832fd16b605971466fc3b174cb932787ef4bfb
-Author: Michiharu Ariza <ariza@typekit.com>
-Date:   Wed Jun 26 15:58:38 2019 -0700
+commit 63b8190db884d9ae88a80336067eab539a44b882
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 6 11:38:11 2020 +0330
 
-    alternate fix for https://crbug.com/971933
+    [test] minor
+    
+    Remained from previous naming.
 
- src/hb-cff-interp-cs-common.hh | 6 +++---
- src/hb-cff1-interp-cs.hh       | 2 +-
- src/hb-cff2-interp-cs.hh       | 2 +-
- 3 files changed, 5 insertions(+), 5 deletions(-)
+ test/api/test-draw.c | 32 ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
 
-commit cd65305b059e7495f4f993d25cfda4d88781589b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 14:57:48 2019 -0700
+commit 3a98c7fae196fd149078af4553b966dc1c8d763b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 6 01:11:00 2020 +0330
 
-    [config] Don't disable emoji sequences in HB_TINY
+    [glyf] Skip empty contours
     
-    It makes sense to disable this code these if editing is not needed.
-    However, this is also necessary to correctly display emoji sequences
-    in right-to-left direction.  For that reason, don't auto-disable it.
+    As https://savannah.nongnu.org/bugs/index.php?57701
 
- src/hb-config.hh   | 1 -
- src/hb-ot-shape.cc | 2 +-
src/hb-unicode.cc  | 2 +-
- 3 files changed, 2 insertions(+), 3 deletions(-)
+ src/hb-ot-glyf-table.hh     |   8 ++++++
+ test/api/fonts/Stroking.ttf | Bin 0 -> 3380 bytes
test/api/test-draw.c        |  60 +++++++++++++++++++++++++++++++++++++++++---
+ 3 files changed, 65 insertions(+), 3 deletions(-)
 
-commit 7298716a3cfbdabedd15960404623317a64db3ae
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 14:51:17 2019 -0700
+commit c31762e9e89bc440d21a94d8da34608d1649dc85
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 5 23:12:37 2020 +0330
 
-    [config] Compile out modified combining-class if HB_NO_OT_SHAPE
+    [test] minor
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    don't test first ten glyph, just testing cp just like other API calls is enough
 
- src/hb-unicode.cc | 2 ++
- 1 file changed, 2 insertions(+)
-
-commit 1cdd0fa60d9a6aaddc20e646d294d642e2db9be4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 14:49:15 2019 -0700
+ test/api/test-ot-face.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
 
-    [emoji] Port generator to packtab
+commit 03f778cf3c1170051c3cfb21d9a835252a0123c9
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Wed Feb 5 09:26:45 2020 -0500
 
- src/gen-emoji-table.py        |  18 ++++--
- src/hb-unicode-emoji-table.hh | 126 ++++++++++++++++--------------------------
- src/hb-unicode.cc             |   5 +-
- 3 files changed, 60 insertions(+), 89 deletions(-)
+    [cmap] remove dead code
 
-commit 5130c90ac0173c542b550049c93738ab5de84bb9
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 14:29:39 2019 -0700
+ src/hb-ot-cmap-table.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
 
-    [config] Add HB_NO_EMOJI
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+commit 43253e404d25da31d8b8a57f1fc3ef5c2bb1d1fd
+Merge: 71a20186 774725b4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 5 17:45:19 2020 +0330
 
- src/hb-config.hh   | 1 +
- src/hb-ot-shape.cc | 2 ++
- src/hb-unicode.cc  | 2 ++
- 3 files changed, 5 insertions(+)
+    Merge remote-tracking branch 'upstream/master'
 
-commit 9d5b5348c7ca1e39faa9e197fdebfb8f5d3aeece
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 13:58:40 2019 -0700
+commit 71a201860023e61ef413b5bf05449c624d3ff575
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 5 17:15:50 2020 +0330
 
-    [config] Add HB_NO_SHAPER
-    
-    Don't know who would want when why.  But makes sense to have.
+    [cbdt] minor, tweak spaces
 
- src/hb-shaper-list.hh | 6 ++++++
- src/hb-shaper.cc      | 2 ++
- 2 files changed, 8 insertions(+)
+ src/hb-ot-color-cbdt-table.hh | 437 +++++++++++++++++++++---------------------
+ 1 file changed, 214 insertions(+), 223 deletions(-)
 
-commit 8fe15485cbc2f56adb29d4d5f0c3957869bd0e1a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 13:49:42 2019 -0700
+commit eaa2402a793501bc03e7aa7e662333da2b1aadb1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 5 17:02:03 2020 +0330
 
-    [config] Add HB_NO_OT_TAG
+    [cbdt] Merge hb-ot-color-cbdt-table.cc into its header file
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Not needed as far as can be said.
 
- src/hb-config.hh    | 1 +
- src/hb-ot-layout.cc | 4 ++++
- src/hb-ot-tag.cc    | 5 +++++
- src/hb-uniscribe.cc | 4 ++++
- 4 files changed, 14 insertions(+)
-
-commit 7dcf8e126ecf52c67f59745e04d21df68b1a6992
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 13:44:10 2019 -0700
+ src/Makefile.sources          |  2 --
+ src/harfbuzz.cc               |  1 -
+ src/hb-ot-color-cbdt-table.cc | 75 -------------------------------------------
+ src/hb-ot-color-cbdt-table.hh | 55 ++++++++++++++++++++++++-------
+ 4 files changed, 43 insertions(+), 90 deletions(-)
 
-    [config] Fix build with HB_NO_OT_LAYOUT
+commit a7f694d4b0d5e95a6202da926ba3c29df6fbb6f0
+Merge: 43016715 b114b26a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 5 16:31:21 2020 +0330
 
- src/hb-ot-face-table-list.hh   | 2 ++
- src/hb-ot-layout-gpos-table.hh | 3 ++-
- src/hb-ot-layout-gsub-table.hh | 5 +++--
- src/hb-ot-layout-gsubgpos.hh   | 8 +++++++-
- 4 files changed, 14 insertions(+), 4 deletions(-)
+    Merge branch 'subset_cblc' into master
 
-commit 2804790bceb9398cc9b668ca63f5aa9ffe29beeb
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 13:38:14 2019 -0700
+commit 774725b43a05d7e44286a809bb3767f18189c1a4
+Author: ckitagawa-work <59700018+ckitagawa-work@users.noreply.github.com>
+Date:   Wed Feb 5 07:43:10 2020 -0500
 
-    [config] Add dependency
+    [subset] Avoid incorrectly dropping cmap for NotoColorEmoji.ttf
+    
+    NotoColorEmoji.ttf uses two cmap subtables
+    
+     Format 14 | Platform ID 0 | Platform Encoding ID  5
+     Format 12 | Platform ID 3 | Platform Encoding ID 10
+    
+    This combination results in the cmap table being dropped during subsetting despite being valid/required.
 
- src/hb-ot-shape.cc | 4 ++++
- 1 file changed, 4 insertions(+)
+ src/hb-ot-cmap-table.hh                            |   2 +-
+ test/api/fonts/NotoColorEmoji.cmap.38,AE,2049.ttf  | Bin 0 -> 10032 bytes
+ test/api/fonts/NotoColorEmoji.cmap.ttf             | Bin 0 -> 10052 bytes
+ test/api/test-subset-cmap.c                        |  44 +++++++++++++++++++++
+ .../cmap14/cmap14_font2.default.4E00,4E02,4E03.otf | Bin 0 -> 1360 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E03.otf      | Bin 0 -> 1236 bytes
+ .../cmap14/cmap14_font2.default.4E00,4E05,4E07.otf | Bin 0 -> 1332 bytes
+ .../cmap14/cmap14_font2.default.4E02,4E03,4E08.otf | Bin 0 -> 1576 bytes
+ .../expected/cmap14/cmap14_font2.default.4E02.otf  | Bin 0 -> 992 bytes
+ .../expected/cmap14/cmap14_font2.default.4E03.otf  | Bin 0 -> 1076 bytes
+ .../cmap14_font2.default.4E05,4E07,4E08,4E09.otf   | Bin 0 -> 1848 bytes
+ .../cmap14/cmap14_font2.default.4E08,4E09.otf      | Bin 0 -> 1716 bytes
+ .../expected/cmap14/cmap14_font2.default.4E08.otf  | Bin 0 -> 1380 bytes
+ .../cmap14_font2.default.retain-all-codepoint.otf  | Bin 0 -> 2344 bytes
+ ...font2.drop-hints-retain-gids.4E00,4E02,4E03.otf | Bin 0 -> 1388 bytes
+ ...ap14_font2.drop-hints-retain-gids.4E00,4E03.otf | Bin 0 -> 1272 bytes
+ ...font2.drop-hints-retain-gids.4E00,4E05,4E07.otf | Bin 0 -> 1400 bytes
+ ...font2.drop-hints-retain-gids.4E02,4E03,4E08.otf | Bin 0 -> 1720 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E02.otf   | Bin 0 -> 1024 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E03.otf   | Bin 0 -> 1120 bytes
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf | Bin 0 -> 1984 bytes
+ ...ap14_font2.drop-hints-retain-gids.4E08,4E09.otf | Bin 0 -> 1868 bytes
+ .../cmap14_font2.drop-hints-retain-gids.4E08.otf   | Bin 0 -> 1540 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.otf | Bin 0 -> 2432 bytes
+ .../cmap14_font2.drop-hints.4E00,4E02,4E03.otf     | Bin 0 -> 1292 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E00,4E03.otf   | Bin 0 -> 1168 bytes
+ .../cmap14_font2.drop-hints.4E00,4E05,4E07.otf     | Bin 0 -> 1264 bytes
+ .../cmap14_font2.drop-hints.4E02,4E03,4E08.otf     | Bin 0 -> 1512 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E02.otf        | Bin 0 -> 924 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E03.otf        | Bin 0 -> 1008 bytes
+ ...cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.otf | Bin 0 -> 1780 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E08,4E09.otf   | Bin 0 -> 1648 bytes
+ .../cmap14/cmap14_font2.drop-hints.4E08.otf        | Bin 0 -> 1312 bytes
+ ...map14_font2.drop-hints.retain-all-codepoint.otf | Bin 0 -> 2276 bytes
+ .../cmap14_font2.name-ids.4E00,4E02,4E03.otf       | Bin 0 -> 1292 bytes
+ .../cmap14/cmap14_font2.name-ids.4E00,4E03.otf     | Bin 0 -> 1168 bytes
+ .../cmap14_font2.name-ids.4E00,4E05,4E07.otf       | Bin 0 -> 1264 bytes
+ .../cmap14_font2.name-ids.4E02,4E03,4E08.otf       | Bin 0 -> 1508 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E02.otf | Bin 0 -> 924 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E03.otf | Bin 0 -> 1008 bytes
+ .../cmap14_font2.name-ids.4E05,4E07,4E08,4E09.otf  | Bin 0 -> 1780 bytes
+ .../cmap14/cmap14_font2.name-ids.4E08,4E09.otf     | Bin 0 -> 1648 bytes
+ .../expected/cmap14/cmap14_font2.name-ids.4E08.otf | Bin 0 -> 1312 bytes
+ .../cmap14_font2.name-ids.retain-all-codepoint.otf | Bin 0 -> 2276 bytes
+ .../cmap14_font2.retain-gids.4E00,4E02,4E03.otf    | Bin 0 -> 1452 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E00,4E03.otf  | Bin 0 -> 1340 bytes
+ .../cmap14_font2.retain-gids.4E00,4E05,4E07.otf    | Bin 0 -> 1468 bytes
+ .../cmap14_font2.retain-gids.4E02,4E03,4E08.otf    | Bin 0 -> 1788 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E02.otf       | Bin 0 -> 1092 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E03.otf       | Bin 0 -> 1188 bytes
+ ...map14_font2.retain-gids.4E05,4E07,4E08,4E09.otf | Bin 0 -> 2048 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E08,4E09.otf  | Bin 0 -> 1936 bytes
+ .../cmap14/cmap14_font2.retain-gids.4E08.otf       | Bin 0 -> 1604 bytes
+ ...ap14_font2.retain-gids.retain-all-codepoint.otf | Bin 0 -> 2496 bytes
+ test/subset/data/fonts/cmap14_font2.otf            | Bin 0 -> 4480 bytes
+ test/subset/data/tests/cmap14.tests                |   1 +
+ 56 files changed, 46 insertions(+), 1 deletion(-)
+
+commit 43016715e1b4d48bc0cf598f374ffa9213b5fe2e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 5 15:02:20 2020 +0330
+
+    [subset] minor on _subset
+
+ src/hb-subset.cc | 32 ++++++++++++++------------------
+ 1 file changed, 14 insertions(+), 18 deletions(-)
 
-commit b0fd16eec62dea29d984bab879064ae9d91afdfc
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 13:31:51 2019 -0700
+commit dcb5dfc970f2720b9c76efd672c83cf2bdbd4bf0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 5 15:01:25 2020 +0330
 
-    [config] Add dependency
+    [subset] minor on tables iteration
 
- src/hb-config.hh | 4 ++++
- 1 file changed, 4 insertions(+)
+ src/hb-subset.cc | 38 +++++++++++++++++---------------------
+ 1 file changed, 17 insertions(+), 21 deletions(-)
 
-commit 12092a46d8826eec5dcf69e7817921380e4bc507
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 13:31:01 2019 -0700
+commit a8593339e2bd76eef30d0b87a9f509c5f2e8366c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 5 15:00:25 2020 +0330
 
-    [config] Rename HB_NO_SHAPE_AAT to HB_NO_AAT_SHAPE
+    [subset] minor on switch statements
 
- src/hb-aat-map.cc       |  2 +-
- src/hb-config.hh        |  2 +-
- src/hb-ot-kern-table.hh | 14 +++++++-------
- src/hb-ot-layout.cc     |  2 +-
- src/hb-ot-shape.cc      | 36 ++++++++++++++++++------------------
- src/hb-ot-shape.hh      |  8 ++++----
- 6 files changed, 32 insertions(+), 32 deletions(-)
+ src/hb-subset.cc | 166 ++++++++++++++++++-------------------------------------
+ 1 file changed, 55 insertions(+), 111 deletions(-)
 
-commit bb4bbe617d3878ca7e5e359ada493c68ec7f0a90
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 13:29:58 2019 -0700
+commit b1f63109c6f084ee1b963ebcb85b440f8639e322
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 5 00:28:21 2020 +0330
 
-    [config] Add HB_NO_OT_LAYOUT
+    [subset] Optimize _is_table_present
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    One call for most of the fonts and no malloc
 
- src/hb-config.hh    | 1 +
- src/hb-ot-layout.cc | 7 +++++++
- src/hb-ot-map.cc    | 7 +++++++
- 3 files changed, 15 insertions(+)
+ src/hb-subset.cc | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
 
-commit ab40a2feecf53d2ef787b7785132bf57e5bdcff9
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 13:25:02 2019 -0700
+commit 25707e37e32777aee76317c55a234921c4a3b51e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 5 00:27:28 2020 +0330
 
-    [config] Enable HB_NO_OT_FONT in HB_NO_OT
+    [cff] minor
 
CONFIG.md        | 4 ++--
- src/hb-config.hh | 1 +
- 2 files changed, 3 insertions(+), 2 deletions(-)
src/hb-ot-cff1-table.hh | 5 +----
+ src/hb-ot-cff2-table.hh | 5 +----
+ 2 files changed, 2 insertions(+), 8 deletions(-)
 
-commit 7aad53657eb23264f658711a71da3e50f2264455
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 13:21:03 2019 -0700
+commit 0d61926ca7c2f3e1d06231dd659ff3c43aa41746
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Tue Feb 4 13:36:51 2020 -0500
 
-    [config] Add HB_NO_OT_SHAPE / HB_NO_OT
+    [subset] Keep head when no glyf table
+
+ src/hb-ot-cff1-table.hh | 12 +------
+ src/hb-ot-cff2-table.hh | 12 +------
+ src/hb-ot-head-table.hh | 12 +++++++
+ src/hb-subset.cc        | 91 ++++++++++++++++++++++++++++++-------------------
+ 4 files changed, 69 insertions(+), 58 deletions(-)
+
+commit 7f9b2228a610ad614b77b24503bf02f95e0bf4b8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 4 23:05:46 2020 +0330
+
+    [glyf] minor
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Improve using https://developer.blender.org/diffusion/B/browse/master/source/blender/blenlib/intern/freetypefont.c$572
 
- CONFIG.md                                    | 14 ++++++++++++++
- src/gen-indic-table.py                       |  6 ++++++
- src/gen-use-table.py                         |  6 ++++++
- src/gen-vowel-constraints.py                 |  7 +++++++
- src/hb-config.hh                             |  4 ++++
- src/hb-ot-shape-complex-arabic.cc            |  6 ++++++
- src/hb-ot-shape-complex-default.cc           |  7 +++++++
- src/hb-ot-shape-complex-hangul.cc            |  7 +++++++
- src/hb-ot-shape-complex-hebrew.cc            |  7 +++++++
- src/hb-ot-shape-complex-indic-table.cc       |  6 ++++++
- src/hb-ot-shape-complex-indic.cc             |  7 +++++++
- src/hb-ot-shape-complex-khmer.cc             |  7 +++++++
- src/hb-ot-shape-complex-myanmar.cc           |  7 +++++++
- src/hb-ot-shape-complex-thai.cc              |  7 +++++++
- src/hb-ot-shape-complex-use-table.cc         |  6 ++++++
- src/hb-ot-shape-complex-use.cc               |  7 +++++++
- src/hb-ot-shape-complex-vowel-constraints.cc |  6 ++++++
- src/hb-ot-shape-fallback.cc                  |  7 +++++++
- src/hb-ot-shape-normalize.cc                 |  7 +++++++
- src/hb-ot-shape.cc                           |  7 +++++++
- src/hb-shape-plan.cc                         | 10 ++++++++++
- src/hb-shape-plan.hh                         |  4 ++++
- src/hb-shaper-list.hh                        |  2 ++
- 23 files changed, 154 insertions(+)
+ src/hb-ot-glyf-table.hh | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
 
-commit cee9f6e044278b590694f4dff6f22eaad9371385
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 13:01:58 2019 -0700
+commit 5b436033851960ea3638fbf882100b8c04d6d5a3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 4 21:29:19 2020 +0330
 
-    Fail compile if no shapers enabled
+    [subset] Rename _subset2 to _subset
 
- src/hb-shaper.cc | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-subset.cc | 62 +++++++++++++++++++-------------------------------------
+ 1 file changed, 21 insertions(+), 41 deletions(-)
 
-commit 8786820a5a7406be95bc4a6b6e2aca736126420c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 12:53:57 2019 -0700
+commit 2792fb8ba1b542b4f974c272a51014aadbecc670
+Author: ariza <ariza@adobe.com>
+Date:   Sun Feb 2 22:00:53 2020 -0800
 
-    [src] Add make targets "tiny" and "tinyz"
+    first rewrite of cff/cff2 _subset with _subset2
 
- src/Makefile.am | 4 ++++
- 1 file changed, 4 insertions(+)
+ src/hb-ot-cff1-table.hh |  12 ++----
+ src/hb-ot-cff2-table.hh |  12 ++----
+ src/hb-subset-cff1.cc   | 106 ++++++++++++++++++++----------------------------
+ src/hb-subset-cff1.hh   |   3 +-
+ src/hb-subset-cff2.cc   |  90 ++++++++++++++++------------------------
+ src/hb-subset-cff2.hh   |   3 +-
+ src/hb-subset.cc        |   4 +-
+ 7 files changed, 89 insertions(+), 141 deletions(-)
 
-commit b14e413fae8f14b75c5956e9b38e413c878ded0c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 26 10:44:10 2019 -0700
+commit b114b26a56234c17c620f69d30b1f388fc5fb6df
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Tue Feb 4 09:49:24 2020 -0500
 
-    2.5.3
+    Add guard to copy_glyph_at_idx
 
- NEWS             | 7 +++++++
- configure.ac     | 2 +-
- src/hb-version.h | 4 ++--
- 3 files changed, 10 insertions(+), 3 deletions(-)
+ src/hb-ot-color-cbdt-table.cc | 2 +-
+ src/hb-ot-color-cbdt-table.hh | 9 ++++++++-
+ 2 files changed, 9 insertions(+), 2 deletions(-)
 
-commit 3bfa878c98cceeaae074d81c14329e358bea8912
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 25 19:07:07 2019 -0700
+commit b2a68ed587b9931168bba5cae684e40840afc699
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 1 23:16:26 2020 +0330
 
-    [gen-ucd] Protect against accidents like previous commit
+    [name] Minor, use subtraction instead ternary operator
     
-    https://github.com/harfbuzz/harfbuzz/pull/1796
+    Guess ternary was a bit more legible, apparently however we agreed to use subtraction,
+    https://github.com/harfbuzz/harfbuzz/pull/2139#discussion_r372582005
 
- src/gen-ucd-table.py | 24 +++++++++++-------------
- 1 file changed, 11 insertions(+), 13 deletions(-)
+ src/hb-ot-name-table.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
 
-commit f4ea1a9afb4849e7cfb7a5eb9e81e4f656c3f89e
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Tue Jun 25 21:08:14 2019 -0400
+commit 490ef1cc236ae77b8168218d77cbc3b85ecb81bc
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jan 28 15:57:33 2020 -0800
+
+    [subset] Fix namerecord ordering
+    This will fix inconsistency with fontTools.
+    Also according to the spec, namerecords must be sorted
+    first by platform ID, then by platform-specific ID,
+    then by language ID, and then by name ID.
+
+ src/hb-ot-name-table.hh                            |  37 ++++++++++++++++++++-
+ ...numMyeongjo-Regular-subset.default.61,62,63.ttf | Bin 0 -> 4128 bytes
+ .../NanumMyeongjo-Regular-subset.default.61,63.ttf | Bin 0 -> 3580 bytes
+ .../NanumMyeongjo-Regular-subset.default.61.ttf    | Bin 0 -> 3156 bytes
+ .../NanumMyeongjo-Regular-subset.default.62.ttf    | Bin 0 -> 3180 bytes
+ .../NanumMyeongjo-Regular-subset.default.63.ttf    | Bin 0 -> 3048 bytes
+ ...Regular-subset.default.retain-all-codepoint.ttf | Bin 0 -> 9524 bytes
+ ...ular-subset.drop-hints-retain-gids.61,62,63.ttf | Bin 0 -> 1452 bytes
+ ...Regular-subset.drop-hints-retain-gids.61,63.ttf | Bin 0 -> 1284 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.61.ttf | Bin 0 -> 1128 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.62.ttf | Bin 0 -> 1144 bytes
+ ...jo-Regular-subset.drop-hints-retain-gids.63.ttf | Bin 0 -> 1116 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 0 -> 3536 bytes
+ ...Myeongjo-Regular-subset.drop-hints.61,62,63.ttf | Bin 0 -> 1452 bytes
+ ...numMyeongjo-Regular-subset.drop-hints.61,63.ttf | Bin 0 -> 1276 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.61.ttf | Bin 0 -> 1128 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.62.ttf | Bin 0 -> 1140 bytes
+ .../NanumMyeongjo-Regular-subset.drop-hints.63.ttf | Bin 0 -> 1104 bytes
+ ...ular-subset.drop-hints.retain-all-codepoint.ttf | Bin 0 -> 3536 bytes
+ ...umMyeongjo-Regular-subset.name-ids.61,62,63.ttf | Bin 0 -> 3924 bytes
+ ...NanumMyeongjo-Regular-subset.name-ids.61,63.ttf | Bin 0 -> 3376 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.61.ttf   | Bin 0 -> 2952 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.62.ttf   | Bin 0 -> 2976 bytes
+ .../NanumMyeongjo-Regular-subset.name-ids.63.ttf   | Bin 0 -> 2844 bytes
+ ...egular-subset.name-ids.retain-all-codepoint.ttf | Bin 0 -> 9320 bytes
+ ...ngjo-Regular-subset.name-languages.61,62,63.ttf | Bin 0 -> 4172 bytes
+ ...yeongjo-Regular-subset.name-languages.61,63.ttf | Bin 0 -> 3624 bytes
+ ...umMyeongjo-Regular-subset.name-languages.61.ttf | Bin 0 -> 3200 bytes
+ ...umMyeongjo-Regular-subset.name-languages.62.ttf | Bin 0 -> 3224 bytes
+ ...umMyeongjo-Regular-subset.name-languages.63.ttf | Bin 0 -> 3092 bytes
+ ...-subset.name-languages.retain-all-codepoint.ttf | Bin 0 -> 9568 bytes
+ ...yeongjo-Regular-subset.name-legacy.61,62,63.ttf | Bin 0 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.name-legacy.61,63.ttf | Bin 0 -> 3580 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.61.ttf | Bin 0 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.62.ttf | Bin 0 -> 3180 bytes
+ ...NanumMyeongjo-Regular-subset.name-legacy.63.ttf | Bin 0 -> 3048 bytes
+ ...lar-subset.name-legacy.retain-all-codepoint.ttf | Bin 0 -> 9524 bytes
+ ...yeongjo-Regular-subset.retain-gids.61,62,63.ttf | Bin 0 -> 4128 bytes
+ ...umMyeongjo-Regular-subset.retain-gids.61,63.ttf | Bin 0 -> 3588 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.61.ttf | Bin 0 -> 3156 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.62.ttf | Bin 0 -> 3184 bytes
+ ...NanumMyeongjo-Regular-subset.retain-gids.63.ttf | Bin 0 -> 3060 bytes
+ ...lar-subset.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 9524 bytes
+ .../japanese/Mplus1p-Regular.default.25771.ttf     | Bin 1824 -> 1824 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf  | Bin 1096 -> 1096 bytes
+ .../data/fonts/NanumMyeongjo-Regular-subset.ttf    | Bin 0 -> 9964 bytes
+ test/subset/data/tests/basics.tests                |   1 +
+ 47 files changed, 37 insertions(+), 1 deletion(-)
 
-    [ucd] Include scripts added in Unicode 10 or later
+commit e128f8027888536cb8f84f950bd2dbd6ecaf67a9
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Tue Jan 21 13:35:43 2020 -0500
 
- src/gen-ucd-table.py |   2 +-
- src/hb-ucd-table.hh  | 970 +++++++++++++++++++++++++++------------------------
- 2 files changed, 511 insertions(+), 461 deletions(-)
+    parent 777ba47b50f6379b9f9abf1d72559316b7116b9e
+    author ckitagawa <ckitagawa@chromium.org> 1579631743 -0500
+    committer ckitagawa <ckitagawa@chromium.org> 1580506176 -0500
+    
+    [subset] Add CBLC support
 
-commit 10bd6b8d913a57260b35c1ef830db37c06eebd18
-Author: Michiharu Ariza <ariza@typekit.com>
-Date:   Thu Jun 20 16:22:08 2019 -0700
+ src/Makefile.sources                               |   2 +
+ src/harfbuzz.cc                                    |   1 +
+ src/hb-ot-cmap-table.hh                            |   6 +-
+ src/hb-ot-color-cbdt-table.cc                      |  75 ++++
+ src/hb-ot-color-cbdt-table.hh                      | 411 ++++++++++++++++++++-
+ src/hb-ot-head-table.hh                            |  12 +
+ src/hb-subset.cc                                   |  98 +++--
+ test/api/Makefile.am                               |   2 +
+ .../fonts/NotoColorEmoji.subset.default.2049.ttf   | Bin 0 -> 3112 bytes
+ .../api/fonts/NotoColorEmoji.subset.default.39.ttf | Bin 0 -> 1920 bytes
+ ...oji.subset.index_format3.default.38,AE,2049.ttf | Bin 0 -> 7536 bytes
+ .../fonts/NotoColorEmoji.subset.index_format3.ttf  | Bin 0 -> 10112 bytes
+ ...set.multiple_size_tables.default.38,AE,2049.ttf | Bin 0 -> 14140 bytes
+ .../NotoColorEmoji.subset.multiple_size_tables.ttf | Bin 0 -> 19280 bytes
+ test/api/fonts/NotoColorEmoji.subset.ttf           | Bin 0 -> 10124 bytes
+ test/api/test-subset-cbdt.c                        | 158 ++++++++
+ .../fonts/NotoColorEmoji.subset.index_format3.ttf  | Bin 0 -> 10112 bytes
+ .../NotoColorEmoji.subset.multiple_size_tables.ttf | Bin 0 -> 19280 bytes
+ test/fuzzing/fonts/NotoColorEmoji.subset.ttf       | Bin 0 -> 10124 bytes
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ .../cbdt/NotoColorEmoji.subset.default.2049.ttf    | Bin 0 -> 3112 bytes
+ .../cbdt/NotoColorEmoji.subset.default.38,2049.ttf | Bin 0 -> 4084 bytes
+ .../cbdt/NotoColorEmoji.subset.default.38,20E3.ttf | Bin 0 -> 3568 bytes
+ ...rEmoji.subset.default.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 10124 bytes
+ .../NotoColorEmoji.subset.default.38,AE,2049.ttf   | Bin 0 -> 7544 bytes
+ .../cbdt/NotoColorEmoji.subset.default.39.ttf      | Bin 0 -> 1920 bytes
+ .../cbdt/NotoColorEmoji.subset.default.AE.ttf      | Bin 0 -> 4412 bytes
+ ...lorEmoji.subset.drop-hints-retain-gids.2049.ttf | Bin 0 -> 3136 bytes
+ ...Emoji.subset.drop-hints-retain-gids.38,2049.ttf | Bin 0 -> 4108 bytes
+ ...Emoji.subset.drop-hints-retain-gids.38,20E3.ttf | Bin 0 -> 3600 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 10124 bytes
+ ...ji.subset.drop-hints-retain-gids.38,AE,2049.ttf | Bin 0 -> 7564 bytes
+ ...ColorEmoji.subset.drop-hints-retain-gids.39.ttf | Bin 0 -> 1928 bytes
+ ...ColorEmoji.subset.drop-hints-retain-gids.AE.ttf | Bin 0 -> 4428 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf | Bin 0 -> 3112 bytes
+ .../NotoColorEmoji.subset.drop-hints.38,2049.ttf   | Bin 0 -> 4084 bytes
+ .../NotoColorEmoji.subset.drop-hints.38,20E3.ttf   | Bin 0 -> 3568 bytes
+ ...oji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 10124 bytes
+ ...NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf | Bin 0 -> 7544 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.39.ttf   | Bin 0 -> 1920 bytes
+ .../cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf   | Bin 0 -> 4412 bytes
+ .../NotoColorEmoji.subset.gap.default.2049.ttf     | Bin 0 -> 3112 bytes
+ .../NotoColorEmoji.subset.gap.default.38,2049.ttf  | Bin 0 -> 4084 bytes
+ .../NotoColorEmoji.subset.gap.default.38,20E3.ttf  | Bin 0 -> 3568 bytes
+ ...ji.subset.gap.default.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 9188 bytes
+ ...otoColorEmoji.subset.gap.default.38,AE,2049.ttf | Bin 0 -> 7544 bytes
+ .../cbdt/NotoColorEmoji.subset.gap.default.39.ttf  | Bin 0 -> 908 bytes
+ .../cbdt/NotoColorEmoji.subset.gap.default.AE.ttf  | Bin 0 -> 4412 bytes
+ ...moji.subset.gap.drop-hints-retain-gids.2049.ttf | Bin 0 -> 3136 bytes
+ ...i.subset.gap.drop-hints-retain-gids.38,2049.ttf | Bin 0 -> 4108 bytes
+ ...i.subset.gap.drop-hints-retain-gids.38,20E3.ttf | Bin 0 -> 3600 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 9188 bytes
+ ...ubset.gap.drop-hints-retain-gids.38,AE,2049.ttf | Bin 0 -> 7564 bytes
+ ...rEmoji.subset.gap.drop-hints-retain-gids.39.ttf | Bin 0 -> 916 bytes
+ ...rEmoji.subset.gap.drop-hints-retain-gids.AE.ttf | Bin 0 -> 4428 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.2049.ttf  | Bin 0 -> 3112 bytes
+ ...otoColorEmoji.subset.gap.drop-hints.38,2049.ttf | Bin 0 -> 4084 bytes
+ ...otoColorEmoji.subset.gap.drop-hints.38,20E3.ttf | Bin 0 -> 3568 bytes
+ ...subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 9188 bytes
+ ...ColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf | Bin 0 -> 7544 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.39.ttf    | Bin 0 -> 908 bytes
+ .../NotoColorEmoji.subset.gap.drop-hints.AE.ttf    | Bin 0 -> 4412 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.2049.ttf | Bin 0 -> 3136 bytes
+ ...toColorEmoji.subset.gap.retain-gids.38,2049.ttf | Bin 0 -> 4108 bytes
+ ...toColorEmoji.subset.gap.retain-gids.38,20E3.ttf | Bin 0 -> 3600 bytes
+ ...ubset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 9188 bytes
+ ...olorEmoji.subset.gap.retain-gids.38,AE,2049.ttf | Bin 0 -> 7564 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.39.ttf   | Bin 0 -> 916 bytes
+ .../NotoColorEmoji.subset.gap.retain-gids.AE.ttf   | Bin 0 -> 4428 bytes
+ ...olorEmoji.subset.index_format3.default.2049.ttf | Bin 0 -> 3112 bytes
+ ...rEmoji.subset.index_format3.default.38,2049.ttf | Bin 0 -> 4080 bytes
+ ...rEmoji.subset.index_format3.default.38,20E3.ttf | Bin 0 -> 3564 bytes
+ ...index_format3.default.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 10112 bytes
+ ...oji.subset.index_format3.default.38,AE,2049.ttf | Bin 0 -> 7536 bytes
+ ...oColorEmoji.subset.index_format3.default.39.ttf | Bin 0 -> 1920 bytes
+ ...oColorEmoji.subset.index_format3.default.AE.ttf | Bin 0 -> 4412 bytes
+ ...t.index_format3.drop-hints-retain-gids.2049.ttf | Bin 0 -> 3136 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,2049.ttf | Bin 0 -> 4104 bytes
+ ...ndex_format3.drop-hints-retain-gids.38,20E3.ttf | Bin 0 -> 3596 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 10112 bytes
+ ...x_format3.drop-hints-retain-gids.38,AE,2049.ttf | Bin 0 -> 7556 bytes
+ ...set.index_format3.drop-hints-retain-gids.39.ttf | Bin 0 -> 1928 bytes
+ ...set.index_format3.drop-hints-retain-gids.AE.ttf | Bin 0 -> 4428 bytes
+ ...rEmoji.subset.index_format3.drop-hints.2049.ttf | Bin 0 -> 3112 bytes
+ ...oji.subset.index_format3.drop-hints.38,2049.ttf | Bin 0 -> 4080 bytes
+ ...oji.subset.index_format3.drop-hints.38,20E3.ttf | Bin 0 -> 3564 bytes
+ ...ex_format3.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 10112 bytes
+ ....subset.index_format3.drop-hints.38,AE,2049.ttf | Bin 0 -> 7536 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.39.ttf | Bin 0 -> 1920 bytes
+ ...lorEmoji.subset.index_format3.drop-hints.AE.ttf | Bin 0 -> 4412 bytes
+ ...Emoji.subset.index_format3.retain-gids.2049.ttf | Bin 0 -> 3136 bytes
+ ...ji.subset.index_format3.retain-gids.38,2049.ttf | Bin 0 -> 4104 bytes
+ ...ji.subset.index_format3.retain-gids.38,20E3.ttf | Bin 0 -> 3596 bytes
+ ...x_format3.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 10112 bytes
+ ...subset.index_format3.retain-gids.38,AE,2049.ttf | Bin 0 -> 7556 bytes
+ ...orEmoji.subset.index_format3.retain-gids.39.ttf | Bin 0 -> 1928 bytes
+ ...orEmoji.subset.index_format3.retain-gids.AE.ttf | Bin 0 -> 4428 bytes
+ ...ji.subset.multiple_size_tables.default.2049.ttf | Bin 0 -> 5312 bytes
+ ...subset.multiple_size_tables.default.38,2049.ttf | Bin 0 -> 7244 bytes
+ ...subset.multiple_size_tables.default.38,20E3.ttf | Bin 0 -> 6212 bytes
+ ...e_size_tables.default.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 19280 bytes
+ ...set.multiple_size_tables.default.38,AE,2049.ttf | Bin 0 -> 14140 bytes
+ ...moji.subset.multiple_size_tables.default.39.ttf | Bin 0 -> 2928 bytes
+ ...moji.subset.multiple_size_tables.default.AE.ttf | Bin 0 -> 7916 bytes
+ ...ple_size_tables.drop-hints-retain-gids.2049.ttf | Bin 0 -> 5336 bytes
+ ..._size_tables.drop-hints-retain-gids.38,2049.ttf | Bin 0 -> 7268 bytes
+ ..._size_tables.drop-hints-retain-gids.38,20E3.ttf | Bin 0 -> 6244 bytes
+ ...rop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 19280 bytes
+ ...ze_tables.drop-hints-retain-gids.38,AE,2049.ttf | Bin 0 -> 14164 bytes
+ ...tiple_size_tables.drop-hints-retain-gids.39.ttf | Bin 0 -> 2936 bytes
+ ...tiple_size_tables.drop-hints-retain-gids.AE.ttf | Bin 0 -> 7932 bytes
+ ...subset.multiple_size_tables.drop-hints.2049.ttf | Bin 0 -> 5312 bytes
+ ...set.multiple_size_tables.drop-hints.38,2049.ttf | Bin 0 -> 7244 bytes
+ ...set.multiple_size_tables.drop-hints.38,20E3.ttf | Bin 0 -> 6212 bytes
+ ...ize_tables.drop-hints.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 19280 bytes
+ ....multiple_size_tables.drop-hints.38,AE,2049.ttf | Bin 0 -> 14140 bytes
+ ...i.subset.multiple_size_tables.drop-hints.39.ttf | Bin 0 -> 2928 bytes
+ ...i.subset.multiple_size_tables.drop-hints.AE.ttf | Bin 0 -> 7916 bytes
+ ...ubset.multiple_size_tables.retain-gids.2049.ttf | Bin 0 -> 5336 bytes
+ ...et.multiple_size_tables.retain-gids.38,2049.ttf | Bin 0 -> 7268 bytes
+ ...et.multiple_size_tables.retain-gids.38,20E3.ttf | Bin 0 -> 6244 bytes
+ ...ze_tables.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 19280 bytes
+ ...multiple_size_tables.retain-gids.38,AE,2049.ttf | Bin 0 -> 14164 bytes
+ ....subset.multiple_size_tables.retain-gids.39.ttf | Bin 0 -> 2936 bytes
+ ....subset.multiple_size_tables.retain-gids.AE.ttf | Bin 0 -> 7932 bytes
+ .../NotoColorEmoji.subset.retain-gids.2049.ttf     | Bin 0 -> 3136 bytes
+ .../NotoColorEmoji.subset.retain-gids.38,2049.ttf  | Bin 0 -> 4108 bytes
+ .../NotoColorEmoji.subset.retain-gids.38,20E3.ttf  | Bin 0 -> 3600 bytes
+ ...ji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf | Bin 0 -> 10124 bytes
+ ...otoColorEmoji.subset.retain-gids.38,AE,2049.ttf | Bin 0 -> 7564 bytes
+ .../cbdt/NotoColorEmoji.subset.retain-gids.39.ttf  | Bin 0 -> 1928 bytes
+ .../cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf  | Bin 0 -> 4428 bytes
+ .../data/fonts/NotoColorEmoji.subset.gap.ttf       | Bin 0 -> 9188 bytes
+ .../fonts/NotoColorEmoji.subset.index_format3.ttf  | Bin 0 -> 10112 bytes
+ .../NotoColorEmoji.subset.multiple_size_tables.ttf | Bin 0 -> 19280 bytes
+ test/subset/data/fonts/NotoColorEmoji.subset.ttf   | Bin 0 -> 10124 bytes
+ test/subset/data/tests/cbdt.tests                  |  20 +
+ 138 files changed, 747 insertions(+), 40 deletions(-)
+
+commit b4377afd28c8158ff0c8234aa9b2bfec3a54abd1
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Fri Jan 31 15:11:45 2020 +0200
 
-    minor
+    Minor hb_ot_layout documentation fixes.
 
- src/hb-bimap.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-layout.cc |  8 ++++----
+ src/hb-ot-layout.h  | 10 +++++-----
+ 2 files changed, 9 insertions(+), 9 deletions(-)
 
-commit f3ee2bd020f8ca313fae783cc49a374f1377e877
-Author: Michiharu Ariza <ariza@typekit.com>
-Date:   Thu Jun 20 14:33:09 2019 -0700
+commit 0216a96b0fd6bd1ab4030cd7097873a1063cd846
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Jan 30 12:36:58 2020 -0800
 
-    add ops & methods to hb_bimap_t making it more like hb_map_t
-    moved has () to hb_bimap_t from hb_inc_bimap_t
-    moved identity () to hb_inc_bimap_t
-    removed forward()
+    [subset] Fix simple glyph trim_padding in glyf table
+    Detail: when numOfContours = 1 and flag = 0x31
+    xCoordinates and yCoordinates would be empty
 
- src/hb-bimap.hh             | 38 ++++++++++++++++++++++++--------------
- src/hb-ot-cff-common.hh     |  2 +-
- src/hb-ot-cff1-table.hh     |  4 ++--
- src/hb-subset-cff-common.cc |  2 +-
- src/hb-subset-cff-common.hh |  4 ++--
- src/hb-subset-cff1.cc       |  4 ++--
- src/hb-subset-cff2.cc       |  2 +-
- 7 files changed, 33 insertions(+), 23 deletions(-)
+ src/hb-ot-glyf-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
 
-commit 094966959f96d9a41fb612fd0b870f5ae8f5a954
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Mon Jun 17 22:12:40 2019 -0700
+commit b6a8f5e63c144868edb0259e45b33e14275d1e3e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jan 28 09:30:51 2020 -0800
+
+    [subset] CMAP table subsetting fix
+    Not all codepoints smaller than 0xFFFF go to cmap4 table.
+    Only subset codepoints existing in each table.
+    This will also make harfbuzz consistent with fontTools' behavior
+
+ src/hb-ot-cmap-table.hh                                 |  15 ++++++++++++---
+ test/subset/data/Makefile.am                            |   1 +
+ test/subset/data/Makefile.sources                       |   1 +
+ .../expected/cmap/AdobeBlank-Regular.default.61,62.ttf  | Bin 0 -> 1336 bytes
+ .../cmap/AdobeBlank-Regular.default.61,FEFA.ttf         | Bin 0 -> 1348 bytes
+ .../cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf       | Bin 0 -> 1300 bytes
+ .../cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf       | Bin 0 -> 1288 bytes
+ .../expected/cmap/AdobeBlank-Regular.default.FEFA.ttf   | Bin 0 -> 1268 bytes
+ .../AdobeBlank-Regular.drop-hints-retain-gids.61,62.ttf | Bin 0 -> 1552 bytes
+ ...dobeBlank-Regular.drop-hints-retain-gids.61,FEFA.ttf | Bin 0 -> 8316 bytes
+ ...beBlank-Regular.drop-hints-retain-gids.FEE6,FECF.ttf | Bin 0 -> 8188 bytes
+ ...beBlank-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf | Bin 0 -> 8256 bytes
+ .../AdobeBlank-Regular.drop-hints-retain-gids.FEFA.ttf  | Bin 0 -> 8240 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,62.ttf        | Bin 0 -> 1164 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf      | Bin 0 -> 1176 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf    | Bin 0 -> 1128 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf    | Bin 0 -> 1116 bytes
+ .../cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf         | Bin 0 -> 1096 bytes
+ .../expected/cmap/AdobeBlank-Regular.name-ids.61,62.ttf | Bin 0 -> 1084 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf        | Bin 0 -> 1096 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf      | Bin 0 -> 1048 bytes
+ .../cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf      | Bin 0 -> 1036 bytes
+ .../expected/cmap/AdobeBlank-Regular.name-ids.FEFA.ttf  | Bin 0 -> 1016 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.61,62.ttf       | Bin 0 -> 1724 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.61,FEFA.ttf     | Bin 0 -> 8488 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf   | Bin 0 -> 8360 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf   | Bin 0 -> 8428 bytes
+ .../cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf        | Bin 0 -> 8412 bytes
+ test/subset/data/fonts/AdobeBlank-Regular.ttf           | Bin 0 -> 72408 bytes
+ test/subset/data/tests/cmap.tests                       |  16 ++++++++++++++++
+ 30 files changed, 30 insertions(+), 3 deletions(-)
+
+commit 777ba47b50f6379b9f9abf1d72559316b7116b9e
+Merge: 5b069c36 92f43a99
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 30 22:38:43 2020 +0330
+
+    Merge pull request #2132 from ckitagawa-work/subset_colr
+    
+    [subset] Add COLR support
+
+commit 5b069c3612e0347db4b7932135f6a3b9e1f84f58
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 30 18:05:01 2020 +0330
+
+    [draw][docs] update to new terminology
+
+ src/hb-draw.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-    add hb_bimap_t, subclass hb_inc_bimap_t replacing CFF::remap_t
+commit 920dca4550f73f05d79e95ddf537054e2775f7e5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 30 18:03:06 2020 +0330
 
- src/Makefile.sources        |   1 +
- src/hb-bimap.hh             | 129 ++++++++++++++++++++++++++++++++++++++++++++
- src/hb-ot-cff-common.hh     |  64 +++-------------------
- src/hb-ot-cff1-table.hh     |  16 +++---
- src/hb-subset-cff-common.cc |  12 ++---
- src/hb-subset-cff-common.hh |  40 ++++++--------
- src/hb-subset-cff1.cc       |  26 ++++-----
- src/hb-subset-cff2.cc       |  31 +++++------
- 8 files changed, 191 insertions(+), 128 deletions(-)
+    [draw][docs] update to new terminlogy
 
-commit 0660175dc82d82bbb38c45b9cb53190e06f55750
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Tue Jun 25 10:14:03 2019 -0400
+ src/hb-draw.cc | 32 ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
 
-    Categorize U+1133B for use in Tamil
+commit 1632726c1fbcd49d8c27c03948859e80476b41bd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 30 16:48:34 2020 +0330
 
- src/hb-ot-shape-complex-indic.hh | 2 +-
+    [draw] minor
+
+ src/hb-draw.h | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit fb0df17b2701c1c5623198440aa88a676985bd4f
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Mon Jun 24 21:54:26 2019 -0400
+commit 92f43a99c685752416f216c22b6edb9d87ce5d35
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Wed Jan 29 16:06:55 2020 -0500
 
-    Correct "nonunihan" to "nounihan"
+    [subset] COLR, simplify logic and use add_array
 
- src/gen-ucd-table.py | 4 ++--
- src/hb-ucd-table.hh  | 2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
+ src/hb-ot-color-colr-table.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
 
-commit bb4cdf8e0bcc98a036c22cfd44242502b107fb32
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jun 25 01:42:42 2019 +0430
+commit fba5128a9e9459de5b08367c96d05674aa1363a9
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Wed Jan 29 10:24:55 2020 -0500
 
-    Replace create_from_file with empty blob if HB_NO_OPEN is defined
+    Fix build
 
- src/main.cc                       | 4 ++++
- src/test-buffer-serialize.cc      | 4 ++++
- src/test-gpos-size-params.cc      | 4 ++++
- src/test-gsub-would-substitute.cc | 4 ++++
- src/test-ot-color.cc              | 4 ++++
- src/test-ot-name.cc               | 4 ++++
- src/test.cc                       | 4 ++++
- 7 files changed, 28 insertions(+)
+ src/hb-ot-color-colr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit ccf1448238c91da3cba8370ee527229013f6d362
-Author: GaryQian <garyq@google.com>
-Date:   Mon Jun 24 12:57:13 2019 -0700
+commit 7d542a5274d56229a72c30e53aecbae8ea938f4e
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Wed Jan 29 10:20:00 2020 -0500
 
-    Cast long->size_t to ensure comparison of similar types
+    Refactor to two iterators
 
- src/hb-common.cc | 2 +-
+ src/hb-ot-color-colr-table.hh                      | 142 ++++++++++++---------
+ src/hb-subset-plan.cc                              |   2 +-
+ .../TwemojiMozilla.subset.default.32,3299.ttf      | Bin 0 -> 5264 bytes
+ test/api/test-subset-colr.c                        |  21 +++
+ 4 files changed, 105 insertions(+), 60 deletions(-)
+
+commit 0aed54dca6fefbc26f466ace6c105881c536baa2
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Fri Jan 24 15:51:06 2020 -0500
+
+    Use one-liner methods
+
+ src/hb-ot-color-colr-table.hh | 18 ++++--------------
+ 1 file changed, 4 insertions(+), 14 deletions(-)
+
+commit 81c469eb62294666c27bcd82e4e6fcad742dcbf3
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Fri Jan 24 15:49:25 2020 -0500
+
+    Try to fix Wrange-loop-analysis
+
+ src/hb-ot-color-colr-table.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit ec8e635e0c1a8e5c631a90820be68cf07c52c1a0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 24 12:37:23 2019 -0700
+commit 0d1ba94ac7910f0fc8232c539d4f6709cd2493fd
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Fri Jan 24 15:44:40 2020 -0500
 
-    [ucd] Use custom encoding to shrink composition data
-    
-    Saves another 2.5kb.
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Minor style fixes
 
- src/gen-ucd-table.py |  22 +-
- src/hb-algs.hh       |   5 +
- src/hb-ucd-table.hh  | 963 ++++++++++++++++++++++++++++++++++-----------------
- src/hb-ucd.cc        |  49 ++-
- 4 files changed, 704 insertions(+), 335 deletions(-)
+ src/hb-ot-color-colr-table.hh | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
 
-commit 9c933acaa443889bc2484dbe3ef3e990b299cd52
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Jun 23 17:14:27 2019 -0700
+commit 49b98e865007bbbfd5780b301a68daa7b3800ec3
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Fri Jan 24 15:39:02 2020 -0500
 
-    [ucd] Save a few more bytes
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Fix nullptr de-reference failure if both blobs in a subset test are 0 in size
 
- src/gen-ucd-table.py | 11 ++++++-----
- src/hb-ucd-table.hh  | 34 +++++++++++++++++-----------------
- src/hb-ucd.cc        | 12 ++++++------
- 3 files changed, 29 insertions(+), 28 deletions(-)
+ test/api/hb-subset-test.h | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
 
-commit 9bd8d66c2ba97aec57597ff85e059a7618260a1c
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Wed Jun 12 11:02:48 2019 -0700
+commit ed857c4680721d767ce9c60cf081ad0a1bcee8e6
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Fri Jan 24 08:52:23 2020 -0500
 
-    [subset] VORG table to use _subset2 method and new iterator frameworks
+    [subset] Add COLR support
 
- src/hb-ot-vorg-table.hh | 128 ++++++++++++++----------------------------------
- src/hb-subset.cc        |   2 +-
- 2 files changed, 39 insertions(+), 91 deletions(-)
+ src/hb-ot-color-colr-table.hh                      | 127 ++++++++++++++++++++-
+ src/hb-subset-plan.cc                              |   5 +
+ src/hb-subset.cc                                   |   4 +
+ test/api/Makefile.am                               |   2 +
+ .../api/fonts/TwemojiMozilla.subset.default.32.ttf | Bin 0 -> 4660 bytes
+ .../fonts/TwemojiMozilla.subset.default.3297.ttf   | Bin 0 -> 5068 bytes
+ test/api/fonts/TwemojiMozilla.subset.ttf           | Bin 0 -> 5712 bytes
+ test/api/test-subset-colr.c                        |  99 ++++++++++++++++
+ test/fuzzing/fonts/TwemojiMozilla.subset.ttf       | Bin 0 -> 5712 bytes
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ .../TwemojiMozilla.subset.default.32,3297,3299.ttf | Bin 0 -> 5624 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3297.ttf | Bin 0 -> 5088 bytes
+ .../colr/TwemojiMozilla.subset.default.32,3299.ttf | Bin 0 -> 5264 bytes
+ .../colr/TwemojiMozilla.subset.default.32.ttf      | Bin 0 -> 4660 bytes
+ .../TwemojiMozilla.subset.default.3297,3299.ttf    | Bin 0 -> 5604 bytes
+ .../colr/TwemojiMozilla.subset.default.3297.ttf    | Bin 0 -> 5068 bytes
+ .../colr/TwemojiMozilla.subset.default.3299.ttf    | Bin 0 -> 5244 bytes
+ ....subset.drop-hints-retain-gids.32,3297,3299.ttf | Bin 0 -> 5604 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3297.ttf | Bin 0 -> 5084 bytes
+ ...zilla.subset.drop-hints-retain-gids.32,3299.ttf | Bin 0 -> 5264 bytes
+ ...ojiMozilla.subset.drop-hints-retain-gids.32.ttf | Bin 0 -> 4640 bytes
+ ...lla.subset.drop-hints-retain-gids.3297,3299.ttf | Bin 0 -> 5588 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3297.ttf | Bin 0 -> 5064 bytes
+ ...iMozilla.subset.drop-hints-retain-gids.3299.ttf | Bin 0 -> 5244 bytes
+ ...emojiMozilla.subset.drop-hints.32,3297,3299.ttf | Bin 0 -> 5604 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3297.ttf   | Bin 0 -> 5068 bytes
+ .../TwemojiMozilla.subset.drop-hints.32,3299.ttf   | Bin 0 -> 5244 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.32.ttf   | Bin 0 -> 4640 bytes
+ .../TwemojiMozilla.subset.drop-hints.3297,3299.ttf | Bin 0 -> 5584 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3297.ttf | Bin 0 -> 5048 bytes
+ .../colr/TwemojiMozilla.subset.drop-hints.3299.ttf | Bin 0 -> 5224 bytes
+ ...mojiMozilla.subset.retain-gids.32,3297,3299.ttf | Bin 0 -> 5624 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3297.ttf  | Bin 0 -> 5104 bytes
+ .../TwemojiMozilla.subset.retain-gids.32,3299.ttf  | Bin 0 -> 5284 bytes
+ .../colr/TwemojiMozilla.subset.retain-gids.32.ttf  | Bin 0 -> 4660 bytes
+ ...TwemojiMozilla.subset.retain-gids.3297,3299.ttf | Bin 0 -> 5608 bytes
+ .../TwemojiMozilla.subset.retain-gids.3297.ttf     | Bin 0 -> 5084 bytes
+ .../TwemojiMozilla.subset.retain-gids.3299.ttf     | Bin 0 -> 5264 bytes
+ test/subset/data/fonts/TwemojiMozilla.subset.ttf   | Bin 0 -> 5712 bytes
+ test/subset/data/tests/colr.tests                  |  17 +++
+ 41 files changed, 255 insertions(+), 1 deletion(-)
+
+commit d106900bfd61ed45fbd4ffd93875d167d86e01e4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 28 15:26:13 2020 +0330
+
+    [draw][glyf] Implement quadratic to cubic call translation
+
+ src/hb-draw.cc          |  7 +-----
+ src/hb-draw.h           |  3 +++
+ src/hb-ot-glyf-table.hh | 58 ++++++++++++++++++++++++++++++++++++++++++++-----
+ test/api/test-draw.c    | 27 +++++++++++++++++++++--
+ 4 files changed, 81 insertions(+), 14 deletions(-)
+
+commit 74fdcdcac8bf0467c50ddf6793b147e93b790a52
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 28 13:45:22 2020 +0330
+
+    [draw] Rename conic_to to quadratic_to
 
-commit 8062979990d348671b465c877e4dd672e1337665
-Merge: ad97ec95 c2d7dfc6
+ docs/harfbuzz-sections.txt |  4 ++--
+ src/hb-draw.cc             | 16 ++++++++--------
+ src/hb-draw.h              | 10 +++++-----
+ src/hb-draw.hh             |  2 +-
+ src/hb-ot-glyf-table.hh    |  4 ++--
+ src/main.cc                |  8 ++++----
+ test/api/test-draw.c       |  8 ++++----
+ 7 files changed, 26 insertions(+), 26 deletions(-)
+
+commit ac81e94016be3fb638c16bae38bd61cc131104ac
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 28 12:34:47 2020 +0330
+
+    Rename hb_outline_decompose to hb_font_draw_glyph and hb_outline_decompose_funcs_t to hb_draw_funcs_t
+
+ docs/harfbuzz-sections.txt               | 38 ++++++-------
+ src/Makefile.sources                     |  6 +--
+ src/harfbuzz.cc                          |  2 +-
+ src/hb-config.hh                         |  2 +-
+ src/{hb-outline.cc => hb-draw.cc}        | 91 +++++++++++++++----------------
+ src/hb-draw.h                            | 87 ++++++++++++++++++++++++++++++
+ src/{hb-outline.hh => hb-draw.hh}        | 18 +++----
+ src/hb-font.h                            |  5 ++
+ src/hb-ot-cff1-table.cc                  | 12 ++---
+ src/hb-ot-cff1-table.hh                  |  2 +-
+ src/hb-ot-cff2-table.cc                  |  8 +--
+ src/hb-ot-cff2-table.hh                  |  2 +-
+ src/hb-ot-glyf-table.hh                  |  4 +-
+ src/hb-outline.h                         | 92 --------------------------------
+ src/hb.h                                 |  2 +-
+ src/main.cc                              | 26 ++++-----
+ test/api/Makefile.am                     |  2 +-
+ test/api/{test-outline.c => test-draw.c} | 70 ++++++++++++------------
+ test/api/test-ot-face.c                  |  6 +--
+ 19 files changed, 238 insertions(+), 237 deletions(-)
+
+commit cf5f94675669154ab84695e5b24a1d54d2ad8c5e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 27 23:38:39 2020 +0330
+
+    [outline] use hb_object_is_immutable instead comparing to Null
+
+ src/hb-outline.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 981125aa2adbe4f513d3ecf357459e5bcfd06d0a
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jun 23 11:19:48 2019 +0430
+Date:   Sat Jan 25 21:31:36 2020 +0330
 
-    Merge pull request #1788 from jameshilliard/configure-svg
-    
-    Add missing cairo-svg dependency to test-ot-color
+    Rename hb_ot_glyph_* to hb_outline_*
 
-commit c2d7dfc68ffcb389c9f73b5ef94da7b270bdcf9e
-Author: James Hilliard <james.hilliard1@gmail.com>
-Date:   Sat Jun 22 19:38:48 2019 -0600
+ docs/harfbuzz-sections.txt                   |  38 +++++-----
+ src/Makefile.sources                         |   6 +-
+ src/harfbuzz.cc                              |   2 +-
+ src/hb-config.hh                             |   2 +-
+ src/hb-ot-cff1-table.cc                      |  12 ++--
+ src/hb-ot-cff1-table.hh                      |   2 +-
+ src/hb-ot-cff2-table.cc                      |   8 +--
+ src/hb-ot-cff2-table.hh                      |   2 +-
+ src/hb-ot-glyf-table.hh                      |   4 +-
+ src/hb-ot-glyph.h                            |  92 ------------------------
+ src/hb-ot.h                                  |   1 -
+ src/{hb-ot-glyph.cc => hb-outline.cc}        |  88 +++++++++++------------
+ src/hb-outline.h                             |  92 ++++++++++++++++++++++++
+ src/{hb-ot-glyph.hh => hb-outline.hh}        |  18 ++---
+ src/hb.h                                     |   1 +
+ src/main.cc                                  |  26 +++----
+ test/api/Makefile.am                         |   2 +-
+ test/api/test-ot-face.c                      |   6 +-
+ test/api/{test-ot-glyph.c => test-outline.c} | 104 +++++++++++++--------------
+ 19 files changed, 253 insertions(+), 253 deletions(-)
 
-    Add missing cairo-svg dependency to test-ot-color
+commit 30857089a59b673b80b1fbaafe8ed65ae21ed472
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 27 21:16:57 2020 +0330
 
- src/test-ot-color.cc | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
+    [test][glyph] add subcomponent scale test
 
-commit ad97ec95019b1e5170d00953d4dfe392cfb4abb0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jun 21 00:44:29 2019 -0700
+ test/api/test-ot-glyph.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
 
-    [config/ucd] Add HB_NO_UNICODE_UNASSIGNED and activate in HB_TINY
-    
-    Saves another 12kb:
-    
-    $ python ./gen-ucd-table.py ucd.nounihan.grouped.zip > hb-ucd-table.hh && make -j5 CPPFLAGS='-Os -DHB_TINY' -C ~/hb/build/src/  && size ~/hb/build/src/.libs/libharfbuzz_la-hb-ucd.o
-    INFO: Loading UCDXML...
-    INFO: Preparing data tables...
-    INFO: Generating output...
-    INFO:   Compression=1:
-    INFO:       Dataset=gc       FullCost=18612
-    INFO:       Dataset=ccc      FullCost=3550
-    INFO:       Dataset=bmg      FullCost=1548
-    INFO:       Dataset=sc       FullCost=17765
-    INFO:       Dataset=dm       FullCost=13325
-    INFO:   Compression=3:
-    INFO:       Dataset=gc       FullCost=10726
-    INFO:       Dataset=ccc      FullCost=2389
-    INFO:       Dataset=bmg      FullCost=1052
-    INFO:       Dataset=sc       FullCost=13669
-    INFO:       Dataset=dm       FullCost=7780
-    INFO:   Compression=5:
-    INFO:       Dataset=gc       FullCost=8274
-    INFO:       Dataset=ccc      FullCost=2055
-    INFO:       Dataset=bmg      FullCost=908
-    INFO:       Dataset=sc       FullCost=4073
-    INFO:       Dataset=dm       FullCost=7780
-    INFO: Done.
+commit d809aca8d05c64c0e871923b36bdd3b17a85358d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 27 20:52:56 2020 +0330
+
+    [test] test for not applying morx on horizontal runs if gsub exists
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    https://github.com/harfbuzz/harfbuzz/pull/2130
 
- CONFIG.md            |    3 +-
- src/gen-ucd-table.py |   27 +-
- src/hb-config.hh     |    1 +
- src/hb-ucd-table.hh  | 1161 +++++++++++++++++++++++++++++++++++++++++++++++++-
- 4 files changed, 1185 insertions(+), 7 deletions(-)
+ test/shaping/data/in-house/tests/macos.tests | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit ccea7fa119d139b6a3a429b3b81fac8448f3bab1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jun 21 00:42:06 2019 -0700
+commit cd7b46ca1569850929974ef146aa1ca083c2557d
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Sun Jan 26 20:46:19 2020 +0200
 
-    [config] Make test build under HB_TINY
+    Use correct return type in _unsafe_to_break_find_min_cluster.
 
- src/test-gpos-size-params.cc | 9 +++++++--
- 1 file changed, 7 insertions(+), 2 deletions(-)
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 12cec6c12ec1856e483097e702126214dd25a34a
+commit 1438bae7a5a2c7cc631e041bcf75745578935014
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jun 21 22:39:42 2019 +0430
+Date:   Sun Jan 26 23:48:30 2020 +0330
 
-    Don't define hb_blob_create_from_file if HB_NO_OPEN is defined
+    [ot-glyph] Add fontkit non variables fonts tests
 
- src/hb-blob.cc | 6 ++----
- 1 file changed, 2 insertions(+), 4 deletions(-)
+ test/api/fonts/Mada-VF.ttf                         | Bin 0 -> 120384 bytes
+ .../fonts/NotoSansCJKkr-Regular-subset-colon.ttf   | Bin 0 -> 2084 bytes
+ test/api/fonts/OpenSans-Regular.ttf                | Bin 0 -> 217360 bytes
+ test/api/fonts/SourceSansPro-Regular.otf           | Bin 0 -> 220852 bytes
+ test/api/test-ot-glyph.c                           | 113 ++++++++++++++++++++-
+ 5 files changed, 112 insertions(+), 1 deletion(-)
 
-commit 7f3b409e85897ff267f1b6a5ce1b5cdafbfe7afe
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jun 20 14:24:43 2019 -0700
+commit 9bb1c79a2c41b85ab48ef0086a412e08ce18acd8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jan 26 22:10:47 2020 +0330
 
-    Fix build with -O0
-    
-    message_impl was not defined.  That causes trouble if compiler didn't
-    optimize the unreachable call out...
+    [ot-glyph][test] Avoid sprintf use
 
- src/hb-buffer.cc | 1 -
- src/hb-buffer.hh | 4 ++++
- 2 files changed, 4 insertions(+), 1 deletion(-)
+ test/api/test-ot-glyph.c | 160 ++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 116 insertions(+), 44 deletions(-)
 
-commit 6b44bf85382146b355a5a3cbbfde48166721ce52
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jun 20 11:57:19 2019 -0700
+commit 99f8e52d5e32b837648550b5cf09267ea7efcb48
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jan 26 17:02:11 2020 +0330
 
-    2.5.2
+    [ot-glyph] Add fontkits's variations toSVG tests
 
- NEWS             | 12 ++++++++++++
- configure.ac     |  2 +-
- src/hb-version.h |  4 ++--
- 3 files changed, 15 insertions(+), 3 deletions(-)
+ test/api/fonts/AdobeVFPrototype-Subset.otf | Bin 0 -> 7096 bytes
+ test/api/fonts/TestGVARFour.ttf            | Bin 0 -> 3204 bytes
+ test/api/fonts/TestGVAROne.ttf             | Bin 0 -> 14312 bytes
+ test/api/fonts/TestGVARThree.ttf           | Bin 0 -> 14336 bytes
+ test/api/fonts/TestGVARTwo.ttf             | Bin 0 -> 15668 bytes
+ test/api/test-ot-glyph.c                   | 246 ++++++++++++++++++++++++++++-
+ 6 files changed, 244 insertions(+), 2 deletions(-)
 
-commit e9f7b338ef599b9cbffa125fe594a9939b8517cb
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jun 20 11:48:44 2019 -0700
+commit e44982f5485571e852810cad7e55eca5c14e3758
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jan 26 14:30:03 2020 +0330
 
-    [config] Adjust description of HB_LEAN
-    
-    https://github.com/harfbuzz/harfbuzz/commit/d84932ba50482b3b47e393714eb77b19173d1f14
+    [ot-glyph] Add ttf-parser's outline_glyph tests
 
- CONFIG.md | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ test/api/fonts/README     |   2 +
+ test/api/fonts/glyphs.ttf | Bin 0 -> 808 bytes
+ test/api/test-ot-glyph.c  |  92 ++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 94 insertions(+)
 
-commit fce3bf8127321bb53b14eb8a5528a2347cd9be8a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 20:34:29 2019 -0700
+commit 5440313924172e155e34391f033f5e6c5e2390b3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jan 26 00:07:28 2020 +0330
 
-    [config] Add HB_NO_LAYOUT_COLLECT_GLYPHS
+    Update COPYING
     
-    Part of
+    2020 update and add my name for years had more or less considerable contributions
 
- src/hb-config.hh    | 1 +
- src/hb-ot-layout.cc | 2 ++
- 2 files changed, 3 insertions(+)
+ COPYING | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
-commit 6c725c7799bf4870fb8b4f896a537a2c0f7a1ccc
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 20:12:25 2019 -0700
+commit cd266e4f3d3c8ef338c007a93a2ae356467d7953
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jan 25 21:33:38 2020 +0330
 
-    [config] Add HB_NO_LAYOUT_FEATURE_PARAMS
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    minor
 
- src/hb-config.hh           | 1 +
- src/hb-ot-layout-common.hh | 7 +++++--
- src/hb-ot-layout.cc        | 6 ++----
- 3 files changed, 8 insertions(+), 6 deletions(-)
+ src/hb-ot-glyph.hh | 3 ---
+ 1 file changed, 3 deletions(-)
 
-commit 27de7c44fe80e69c527578c99c26280ba9f26c15
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 20:07:02 2019 -0700
+commit f9070cfef8b0bb3e9dc5a934d24ef6348eb19880
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 24 22:19:03 2020 +0330
 
-    [config] Add HB_NO_FACE_COLLECT_UNICODES
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Run morx if run is horizontal or GSUB doesn't exist
 
- src/hb-config.hh             | 1 +
- src/hb-face.cc               | 5 ++---
- src/hb-ot-face-table-list.hh | 2 ++
- 3 files changed, 5 insertions(+), 3 deletions(-)
+ src/hb-ot-shape.cc | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
 
-commit 3caa32d737e7c2b4fe6ccd10950760998524f573
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 19:50:54 2019 -0700
+commit 58976972508d6f6d564cb3305bbb6f706bd1ba33
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jan 25 00:32:46 2020 +0330
 
-    [config] Add HB_NO_CMAP_LEGACY_SUBTABLES
+    [test] Increase subset timeout
     
-    Part of https://vimeo.com/331852453/06eec89c65
+    No random timeout please
 
- src/hb-config.hh        |  1 +
- src/hb-ot-cmap-table.hh | 16 ++++++++++++----
- 2 files changed, 13 insertions(+), 4 deletions(-)
+ test/fuzzing/run-subset-fuzzer-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 8e3cde67dfa4aa17c0f1156b4a4acd0c95bdbe6f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 19:58:24 2019 -0700
+commit d1830437c92caf1ba3869c9ddae8acb5f8f96739
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jan 25 00:09:47 2020 +0330
 
-    Fix MSVC build
-    
-    MSVC warning:
-    
-    c:\projects\harfbuzz\src\hb-ot-layout-gsubgpos.hh(2732): error C2121: '#': invalid character: possibly the result of a macro expansion [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
-    
-    Clang warning for it:
+    [tests] Apply expected results of Mplus1p-Regular subset
     
-    ./hb-ot-layout-gsubgpos.hh:2729:2: error: embedding a directive within macro arguments has undefined behavior [-Werror,-Wembedded-directive]
+    Related to #2131
 
- src/hb-ot-layout-gsubgpos.hh | 18 +++++++++++-------
- src/hb.hh                    |  1 +
- 2 files changed, 12 insertions(+), 7 deletions(-)
+ .../japanese/Mplus1p-Regular.default.25771.ttf        | Bin 1976 -> 1824 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf     | Bin 1248 -> 1096 bytes
+ 2 files changed, 0 insertions(+), 0 deletions(-)
 
-commit c8f529a07eca06acf2216935921377e7cad8436f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 19:33:15 2019 -0700
+commit 8e0898080faf6e8aeee0b1e41e842fe7611d9c44
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 24 23:39:44 2020 +0330
 
-    [config] Add HB_NO_HINTING, enabled by HB_TINY
-    
-    Disables HintingDevice tables and Anchors addressing contour points.
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [sbix] minor style fixes
 
- src/hb-config.hh               | 3 ++-
- src/hb-ot-layout-common.hh     | 6 ++++++
- src/hb-ot-layout-gpos-table.hh | 7 +++++++
- 3 files changed, 15 insertions(+), 1 deletion(-)
+ src/hb-ot-color-sbix-table.hh | 55 +++++++++++++++++++++++--------------------
+ 1 file changed, 29 insertions(+), 26 deletions(-)
 
-commit a849873124efea6577b4938b23501d9e4f4af2f4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 19:26:22 2019 -0700
-
-    [config] Add HB_NO_VAR to disable variations support, enabled by HB_TINY
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+commit 36a5c042d701f19f574442d987b1c3dcf7d5943b
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jan 21 13:37:28 2020 -0800
+
+    [subset] Add "--name-languages" and "--name-legacy" options
+    Make name table subsetting consistent with fontTools
+
+ src/hb-ot-name-table.hh                            |  11 ++++
+ src/hb-subset-input.cc                             |  23 ++++++++
+ src/hb-subset-input.hh                             |   2 +
+ src/hb-subset-plan.cc                              |   3 ++
+ src/hb-subset-plan.hh                              |   4 ++
+ src/hb-subset.h                                    |   9 ++++
+ test/api/hb-subset-test.h                          |   5 ++
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 7460 -> 7392 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 7104 -> 7036 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 6752 -> 6684 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 6696 -> 6628 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 6676 -> 6608 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 182944 -> 182876 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 4912 -> 4844 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 4620 -> 4552 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 4056 -> 3988 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 4296 -> 4228 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 4304 -> 4236 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 151740 -> 151672 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 2920 -> 2852 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 2620 -> 2552 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 2308 -> 2240 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 2296 -> 2228 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 2296 -> 2228 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 151676 -> 151608 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 7204 -> 7132 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 6848 -> 6776 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 6496 -> 6424 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 6440 -> 6368 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 6420 -> 6348 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 182688 -> 182616 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf | Bin 0 -> 7392 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf | Bin 0 -> 7036 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttf    | Bin 0 -> 6684 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttf    | Bin 0 -> 6628 bytes
+ .../Comfortaa-Regular-new.name-languages.63.ttf    | Bin 0 -> 6608 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 0 -> 182876 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf | Bin 0 -> 7392 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    | Bin 0 -> 7036 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       | Bin 0 -> 6684 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       | Bin 0 -> 6628 bytes
+ .../Comfortaa-Regular-new.name-legacy.63.ttf       | Bin 0 -> 6608 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 0 -> 182876 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 9452 -> 9384 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 9104 -> 9036 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 8500 -> 8432 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 8696 -> 8628 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 8684 -> 8616 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 183008 -> 182940 bytes
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttf | Bin 0 -> 2168 bytes
+ .../Roboto-Regular.abc.name-languages.61,63.ttf    | Bin 0 -> 1988 bytes
+ .../Roboto-Regular.abc.name-languages.61.ttf       | Bin 0 -> 1792 bytes
+ .../Roboto-Regular.abc.name-languages.62.ttf       | Bin 0 -> 1740 bytes
+ .../Roboto-Regular.abc.name-languages.63.ttf       | Bin 0 -> 1716 bytes
+ ...lar.abc.name-languages.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttf    | Bin 0 -> 2168 bytes
+ .../Roboto-Regular.abc.name-legacy.61,63.ttf       | Bin 0 -> 1988 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttf   | Bin 0 -> 1792 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttf   | Bin 0 -> 1740 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttf   | Bin 0 -> 1716 bytes
+ ...egular.abc.name-legacy.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 2384 -> 2180 bytes
+ .../SourceSansPro-Regular.default.61,62,63.otf     | Bin 2096 -> 1892 bytes
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 2212 -> 2008 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 20000 -> 19796 bytes
+ ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 2196 -> 1992 bytes
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30412 -> 30208 bytes
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 2240 -> 2036 bytes
+ ...urceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 2000 -> 1796 bytes
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 2196 -> 1992 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 19840 -> 19636 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 2072 -> 1868 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30264 -> 30060 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 2080 -> 1876 bytes
+ ...-Regular.drop-hints-desubroutinize.61,62,63.otf | Bin 1876 -> 1672 bytes
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 2048 -> 1844 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 19932 -> 19728 bytes
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 2108 -> 1904 bytes
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30276 -> 30072 bytes
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 2164 -> 1960 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf  | Bin 1940 -> 1736 bytes
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 2064 -> 1860 bytes
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 20152 -> 19948 bytes
+ .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 2264 -> 2060 bytes
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 30428 -> 30224 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 3164 -> 2984 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 2760 -> 2580 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 3124 -> 2944 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 1616 -> 1436 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 1408 -> 1228 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 1644 -> 1464 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 4132 -> 3572 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 4100 -> 3540 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 4592 -> 4032 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 4132 -> 3572 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 4100 -> 3540 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 4592 -> 4032 bytes
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf  | Bin 2260 -> 2108 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 2684 -> 2532 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2928 -> 2776 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2228 -> 2076 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3224 -> 3072 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 1968 -> 1816 bytes
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf | Bin 1532 -> 1380 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 1956 -> 1804 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2200 -> 2048 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1500 -> 1348 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2496 -> 2344 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1240 -> 1088 bytes
+ test/subset/data/profiles/name-languages.txt       |   1 +
+ test/subset/data/profiles/name-legacy.txt          |   1 +
+ test/subset/data/tests/basics.tests                |   2 +
+ test/subset/generate-expected-outputs.py           |   6 +--
+ util/options-subset.cc                             |  58 +++++++++++++++++++++
+ 114 files changed, 121 insertions(+), 4 deletions(-)
+
+commit b7762c70680324fca0c1ae26ad3b7f432c0c990e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 24 21:20:07 2020 +0330
+
+    Disable hb_ot_glyph_decompose in HB_TINY
 
- src/hb-config.hh             |  1 +
- src/hb-font.cc               |  3 ++-
- src/hb-ot-face-table-list.hh |  2 ++
- src/hb-ot-layout-common.hh   | 34 ++++++++++++++++++++++++++++------
- src/hb-ot-layout-gsubgpos.hh | 18 +++++++++++++++---
- src/hb-ot-var.cc             |  7 ++++++-
- src/hb-subset-plan.cc        |  2 ++
- 7 files changed, 56 insertions(+), 11 deletions(-)
+ src/hb-config.hh   | 1 +
+ src/hb-ot-glyph.cc | 2 +-
+ src/main.cc        | 5 +++++
+ 3 files changed, 7 insertions(+), 1 deletion(-)
 
-commit 230adf2c417bbb6b5f367eb857dd6f98bea3ef26
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 18:49:52 2019 -0700
+commit 0e4b2676bdffeef3cb79b235bc9624f2a49dccad
+Author: ckitagawa-work <59700018+ckitagawa-work@users.noreply.github.com>
+Date:   Fri Jan 24 12:16:08 2020 -0500
 
-    [config] Add HB_NO_OT_FONT_GLYPH_NAMES
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [subset] sbix fix missed offset is_null() check
 
- src/hb-config.hh             | 1 +
- src/hb-ot-face-table-list.hh | 4 +++-
- src/hb-ot-font.cc            | 5 ++++-
- 3 files changed, 8 insertions(+), 2 deletions(-)
+ src/hb-ot-color-sbix-table.hh                           |   9 ++++++---
+ ...testcase-minimized-hb-subset-fuzzer-5747280156295168 | Bin 0 -> 98811 bytes
+ 2 files changed, 6 insertions(+), 3 deletions(-)
 
-commit b0debc32f6cedfa76a4851aa391f88ed1860955d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 18:42:39 2019 -0700
+commit 5532374f61284a254d5b2a8de9472c64f138c854
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 23 20:27:21 2020 +0330
 
-    [subset] Simplify collect_name_ids
+    [ot-glyph] Add a test for #2053
 
- src/hb-subset-plan.cc | 19 ++-----------------
- 1 file changed, 2 insertions(+), 17 deletions(-)
+ test/api/fonts/README                      |   2 ++
+ test/api/fonts/RanaKufi-Regular.subset.otf | Bin 0 -> 2260 bytes
+ test/api/test-ot-glyph.c                   |  26 ++++++++++++++++++++++++++
+ 3 files changed, 28 insertions(+)
 
-commit a5897463d4d0b83cb1bfe4ae1477dac4e3851252
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 18:36:35 2019 -0700
+commit f7187e90d2ec703f8f99f94077c5e449541c0462
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 24 20:22:27 2020 +0330
 
-    [config] Add HB_NO_STAT
+    [cmake] Don't build src/main
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Closes #2108
 
- src/hb-config.hh             | 1 +
- src/hb-ot-face-table-list.hh | 2 ++
- src/hb-subset-plan.cc        | 2 ++
- 3 files changed, 5 insertions(+)
+ CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit ffc2b8d56e5d35b4dc19499c830d8fc4b643213a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 18:33:29 2019 -0700
+commit 1a6d53d3c05ee5bce7bd3e2a86471a84377d21c0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 24 20:00:23 2020 +0330
 
-    [config] Don't include name table in face if HB_NO_NAME
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [ci] Increase msan and fedora-O0 bots subset fuzzer timeout
 
src/hb-ot-face-table-list.hh | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
.circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 1432df102ebf206592f92677f48bb950871675b3
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 18:32:40 2019 -0700
+commit 2d14735588e8a7a22e2c9801d70374835a058898
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 24 19:41:26 2020 +0330
+
+    [src/main] separate the places use private API, minor
+
+ src/main.cc | 191 +++++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 100 insertions(+), 91 deletions(-)
+
+commit 23277beef968aae8639f18f913eac8c69d323478
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 24 18:49:48 2020 +0330
+
+    Fold src/test-ot-glyph and src/test-ot-color into src/main
+
+ src/Makefile.am      |  10 --
+ src/main.cc          | 305 ++++++++++++++++++++++++++++++++++++++++++--
+ src/test-ot-color.cc | 347 ---------------------------------------------------
+ src/test-ot-glyph.cc | 143 ---------------------
+ 4 files changed, 297 insertions(+), 508 deletions(-)
+
+commit b72337e57e791dd7f043a910273c0b433922d8e2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 23 21:23:13 2020 +0330
+
+    [test] Adopt test-ot-color with ot-glyph and remove freetype/cairo dependecy
+
+ src/Makefile.am      |   8 +-
+ src/test-ot-color.cc | 237 +++++++++++++++++++++++++--------------------------
+ 2 files changed, 120 insertions(+), 125 deletions(-)
+
+commit e171beeb5f3f26dee84373b4db223512675f5837
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 24 19:51:21 2020 +0330
+
+    Revert "[subset] Add "--name-languages" and "--name-legacy" options"
+    
+    Causes tests failures, please reapply when tests are fixed, thanks.
+    
+    This reverts commit fd85818b5b85fb0ad2db71c60e94ca0689d38bca.
+
+ src/hb-ot-name-table.hh                            |  11 ----
+ src/hb-subset-input.cc                             |  23 --------
+ src/hb-subset-input.hh                             |   2 -
+ src/hb-subset-plan.cc                              |   3 --
+ src/hb-subset-plan.hh                              |   4 --
+ src/hb-subset.h                                    |   9 ----
+ test/api/hb-subset-test.h                          |   5 --
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 7392 -> 7460 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 7036 -> 7104 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 6684 -> 6752 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 6628 -> 6696 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 6608 -> 6676 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 182876 -> 182944 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 4844 -> 4912 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 4552 -> 4620 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 3988 -> 4056 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 4228 -> 4296 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 4236 -> 4304 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 151672 -> 151740 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 2852 -> 2920 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 2552 -> 2620 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 2240 -> 2308 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 2228 -> 2296 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 2228 -> 2296 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 151608 -> 151676 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 7132 -> 7204 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 6776 -> 6848 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 6424 -> 6496 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 6368 -> 6440 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 6348 -> 6420 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 182616 -> 182688 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf | Bin 7392 -> 0 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf | Bin 7036 -> 0 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttf    | Bin 6684 -> 0 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttf    | Bin 6628 -> 0 bytes
+ .../Comfortaa-Regular-new.name-languages.63.ttf    | Bin 6608 -> 0 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 182876 -> 0 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf | Bin 7392 -> 0 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    | Bin 7036 -> 0 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       | Bin 6684 -> 0 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       | Bin 6628 -> 0 bytes
+ .../Comfortaa-Regular-new.name-legacy.63.ttf       | Bin 6608 -> 0 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 182876 -> 0 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 9384 -> 9452 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 9036 -> 9104 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 8432 -> 8500 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 8628 -> 8696 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 8616 -> 8684 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 182940 -> 183008 bytes
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttf | Bin 2168 -> 0 bytes
+ .../Roboto-Regular.abc.name-languages.61,63.ttf    | Bin 1988 -> 0 bytes
+ .../Roboto-Regular.abc.name-languages.61.ttf       | Bin 1792 -> 0 bytes
+ .../Roboto-Regular.abc.name-languages.62.ttf       | Bin 1740 -> 0 bytes
+ .../Roboto-Regular.abc.name-languages.63.ttf       | Bin 1716 -> 0 bytes
+ ...lar.abc.name-languages.retain-all-codepoint.ttf | Bin 2168 -> 0 bytes
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttf    | Bin 2168 -> 0 bytes
+ .../Roboto-Regular.abc.name-legacy.61,63.ttf       | Bin 1988 -> 0 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttf   | Bin 1792 -> 0 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttf   | Bin 1740 -> 0 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttf   | Bin 1716 -> 0 bytes
+ ...egular.abc.name-legacy.retain-all-codepoint.ttf | Bin 2168 -> 0 bytes
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 2180 -> 2384 bytes
+ .../SourceSansPro-Regular.default.61,62,63.otf     | Bin 1892 -> 2096 bytes
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 2008 -> 2212 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 19796 -> 20000 bytes
+ ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 1992 -> 2196 bytes
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30208 -> 30412 bytes
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 2036 -> 2240 bytes
+ ...urceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 1796 -> 2000 bytes
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 1992 -> 2196 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 19636 -> 19840 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 1868 -> 2072 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30060 -> 30264 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 1876 -> 2080 bytes
+ ...-Regular.drop-hints-desubroutinize.61,62,63.otf | Bin 1672 -> 1876 bytes
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 1844 -> 2048 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 19728 -> 19932 bytes
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 1904 -> 2108 bytes
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30072 -> 30276 bytes
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 1960 -> 2164 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf  | Bin 1736 -> 1940 bytes
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 1860 -> 2064 bytes
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 19948 -> 20152 bytes
+ .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 2060 -> 2264 bytes
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 30224 -> 30428 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 2984 -> 3164 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 2580 -> 2760 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 2944 -> 3124 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 1436 -> 1616 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 1228 -> 1408 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 1464 -> 1644 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 3572 -> 4132 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 3540 -> 4100 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 4032 -> 4592 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 3572 -> 4132 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 3540 -> 4100 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 4032 -> 4592 bytes
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf  | Bin 2108 -> 2260 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 2532 -> 2684 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2776 -> 2928 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2076 -> 2228 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3072 -> 3224 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 1816 -> 1968 bytes
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf | Bin 1380 -> 1532 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 1804 -> 1956 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2048 -> 2200 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1348 -> 1500 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2344 -> 2496 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1088 -> 1240 bytes
+ test/subset/data/profiles/name-languages.txt       |   1 -
+ test/subset/data/profiles/name-legacy.txt          |   1 -
+ test/subset/data/tests/basics.tests                |   2 -
+ test/subset/generate-expected-outputs.py           |   6 ++-
+ util/options-subset.cc                             |  58 ---------------------
+ 114 files changed, 4 insertions(+), 121 deletions(-)
+
+commit 298c46afbfd48f014243be7d3e6dbba5e69d242d
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Fri Jan 24 12:11:07 2020 +0200
 
-    [config] Disable hb-ot-font code if HB_NO_OT_FONT
+    Only prefer AAT morx for horizontal layout
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Fixes #2124.
 
- src/hb-ot-font.cc | 5 +++++
- 1 file changed, 5 insertions(+)
+ src/hb-ot-shape.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
 
-commit b1a2384a5244ea3ea63ca94eb095c4add2cd451d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 17:34:12 2019 -0700
+commit fd85818b5b85fb0ad2db71c60e94ca0689d38bca
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jan 21 13:37:28 2020 -0800
+
+    [subset] Add "--name-languages" and "--name-legacy" options
+    Make name table subsetting consistent with fontTools
+
+ src/hb-ot-name-table.hh                            |  11 ++++
+ src/hb-subset-input.cc                             |  23 ++++++++
+ src/hb-subset-input.hh                             |   2 +
+ src/hb-subset-plan.cc                              |   3 ++
+ src/hb-subset-plan.hh                              |   4 ++
+ src/hb-subset.h                                    |   9 ++++
+ test/api/hb-subset-test.h                          |   5 ++
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 7460 -> 7392 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 7104 -> 7036 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 6752 -> 6684 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 6696 -> 6628 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 6676 -> 6608 bytes
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 182944 -> 182876 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 4912 -> 4844 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 4620 -> 4552 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 4056 -> 3988 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 4296 -> 4228 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 4304 -> 4236 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 151740 -> 151672 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 2920 -> 2852 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 2620 -> 2552 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 2308 -> 2240 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 2296 -> 2228 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 2296 -> 2228 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 151676 -> 151608 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 7204 -> 7132 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 6848 -> 6776 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 6496 -> 6424 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 6440 -> 6368 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 6420 -> 6348 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 182688 -> 182616 bytes
+ ...mfortaa-Regular-new.name-languages.61,62,63.ttf | Bin 0 -> 7392 bytes
+ .../Comfortaa-Regular-new.name-languages.61,63.ttf | Bin 0 -> 7036 bytes
+ .../Comfortaa-Regular-new.name-languages.61.ttf    | Bin 0 -> 6684 bytes
+ .../Comfortaa-Regular-new.name-languages.62.ttf    | Bin 0 -> 6628 bytes
+ .../Comfortaa-Regular-new.name-languages.63.ttf    | Bin 0 -> 6608 bytes
+ ...lar-new.name-languages.retain-all-codepoint.ttf | Bin 0 -> 182876 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,62,63.ttf | Bin 0 -> 7392 bytes
+ .../Comfortaa-Regular-new.name-legacy.61,63.ttf    | Bin 0 -> 7036 bytes
+ .../Comfortaa-Regular-new.name-legacy.61.ttf       | Bin 0 -> 6684 bytes
+ .../Comfortaa-Regular-new.name-legacy.62.ttf       | Bin 0 -> 6628 bytes
+ .../Comfortaa-Regular-new.name-legacy.63.ttf       | Bin 0 -> 6608 bytes
+ ...egular-new.name-legacy.retain-all-codepoint.ttf | Bin 0 -> 182876 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 9452 -> 9384 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 9104 -> 9036 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 8500 -> 8432 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 8696 -> 8628 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 8684 -> 8616 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 183008 -> 182940 bytes
+ .../Roboto-Regular.abc.name-languages.61,62,63.ttf | Bin 0 -> 2168 bytes
+ .../Roboto-Regular.abc.name-languages.61,63.ttf    | Bin 0 -> 1988 bytes
+ .../Roboto-Regular.abc.name-languages.61.ttf       | Bin 0 -> 1792 bytes
+ .../Roboto-Regular.abc.name-languages.62.ttf       | Bin 0 -> 1740 bytes
+ .../Roboto-Regular.abc.name-languages.63.ttf       | Bin 0 -> 1716 bytes
+ ...lar.abc.name-languages.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
+ .../Roboto-Regular.abc.name-legacy.61,62,63.ttf    | Bin 0 -> 2168 bytes
+ .../Roboto-Regular.abc.name-legacy.61,63.ttf       | Bin 0 -> 1988 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.61.ttf   | Bin 0 -> 1792 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.62.ttf   | Bin 0 -> 1740 bytes
+ .../basics/Roboto-Regular.abc.name-legacy.63.ttf   | Bin 0 -> 1716 bytes
+ ...egular.abc.name-legacy.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 2384 -> 2180 bytes
+ .../SourceSansPro-Regular.default.61,62,63.otf     | Bin 2096 -> 1892 bytes
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 2212 -> 2008 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 20000 -> 19796 bytes
+ ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 2196 -> 1992 bytes
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30412 -> 30208 bytes
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 2240 -> 2036 bytes
+ ...urceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 2000 -> 1796 bytes
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 2196 -> 1992 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 19840 -> 19636 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 2072 -> 1868 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30264 -> 30060 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 2080 -> 1876 bytes
+ ...-Regular.drop-hints-desubroutinize.61,62,63.otf | Bin 1876 -> 1672 bytes
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 2048 -> 1844 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 19932 -> 19728 bytes
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 2108 -> 1904 bytes
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 30276 -> 30072 bytes
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 2164 -> 1960 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf  | Bin 1940 -> 1736 bytes
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 2064 -> 1860 bytes
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 20152 -> 19948 bytes
+ .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 2264 -> 2060 bytes
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 30428 -> 30224 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 3164 -> 2984 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 2760 -> 2580 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 3124 -> 2944 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 1616 -> 1436 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 1408 -> 1228 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 1644 -> 1464 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 4132 -> 3572 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 4100 -> 3540 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 4592 -> 4032 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 4132 -> 3572 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 4100 -> 3540 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 4592 -> 4032 bytes
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf  | Bin 2260 -> 2108 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 2684 -> 2532 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2928 -> 2776 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2228 -> 2076 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3224 -> 3072 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 1968 -> 1816 bytes
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf | Bin 1532 -> 1380 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 1956 -> 1804 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2200 -> 2048 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1500 -> 1348 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2496 -> 2344 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1240 -> 1088 bytes
+ test/subset/data/profiles/name-languages.txt       |   1 +
+ test/subset/data/profiles/name-legacy.txt          |   1 +
+ test/subset/data/tests/basics.tests                |   2 +
+ test/subset/generate-expected-outputs.py           |   6 +--
+ util/options-subset.cc                             |  58 +++++++++++++++++++++
+ 114 files changed, 121 insertions(+), 4 deletions(-)
+
+commit c370da45ff0dd64c2868be313e640272931cffed
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Jan 22 11:36:15 2020 -0800
 
-    [ucd] Print out table sizes
+    [subset] Cmap table: remove encodingRecord entry for empty cmap4 subtable
 
- src/gen-ucd-table.py | 27 +++++++++++++++++++--------
- src/hb-ucd-table.hh  |  1 -
- 2 files changed, 19 insertions(+), 9 deletions(-)
+ src/hb-ot-cmap-table.hh                            |  10 ++++++----
+ test/api/fonts/Roboto-Regular.empty.ttf            | Bin 0 -> 1456 bytes
+ test/api/test-subset-cmap.c                        |  21 +++++++++++++++++++++
+ .../japanese/Mplus1p-Regular.default.25771.ttf     | Bin 0 -> 1976 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.25771.ttf  | Bin 0 -> 1248 bytes
+ test/subset/data/tests/japanese.tests              |   1 +
+ 6 files changed, 28 insertions(+), 4 deletions(-)
 
-commit f4de0c775408e34474a688361fa319251e1a9c18
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 17:08:26 2019 -0700
+commit d3fff622b35725bbdfb07fea98a58f56199991f4
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Thu Jan 23 11:36:47 2020 -0500
 
-    [config] Disable AAT map
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Move push call to caller
 
- src/hb-aat-map.cc  | 15 +++++++--------
- src/hb-ot-shape.cc |  6 ++++++
- 2 files changed, 13 insertions(+), 8 deletions(-)
+ src/hb-ot-color-sbix-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
 
-commit d8bf6723a1176ca26e97e8015044c8829ec77c36
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 17:04:16 2019 -0700
+commit 7dc341fe745bc1784b08efd4c658de292b958b0d
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Thu Jan 23 11:09:15 2020 -0500
 
-    [config] Disable more legacy kerning
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [subset] Fix UBSAN issue in sbix
 
- src/hb-ot-shape.cc | 4 +++-
- src/hb-ot-shape.hh | 8 ++++++++
- 2 files changed, 11 insertions(+), 1 deletion(-)
+ src/hb-ot-color-sbix-table.hh                             |   5 +++--
+ ...z-testcase-minimized-hb-subset-fuzzer-5753173985984512 | Bin 0 -> 616 bytes
+ 2 files changed, 3 insertions(+), 2 deletions(-)
 
-commit 43d7048d59b1a0af62b80bd914805bdec74a29d2
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 17:02:32 2019 -0700
+commit acb4627ebaf595e266cf294ef047e87084b520da
+Author: ariza <ariza@adobe.com>
+Date:   Wed Jan 22 12:28:30 2020 -0800
 
-    [config] More trak disabling
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    add api test
 
- src/hb-ot-shape.cc | 4 +++-
- src/hb-ot-shape.hh | 8 ++++++++
- 2 files changed, 11 insertions(+), 1 deletion(-)
+ test/api/fonts/AdobeVFPrototype.WA.gpos.otf  | Bin 0 -> 3948 bytes
+ test/api/fonts/AdobeVFPrototype.WAV.gpos.otf | Bin 0 -> 4448 bytes
+ test/api/test-subset-gpos.c                  |  27 +++++++++++++++++++++++++++
+ 3 files changed, 27 insertions(+)
 
-commit d84932ba50482b3b47e393714eb77b19173d1f14
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 16:57:48 2019 -0700
+commit 1ab3924b3171b408438f5df6a4d48124d9d1bd68
+Author: ariza <ariza@adobe.com>
+Date:   Wed Jan 22 11:20:56 2020 -0800
 
-    [config] add HB_NO_OT_SHAPE_FRACTIONS, enabled in HB_LEAN
+    refix PR #2087 subset PairPos1
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    also added oss-fuzz 20211 data fixed by this
 
- src/hb-config.hh   |  1 +
- src/hb-ot-shape.cc |  9 +++++++++
- src/hb-ot-shape.hh | 10 ++++++++++
- 3 files changed, 20 insertions(+)
+ src/hb-ot-layout-gpos-table.hh                           |  10 ++++------
+ ...-testcase-minimized-hb-subset-fuzzer-5206191479455744 | Bin 0 -> 3558 bytes
+ 2 files changed, 4 insertions(+), 6 deletions(-)
 
-commit eaf4a7364c28663720a9da57bf4d576b6009e17d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 16:51:13 2019 -0700
+commit 7633b7695e5b6188d6180fc5592c0678f03327ed
+Merge: 3747b329 02f324c9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 23 18:51:40 2020 +0330
 
-    [config] Minor trak disable
+    Merge pull request #2016 from ebraminio/glyf
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
-
- src/hb-ot-shape.cc | 2 ++
- 1 file changed, 2 insertions(+)
+    Implement glyph outline path API
 
-commit 971330c0588307bcd73934e44c6343db55b1f5b6
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 16:37:35 2019 -0700
+commit 02f324c9499a95463c363926a0f38c261fad7117
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 23 15:12:12 2020 +0330
 
-    [config] Add HB_NO_LANGUAGE_PRIVATE_SUBTAG
+    [ot-glyph] remove open callback
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Apparently it wasn't requested actually and can be detected easily
+    as paths are opened usually when move command is issued anyway.
 
- src/hb-config.hh | 1 +
- src/hb-ot-tag.cc | 4 ++++
- 2 files changed, 5 insertions(+)
+ docs/harfbuzz-sections.txt |  2 --
+ src/hb-ot-cff1-table.cc    |  2 +-
+ src/hb-ot-cff2-table.cc    |  2 +-
+ src/hb-ot-glyf-table.hh    |  1 -
+ src/hb-ot-glyph.cc         | 31 ++++++++-----------------------
+ src/hb-ot-glyph.h          |  5 -----
+ src/hb-ot-glyph.hh         |  1 -
+ src/test-ot-glyph.cc       |  1 +
+ test/api/test-ot-glyph.c   |  4 ----
+ 9 files changed, 11 insertions(+), 38 deletions(-)
 
-commit f642a5fa6c42b145574593a0e18815dc74d3c617
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 16:36:09 2019 -0700
+commit 684ff3e0cd77dfa5e83c2110ea613b8b9678d4f5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 23 14:48:59 2020 +0330
 
-    Restructure code
+    [ot-glyph] noop->nil, fix close path
 
- src/hb-ot-tag.cc | 44 ++++++++++++++++++++------------------------
- 1 file changed, 20 insertions(+), 24 deletions(-)
+ src/hb-ot-cff1-table.cc  | 10 +++++-----
+ src/hb-ot-cff2-table.cc  |  6 +++---
+ src/hb-ot-glyph.cc       | 23 ++++++++++-------------
+ test/api/test-ot-glyph.c | 22 +++++++++++-----------
+ 4 files changed, 29 insertions(+), 32 deletions(-)
 
-commit d2ff73b256599a655e4ddedbe1ca75abdf837d23
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 16:28:08 2019 -0700
+commit 3747b329b2a8be0f234fca861364951bf9de1797
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Wed Jan 22 09:07:32 2020 -0500
 
-    [config] Remove remaining AAT context bits if HB_NO_OT_KERN
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Address garretrieger@'s comments
 
- src/hb-aat-layout.cc | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
+ src/hb-ot-color-sbix-table.hh | 18 ++++++++----------
+ 1 file changed, 8 insertions(+), 10 deletions(-)
 
-commit 588697afd0ddf411e8201866ade1f593ccb61aab
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 16:24:51 2019 -0700
+commit b18cb5b5ee56477e85cf82b299ac08df6202b148
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Tue Jan 21 15:43:12 2020 -0500
 
-    [config] Add HB_NO_OT_KERN, enabled by HB_MINI / HB_NO_LEGACY
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Add second fixed test
 
- src/hb-config.hh             |  1 +
- src/hb-ot-face-table-list.hh |  6 +++++-
- src/hb-ot-layout.cc          |  4 ++--
- src/hb-ot-shape.cc           | 16 ++++++++++++++--
- src/hb-ot-shape.hh           |  4 ++++
- 5 files changed, 26 insertions(+), 5 deletions(-)
+ ...estcase-minimized-hb-subset-fuzzer-5747028458209280 | Bin 0 -> 100109 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit 2e3e929d2b0fa6026c55eb92f91de0498fb22646
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 15:50:13 2019 -0700
+commit af62c1c3b036904a18e0ed0748ead255029bc9f3
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Tue Jan 21 15:19:33 2020 -0500
 
-    Fix build
+    Fix style issue
 
- src/hb-ot-face-table-list.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-ot-color-sbix-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
 
-commit 631da9d816da381c5fd4b3cc640c41fda736a96f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 19 15:36:14 2019 -0700
+commit 8614a30bc9763ba7f8b452df5527d806bacf4fd9
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Tue Jan 21 15:14:03 2020 -0500
 
-    [config] Remove tables from hb_face_t for disabled features
+    [subset] Fix sbix fuzz problem
+
+ src/hb-ot-color-sbix-table.hh                       |  20 +++++++++++++-------
+ ...case-minimized-hb-subset-fuzzer-5741295280848896 | Bin 0 -> 98822 bytes
+ 2 files changed, 13 insertions(+), 7 deletions(-)
+
+commit 72cbfb9059ac4f041cffaef86a1d8067a93b16ec
+Author: ariza <ariza@adobe.com>
+Date:   Sat Jan 18 16:35:52 2020 -0800
+
+    remove empty lookup subtables
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Added a variant of subset_offset_array which takes an extra arg passed to serialize_subset for this impl.
+    Added a new api test "test-subset-gpos" for this.
 
- src/Makefile.sources         |   1 +
- src/hb-ot-face-table-list.hh | 112 +++++++++++++++++++++++++++++++++++++++++++
- src/hb-ot-face.cc            |   8 +---
- src/hb-ot-face.hh            |  52 ++------------------
- src/hb-ot-layout.cc          |   2 +
- 5 files changed, 120 insertions(+), 55 deletions(-)
+ src/hb-ot-layout-common.hh                 |  70 ++++++++++++++++++++++++-----
+ src/hb-ot-layout-gpos-table.hh             |   6 +++
+ src/hb-ot-layout-gsub-table.hh             |   6 +++
+ test/api/Makefile.am                       |   2 +
+ test/api/fonts/Roboto-Regular-gpos-.aw.ttf | Bin 0 -> 2368 bytes
+ test/api/fonts/Roboto-Regular-gpos-aw.ttf  | Bin 0 -> 2232 bytes
+ test/api/test-subset-gpos.c                |  65 +++++++++++++++++++++++++++
+ 7 files changed, 139 insertions(+), 10 deletions(-)
 
-commit e710888188ff3285a162c25c89d886d9535d9f02
-Author: Misty De Meo <mistydemeo@gmail.com>
-Date:   Tue Jun 18 15:20:38 2019 -0700
+commit a3cf4ae0804f2971bcda4266dbeec245bce21eb1
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Jan 17 13:02:47 2020 -0800
+
+    [subset] Add more tests for GPOS1 subsetting
+    These tests were left out because of issue: https://github.com/fonttools/fonttools/issues/1709
+    Now re-adding these tests since the issue is resolved.
+
+ .../gpos1_2_font.keep-layout-retain-gids.41.otf          | Bin 0 -> 1932 bytes
+ .../layout.gpos/gpos1_2_font.keep-layout.41,43.otf       | Bin 0 -> 1352 bytes
+ .../layout.gpos/gpos1_2_font.keep-layout.41,46.otf       | Bin 0 -> 1484 bytes
+ .../expected/layout.gpos/gpos1_2_font.keep-layout.41.otf | Bin 0 -> 1232 bytes
+ .../layout.gpos/gpos1_2_font.keep-layout.42,44.otf       | Bin 0 -> 1268 bytes
+ .../layout.gpos/gpos1_2_font.keep-layout.43,46.otf       | Bin 0 -> 1348 bytes
+ .../gpos1_2_font.keep-layout.retain-all-codepoint.otf    | Bin 0 -> 3668 bytes
+ test/subset/data/tests/layout.gpos.tests                 |   2 ++
+ 8 files changed, 2 insertions(+)
+
+commit 8f49aaa16f2dff5902142988b3a5a039a03129eb
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Jan 16 15:15:15 2020 -0800
 
-    coretext: remove trailing macro from SCRATCH_RESTORE
+    minor: un-include glyf.hh in gvar.hh
 
- src/hb-coretext.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-var-gvar-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
 
-commit 10bac21bb5b25cf20c2198934e99e444625dfd97
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 15:15:06 2019 -0700
+commit c828d7bf76dd039be1775edff1d798dbcc10708b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Jan 15 15:32:44 2020 -0800
 
-    [coretext/uniscribe/directwrite] Remove extra semicolons
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/pull/1783
+    [subset] fixed GPOS device table sanitize & serialize (#2087)
 
- src/hb-coretext.cc    | 2 +-
- src/hb-directwrite.cc | 2 +-
- src/hb-uniscribe.cc   | 2 +-
- 3 files changed, 3 insertions(+), 3 deletions(-)
+ src/hb-ot-layout-gpos-table.hh | 112 ++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 93 insertions(+), 19 deletions(-)
 
-commit f0b0fd4e78e94315c9d01b9232ebfb09bbfef556
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 14:40:24 2019 -0700
+commit e565d1f9bcf3d9bf607e194e3a9cf06f5d2e3633
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Nov 1 10:21:36 2019 -0700
+
+    [subset] subset lookup/feature/script lists for GSUB/GPOS
+
+ src/hb-ot-layout-common.hh                         | 396 +++++++++++++++++----
+ src/hb-ot-layout-gpos-table.hh                     |   5 +-
+ src/hb-ot-layout-gsub-table.hh                     |   5 +-
+ src/hb-ot-layout-gsubgpos.hh                       |  41 ++-
+ test/api/test-ot-face.c                            |   7 +
+ .../gpos1_2_font.keep-layout-retain-gids.42,44.otf | Bin 0 -> 1992 bytes
+ ...s2_1_font7.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 1988 bytes
+ .../gpos2_1_font7.keep-layout.41,42,43.otf         | Bin 0 -> 1288 bytes
+ ...s2_2_font5.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 1988 bytes
+ .../gpos2_2_font5.keep-layout.41,42,43.otf         | Bin 0 -> 1288 bytes
+ ...pos3_font3.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 1984 bytes
+ .../gpos3_font3.keep-layout.41,42,43.otf           | Bin 0 -> 1284 bytes
+ ...ubrules_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2044 bytes
+ ...1_multiple_subrules_f1.keep-layout.41,42,43.otf | Bin 0 -> 1344 bytes
+ ...ubrules_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2044 bytes
+ ...2_multiple_subrules_f1.keep-layout.41,42,43.otf | Bin 0 -> 1344 bytes
+ ..._simple_f2.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2020 bytes
+ ...ub_chaining3_simple_f2.keep-layout.41,42,43.otf | Bin 0 -> 1320 bytes
+ test/subset/data/tests/layout.gpos.tests           |   1 +
+ test/subset/data/tests/layout.gpos2.tests          |   1 +
+ test/subset/data/tests/layout.gpos3.tests          |   1 +
+ test/subset/data/tests/layout.gsub6.tests          |   1 +
+ 22 files changed, 380 insertions(+), 78 deletions(-)
+
+commit 93376a64362a0d062aa3f9f39bfe0d7b4328a92e
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Wed Jan 15 13:11:40 2020 -0500
+
+    Add unittests
+
+ src/hb-subset-input.cc                             |   2 -
+ test/api/Makefile.am                               |   2 +
+ test/api/fonts/sbix.ttf                            | Bin 0 -> 193528 bytes
+ test/api/fonts/sbix_X.ttf                          | Bin 0 -> 121168 bytes
+ test/api/test-subset-sbix.c                        |  81 +++++++++++++++++++++
+ .../data/expected/sbix/sbix.default.58,59.ttf      | Bin 196080 -> 193528 bytes
+ test/subset/data/expected/sbix/sbix.default.58.ttf | Bin 122736 -> 121168 bytes
+ test/subset/data/expected/sbix/sbix.default.59.ttf | Bin 90344 -> 89364 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58,59.ttf     | Bin 196080 -> 193528 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58.ttf        | Bin 122736 -> 121168 bytes
+ .../sbix/sbix.drop-hints-retain-gids.59.ttf        | Bin 90384 -> 89404 bytes
+ .../data/expected/sbix/sbix.drop-hints.58,59.ttf   | Bin 196080 -> 193528 bytes
+ .../data/expected/sbix/sbix.drop-hints.58.ttf      | Bin 122736 -> 121168 bytes
+ .../data/expected/sbix/sbix.drop-hints.59.ttf      | Bin 90344 -> 89364 bytes
+ .../data/expected/sbix/sbix.retain-gids.58,59.ttf  | Bin 196080 -> 193528 bytes
+ .../data/expected/sbix/sbix.retain-gids.58.ttf     | Bin 122736 -> 121168 bytes
+ .../data/expected/sbix/sbix.retain-gids.59.ttf     | Bin 90384 -> 89404 bytes
+ test/subset/data/fonts/sbix.ttf                    | Bin 196080 -> 193528 bytes
+ 18 files changed, 83 insertions(+), 2 deletions(-)
+
+commit 6bcf57eaa3d9b1381e384743a2fbee912d72474e
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Tue Jan 14 14:56:02 2020 -0500
+
+    Simplify copy and add fuzzing coverage
+
+ src/hb-ot-color-sbix-table.hh |   7 ++-----
+ test/fuzzing/fonts/sbix.ttf   | Bin 0 -> 196080 bytes
+ 2 files changed, 2 insertions(+), 5 deletions(-)
 
-    Remove dead code
+commit 78b50a67be6fb40e715132eabe9b05c64ddd99c8
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Tue Jan 14 11:01:09 2020 -0500
 
- src/hb-ot-layout.cc | 10 ++--------
- 1 file changed, 2 insertions(+), 8 deletions(-)
+    Address initial comments
 
-commit d7e27cd65a085a76c85cddd93cea48ce4b7be03f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 14:38:05 2019 -0700
+ src/hb-ot-color-sbix-table.hh                      |  49 +++++++++------------
+ .../data/expected/sbix/sbix.default.58,59.ttf      | Bin 0 -> 196080 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58,59.ttf     | Bin 0 -> 196080 bytes
+ .../data/expected/sbix/sbix.drop-hints.58,59.ttf   | Bin 0 -> 196080 bytes
+ .../data/expected/sbix/sbix.retain-gids.58,59.ttf  | Bin 0 -> 196080 bytes
+ test/subset/data/tests/sbix.tests                  |   2 +-
+ 6 files changed, 23 insertions(+), 28 deletions(-)
 
-    [config] Don't use VORG table if HB_NO_OT_FONT_CFF
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+commit 43b6c865aeb763944362375e1c345afcd60211b4
+Author: ckitagawa <ckitagawa@chromium.org>
+Date:   Thu Jan 9 10:44:20 2020 -0500
 
- src/hb-ot-font.cc | 2 ++
- 1 file changed, 2 insertions(+)
+    [subset] Support sbix subsetting
 
-commit 37f8ebff5f1973423c7e4ed9dea88881d0642b61
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 14:33:49 2019 -0700
+ src/hb-ot-color-sbix-table.hh                      | 126 +++++++++++++++++++++
+ src/hb-subset.cc                                   |   4 +
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ test/subset/data/expected/sbix/sbix.default.58.ttf | Bin 0 -> 122736 bytes
+ test/subset/data/expected/sbix/sbix.default.59.ttf | Bin 0 -> 90344 bytes
+ .../sbix/sbix.drop-hints-retain-gids.58.ttf        | Bin 0 -> 122736 bytes
+ .../sbix/sbix.drop-hints-retain-gids.59.ttf        | Bin 0 -> 90384 bytes
+ .../data/expected/sbix/sbix.drop-hints.58.ttf      | Bin 0 -> 122736 bytes
+ .../data/expected/sbix/sbix.drop-hints.59.ttf      | Bin 0 -> 90344 bytes
+ .../data/expected/sbix/sbix.retain-gids.58.ttf     | Bin 0 -> 122736 bytes
+ .../data/expected/sbix/sbix.retain-gids.59.ttf     | Bin 0 -> 90384 bytes
+ test/subset/data/fonts/sbix.ttf                    | Bin 0 -> 196080 bytes
+ test/subset/data/tests/sbix.tests                  |  13 +++
+ test/subset/generate-expected-outputs.py           |   1 +
+ test/subset/run-tests.py                           |   3 +-
+ 16 files changed, 148 insertions(+), 1 deletion(-)
+
+commit 79fed9a1e42397ed4044d3ce8f042309f0e4cde8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 14 17:23:30 2020 +0330
+
+    [ot-glyph] Add open/close callbacks
 
-    [config] Fixup for AAT ltag table access
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+ docs/harfbuzz-sections.txt |  4 ++++
+ src/hb-ot-cff1-table.cc    |  4 ++--
+ src/hb-ot-cff2-table.cc    |  4 ++--
+ src/hb-ot-glyf-table.hh    |  9 ++++++--
+ src/hb-ot-glyph.cc         | 39 +++++++++++++++++++++++++++++++
+ src/hb-ot-glyph.h          | 10 ++++++++
+ src/hb-ot-glyph.hh         |  2 ++
+ src/test-ot-glyph.cc       |  6 +++++
+ test/api/test-ot-glyph.c   | 57 +++++++++++++++++++++++++++++-----------------
+ 9 files changed, 108 insertions(+), 27 deletions(-)
 
- src/hb-aat-layout.hh    | 8 --------
- src/hb-ot-name-table.hh | 2 +-
- 2 files changed, 1 insertion(+), 9 deletions(-)
+commit ec1fba1388c329c7216bcdaa9a86627abfc85637
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 13 19:31:18 2020 +0330
 
-commit f08066ce9a41469e2a7396f0accd61e1c02e5649
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 14:29:27 2019 -0700
+    [ot-glyph] make hb_ot_glyph_decompose_funcs_t struct opaque
 
-    [config] One more morx disabling
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+ docs/harfbuzz-sections.txt |  11 +++-
+ src/Makefile.sources       |   1 +
+ src/hb-ot-cff1-table.cc    |  11 ++--
+ src/hb-ot-cff1-table.hh    |   2 +-
+ src/hb-ot-cff2-table.cc    |   7 +-
+ src/hb-ot-cff2-table.hh    |   2 +-
+ src/hb-ot-glyf-table.hh    |   3 +-
+ src/hb-ot-glyph.cc         | 156 ++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-glyph.h          |  41 ++++++++----
+ src/hb-ot-glyph.hh         |  44 +++++++++++++
+ src/test-ot-glyph.cc       |  14 ++--
+ test/api/test-ot-face.c    |  34 ++--------
+ test/api/test-ot-glyph.c   |  51 ++++++---------
+ 13 files changed, 281 insertions(+), 96 deletions(-)
+
+commit 8ffc9add2237899afc57184ad3297404659bc1cd
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Oct 31 15:59:02 2019 -0700
 
- src/hb-ot-layout.cc | 3 +++
- 1 file changed, 3 insertions(+)
+    [subset] layout closure_features and store them in subset-plan
 
-commit 231d0257883ec9e8904afae1adfd73f3c225f177
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 14:25:52 2019 -0700
+ docs/harfbuzz-sections.txt   |  1 +
+ src/hb-ot-layout-common.hh   | 35 ++++++++++++++++++++++++++++
+ src/hb-ot-layout-gsubgpos.hh | 14 +++++++++++
+ src/hb-ot-layout.cc          | 21 +++++++++++++++++
+ src/hb-ot-layout.h           |  6 +++++
+ src/hb-subset-plan.cc        | 55 +++++++++++++++++++++++++++++++-------------
+ src/hb-subset-plan.hh        |  4 ++++
+ 7 files changed, 120 insertions(+), 16 deletions(-)
 
-    [config] Don't compile AAT API if HB_NO_AAT
+commit 66dfd605b5b9aaf74ff806ba1719ca09a1003909
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Mon Jan 13 15:50:27 2020 +0200
+
+    Fix duplicate check in hb_ot_rotate chars
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Fixes #2099. Fix indentation in mirroring section as well.
 
- src/hb-aat-layout.cc | 131 ++++++++++++++++-----------------------------------
- src/hb-ot-shape.cc   |  19 ++++++--
- 2 files changed, 56 insertions(+), 94 deletions(-)
+ src/hb-ot-shape.cc | 1 -
+ 1 file changed, 1 deletion(-)
 
-commit bf9424a9a198b99d49c005536a10f27387630064
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 13:31:35 2019 -0700
+commit d7c3cb18ee6b2ffe529c5d703fae1cd965f39dc9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 13 17:35:57 2020 +0330
 
-    [config] Don't compile unused layout API if HB_NO_LAYOUT_UNUSED
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [ot-glyph] minor on tests
 
- src/hb-ot-layout.cc | 16 ++--------------
- 1 file changed, 2 insertions(+), 14 deletions(-)
+ src/test-ot-glyph.cc     | 28 +++++++----------
+ test/api/test-ot-face.c  | 13 ++++----
+ test/api/test-ot-glyph.c | 81 ++++++++++++++++++++++++++++++++++--------------
+ 3 files changed, 77 insertions(+), 45 deletions(-)
 
-commit eb9798ef733da53e69966054b67752cd8937eb7b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 13:29:55 2019 -0700
+commit dc03a993d0f2b6db7c5cfb11eaa6e8a4f6f274e6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jan 12 14:21:29 2020 +0330
 
-    [config] Dont' compile buffer message API if HB_NO_BUFFER_MESSAGE
+    Fix collect lookups logic of FeatureTableSubstitution (#2097)
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    https://crbug.com/oss-fuzz/20036
 
- src/hb-buffer.cc | 2 ++
- src/hb-buffer.hh | 5 ++++-
- 2 files changed, 6 insertions(+), 1 deletion(-)
+ src/hb-ot-layout-common.hh                               |   6 +++---
+ ...-testcase-minimized-hb-subset-fuzzer-5715299773186048 | Bin 0 -> 6717 bytes
+ 2 files changed, 3 insertions(+), 3 deletions(-)
 
-commit be1c0ab2186a728eabdf6666632a9f759474f901
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 13:26:03 2019 -0700
+commit a32ecc15aec6518f5a126fb8f3643e563327f74d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jan 11 15:37:24 2020 +0330
 
-    [config] Don't compile buffer serialize API if HB_NO_BUFFER_SERIALIZE
+    Fix collect lookups logic of FeatureVariationRecord
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
-
- src/hb-buffer-serialize.cc   | 19 +++++++------------
- src/test-buffer-serialize.cc |  7 ++++++-
- 2 files changed, 13 insertions(+), 13 deletions(-)
+    As "Offset to a feature table substitution table, from beginning of the FeatureVariations table."
+    from https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2 the record should
+    match its sanitize logic not the reverse way.
+    
+    Fixes https://crbug.com/oss-fuzz/20021 and https://crbug.com/oss-fuzz/20022
 
-commit bdbabd110cfdb4c59cf24bd500ce63073a5213e4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 13:21:25 2019 -0700
+ src/hb-ot-layout-common.hh                                 |   7 ++++---
+ ...zz-testcase-minimized-hb-subset-fuzzer-5167653459329024 | Bin 0 -> 46 bytes
+ ...zz-testcase-minimized-hb-subset-fuzzer-5642531954229248 | Bin 0 -> 46 bytes
+ 3 files changed, 4 insertions(+), 3 deletions(-)
 
-    Minor header include cleanup
+commit 1a4c658b43152ab01bcb6d151940c09cc1e8fc56
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jan 11 01:30:05 2020 +0330
 
- src/hb-aat-layout.cc | 1 -
- src/hb-ot-math.cc    | 3 ---
- src/hb-ot-name.cc    | 1 -
- src/hb-ot-var.cc     | 4 ++--
- 4 files changed, 2 insertions(+), 7 deletions(-)
+    Use REPLACEME tag
+    
+    So we can use the version we like when we decide what it should be while the next release
+    and can review the API before the release one other time.
 
-commit 83de3a60ab7383cf3ee25c1f8c33a45a7778d003
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 13:18:15 2019 -0700
+ src/hb-ot-layout.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
 
-    [config] Don't compile color API if HB_NO_COLOR
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+commit d7454cf07eeb87600d8fcf23ada3617b6bda0f35
+Merge: 9cd76813 0b39c480
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jan 11 01:24:39 2020 +0330
 
- src/hb-ot-color.cc   | 55 +++++++++-------------------------------------------
- src/test-ot-color.cc |  9 ++++++++-
- 2 files changed, 17 insertions(+), 47 deletions(-)
+    [subset] closure lookups for GSUB/GPOS
 
-commit 350f98ea47aaf0fe008065b92c8b6fe2bc519fa7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 13:11:41 2019 -0700
+commit 0b39c48064864850193bc80e2566839546be3551
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Oct 22 16:00:43 2019 -0700
 
-    [config] Don't compile name table API if HB_NO_NAME
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [subset] closure lookups for GSUB/GPOS
 
- src/hb-ot-name.cc   | 25 +++++--------------------
- src/test-ot-name.cc |  5 ++++-
- 2 files changed, 9 insertions(+), 21 deletions(-)
+ docs/harfbuzz-sections.txt     |   1 +
+ src/hb-ot-layout-common.hh     |  30 ++++++++
+ src/hb-ot-layout-gpos-table.hh |  42 +++++++++++
+ src/hb-ot-layout-gsub-table.hh |  39 ++++++++++
+ src/hb-ot-layout-gsubgpos.hh   | 158 ++++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-layout.cc            |  44 ++++++++++++
+ src/hb-ot-layout.h             |   6 ++
+ src/hb-subset-plan.cc          |  56 +++++++++++++--
+ src/hb-subset-plan.hh          |   4 ++
+ test/api/test-ot-face.c        |   5 ++
+ 10 files changed, 379 insertions(+), 6 deletions(-)
 
-commit da51a2cb0efae664d4ee83c6036f29a21621e993
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 13:09:22 2019 -0700
+commit 42f4f1ea5013e9879fdb008021956c32247fa3db
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jan 11 00:00:51 2020 +0330
 
-    [config] Don't compile math API if HB_NO_MATH
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [ot-glyph] Add tests for hb_ot_glyph_decompose
 
- src/hb-ot-math.cc | 47 +++++++----------------------------------------
- 1 file changed, 7 insertions(+), 40 deletions(-)
+ src/hb-ot-glyf-table.hh  |   2 +-
+ test/api/Makefile.am     |   1 +
+ test/api/test-ot-face.c  |  24 +++---
+ test/api/test-ot-glyph.c | 190 +++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 207 insertions(+), 10 deletions(-)
 
-commit 737436d3f8aacfd0bd586cd54d7034bae3afc4e1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 13:07:44 2019 -0700
+commit 06a1fcb3b47050257f7819eb3d6043cf78ebbac2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 10 23:12:30 2020 +0330
 
-    Streamline HB_NO_CFF
+    [ot-glyphs] fix the tests
 
- src/hb-ot-cff1-table.cc     | 7 +++++--
- src/hb-ot-cff2-table.cc     | 7 +++++--
- src/hb-subset-cff-common.cc | 7 +++++++
- src/hb-subset-cff1.cc       | 7 +++++--
- src/hb-subset-cff2.cc       | 7 +++++--
- 5 files changed, 27 insertions(+), 8 deletions(-)
+ src/hb-ot-cff1-table.cc |  4 ++--
+ src/hb-ot-cff2-table.cc |  2 +-
+ src/hb-ot-glyph.h       |  2 +-
+ test/api/test-ot-face.c | 25 +++++++++++++++++++++++--
+ 4 files changed, 27 insertions(+), 6 deletions(-)
 
-commit 60653a7adbbd8143d187b3edf33cb7a2dddadf74
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 13:01:11 2019 -0700
+commit 084a8182fb5c79cb8ebb41e015992fc4e4daea4a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 10 22:14:46 2020 +0330
 
-    Remove HB_VECTOR_SIZE
-    
-    It was cumbersome to get it to work reliably, for dubious performance
-    gain, mostly in the subsetter maybe...
+    [ot-glyphs] Move CFF glyph decompose logic to their tables
     
-    Life is easier without.  It was disabled forever anyway.
+    Thus making path decompose zero alloc on CFF/CFF2
 
- src/hb-algs.hh   | 36 +++++++++---------------------------
- src/hb-null.hh   |  4 ++--
- src/hb-static.cc |  4 ++--
- src/hb.hh        | 32 --------------------------------
- 4 files changed, 13 insertions(+), 63 deletions(-)
+ docs/harfbuzz-sections.txt | 14 ++++----
+ src/hb-ot-cff1-table.cc    | 85 +++++++++++++++++++++++++++-------------------
+ src/hb-ot-cff1-table.hh    |  3 +-
+ src/hb-ot-cff2-table.cc    | 62 ++++++++++++++++-----------------
+ src/hb-ot-cff2-table.hh    |  6 ++--
+ src/hb-ot-glyph.cc         | 41 ++--------------------
+ 6 files changed, 93 insertions(+), 118 deletions(-)
 
-commit 24060d3aa77f1e1a18960cc61c3d1ac241875507
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 12:50:42 2019 -0700
+commit 61185235025db6b205dea65c5423905d69c457cd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 10 21:08:21 2020 +0330
 
-    Add hb_bitwise_neg
+    [ot-glyph] move glyph decompose logic of glyf to itself
+    
+    One less vector allocation yet isn't zero alloc yet
+    which needs more work.
 
- src/hb-algs.hh | 33 +++++++++++++++++++++------------
- 1 file changed, 21 insertions(+), 12 deletions(-)
+ src/hb-ot-glyf-table.hh | 31 +++++++++++++++----------------
+ src/hb-ot-glyph.cc      | 16 ++++++----------
+ src/test-ot-glyph.cc    |  7 ++++++-
+ 3 files changed, 27 insertions(+), 27 deletions(-)
 
-commit 7cf9169078f35299ec0633a7b212256acdd71661
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 12:44:03 2019 -0700
+commit 017f606c83cbf410cb61b7a4cdc2e9cd1bb3e1b6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 10 20:44:15 2020 +0330
 
-    Remove accidentally left cruft
+    [ot-glyph] rewrite the API
 
- src/hb-algs.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-glyph.cc   | 176 ++++++++++++---------------------------------------
+ src/hb-ot-glyph.h    |  59 +++++++++--------
+ src/test-ot-glyph.cc |  83 +++++++++++++++---------
+ 3 files changed, 126 insertions(+), 192 deletions(-)
 
-commit 6172ec5d879653c536d7cb3d3b3760fbb6d0f3f3
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jun 18 12:41:56 2019 -0700
+commit 9cd76813ab0280238dd7baa1bc58405333e5fa5d
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Fri Jan 10 17:36:41 2020 +0200
 
-    Remove (unused) posix_memalign fallback
-    
-    Was wrong.  The returned pointer couldn't be passed to free().  Ouch!
+    Fix malformed readme. (#2093)
 
- configure.ac |  2 +-
- src/hb.hh    | 34 ----------------------------------
- 2 files changed, 1 insertion(+), 35 deletions(-)
+ README.md | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit eb28d6e48b02a8c49875cfcd084a16c1c66c367e
+commit 05443e55bc232f0a6a08d5ef6cc58ebf3e373ee7
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jun 18 12:14:10 2019 +0430
+Date:   Thu Nov 28 09:16:58 2019 +0330
 
-    [ci] Test no build system builds
-    
-    Introduced in aa3450c, let's preserve it
+    [ot-glyph] Return empty path for empty faces
 
.circleci/config.yml | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
src/hb-ot-glyph.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit efef672911dd6c3b80e53294f3fcd59dbb64597a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 22:57:51 2019 -0700
+commit 6e7602c1049a1b409c1db61ac2dfa2d2b57a170d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 28 08:43:00 2019 +0330
 
-    Fix cmake build
-    
-    Hopefullly.
+    [ot-glyph] Fix leaks
 
CMakeLists.txt | 4 ----
- 1 file changed, 4 deletions(-)
src/hb-ot-glyph.cc | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
 
-commit aa3450cac148280f747fb88864b6fcc4ec70cc51
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 22:41:49 2019 -0700
+commit 5b08596d60f4e8b8efb92d3701eeb100bdad71ca
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Nov 28 08:42:45 2019 +0330
 
-    [config] Don't compile disabled features
-    
-    This makes it possible to include all .cc files into build, even if not
-    building CoreText, Uniscribe, etc.
-    
-    This was mostly to help custom builders.  But also means that we can
-    include all files in our own build system.  Not sure if we should.
-    Definitely simplifies things, but slightly only.
+    [gvar] Don't apply anything when no coords is given
 
- src/Makefile.am              | 1 +
- src/hb-coretext.cc           | 6 ++++++
- src/hb-directwrite.cc        | 6 ++++++
- src/hb-ft.cc                 | 5 +++++
- src/hb-glib.cc               | 5 +++++
- src/hb-gobject-enums.cc.tmpl | 7 +++++++
- src/hb-gobject-structs.cc    | 5 +++++
- src/hb-graphite2.cc          | 7 +++++++
- src/hb-icu.cc                | 5 +++++
- src/hb-uniscribe.cc          | 4 ++++
- 10 files changed, 51 insertions(+)
+ src/hb-ot-var-gvar-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
 
-commit 33d8b76e74579a27b06fa788d0bf696a9dd44cc4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 21:54:20 2019 -0700
+commit 742aaa136343e1aed223612f0801a7e17bb92936
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Nov 27 23:18:43 2019 +0330
 
-    [config] Flesh out CONFIG.md
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [ot-glyf] Fix leak issue
 
- CONFIG.md | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
- 1 file changed, 84 insertions(+), 3 deletions(-)
+ src/hb-ot-glyph.cc | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 23ccd00a3d5033b812f2bebcc5b793a4415b252b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 20:35:04 2019 -0700
+commit fddf79fc3735274f0252596c28fff8034916b1ca
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 21 14:11:27 2019 +0330
 
-    Minor
+    [glyf] minor
 
- src/hb-config.hh | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ src/hb-ot-glyf-table.hh | 7 ++-----
+ test/api/test-ot-face.c | 3 +++
+ 2 files changed, 5 insertions(+), 5 deletions(-)
 
-commit 23768a99e08cbe691772b7514c023d3184989ff8
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 20:29:29 2019 -0700
+commit 0b559d750fbc2a99d1605e1c35c228f938bf2bf1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 21 13:52:48 2019 +0330
 
-    [config] Replace HAVE_FALLBACK with HB_NO_FALLBACK_SHAPE
-    
-    This disables fallback shaper in tiny builds.  Projects that don't
-    use our build system and want to disable fallback shaper (eg. Firefox)
-    should define HB_NO_FALLBACK_SHAPE now.
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [ot-glyph] Improve API names
 
- CMakeLists.txt           | 2 --
- configure.ac             | 8 --------
- src/Makefile.am          | 4 ----
- src/Makefile.sources     | 5 +----
- src/hb-config.hh         | 1 +
- src/hb-fallback-shape.cc | 3 +++
- src/hb-shaper-list.hh    | 2 +-
- 7 files changed, 6 insertions(+), 19 deletions(-)
+ docs/harfbuzz-sections.txt | 12 ++++++++++++
+ src/hb-ot-glyph.cc         | 10 +++++-----
+ src/hb-ot-glyph.h          | 23 ++++++++++++-----------
+ src/test-ot-glyph.cc       | 10 ++++++++--
+ 4 files changed, 37 insertions(+), 18 deletions(-)
 
-commit 3a9394635ffd663d8acd0715236dd01d9f22f3b8
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 20:10:36 2019 -0700
+commit af08f388ab2c2e48f39c0b31644baab5b37c1975
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 21 13:28:05 2019 +0330
 
-    Add CONFIG.md
-    
-    https://github.com/harfbuzz/harfbuzz/issues/1652
+    [ot-glyph] Support CFF1's seac
 
- CONFIG.md   | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
- Makefile.am |  1 +
- README.md   |  2 ++
- 3 files changed, 54 insertions(+)
+ src/hb-ot-cff1-table.cc | 45 +++++++++++++++++++++------------------------
+ 1 file changed, 21 insertions(+), 24 deletions(-)
 
-commit 1c56b5d1d8307efd12519556e41fc50c5371f136
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 14:23:04 2019 -0700
+commit 04ac7fb1c9f93c7002792e5d676b6a145d3be628
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 21 13:06:12 2019 +0330
 
-    [serialize] Fix copy() calling operator=
-    
-    https://github.com/googlefonts/harfbuzz/commit/9f610ae239a11e86f94621e26bc15849b65ce41b#commitcomment-33944686
+    [ot-glyph] Add cff2 support
 
- src/hb-serialize.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-cff1-table.cc | 45 +++++++++++++++----------
+ src/hb-ot-cff2-table.cc | 87 +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cff2-table.hh |  4 +++
+ src/hb-ot-glyf-table.hh | 26 +++++++++------
+ src/hb-ot-glyph.cc      | 25 +++++++-------
+ src/hb-ot-glyph.h       |  2 +-
+ 6 files changed, 148 insertions(+), 41 deletions(-)
 
-commit 6492b2345cd913223b0eb931e9e11f7e5ad33049
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 14:19:13 2019 -0700
+commit 5cc09c462bad8532c220813b1cccb72d2e2ff855
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 20 16:24:14 2019 +0330
 
-    Minor
+    [ot-glyph] Initial cff1 support
 
- src/hb-open-type.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-cff1-table.cc | 110 ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cff1-table.hh |   1 +
+ src/hb-ot-glyph.cc      |   5 +++
+ 3 files changed, 116 insertions(+)
 
-commit 8938dd23c64f80dbd31f87133d9df88cd0c98c1a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 14:12:11 2019 -0700
+commit 3dcba9f21554db54daf89d4566938c5a69636b5b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 20 16:23:27 2019 +0330
 
-    Use injected class name
+    [ot-glyph] Redesign the API
 
- src/hb-open-type.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/hb-ot-glyph.cc   | 143 ++++++++++++++++++++++++++++++++++++++++++++-------
+ src/hb-ot-glyph.h    |  40 +++++++++-----
+ src/test-ot-glyph.cc |  38 ++++++++++----
+ 3 files changed, 179 insertions(+), 42 deletions(-)
 
-commit bfb5569d530a2b65dafd0d9be45d594af9e742ce
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 14:06:04 2019 -0700
+commit b8b3ff1a02c637163d8629d51843f6822a12cdef
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 14 15:37:41 2019 +0330
 
-    Disable non-OpenType kerning with hb-ft in HB_TINY
+    [glyph] Don't copy, write directly into result
 
- src/hb-ft.cc | 4 ++++
- 1 file changed, 4 insertions(+)
+ src/hb-ot-glyf-table.hh | 26 ++++++++++----------------
+ src/hb-ot-glyph.cc      | 25 ++++++++++++++++---------
+ src/test-ot-glyph.cc    |  6 ++++--
+ 3 files changed, 30 insertions(+), 27 deletions(-)
 
-commit 0819f3ca863af520fe546e6ef0596300e9e28b01
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 14:02:47 2019 -0700
+commit f883c31cce18372269fc1e46b3379295de7c9f7c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 13 12:31:53 2019 +0330
 
-    Deprecate v_kerning callback again
+    Implement glyph outline path API
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1682
+    Got help from https://github.com/opentypejs/opentype.js/blob/4e0bb99/src/tables/glyf.js#L222
 
- docs/harfbuzz-sections.txt |  6 +++---
- src/hb-deprecated.h        | 23 +++++++++++++++++++++++
- src/hb-font.cc             |  7 +++----
- src/hb-font.h              | 20 --------------------
- src/hb-font.hh             |  2 +-
- 5 files changed, 30 insertions(+), 28 deletions(-)
+ src/Makefile.am             |   5 ++
+ src/Makefile.sources        |   2 +
+ src/harfbuzz.cc             |   1 +
+ src/hb-ot-glyf-table.hh     | 119 +++++++++++++++++++++++++++++++++-----------
+ src/hb-ot-glyph.cc          |  50 +++++++++++++++++++
+ src/hb-ot-glyph.h           |  52 +++++++++++++++++++
+ src/hb-ot-var-gvar-table.hh |   6 ++-
+ src/hb-ot.h                 |   1 +
+ src/test-ot-glyph.cc        |  84 +++++++++++++++++++++++++++++++
+ 9 files changed, 290 insertions(+), 30 deletions(-)
 
-commit eb2825c7f140185f41922a371434873a0114ef67
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 13:42:53 2019 -0700
+commit d2ab1ec65b1697b113b2b923c63e300659cf1998
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Jan 9 20:24:16 2020 -0800
 
-    Minor
+    fixes oss-fuzz 19978: Null-dereference READ (#2091)
 
- src/hb-ot-font.cc | 1 -
- 1 file changed, 1 deletion(-)
+ src/hb-ot-var-hvar-table.hh                              |   1 +
+ ...-testcase-minimized-hb-subset-fuzzer-5148388450631680 | Bin 0 -> 2685 bytes
+ 2 files changed, 1 insertion(+)
 
-commit 896416bd4c6ac486eb4e1926eaa09d5a9b693763
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 13:39:49 2019 -0700
+commit 5e55a6d6910e3c942638ad6e9fa1e38befb36c12
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 9 23:40:40 2020 +0330
 
-    Partially revert "[ft/ot] Remove implementation of deprecated kerning funcs"
-    
-    This reverts commit 47030b1855f04c0d75899ffb6f5021fea3c19b90.
-    
-    Reverts only the hb-ft part, to reinstate non-OpenType kerning with
-    FreeType.
+    [subset/hvar] minor
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1682
+    not super excited about state of the code around, assuming was needed
+    so let's add this may unlikely check also.
 
- src/hb-ft.cc | 19 +++++++++++++++++++
- 1 file changed, 19 insertions(+)
+ src/hb-ot-var-hvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 2682efb02df72fb254c819cb76fc23592c30fc45
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 17 13:38:08 2019 -0700
+commit 257a197ae723b55d26c3254dbe1edd8b0509af1b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 9 22:55:45 2020 +0330
 
-    Revert "Deprecate font kern API"
-    
-    This reverts commit d219f899f4b2fb4b39ebc1dff9fb648fc5d6d112.
-    
-    API change: Un-deprecate font kern API.
+    Fail serialize when map has incorrect value
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1682
+    fixes https://crbug.com/oss-fuzz/19956
     
-    We should document that this API is only necessary to hook up
-    non-OpenType kerning.  hb-ot-font will continue to NOT implement them.
+    am not super happy with the fix, guess we should do some check
+    before the memcpy anyway as @blueshade7 thinks also,
+    so let's have it or revert it when we have a better approach for the case.
 
- docs/harfbuzz-sections.txt | 16 +++++++-------
- src/hb-deprecated.h        | 54 ----------------------------------------------
- src/hb-font.cc             |  3 ---
- src/hb-font.h              | 51 +++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 59 insertions(+), 65 deletions(-)
+ src/hb-ot-layout-common.hh                               |   7 ++++++-
+ ...-testcase-minimized-hb-subset-fuzzer-5708764082864128 | Bin 0 -> 6452 bytes
+ 2 files changed, 6 insertions(+), 1 deletion(-)
 
-commit d6cb244f7d63338e0cbfa774c2a32e6e7e06f15b
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Sat Jun 15 21:38:27 2019 -0400
+commit 1db2c1d0da9eed4b330ca0c6a46c19482c6e377b
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jan 7 11:10:40 2020 -0800
 
-    Canonically reorder U+0C55 and U+0C56
+    fix for cmap4 and OS_2 subsetting: maximum character code allowed is 0xFFFF
 
- src/hb-unicode.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/hb-ot-cmap-table.hh                            |  14 ++++++++----
+ src/hb-ot-os2-table.hh                             |   4 ++--
+ test/api/fonts/Mplus1p-Regular-cmap4-testing.ttf   | Bin 0 -> 2024 bytes
+ test/api/fonts/Mplus1p-Regular.ttf                 | Bin 0 -> 1757292 bytes
+ test/api/test-subset-cmap.c                        |  24 +++++++++++++++++++++
+ .../Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf  | Bin 0 -> 2260 bytes
+ ...plus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf | Bin 0 -> 1532 bytes
+ test/subset/data/tests/japanese.tests              |   2 +-
+ 8 files changed, 37 insertions(+), 7 deletions(-)
 
-commit 82d4bfb8f3ac30fecce41f8abe59f58ad64ba98a
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Fri Jun 14 10:49:42 2019 -0700
+commit 8ed46c3678cd4518efe5c9907bb9d22e6161bbd5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 7 23:43:53 2020 +0330
 
-    enable cff subset tests
+    [fuzz] minor, add another already fixed case
     
-    add Unicode UCS-4 cmap
-    fix Unicode bits in OS/2
-    add Unicode cmap sub-table in SourceHanSans-Regular_subset.otf
-    regenerate cff subset test expected results
+    https://crbug.com/oss-fuzz/19907
 
- src/hb-ot-cmap-table.hh                            |  73 +++++++++++++++++----
- src/hb-ot-os2-table.hh                             |  10 ++-
- test/subset/data/Makefile.am                       |   2 +
- test/subset/data/Makefile.sources                  |   2 +
- ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 32124 -> 20000 bytes
- ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 29688 -> 2196 bytes
- ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 33316 -> 30412 bytes
- ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 31960 -> 19840 bytes
- ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 29564 -> 2072 bytes
- ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 33168 -> 30264 bytes
- ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 32052 -> 19932 bytes
- ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 29632 -> 2108 bytes
- ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 33180 -> 30276 bytes
- ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 32276 -> 20152 bytes
- .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 29788 -> 2264 bytes
- ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 33332 -> 30428 bytes
- ...ubset.default.3042,3044,3046,3048,304A,304B.otf | Bin 3028 -> 3036 bytes
- ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 3240 -> 3248 bytes
- ...eHanSans-Regular_subset.default.61,63,65,6B.otf | Bin 2200 -> 2208 bytes
- ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3460 -> 3468 bytes
- .../SourceHanSans-Regular_subset.default.660E.otf  | Bin 1920 -> 1928 bytes
- ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 90956 -> 8932 bytes
- ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125820 -> 116080 bytes
- ...bset.desubroutinize-retain-gids.61,63,65,6B.otf | Bin 88392 -> 3016 bytes
- ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 126004 -> 116264 bytes
- ...ular_subset.desubroutinize-retain-gids.660E.otf | Bin 103780 -> 50224 bytes
- ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 2952 -> 2960 bytes
- ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 3136 -> 3144 bytes
- ...s-Regular_subset.desubroutinize.61,63,65,6B.otf | Bin 2132 -> 2140 bytes
- ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3256 -> 3264 bytes
- ...eHanSans-Regular_subset.desubroutinize.660E.otf | Bin 1896 -> 1904 bytes
- ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 90656 -> 8672 bytes
- ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125468 -> 115768 bytes
- ...ints-desubroutinize-retain-gids.61,63,65,6B.otf | Bin 88156 -> 2892 bytes
- ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 125584 -> 115884 bytes
- ....drop-hints-desubroutinize-retain-gids.660E.otf | Bin 103556 -> 50040 bytes
- ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 2792 -> 2800 bytes
- ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 2896 -> 2904 bytes
- ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf | Bin 2028 -> 2036 bytes
- ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 2964 -> 2972 bytes
- ...gular_subset.drop-hints-desubroutinize.660E.otf | Bin 1804 -> 1812 bytes
- ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 90724 -> 8740 bytes
- ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125560 -> 115864 bytes
- ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf | Bin 88196 -> 2852 bytes
- ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 125780 -> 116084 bytes
- ...-Regular_subset.drop-hints-retain-gids.660E.otf | Bin 103572 -> 50060 bytes
- ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 2848 -> 2856 bytes
- ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 2988 -> 2996 bytes
- ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf | Bin 2060 -> 2068 bytes
- ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3164 -> 3172 bytes
- ...ourceHanSans-Regular_subset.drop-hints.660E.otf | Bin 1824 -> 1832 bytes
- ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 91040 -> 9016 bytes
- ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125924 -> 116184 bytes
- ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf | Bin 88468 -> 3012 bytes
- ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 126208 -> 116468 bytes
- ...urceHanSans-Regular_subset.retain-gids.660E.otf | Bin 103800 -> 50244 bytes
- .../data/fonts/SourceHanSans-Regular_subset.otf    | Bin 2707728 -> 2707736 bytes
- 57 files changed, 70 insertions(+), 17 deletions(-)
+ ...z-testcase-minimized-hb-subset-fuzzer-5695925913911296 | Bin 0 -> 385 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit 6bcbe495bff221169f8c0769dde1b4b2c165a211
+commit 341407f7a52680be84144eb285e6cb09131b2956
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Jun 13 15:04:51 2019 +0430
+Date:   Tue Jan 7 09:10:24 2020 +0330
 
-    [cff] minor format (#1774)
+    [fuzz] minor, upload another fixed case
+    
+    https://crbug.com/oss-fuzz/19878
 
- src/hb-subset-cff-common.cc | 104 ++++++++++++++++++++------------------------
- 1 file changed, 48 insertions(+), 56 deletions(-)
+ ...z-testcase-minimized-hb-subset-fuzzer-5169035432165376 | Bin 0 -> 108 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit 4f37c0db9bf4e3d536a50126d17b36009b12f9cb
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Tue Jun 11 17:55:31 2019 -0400
+commit 7950beecfcc66194541437349c91625fd27c0071
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 6 21:25:00 2020 +0330
 
-    Remove 'mym3'
+    [subset] Fix null pointer dereference in hvar/vvar subset (#2085)
+    
+    Rest of the code assumes there is at least one subtable, lets return here if not.
+    
+    * https://crbug.com/oss-fuzz/19827
+    * https://crbug.com/oss-fuzz/19847
 
- src/hb-ot-tag.cc       | 4 +++-
- test/api/test-ot-tag.c | 2 +-
- 2 files changed, 4 insertions(+), 2 deletions(-)
+ src/hb-ot-var-hvar-table.hh                              |   2 ++
+ ...lusterfuzz-testcase-hb-subset-fuzzer-5641053680173056 | Bin 0 -> 4229 bytes
+ ...-testcase-minimized-hb-subset-fuzzer-5650879734874112 | Bin 0 -> 3278 bytes
+ 3 files changed, 2 insertions(+)
 
-commit 90872a29ee5d0bef6df1c2900f7001c11106c4da
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Tue Jun 11 12:28:30 2019 -0700
+commit 8ed27757b197670ee9f91cfb27ec50bcd3045a2f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 6 19:01:13 2020 +0330
 
-    change assert(false) to failure
+    Remove _POSIX_C_SOURCE definition from the project
+    
+    Added fpr suncc support but apparently is causing more issues
+    even on suncc so let's see if we can go without it.
+    
+    Fixes #2084
 
- src/hb-subset-cff-common.cc                               |   2 +-
- ...z-testcase-minimized-hb-subset-fuzzer-5680398559870976 | Bin 0 -> 145 bytes
- 2 files changed, 1 insertion(+), 1 deletion(-)
+ src/hb-blob.cc | 12 ------------
+ 1 file changed, 12 deletions(-)
 
-commit 0c5da57d1aab91d7677a5c6517a3da254d53267f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 10 14:06:25 2019 -0700
+commit e7d1aeb61023dff22852048561f6161c6972ec75
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 6 12:48:22 2020 +0330
 
-    Fix typo :)
+    [hvar] minor, fix unlikely statement
 
- src/hb-blob.cc   | 3 ++-
- src/hb-config.hh | 2 +-
- 2 files changed, 3 insertions(+), 2 deletions(-)
+ src/hb-ot-var-hvar-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 19b8eb08e5457cd643aee5f9b9ad1c80b2243895
+commit 57b1534198ae07c840010cff5af7997c5f738e88
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jun 11 01:33:30 2019 +0430
+Date:   Mon Jan 6 12:46:50 2020 +0330
 
-    Move HB_NO_SETLOCALE to closer place to its to unbreak HB_TINY build (#1768)
+    [glyf] minor, fix unlikely statements
 
- src/hb-common.cc | 3 +++
- src/hb.hh        | 4 ----
- 2 files changed, 3 insertions(+), 4 deletions(-)
+ src/hb-ot-glyf-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit b4a5a69ad8625e3b90eb907a1b70e3ed24d4ff97
+commit 9e48c6e9ef3f6d398c7140933a2cd90980f0ed5b
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jun 11 01:33:09 2019 +0430
+Date:   Tue Dec 31 15:57:39 2019 +0330
 
-    Add HB_NO_OEPN (#1767)
+    minor, use private API of hb_set_t where possible
 
- src/hb-blob.cc   | 3 +++
- src/hb-config.hh | 2 ++
- 2 files changed, 5 insertions(+)
+ src/hb-ot-var-hvar-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit a36ff941710b5a5f7e464e6d72aff36cf5549a91
+commit ce114d6b27976f38effba015d9cdf00b96c2fdfc
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jun 10 15:48:28 2019 +0430
+Date:   Tue Dec 31 15:53:02 2019 +0330
 
-    Add HB_NO_SETLOCALE
+    minor, tweak spaces
 
- src/hb-config.hh | 1 +
- src/hb.hh        | 6 +++++-
- 2 files changed, 6 insertions(+), 1 deletion(-)
+ src/hb-aat-fdsc-table.hh                   |  4 ++--
+ src/hb-aat-layout-ankr-table.hh            |  2 +-
+ src/hb-aat-layout-just-table.hh            | 36 +++++++++++++++---------------
+ src/hb-aat-layout-trak-table.hh            |  4 ++--
+ src/hb-debug.hh                            |  2 +-
+ src/hb-ot-cff-common.hh                    |  6 ++---
+ src/hb-ot-cff1-table.hh                    | 12 +++++-----
+ src/hb-ot-color-cbdt-table.hh              |  2 +-
+ src/hb-ot-gasp-table.hh                    |  4 ++--
+ src/hb-ot-layout-common.hh                 | 14 ++++++------
+ src/hb-ot-layout-gsubgpos.hh               |  8 +++----
+ src/hb-ot-layout-jstf-table.hh             |  2 +-
+ src/hb-ot-math-table.hh                    | 33 ++++++++++++++-------------
+ src/hb-ot-shape-complex-indic-machine.rl   |  2 +-
+ src/hb-ot-shape-complex-myanmar-machine.rl |  2 +-
+ src/hb-ot-var-avar-table.hh                |  2 +-
+ src/hb-ot-var-gvar-table.hh                | 18 +++++++--------
+ src/hb-ot-var-hvar-table.hh                | 12 +++++-----
+ src/hb-subset-cff-common.cc                |  2 +-
+ src/hb-subset-cff-common.hh                | 34 ++++++++++++++--------------
+ src/hb-subset-cff1.cc                      | 16 ++++++-------
+ src/hb-subset-cff2.cc                      |  8 +++----
+ util/options.cc                            |  2 +-
+ 23 files changed, 114 insertions(+), 113 deletions(-)
 
-commit c4cae81a26a816979f3206418c47856b5ed2d8bb
+commit 33c3d63a0a9734a9cca9411a666d6ba9793d642f
+Merge: 68c1798a ea8fdfa0
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jun 10 15:32:54 2019 +0430
+Date:   Tue Dec 31 13:52:50 2019 +0330
 
-    Remove round polyfill
+    Merge pull request #1594 from harfbuzz/var-subset
     
-    Added in 01dff1e and 19256bef, this was targeted at older
-    msvc versions that don't support C99 but now as we require
-    C++11 we don't target places those envs thus removing this.
-
- CMakeLists.txt |  2 +-
- configure.ac   |  6 ------
- src/hb.hh      | 14 --------------
- 3 files changed, 1 insertion(+), 21 deletions(-)
+    Issue 1558: [subset] TrueType/CFF2 variable font
 
-commit ff9b9b1c89d5529fafc74ce84c0acb71b5d6031b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 10 12:48:25 2019 -0700
+commit 68c1798a6703f9476b29c53abe95dd59ae280613
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 18 15:57:14 2019 +0200
 
-    Simplify HB_PARTIALIZE impl
+    [coretext] Use kCTFontOpenTypeFeatureTag
     
-    +this works on gcc 4.8 as well as default code path.
+    Instead of trying to map OpenType features to AAT feature selectors
+    which only works for a small subset of OpenType features, use the
+    simpler kCTFontOpenTypeFeatureTag with OpenType feature tags directly.
+    
+    With this change, features like cvXX can be enabled in coretext shaper,
+    while they were previously ignored due to missing mapping.
+    
+    This seems to work even with AAT fonts that don’t have OpenType layout
+    tables, which suggests that CoreText is doing the mapping itself in this
+    case.
+    
+    kCTFontOpenTypeFeatureTag seems to have been introduced in macOS 10.10
+    and iOS 8.0, though, so its use is conditional on version check for now.
+    Not sure how to check iOS version, so I left this out.
 
- src/hb-algs.hh | 17 +++++------------
- 1 file changed, 5 insertions(+), 12 deletions(-)
+ src/hb-coretext.cc | 20 +++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
 
-commit 451edbd4d063a4b43c1ca3d2b60c7392602ae7b7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 10 12:46:54 2019 -0700
+commit b28c282585afd3bff844e84eae7f29e1a1267aef
+Author: Marcel Fabian Krüger <zauguin@gmail.com>
+Date:   Tue Dec 17 02:58:51 2019 +0100
 
-    Revert "Test new solution for HB_PARTIALIZE"
-    
-    This reverts commit a0c4900799c26e4ff34180842a5ff21048fe31a0.
+    Check to avoid overflows
 
- src/hb-algs.hh | 18 +++++++++++++++++-
- 1 file changed, 17 insertions(+), 1 deletion(-)
+ src/hb-sanitize.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
 
-commit a0c4900799c26e4ff34180842a5ff21048fe31a0
+commit d70afb1e5a32f23d03cc69bbbc725d1e668eb616
+Author: Marcel Fabian Krüger <zauguin@gmail.com>
+Date:   Tue Dec 17 02:29:28 2019 +0100
+
+    Clamp max_ops to upper bound in hb-sanitize.hh
+
+ src/hb-sanitize.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit aa43e183dda2288b9d83fe7473f357422a4771f1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jun 10 12:33:23 2019 -0700
+Date:   Sun Dec 15 16:04:00 2019 -0800
 
-    Test new solution for HB_PARTIALIZE
+    [perf Add texts/en-words.txt
     
-    Just testing bots.  Will finish based on results.
+    $ cat docs/usermanual-*.xml src/hb*.cc src/hb*.{h,hh,cc} | sed 's/[^a-zA-Z ]/ /g' | tr ' ' '\n' | sort | uniq | grep . > perf/texts/en-words.txt
 
- src/hb-algs.hh | 18 +-----------------
- 1 file changed, 1 insertion(+), 17 deletions(-)
+ perf/texts/en-words.txt | 12392 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 12392 insertions(+)
 
-commit 4a2b58555f173b692b767c933d280a51142926dd
+commit 80762cc4d0663a9ca465e94e73424e3b352de24c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jun 10 08:16:51 2019 -0700
+Date:   Sun Dec 15 23:21:10 2019 +0330
 
-    [ci] Use HB_OPTIMIZE_SIZE instead of __OPTIMIZE_SIZE__
+    [ci] Speedup tsan bot
+    
+    We don't expect fails thus expecting readable failure backtrace so let's speed it up instead
 
  .circleci/config.yml | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit a228bb5f1d471a334bc9727f5d4f5b59dbe829ff
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jun 10 15:56:36 2019 +0430
+commit b79ceac3c68a41a0b7f624c0f172e99eb7498737
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Sun Dec 15 16:50:01 2019 +0200
+
+    Prefer UINT_MAX instead of uint overflow.
+    
+    Also, prefer HB_FEATURE_GLOBAL_START and HB_FEATURE_GLOBAL_END.
+
+ src/hb-buffer.cc                          | 6 +++---
+ src/hb-common.cc                          | 4 ++--
+ src/hb-face.hh                            | 2 +-
+ src/hb-graphite2.cc                       | 2 +-
+ src/hb-ot-map.hh                          | 4 ++--
+ src/hb-ot-shape-complex-arabic.cc         | 6 +++---
+ src/hb-ot-shape.cc                        | 2 +-
+ src/hb-set.hh                             | 4 ++--
+ test/shaping/data/aots/hb-aots-tester.cpp | 4 ++--
+ util/ansi-print.cc                        | 6 +++---
+ util/options.cc                           | 2 +-
+ util/options.hh                           | 2 +-
+ 12 files changed, 22 insertions(+), 22 deletions(-)
+
+commit b618e0ae1368aa22050ce0fe48329b723e2fd632
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Sun Dec 15 16:26:50 2019 +0200
 
-    [ci] Test -Os and optimize size in Alpine bot
+    Remove non-breaking spaces from comments.
     
-    __OPTIMIZE_SIZE__ should be defined whenever -Os but some Internet thread
-    indicate may not so lets do that ourselves as that is the main intention
+    `0xC2A0` was used, for some reasons. It's not really a problem, but Qt Creator
+    constatly trying to replace them with regular spaces, so I have to edit those
+    files separately.
 
- .circleci/config.yml | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
+ src/hb-buffer.cc |  4 ++--
+ src/hb-common.cc | 20 ++++++++++----------
+ 2 files changed, 12 insertions(+), 12 deletions(-)
 
-commit 9407ef8d4bb96346b1f8b07757d79d3f8cc61cf7
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jun 10 15:17:43 2019 +0430
+commit 780d640c02e01664ea13729f4e4b416c440c3cdf
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Sun Dec 15 16:11:37 2019 +0200
 
-    minor, add HB_USE_INTERNAL_QSORT
+    Remove unnecessary check in hb_buffer_t::set_masks.
     
-    The only thing I need for a working wasm in a minimum libc,
-    otherwise I have to provide the very same qsort inside that libc
+    Bounds are already checked by the caller.
+    
+    Closes #2073
 
- src/hb-algs.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-buffer.cc | 7 -------
+ 1 file changed, 7 deletions(-)
 
-commit 801d93fc58aa13082dea86fb2c3821bc6362f593
+commit 34ed8e7218d9147a6ccd99198db594cf8f66f61b
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Fri Dec 13 07:25:34 2019 +0200
+
+    Prefer _hb_glyph_info_is_unicode_mark where possible.
+
+ src/hb-ot-shape-fallback.cc  | 6 +++---
+ src/hb-ot-shape-normalize.cc | 6 +++---
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 3e1a2632dce396157a4e8ff6669740a145e7062c
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jun 10 14:53:14 2019 +0430
+Date:   Thu Dec 12 15:48:27 2019 +0330
 
-    [ci] remove wine from fedora bot
+    [unscribe] fix leak issue
     
-    We are not testing Windows exes in fedora mingw bot, we don't have to as
-    probably won't go that smoothly and we have real Windows bots anyway
-    and as wine installation itself is time taking let's remove it
+    with no user_data provided, `free` will be called with `(0)` thus silently having a leak
 
.circleci/config.yml | 2 +-
src/hb-uniscribe.cc | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 7dcfc5357df879491f847bd7d2941645e58f268c
+commit e75d785b51d713de2e37ad41c62de5423fc95949
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jun 9 11:58:08 2019 +0430
+Date:   Thu Dec 12 15:42:37 2019 +0330
 
-    [stat] minor format
+    [doc] fix hb_blob_create call example
+    
+    otherwise free(0) will be called that silently makes a leak
 
src/hb-ot-stat-table.hh | 72 ++++++++++++++++++++++++-------------------------
- 1 file changed, 36 insertions(+), 36 deletions(-)
docs/usermanual-object-model.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 2646c7149ce49d3b6cf90e354658df35254bcce0
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jun 9 11:51:58 2019 +0430
+commit 4ef597e17003402c0ceebcb5a0c185f08c97aac1
+Author: Daeren <Daeren@users.noreply.github.com>
+Date:   Wed Dec 11 13:44:05 2019 +0300
 
-    [stat] minor
+    Fix unary minus operator applied to unsigned int
+    
+    Applying unary minus operator to unsigned int causes the following error on MSVS: error C4146
+    This patch fixes the error.
 
- src/hb-ot-stat-table.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/hb-ot-color-sbix-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit c4669fda7890bc741ef934ebc360e366eba94866
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jun 9 11:50:36 2019 +0430
+commit 1770493cf5e0c098a0566281bc1dd089101f0f78
+Author: Daeren <Daeren@users.noreply.github.com>
+Date:   Wed Dec 11 13:44:15 2019 +0300
 
-    [algs] minor
+    Fix unary minus operator applied to unsigned int
+    
+    Applying unary minus operator to unsigned int causes the following error on MSVS: error C4146
+    This patch fixes the error.
 
- src/hb-algs.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-ot-color-cbdt-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 9b853f755dd05ccef3429d3d3d0d561a99cc4c2d
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jun 9 11:49:25 2019 +0430
+commit a061e47fcc84a8947ca478b7ff2d02efeafecbce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 10 13:31:50 2019 -0600
 
-    [cff] Use switch on multi-format structs (#1762)
+    Change a few HB_INTERNAL static methods to static inline
 
- src/hb-cff-interp-cs-common.hh   |   4 +-
- src/hb-cff-interp-dict-common.hh |  12 +--
- src/hb-ot-cff-common.hh          | 135 ++++++++++++------------
- src/hb-ot-cff1-table.hh          | 215 ++++++++++++++++++++++-----------------
- src/hb-ot-cff2-table.hh          |  68 +++++++------
- src/hb-subset-cff1.cc            |   2 +-
- src/hb-subset-cff2.cc            |   2 +-
- 7 files changed, 233 insertions(+), 205 deletions(-)
+ src/hb-ot-layout-gpos-table.hh | 10 +++++-----
+ src/hb-ot-layout-gsub-table.hh | 10 +++++-----
+ src/hb-ot-layout-gsubgpos.hh   |  2 +-
+ 3 files changed, 11 insertions(+), 11 deletions(-)
 
-commit eff579f743a91c0b1c543f4b69ab33580cae6392
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jun 7 12:58:09 2019 +0430
+commit dd3972a3649e30c2bee88303ee56f88b260deb53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 10 13:21:26 2019 -0600
 
-    Update and use internal qsort everywhere
+    [GSUB] Simplify Extension is_reverse()
+    
+    We don't allow extension lookups to chain to another extension lookup.
+    Simplify code for that.
 
- src/hb-algs.hh          | 210 +++++++++++++++++++++++++++++++++++-------------
- src/hb-array.hh         |   6 +-
- src/hb-ot-post-table.hh |   2 +-
- 3 files changed, 158 insertions(+), 60 deletions(-)
+ src/hb-ot-layout-gpos-table.hh | 10 +++++-----
+ src/hb-ot-layout-gsub-table.hh | 14 +++++---------
+ 2 files changed, 10 insertions(+), 14 deletions(-)
 
-commit 5074d665a8b0980f202a5986bda52808674cfb54
+commit 858b627984c50e94bc71b9530c340a8fff59d330
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jun 7 14:20:45 2019 -0700
+Date:   Tue Dec 10 13:18:32 2019 -0600
 
-    [ucd] Save another 1.5kb
-    
-    https://github.com/harfbuzz/harfbuzz/issues/1652
+    [machinery] Remove CastR<>()
 
- src/gen-ucd-table.py |  8 +++++---
- src/hb-ucd-table.hh  | 37 +++++++++++++++++++++----------------
- src/hb-ucd.cc        | 12 +++++++++---
- 3 files changed, 35 insertions(+), 22 deletions(-)
+ src/hb-machinery.hh            | 8 --------
+ src/hb-open-file.hh            | 2 +-
+ src/hb-ot-layout-common.hh     | 4 ++--
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-ot-layout-gsub-table.hh | 6 +++---
+ src/hb-ot-layout-gsubgpos.hh   | 8 ++++----
+ 6 files changed, 11 insertions(+), 19 deletions(-)
 
-commit 6d58b45782833f8c6c8efd9426e2785c78e6462a
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jun 8 00:40:18 2019 +0430
+commit b84ceb2fcf7a71fe03f499dd0c4611254b561f1d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 10 13:02:48 2019 -0600
 
-    [ci] use trusty for its gcc 4.8 again
+    [machinery] Remove CastP
 
- .travis.yml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-machinery.hh            | 8 --------
+ src/hb-ot-layout-gpos-table.hh | 8 +++++---
+ src/main.cc                    | 4 ++--
+ 3 files changed, 7 insertions(+), 13 deletions(-)
 
-commit 973699c49b905e142ecc5cefd1f4fa15aad8e309
+commit 85574ec28735c1e9d53ccff9abafbbc25cf34f0f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jun 7 12:49:06 2019 -0700
+Date:   Tue Dec 10 12:52:32 2019 -0600
 
-    Disable clang gcc impersonator
+    [machinery] Minor
 
- src/hb-algs.hh | 2 +-
+ src/hb-machinery.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit e4e518f33d933a02058bad86a6aae714e59814db
+commit e101a6725731a2e82f3e2a146c3281111c747d90
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jun 7 12:41:09 2019 -0700
+Date:   Tue Dec 10 12:46:14 2019 -0600
 
-    Fix build on gcc 4.8
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1724
+    [perf] Add texts/fa-thelittleprince.txt
 
- src/hb-algs.hh | 29 +++++++++++++++++++++++++++--
- 1 file changed, 27 insertions(+), 2 deletions(-)
+ perf/texts/en-thelittleprince.txt |   3 -
+ perf/texts/fa-thelittleprince.txt | 923 ++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 923 insertions(+), 3 deletions(-)
 
-commit 3c240bd3dc0aaca38154da555d0aef350da62ee6
+commit 2c781a670108d52149a61fb7bc5b9b6eb3592b9d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jun 7 10:56:24 2019 -0700
+Date:   Tue Dec 10 12:43:42 2019 -0600
 
-    Downgrade double-promotion from error to warning
-    
-    https://github.com/harfbuzz/harfbuzz/issues/1740
+    [perf] More rename
 
- src/hb.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ perf/run.sh                                 | 2 +-
+ perf/{text => texts}/en-thelittleprince.txt | 0
+ perf/{text => texts}/fa-monologue.txt       | 0
+ 3 files changed, 1 insertion(+), 1 deletion(-)
 
-commit 385e436692e94588fc4cb3a7afbeb862035db09b
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jun 7 10:44:53 2019 -0700
+commit d703392afef578cbeb17968783109c8cbe117890
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 10 12:42:29 2019 -0600
 
-    Minor, fix gcc maybe-uninitialized complain
-    
-    I guess all of its field will be initialized anyway here but lets make it more defensive
+    [perf] Adjust text/fa-monologue.txt
 
src/hb-ot-glyf-table.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
perf/text/fa-monologue.txt | 17 -----------------
+ 1 file changed, 17 deletions(-)
 
-commit 1bada656a86e9cb27d4a6b9fcc50748f0bd9c1d9
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Jun 7 02:01:27 2019 +0430
+commit 19d1b9d4f319b75121bfbba677122ca74bf6f796
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 10 12:39:01 2019 -0600
 
-    Minor, remove unnecessary semicolon
-    
-    Causing -Wextra-semi-stmt build error when no primitive has chosen
-    Interesting that nobody has noticed it yet.
+    [perf] Renames
 
- src/hb-mutex.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ perf/run.sh                                                    | 2 +-
+ perf/text/{littleprince.txt => en-thelittleprince.txt}         | 0
+ perf/text/{test-long-arabic-paragraph.txt => fa-monologue.txt} | 0
+ 3 files changed, 1 insertion(+), 1 deletion(-)
 
-commit f9b1ae73360054d9f121a2d36820377909888b35
-Author: Garret Rieger <grieger@google.com>
-Date:   Wed Jun 5 17:40:59 2019 -0700
+commit 6a60ca117c51e15279ba39dcae19301d24789c62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 10 12:32:37 2019 -0600
 
-    [subset] Move OS/2 to subset2.
+    [algs] Fold last other bsearch() in
+    
+    Now truly have only one bsearch implementation.
 
- src/hb-ot-os2-table.hh | 32 ++++++++++++++++----------------
- src/hb-subset.cc       |  2 +-
- 2 files changed, 17 insertions(+), 17 deletions(-)
+ src/hb-ot-cmap-table.hh | 37 ++++++++++++++++++++-----------------
+ 1 file changed, 20 insertions(+), 17 deletions(-)
 
-commit 93d592e0e181f436ea47038fef419134007208aa
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Wed Jun 5 16:51:31 2019 -0700
+commit 53dc8d944f71481ce7f18a32aca63c3f004e6e0c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Dec 10 21:53:30 2019 +0330
 
-    [subset] post table to use _subset2
+    Add initial shaping performance test and profiler
 
- src/hb-ot-post-table.hh | 31 +++++++++++++++----------------
- src/hb-subset.cc        |  2 +-
- 2 files changed, 16 insertions(+), 17 deletions(-)
+ perf/fonts/Amiri-Regular.ttf              |  Bin 0 -> 551560 bytes
+ perf/fonts/NotoNastaliqUrdu-Regular.ttf   |  Bin 0 -> 497204 bytes
+ perf/fonts/NotoSansDevanagari-Regular.ttf |  Bin 0 -> 212740 bytes
+ perf/fonts/Roboto-Regular.ttf             |  Bin 0 -> 305608 bytes
+ perf/run.sh                               |   25 +
+ perf/text/littleprince.txt                | 1896 +++++++++++++++++++++++++++++
+ perf/text/test-long-arabic-paragraph.txt  |   18 +
+ 7 files changed, 1939 insertions(+)
 
-commit db938479d7b1e3ec35a39a9ad31c945e09e6d5e5
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Tue Jun 4 10:30:53 2019 -0700
+commit 39afe608b476c3d09460dfceae75df65a9eb22b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 10 12:04:44 2019 -0600
 
-    [subset] maxp table to use _subset2
+    [algs] Fold one more custom bsearch() in
+    
+    One more to go.
 
- src/hb-ot-maxp-table.hh | 48 ++++++++++++++++++++++--------------------------
- src/hb-subset.cc        |  2 +-
- 2 files changed, 23 insertions(+), 27 deletions(-)
+ src/hb-ot-layout-gpos-table.hh | 49 ++++++++++++++++--------------------------
+ 1 file changed, 19 insertions(+), 30 deletions(-)
 
-commit d5e5f378329b6ce21944b79b568369ea7bc36cf3
-Author: Eli Zaretskii <eliz@gnu.org>
-Date:   Wed Jun 5 22:20:03 2019 +0300
+commit b1dc676eaa606660584f3c67f0570457e9f09dd3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 10 11:41:24 2019 -0600
 
-    This makes minor changes to allow building HarfBuzz with
-    mingw.org's MinGW.
-    
-    src/hb-algs.hh: Don't compile _BitScanForward and _BitScanReverse
-    for GCC >= 4.  mingw.org's MinGW doesn't have these functions.
-    
-    src/hb-atomic.hh: MemoryBarrier does exist in mingw.org's MinGW,
-    but it is not a macro, it is an inline function.  __MINGW32_VERSION
-    is a macro that exists only in mingw.org's MinGW, so conditioning
-    on it should not affect MinGW64, where MemoryBarrier is a macro.
-    
-    src/hb-uniscribe.cc: Define E_NOT_SUFFICIENT_BUFFER if it is not
-    defined (mingw.org's MinGW doesn't).
+    [algs] Reduce one more bsearch() impl
     
-    src/hb.hh: Don't include intrin.h for mingw.org's MinGW, since that
-    header is not available; instead, include windows.h.  Conditioned
-    on __MINGW32_VERSION to avoid affecting MinGW64.
+    Ouch, there were three more left.  Down one.  Two to go.
 
- src/hb-algs.hh      | 4 ++--
- src/hb-atomic.hh    | 2 +-
- src/hb-uniscribe.cc | 4 ++++
- src/hb.hh           | 7 +++++++
- 4 files changed, 14 insertions(+), 3 deletions(-)
+ src/hb-open-type.hh | 21 +++++++++------------
+ 1 file changed, 9 insertions(+), 12 deletions(-)
 
-commit c7439d4e3a76d596845aad4e4bc860bd61ee47e3
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jun 5 12:13:49 2019 -0700
+commit 6f76c325e5244adfa1599952040ed7f13b10f38c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Dec 10 21:43:11 2019 +0330
 
-    Slightly massage buffer-messaging commit
+    [test] Update 10.15 results
     
-    Saves a few bytes.
+    Turned out only SFNS, which wasn't available in 10.14 anyway, needed an update
+    See https://crbug.com/1005969#c37 also
 
- src/hb-buffer.cc | 3 ---
- src/hb-buffer.hh | 8 +++++++-
- 2 files changed, 7 insertions(+), 4 deletions(-)
+ test/shaping/data/in-house/tests/macos.tests | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
 
-commit 4b1b0bf2f51f806d3285a7e7dec378b9eab9333e
-Merge: 659eeddb 815f002b
+commit 2241a676ba084214fdfc6d35f35862a64f296271
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jun 5 12:57:28 2019 +0430
+Date:   Tue Dec 10 19:50:34 2019 +0330
 
-    Merge pull request #1755 from ebraminio/slim
+    [test] Add macOS 10.15 related fonts
     
-    Don't use vsnprintf when HB_NO_BUFFER_MESSAGE is defined
+    breaks the test and 10.15 bot, will add the fix in next commit, also adds a broken test for f47cbade1
 
-commit 815f002bb9230a52768a165383497cc98c58eadb
+ test/shaping/data/in-house/tests/macos.tests | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit f3de3b6d3db278845bee1392ffdb3659921c6410
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Jun 5 10:38:06 2019 +0430
+Date:   Tue Dec 10 16:37:48 2019 +0330
 
-    Don't use vsnprintf when HB_NO_BUFFER_MESSAGE is defined
+    [ci] fix macOS 10.15 bot
+    
+    Xcode 11.3.0 image is supposed to work per https://circleci.com/docs/2.0/testing-ios/
+    but isn't https://circleci.com/gh/harfbuzz/harfbuzz/118693 AFAICS
+    
+    Let's try Xcode 11.2.1 image
 
- src/hb-buffer.cc | 5 ++++-
- src/hb-config.hh | 1 +
- 2 files changed, 5 insertions(+), 1 deletion(-)
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 659eeddb2df5b97cc01bd39e106381f65c9f41f1
-Author: Bruce Mitchener <bruce.mitchener@gmail.com>
-Date:   Mon Jun 3 22:31:50 2019 +0700
+commit 49434bdd49eec61a3bcb18e242b30e72cdc81279
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Dec 10 16:28:04 2019 +0330
 
-    Use C++11 override keyword.
+    [ci] Add a macOS 10.15 bot
+    
+    Should update macos.tests with the fonts, for now
 
- util/hb-ot-shape-closure.cc |  2 +-
- util/options.hh             | 30 +++++++++++++++---------------
- 2 files changed, 16 insertions(+), 16 deletions(-)
+ .circleci/config.yml | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
 
-commit 2e16593b70688dfcee1788f38c6af03c5a589f6e
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Sat Jun 1 20:54:46 2019 -0400
+commit f47cbade18acc4f9c935ba2c6c863beb6087d781
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 9 18:10:34 2019 -0600
 
-    [myanmar] Make medial_group match the OT spec
+    [aat] Adjust fallback positioning logic
     
-    Sometime between [July 2018] and [January 2019], the OpenType Myanmar
-    grammar changed: one asat is now allowed after a medial ya, before any
-    other medial consonant.
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1528
     
-    [July 2018]: http://web.archive.org/web/20180711011550/https://docs.microsoft.com/en-us/typography/script-development/myanmar
-    [January 2019]: http://web.archive.org/web/20190115044451/https://docs.microsoft.com/en-us/typography/script-development/myanmar
+    Wish could add a test...
     
-    This also reverts commit 439b05867c0856a81fa8f9bea3a7465b4b4bdd91, which
-    allowed an asat immediately after a medial ra.
-
- src/hb-ot-shape-complex-myanmar-machine.hh | 249 +++++++++++++++--------------
- src/hb-ot-shape-complex-myanmar-machine.rl |   2 +-
- 2 files changed, 129 insertions(+), 122 deletions(-)
+    $ ./hb-view --font-file Thonburi.ttc --unicodes U+0E17,U+0E35,U+0E48,U+0E4A --shaper ot
+    
+                       ▃
+    
+             ▂▃▃▄▃▂▁▊        ▃  ▃       ▎
+          ▗   ▅▆▆▅          ▌ ▆▆▅▆▙ ▌▗
+         ▗                  ▙ ▂  ▎▗   ▟
+         ▅▆▆▆▇▇▇▇▇▇▇▆▆▅▄     ▇▅▅▅ ▙▆▇
+        ▁▁▂▁       ▁▁
+             ▖                    ▖ ▂▂
+      ▉   ▁        ▆▆        ▌   ▆  ▙▄ ▁▁
+       ▙            ▉      ▃▖           ▟
+          ▊         ▉      ▅▟           ▗▄
+          ▊         ▉     ▗ ▏           ▇▆
+          ▊    ▟    ▉      ▆             ▖
+          ▊         ▉        ▌        ▂
+          ▊   ▏     ▉           ▌ ▗   ▄▟
+          ▊                        ▆
 
-commit 209491fc37c46281e063c3e6707d686d5f2b2ba4
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Wed May 29 14:03:17 2019 -0700
+ src/hb-ot-shape-complex-default.cc | 20 ++++++++++++++++++++
+ src/hb-ot-shape-complex.hh         |  5 +++--
+ src/hb-ot-shape.cc                 |  5 +++--
+ 3 files changed, 26 insertions(+), 4 deletions(-)
 
-    [subset] Hmtx/vmtx tables to use subset2 and new iterator frameworks
+commit fa7edf87c99a46d29a9f0d58b2896bc24a43853e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 7 22:01:13 2019 -0600
 
- src/hb-ot-hmtx-table.hh | 115 +++++++++++++++++++++++-------------------------
- src/hb-subset.cc        |   6 +--
- 2 files changed, 59 insertions(+), 62 deletions(-)
+    [bsearch] Massage API some more
 
-commit 89a7a880a1d5cd5e585d43fdde6d44c6dba559cf
-Merge: 760eb1bf 12febd68
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Jun 4 10:52:16 2019 +0430
+ src/hb-algs.hh  | 25 +++++++++++++++----------
+ src/hb-array.hh | 23 ++++++++++-------------
+ 2 files changed, 25 insertions(+), 23 deletions(-)
 
-    Merge pull request #1747 from harfbuzz/cff2-fdselect-fix
-    
-    fixed faulty FDSelect::sanitize
+commit 70aa5071d89dbba792c4c9fb4df7ca716304656a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 7 22:35:34 2019 -0600
 
-commit 12febd68d694cc1bae44b0b672d88bf9fbe8568d
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Mon Jun 3 16:40:03 2019 -0700
-
-    added parentheses to FDSelect::sanitize as well
-
- src/hb-ot-cff-common.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-commit 65e66a2d371f42d018b1a22f31a6428d19a90284
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Mon Jun 3 16:31:41 2019 -0700
-
-    added test data
-
- ...zz-testcase-minimized-harfbuzz_fuzzer-6252118652092416 | Bin 0 -> 126 bytes
- 1 file changed, 0 insertions(+), 0 deletions(-)
-
-commit be82a2fc0c7ad3553f2e6dc8082a3255cb6c917c
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Mon Jun 3 15:52:23 2019 -0700
-
-    parenthesized cond-exp in CFF2FDSelect::sanitize
-
- src/hb-ot-cff2-table.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-commit 760eb1bf9398bd37103ca879e825fad9bef4bfdd
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Jun 3 05:48:04 2019 -0700
-
-    Reapply possible bsearch overflow fix
-    
-    Originally introduced in 21ede86 (#1314) but as it wasn't applied to hb_bsearch
-    accidentally removed while merging hb_bsearch_r to it.
+    [algs] Adjust return value of hb_ctz(0) to be 32 instead of 0
 
  src/hb-algs.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 5846884f86cae61c1b0c369c81427712fb97ed83
-Author: Bruce Mitchener <bruce.mitchener@gmail.com>
-Date:   Mon Jun 3 15:00:25 2019 +0700
+commit eefb78f674c9a71aaaca45cc1246584848622923
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 8 21:07:00 2019 -0600
 
-    test: Use nullptr in C++ code. (#1744)
+    Minor
 
- src/test-ot-color.cc             | 8 ++++----
- test/fuzzing/hb-shape-fuzzer.cc  | 6 +++---
- test/fuzzing/hb-subset-fuzzer.cc | 2 +-
- util/options-subset.cc           | 2 +-
- 4 files changed, 9 insertions(+), 9 deletions(-)
+ src/hb-common.cc | 32 --------------------------------
+ src/hb-static.cc | 36 ++++++++++++++++++++++++++++++++++++
+ 2 files changed, 36 insertions(+), 32 deletions(-)
 
-commit 7c14b9014587e1423ef7481058e48dae84a65fce
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jun 2 13:51:26 2019 +0430
+commit 9fb030585a1c429c13e86fbd128d9db004d3a355
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 7 19:45:08 2019 +0000
 
-    [ci] revert to xenial
+    Rename start/end to first/last in RangeRecord
     
-    It should've done in a branch
+    Because that's what they are.
 
.travis.yml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
src/hb-ot-layout-common.hh | 48 +++++++++++++++++++++++-----------------------
+ 1 file changed, 24 insertions(+), 24 deletions(-)
 
-commit 8278ff7dce41e6694eba15a7c94a0c0eb3bca427
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jun 2 00:36:30 2019 +0430
+commit 8ac4ba14dca7c700b6dfdc19ceb5385a7e6fb889
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Mon Dec 9 18:58:28 2019 +0200
 
-    minor
+    Fix typo in TESTING.md (#2066)
 
src/hb-algs.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
TESTING.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 33d38e793e2e4882337e5f42fbbae7d00d343940
+commit 9b1d5c4a59c6d3d9c248eae5d05d801791d42b7a
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Jun 2 00:19:57 2019 +0430
+Date:   Mon Dec 9 12:29:28 2019 +0330
 
-    Use a unified bsearch (#1741)
-    
-    A part of #593
+    [number] fix where strtod_l not available
 
- src/hb-aat-layout.cc        | 10 +++++-----
- src/hb-algs.hh              | 29 ++++-------------------------
- src/hb-ot-post-table.hh     |  4 ++--
- src/hb-ot-var-mvar-table.hh |  6 +++---
- 4 files changed, 14 insertions(+), 35 deletions(-)
+ src/hb-number.cc | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 97b92685775983a280f335423263a6a8d82c3941
+commit 5c8f96028988f647cace1af9f5a4c33c29b6e562
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jun 1 21:25:09 2019 +0430
+Date:   Mon Dec 9 10:48:43 2019 +0330
 
-    [ci] Downgrade Travis distribution upon Behdad request
+    [number] minor, include the renamed header
 
.travis.yml | 2 +-
src/hb-number.cc | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit faf69e03f5ab9f3926442525f6c6e30fbc7a93d5
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jun 1 11:02:25 2019 +0430
+commit 48eef2724c8aa55d081fb742a5e6cef17ff5d4a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 6 05:04:11 2019 +0000
 
-    [ci] Install ragel on appveyor mingw bots
+    [algs/array] Consolidate the last two bsearch implementations!
     
-    Hopefully autotools timestamps issues will go
+    Yay!  Seems to work.
 
- appveyor.yml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh  | 31 +++++++++++++++++--------------
+ src/hb-array.hh | 31 +++++++++++--------------------
+ 2 files changed, 28 insertions(+), 34 deletions(-)
 
-commit c91f3fa3eaf77fa255292c779f88da4feaaae8a0
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat Jun 1 10:55:37 2019 +0430
+commit ed35dea8c07f1ecc50df48657bb330fcd77ca8e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 6 04:37:11 2019 +0000
 
-    [dwrite] Replace REPLACEME with release version the symbol had
+    Fourth try... sighs
 
- src/hb-directwrite.cc | 2 +-
+ src/hb-algs.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 93c455567fe3d92a7efe65bf0e9ac2af794e2c4f
+commit 9168310bb4c9d7d0652c7ead53017e30d1fafda2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 22:53:27 2019 -0700
+Date:   Fri Dec 6 04:28:06 2019 +0000
 
-    2.5.1
+    Fix build, third times...
 
- NEWS             | 11 +++++++++++
- configure.ac     |  2 +-
- src/hb-version.h |  4 ++--
- 3 files changed, 14 insertions(+), 3 deletions(-)
+ src/hb-ot-post-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 10e3cb9246ab3d288af4effe484f4d8beb2243d6
+commit 34f5cc2cc80cf1fd45bc9697d828d3536e3ac74f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 22:56:37 2019 -0700
+Date:   Fri Dec 6 04:09:33 2019 +0000
 
-    [docs] Fix dist
+    Second try at fixing build
 
- docs/Makefile.am | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-algs.hh | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
 
-commit 619f5f1eb9e5e2a4f326f89c9e3e05b01f9c042f
+commit 14ce5ab0b7ae012c6e46511bab399c472eb39eb2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 22:31:35 2019 -0700
+Date:   Fri Dec 6 03:54:46 2019 +0000
 
-    Fourth try at building VS bots
-    
-    Based on https://github.com/harfbuzz/harfbuzz/issues/1730#issuecomment-497151210
+    First try at fixing build errors
 
- src/hb-algs.hh | 16 +++++++++++-----
- 1 file changed, 11 insertions(+), 5 deletions(-)
+ src/hb-algs.hh | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit f387a09742bd8e4a7a8da6db954339609839a113
+commit 2274270c6ac2e170cf939e03a89721f03f2f98bd
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 22:12:23 2019 -0700
+Date:   Fri Dec 6 03:42:21 2019 +0000
 
-    [ci] Disable VS 2013
-    
-    That one doesn't even understand constexpr.
+    [algs] Streamline bsearch some more
 
appveyor.yml | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
src/hb-algs.hh | 46 ++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 32 insertions(+), 14 deletions(-)
 
-commit aba3888d933474a874d2f3ff02397b523846466c
+commit bd55d4b49fcd1ac1335e60ead1fe9941e7b01f8c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 22:11:27 2019 -0700
+Date:   Fri Dec 6 03:35:24 2019 +0000
 
-    Third try at fixing VS build
+    [algs] Streamline bsearch() API more towards hb_array_t::bsearch_impl()
     
-    https://github.com/harfbuzz/harfbuzz/issues/1730
+    Preparing to merge the two finally!
 
- src/hb-algs.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-aat-layout.cc              |  6 +-----
+ src/hb-aat-layout.hh              | 10 ++--------
+ src/hb-algs.hh                    | 27 +++++++++++++++++++--------
+ src/hb-ot-name-language-static.hh | 15 +++------------
+ src/hb-ot-name-table.hh           | 12 +++++-------
+ src/hb-ot-os2-unicode-ranges.hh   | 20 +++-----------------
+ src/hb-ot-post-table.hh           |  3 +--
+ src/hb-ot-var-mvar-table.hh       |  4 +++-
+ src/hb-ucd.cc                     | 18 ++++++++++--------
+ 9 files changed, 47 insertions(+), 68 deletions(-)
 
-commit 8aaecbb5832568135f6149254ed9e17ac4310341
+commit fd6df520a1a4aa9cdaa0c2e515f29ba93d2910d1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 21:41:40 2019 -0700
+Date:   Fri Dec 6 03:00:23 2019 +0000
 
-    Second VS fix try
-    
-    https://github.com/harfbuzz/harfbuzz/issues/1730
+    [array] Isolate bsearch implementation more
 
- src/hb-algs.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-array.hh | 26 ++++++++++++++++++++------
+ 1 file changed, 20 insertions(+), 6 deletions(-)
 
-commit 5a1b5c0a8b91a2291e7327e84acba2406a14414e
+commit 06d3c2019fc2dd9a284a3c2471a1eabef47584c5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 21:08:39 2019 -0700
+Date:   Fri Dec 6 02:52:54 2019 +0000
 
-    Try fixing VS builds
+    [array] Simplify bfind() positioning
     
-    Hopefully fixes https://github.com/harfbuzz/harfbuzz/issues/1730
+    I had copied the old scheme from fontconfig's fccharset.c.  I just
+    convinced myself that this change is correct and produces exact
+    same results.  But I also am skeptical.  Anyone else feel like
+    convincing themselves as well please?
 
- src/hb-algs.hh | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
+ src/hb-array.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
 
-commit 66381fb73f21e8e3c1c14b196e64d1004be303c7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 20:20:43 2019 -0700
+commit d67ba649a38aec1646525a30f992d5f50c4cf06d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Dec 5 13:15:21 2019 +0330
 
-    [ci] Enable other versions of Visual Studio
-    
-    https://github.com/harfbuzz/harfbuzz/issues/1730
+    Rename hb_array_t::in_range to hb_array_t::check_range
 
- appveyor.yml | 44 ++++++++++++++++++++++++--------------------
- 1 file changed, 24 insertions(+), 20 deletions(-)
+ src/hb-array.hh             |  2 +-
+ src/hb-ot-glyf-table.hh     | 20 ++++++++++----------
+ src/hb-ot-var-gvar-table.hh | 16 ++++++++--------
+ 3 files changed, 19 insertions(+), 19 deletions(-)
 
-commit 92fde3dea282d308fad2b8e93cd638aa813c6f2a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 20:16:25 2019 -0700
+commit 72d83a0280b95f99b94c64380bc46558fc941462
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Dec 5 13:09:48 2019 +0330
 
-    Whitespace
+    Make hb_array_t::in_range similar to hb_sanitize_context_t::check_range
 
- src/hb-algs.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/hb-array.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
-commit 49879adbfc57c3173a25bbc55afc0796ee71b6da
-Author: rsheeter <rsheeter@google.com>
-Date:   Fri May 31 15:14:44 2019 -0700
+commit b1167d19e9d72bcadc1a71873afa8dcbe0e26f29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 5 15:46:58 2019 +0000
 
-    [subset] Correct calculation of max offset; fixes bug where loca would erroneously be short
+    Fix!
 
- src/hb-ot-glyf-table.hh | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
+ .../fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf   | Bin 0 -> 1288 bytes
+ .../fonts/28cbcd9409236705ff14bec11a273d16cffdd543.ttf   | Bin 1080 -> 0 bytes
+ 2 files changed, 0 insertions(+), 0 deletions(-)
 
-commit 2ad4ba7bc04fbbd886a2da6fbc55a4e13468d878
+commit 5ff410b493f3abadb397347c118fdfbcfd278e69
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 15:48:54 2019 -0700
+Date:   Thu Dec 5 15:37:56 2019 +0000
 
-    [gsub] Minor
+    Add files, oops
 
- src/hb-ot-layout-gsub-table.hh | 40 +++++++++++++++++++++-------------------
- 1 file changed, 21 insertions(+), 19 deletions(-)
+ .../fonts/28cbcd9409236705ff14bec11a273d16cffdd543.ttf   | Bin 0 -> 1080 bytes
+ test/shaping/data/in-house/tests/rotation.tests          |   4 ++++
+ 2 files changed, 4 insertions(+)
 
-commit 2dbdec66a17af94fffc50949e4712465aada9a68
+commit 2dc20e632efd6aab2abe0ad15ed110ca4553f3ba
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 15:38:11 2019 -0700
+Date:   Thu Dec 5 15:28:42 2019 +0000
 
-    [gsub] Porting serialize to iterators
+    Implement fallback vertical shaping from Firefox
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/355
 
- src/hb-ot-layout-gsub-table.hh | 15 ++++++++++-----
- 1 file changed, 10 insertions(+), 5 deletions(-)
+ src/hb-ot-shape.cc                          | 92 ++++++++++++++++++++++++-----
+ src/hb-ot-shape.hh                          |  1 +
+ test/shaping/data/in-house/Makefile.sources |  1 +
+ 3 files changed, 80 insertions(+), 14 deletions(-)
 
-commit 1834cf86d40abfbb536db1edb366c90318ba49fc
+commit b6d0f1529df9461f1fdb93fae7b5103702ae1517
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 14:39:32 2019 -0700
+Date:   Thu Dec 5 12:19:52 2019 +0000
 
-    [serialize] Pass offset to serialize_subset()
+    [indic] Fix old-spec base-finding logic w vatu feature
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1587
 
- src/hb-open-type.hh            | 14 +++++++++-----
- src/hb-ot-layout-common.hh     |  4 ++--
- src/hb-ot-layout-gdef-table.hh | 12 ++++++------
- src/hb-ot-layout-gsubgpos.hh   |  7 ++++---
- 4 files changed, 21 insertions(+), 16 deletions(-)
+ src/hb-ot-shape-complex-indic.cc | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
 
-commit 926044162472aeca8f5032b11b544d38be587110
+commit 0414341ac576c4403231f507e216c7716c8f0828
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 31 14:34:34 2019 -0700
+Date:   Thu Dec 5 11:26:39 2019 +0000
 
-    [serialize] Pass offset to serialize_copy()
+    Prefer AAT shaping over OT if both available
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1529
 
- src/hb-open-type.hh          | 12 ++++++++----
- src/hb-ot-layout-common.hh   |  4 ++--
- src/hb-ot-layout-gsubgpos.hh |  2 +-
- src/hb-ot-name-table.hh      |  2 +-
- 4 files changed, 12 insertions(+), 8 deletions(-)
+ src/hb-common.cc    |  1 -
+ src/hb-debug.hh     |  1 -
+ src/hb-ot-layout.cc | 21 ---------------------
+ src/hb-ot-shape.cc  | 25 ++-----------------------
+ 4 files changed, 2 insertions(+), 46 deletions(-)
 
-commit 87dd4bff1c42f1845fb3d11477e5de210121d48e
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 30 11:26:17 2019 -0400
+commit 82545c5e2ba2067f2eb117c7358ed6d5b50ca942
+Author: blueshade7 <ariza@typekit.com>
+Date:   Tue Nov 26 10:24:32 2019 -0800
 
-    [math] Rename HB_MATH_GLYPH_PART_FLAG_EXTENDER
-    
-    To HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER.  Added a deprecated macro.
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1734
+    more coding style fixes
 
- src/hb-ot-deprecated.h  |  4 ++++
- src/hb-ot-math-table.hh |  2 +-
- src/hb-ot-math.h        |  2 +-
- test/api/test-ot-math.c | 16 ++++++++--------
- 4 files changed, 14 insertions(+), 10 deletions(-)
+ src/hb-ot-font.cc | 19 +++++++++----------
+ 1 file changed, 9 insertions(+), 10 deletions(-)
 
-commit 88f9dab366491af144da316384991e74af443226
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed May 29 01:55:31 2019 +0430
+commit 2e7c1239c886ea8fa6ba37b7597d76b2d319f468
+Author: blueshade7 <ariza@typekit.com>
+Date:   Tue Nov 26 09:57:53 2019 -0800
 
-    [ci] Clean up and add disabled bots of other msvc versions (#1733)
+    minor: coding style
 
appveyor.yml | 41 ++++++++++++++++++++++++++++++-----------
- 1 file changed, 30 insertions(+), 11 deletions(-)
src/hb-ot-font.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit da9d43171ba4ae0a78c92e9de83498fd2f513c8b
-Author: Bruce Mitchener <bruce.mitchener@gmail.com>
-Date:   Tue May 28 21:50:17 2019 +0700
+commit ed94e41065797b3b22860f1aa68a0b2ea47317e7
+Author: blueshade7 <ariza@typekit.com>
+Date:   Wed Nov 20 10:42:50 2019 -0800
 
-    Fix some typos.
+    fixed api test test-ot-glyphname
 
- docs/usermanual-clusters.xml        | 4 ++--
- docs/usermanual-fonts-and-faces.xml | 2 +-
- src/hb-ot-math.h                    | 2 +-
- 3 files changed, 4 insertions(+), 4 deletions(-)
+ test/api/test-ot-glyphname.c | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
 
-commit 8a133718472d152fa1f69ec52862b019b71b371f
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue May 28 13:54:45 2019 +0430
+commit 7a4745ba8da89f945b7c62f59bbb3d1cc5a45e2d
+Author: blueshade7 <ariza@typekit.com>
+Date:   Wed Nov 20 10:15:41 2019 -0800
 
-    [test] minor, fix copyright
-    
-    nothing important, fixing a copy paste error inconsistency
+    added api test test-ot-glyphname
 
- test/api/test-aat-layout.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ test/api/Makefile.am         |  1 +
+ test/api/test-ot-glyphname.c | 83 ++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 84 insertions(+)
 
-commit 13316ac5d435f11c2c65fd2d762841a819afb639
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue May 28 13:48:39 2019 +0430
+commit ab525ac66dc2e72a636d3f04b575f766af76f9e0
+Author: blueshade7 <ariza@typekit.com>
+Date:   Tue Nov 19 20:36:56 2019 -0800
 
-    [test] minor style improve
+    fix HB_TINY buid
 
- test/subset/run-tests.py | 38 +++++++++++++++++++-------------------
- 1 file changed, 19 insertions(+), 19 deletions(-)
+ src/hb-subset-plan.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
 
-commit d64fb9db520d77eb7bb40ceda4e20be5e602bf91
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Sun May 26 11:05:54 2019 -0400
+commit ff64652cf6bda18d1d7d54f511eed131464e1f3d
+Author: blueshade7 <ariza@typekit.com>
+Date:   Tue Nov 19 18:50:57 2019 -0800
 
-    [use] Allow U+1A60 TAI THAM SIGN SAKOT after vowel
+    fix shape-fuzzer failure
 
- src/gen-use-table.py                               |   7 +-
- src/hb-ot-shape-complex-use-machine.hh             | 609 +++++++++++----------
- src/hb-ot-shape-complex-use-machine.rl             |  20 +-
- src/hb-ot-shape-complex-use-table.cc               |   4 +-
- src/hb-ot-shape-complex-use.cc                     |   3 +
- src/hb-ot-shape-complex-use.hh                     |   2 +
- .../3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf   | Bin 0 -> 1144 bytes
- .../fd565cabd5208d345d0ed4fda7ae742917d846a5.ttf   | Bin 1056 -> 0 bytes
- .../shaping/data/in-house/tests/use-syllable.tests |   5 +-
- 9 files changed, 351 insertions(+), 299 deletions(-)
-
-commit 179570d4cae9aefcd91d540b8865a81d569b3358
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 27 13:08:07 2019 -0400
+ src/hb-ot-cff1-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-    [atomic] Fix warning, second time
-    
-    Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1554306
+commit a333b0f7172923ff70dcb1bca15a5474fd84f82f
+Author: blueshade7 <ariza@typekit.com>
+Date:   Tue Nov 19 18:01:53 2019 -0800
 
- src/hb-atomic.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+    add hb-ot-cff1-std-str.hh to Makefile.sources
 
-commit ad17a8bdd571c7b275f9735e3602a8068f12934f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 16:33:21 2019 -0400
+ src/Makefile.sources | 1 +
+ 1 file changed, 1 insertion(+)
 
-    [ucd] Update for latest packTab
+commit 61707266a3ea9fc54323742de6559fb00987dc29
+Author: blueshade7 <ariza@typekit.com>
+Date:   Tue Nov 19 17:09:12 2019 -0800
 
- src/gen-ucd-table.py | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+    fix get_sid crash
 
-commit 771712b3ca97035ba5690e65bd7e63a852286159
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 15:58:45 2019 -0400
+ src/hb-ot-cff1-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    [ucd] Update for recent packTab
-    
-    No need for separate youseedy package.
+commit 4c4e08a1eff5a4bf355f032f32fb4fa25b9349d7
+Author: blueshade7 <ariza@typekit.com>
+Date:   Tue Nov 19 16:50:28 2019 -0800
 
- src/gen-ucd-table.py | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+    add cff1::accelerator_t::fini
 
-commit 52aa6c57c5a4b18807a1329549dface90b148f22
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat May 25 22:55:06 2019 +0430
+ src/hb-ot-cff1-table.hh | 7 +++++++
+ 1 file changed, 7 insertions(+)
 
-    [ci] minor
+commit ff87465b400af4685680a7a3076533ee6b635dd3
+Author: blueshade7 <ariza@typekit.com>
+Date:   Tue Nov 19 16:18:33 2019 -0800
 
- .circleci/config.yml | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+    add get_glyph_from_name & test. use hb_string_array
 
-commit 9b75da4299adb5487519ddf96e99949b1dad2d5c
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat May 25 22:46:10 2019 +0430
+ src/Makefile.am           |   5 +
+ src/hb-ot-cff1-std-str.hh | 425 ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cff1-table.cc   |  69 --------
+ src/hb-ot-cff1-table.hh   |  85 +++++++++-
+ src/hb-ot-font.cc         |   6 +-
+ src/test-ot-glyphname.cc  |  91 ++++++++++
+ 6 files changed, 602 insertions(+), 79 deletions(-)
 
-    [ci] minor
+commit 51e772852191e99206bd69f2f06d029ba01e5745
+Author: blueshade7 <ariza@typekit.com>
+Date:   Sun Nov 17 02:25:39 2019 -0800
 
- .circleci/config.yml | 2 ++
- 1 file changed, 2 insertions(+)
+    minor
 
-commit 9158cab3f9f9e1a4941c1dbf0aa71455ceb00da6
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat May 25 22:33:02 2019 +0430
+ src/hb-ot-cff1-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    [ci] Store dist-win result instead
+commit 6d9eb9c04095db74f40c00a3d6e5a6432491059d
+Author: blueshade7 <ariza@typekit.com>
+Date:   Sun Nov 17 02:20:22 2019 -0800
 
- .circleci/config.yml | 11 +++++------
- 1 file changed, 5 insertions(+), 6 deletions(-)
+    fixed failure with language-tags.tests
 
-commit 85b68a42af541bc91f2851389ac09b012a6d3aa1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 12:59:01 2019 -0400
+ src/hb-ot-cff1-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-    [atomic] Fix warnings
-    
-    https://bugzilla.mozilla.org/show_bug.cgi?id=1554306
+commit 59fe379797adca37e29c002ffabc27f9c74f8746
+Author: blueshade7 <ariza@typekit.com>
+Date:   Sat Nov 16 19:47:31 2019 -0800
 
- src/hb-atomic.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+    fixed hb-shape-fuzzer failures in get_sid
 
-commit 941c1b6d711b8528d0f5faa5655b09ea74f7dfb4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 12:52:16 2019 -0400
+ src/hb-ot-cff1-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
-    [mingw] Update instructions
-    
-    https://github.com/harfbuzz/harfbuzz/issues/1728
+commit e26df436bcf215d1a4520e9851aa607b0de0ca84
+Author: blueshade7 <ariza@typekit.com>
+Date:   Sat Nov 16 19:12:34 2019 -0800
 
- RELEASING.md | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+    fix test-ot-face crash
 
-commit 210f93c143d0fa2a7b293a6ffd138b3e01cab7c0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 12:49:20 2019 -0400
+ src/hb-ot-cff1-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-    [mutex] Prefer pthread over windows
-    
-    https://github.com/harfbuzz/harfbuzz/issues/1728
+commit 7b49042ef4812d8550d884a400936331fad9951a
+Author: blueshade7 <ariza@typekit.com>
+Date:   Sat Nov 16 18:20:16 2019 -0800
 
- src/hb-mutex.hh | 22 +++++++++++-----------
- 1 file changed, 11 insertions(+), 11 deletions(-)
+    add cff1::get_glyph_name
 
-commit a5d1b0bdaa0183e2bd310640f5867426096e0b18
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 12:45:40 2019 -0400
+ src/hb-ot-cff1-table.cc |  69 +++++++++++++++++++++++++++
+ src/hb-ot-cff1-table.hh | 124 +++++++++++++++++++++++++++---------------------
+ src/hb-ot-font.cc       |   6 ++-
+ 3 files changed, 144 insertions(+), 55 deletions(-)
 
-    Look for pthread even if win32
-    
-    https://github.com/harfbuzz/harfbuzz/issues/1728
+commit ea8fdfa07939b97db6636327c8d55cd3b5a62b4c
+Merge: 453050ad d5338ba1
+Author: blueshade7 <ariza@typekit.com>
+Date:   Fri Nov 22 15:59:09 2019 -0800
 
- configure.ac | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
+    Merge branch 'master' into var-subset
 
-commit f3b132187fc734cbb3705b405361c8bad9a72582
+commit d5338ba1894f73629528a2a505e30cd681a5f1c6
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 12:42:38 2019 -0400
+Date:   Fri Nov 22 16:22:27 2019 -0500
 
-    [mingw] Some more tweaks
+    [ft] Add locking FT_Face API
     
-    It now survives ./config.status --recheck as well.
+    Now that we mutex our internal FT_Face, share it with clients.
     
-    https://github.com/harfbuzz/harfbuzz/issues/1728
+    New API:
+    - hb_ft_font_lock_face()
+    - hb_ft_font_unlock_face()
 
- mingw-configure.sh | 37 ++++++++++++++++++-------------------
mingw32.sh         |  2 +-
- mingw64.sh         |  2 +-
- 3 files changed, 20 insertions(+), 21 deletions(-)
+ docs/harfbuzz-sections.txt |  2 ++
src/hb-ft.cc               | 56 +++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ft.h                |  6 +++++
+ 3 files changed, 61 insertions(+), 3 deletions(-)
 
-commit c41ed54b169c16fb9862e88ddf127ae68c1561e9
+commit e5c7ee9f757baa166a96d73b7ec0cb2b1ae23385
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 12:35:09 2019 -0400
+Date:   Wed Nov 20 14:22:01 2019 -0500
 
-    [mingw] Add "make dist-win" to toplevel Makefile
+    [set] Fix undefined-behavior shift in _previous()
+    
+    harfbuzz/src/hb-set.hh:138:43: runtime error: shift exponent 64 is too large for 64-bit type 'hb_set_t::page_t::elt_t' (aka 'unsigned long long')
 
Makefile.am | 16 +++++++++++++---
- 1 file changed, 13 insertions(+), 3 deletions(-)
src/hb-set.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
 
-commit a0a75a7c701932f4533b104eeb3c6087d01aa2ae
+commit 5fddc5f1698aa50e1be9cd729032c40fa5bd64b1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 12:16:28 2019 -0400
+Date:   Wed Nov 20 13:07:26 2019 -0500
 
-    [mingw] More
+    Use foreach_cluster
 
- Makefile.am        |  8 +++++++-
- mingw-configure.sh | 29 +++++++++++++++++++++++++++++
- mingw32.sh         | 25 ++-----------------------
- mingw64.sh         | 25 ++-----------------------
- 4 files changed, 40 insertions(+), 47 deletions(-)
+ src/hb-buffer.cc | 14 ++------------
+ 1 file changed, 2 insertions(+), 12 deletions(-)
 
-commit 309a9d8ffb499f89738864acef596685ca495150
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat May 25 20:40:03 2019 +0430
+commit e4a101ed38f61b3ac710e483528816372cbeb3d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 19 20:04:00 2019 -0500
 
-    [ci] Remove --without-icu now that we have it in ./mingw{32,64} scripts
+    [ft] Fix for HB_NO_VAR build
 
.circleci/config.yml | 4 ++--
src/hb-ft.cc | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit ccfe642c0cdc9fbc8280669e3e8b01dc5eb682d8
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 12:08:05 2019 -0400
+commit 76c27462c242f00e26d3b172dbdf618121aac306
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Nov 19 16:51:33 2019 -0500
 
-    [mingw] Force off ICU
+    Don’t modify a ccc to 6
     
-    If cross-compiled ICU is not available, we might end up finding the
-    native ICU via icu-config.  That's distracting.
+    ccc=6 will be used in Unicode 13.0.
 
- mingw32.sh | 2 +-
- mingw64.sh | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
+ src/hb-unicode.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 0e6b7f7cd51d7376f21a422881cb4eb542360b0b
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat May 25 20:27:29 2019 +0430
+commit 8fdafee2a621f64101a5d55ded64de9e693db34a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Nov 18 16:44:25 2019 -0800
 
-    [ci] Build mingw on Fedora and store .exe outputs
+    undef HB_STRING_ARRAY_LENG_NAME
 
- .circleci/config.yml | 16 ++++++++++++----
- 1 file changed, 12 insertions(+), 4 deletions(-)
+ src/hb-string-array.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 7b716cbbe6de2902ca6b1f67024b3f8cdb41340c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 11:37:23 2019 -0400
+commit 5e9863f3c63c6b9060d270d5cf959e16ac1294bb
+Author: blueshade7 <ariza@typekit.com>
+Date:   Mon Nov 18 15:40:43 2019 -0800
 
-    [ming2] Update instructions
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1728
-    
-    Only left to write how to create a win32 bundle.
+    ARRAY_LENGTH fails with -Wglobal-constructors
 
- README.mingw.md | 44 ++++++++++++++++++++++++++------------------
- RELEASING.md    | 54 ++++++------------------------------------------------
- 2 files changed, 32 insertions(+), 66 deletions(-)
+ src/hb-string-array.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 77a1b6b7c3bd5490ffa5bb48a8b52d9c4c18e669
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 11:18:40 2019 -0400
+commit a75983690d0b3575ef208592c51f730410230af7
+Author: blueshade7 <ariza@typekit.com>
+Date:   Mon Nov 18 15:09:24 2019 -0800
 
-    [mingw] Rename README.wine
+    calculate hb_string_array length automatically
 
Makefile.am                       | 2 +-
- README.wine.md => README.mingw.md | 0
- 2 files changed, 1 insertion(+), 1 deletion(-)
src/hb-ot-post-table.hh | 10 ++++------
+ src/hb-string-array.hh  |  3 +++
+ 2 files changed, 7 insertions(+), 6 deletions(-)
 
-commit c68b4264880c0f99bcb579345e51ce54e799655b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 11:17:56 2019 -0400
+commit 57da16bc5986ce714fb3f57501e5f45a33aaa99a
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Nov 17 21:32:12 2019 +0200
 
-    [mingw] Update for recent change
+    [cff] Check rcurveline and rlinecurve arguments
+    
+    Make sure the number of arguments is not too many or too few, otherwise
+    skip the command.
 
- README.wine.md | 2 +-
- RELEASING.md   | 4 ++--
- 2 files changed, 3 insertions(+), 3 deletions(-)
+ src/hb-cff-interp-cs-common.hh | 41 +++++++++++++++++++++++------------------
+ 1 file changed, 23 insertions(+), 18 deletions(-)
 
-commit 5cf2e648a67e1af20a23e010c86e8812a74ff7a4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 25 11:15:15 2019 -0400
+commit 9f1524ce83ebd2c3320ffc90776cb0f533db143f
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Nov 17 16:17:20 2019 +0200
 
-    [mingw] Update for Fedora mingw installation location
+    [cff] Fix a typo in processing rlinecurve
     
-    Also adds --with-uniscribe by default.
+    We want to process all pairs of arguments except the last 6 as lines, so
+    should have been subtracting 6 here, otherwise if the number of
+    arguments happens to be multiples of 6 they will be all treated as
+    curves.
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1728
+    See https://github.com/harfbuzz/harfbuzz/pull/2016#issuecomment-554640098
 
- mingw32.sh | 9 +++++----
- mingw64.sh | 9 +++++----
- 2 files changed, 10 insertions(+), 8 deletions(-)
+ src/hb-cff-interp-cs-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit e7ed85de95d3ccdb674ec5a30ae66d53cea74b3a
-Merge: f93a5e6a 97ba206b
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sat May 25 16:05:07 2019 +0100
+commit 78d5eca813250b79e9b1fbfd2de3eae7ccf1fcf3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 18 13:09:29 2019 -0500
 
-    Merge pull request #1691 from n8willis/usermanual-shaping
+    [set] Fix range-based-loop condition
     
-    Usermanual: Add new chapters.
+    Alternative to https://github.com/harfbuzz/harfbuzz/pull/2046
 
-commit 97ba206bed341dc7c915a86531512b1e0617303d
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sat May 25 12:26:50 2019 +0100
+ src/hb-set.hh | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
 
-    Usermanual; minor.
+commit 4dae7cee4b44fd6ffb295f8c99a52e42934d0c3c
+Author: Hal Canary <halcanary@gmail.com>
+Date:   Wed Nov 13 10:08:35 2019 -0500
 
- ...usermanual-buffers-language-script-and-direction.xml |  2 +-
- docs/usermanual-opentype-features.xml                   | 17 ++++++++++-------
- 2 files changed, 11 insertions(+), 8 deletions(-)
+    [minor] Fix common typos: substition, the the.
+    
+    s/substition/substitution/
+    s/the the/the/
 
-commit f93a5e6a7dad4fde2bf61c241bf32da678525c8b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 24 17:02:38 2019 -0400
+ src/hb-ot-layout.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-    [win] Add mingw-ldd.py
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1728
+commit e6351d9b2c44c9abde90a6599ae7ebf0f6416c65
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Nov 11 17:39:55 2019 -0500
 
- mingw-ldd.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 58 insertions(+)
+    Add ms-use/IndicShapingInvalidCluster.txt
 
-commit 5fd3ece5237ac6a4ee95b2665b5e20102ed176bb
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 24 15:56:15 2019 -0400
+ src/Makefile.am                              |   2 +-
+ src/gen-vowel-constraints.py                 |   4 +-
+ src/hb-ot-shape-complex-vowel-constraints.cc |   2 +-
+ src/ms-use/COPYING                           |  21 ++++++
+ src/ms-use/IndicShapingInvalidCluster.txt    | 105 +++++++++++++++++++++++++++
+ 5 files changed, 130 insertions(+), 4 deletions(-)
 
-    2.5.0
+commit b372c3e95694c8b1cabc0eb01c5abef6c41d3dbd
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Nov 8 20:59:48 2019 -0500
 
- Makefile.am      |  2 +-
- NEWS             | 14 ++++++++++++++
- configure.ac     |  2 +-
- src/hb-version.h |  4 ++--
- 4 files changed, 18 insertions(+), 4 deletions(-)
+    Insert a dotted circle within <U+0B85, U+0BC2>
 
-commit 1da089179b9bd06f071f967d128819e85998b809
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 24 15:41:34 2019 -0400
+ src/HBIndicVowelConstraints.txt              | 97 ----------------------------
+ src/Makefile.am                              |  2 +-
+ src/gen-vowel-constraints.py                 | 25 ++++---
+ src/hb-ot-shape-complex-vowel-constraints.cc | 27 ++++++--
+ 4 files changed, 40 insertions(+), 111 deletions(-)
 
-    Put back Since: tags for hb_color_get_*
+commit 64a45be5198f6e22c91454bda7bd9a9294552dff
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 9 12:25:33 2019 +0330
 
- src/hb-common.cc | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+    [ubsan] Don't decrease pointer if match_glyph_data is null (#2048)
+    
+    Similar to fix on https://github.com/harfbuzz/harfbuzz/pull/2022
+    
+    Fixes https://crbug.com/1023070
 
-commit dd5ad6b6b5aed3db62bc03b89acf90c68795edb4
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Fri May 24 20:30:22 2019 +0100
+ src/hb-ot-layout-gsubgpos.hh                              |   6 +++++-
+ ...zz-testcase-minimized-harfbuzz_fuzzer-5740518101090304 | Bin 0 -> 439 bytes
+ 2 files changed, 5 insertions(+), 1 deletion(-)
 
-    Usermanual-buffers-chapter: trim out fallback-of-ufuncs talk and just mention that stuff exists if you care to go find it.
+commit 878e3588a3349c2660b0f9aa6d94a994034d7c10
+Author: Don <don.j.olmstead@gmail.com>
+Date:   Tue Nov 5 15:26:01 2019 -0800
 
- docs/usermanual-buffers-language-script-and-direction.xml | 13 +++++++------
- 1 file changed, 7 insertions(+), 6 deletions(-)
+    [cmake] Add harfbuzz-icu library
 
-commit e1a5ce6aa661251e998df7b3612a1d5d39e28827
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Fri May 24 10:58:52 2019 -0700
+ CMakeLists.txt | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
 
-    Fix fuzzer crash testcase
+commit 84b86a12d99e996cfd85f9fe6fd2c2a593dd5cc2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Nov 6 09:22:34 2019 +0330
+
+    [fuzz] Remove just added case
     
-    Add a check for stringOffSet(uint16) overflow,
-    return early if overflow happens
+    It didn't fail locally but on bots causing timeout, let remove for now.
 
- src/hb-ot-name-table.hh                                |   2 +-
- ...estcase-minimized-hb-subset-fuzzer-5077547978588160 | Bin 0 -> 339602 bytes
- ...estcase-minimized-hb-subset-fuzzer-5761434614497280 | Bin 0 -> 532 bytes
- 3 files changed, 1 insertion(+), 1 deletion(-)
+ ...estcase-minimized-hb-subset-fuzzer-5121706490593280 | Bin 161328 -> 0 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit 240540ff9a463cf386ae5755471a5621b94290df
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Fri May 24 20:13:35 2019 +0100
+commit a8f049c9a18f166a826c78caa153330a1ec04214
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Nov 5 22:26:36 2019 +0330
 
-    Usermanual-buffers-chapter: explain ICU fallback for Ufuncs.
+    [fuzz] Upload testcase of https://crbug.com/oss-fuzz/18529
+    
+    Apparently false alarm per last comment and was ok locally also but lets have it here also
 
- docs/usermanual-buffers-language-script-and-direction.xml | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
+ ...estcase-minimized-hb-subset-fuzzer-5121706490593280 | Bin 0 -> 161328 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit d100ccad02b038719472b2cc733940ffb0374cd1
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Sun May 19 10:01:20 2019 -0400
+commit 7cde68f10cdf2c3ff77c1d9077475c0fc034c75c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 2 19:04:14 2019 +0330
 
-    [use] Allow multiple FMs in a cluster
+    [ci] install pip in fedora bot
 
- src/gen-use-table.py                   |  12 +-
- src/hb-ot-shape-complex-use-machine.hh | 567 ++++++++++++++++-----------------
- src/hb-ot-shape-complex-use-machine.rl |  14 +-
- src/hb-ot-shape-complex-use-table.cc   |  38 ++-
- src/hb-ot-shape-complex-use.hh         |  11 +-
- 5 files changed, 315 insertions(+), 327 deletions(-)
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 487879e013758aef2c7f824033a40cd56361d240
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 24 12:37:53 2019 -0400
+commit 46178c0325afc6b3131388fa2496e85d2aacace6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Nov 2 14:36:30 2019 +0330
 
-    Don't compile in UCD if HB_NO_UCD defined
+    [ci] fix fedora bot
 
- src/hb-ucd.cc | 3 +++
- 1 file changed, 3 insertions(+)
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 1fffe51a295b6106a442bed8107d305c325bef05
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 24 10:52:09 2019 -0400
+commit 486754a888d067c990d6a4351ccd41570f08c956
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Sep 23 23:48:08 2019 +0330
 
-    [blob] Shuffle
+    [serialize] Extract iterable copy, copy_all
 
- src/hb-blob.h | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-ot-cmap-table.hh        | 6 +++---
+ src/hb-ot-layout-gpos-table.hh | 7 ++-----
+ src/hb-ot-name-table.hh        | 2 +-
+ src/hb-ot-vorg-table.hh        | 2 +-
+ src/hb-serialize.hh            | 6 ++++++
+ 5 files changed, 13 insertions(+), 10 deletions(-)
 
-commit 96de94768b08287325be8947255917502368c337
-Merge: c96c6b28 1197bef2
-Author: rsheeter <rsheeter@google.com>
-Date:   Fri May 24 11:22:41 2019 -0700
+commit 35218c488c3966aa6d459ec5a007a2b43208e97c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 31 13:19:44 2019 -0700
 
-    Merge pull request #1722 from googlefonts/glyf
+    Minor
     
-    [subset] Use iterators in glyf/loca subsetting
+    Allow empty HB_VAR_ARRAY definition.  Though, doesn't compile with any
+    compiler I know of.
 
-commit 1197bef26c63ee896bea3fab5788635cb0fc9d18
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Fri May 24 10:52:49 2019 -0700
+ src/hb-machinery.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    [subset] Per code review, use hb_array to avoid duplicated type name
+commit 1a1d64bc6f52b42e21609e8ceb4269bdf53b3c40
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 31 12:50:47 2019 -0700
 
- src/hb-ot-glyf-table.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+    If applying morx, apply kern table even if GPOS is present and has kern
+    
+    Since we won't be applying GPOS if morx...
+    
+    To be adjusted as I receive more information from Ned.  But for now
+    fixes this:
+    
+    $ ./hb-shape GillSans.ttc Ty
+    [T=0+1109|y=1@-128,0+769]
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1982 for now.
 
-commit e66253283385aa67eb9c5ab627139a56f9ae5a71
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Fri May 24 10:39:56 2019 -0700
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    [subset] Cppcheck complaints
+commit 3a74ee528255cc027d84b204a87b5c25e47bff79
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 29 12:27:03 2019 -0700
 
- test/api/hb-test.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+    2.6.4
 
-commit 13b3cd307e7dedea3b419fb06d81a008e49ccff6
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Fri May 24 10:10:12 2019 -0700
+ NEWS             | 7 +++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 10 insertions(+), 3 deletions(-)
 
-    [subset] Address @behdad review feedback
+commit 3958f6fb2378d83dd5107d62a8464187c93707b0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 29 22:36:50 2019 +0330
 
- src/hb-ot-glyf-table.hh | 18 ++++++++----------
- 1 file changed, 8 insertions(+), 10 deletions(-)
+    Add in_range in hb_bytes_t to merge range_checker_t with it
 
-commit c96c6b287ff1d96da6a50a8cb3f641fe8705e5f7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 23 21:37:17 2019 -0400
+ src/hb-array.hh             |  9 +++++++++
+ src/hb-ot-glyf-table.hh     | 28 ++++++++++++--------------
+ src/hb-ot-var-gvar-table.hh | 49 +++++++++++++++------------------------------
+ 3 files changed, 38 insertions(+), 48 deletions(-)
 
-    One more
+commit 7915c5d6fa3efac99df08a54d4437eca0b780033
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 29 22:55:34 2019 +0330
 
- .circleci/config.yml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+    [ci] Check the recipt introduce in 7152ac3
 
-commit b567d4ea14cc6ec0e8efc64a4993a9b0461adb20
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 23 21:36:42 2019 -0400
+ .circleci/config.yml | 1 +
+ 1 file changed, 1 insertion(+)
 
-    Fix build after UCDN -> UCD
+commit aa3831e295540083350c640d4a630f53e70d822f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 29 21:37:07 2019 +0330
 
- CMakeLists.txt                       | 14 --------------
- configure.ac                         | 18 +-----------------
- docs/usermanual-install-harfbuzz.xml | 34 ++++++++--------------------------
- 3 files changed, 9 insertions(+), 57 deletions(-)
+    [glyf] Use contour_bounds_t::empty to simplify get_extents logic
 
-commit 226ab06ec110f4cbd56b39ce0d05d349dfec35b9
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 23 20:39:04 2019 -0400
+ src/hb-ot-glyf-table.hh | 20 ++++++--------------
+ 1 file changed, 6 insertions(+), 14 deletions(-)
 
-    [ucd] Add URL to dependencies
+commit d59ae5836d1349b885db980cbb741da33caebfde
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 29 21:30:04 2019 +0330
 
- src/gen-ucd-table.py | 3 +++
- 1 file changed, 3 insertions(+)
+    [glyf] Refactor contour_bounds_t use to make its fields protected
 
-commit 65392b734e38668b870b1ffcbfb4b42ec289ef58
+ src/hb-ot-glyf-table.hh | 47 ++++++++++++++++++++++++++---------------------
+ 1 file changed, 26 insertions(+), 21 deletions(-)
+
+commit 773ee8041e8905bfb06c1a71d2b4fc99110b3dc6
+Merge: 47b4074d 0efbda7a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 22 16:21:21 2019 -0400
+Date:   Tue Oct 29 10:58:56 2019 -0700
 
-    [ucdn] Replace UCDN with a new UCD implementation
-    
-    UCDN was ~120kb of data.  New implementatoin is 69kb in default builds,
-    and 49kb if built with HB_OPTIMIZE_SIZE or __OPTIMIZE_SIZE__.  The
-    latter automatically enabled if built with -Os or -Oz.
-    
-    There's room to shave off another 10kb or 20kb.  That will follow later.
+    Merge pull request #2038 from ebraminio/glyf-contour
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1652
-
- src/Makefile.am              |   11 -
- src/Makefile.sources         |    5 +-
- src/gen-ucd-table.py         |   11 +-
- src/hb-algs.hh               |    8 +
- src/hb-ot-layout.cc          |   76 +-
- src/hb-ucd-table.hh          | 5160 +++++++++++++++++++++++++++++++++++++
- src/hb-ucd.cc                |  209 ++
- src/hb-ucdn.cc               |  272 --
- src/hb-ucdn/COPYING          |   13 -
- src/hb-ucdn/Makefile.am      |   16 -
- src/hb-ucdn/Makefile.sources |    7 -
- src/hb-ucdn/README           |   40 -
- src/hb-ucdn/ucdn.c           |  361 ---
- src/hb-ucdn/ucdn.h           |  472 ----
- src/hb-ucdn/ucdn_db.h        | 5790 ------------------------------------------
- src/hb-unicode.cc            |    8 +-
- 16 files changed, 5427 insertions(+), 7032 deletions(-)
+    Remove contour_point_t so we won't need to zero its unused var
 
-commit 12c59f6c40401c8221facc5d0aed63f510a77dd7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 23 13:33:21 2019 -0400
+commit 0efbda7a40742cbdf30d5a85061ffb6a0a55bcc0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 29 21:03:26 2019 +0330
 
-    [deprecated] Minor
+    Remove contour_point_t so we won't need to zero its unused var
 
- src/hb-deprecated.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-glyf-table.hh | 27 +++++++++++++--------------
+ 1 file changed, 13 insertions(+), 14 deletions(-)
 
-commit 36dee9221f8de3a2a6a23f0548460aab4982b594
+commit 47b4074d5f98d71d2983470602eff9b93f102af4
+Merge: dd8a8460 dd288840
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 22 15:51:53 2019 -0400
+Date:   Tue Oct 29 03:16:34 2019 -0700
 
-    [gen-ucd] Rename
+    Merge pull request #2034 from khaledhosny/cmap-notdef
+    
+    [cmap] Check GID before adding ranges in format 4 & 12
 
- src/Makefile.am                      | 1 +
- src/{gen-ucd.py => gen-ucd-table.py} | 0
- 2 files changed, 1 insertion(+)
+commit dd8a8460377ca54207877ea9da96931175dbb15f
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Tue Oct 29 09:20:41 2019 +0000
 
-commit 831c213501fc38229755be7958b2952fe0cdff0e
+    Use proper y-scale factor for height value
+
+ src/hb-ot-cff1-table.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7152ac3fcfe8a599aa0d20f8d02ef38c69111231
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 22 15:46:19 2019 -0400
+Date:   Mon Oct 28 17:12:55 2019 -0700
 
-    [gen-ucd] Minor
+    Fix build
+    
+    $ make CPPFLAGS="-DHB_TINY -DHB_NO_OT_FONT" libharfbuzz-subset.la
 
- src/gen-ucd.py | 30 +++++++++++++++++++++++++++---
- 1 file changed, 27 insertions(+), 3 deletions(-)
+ src/hb-subset-plan.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
 
-commit 15a9e32b566fbf6f4a2c6fd488d8cc3865234b17
-Merge: 993d81b9 ff7fc6d4
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu May 23 11:02:15 2019 +0430
+commit dd288840d6f87acd13b99b71408dcdb35a2be9cb
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Oct 29 01:45:49 2019 +0200
 
-    Merge pull request #1723 from googlefonts/drop_tables
+    [cmap] Check GID before adding ranges in format 4 & 12
     
-    [subset] Add morx, mort, kern, and kernx to the default layout tables…
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2031
 
-commit ff7fc6d488f37e3faaca4986cde35836f013b03f
-Author: Garret Rieger <grieger@google.com>
-Date:   Wed May 22 17:36:16 2019 -0700
+ src/hb-ot-cmap-table.hh          |  32 ++++++++++++++++++++++++--------
+ test/api/fonts/cmunrm.otf        | Bin 0 -> 330492 bytes
+ test/api/test-collect-unicodes.c |  22 ++++++++++++++++++++++
+ 3 files changed, 46 insertions(+), 8 deletions(-)
 
-    [subset] Add morx, mort, kern, and kernx to the default layout tables drop list.
+commit fd71c045b46380281ba8a7e351fac7248938c74c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 17:06:53 2019 -0700
 
- src/hb-subset-input.cc | 4 ++++
- src/hb-subset.cc       | 4 ++++
- 2 files changed, 8 insertions(+)
+    Hopefully fix up previous commit and bots
 
-commit 993d81b9c57f2e27d80d276953b0430821129425
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Tue May 14 13:55:11 2019 -0700
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    [subset] Add one ttf file with fvar/STAT tables to integration test
-    Ignore gvar/MVAR/HVAR table
-    add support for --nameIDs=* option
+commit e832dc4c642f604d2cbb8e6b2f0b8d37151936f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 17:02:40 2019 -0700
+
+    [config] Make HB_NO_ERRNO work with systems defining errno as a macro
+
+ src/hb.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit ce11df1b5b8e49712bef249de19bc4768f3a691c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 14:45:31 2019 -0700
+
+    2.6.3
+
+ NEWS             | 8 ++++++++
+ configure.ac     | 2 +-
+ src/hb-font.cc   | 2 +-
+ src/hb-version.h | 4 ++--
+ 4 files changed, 12 insertions(+), 4 deletions(-)
+
+commit 5a59de2b983ed7a1c639ea3e4d23c341134cd6d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 14:02:47 2019 -0700
+
+    Actually add +hb_font_get_nominal_glyphs()
+    
+    New API:
+    +hb_font_get_nominal_glyphs()
+
+ src/hb-font.cc | 23 +++++++++++++++++++++++
+ src/hb-font.h  |  8 ++++++++
+ 2 files changed, 31 insertions(+)
+
+commit 03028a5fe512978a8f8e2396001cf8e425b44f72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 13:46:56 2019 -0700
+
+    Revert "Don't include codepoint 0 in the results of collect_unicodes."
+    
+    This reverts commit 14ad96ffbf77c33d8d33d2686d17c2375381989e.
+    
+    This was wrong.  My bad!
+    
+    https://github.com/harfbuzz/harfbuzz/issues/2031
+
+ src/hb-ot-cmap-table.hh | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit 2714dc31b8d0ffe3c043935dd7619be0dd7b7635
+Merge: aca63902 14ad96ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 28 13:01:34 2019 -0700
+
+    Merge pull request #2032 from googlefonts/collect_unicodes
+    
+    Don't include codepoint 0 in the results of collect_unicodes.
+
+commit 14ad96ffbf77c33d8d33d2686d17c2375381989e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Oct 28 12:56:04 2019 -0700
+
+    Don't include codepoint 0 in the results of collect_unicodes.
+    It is always assumed to be the notdef glyph.
+
+ src/hb-ot-cmap-table.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit aca63902814748b36bf6939421cfa95eed3a1ca7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 22 00:06:46 2019 +0330
+
+    [gpos] Don't move pointer when match_glyph_data is not set
+
+ src/hb-ot-layout-gsubgpos.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit defe9b6da018bc85750c999454c51fde0cadb9b2
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Oct 25 10:07:26 2019 -0700
+
+    crash fix : Heap-buffer-overflow READ 2
+    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=18513
+
+ src/hb-ot-layout-gpos-table.hh                            |  12 ++++++------
+ ...z-testcase-minimized-hb-subset-fuzzer-5677906231033856 | Bin 0 -> 938 bytes
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit b2fcca6e14afc8085cc1c2491b2d7c780dad1450
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Oct 24 15:15:26 2019 -0700
+
+     fuzzer crash fix
+     https://oss-fuzz.com/testcase-detail/5643107869917184
+
+ src/hb-ot-layout-gsubgpos.hh                             |  11 +++++++----
+ ...-testcase-minimized-hb-subset-fuzzer-5643107869917184 | Bin 0 -> 3232 bytes
+ 2 files changed, 7 insertions(+), 4 deletions(-)
+
+commit 9815ca0338b47c6ea4e82f2fbd39d70e3456aca1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 24 21:05:38 2019 +0330
+
+    [ci] Use custom subset fuzzer timeout for failing sanitizer bots
+
+ .circleci/config.yml                    | 8 ++++----
+ test/fuzzing/run-shape-fuzzer-tests.py  | 3 ++-
+ test/fuzzing/run-subset-fuzzer-tests.py | 3 ++-
+ 3 files changed, 8 insertions(+), 6 deletions(-)
+
+commit b03b62cb304279195569180061cde745e0c9880a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 23 12:18:21 2019 +0330
+
+    [ci] Add HB_NO_MT on non HB_TINY no-build-system builds
+
+ .circleci/config.yml | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 5e489670e15329f5eced16e5a76145c6149a265f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 22 15:03:47 2019 -0700
+
+    Remove hb-warning.cc
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2005
+
+ src/Makefile.sources |  1 -
+ src/harfbuzz.cc      |  1 -
+ src/hb-atomic.hh     | 16 +++++-----------
+ src/hb-mutex.hh      | 25 ++++++-------------------
+ src/hb-warning.cc    | 37 -------------------------------------
+ 5 files changed, 11 insertions(+), 69 deletions(-)
+
+commit 05bcdb39d8648c49f7984c404aee096f2ad1d655
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Oct 21 16:10:06 2019 -0700
+
+    Add a specialization of array_t:hash for hb_bytes_t and hb_ubytes_t.
+
+ src/hb-array.hh              | 34 ++++++++++++++++++++++++----------
+ src/hb-ot-layout-gsubgpos.hh |  2 --
+ 2 files changed, 24 insertions(+), 12 deletions(-)
+
+commit 95ab110cd9a6083a854e538211618b2733aba643
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Oct 21 13:15:46 2019 -0700
+
+    Optimize intersects_array to fix fuzzer timeout.
+
+ src/hb-ot-layout-gsubgpos.hh                           |  10 +++++-----
+ ...estcase-minimized-hb-subset-fuzzer-5763024094232576 | Bin 0 -> 125681 bytes
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit be5cdcdfa21a2d956fc8c445452a78e77ede95fb
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 22 11:55:04 2019 -0700
+
+    Store the hash value of a key in item_t in hb_map to reduce the number of hash computations.
+
+ src/hb-map.hh | 70 ++++++++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 40 insertions(+), 30 deletions(-)
+
+commit b33a0d628e5e76992fdd02fd4178906137e6153c
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Oct 21 13:24:52 2019 -0700
+
+    fuzzer crash fix: Null-dereference WRITE
+    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=18363
+
+ src/hb-ot-layout-common.hh                                |   4 +++-
+ ...z-testcase-minimized-hb-subset-fuzzer-5659903036751872 | Bin 0 -> 781 bytes
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit cf414e361a99decd9c1710f1012236bffd067878
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Sep 27 09:55:17 2019 -0700
+
+    Added profiling instructions to TESTING.md
+
+ TESTING.md | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit 1f0a9d9be979de01527c05f4dbe6fbc62799597c
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Sep 17 11:10:08 2019 -0700
+
+    [subset] GPOS Lookup Type 2: PairPos
+
+ src/hb-ot-layout-gpos-table.hh                     | 131 ++++++++++++++++++++-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...s2_1_font7.keep-layout-retain-gids.21,23,25.otf | Bin 0 -> 1764 bytes
+ ...gpos2_1_font7.keep-layout-retain-gids.21,23.otf | Bin 0 -> 1632 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3688 bytes
+ .../gpos2_1_font7.keep-layout.21,23,25.otf         | Bin 0 -> 1428 bytes
+ .../gpos2_1_font7.keep-layout.21,23.otf            | Bin 0 -> 1308 bytes
+ ...s2_1_font7.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3688 bytes
+ ...s2_2_font5.keep-layout-retain-gids.21,23,25.otf | Bin 0 -> 1776 bytes
+ ...gpos2_2_font5.keep-layout-retain-gids.21,23.otf | Bin 0 -> 1644 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3684 bytes
+ .../gpos2_2_font5.keep-layout.21,23,25.otf         | Bin 0 -> 1440 bytes
+ .../gpos2_2_font5.keep-layout.21,23.otf            | Bin 0 -> 1320 bytes
+ ...s2_2_font5.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3684 bytes
+ test/subset/data/fonts/gpos2_1_font7.otf           | Bin 0 -> 4584 bytes
+ test/subset/data/fonts/gpos2_2_font5.otf           | Bin 0 -> 4580 bytes
+ test/subset/data/tests/layout.gpos2.tests          |  12 ++
+ 18 files changed, 139 insertions(+), 6 deletions(-)
+
+commit e766783152b91fb20baf0c657586628fd7959b1b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 21 22:17:06 2019 +0330
+
+    [fuzz] Add https://crbug.com/oss-fuzz/17898 testcase
+
+ ...sterfuzz-testcase-hb-subset-fuzzer-5717414645334016 | Bin 0 -> 310324 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit b66094ada0ae7e69d5d08ee8423554629eabccaf
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Sep 30 16:19:18 2019 -0700
+
+    [subset] GSUB Lookup Type 6: ChainContextSubst
+
+ src/hb-ot-layout-common.hh                         | 260 ++++++++++++++-------
+ src/hb-ot-layout-gsubgpos.hh                       | 218 ++++++++++++++++-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...ules_f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2380 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3748 bytes
+ ...ultiple_subrules_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1916 bytes
+ ...ubrules_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3748 bytes
+ ...ules_f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2408 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3780 bytes
+ ...ultiple_subrules_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1944 bytes
+ ...ubrules_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3780 bytes
+ ...mple_f2.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2368 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3716 bytes
+ ...chaining3_simple_f2.keep-layout.30,31,32,33.otf | Bin 0 -> 1904 bytes
+ ..._simple_f2.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3716 bytes
+ .../fonts/gsub_chaining1_multiple_subrules_f1.otf  | Bin 0 -> 4700 bytes
+ .../fonts/gsub_chaining2_multiple_subrules_f1.otf  | Bin 0 -> 4780 bytes
+ .../subset/data/fonts/gsub_chaining3_simple_f2.otf | Bin 0 -> 4668 bytes
+ test/subset/data/tests/layout.gsub6.tests          |  12 +
+ 20 files changed, 405 insertions(+), 87 deletions(-)
+
+commit eff91bbb4b1e6f4cc8401b1915d5ddad64e053bb
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Oct 16 16:58:57 2019 -0700
+
+    Add missing pop() for the failure case of script subsetting.
+
+ src/hb-ot-layout-common.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit eab191fd9c851cb7881163ddd5e11a2ebc58cef4
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Oct 2 14:28:53 2019 -0700
+
+    Rewrite hash and == function for hb_array_t as a plain loop.
+    
+    Profling showed that the current implementation were accounting for nearly all processing time in some cases. These implementations look to be about 10x faster.
+
+ src/hb-array.hh | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit 831daf4c76aed87d229b1edfb59a0a37caa8e581
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 1 17:46:27 2019 -0700
+
+    Enforce HB_MAX_LANGSYS limit during layout subsetting.
+
+ src/hb-ot-layout-common.hh                         |  68 +++++++++++++--------
+ ...ase-minimized-hb-subset-fuzzer-5721073428987904 | Bin 0 -> 349561 bytes
+ 2 files changed, 41 insertions(+), 27 deletions(-)
+
+commit 9871461bce9a1557807f69615300e5df4f6ae322
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Oct 1 16:29:24 2019 -0700
+
+    Enforce HB_MAX_SCRIPTS during subsetting of the script table.
+
+ src/hb-ot-layout-common.hh | 46 +++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 41 insertions(+), 5 deletions(-)
+
+commit 029775bcbd0a25ee1cdb6c0653a2ce189774490a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 9 11:00:09 2019 +0700
+
+    [buffer] Minor; improve HB_NO_BUFFER_MESSAGE
+
+ src/hb-buffer.cc | 2 ++
+ src/hb-buffer.hh | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 9a68e6b901967da14a5da5acb535c944794627b8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 16 13:28:15 2019 +0330
+
+    [doc] minor
+    
+    Addresses https://github.com/harfbuzz/harfbuzz/pull/2013/files#r335196908
+
+ src/hb-common.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 453050ad3083ed344bc2ab3b1651babbed34934d
+Merge: d7df7db1 b0b8551a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 13 08:38:56 2019 +0330
+
+    Merge remote-tracking branch 'upstream/master' into var-subset
+
+commit b0b8551afc2ff86d027fdb380210601cb465af41
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 12 21:12:19 2019 +0330
+
+    [glyf] Use range_checker_t in composite_iter_t
+
+ src/hb-ot-glyf-table.hh     | 12 +++++++-----
+ src/hb-ot-var-gvar-table.hh | 19 +++++++++----------
+ 2 files changed, 16 insertions(+), 15 deletions(-)
+
+commit 06e35ce052388e7ce079c0250db62428ae0c5bc8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 12 15:16:31 2019 +0330
+
+    [glyf] minor
+
+ src/hb-ot-glyf-table.hh | 128 +++++++++++++++++++++++++-----------------------
+ 1 file changed, 67 insertions(+), 61 deletions(-)
+
+commit d13bb4bd94a6ba8cdd4a03d40d8089a8f8b3a7ec
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 12 12:13:57 2019 +0330
+
+    [glyf] other cleanups
+
+ src/hb-ot-glyf-table.hh | 338 +++++++++++++++++++++++-------------------------
+ 1 file changed, 160 insertions(+), 178 deletions(-)
+
+commit e7aa8c5d22b034f3d7bcf187a63cdec27732fa8a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 12 11:25:32 2019 +0330
+
+    [glyf] Introduce glyf::Glyph, a hb_bytes_t/GlyphHeader pair
+
+ src/hb-ot-glyf-table.hh | 177 +++++++++++++++++++++++++-----------------------
+ 1 file changed, 91 insertions(+), 86 deletions(-)
+
+commit 546ffc9faf869b4971765e9a4fd232cfe0eecaea
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 12 09:51:57 2019 +0330
+
+    [glyf] minor
+
+ src/hb-ot-glyf-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 4299ea266e03b64db4e8a132983fed9fd0a967ee
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 12 09:51:27 2019 +0330
+
+    [glyf] Move get_contour_points to GlyphHeader
+
+ src/hb-ot-glyf-table.hh | 260 ++++++++++++++++++++++++++----------------------
+ 1 file changed, 141 insertions(+), 119 deletions(-)
+
+commit b918cd8c76a6333e43b9be23178afc9e74e17024
+Author: Ben Wagner <bungeman@chromium.org>
+Date:   Thu Oct 10 15:30:48 2019 -0400
+
+    Document hb_feature_t.
+    
+    This documents hb_feature_t. This is motivated mostly by the ambiguity
+    of the units for 'start' and 'end' (clusters) and whether they are
+    inclusive or exclusive. This also documents that for lookup type 3 the
+    value is the one based index into the alternates and that in a list of
+    features later feature values override previous feature values with the
+    same tag.
+
+ src/hb-common.h | 15 +++++++++++++++
+ src/hb-shape.cc |  4 +++-
+ 2 files changed, 18 insertions(+), 1 deletion(-)
+
+commit e637a4b3de2fb8bdbc1b82e822f4a6cc579e794b
+Merge: 670fec23 e4464f44
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 11 10:28:58 2019 +0700
+
+    Merge pull request #2012 from harfbuzz/lepcha-oo
+    
+    Reorder U+1C29 LEPCHA VOWEL SIGN OO
+
+commit 670fec231d31bf7417de590efd3485f337a7330f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 10 09:21:08 2019 +0330
+
+    Minor, add a zero length tolerant memset, hb_memset
+
+ src/hb-algs.hh   | 10 +++++++++-
+ src/hb-buffer.cc |  3 +--
+ 2 files changed, 10 insertions(+), 3 deletions(-)
+
+commit e4464f4484009b4efe7144570384d836cb6bbac8
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Oct 9 20:55:52 2019 -0400
+
+    Reorder U+1C29 LEPCHA VOWEL SIGN OO
+
+ src/gen-use-table.py                 | 3 +++
+ src/hb-ot-shape-complex-use-table.cc | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit e17e7443007fc0debc4a26e5cf37d5d76c747fbf
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Oct 9 11:45:42 2019 -0700
+
+    Convert existing uses of serialize_append in gsub subsetting to use subset_offset_array.
+
+ src/hb-ot-layout-gsub-table.hh | 44 +++---------------------------------------
+ 1 file changed, 3 insertions(+), 41 deletions(-)
+
+commit 36f18cecbbaf8635a2179a827242ca99d5283666
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Oct 7 14:02:31 2019 -0700
+
+    Add subset_offset_array helper function which simplifies subsetting offset arrays during stream operations.
+
+ src/hb-ot-layout-common.hh     | 54 ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-gsub-table.hh | 15 +-----------
+ 2 files changed, 55 insertions(+), 14 deletions(-)
+
+commit dc45f225212da7b8eca0ddcb3c9cd66e65983605
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 8 23:27:37 2019 +0330
+
+    [ot-metrics] Don't use mixed scaled and not scaled for generating extents
+
+ src/hb-ot-cff1-table.cc        | 4 ++--
+ src/hb-ot-cff2-table.cc        | 4 ++--
+ src/hb-ot-color-sbix-table.hh  | 7 +++++++
+ src/hb-ot-glyf-table.hh        | 6 +++---
+ test/api/test-ot-extents-cff.c | 6 +++---
+ 5 files changed, 17 insertions(+), 10 deletions(-)
+
+commit b068e25f8f89d9b07963dddd5d5e14f61539556f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 8 16:29:15 2019 +0330
+
+    [glyf] Address Behdad's reviews
+    
+    Addresses https://github.com/harfbuzz/harfbuzz/pull/1999#issuecomment-539298559
+    * Don't check against Null pool
+    * Remove cryptic _tt suffix
+
+ src/hb-ot-font.cc       |  4 ++--
+ src/hb-ot-hmtx-table.hh | 16 ++++++++--------
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 6961766db2c53ea813079c61e4d996234ae8be4f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 8 16:26:48 2019 +0330
+
+    [glyf] fix scaling direction
+
+ src/hb-ot-glyf-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0527fda4c75e4354198df79275526d4726a3aacc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 8 16:19:39 2019 +0330
+
+    minor
+
+ src/hb-subset-cff-common.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit b2628f1a3e3a6875dcdf7cb89f5b10a4ae76e6f9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 8 15:09:09 2019 +0330
+
+    [glyf] Move glyph bytes drop hints logic to GlyphHeader
+
+ src/hb-ot-glyf-table.hh | 92 ++++++++++++++++++++-----------------------------
+ 1 file changed, 37 insertions(+), 55 deletions(-)
+
+commit 1fb9c3b6463fdee9eb4dac697beab4d3d7a5fdcf
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 8 13:50:16 2019 +0330
+
+    [glyf] Implement depth limit for add_gid_and_children
+
+ src/hb-ot-glyf-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit be0eddd41896824cb093024c2b4929b612ee1fae
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 8 13:46:55 2019 +0330
+
+    [glyf] Move add_gid_and_children to glyf table
+
+ src/hb-ot-glyf-table.hh | 14 ++++++++++++++
+ src/hb-subset-plan.cc   | 19 +------------------
+ 2 files changed, 15 insertions(+), 18 deletions(-)
+
+commit c7621cf21115aa563ee4fb9d2fcb601984848494
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 8 13:24:26 2019 +0330
+
+    Minor, replace hb_set_add with private API
+
+ src/hb-ot-map.cc            |  2 +-
+ src/hb-subset-cff-common.hh |  2 +-
+ src/hb-subset-cff1.cc       |  2 +-
+ src/hb-subset-cff2.cc       |  2 +-
+ src/hb-subset-plan.cc       | 10 +++++-----
+ 5 files changed, 9 insertions(+), 9 deletions(-)
+
+commit ad86806dcb702b25fac6a3364cf0f85e1b8f4b2a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 8 12:14:14 2019 +0330
+
+    [glyf] Move subset related methods inside GlyphHeader
+
+ src/hb-ot-glyf-table.hh | 428 ++++++++++++++++++++++++------------------------
+ src/hb-subset-plan.cc   |   4 +-
+ 2 files changed, 214 insertions(+), 218 deletions(-)
+
+commit 7839e23558344f206175b5a798149e0f04f38266
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 7 11:14:26 2019 +0330
+
+    [glyf] minor
+
+ src/hb-ot-glyf-table.hh | 38 +++++++++++++++-----------------------
+ 1 file changed, 15 insertions(+), 23 deletions(-)
+
+commit cbefbb2439c1a2f4c20877e611f8986b3933234e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 7 10:15:18 2019 +0330
+
+    [glyf] Move padding removal logic to GlyphHeader
+
+ src/hb-ot-glyf-table.hh | 219 +++++++++++++++++++++++-------------------------
+ 1 file changed, 105 insertions(+), 114 deletions(-)
+
+commit 1ab8f9aa7a182fa078f6c6a5a78ef95686b1ac54
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Oct 7 08:24:12 2019 +0330
+
+    [glyf] minor
+
+ src/hb-ot-glyf-table.hh | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 13fb5612ad545b419ca217f031864dde1b71c43f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 6 23:24:06 2019 +0330
+
+    [glyf] Aggregate get_offsets uses
+
+ src/hb-ot-glyf-table.hh | 29 +++++++----------------------
+ 1 file changed, 7 insertions(+), 22 deletions(-)
+
+commit 5179b96958f2db71c315c1d8c224bab87e2f4ae8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 8 11:09:12 2019 +0330
+
+    [cff] minor on number_t
+
+ src/hb-cff-interp-common.hh | 11 ++++-------
+ 1 file changed, 4 insertions(+), 7 deletions(-)
+
+commit d73cdcf3612ae6114a0f828e0f667d447ed1a964
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 6 18:09:14 2019 +0330
+
+    [ot-font] Apply font scaling before turning to int
+
+ src/hb-ot-cff1-table.cc        | 12 ++++-----
+ src/hb-ot-cff1-table.hh        |  2 +-
+ src/hb-ot-cff2-table.cc        |  8 +++---
+ src/hb-ot-color-cbdt-table.hh  | 14 +++++-----
+ src/hb-ot-color-sbix-table.hh  |  8 +++---
+ src/hb-ot-font.cc              | 12 +++------
+ src/hb-ot-glyf-table.hh        | 58 ++++++++++++++++++++----------------------
+ src/hb-ot-hmtx-table.hh        |  2 +-
+ src/hb-ot-var-hvar-table.hh    |  5 ++--
+ test/api/test-ot-extents-cff.c | 20 +++++++--------
+ 10 files changed, 66 insertions(+), 75 deletions(-)
+
+commit d7df7db160992e92c31afb6c79c7ccdad510fec1
+Merge: 74a2dbbc f2339964
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 6 17:18:59 2019 +0330
+
+    Merge remote-tracking branch 'upstream/master' into var-subset
+
+commit 74a2dbbcedb4647bf14dac17eb4faf1d1d57cf99
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 6 17:06:40 2019 +0330
+
+    minor
+
+ .gitignore                  |  1 -
+ src/Makefile.sources        |  1 -
+ src/hb-ot-font.cc           |  1 -
+ src/hb-ot-hmtx-table.hh     |  1 -
+ src/hb-ot-var-hvar-table.hh | 37 +++++++++++++++++--------------------
+ 5 files changed, 17 insertions(+), 24 deletions(-)
+
+commit f2339964b713815c8e0e33699bf34ee24db12215
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 6 16:41:52 2019 +0330
+
+    [glyf] minor, remove GlyphHeader::simple_* helpers
+
+ src/hb-ot-glyf-table.hh | 16 +++-------------
+ 1 file changed, 3 insertions(+), 13 deletions(-)
+
+commit 2d7ca6a76a754a42ec09a66319ac3e4ab5efc618
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 6 16:31:29 2019 +0330
+
+    [glyf] Move get_instruction_length inside GlyphHeader struct
+
+ src/hb-ot-glyf-table.hh | 153 ++++++++++++++++++++++++++----------------------
+ 1 file changed, 84 insertions(+), 69 deletions(-)
+
+commit 50aef4d7f80b6c8a19481ad3d0fa89c7c7f222c2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 6 14:00:07 2019 +0330
+
+    [glyf] cleanup
+
+ src/hb-ot-glyf-table.hh | 128 +++++++++++++++++++++---------------------------
+ 1 file changed, 55 insertions(+), 73 deletions(-)
+
+commit ee3f4630d70099c42fd9c84796b29a236f6135b6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 6 13:56:35 2019 +0330
+
+    [glyf] Remove get_composite_iter and refactor bytes_for_glyph for shape uses
+
+ src/hb-ot-glyf-table.hh | 42 ++++++++++++++++--------------------------
+ src/hb-subset-plan.cc   |  2 +-
+ 2 files changed, 17 insertions(+), 27 deletions(-)
+
+commit 8378ab96e28fa34f154583850ff1c2c672a4310d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 6 13:49:45 2019 +0330
+
+    [glyf] Rewrite composite iterator to new iterators convention
+
+ src/hb-ot-glyf-table.hh | 201 ++++++++++++++++++++----------------------------
+ src/hb-subset-plan.cc   |  10 +--
+ 2 files changed, 85 insertions(+), 126 deletions(-)
+
+commit 100dbccaa50b2f965f3877f2156d388453f0948a
+Merge: c54ee485 b7684fa9
+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
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Oct 6 09:00:48 2019 +0330
+
+    Merge pull request #1999 from ebraminio/glyf-var
+    
+    Implement gvar table and variable glyf
+
+commit 21c80d955f69c1242c77e0ec7ccd852360dd54dd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 5 23:58:52 2019 +0330
+
+    [gvar] minor
+
+ src/hb-ot-var-gvar-table.hh | 43 +++++++++++++++++++++----------------------
+ 1 file changed, 21 insertions(+), 22 deletions(-)
+
+commit 5752863640cf4292dec313edebb57aecd47496f3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Oct 5 23:51:50 2019 +0330
+
+    [glyf][gvar] Make HB_NO_VAR buildable
+
+ src/hb-ot-font.cc       | 2 ++
+ src/hb-ot-glyf-table.hh | 6 ++++++
+ src/hb-ot-hmtx-table.hh | 8 ++++++++
+ 3 files changed, 16 insertions(+)
+
+commit 8e33510343d151afe49730f3a0b263a2853822b8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 4 01:11:03 2019 +0330
+
+    [gvar] minor
+
+ src/hb-ot-var-gvar-table.hh | 132 ++++++++++++++++++++++----------------------
+ 1 file changed, 66 insertions(+), 66 deletions(-)
+
+commit b3afa8164460d63031a80d399200bcaa769c0fa1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Oct 4 00:32:04 2019 +0330
+
+    [glyf] Use common convention of other tables access, format
+
+ src/hb-ot-face-table-list.hh |  1 +
+ src/hb-ot-glyf-table.hh      | 65 +++++++++++++++++++-------------------------
+ 2 files changed, 29 insertions(+), 37 deletions(-)
+
+commit 88bd342c0ff686daad88bb6b4f2968bbd8b01a24
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 3 22:45:37 2019 +0330
+
+    [glyf] minor
+
+ src/hb-ot-glyf-table.hh     | 247 +++++++++++++++++++++++---------------------
+ src/hb-ot-var-gvar-table.hh |  54 +++++-----
+ 2 files changed, 155 insertions(+), 146 deletions(-)
+
+commit ee7610181cee5bbc0b5dc291228fbe032097bde4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 3 15:59:45 2019 +0330
+
+    [hmtx] Use more conventional internal API style
+
+ src/Makefile.sources    |  1 -
+ src/harfbuzz.cc         |  1 -
+ src/hb-ot-font.cc       | 12 ++++++++++++
+ src/hb-ot-hmtx-table.cc | 42 ------------------------------------------
+ src/hb-ot-hmtx-table.hh | 18 ++++++++++--------
+ 5 files changed, 22 insertions(+), 52 deletions(-)
+
+commit c9577a630fd5bd08482ee7b94bc03c91fcf366c7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 3 15:48:35 2019 +0330
+
+    [hmtx] Use more optimal way to access glyf table
+
+ src/hb-ot-hmtx-table.cc | 20 ++++----------------
+ src/hb-ot-hmtx-table.hh |  4 ++--
+ 2 files changed, 6 insertions(+), 18 deletions(-)
+
+commit b9ff43c162e8f61cff8e48d3dcbf7c1fe263d625
+Author: Michiharu Ariza <ariza@typekit.com>
+Date:   Tue Oct 1 16:13:40 2019 +0330
+
+    Implement gvar table and variable glyf
+    
+    Split from Ariza's "[subset] TrueType/CFF2 variable font" work on #1594
+
+ src/Makefile.sources                               |   2 +
+ src/harfbuzz.cc                                    |   1 +
+ src/hb-ot-font.cc                                  |   4 +-
+ src/hb-ot-glyf-table.hh                            | 618 ++++++++++++++---
+ src/hb-ot-hmtx-table.cc                            |  54 ++
+ src/hb-ot-hmtx-table.hh                            |  33 +-
+ src/hb-ot-var-gvar-table.hh                        | 734 +++++++++++++++++++++
+ test/api/Makefile.am                               |   1 +
+ .../SourceSansVariable-Roman-nohvar-41,C1.ttf      | Bin 0 -> 4696 bytes
+ test/api/fonts/SourceSansVariable-Roman.anchor.ttf | Bin 0 -> 4708 bytes
+ .../api/fonts/SourceSansVariable-Roman.modcomp.ttf | Bin 0 -> 3252 bytes
+ .../fonts/SourceSerifVariable-Roman-VVAR.abc.ttf   | Bin 0 -> 5632 bytes
+ test/api/test-ot-metrics-tt-var.c                  | 250 +++++++
+ 13 files changed, 1588 insertions(+), 109 deletions(-)
+
+commit c54ee4853092b8a7f9a47da36407455992f55d93
+Merge: 19d45dca 79ec65ae
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 3 14:28:37 2019 +0330
+
+    Merge remote-tracking branch 'upstream/master' into var-subset
+
+commit 79ec65ae10f959aeddaa1e39eba5226c604a8c87
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 3 14:27:51 2019 +0330
+
+    [ot-font] Use var vmtx side bearing in calculating v-origin
+
+ src/hb-ot-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 19d45dcab732f3a836e17d31be9ca92f01c818b0
+Merge: 8106ba7f 3fd555be
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 3 13:39:17 2019 +0330
+
+    Merge remote-tracking branch 'upstream/master' into var-subset
+
+commit 3fd555be543a3e9bf9fee509327dbbc9a7b51cdb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Oct 3 13:02:41 2019 +0330
+
+    [hmtx] Prepare to fix and minor fixes
+
+ src/hb-ot-hmtx-table.hh     | 41 ++++++++++++++++-------------------------
+ src/hb-ot-var-hvar-table.hh |  9 +++++----
+ 2 files changed, 21 insertions(+), 29 deletions(-)
+
+commit 6d09b5a8a0f6ed7a2a92d91ac3d027bd54c452be
+Author: Michiharu Ariza <ariza@typekit.com>
+Date:   Thu Oct 3 12:01:39 2019 +0330
+
+    Implement hmtx/vmtx metrics read from hvar/vvar
+
+ src/hb-ot-hmtx-table.hh     | 46 ++++++++++++++++++++++++++++++++++++++++-----
+ src/hb-ot-var-hvar-table.hh | 19 +++++++++++++------
+ 2 files changed, 54 insertions(+), 11 deletions(-)
+
+commit cfafee52e4ff0441a33530847533f1b1f6019006
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Oct 2 09:22:46 2019 +0330
+
+    Add Repology badges by @luzpaz
+    
+    fixes #2002
+    to track downstream packaging of harfbuzz
+
+ README.md | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 2d7221a0e3552b1d902629d4ab6c0ce22db983a6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 1 15:05:02 2019 +0330
+
+    [cff] minor
+
+ src/hb-ot-cff-common.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 0558413f27e9a18188c0e3d55f5ee57ea42b1548
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 1 13:49:55 2019 +0330
+
+    Minor, tweak spaces
+
+ src/hb-aat-layout-kerx-table.hh    |  4 ++--
+ src/hb-array.hh                    |  4 ++--
+ src/hb-buffer.hh                   |  3 +--
+ src/hb-font.h                      |  4 ++--
+ src/hb-font.hh                     |  8 ++++----
+ src/hb-open-file.hh                |  2 +-
+ src/hb-open-type.hh                | 10 +++++-----
+ src/hb-ot-cff-common.hh            |  4 ++--
+ src/hb-ot-cff1-table.cc            | 11 +++++------
+ src/hb-ot-cff1-table.hh            | 24 ++++++++++++------------
+ src/hb-ot-cff2-table.cc            |  4 ++--
+ src/hb-ot-cmap-table.hh            |  6 ++----
+ src/hb-ot-color-cbdt-table.hh      |  2 +-
+ src/hb-ot-color-cpal-table.hh      |  2 +-
+ src/hb-ot-kern-table.hh            | 12 ++++++------
+ src/hb-ot-layout-common.hh         |  2 +-
+ src/hb-ot-layout-gpos-table.hh     | 14 +++++++-------
+ src/hb-ot-os2-table.hh             |  4 ++--
+ src/hb-ot-shape-complex-myanmar.cc |  4 ++--
+ src/hb-subset-cff-common.hh        |  2 +-
+ src/hb-unicode.cc                  |  8 ++++----
+ src/hb-unicode.h                   | 20 ++++++++++----------
+ src/hb-vector.hh                   |  4 ++--
+ src/main.cc                        | 37 +++++++++++++++++++++++--------------
+ src/test-iter.cc                   |  2 +-
+ 25 files changed, 101 insertions(+), 96 deletions(-)
+
+commit 51b720f686adf45bc1b6db3aa76b7d2e62ad1304
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Oct 1 12:06:22 2019 +0330
+
+    Fix -Wsizeof-array-div clang warning
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit faace9437ea09d89ef5f5f9c9fc3ce0dbc672142
+Merge: e48ef080 f0dd724c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 30 13:34:05 2019 -0700
+
+    Merge pull request #1807 from harfbuzz/subset-varstore
+    
+    VariationStore serializer
+
+commit e48ef0804ad7e4abd35ff3646fa6ed10ad32f1ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 30 12:39:06 2019 -0700
+
+    2.6.2
+
+ NEWS             | 6 ++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 9 insertions(+), 3 deletions(-)
+
+commit d6ad613159aabce42fc21d57f6f1a4762c5617bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 10 15:31:44 2019 -0700
+
+    [docs] Misc fixes
+
+ docs/harfbuzz-sections.txt | 4 ++--
+ src/hb-gdi.cc              | 2 +-
+ src/hb-ot-layout.cc        | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 2dce85ed06a8cc7ca20900c65662af659c53e717
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Sep 26 21:15:59 2019 +0330
+
+    [icu] Remove HB_ICU_STMT (#1993)
+    
+    And ignore extra semicolon error to ICU versions < 65
+
+ src/hb-icu.cc | 43 ++++++++++++++++++++++++-------------------
+ 1 file changed, 24 insertions(+), 19 deletions(-)
+
+commit d6a83abd6a0c684bd9a27f593d5be388819022b7
+Author: Iceflower <iceflower@gmx.de>
+Date:   Thu Sep 26 11:42:11 2019 +0200
+
+    Define HB_UNUSED for clang
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c4567968cd175dc367ab951c9e3141ab5c03c2d6
+Author: Iceflower <iceflower@gmx.de>
+Date:   Thu Sep 26 11:35:27 2019 +0200
+
+    [dwrite] Fix extra semicolon issue
+
+ src/hb-directwrite.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b0c3eb06b64dcfcfee09a25dde8250804484f77d
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Sep 18 16:11:44 2019 -0700
+
+    [subset] GPOS Lookup Type 3: CursivePos
+
+ src/hb-ot-layout-common.hh                         |  33 ++++++++
+ src/hb-ot-layout-gpos-table.hh                     |  87 ++++++++++++++++++++-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ .../gpos3_font3.keep-layout-retain-gids.28,29.otf  | Bin 0 -> 1712 bytes
+ .../gpos3_font3.keep-layout-retain-gids.28,2B.otf  | Bin 0 -> 1860 bytes
+ .../gpos3_font3.keep-layout-retain-gids.29,2B.otf  | Bin 0 -> 1772 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3692 bytes
+ .../layout.gpos3/gpos3_font3.keep-layout.28,29.otf | Bin 0 -> 1328 bytes
+ .../layout.gpos3/gpos3_font3.keep-layout.28,2B.otf | Bin 0 -> 1456 bytes
+ .../layout.gpos3/gpos3_font3.keep-layout.29,2B.otf | Bin 0 -> 1368 bytes
+ ...pos3_font3.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3692 bytes
+ test/subset/data/fonts/gpos3_font3.otf             | Bin 0 -> 4624 bytes
+ test/subset/data/tests/layout.gpos3.tests          |  12 +++
+ 14 files changed, 132 insertions(+), 2 deletions(-)
+
+commit 68d39ea4866a9d2bae60107619aad25dac6da241
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 24 13:52:46 2019 +0330
+
+    Revert previous change and fix -Wrange-loop-analysis complains
+
+ src/hb-ot-layout-gpos-table.hh | 6 +++---
+ src/hb-ot-vorg-table.hh        | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit cbc0646a6cfc0f6a04804d6888636f12130cd51b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 24 12:08:12 2019 +0330
+
+    Minor, normalize for each calls
+
+ src/hb-ot-glyf-table.hh        |  5 +----
+ src/hb-ot-layout-gpos-table.hh | 10 +++++-----
+ src/hb-ot-name-table.hh        |  3 +--
+ src/hb-ot-vorg-table.hh        |  3 +--
+ 4 files changed, 8 insertions(+), 13 deletions(-)
+
+commit 22b6c6a5c7b9bebe123822c702b9661e144ebd6b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 24 12:06:28 2019 +0330
+
+    [serialize] use for each as #resolve_links, format
+
+ src/hb-serialize.hh | 22 +++++++---------------
+ 1 file changed, 7 insertions(+), 15 deletions(-)
+
+commit 512551f27600adac875de3381533b52d78f6b22d
+Author: Qunxin Liu <48925186+qxliu76@users.noreply.github.com>
+Date:   Mon Sep 23 17:28:16 2019 -0700
+
+    memory leak fix in serializer (#1988)
+
+ src/hb-serialize.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f0a7677993e51ba4076a0f9a0e7d032d99917d34
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Sep 23 21:09:39 2019 +0330
+
+    [gpos] minor
+
+ src/hb-ot-layout-gpos-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 035ec3d1b46b8e60bea3aa8dcf29cf47a5a42d57
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Sep 23 20:51:43 2019 +0330
+
+    [cmap] remove has_format14, minor format
+    
+    fixes #1986
+
+ src/hb-ot-cmap-table.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit c1a585fab0c17fe47b0728cf67920791c2173019
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 21 23:30:52 2019 +0430
+
+    [gpos] minor
+
+ src/hb-ot-layout-gpos-table.hh | 22 +++++++---------------
+ 1 file changed, 7 insertions(+), 15 deletions(-)
+
+commit d87d38998a4ff7bec3d8fb658dc9299f144a2fcb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 21 17:27:39 2019 +0430
+
+    Fix clang -Wrange-loop-analysis complains
+    
+    ./hb-ot-layout-gpos-table.hh:674:43: error: loop variable '_' is always a copy because the range of type 'hb_zip_iter_t<hb_iter_type<hb_array_t<const OT::IntType<unsigned short, 2> > &>, hb_iter_type<hb_array_t<const OT::IntType<unsigned short, 2> > &> >' (aka 'hb_zip_iter_t<hb_array_t<const OT::IntType<unsigned short, 2> >, hb_array_t<const OT::IntType<unsigned short, 2> > >') does not return a reference [-Werror,-Wrange-loop-analysis]
+          for (const hb_pair_t<Value, Value>& _ : hb_zip (val_iter, first_val_iter))
+                                              ^
+    ./hb-ot-layout-gpos-table.hh:674:12: note: use non-reference type 'hb_pair_t<OT::Value, OT::Value>' (aka 'hb_pair_t<IntType<unsigned short, 2>, IntType<unsigned short, 2> >')
+          for (const hb_pair_t<Value, Value>& _ : hb_zip (val_iter, first_val_iter))
+    
+    and
+    
+    In file included from hb-subset.cc:44:
+    ./hb-ot-vorg-table.hh:87:34: error: loop variable '_' is always a copy because the range of type 'hb_map_iter_t<hb_filter_iter_t<hb_sorted_array_t<const OT::VertOriginMetric>, const hb_set_t *, OT::HBGlyphID OT::VertOriginMetric::*, nullptr>, (lambda at ./hb-ot-vorg-table.hh:100:15), hb_function_sortedness_t::NOT_SORTED, nullptr>' does not return a reference [-Werror,-Wrange-loop-analysis]
+        for (const VertOriginMetric& _ : it)
+                                     ^
+    ./hb-ot-vorg-table.hh:113:17: note: in instantiation of function template specialization 'OT::VORG::serialize<hb_map_iter_t<hb_filter_iter_t<hb_sorted_array_t<const OT::VertOriginMetric>, const hb_set_t *, OT::HBGlyphID OT::VertOriginMetric::*, nullptr>, (lambda at ./hb-ot-vorg-table.hh:100:15), hb_function_sortedness_t::NOT_SORTED, nullptr>, nullptr>' requested here
+        vorg_prime->serialize (c->serializer, it, defaultVertOriginY);
+                    ^
+    ./hb-ot-vorg-table.hh:87:10: note: use non-reference type 'OT::VertOriginMetric'
+        for (const VertOriginMetric& _ : it)
+             ^~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-ot-vorg-table.hh        | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 6e42a418c8fe4231c3cc080bc771455578b0cce0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 21 16:25:54 2019 +0430
+
+    Minor, turn more of hb_apply to for each
+
+ src/hb-ot-glyf-table.hh        |  5 ++---
+ src/hb-ot-layout-gpos-table.hh | 42 ++++++++++++++----------------------------
+ src/hb-ot-name-table.hh        |  5 ++---
+ src/hb-ot-vorg-table.hh        |  5 ++---
+ 4 files changed, 20 insertions(+), 37 deletions(-)
+
+commit 0665dce1163317390adbed9394cce2b1325ddb6c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 21 17:22:02 2019 +0430
+
+    [fuzzer] Don't process output in debug mode as it causes timeout
+
+ test/fuzzing/run-shape-fuzzer-tests.py  | 7 ++++++-
+ test/fuzzing/run-subset-fuzzer-tests.py | 7 ++++++-
+ 2 files changed, 12 insertions(+), 2 deletions(-)
+
+commit dc886f6638f50e45e73d01e49db77b4bcefc85e1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 14 11:18:47 2019 +0430
+
+    [ci] Re-enable debug builds on fedora bot
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 70228f68ac413ee19281861e3039a82d90c17f2a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 21 16:24:41 2019 +0430
+
+    [ci] Enable HB_WITH_WIN1256 on -Weverything bot
+    
+    To catch its compile warnings, #1969 related
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 385741d565de1cc90de23664f8e66fc77c31efae
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 21 15:26:14 2019 +0430
+
+    [cmap] Turn hb_apply into foreach where possible
+
+ src/hb-ot-cmap-table.hh | 151 +++++++++++++++++++-----------------------------
+ 1 file changed, 61 insertions(+), 90 deletions(-)
+
+commit 1023c2cc6de0f33602df8709134bef8cdb66ba0c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 21 14:33:43 2019 +0430
+
+    [cmap] minor
+
+ src/hb-ot-cmap-table.hh | 62 ++++++++++++++++++-------------------------------
+ 1 file changed, 22 insertions(+), 40 deletions(-)
+
+commit ead46eefe3bf2bea61c86689f4c5a1da9b7e446b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 21 14:25:11 2019 +0430
+
+    minor, use internal API instead public hb_set_has
+
+ src/hb-ot-cmap-table.hh | 4 ++--
+ src/hb-subset-plan.cc   | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit d8af4e7701fe63d63f6669706ce7a5bb3a15a19d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 21 14:19:14 2019 +0430
+
+    [cmap] minor, turn 8 spaces to tab
+
+ src/hb-ot-cmap-table.hh | 228 ++++++++++++++++++++++++------------------------
+ src/hb-subset-plan.cc   |   6 +-
+ 2 files changed, 117 insertions(+), 117 deletions(-)
+
+commit 4315666283a7d1b175d1c3ed43b5ac85fdc84a50
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Aug 29 11:17:20 2019 -0700
+
+    [subset] updates according to review comments
+
+ src/hb-ot-cmap-table.hh | 95 ++++++++++++++++++++++++-------------------------
+ 1 file changed, 47 insertions(+), 48 deletions(-)
+
+commit bf66d1bf589b6af2ceb30c18619f210b718c9db9
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Aug 21 14:24:33 2019 -0700
+
+    [subset] Add integration tests for cmap14
+
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ .../cmap14/cmap14_font1.default.4E00,4E02,4E03.otf | Bin 0 -> 1360 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E03.otf      | Bin 0 -> 1236 bytes
+ .../cmap14/cmap14_font1.default.4E00,4E05,4E07.otf | Bin 0 -> 1328 bytes
+ .../cmap14/cmap14_font1.default.4E02,4E03,4E08.otf | Bin 0 -> 1576 bytes
+ .../expected/cmap14/cmap14_font1.default.4E02.otf  | Bin 0 -> 996 bytes
+ .../expected/cmap14/cmap14_font1.default.4E03.otf  | Bin 0 -> 1080 bytes
+ .../cmap14_font1.default.4E05,4E07,4E08,4E09.otf   | Bin 0 -> 1848 bytes
+ .../cmap14/cmap14_font1.default.4E08,4E09.otf      | Bin 0 -> 1720 bytes
+ .../expected/cmap14/cmap14_font1.default.4E08.otf  | Bin 0 -> 1384 bytes
+ .../cmap14_font1.default.retain-all-codepoint.otf  | Bin 0 -> 2348 bytes
+ ...font1.drop-hints-retain-gids.4E00,4E02,4E03.otf | Bin 0 -> 1388 bytes
+ ...ap14_font1.drop-hints-retain-gids.4E00,4E03.otf | Bin 0 -> 1272 bytes
+ ...font1.drop-hints-retain-gids.4E00,4E05,4E07.otf | Bin 0 -> 1396 bytes
+ ...font1.drop-hints-retain-gids.4E02,4E03,4E08.otf | Bin 0 -> 1720 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E02.otf   | Bin 0 -> 1028 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E03.otf   | Bin 0 -> 1124 bytes
+ ....drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf | Bin 0 -> 1984 bytes
+ ...ap14_font1.drop-hints-retain-gids.4E08,4E09.otf | Bin 0 -> 1872 bytes
+ .../cmap14_font1.drop-hints-retain-gids.4E08.otf   | Bin 0 -> 1544 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.otf | Bin 0 -> 2436 bytes
+ .../cmap14_font1.drop-hints.4E00,4E02,4E03.otf     | Bin 0 -> 1292 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E00,4E03.otf   | Bin 0 -> 1168 bytes
+ .../cmap14_font1.drop-hints.4E00,4E05,4E07.otf     | Bin 0 -> 1260 bytes
+ .../cmap14_font1.drop-hints.4E02,4E03,4E08.otf     | Bin 0 -> 1512 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E02.otf        | Bin 0 -> 928 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E03.otf        | Bin 0 -> 1012 bytes
+ ...cmap14_font1.drop-hints.4E05,4E07,4E08,4E09.otf | Bin 0 -> 1780 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E08,4E09.otf   | Bin 0 -> 1652 bytes
+ .../cmap14/cmap14_font1.drop-hints.4E08.otf        | Bin 0 -> 1316 bytes
+ ...map14_font1.drop-hints.retain-all-codepoint.otf | Bin 0 -> 2280 bytes
+ .../cmap14_font1.name-ids.4E00,4E02,4E03.otf       | Bin 0 -> 1292 bytes
+ .../cmap14/cmap14_font1.name-ids.4E00,4E03.otf     | Bin 0 -> 1168 bytes
+ .../cmap14_font1.name-ids.4E00,4E05,4E07.otf       | Bin 0 -> 1260 bytes
+ .../cmap14_font1.name-ids.4E02,4E03,4E08.otf       | Bin 0 -> 1508 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E02.otf | Bin 0 -> 928 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E03.otf | Bin 0 -> 1012 bytes
+ .../cmap14_font1.name-ids.4E05,4E07,4E08,4E09.otf  | Bin 0 -> 1780 bytes
+ .../cmap14/cmap14_font1.name-ids.4E08,4E09.otf     | Bin 0 -> 1652 bytes
+ .../expected/cmap14/cmap14_font1.name-ids.4E08.otf | Bin 0 -> 1316 bytes
+ .../cmap14_font1.name-ids.retain-all-codepoint.otf | Bin 0 -> 2280 bytes
+ .../cmap14_font1.retain-gids.4E00,4E02,4E03.otf    | Bin 0 -> 1452 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E00,4E03.otf  | Bin 0 -> 1340 bytes
+ .../cmap14_font1.retain-gids.4E00,4E05,4E07.otf    | Bin 0 -> 1464 bytes
+ .../cmap14_font1.retain-gids.4E02,4E03,4E08.otf    | Bin 0 -> 1788 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E02.otf       | Bin 0 -> 1096 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E03.otf       | Bin 0 -> 1192 bytes
+ ...map14_font1.retain-gids.4E05,4E07,4E08,4E09.otf | Bin 0 -> 2048 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E08,4E09.otf  | Bin 0 -> 1940 bytes
+ .../cmap14/cmap14_font1.retain-gids.4E08.otf       | Bin 0 -> 1608 bytes
+ ...ap14_font1.retain-gids.retain-all-codepoint.otf | Bin 0 -> 2500 bytes
+ test/subset/data/fonts/cmap14_font1.otf            | Bin 0 -> 4484 bytes
+ test/subset/data/tests/cmap14.tests                |  21 +++++++++++++++++++++
+ 54 files changed, 23 insertions(+)
+
+commit 2583afa0eb90134274ddd92864ea5270eeebc52e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Aug 16 13:54:24 2019 -0700
+
+    [subset] subsetting cmap14
+
+ src/hb-ot-cmap-table.hh | 295 +++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 265 insertions(+), 30 deletions(-)
+
+commit 078ddbd0f6ad660e740809b7f4c067e02309b98d
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Aug 7 13:17:26 2019 -0700
+
+    [subset] glyph closure for CMAP14
+
+ src/hb-ot-cmap-table.hh | 34 +++++++++++++++++++++++++++++++++-
+ src/hb-subset-plan.cc   | 10 ++++++++++
+ 2 files changed, 43 insertions(+), 1 deletion(-)
+
+commit bbe878006d347893fc70e282c2aaafef5dd622b4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 18 22:22:01 2019 +0430
+
+    Avoid bitwise negate of enum value
+    
+    Fixes this -fno-sanitize-recover=undefined fail,
+    
+    hb-ot-map.hh:188:1: runtime error: load of value 4294967294, which is not a valid value for type 'hb_ot_map_feature_flags_t'
+        #0 0x7f62bfa9b227 in operator&=(hb_ot_map_feature_flags_t&, hb_ot_map_feature_flags_t) /home/ebrahim/Desktop/harfbuzz/src/./hb-ot-map.hh:188:1
+        #1 0x7f62bfa9b227 in hb_ot_map_builder_t::compile(hb_ot_map_t&, hb_ot_shape_plan_key_t const&) /home/ebrahim/Desktop/harfbuzz/src/hb-ot-map.cc:194
+        #2 0x7f62bface650 in hb_ot_shape_planner_t::compile(hb_ot_shape_plan_t&, hb_ot_shape_plan_key_t const&) /home/ebrahim/Desktop/harfbuzz/src/hb-ot-shape.cc:108:7
+        #3 0x7f62bfacec1e in hb_ot_shape_plan_t::init0(hb_face_t*, hb_shape_plan_key_t const*) /home/ebrahim/Desktop/harfbuzz/src/hb-ot-shape.cc:225:11
+        #4 0x7f62bfae1318 in hb_shape_plan_create2 /home/ebrahim/Desktop/harfbuzz/src/hb-shape-plan.cc:232:7
+        #5 0x7f62bfae1d2a in hb_shape_plan_create_cached2 /home/ebrahim/Desktop/harfbuzz/src/hb-shape-plan.cc:489:33
+        #6 0x7f62bfae2527 in hb_shape_full /home/ebrahim/Desktop/harfbuzz/src/hb-shape.cc:135:33
+        #7 0x55ed360b6588 in shape_options_t::shape(hb_font_t*, hb_buffer_t*, char const**) /home/ebrahim/Desktop/harfbuzz/util/./options.hh:242:10
+        #8 0x55ed360b5d9c in shape_consumer_t<output_buffer_t>::consume_line(char const*, unsigned int, char const*, char const*) /home/ebrahim/Desktop/harfbuzz/util/./shape-consumer.hh:67:19
+        #9 0x55ed360b549f in main_font_text_t<shape_consumer_t<output_buffer_t>, 2147483647, 0>::main(int, char**) /home/ebrahim/Desktop/harfbuzz/util/./main-font-text.hh:81:16
+        #10 0x55ed360b4e23 in main /home/ebrahim/Desktop/harfbuzz/util/hb-shape.cc:189:17
+        #11 0x7f62bf104ee2 in __libc_start_main (/usr/lib/libc.so.6+0x26ee2)
+        #12 0x55ed3608f7ad in _start (/home/ebrahim/Desktop/harfbuzz/util/.libs/lt-hb-shape+0xd7ad)
+
+ src/hb-ot-map.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e6909ee58d0f7b954f3bb227c2f90ca4cfd0c858
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 18 22:12:25 2019 +0430
+
+    minor
+
+ src/hb-buffer.cc | 2 +-
+ src/hb-common.cc | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit bb41b74fd1fb42b08e9069c22ee046daeee98e6b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 18 00:55:24 2019 +0430
+
+    Don't rely on undefined left shift of negative value behavior
+    
+    Fixes this -fno-sanitize-recover=undefined check,
+    
+    hb-ft.cc:869:27: runtime error: left shift of negative value -16384
+        #0 0x7ff8f47da843 in hb_ft_font_set_funcs /home/ebrahim/Desktop/harfbuzz/src/hb-ft.cc:869:27
+        #1 0x55f20a66c7d6 in font_options_t::get_font() const /home/ebrahim/Desktop/harfbuzz/util/options.cc:731:3
+        #2 0x55f20a668c1f in shape_consumer_t<output_buffer_t>::init(hb_buffer_t*, font_options_t const*) /home/ebrahim/Desktop/harfbuzz/util/./shape-consumer.hh:47:42
+        #3 0x55f20a668441 in main_font_text_t<shape_consumer_t<output_buffer_t>, 2147483647, 0>::main(int, char**) /home/ebrahim/Desktop/harfbuzz/util/./main-font-text.hh:75:14
+        #4 0x55f20a667f91 in main /home/ebrahim/Desktop/harfbuzz/util/hb-shape.cc:180:21
+        #5 0x7ff8f3df7ee2 in __libc_start_main (/usr/lib/libc.so.6+0x26ee2)
+        #6 0x55f20a6427ad in _start (/home/ebrahim/Desktop/harfbuzz/util/.libs/lt-hb-shape+0xd7ad)
+
+ src/hb-ft.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b73313ade75130bf86ad1efbd312ce4106166089
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 18 00:50:32 2019 +0430
+
+    Don't seek of out-of-bound value even if the result is not used
+    
+    Fixes this -fno-sanitize-recover=undefined fail,
+    
+    /set/iter: hb-algs.hh:1016:60: runtime error: index 4294967295 out of bounds for type 'unsigned long long const[8]'
+        #0 0x4d1e09 in hb_vector_size_t<unsigned long long, 64u>::operator[](unsigned int) const /home/user/code/harfbuzz/src/./hb-algs.hh:1016:60
+        #1 0x4d8b5f in hb_set_t::page_t::previous(unsigned int*) const /home/user/code/harfbuzz/src/./hb-set.hh:139:53
+        #2 0x4d0ada in hb_set_t::previous(unsigned int*) const /home/user/code/harfbuzz/src/./hb-set.hh:602:36
+        #3 0x4cd76f in hb_set_previous /home/user/code/harfbuzz/src/hb-set.cc:494:15
+        #4 0x4ca8af in test_set_iter /home/user/code/harfbuzz/test/api/test-set.c:310:3
+        #5 0x7f3a4f3e0f49  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72f49)
+        #6 0x7f3a4f3e0e7a  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72e7a)
+        #7 0x7f3a4f3e1121 in g_test_run_suite (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73121)
+        #8 0x7f3a4f3e1140 in g_test_run (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73140)
+        #9 0x4c8894 in hb_test_run /home/user/code/harfbuzz/test/api/./hb-test.h:88:10
+        #10 0x4c8894 in main /home/user/code/harfbuzz/test/api/test-set.c:408:10
+        #11 0x7f3a4e3d2b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
+        #12 0x41e7d9 in _start (/home/user/code/harfbuzz/test/api/test-set+0x41e7d9)
+
+ src/hb-set.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit d8af9ee017ed1018343d30272f55b90dd03a3559
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 18 00:47:55 2019 +0430
+
+    Don't rely on nullptr deref recovery
+    
+    Fixes this -fno-sanitize-recover=undefined fail,
+    
+    /types/language: hb-common.cc:385:20: runtime error: member access within null pointer of type 'const struct hb_language_impl_t'
+        #0 0x4caa34 in hb_language_to_string /home/user/code/harfbuzz/src/hb-common.cc:385:20
+        #1 0x4c9be8 in test_types_language /home/user/code/harfbuzz/test/api/test-common.c:205:3
+        #2 0x7f9557e72f49  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72f49)
+        #3 0x7f9557e72e7a  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72e7a)
+        #4 0x7f9557e73121 in g_test_run_suite (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73121)
+        #5 0x7f9557e73140 in g_test_run (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73140)
+        #6 0x4c88a3 in hb_test_run /home/user/code/harfbuzz/test/api/./hb-test.h:88:10
+        #7 0x4c88a3 in main /home/user/code/harfbuzz/test/api/test-common.c:224:10
+        #8 0x7f9556e64b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
+        #9 0x41e7d9 in _start (/home/user/code/harfbuzz/test/api/test-common+0x41e7d9)
+
+ src/hb-common.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit bfb155a5f19b26f9dcff667a76a24cd5c3b83234
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 18 00:44:52 2019 +0430
+
+    Don't call memset when length is zero
+    
+    Fixes this -fno-sanitize-recover=undefined check,
+    
+    /buffer/positions/empty: hb-buffer.cc:327:11: runtime error: null pointer passed as argument 1, which is declared to never be null
+    
+    /usr/include/string.h:60:62: note: nonnull attribute specified here
+        #0 0x4cf31c in hb_buffer_t::clear_positions() /home/user/code/harfbuzz/src/hb-buffer.cc:327:3
+        #1 0x4d4dd4 in hb_buffer_get_glyph_positions /home/user/code/harfbuzz/src/hb-buffer.cc:1418:13
+        #2 0x4cb553 in test_buffer_positions /home/user/code/harfbuzz/test/api/test-buffer.c:305:3
+        #3 0x7f324187bf49  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72f49)
+        #4 0x7f324187be7a  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72e7a)
+        #5 0x7f324187be7a  (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x72e7a)
+        #6 0x7f324187c121 in g_test_run_suite (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73121)
+        #7 0x7f324187c140 in g_test_run (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x73140)
+        #8 0x4c8bd3 in hb_test_run /home/user/code/harfbuzz/test/api/./hb-test.h:88:10
+        #9 0x4c8bd3 in main /home/user/code/harfbuzz/test/api/test-buffer.c:884:10
+        #10 0x7f324086db96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
+        #11 0x41e919 in _start (/home/user/code/harfbuzz/test/api/test-buffer+0x41e919)
+
+ src/hb-buffer.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 5a1cc199ab7b619935af04584ecc650216a83d66
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 18 00:43:44 2019 +0430
+
+    [ci] Run -fno-sanitize-recover=undefined checks
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c930ae2bd8b6f626ddec0628ae6b38e3134e3c97
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Sep 16 14:04:34 2019 +0430
+
+    Avoid stdint.h in Kernel module compiles
+
+ src/hb-common.h | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 412d6cac3a46d710159ed4b3cc3bb59fd5876d5f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Sep 16 13:50:11 2019 +0430
+
+    Extract an avoid errno compile flag
+
+ src/hb-blob.cc   | 1 -
+ src/hb-config.hh | 1 +
+ src/hb.hh        | 9 +++++++--
+ 3 files changed, 8 insertions(+), 3 deletions(-)
+
+commit 8a16d6f1c13388e6d9ca844a309632ec583ee1a2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Sep 15 20:43:33 2019 +0430
+
+    [doc] fix minor typo
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit aab279b33dda45ae0e45c887f2fad6381b5138dc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 14 11:20:09 2019 +0430
+
+    [ci] Install cmake on macOS cmake/amalgam tester
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f3214df6f63919ebe73c713b1e80bba1097a0cea
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 14 10:56:00 2019 +0430
+
+    [coretext] Fix double promotion warnings by making casts explicit
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cbbb6fa45519a8670870c784841d7b9e1ab71dd1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 14 10:53:12 2019 +0430
+
+    [ci] Don't build cmake tests in macOS bot
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6e4736a3c5acc0eea1b16c79b95d1a3082baa320
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 14 10:38:52 2019 +0430
+
+    [name] Undef entry_{index,score} to avoid collision in amalgam builds
+
+ src/hb-ot-name-table.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d512087e4dfb5d9483b78eaf8443b4fa8724b8e1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 14 10:36:29 2019 +0430
+
+    Rename GlyphID to HBGlyphID
+    
+    Avoid collision with macOS's ATSUnicodeTypes.h GlyphID
+
+ 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              |  4 +-
+ src/hb-ot-glyf-table.hh                    |  2 +-
+ src/hb-ot-layout-base-table.hh             |  2 +-
+ src/hb-ot-layout-common.hh                 | 22 ++++-----
+ src/hb-ot-layout-gpos-table.hh             |  2 +-
+ src/hb-ot-layout-gsub-table.hh             | 72 +++++++++++++++---------------
+ 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 +-
+ 18 files changed, 103 insertions(+), 103 deletions(-)
+
+commit bf08611044d83b6f5d6dec443f5216db259b4085
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 14 10:35:08 2019 +0430
+
+    [ci] Update and compile cmake/amalgam on macOS bot
+
+ .circleci/config.yml | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 229ef1d29d5c7a370ebb10a1131c04719f34dc81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 10 10:31:07 2019 -0700
+
+    Rename Fixed to HBFixed
+    
+    Fixes(!!) https://github.com/harfbuzz/harfbuzz/issues/1966
+
+ src/hb-aat-fdsc-table.hh        |  4 ++--
+ src/hb-aat-layout-just-table.hh | 20 ++++++++++----------
+ src/hb-aat-layout-trak-table.hh |  8 ++++----
+ src/hb-open-type.hh             |  4 ++--
+ src/hb-ot-post-table.hh         |  2 +-
+ src/hb-ot-stat-table.hh         | 14 +++++++-------
+ src/hb-ot-var-fvar-table.hh     | 16 ++++++++--------
+ 7 files changed, 34 insertions(+), 34 deletions(-)
+
+commit 170b5dd856b1ba8f26e79863fe0c64a52eb68951
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 8 16:34:11 2019 -0400
+
+    [aat] Minor
+
+ src/hb-aat-layout-morx-table.hh | 14 +++++---------
+ 1 file changed, 5 insertions(+), 9 deletions(-)
+
+commit a0695687eb03bcf80c4dec19917127cdd8d8797d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 8 16:32:12 2019 -0400
+
+    [aat] Minor
+
+ src/hb-aat-layout-morx-table.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 4905a2198b4c47c12c6356f72ae0d2b178630d25
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Sep 9 12:36:12 2019 +0430
+
+    [number] Add static to hb-number-parser.hh functions
+
+ src/hb-number-parser.hh | 4 ++--
+ src/hb-number-parser.rl | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 30e5cdfbf1ce2aadadf29ccfd0733355ced2d065
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Sep 9 00:28:16 2019 +0430
+
+    [number] Optimize _pow10 constants (#1963)
+
+ src/hb-number-parser.hh | 43 +++++++++++++++++++------------------------
+ src/hb-number-parser.rl | 31 +++++++++++++------------------
+ 2 files changed, 32 insertions(+), 42 deletions(-)
+
+commit 3f2cdf07a417f81aeeb1e296db493b6e02d76ba8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 8 15:08:02 2019 -0400
+
+    Change HB_VAR_ARRAY to 1 again
+    
+    To fix MSVC bots, while I work on changing this to 0 permanently.
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 39cf8e21be2bf69717cf60a339b3ad26c6f7985b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 7 15:27:30 2019 +0430
+
+    [number] Add overflow checks used to be done in parse_bcd
+    
+    Which were removed in 1083df8
+
+ src/hb-number-parser.hh | 60 +++++++++++++++++++++++++++++++++----------------
+ src/hb-number-parser.rl | 38 ++++++++++++++++++++++++-------
+ 2 files changed, 71 insertions(+), 27 deletions(-)
+
+commit 47d82713a144e06e00a486b3aa7d3934d62d68fd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Sep 6 20:33:10 2019 +0430
+
+    Replace strtod with a ragel implementation
+    
+    Use a ragel based number parser when strtod_l couldn't be found
+    as libc's strtod may is locale sensetivity which we need to not.
+
+ src/Makefile.sources    |   2 +
+ src/hb-number-parser.hh | 223 ++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-number-parser.rl | 122 ++++++++++++++++++++++++++
+ src/hb-number.cc        |   3 +-
+ src/test-number.cc      |  30 +++++++
+ 5 files changed, 379 insertions(+), 1 deletion(-)
+
+commit 80613e5b9ee31125f4390012719e6f39970118d3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Sep 7 14:25:54 2019 +0430
+
+    Minor, remove unused header
+
+ src/hb-common.cc | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 5902198cee9b9939ae310f459f9f18f5f1b07424
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 21:36:31 2019 -0400
+
+    [kerx] Fix offset issue in kern format 2
+    
+    Fixes tests with HB_VAR_ARRAY != 1, as done in previous commit.
+
+ src/hb-aat-layout-common.hh     | 2 +-
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 861547d5315be4cb22f3a1e7cd59696d8657ca49
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 16:55:00 2019 -0400
+
+    Change HB_VAR_ARRAY from 1 to 0
+    
+    Going to see which compilers it breaks and special-case those...
+
+ src/hb.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 0e294c455e7f2e50172f65463ab016f1372d4c59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 16:54:27 2019 -0400
+
+    Rename VAR to HB_VAR_ARRAY
+
+ src/hb-machinery.hh        | 2 +-
+ src/hb-open-type.hh        | 8 ++++----
+ src/hb-ot-cff-common.hh    | 6 +++---
+ src/hb-ot-cff1-table.hh    | 4 ++--
+ src/hb-ot-layout-common.hh | 2 +-
+ src/hb-ot-maxp-table.hh    | 2 +-
+ src/hb-string-array.hh     | 2 +-
+ src/hb.hh                  | 2 +-
+ 8 files changed, 14 insertions(+), 14 deletions(-)
+
+commit c379faed2bcca1cc1a81b0de132fc3c4f7f7a080
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 16:41:12 2019 -0400
+
+    Fix a few struct size declarations
+    
+    Was wrong.  As excercised by defining VAR to other than 1 in hb.hh.
+
+ src/hb-aat-layout-feat-table.hh | 2 +-
+ src/hb-ot-cff-common.hh         | 2 +-
+ src/hb-ot-color-sbix-table.hh   | 2 +-
+ src/hb-ot-layout-common.hh      | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 7d4da8b86242d5a541e501937ddf321716b43f07
+Author: Evgeniy Reizner <razrfalcon@gmail.com>
+Date:   Fri Sep 6 19:24:32 2019 +0300
+
+    Remove duplicated tests from test-ot-tag (#1958)
+
+ test/api/test-ot-tag.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 3aceee2527ad921e0d589e42a1fe451e0fc67ee0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 12:17:18 2019 -0400
+
+    Revert "[null] Silence undefined-behavior complaints with too-small null bytes"
+    
+    This reverts commit 911c76abcdfe89770b252eb0d4eb621c0db00ad5.
+    
+    Broke tests.  I'm not sure I understand why.  At any rate, this was a
+    bad way to fix.  I'll look into understanding as well as better fix.
+
+ src/hb-null.hh | 6 ------
+ 1 file changed, 6 deletions(-)
+
+commit 911c76abcdfe89770b252eb0d4eb621c0db00ad5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 6 11:53:11 2019 -0400
+
+    [null] Silence undefined-behavior complaints with too-small null bytes
+    
+    Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1577584
+
+ src/hb-null.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 3c81246f66585edd8ee4515d226b133c290e9d7c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 1 19:25:50 2019 -0500
+
+    [subset] Use newer iter tools in SinglePosFormat1
+
+ src/hb-ot-layout-gpos-table.hh | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+commit 9510e918f72d2496f5e2ec84c58e79af944c8a0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 1 16:25:33 2019 -0500
+
+    [iter] Partialize hb_zip()
+
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 52d19ba4591e822708e52a8fc96d9821fe2668f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Sep 1 19:42:08 2019 -0500
+
+    Minor
+
+ test/subset/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit cad698568a36ea6c929b4c888bd5e8aafe8d39e3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 4 10:59:19 2019 +0430
+
+    Use roundf to fix cast to int difference of msys2 w64
+
+ src/test-number.cc | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 88c73359da3f7078d02f27087790c7109ab4d248
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 4 11:16:18 2019 +0430
+
+    Check roundf availibity in autotools
+    
+    Hmm, not sure how I missed it.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1083df8b80b08aa1a4f2dabfe414aaa4a0ec8aa1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 4 01:22:21 2019 +0430
+
+    Use hb_parse_double in CFF::dict_opset_t::parse_bcd
+
+ src/Makefile.sources             |   2 +
+ src/hb-cff-interp-dict-common.hh | 136 +++++++++------------------------------
+ 2 files changed, 31 insertions(+), 107 deletions(-)
+
+commit 57f88e11d4c48f40a2e56625a54bdfed4aae601a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Sep 4 01:20:50 2019 +0430
+
+    [number] Turn hb_parse_float into hb_parse_double
+
+ src/hb-common.cc   |  6 +++++-
+ src/hb-number.cc   | 16 ++++++++--------
+ src/hb-number.hh   |  4 ++--
+ src/test-number.cc | 44 ++++++++++++++++++++++----------------------
+ 4 files changed, 37 insertions(+), 33 deletions(-)
+
+commit 65690b5a4bf1186a072e8e918c5e01464f918d46
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 3 23:09:47 2019 +0430
+
+    [number] Add whole buffer check and test it
+
+ src/hb-algs.hh             |  6 ++----
+ src/hb-buffer-serialize.cc | 12 ++++--------
+ src/hb-number.cc           | 39 ++++++++++++++++++++++++---------------
+ src/hb-number.hh           |  9 ++++++---
+ src/test-number.cc         | 19 ++++++++++++++++---
+ 5 files changed, 52 insertions(+), 33 deletions(-)
+
+commit 3661eb6105a33a763736d8dc4a2cd95c01aa4332
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 3 19:43:14 2019 +0430
+
+    Don't check null terminaion of source in hb_codepoint_parse
+    
+    This isn't what intended originally, just checking if consumed
+    all the buffer is enough.
+
+ src/hb-algs.hh     |  4 ++--
+ src/test-number.cc | 32 +++++++++++++++++++++++++++++++-
+ 2 files changed, 33 insertions(+), 3 deletions(-)
+
+commit 3a162727501ad0c56d5d6561cace115d858eacb7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 3 17:19:33 2019 +0430
+
+    [test] resolve msvc complain on signedness comparing
+
+ src/test-number.cc | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 005389beb5a28e2a94b40d0bb8229e9598b84b1d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 3 17:00:46 2019 +0430
+
+    Use hb_parse_uint in deserializer token parser
+
+ src/hb-buffer-serialize.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 3d5b1df7ab689871db37ec9a2f5b1ff1665fdb20
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 3 16:58:16 2019 +0430
+
+    [number] Add test
+
+ src/Makefile.am    |   6 +-
+ src/test-number.cc | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 185 insertions(+), 1 deletion(-)
+
+commit b5e6805ee777347ae13ba0133ca0d64252ef9d55
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 3 15:23:40 2019 +0430
+
+    [number] Minor tweak on parser related codes
+
+ src/hb-algs.hh             |  6 +++---
+ src/hb-buffer-serialize.cc |  6 ++----
+ src/hb-common.cc           | 14 ++++++--------
+ src/hb-number.cc           |  6 ++----
+ 4 files changed, 13 insertions(+), 19 deletions(-)
+
+commit e2cecf1f34fe1cc62fd8260172f9bd694a17fac5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 3 15:14:21 2019 +0430
+
+    [number] Remove parsing code duplication of the calls using lambda
+
+ src/hb-number.cc | 57 +++++++++++++++++++-------------------------------------
+ 1 file changed, 19 insertions(+), 38 deletions(-)
+
+commit a77bb7eb41d34b19a672bb4ede038cc1b19a3945
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 3 14:49:14 2019 +0430
+
+    Move hb_codepoint_parse to hb_parse_uint
+
+ src/hb-algs.hh             | 20 +++++++++-----------
+ src/hb-buffer-serialize.cc |  1 -
+ src/hb-common.cc           |  1 -
+ src/hb-number.cc           | 26 +++++++++++++++++++++++---
+ src/hb-number.hh           |  3 +++
+ src/hb.hh                  |  3 ++-
+ 6 files changed, 37 insertions(+), 17 deletions(-)
+
+commit 43372fbb5afe31ea1e66d450f29de718b6190828
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 3 01:02:40 2019 +0430
+
+    Merge and aggregate number parsing logics to form hb-number
+
+ src/Makefile.sources       |   2 +
+ src/harfbuzz.cc            |   1 +
+ src/hb-buffer-serialize.cc |  41 +++++---------
+ src/hb-common.cc           | 121 +++------------------------------------
+ src/hb-number.cc           | 138 +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-number.hh           |  35 ++++++++++++
+ 6 files changed, 197 insertions(+), 141 deletions(-)
+
+commit d50d2fcbc7233f0473493e17ab3fb243d8d30edd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Sep 3 05:02:06 2019 +0430
+
+    Fallback if roundf didn't exist, like in dietlibc (#1953)
+
+ CMakeLists.txt | 2 +-
+ src/hb.hh      | 9 +++++++++
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit d3b984d3790d61931d4427ad7c0ae6547f8f1076
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Sep 2 18:18:25 2019 +0430
+
+    Revert in-house pow10 (d80a3ea) and fix oss-fuzz/16922
+    
+    Probably can be fixed but merging it was wrong so let's revert.
+
+ src/hb-cff-interp-dict-common.hh                   |  37 ++-------------------
+ ...ase-minimized-hb-subset-fuzzer-5728664968232960 | Bin 0 -> 28 bytes
+ 2 files changed, 3 insertions(+), 34 deletions(-)
+
+commit 41d6e95b0d47c874b73b314cd147e6ea8ec5ddfb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Sep 2 01:41:48 2019 +0430
+
+    [subset] Use internal API of hb_set_t
+
+ src/hb-subset.cc | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 8ccf328d548a51140e22fe61ba6fdae3f7194aa2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Sep 2 00:02:06 2019 +0430
+
+    [subset] Run once for a tag
+
+ src/hb-subset.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 0954c8f7a003b4130cfdc1b3f29db8c57953a78f
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Sep 1 17:09:08 2019 +0200
+
+    [ft] Prefer symbol cmap subtable if found (#1948)
+    
+    Similar to commit d304d60e4d49df14ed85d6646680085f27bafbf2 for ot-font.
+
+ src/hb-ft.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4375858792f3e3cc2fae72c3ae3327f52884f780
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Sep 1 15:13:05 2019 +0430
+
+    [editorconfig] Treat Ragel files also as C sources
+
+ .editorconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d80a3ea983534e291aee273dba5b1c6e889dadfa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Sep 1 14:05:16 2019 +0430
+
+    [cff] Implement in-house power of 10
+    
+    A minimal power only for natural numbers exponents of ten, for portability.
+    
+    Found the idea in Tcl/Tk but wrote it myself after weeks and it turned out
+    being a different implementation, reverse direction, constexpr, etc.
+
+ src/hb-cff-interp-dict-common.hh | 37 ++++++++++++++++++++++++++++++++++---
+ 1 file changed, 34 insertions(+), 3 deletions(-)
+
+commit f441a7c00837fbe7843df6faedd5f6383c2258c3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Sep 1 02:18:09 2019 +0430
+
+    Don't allow reference blob be accessed using empty tag in hb_face_reference_table (#1947)
+
+ src/hb-face.cc   | 3 +++
+ src/hb-subset.cc | 5 -----
+ 2 files changed, 3 insertions(+), 5 deletions(-)
+
+commit c9eb913f4cf3d9d4a28059c7ecf7145ad3c49c65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 31 15:21:02 2019 -0500
+
+    [iter] Simplify hb_chop()
+
+ src/hb-iter.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 67ec9fa9e48714f595ab17bb8a673b5ee7c73aa8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 31 14:51:49 2019 -0500
+
+    [iter] Add hb_chop()
+
+ src/hb-iter.hh   | 14 ++++++++++++++
+ src/test-iter.cc |  2 +-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 5828d8e83c023547f0add77b6413967056c2a13c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 31 14:36:44 2019 -0500
+
+    [iter] Add hb_take() specialization for arrays
+
+ src/hb-iter.hh | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit 398b296f3b205daa8964de1a63957efeb59f6bdf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 31 12:44:24 2019 -0500
+
+    [iter] Add hb_len()
+
+ src/hb-iter.hh   | 8 ++++++++
+ src/test-iter.cc | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 875131d47854c162c1d0a39a5c0f8f8d0c5f24e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 31 12:42:52 2019 -0500
+
+    [iter] Add hb_take()
+
+ src/hb-iter.hh   | 12 ++++++++++--
+ src/test-iter.cc |  1 +
+ 2 files changed, 11 insertions(+), 2 deletions(-)
+
+commit 1f88dae9f54d18cd740f149d020b2bb435dc9378
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Aug 31 12:24:42 2019 -0500
+
+    [iter] Make iota() accept invokable for increasing to next item
+
+ src/hb-iter.hh   | 21 ++++++++++++++++-----
+ src/test-iter.cc |  1 +
+ 2 files changed, 17 insertions(+), 5 deletions(-)
+
+commit 3bc86fb237b668e738a78397be04c603e7cf083b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 16:39:52 2019 -0500
+
+    [algs] Fix hb_inc/dec signature
+
+ src/hb-algs.hh   | 5 +++--
+ src/test-algs.cc | 4 ++++
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit b1378d8a217a53e17562abebee22276e09528f8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 12:10:45 2019 -0500
+
+    [iter] Add hb_repeat()
+
+ src/hb-iter.hh   | 37 +++++++++++++++++++++++++++++++++----
+ src/test-iter.cc |  3 +++
+ 2 files changed, 36 insertions(+), 4 deletions(-)
+
+commit 966a18b92a8b95d8024ae67bc237eeffe5019711
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 12:07:17 2019 -0500
+
+    [iter] Remove some &&
+
+ src/hb-iter.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit de45775c37873dd5818058dfe316cc0e98590334
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 12:02:46 2019 -0500
+
+    [iter] Use hb_ridentity instead of lazy +
+
+ src/hb-iter.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ce4d63beec08995aaa6b8b45f7986f074a73f295
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 11:59:50 2019 -0500
+
+    [iter] Separate hb_iota implementation from hb_range
+
+ src/hb-iter.hh | 29 +++++++++++++++++++++++++++--
+ 1 file changed, 27 insertions(+), 2 deletions(-)
+
+commit 814dc3cbe5a5e51b48cb962a6f7053797bbb8e0d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 10:20:30 2019 -0500
+
+    [iter] Rename
+    
+    Moving towards making iota useful for non-integers.
+
+ src/hb-iter.hh | 35 ++++++++++++++++++-----------------
+ 1 file changed, 18 insertions(+), 17 deletions(-)
+
+commit 2d5643aed4a5a4bc3ea129d4af3dcbe7af7b9995
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 09:51:22 2019 -0500
+
+    [algs] Add hb_inc() and hb_dec())
+
+ src/hb-algs.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 7eafe94705bb818aac71fbc142158a22da622d19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 30 09:40:40 2019 -0500
+
+    Revert "[array] Add chop()"
+    
+    This reverts commit 545fe9d9f0870568c40c17591f3f224c228feba6.
+    
+    Breaks gcc 4.8 and MSVC all versions.
+    
+    Will add hb_chop() that works on all iterators instead.
+
+ src/hb-array.hh | 14 --------------
+ 1 file changed, 14 deletions(-)
+
+commit 28c8dcb53f0af0dd3f4e7909285e67865a10b67b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Aug 31 12:27:14 2019 +0430
+
+    [subset] minor
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 545fe9d9f0870568c40c17591f3f224c228feba6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 29 15:48:21 2019 -0700
+
+    [array] Add chop()
+    
+    Takes n, and returns iterator of iterators that contain up to
+    n items each.  Basically cuts the array into subarrays of size n.
+    The last sub-array might contain fewer.
+    
+    Ideally this should become a generic iter tool, not array-specific,
+    so we can use it in GPOS to chop a value matrix into rows and elements.
+
+ src/hb-array.hh | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit c72589f13f24ca24a0613f7d9bc28b7fe1ef25c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 29 15:45:21 2019 -0700
+
+    [iter] Change item_size to get_item_size()
+    
+    By moving access to hb_static_size(Type) into a function instead of
+    a class-const, we can refer to iter types of incomplete types, which
+    come handy when a method of hb_array_t wants to return iterator
+    of hb_array_t.  That kind of stuff.   Next commit needs this to
+    build on clang...
+
+ src/hb-array.hh | 8 ++++----
+ src/hb-iter.hh  | 4 ++--
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit d58e248df62457bdc8a5bab743e5de26c6fc57be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 29 15:23:48 2019 -0700
+
+    [array] Add truncate() method
+
+ src/hb-array.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit a06edf1430ba73d24104fce5406f2bc787ce5f11
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 29 15:21:18 2019 -0700
+
+    [array] Use injected class name more
+
+ src/hb-array.hh | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit e0e0c8c10948212e97426e987b6f296dc4270c43
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 29 14:58:16 2019 -0700
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 0313ef86e32a217e14950d46a3c3b98362a53dee
+Author: qxliu76 <48925186+qxliu76@users.noreply.github.com>
+Date:   Thu Aug 29 14:09:05 2019 -0700
+
+    bug fix in optimizing coverage table format (#1942)
+    
+    We are comparing number of shorts, NOT number of bytes.
+
+ src/hb-ot-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 38f95baf6b7a74547906e8e813c826ee8f8c272f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 29 13:40:46 2019 -0700
+
+    [subset] in SingleSubst subsetting, check for substitute in glyphset
+    
+    That matches what fonttools does and allows for specifying exact
+    glyphset for subset.
+
+ src/hb-ot-layout-gsub-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 8106ba7f882f087be114801e857bc945e42cf45b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 29 20:33:36 2019 +0430
+
+    [glyf] Reapply use of hb_bytes_t.as<GlyphHeader> ()
+
+ src/hb-ot-glyf-table.hh | 37 ++++++++++++++++++-------------------
+ 1 file changed, 18 insertions(+), 19 deletions(-)
+
+commit 9e80fc683639fc63870f7705feff8fc962363167
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 29 20:17:31 2019 +0430
+
+    [glyf] Reapply common moving logic to GlyphHeader struct
+
+ src/hb-ot-glyf-table.hh | 27 +++++++++++++++++----------
+ 1 file changed, 17 insertions(+), 10 deletions(-)
+
+commit 852c9aa0e33744669cba2343f08cab67376edf14
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 29 20:12:53 2019 +0430
+
+    [glyf] Reapply style fixes
+
+ src/hb-ot-glyf-table.hh | 162 +++++++++++++++++++++++++++---------------------
+ 1 file changed, 90 insertions(+), 72 deletions(-)
+
+commit 9ff32b79b37e686bab0b4baa924c97b841bd8413
+Merge: 6b3e0939 49902964
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 29 19:53:18 2019 +0430
+
+    Merge remote-tracking branch 'upstream/master' into glyf-rebase
+
+commit 499029644f35be7feedca7edf4610b2594855f01
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 29 15:09:39 2019 +0430
+
+    [gsub] Fix clang's semicolon complains
+
+ src/hb-ot-layout-gsub-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 28620310b8a86092074d5a1c40c87fdc9a91ba61
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 29 14:55:54 2019 +0430
+
+    [test] Avoid alloca use as clang complain
+    
+    Fixes https://circleci.com/gh/harfbuzz/harfbuzz/108171 complain
+
+ test/api/test-ot-color.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 875985cd481f1609d10ad0472f1e77af075c93bc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Aug 29 14:51:22 2019 +0430
+
+    [subset] Don't allow malicious fonts to insert unlimited table headers
+    
+    Fixes https://crbug.com/oss-fuzz/16810
+
+ src/hb-subset.cc                                       |   5 +++++
+ ...estcase-minimized-hb-subset-fuzzer-5675720390475776 | Bin 0 -> 299037 bytes
+ 2 files changed, 5 insertions(+)
+
+commit dc9222b1dd197ba50f7b63eb97f3fe0891a7b7b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 15:38:46 2019 -0700
+
+    [subset] Implement AlternateSubst subsetting
+
+ src/hb-ot-layout-gsub-table.hh | 61 +++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 55 insertions(+), 6 deletions(-)
+
+commit 23681b6da4368895fc049beda5a79af58aad8d69
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 15:30:37 2019 -0700
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh | 21 ++++++++-------------
+ 1 file changed, 8 insertions(+), 13 deletions(-)
+
+commit 33c8e2303c23e8dfacb79ac15d8a0e6c7f866c89
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 15:25:55 2019 -0700
+
+    [subset] Implement MultipleSubst subsetting
+
+ src/hb-ot-layout-gsub-table.hh | 50 ++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 48 insertions(+), 2 deletions(-)
+
+commit 5c43a7ba7e4cac229593f9cbe1017d3c55b111ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 15:09:58 2019 -0700
+
+    [GSUB] Use dagger in Ligature::intersects()
+
+ src/hb-ot-layout-gsub-table.hh | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit b8c642c1f597fb28ef323ac3cd78541eb462a2f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 15:06:45 2019 -0700
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dc2c9aa0c398ac068e1385fffe1fb2b28c80d099
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 15:05:49 2019 -0700
+
+    Rename
+
+ src/hb-open-type.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit bc5ef765a874ecd9fc0634dccf0848d1ee839c9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 14:51:28 2019 -0700
+
+    [subset] Subset ligature substitutes!
+    
+    Test with:
+    
+    $ ./hb-subset -o out.ttf NotoSansArabic-Regular.ttf --drop-tables=  سلام && ./hb-view out.ttf سلام
+
+ src/hb-ot-layout-gsub-table.hh | 79 ++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 76 insertions(+), 3 deletions(-)
+
+commit 42d887bd221879f57ef939838d4f72bf38268943
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 14:47:14 2019 -0700
+
+    Beef up HeadlessArrayOf<>
+    
+    Should be merged with ArrayOf...
+    https://github.com/harfbuzz/harfbuzz/issues/1937
+
+ src/hb-open-type.hh | 37 ++++++++++++++++++++++++++++++-------
+ 1 file changed, 30 insertions(+), 7 deletions(-)
+
+commit 3ca809e3623e59b9a99bc0b9e5d10b02238bba3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 13:49:35 2019 -0700
+
+    Add ArrayOf::pop()
+
+ src/hb-open-type.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 307bd6d79f11eb175f06c08c321947a447496291
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 13:49:17 2019 -0700
+
+    Add arithmetic operators to IntType<>
+
+ src/hb-open-type.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 2e1d00c85bba98f08a728c4f6f8112d5a25d8062
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 13:49:04 2019 -0700
+
+    [debug] Minor
+
+ src/hb-debug.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 062cad5e28574f9f004f917afa7d010fa68fdad0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 28 13:33:08 2019 -0700
+
+    Add ArrayOf::serialize_append
+
+ src/hb-open-type.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit b66076812d067f893a5a422af2656916ff479d8f
+Author: Adrian Wong <adrianwjw@gmail.com>
+Date:   Wed Aug 28 21:31:27 2019 +1000
+
+    Adjustments to the generated Indic table output (#1936)
+    
+    * Add empty parentheses after print call
+    
+    * Minor: newlines. Move #pragma pop down one; #endif up one
+    
+    * Adjust #define ISC/IMC output
+    
+    * Regenerate Indic table
+
+ src/gen-indic-table.py                 |  21 ++++---
+ src/hb-ot-shape-complex-indic-table.cc | 109 +++++++++++++++++----------------
+ 2 files changed, 70 insertions(+), 60 deletions(-)
+
+commit 4ef08dbce1a9acd7e941168245c96e010248ecb6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 27 14:49:46 2019 +0430
+
+    Use hb_bytes_t as<T> in hb_blob_t
+
+ src/hb-blob.hh | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+commit dce42cef2b769379a0690053da0e7467ff086195
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 27 14:32:05 2019 +0430
+
+    [glyf] Move GlyphHeader::from_bytes to hb_bytes_t, introduce .as<T> ()
+
+ src/hb-array.hh         |  6 ++++++
+ src/hb-ot-glyf-table.hh | 24 +++++++++---------------
+ 2 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 6e82d59b4f72e8f2ff1830fb384907dcba95962a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 27 12:33:42 2019 +0430
+
+    [glyf] Revert the way indexToLocFormat is set
+
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 88e9db19d29480fadcd4f49f0f4d9029ac64b429
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 27 02:44:26 2019 +0430
+
+    [subset] Remove subset table size assertion
+    
+    As https://github.com/harfbuzz/harfbuzz/pull/1930#issuecomment-525036802
+
+ src/hb-subset.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit a0b4ac4dce392326284138fc47cf3741e2798e21
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Aug 24 17:57:14 2019 +0430
+
+    Turn 8 spaces to tab across the project
+    
+    According to the current code style of the project
+
+ src/hb-aat-layout-kerx-table.hh    |  12 +-
+ src/hb-aat-layout-morx-table.hh    |  16 +--
+ src/hb-aat-layout-trak-table.hh    |   6 +-
+ src/hb-array.hh                    |   4 +-
+ src/hb-blob.cc                     |   4 +-
+ src/hb-buffer-serialize.cc         |   2 +-
+ src/hb-buffer.cc                   |  22 ++--
+ src/hb-buffer.h                    |   4 +-
+ src/hb-common.cc                   |   4 +-
+ src/hb-coretext.cc                 |  50 ++++----
+ src/hb-dispatch.hh                 |   2 +-
+ src/hb-font.cc                     |  16 +--
+ src/hb-ft.cc                       |   2 +-
+ src/hb-graphite2.cc                |  10 +-
+ src/hb-iter.hh                     |   4 +-
+ src/hb-kern.hh                     |   6 +-
+ src/hb-machinery.hh                |   2 +-
+ src/hb-object.hh                   |   2 +-
+ src/hb-open-file.hh                |   4 +-
+ src/hb-open-type.hh                |   2 +-
+ src/hb-ot-cmap-table.hh            | 252 ++++++++++++++++++-------------------
+ src/hb-ot-color-cbdt-table.hh      |   2 +-
+ src/hb-ot-color-cpal-table.hh      |   2 +-
+ src/hb-ot-color-sbix-table.hh      |   8 +-
+ src/hb-ot-font.cc                  |  16 +--
+ src/hb-ot-hmtx-table.hh            |  62 ++++-----
+ src/hb-ot-layout-common.hh         |  16 +--
+ src/hb-ot-layout-gdef-table.hh     |   4 +-
+ src/hb-ot-layout-gpos-table.hh     |  74 +++++------
+ src/hb-ot-layout.cc                |  26 ++--
+ src/hb-ot-layout.h                 |  18 +--
+ src/hb-ot-map.cc                   |   2 +-
+ src/hb-ot-maxp-table.hh            |   2 +-
+ src/hb-ot-name-table.hh            |   8 +-
+ src/hb-ot-name.cc                  |   2 +-
+ src/hb-ot-shape-complex-arabic.cc  |  14 +--
+ src/hb-ot-shape-complex-hangul.cc  |  12 +-
+ src/hb-ot-shape-complex-indic.cc   |  34 ++---
+ src/hb-ot-shape-complex-khmer.cc   |   2 +-
+ src/hb-ot-shape-complex-myanmar.cc |   2 +-
+ src/hb-ot-shape-complex-use.cc     |   2 +-
+ src/hb-ot-shape-fallback.cc        |  46 +++----
+ src/hb-ot-shape-normalize.cc       |   4 +-
+ src/hb-ot-shape.cc                 |  16 +--
+ src/hb-ot-stat-table.hh            |   4 +-
+ src/hb-ot-var-avar-table.hh        |   2 +-
+ src/hb-ot-var-fvar-table.hh        |   6 +-
+ src/hb-ot-vorg-table.hh            |  28 ++---
+ src/hb-pool.hh                     |   2 +-
+ src/hb-sanitize.hh                 |   6 +-
+ src/hb-set.hh                      |  36 +++---
+ src/hb-shape-plan.cc               |  50 ++++----
+ src/hb-subset-cff2.cc              |  18 +--
+ src/hb-subset-input.cc             |   2 +-
+ src/hb-subset-plan.cc              |  34 ++---
+ src/hb-subset-plan.hh              |   8 +-
+ src/hb-subset.h                    |   2 +-
+ src/hb-uniscribe.cc                |   8 +-
+ src/hb-utf.hh                      |   8 +-
+ src/hb-vector.hh                   |   2 +-
+ src/hb.hh                          |  12 +-
+ src/test-ot-color.cc               |   4 +-
+ src/test-unicode-ranges.cc         |   6 +-
+ test/api/hb-subset-test.h          |   6 +-
+ test/api/test-buffer.c             |   2 +-
+ test/api/test-object.c             |   2 +-
+ test/api/test-ot-math.c            | 132 +++++++++----------
+ test/api/test-unicode.c            |  16 +--
+ util/ansi-print.cc                 |  26 ++--
+ util/hb-fc-list.c                  |   2 +-
+ util/hb-fc.cc                      |   4 +-
+ util/hb-shape.cc                   |   2 +-
+ util/hb-subset.cc                  |  10 +-
+ util/helper-cairo-ansi.cc          |   4 +-
+ util/helper-cairo.cc               |   2 +-
+ util/options-subset.cc             |  26 ++--
+ util/options.cc                    |  50 ++++----
+ util/options.hh                    |   8 +-
+ 78 files changed, 662 insertions(+), 668 deletions(-)
+
+commit 269a120f137ca69ca83b6fa00bb6a0ff1a87ae3e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 25 20:37:00 2019 +0430
+
+    [subset] Raise the bar in new vs old table size
+    
+    https://crbug.com/oss-fuzz/16740
+    
+    This is actually an interesting thing that {h,v}mtx allocates as
+    much as a font pretends to have glyphs but the solution is not
+    that obvious as regular fonts can have less than actually containing
+    metrics in their {h,v}mtx. This change raises the bar to consider this
+    hmtx 4 byte for every glyph case.
+    
+    Initially we wanted to just find things allocating crazy amount of
+    memory but having the assert has led to interesting findings also
+    so let's don't remove the assert and see what we can find elsewhere.
+
+ src/hb-subset.cc                                          |   2 +-
+ ...z-testcase-minimized-hb-subset-fuzzer-5667673584697344 | Bin 0 -> 178 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 2f8e823331aca2c73b940f057f4b149a89af0502
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 25 12:37:40 2019 +0430
+
+    [glyf] minor
+
+ src/hb-ot-glyf-table.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 07e467a30e2bab9731900d72dbf926dbe6fc6e1d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 25 00:36:58 2019 +0430
+
+    [glyf] Move GlyphHeader size checking to a static method
+
+ src/hb-ot-glyf-table.hh | 69 ++++++++++++++++++++++++++-----------------------
+ 1 file changed, 36 insertions(+), 33 deletions(-)
+
+commit 139d14dc899250cf06a8d03b70504687184d5c7f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Aug 24 17:23:16 2019 +0430
+
+    [glyf] Move GlyphHeader related logics to its, making its fields protected
+
+ src/hb-ot-glyf-table.hh | 73 +++++++++++++++++++++++++------------------------
+ 1 file changed, 38 insertions(+), 35 deletions(-)
+
+commit d57819cbdbab18ccf20caa25cb72cd66efe30848
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Aug 24 16:26:42 2019 +0430
+
+    [glyf] format source
+
+ src/hb-ot-glyf-table.hh | 282 ++++++++++++++++++++++++++----------------------
+ 1 file changed, 154 insertions(+), 128 deletions(-)
+
+commit 2aef3013f3e6d71eacd0123f4faa63445034c32b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Aug 24 02:59:18 2019 +0430
+
+    [subset] Consider instruction length place itself
+    
+    Now fixes https://crbug.com/oss-fuzz/16639 completely
+
+ src/hb-ot-glyf-table.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 922898c814b328712fac6c3259740804679dae11
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Aug 23 22:04:14 2019 +0430
+
+    [subset] Fail on table grow more than 16x+4096
+
+ src/hb-subset.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 28aba780c4035cc85a31b778db0f5553c896dd6a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Aug 23 16:47:15 2019 +0430
+
+    [subset] Fix blob leak of _subset2 when returns early
+    
+    Fixes https://crbug.com/oss-fuzz/16639
+
+ src/hb-subset.cc                                          |   2 ++
+ ...z-testcase-minimized-hb-subset-fuzzer-5754526379802624 | Bin 0 -> 288 bytes
+ 2 files changed, 2 insertions(+)
+
+commit 541f3c2d7dcae47eb55650082e372286369d4a55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 23 12:25:58 2019 -0700
+
+    [debug] Fix extra semicolon issue
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1923
+
+ src/hb-debug.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 4dcaca84115bf8de130fc2c9e03bd7e63fcf9607
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 23 12:24:15 2019 -0700
+
+    Whitespace
+
+ src/hb-debug.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 569426d861ac9336f4083e55f98284b4c647c795
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 23 11:54:20 2019 -0700
+
+    [debug] Fix build with HB_DEBUG
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1923
+
+ src/hb-debug.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit f233e6c8014cde9b2396c5350c29a3277cd3a657
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Aug 23 13:15:37 2019 +0200
+
+    [doc] Update list of default features in the manual
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1921
+
+ docs/usermanual-opentype-features.xml | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit be97e9d678017d4ec66625fa2b17ef3485552cad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 22 15:52:24 2019 -0700
+
+    2.6.1
+
+ NEWS             | 11 +++++++++++
+ configure.ac     |  2 +-
+ src/hb-version.h |  4 ++--
+ 3 files changed, 14 insertions(+), 3 deletions(-)
+
+commit d304d60e4d49df14ed85d6646680085f27bafbf2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 21 12:30:22 2019 -0700
+
+    [ot-font] Prefer symbol cmap subtable if found
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1918
+    
+    Hopefully doesn't break anyone...
+
+ src/hb-ot-cmap-table.hh | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit 2a3d4987a75fb2cd51ccf4c1d08baba383ceda7b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 21 03:02:01 2019 +0430
+
+    Remove hb_directwrite_shape_experimental_width public API
+    
+    I had specially exposed the API as I didn't know how to embed harfbuzz
+    easily elsewhere but now with harfbuzz.cc it has become very easy
+    and I don't like to see its use anywhere as it has a bad naming and
+    its Kashida adding is bogus and only useful to check where it should
+    be added, not visually useful however.
+
+ src/hb-directwrite.cc | 29 ++++++-----------------------
+ src/hb-directwrite.h  |  5 -----
+ 2 files changed, 6 insertions(+), 28 deletions(-)
+
+commit 163a66dc737645852d7515381304d69706688e16
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 20 14:22:57 2019 -0700
+
+    [test] Add test for aaa85931f3542639cd9d0dfb92fd6baab5b0298d
+
+ test/api/test-shape.c | 48 ++++++++++++++++++++++++++++++------------------
+ 1 file changed, 30 insertions(+), 18 deletions(-)
+
+commit aaa85931f3542639cd9d0dfb92fd6baab5b0298d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 20 13:06:10 2019 -0700
+
+    [font] Update multipliers when creating sub_font
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1910
+
+ src/hb-font.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit bbad1b8298125d78c159ed7fdd7bde6a3f3fff56
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 20 14:46:48 2019 +0430
+
+    [trak] minor, use roundf instead round to normalize the use
+    
+    The change to `round` wasn't intended
+
+ src/hb-aat-layout-trak-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e67cb500e9c5f6717d0d1cd152de84d88ec7370e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 20 13:30:34 2019 +0430
+
+    [readme] add oss-fuzz badge
+    
+    Related:
+    https://github.com/google/oss-fuzz/pull/2513
+    https://github.com/systemd/systemd/commit/ce2098b7e9443cd6f31fb70af7f72308cd2962a3
+
+ README.md | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d59d89b28128cf644d76098c709b9309b834eb09
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 20 13:07:17 2019 +0430
+
+    [test] Rebase 10.14 trak related test
+
+ test/shaping/data/in-house/tests/macos.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 20b1a27c8a319d43a582c3efa8233b9f2c3cc73e
+Merge: 5ee1e451 37de38ad
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 20 13:04:51 2019 +0430
+
+    Merge remove-coretext-96dpi-assumption, @drott
+    
+    Remove assumption about Core Text working in 96 DPI
+
+commit 37de38adeae48e1855c2431a39639db873a74554
+Merge: f401f85a 5ee1e451
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Aug 20 12:59:33 2019 +0430
+
+    Merge branch 'master' into remove-coretext-96dpi-assumption
+
+commit 5ee1e451cfc75dc6ddbc3ae300ba7394a0cd560e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 19 14:23:17 2019 -0700
+
+    Minor touch-up for recent change
+
+ src/hb-ot-var-avar-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 33489928444b94bdd2cc523dac14707eb29d667e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 7 20:07:58 2019 +0430
+
+    [avar] Implement inverse map, unmap
+
+ src/hb-ot-var-avar-table.hh | 30 ++++++++++++++++++++++++------
+ 1 file changed, 24 insertions(+), 6 deletions(-)
+
+commit 981f5a54c3cbc1de45ba941fdf5315c62d86b6f3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 7 18:45:39 2019 +0430
+
+    [fvar] Implement inverse normalize, unnormalize
+
+ src/hb-ot-var-fvar-table.hh | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit dcb4cd400fb44172872a20ba54baa011d748b61d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 19 11:35:37 2019 -0700
+
+    Minor
+
+ src/hb-font.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit ca54440324745afc388edac40ad1047e92567fdb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 18 11:58:04 2019 +0430
+
+    Remove continuous development helper script
+    
+    Not have used it personally for a long time, lets remove it
+
+ src/dev-run.sh | 99 ----------------------------------------------------------
+ 1 file changed, 99 deletions(-)
+
+commit 40aef1b473f63701ab901880d764e33682f13414
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Aug 16 01:00:30 2019 +0200
+
+    [ot-shape] Keep horizontal_features array sorted
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit da5118da77898ae4778af1ace4af52334b210dd6
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Aug 16 00:48:26 2019 +0200
+
+    [ot-shape] Enable abvm/blwm features by default
+    
+    Core Text seems to apply them to Latin text, but Uniscribe doesn’t.
+    
+    See https://github.com/harfbuzz/harfbuzz/pull/1908#issuecomment-521819343
+
+ src/hb-ot-shape-complex-indic.cc                   |   9 ---------
+ src/hb-ot-shape-complex-khmer.cc                   |   9 ---------
+ src/hb-ot-shape-complex-myanmar.cc                 |  21 ---------------------
+ src/hb-ot-shape-complex-use.cc                     |  14 --------------
+ src/hb-ot-shape.cc                                 |   2 ++
+ test/shaping/data/in-house/Makefile.sources        |   2 +-
+ .../ea3f63620511b2097200d23774ffef197e829e69.ttf   | Bin 0 -> 1804 bytes
+ .../f79eb71df4e4c9c273b67b89a06e5ff9e3c1f834.ttf   | Bin 0 -> 1860 bytes
+ test/shaping/data/in-house/tests/dist.tests        |   1 -
+ .../data/in-house/tests/positioning-features.tests |   3 +++
+ 10 files changed, 6 insertions(+), 55 deletions(-)
+
+commit 2164bd6f29df265acdc04b84f5f94cf63b2cea8a
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Aug 16 00:28:41 2019 +0200
+
+    [ot-shape] Enable dist feature by default (#1908)
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1907
+
+ src/hb-ot-shape-complex-indic.cc                         |   2 --
+ src/hb-ot-shape-complex-khmer.cc                         |   2 --
+ src/hb-ot-shape-complex-myanmar.cc                       |   1 -
+ src/hb-ot-shape-complex-use.cc                           |   1 -
+ src/hb-ot-shape.cc                                       |   1 +
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/53a91c20e33a596f2be17fb68b382d6b7eb85d5c.ttf   | Bin 0 -> 2020 bytes
+ test/shaping/data/in-house/tests/dist.tests              |   1 +
+ 8 files changed, 3 insertions(+), 6 deletions(-)
+
+commit bc27f86ffef537835f6c9dbbecbc2ee6792cb127
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 14 22:37:00 2019 +0430
+
+    Move HB_NO_VAR to a better place in hb-font.cc
+    
+    Needed for other works
+
+ src/hb-font.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 1cc844da66ab527991ff96efdf10d97f6b626bfe
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 14 19:10:02 2019 +0430
+
+    minor
+    
+    Use hb_font_t coords directly
+
+ src/hb-ot-cff2-table.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 6a194b6876db12f083ae5391ca01972168d4e68a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 14 18:49:57 2019 +0430
+
+    Minor, remove trailing spaces in hb-font.{cc,h} as .editorconfig
+
+ src/hb-font.cc | 338 ++++++++++++++++++++++++++++-----------------------------
+ src/hb-font.h  |  26 ++---
+ 2 files changed, 182 insertions(+), 182 deletions(-)
+
+commit 3ae44645d60fe8271ad18b004434d475eaeb7ad6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 14 14:34:55 2019 +0430
+
+    Fix caret_count value when AAT is disabled
+    
+    Set caret_count to zero as that is what we want to happen inside lcar when
+    there is no result.
+
+ src/hb-ot-layout.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit a5aa67b9f288687e21ca7a9887483f7fe1cbce54
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 14 14:29:01 2019 +0430
+
+    [lcar] Use multiformat convention
+
+ src/hb-aat-layout-lcar-table.hh | 115 +++++++++++++++++++++++++++++++---------
+ 1 file changed, 90 insertions(+), 25 deletions(-)
+
+commit bfffe85dd7d7557e10ec9f9886b86fe0d8b4a7a2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 14 13:55:49 2019 +0430
+
+    [opbd] Use multiformat convention on the table
+
+ src/hb-aat-layout-opbd-table.hh | 116 ++++++++++++++++++++++++++++++----------
+ 1 file changed, 89 insertions(+), 27 deletions(-)
+
+commit d6206dbcc4e4ef8c034ee714e74d3a76c5333a12
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 14 11:24:06 2019 +0430
+
+    [opbd] Turn OpticalBounds fields to FWORD
+
+ src/hb-aat-layout-opbd-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 6461143b44f81a4190d3f1cb02238750536f08e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 13 22:20:54 2019 -0700
+
+    2.6.0
+
+ NEWS                   | 23 +++++++++++++++++++++++
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  4 ++++
+ src/hb-font.cc         |  2 +-
+ src/hb-gdi.cc          |  2 +-
+ src/hb-ot-layout.cc    |  2 ++
+ src/hb-ot-layout.h     |  2 +-
+ src/hb-ot-meta.cc      |  4 ++--
+ src/hb-ot-meta.h       |  2 +-
+ src/hb-ot-metrics.cc   |  8 ++++----
+ src/hb-ot-metrics.h    |  2 +-
+ src/hb-version.h       |  6 +++---
+ 12 files changed, 44 insertions(+), 15 deletions(-)
+
+commit e56d4ff43b97ca35a8324be2acf1c8644f3b0a24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 13 21:02:47 2019 -0700
+
+    Rename hb_ot_meta_get_entries() to +hb_ot_meta_get_entry_tags()
+
+ docs/harfbuzz-sections.txt | 2 +-
+ src/hb-ot-meta.cc          | 8 ++++----
+ src/hb-ot-meta.h           | 8 ++++----
+ src/test-ot-meta.cc        | 4 ++--
+ test/api/test-ot-face.c    | 2 +-
+ test/api/test-ot-meta.c    | 6 +++---
+ 6 files changed, 15 insertions(+), 15 deletions(-)
+
+commit aade9b70aabd8a97dd8a28cda2cf4d0694dd7350
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 13 16:09:20 2019 -0700
+
+    [pool] Fix alignment assertion
+    
+    I *think* it should fix https://github.com/harfbuzz/harfbuzz/issues/1901
+    
+    Ie. if on a system, alignof(void*) < sizeof(void*)...
+
+ src/hb-pool.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b31d627f151c8eeeb12ed84c3282392d6adbc5b4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 11 23:34:48 2019 +0430
+
+    Increase subset fuzzer timeout to 16s
+    
+    To satisfy -valgrind and -tsan bots, very ugly
+
+ test/fuzzing/run-subset-fuzzer-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5b9cf191fe1fb13bd4bf914e0f4c03c3b2795a73
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 11 23:07:29 2019 +0430
+
+    [ci] Disable vcpkg thus running the test suit in Windows
+    
+    vcpkg apparently doesn't like to work the same way used to anymore, lets disable it
+
+ appveyor.yml | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 60d9f0097580a339c7ffe582cc0657698e315cea
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Aug 11 16:15:19 2019 +0430
+
+    Implement opbd table parsing
+    
+    https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6opbd.html
+
+ src/Makefile.sources            |   1 +
+ src/hb-aat-layout-opbd-table.hh | 111 ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-face-table-list.hh    |   1 +
+ src/hb-ot-layout.cc             |   1 +
+ 4 files changed, 114 insertions(+)
+
+commit 8762676e34cef13f4b263b377b485b199b66d4d1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Aug 10 01:26:55 2019 +0430
+
+    [os2] Replace null pool addr compare by checking vital fields (#1896)
+
+ src/hb-ot-os2-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1f926fb2b642094a15e686be6a910e709b15ebd0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 7 20:22:20 2019 +0430
+
+    [fvar] Use roundf instead hardcoding round logic
+
+ src/hb-ot-var-fvar-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 60485ab0473630c585bb96fcdc14dbe415edf4f2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Aug 7 23:23:06 2019 +0430
+
+    [os2] Get defined lower/upper optical size
+
+ src/hb-ot-os2-table.hh | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit 321d5588d4fa96bcc4aa558d2f982430031f242e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jul 2 16:30:57 2019 -0700
+
+    [subset] Add subsetting for GPOS Lookup Type 1: Single Adjustment Positioning Subtable
+
+ src/hb-ot-layout-gpos-table.hh                     | 157 ++++++++++++++++++++-
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ .../gpos1_2_font.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2068 bytes
+ .../gpos1_2_font.keep-layout-retain-gids.41,46.otf | Bin 0 -> 2232 bytes
+ .../gpos1_2_font.keep-layout-retain-gids.43,46.otf | Bin 0 -> 2096 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3668 bytes
+ test/subset/data/fonts/gpos1_2_font.otf            | Bin 0 -> 4564 bytes
+ test/subset/data/tests/layout.gpos.tests           |  11 ++
+ 9 files changed, 166 insertions(+), 4 deletions(-)
+
+commit 37572882e7a685d804384eaf11f0f3e53af38341
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jun 25 13:17:30 2019 -0700
+
+    [subset] cmap table to use _subset2 and new iterator frameworks
+
+ src/hb-ot-cmap-table.hh                          | 670 +++++++++++------------
+ src/hb-subset.cc                                 |   2 +-
+ test/api/fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf | Bin 2816 -> 2532 bytes
+ test/api/fonts/Roboto-Regular.abc.ttf            | Bin 2460 -> 2168 bytes
+ test/api/fonts/Roboto-Regular.ac.ttf             | Bin 2268 -> 1988 bytes
+ 5 files changed, 320 insertions(+), 352 deletions(-)
+
+commit 06596cf90700ff76f23297141c656dfc317eece6
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Aug 3 13:55:34 2019 +0200
+
+    Some styling
+
+ README.python.md | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 5848c890cf2f8a14c9d9e329c4f8283feac1f0c3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Aug 3 14:19:28 2019 +0430
+
+    [metrics] Add metrics tags documentation
+
+ src/hb-ot-metrics.h | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+commit 4d1872b8e019659a92a59b1d7cba6fd81ed3607d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Aug 3 14:06:46 2019 +0430
+
+    [base] Add documentation for baseline tags from ot spec
+
+ src/hb-ot-layout.h | 19 ++++++++++++++++++-
+ 1 file changed, 18 insertions(+), 1 deletion(-)
+
+commit bbeee84a7f048633b0aaa95aa6129871a3a22164
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Aug 3 13:47:55 2019 +0430
+
+    [meta] Add metadata tags documentation from ot spec
+
+ src/hb-ot-meta.h | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 6b3e093911aaf834c0adf5b2a114d357914322ee
+Merge: 07f27acc 521c7013
+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
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Jul 31 14:58:53 2019 -0700
+
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
+
+commit 521c7013abab84a0994fda3977ccd1ba3d496242
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 30 18:10:40 2019 +0430
+
+    [cpal] revert port to dagger
+    
+    It has a different semantic, maybe we should just do a zero memset,
+    letting Behdad to decide.
+
+ src/hb-ot-color-cpal-table.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 8014ce198a09d20cb947e4a465c7d893a84c55be
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 30 17:31:34 2019 +0430
+
+    [cpal] port to dagger (#1887)
+
+ src/hb-ot-color-cpal-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit d67201da5a2142cb9d039a8cb2cb713556d945af
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 30 17:20:18 2019 +0430
+
+    [colr] minor
+
+ src/hb-ot-color-colr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8c0a2e68ad91e55a11162da0cddb355810a4c8a0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 30 13:16:15 2019 +0430
+
+    [fuzz] Add dummy call of the added APIs (#1886)
+
+ test/api/test-ot-face.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit e5cf9718c07c8bf1fc20cd573cef2d125c28281f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 30 04:44:23 2019 +0430
+
+    [colr][feat][meta] Port sub_array iteration to dagger (#1868)
+
+ src/hb-aat-layout-feat-table.hh | 37 ++++++++++++++++++-------------------
+ src/hb-ot-color-colr-table.hh   | 14 ++++++--------
+ src/hb-ot-meta-table.hh         |  8 +++++---
+ 3 files changed, 29 insertions(+), 30 deletions(-)
+
+commit 9f2b4956b484b802eb37f36974c11785c90493ce
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 30 04:42:51 2019 +0430
+
+    [base] Add hb_ot_layout_get_baseline API
+
+ docs/harfbuzz-sections.txt   |  2 +
+ src/hb-ot-face-table-list.hh |  6 ++-
+ src/hb-ot-layout.cc          | 87 ++++++++++++--------------------------------
+ src/hb-ot-layout.h           | 32 ++++++++++++++++
+ test/api/test-baseline.c     |  4 +-
+ 5 files changed, 63 insertions(+), 68 deletions(-)
+
+commit 40a4b6ddbdc84a25f76bd4d7ff41b1322fe95b83
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 27 13:33:46 2019 +0430
+
+    [var] Add a new API, hb_font_set_var_named_instance
+
+ docs/harfbuzz-sections.txt     |  1 +
+ src/hb-font.cc                 | 28 ++++++++++++++++++++++++++++
+ src/hb-font.h                  |  4 ++++
+ test/api/test-ot-extents-cff.c | 32 ++++++++++++++++++++++++++++++++
+ 4 files changed, 65 insertions(+)
+
+commit b6a2281f1a2d29cc5797f4f266800f7141591585
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 30 03:45:45 2019 +0430
+
+    [meta] Make values match their enum type naming
+
+ src/hb-ot-meta.h        | 10 +++++-----
+ test/api/test-ot-meta.c |  4 ++--
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 20072a2eca8943a82e36cbb603ad31481cfc56cd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 30 03:43:15 2019 +0430
+
+    [metrics] Make values match their enum type naming
+
+ src/hb-ot-font.cc          |  12 +++---
+ src/hb-ot-metrics.cc       | 100 ++++++++++++++++++++++-----------------------
+ src/hb-ot-metrics.h        |  58 +++++++++++++-------------
+ test/api/test-ot-metrics.c |  26 ++++++------
+ 4 files changed, 98 insertions(+), 98 deletions(-)
+
+commit ed2965a8527ee89994c8eecf451bf71846b3ca86
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 30 03:34:10 2019 +0430
+
+    [base] Don't use enum inside the table
+
+ src/hb-ot-layout-base-table.hh | 31 ++++++++++++++-----------------
+ 1 file changed, 14 insertions(+), 17 deletions(-)
+
+commit 388fa9b32611a8726b9bbfe7ccf8cdbcd818fd70
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 27 14:56:18 2019 +0430
+
+    [lcar] flip for and switch position
+
+ src/hb-aat-layout-lcar-table.hh | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+commit f0dd724c1e091f42f289efbebd2c50e830e59c6e
+Merge: 68ac767e 4e1da6bb
+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
+Author: blueshade7 <ariza@typekit.com>
+Date:   Mon Jul 29 12:25:43 2019 -0700
+
+    Merge branch 'master' into var-subset
+
+commit 4e1da6bb612b0c6386ab143dbb4ca19ff25bc2ba
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 29 22:03:56 2019 +0430
+
+    [metrics] Rename hb_ot_metrics_t to hb_ot_metrics_tag_t
+
+ src/hb-ot-metrics.cc | 22 +++++++++++-----------
+ src/hb-ot-metrics.h  | 16 ++++++++--------
+ src/hb-ot-metrics.hh |  6 +++---
+ 3 files changed, 22 insertions(+), 22 deletions(-)
+
+commit 2c2a2b97dbe24ae2e09018f435559c97a460bdcb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 29 22:01:13 2019 +0430
+
+    [meta] Rename hb_ot_meta_t to hb_ot_meta_tag_t
+
+ src/hb-ot-meta-table.hh | 10 +++++-----
+ src/hb-ot-meta.cc       | 10 +++++-----
+ src/hb-ot-meta.h        | 14 +++++++-------
+ src/test-ot-meta.cc     |  4 ++--
+ test/api/test-ot-meta.c |  6 +++---
+ 5 files changed, 22 insertions(+), 22 deletions(-)
+
+commit 7bcc5dfa97a43d9c5f6dfdb87b4f0d5a589ecd48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jul 28 20:55:50 2019 -0700
+
+    [iter] Fix accumulate to accept const types
+
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e21bdf500d4ecc3a5fd6f79aabf6232f3967035e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 28 22:59:09 2019 +0430
+
+    Increase subset fuzzer timeout to 8s
+    
+    Probably we should just remove timeout when running tsan and vaglrind here, the flaky bots
+
+ test/fuzzing/run-subset-fuzzer-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 87454c447d705327a26c1f879e0a4f3002ae2667
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 28 20:46:47 2019 +0430
+
+    [base] fix logic
+
+ src/hb-ot-layout-base-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 69655d5bc3c7b240424545bdef197d9d7251e509
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 28 20:39:20 2019 +0430
+
+    [base] minor
+
+ src/hb-ot-layout-base-table.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit d9c44e7239daf59e283fecd4166c984b43d48e24
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 28 20:35:32 2019 +0430
+
+    [base] Check if the returned base_coord is valid
+
+ src/hb-ot-layout-base-table.hh | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+commit 53853c044a6382ece51393dfc3a4fe6a5f8a5a23
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 28 20:23:48 2019 +0430
+
+    [meta] minor
+
+ src/hb-ot-meta-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ed126d8c37c45d8d60eb0368143c6776d1fcfbff
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 28 20:21:59 2019 +0430
+
+    [base] fix build
+
+ src/hb-ot-layout-base-table.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit c7b22b96cc64c81248362a70f2d60d93ee520f2d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 28 19:46:57 2019 +0430
+
+    [base] minor
+
+ src/hb-ot-layout-base-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit a157342fce2616141ee62d68ad8e3fb93e52187e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 28 18:54:13 2019 +0430
+
+    [base] Fix use of bsearch
+
+ src/hb-ot-layout-base-table.hh | 94 ++++++++++++++----------------------------
+ 1 file changed, 31 insertions(+), 63 deletions(-)
+
+commit eddd45653282ffff8ef002ad2163bcf8bf4f3df1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 28 02:21:54 2019 +0430
+
+    [base] minor spacing
+
+ src/hb-ot-layout-base-table.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 0a18efd766b3b6cc987ee18785f7858fe2bd1c67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 26 14:34:26 2019 -0700
+
+    Minor
+
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 60d0fe2eda9c0eb67f50d61e905b584b8edc3e95
+Merge: 6d53cda1 658424b2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 27 01:20:55 2019 +0430
+
+    Merge pull request #1872 from darktohka/cmake-regex-fix
+    
+    [cmake] Fix CMake build on newer CMake versions
+
+commit 658424b29efbc758541a790193c42171bb7fa965
+Author: Derzsi Dániel <daniel@tohka.us>
+Date:   Fri Jul 26 22:52:03 2019 +0300
+
+    [cmake] Fix CMake build on newer CMake versions
+    
+    Unfortunately, newer CMake versions die during regex variable extraction, causing the build to fail.
+    
+    This is caused by the lack of escaping used around variables in the extract_make_variable function, causing these variables to be automatically unwrapped into empty strings.
+
+ CMakeLists.txt | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6d53cda1baf130853e5725fe8fea1d1c5f766a79
+Author: Zero King <l2dy@icloud.com>
+Date:   Fri Jul 26 15:43:51 2019 +0000
+
+    [util] Fix memory leak
+
+ util/options.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d3d99f8bb6ad77d1ac73901885acfffd3bb3e7f7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 26 16:46:04 2019 +0430
+
+    [metrics] Expose raw OS2/HHEA asc/dsc values using private tags (#1867)
+
+ src/hb-ot-metrics.cc | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit aaffe41094f8ddefad6f33e86cbd04a24dd9bfff
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 26 01:14:37 2019 +0430
+
+    [meta] minor, simplify iterator
+
+ src/hb-ot-meta-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 62932c14bd256f10031380047ededd93a2aacd88
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 26 00:30:29 2019 +0430
+
+    [meta] Rename ot-metadata to ot-meta per review
+
+ docs/harfbuzz-sections.txt                      |  7 +++---
+ src/Makefile.am                                 |  8 +++----
+ src/Makefile.sources                            |  4 ++--
+ src/harfbuzz.cc                                 |  2 +-
+ src/hb-ot-meta-table.hh                         |  8 +++----
+ src/{hb-ot-metadata.cc => hb-ot-meta.cc}        | 22 +++++++++---------
+ src/{hb-ot-metadata.h => hb-ot-meta.h}          | 30 ++++++++++++-------------
+ src/hb-ot.h                                     |  2 +-
+ src/{test-ot-metadata.cc => test-ot-meta.cc}    | 10 ++++-----
+ test/api/Makefile.am                            |  2 +-
+ test/api/{test-ot-metadata.c => test-ot-meta.c} | 26 ++++++++++-----------
+ 11 files changed, 61 insertions(+), 60 deletions(-)
+
+commit 821d9e9034c57c5c593741284b134c76cc3c7c0f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 26 00:08:58 2019 +0430
+
+    Use .sub_array for DataMap tags iteration
+
+ src/hb-ot-meta-table.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit a250af98ae74c94ac3aa069e6e5958a937586bfc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 24 03:10:41 2019 +0430
+
+    [meta] Add max value to hb_ot_metadata_t
+
+ src/hb-ot-metadata.h | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 80e246a1f2b3c4e3c25a4a3ec042e7610944abd4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 24 03:08:34 2019 +0430
+
+    [meta] Add a test program for metadata
+
+ src/Makefile.am         |  5 ++++
+ src/test-ot-metadata.cc | 70 +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 75 insertions(+)
+
+commit bc65ebbce765545bc4455d8ae5ba4a6a99201e41
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 24 02:28:09 2019 +0430
+
+    [meta] hb_ot_metadata_get_entries, tags iteration API
+
+ src/hb-ot-meta-table.hh     | 17 +++++++++++++++++
+ src/hb-ot-metadata.cc       | 28 ++++++++++++++++++++++++----
+ src/hb-ot-metadata.h        |  8 +++++++-
+ test/api/test-ot-metadata.c | 26 ++++++++++++++++++++++++++
+ 4 files changed, 74 insertions(+), 5 deletions(-)
+
+commit 3ac03bd67cb9f4a72e636bf56bc4a79e04bcba62
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 22 23:35:08 2019 +0430
+
+    [meta] New API, hb_ot_metadata_reference_entry for fetching meta entries
+
+ docs/harfbuzz-sections.txt   |   6 +++++
+ src/Makefile.sources         |   2 ++
+ src/harfbuzz.cc              |   1 +
+ src/hb-config.hh             |   1 +
+ src/hb-ot-face-table-list.hh |   4 ++-
+ src/hb-ot-face.cc            |   1 +
+ src/hb-ot-layout.cc          |   1 -
+ src/hb-ot-meta-table.hh      |  20 +++++++++++++++
+ src/hb-ot-metadata.cc        |  57 ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-metadata.h         |  57 ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot.h                  |   1 +
+ test/api/Makefile.am         |   1 +
+ test/api/fonts/meta.ttf      | Bin 0 -> 320 bytes
+ test/api/test-ot-metadata.c  |  58 +++++++++++++++++++++++++++++++++++++++++++
+ 14 files changed, 208 insertions(+), 2 deletions(-)
+
+commit aab8e084873eb098c55ed2569c15bb308c59e436
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 26 02:19:22 2019 +0430
+
+    minor spacing fix (#1869)
+
+ src/hb-open-type.hh     | 16 ++++++++--------
+ src/hb-ot-vorg-table.hh |  2 +-
+ src/hb-vector.hh        |  8 ++++----
+ 3 files changed, 13 insertions(+), 13 deletions(-)
+
+commit d791446a930f8e2009c5ab5ea389da98d1ed9b95
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 26 02:12:06 2019 +0430
+
+    [feat] minor
+
+ src/hb-aat-layout-feat-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 356b68a00afaf972908cb2a478170e3933eaf974
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 25 23:22:00 2019 +0430
+
+    [metrics] Add a test that actually practices variation (#1858)
+
+ test/api/fonts/TestCFF2VF.otf | Bin 0 -> 3636 bytes
+ test/api/test-ot-metrics.c    |  28 ++++++++++++++++++++++++++--
+ 2 files changed, 26 insertions(+), 2 deletions(-)
+
+commit a744fdc6c8217d0d4bfce30e638ed2e5200cf380
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 25 14:49:02 2019 +0430
+
+    Add _MAX_VALUE to hb_ot_metrics_t (#1861)
+
+ src/hb-ot-metrics.cc | 4 ++--
+ src/hb-ot-metrics.h  | 4 +++-
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 069872c51b31fe1a618e3ca5c3b0ab8ccba0cf81
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 25 14:27:43 2019 +0430
+
+    minor
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 737eb85a4ec8861791157d83dd170ac48fa2cfc7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 25 14:26:30 2019 +0430
+
+    Add _MAX_VALUE to disabled baseline types enum
+
+ src/hb-ot-layout.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit dd9a0ed3f0c0a8a94e107689318463d62414cf60
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 24 00:47:19 2019 +0430
+
+    Replace 0x7FFFFFFFu in enums with HB_TAG_MAX_SIGNED
+
+ src/hb-aat-layout.h | 4 ++--
+ src/hb-ot-var.h     | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 5988ab8a4e0d2b6d174f2ff0f18addc3f41b7a94
+Merge: 4cba7bda 636ae422
+Author: blueshade7 <ariza@typekit.com>
+Date:   Mon Jul 22 14:36:16 2019 -0700
+
+    Merge branch 'master' into var-subset
+
+commit 636ae422372ed7f17b695e78c9c9015188b204e8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 22 22:50:21 2019 +0430
+
+    minor, comment out meta table in list till its use
+
+ src/hb-ot-face-table-list.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 04c11a19b75663af35d16c827e295aa2e555d110
+Merge: 41ab56e0 c9796d15
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Jul 22 16:44:47 2019 +0200
+
+    Merge pull request #1851 from khaledhosny/fix-sbix-extents
+    
+    Fix sbix glyph extents
+
+commit 41ab56e09586b675b1c5de745cf5f520a808bba1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 22 18:46:52 2019 +0430
+
+    Implement meta table parsing
+
+ src/Makefile.sources         |  1 +
+ src/hb-ot-face-table-list.hh |  1 +
+ src/hb-ot-layout.cc          | 15 ++++----
+ src/hb-ot-meta-table.hh      | 89 ++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 99 insertions(+), 7 deletions(-)
+
+commit a51aa951b5ad8da4ac7effc891437345e012a0ac
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 22 18:35:55 2019 +0430
+
+    [metrics] Fix _get_variation API to works with actual coord values
+
+ src/hb-ot-metrics.cc       | 16 ++++++++--------
+ src/hb-ot-metrics.h        |  2 +-
+ test/api/test-ot-metrics.c |  2 +-
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 77141dff7d73fa6290f51c9e1ca56ce51a5deec0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 22 07:48:32 2019 -0400
+
+    [metrics] _-prefix internal symbol
+
+ src/hb-ot-font.cc    | 12 ++++++------
+ src/hb-ot-metrics.cc |  8 ++++----
+ src/hb-ot-metrics.hh |  6 +++---
+ 3 files changed, 13 insertions(+), 13 deletions(-)
+
+commit 89228ccb9a81b728bc9955082c17c68c848c50c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jul 22 07:07:37 2019 -0400
+
+    Fix warning on IBM compilers
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1852
+
+ src/hb.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c9796d15e1ec5f8939f8b1ae368cb3352b6a9cb9
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Jul 22 03:57:24 2019 +0200
+
+    Fix sbix glyph extents
+    
+    * The ‘height’ needs to be negated since the API returns “distance from
+      top to bottom side”.
+    * Similarly, the ‘y_offset‘ needs to be added to the height to get the
+      ‘y_bearing’, since sbix’s offset is “the point in the glyph relative
+      to its lower-left corner which corresponds to the origin” while
+      ‘y_bearing’ is the “top side of glyph from origin”.
+    
+    With these changes the sbix glyph metrics return values similar to other
+    tables, as they were otherwise unusable.
+
+ src/hb-ot-color-sbix-table.hh                            |   4 ++--
+ test/api/test-ot-color.c                                 |   4 ++--
+ .../fonts/fcbaa518d3cce441ed37ae3b1fed6a19e9b54efd.ttf   | Bin 0 -> 3128 bytes
+ test/shaping/data/in-house/tests/color-fonts.tests       |   1 +
+ 4 files changed, 5 insertions(+), 4 deletions(-)
+
+commit 759f3bd486c99bb09fb9fa5f42e621ec21399df8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 22 02:06:07 2019 +0430
+
+    [metrics] Don't use metrics API in _common
+    
+    As it is exposed with a different condition
+
+ src/hb-ot-metrics.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eb8bd2f7eccde483d33406f102c69260fde6fe23
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 16 22:27:01 2019 +0430
+
+    Add hb_gdi_face_create API
+    
+    Based on Konstantin Ritt work posted on mailing list
+
+ CMakeLists.txt             |  8 +++++
+ appveyor.yml               |  2 +-
+ configure.ac               | 23 +++++++++++++++
+ docs/harfbuzz-sections.txt |  5 ++++
+ src/Makefile.am            |  8 +++++
+ src/Makefile.sources       |  3 ++
+ src/harfbuzz.cc            |  1 +
+ src/hb-directwrite.cc      |  9 ++----
+ src/hb-gdi.cc              | 73 ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-gdi.h               | 39 +++++++++++++++++++++++++
+ src/hb-uniscribe.cc        |  7 -----
+ src/hb.hh                  |  5 ++++
+ 12 files changed, 168 insertions(+), 15 deletions(-)
+
+commit 3d03bb84d44bc9ef8a77e974d0e937a3385ffb92
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jul 21 12:38:04 2019 +0430
+
+    [metrics] minor, tweak comment
+
+ src/hb-ot-metrics.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e540d402f6120e8761ff655bdbffb07d91a5f643
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 19 11:19:31 2019 -0700
+
+    [docs] Minor
+
+ docs/harfbuzz-sections.txt | 2 ++
+ src/hb-ot-math.h           | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 00e13985fbc5291850b8ea3d021e5f83c8a297e3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 23:03:51 2019 +0430
+
+    Revert hhea fallback to OS/2 to its reverse way
+    
+    As searching number of hhea having fonts beats the number of OS/2
+    having ones in macOS 10.14.2
+
+ src/hb-ot-metrics.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit c13ef9cc64a447e74abfed75f4f418bf644be88d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 15:01:37 2019 +0430
+
+    Bring back asc/desc abs logic used to be in hmtx table
+
+ src/hb-ot-metrics.cc | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+commit 772e62688cd72c02910f623653d2ec8ef6990928
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 14:50:31 2019 +0430
+
+    Make HB_TINY builds work again by separating the always needed part
+
+ src/hb-ot-font.cc    | 12 +++++-----
+ src/hb-ot-metrics.cc | 62 ++++++++++++++++++++++++++++++++++++++++------------
+ src/hb-ot-metrics.hh |  5 +++++
+ 3 files changed, 59 insertions(+), 20 deletions(-)
+
+commit cb704337407ae9ccb57ae7631567002028b93c84
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 14:33:57 2019 +0430
+
+    Merge _get_position_internal into _get_position
+
+ src/hb-ot-metrics.cc | 143 ++++++++++++++++++---------------------------------
+ src/hb-ot-metrics.hh |   5 --
+ 2 files changed, 49 insertions(+), 99 deletions(-)
+
+commit ac3518af58464b33f1b16b34b8846c302b935208
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 14:03:36 2019 +0430
+
+    Define post table only when used
+
+ src/hb-ot-face-table-list.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 471f798ace08b4551f0c9ead6855a4e49b72ba25
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 14:00:20 2019 +0430
+
+    Merge ot-metrics-internal.cc with ot-metrics now that isn't needed in subset
+
+ src/Makefile.sources          |   3 --
+ src/harfbuzz.cc               |   1 -
+ src/hb-ot-metrics-internal.cc | 100 ------------------------------------------
+ src/hb-ot-metrics.cc          |  71 +++++++++++++++++++++++++++++-
+ 4 files changed, 70 insertions(+), 105 deletions(-)
+
+commit 29444d7e9fd5007bf39efa2cf57a0117aabfc770
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 13:52:21 2019 +0430
+
+    Don't cache ascender/descender metrics
+
+ src/hb-ot-font.cc       | 24 ++++++++----------------
+ src/hb-ot-hmtx-table.hh | 20 --------------------
+ 2 files changed, 8 insertions(+), 36 deletions(-)
+
+commit 5e28c2654d030655d7b93ec0d6213d2b9fb2956e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 14:08:11 2019 +0430
+
+    [doc] minor, improve hb-ot-metrics doc a bit
+
+ src/hb-ot-metrics.cc | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit ac8b6e330a443a66c3e0fb83af9794310688d848
+Merge: ec8dde81 08b48e89
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 13:16:16 2019 +0430
+
+    Merge pull request #1844 from ebraminio/hhea
+    
+    Fallback hhea's ascender/descender to OS2
+
+commit 08b48e89d3c1bafe252badc7c65a9fc2f166a693
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 12:53:40 2019 +0430
+
+    [os2] minor spacing tweaks
+
+ src/hb-ot-os2-table.hh | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit 54b9ab704dbf62e2916f1d5276ffef2543bcc2a7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jul 20 12:51:38 2019 +0430
+
+    Fallback hhea's ascender/descender to OS2
+
+ src/hb-ot-metrics-internal.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit ec8dde8142fbf9e5bc0aee9318a7c4e73d61c758
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 19 11:13:50 2019 -0700
+
+    [metrics] Fall back to hhea if OS2 metrics are empty
+    
+    Reinstates previous logic, even if it might be unnecessary.
+
+ src/hb-ot-metrics-internal.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 2e5b49d11d1dbfd44d8c640cb9ce5de7d26ca873
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 19 11:41:07 2019 +0430
+
+    Add HB_NO_METRICS and fix HB_TINY build (#1839)
+
+ src/hb-config.hh              | 1 +
+ src/hb-ot-face-table-list.hh  | 2 --
+ src/hb-ot-metrics-internal.cc | 8 +++++++-
+ src/hb-ot-metrics.cc          | 6 ++++++
+ 4 files changed, 14 insertions(+), 3 deletions(-)
+
+commit bdfdac0f26aafb3e9ff2db123116f0406fa49efc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 19 10:33:00 2019 +0430
+
+    [ci][fuzzer] print valgrind failure if an error happened
+
+ test/fuzzing/run-shape-fuzzer-tests.py | 34 +++++++++++++++++-----------------
+ 1 file changed, 17 insertions(+), 17 deletions(-)
+
+commit 2bd953ff4f656f042dba2845f0479a7fe7c439a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 18 14:25:45 2019 -0700
+
+    [metrics] Fix weird use of xor
+    
+    I believe that was a try to use one approach as fallback to other.  But
+    felt wrong.  Just believe what's in OS/2 table to be correct.
+
+ src/hb-ot-metrics-internal.cc | 12 ++++++------
+ src/hb-ot-os2-table.hh        |  2 +-
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 9675a067bf1cc0e5d4707c1345736fda4be75b82
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jul 18 14:15:08 2019 -0700
+
+    [ot-metrics] Touch up
+
+ src/harfbuzz.cc         |  2 ++
+ src/hb-ot-hmtx-table.hh | 19 +++++++++----------
+ 2 files changed, 11 insertions(+), 10 deletions(-)
+
+commit 87e628436e32786635796fbb07ed200f8c0da68f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Nov 20 23:26:46 2018 +0330
+
+    Implement a simple API for fetching opentype metrics
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1432
+
+ docs/harfbuzz-sections.txt    |   9 +++
+ src/Makefile.sources          |   6 ++
+ src/hb-ot-face-table-list.hh  |   2 +
+ src/hb-ot-hhea-table.hh       |   2 +
+ src/hb-ot-hmtx-table.hh       |  62 +++++++++----------
+ src/hb-ot-layout.cc           |   1 -
+ src/hb-ot-metrics-internal.cc |  94 +++++++++++++++++++++++++++++
+ src/hb-ot-metrics.cc          | 135 ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-metrics.h           |  92 ++++++++++++++++++++++++++++
+ src/hb-ot-metrics.hh          |  35 +++++++++++
+ src/hb-ot-os2-table.hh        |   4 ++
+ src/hb-ot-post-table.hh       |   5 +-
+ src/hb-ot.h                   |   1 +
+ test/api/Makefile.am          |   1 +
+ test/api/test-ot-metrics.c    |  54 +++++++++++++++++
+ 15 files changed, 467 insertions(+), 36 deletions(-)
+
+commit 4cba7bdae94d21ae780b5a71186c5d6da0800fa2
+Author: blueshade7 <ariza@typekit.com>
+Date:   Thu Jul 18 14:03:33 2019 -0700
+
+    regenerate Confortaa subset test expected results
+
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 97204 -> 182944 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 65976 -> 151740 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 65936 -> 151676 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 96948 -> 182688 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 97244 -> 183008 bytes
+ 5 files changed, 0 insertions(+), 0 deletions(-)
+
+commit ed67efcc8c3638c625b2904833af3f27ef51db14
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Jun 17 10:16:24 2019 -0400
+
+    Revert "[Myanmar] Prevent reordering between Asat and Dot below"
+    
+    This reverts commit 1c8654ead41ca746d577549c92d2a41c594ab639.
+
+ src/hb-unicode.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit a76d8b0d5531a6a8d682ea9d5150ee7893932269
+Merge: 386a4a64 504bb172
+Author: blueshade7 <ariza@typekit.com>
+Date:   Wed Jul 17 14:12:06 2019 -0700
+
+    Merge commit '504bb17287c978d60a4a515555852465319f74ed' into var-subset
+
+commit 504bb17287c978d60a4a515555852465319f74ed
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 17 22:57:46 2019 +0430
+
+    [ci] Bring back -linux-arm64 bot
+    
+    Let's see if 576065b has fixed it
+
+ .circleci/config.yml | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 6157bbe5127bbcbd17348622601976cffcd11c63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 17 11:20:08 2019 -0700
+
+    Revert "Revert previous change"
+    
+    This reverts commit b8e90ca1a10fbd472eda1aa8cc3797011da52356.
+    
+    Works now.
+
+ src/hb-subset-plan.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 576065b4429109359c3af491b34b9ab0c6b149ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 17 11:19:34 2019 -0700
+
+    [iter] Fix reduce type deduction
+
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4552864c82c876da738ec3bf772cc089216f2fd2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 17 22:08:39 2019 +0430
+
+    [ci] Disable -linux-arm64 bot
+    
+    This is its failure https://circleci.com/gh/harfbuzz/harfbuzz/99864
+    
+    Trying to fix like ee05627, interestingly, makes the bot and the
+    others to fail like this https://circleci.com/gh/harfbuzz/harfbuzz/99841
+
+ .circleci/config.yml | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit b8e90ca1a10fbd472eda1aa8cc3797011da52356
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 17 21:38:19 2019 +0430
+
+    Revert previous change
+    
+    Interestingly all of the bots disagreed with the change and the complain is... weird.
+
+ src/hb-subset-plan.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ee05627aff2993c51ed8a4bff3170450c000a28a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 17 21:28:25 2019 +0430
+
+    Improve syntax to make out linux-arm64 a little happy
+    
+    Decided to apply is we did the same on other places however this won't
+    fix all of its complains
+
+ src/hb-subset-plan.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6a6bf7b7bc4a0b375fcf04ff7c674bf76e6d51aa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 17 21:22:38 2019 +0430
+
+    Downgrade -Wdeprecated-declarations to warning
+    
+    Fixes #1834 at least till fix of #1829
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 25e2562fdff6c14a9cb70999a1ad71ee1bdff494
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 17 09:35:56 2019 -0700
+
+    [amalgam] Fix redundant-declaration warning/error
+
+ src/hb-unicode.cc | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit c184180228540c23405aaa03b6b571bb41103b45
+Author: Ali Javadi <ali.djavadi@gmail.com>
+Date:   Tue Jul 16 22:10:24 2019 +0430
+
+    Fix C++20 compile warning on implicit capture of this with '=' default capture (#1833)
+    
+    Happens when compiled with -std=c++2a, the fix just makes the captures explicit to resolve the issue. Just adding this in addition to = doesn't work in C++11.
+    
+    src/hb-ot-layout-gpos-table.hh:737:18: warning: implicit capture of 'this' with a capture default of '=' is deprecated [-Wdeprecated-this-capture]
+                  { return (this+_).intersects (glyphs, valueFormat); })
+                            ^
+    src/hb-ot-layout-gpos-table.hh:736:16: note: add an explicit capture of 'this' to capture '*this' by reference
+        | hb_map ([=] (const OffsetTo<PairSet> &_)
+                   ^
+                    , this
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1f94388516befe137d265c261f687a47ce6f8e69
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jul 16 11:24:29 2019 +0430
+
+    [usp] define atfree callback only if used
+
+ src/hb-uniscribe.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 1da1b4dc94c500e4c9c833ab74fced07364d13fb
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Jun 26 13:23:24 2019 -0700
+
+    [subset] For option "--unicodes",  add support for "*" to retain all code points
+
+ ...aa-Regular-new.default.retain-all-codepoint.ttf | Bin 0 -> 97204 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 0 -> 65976 bytes
+ ...Regular-new.drop-hints.retain-all-codepoint.ttf | Bin 0 -> 65936 bytes
+ ...a-Regular-new.name-ids.retain-all-codepoint.ttf | Bin 0 -> 96948 bytes
+ ...egular-new.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 97244 bytes
+ ...to-Regular.abc.default.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
+ ...drop-hints-retain-gids.retain-all-codepoint.ttf | Bin 0 -> 924 bytes
+ ...Regular.abc.drop-hints.retain-all-codepoint.ttf | Bin 0 -> 924 bytes
+ ...o-Regular.abc.name-ids.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
+ ...egular.abc.retain-gids.retain-all-codepoint.ttf | Bin 0 -> 2168 bytes
+ test/subset/data/tests/basics.tests                |   1 +
+ test/subset/subset_test_suite.py                   |  20 +++++++---
+ util/hb-subset.cc                                  |   7 ++++
+ util/options.cc                                    |  44 ++++++++++++---------
+ 14 files changed, 48 insertions(+), 24 deletions(-)
+
+commit 68ac767e430c4dfe4c556b2c4f962cc3dfc5d3e4
+Author: blueshade7 <ariza@typekit.com>
+Date:   Fri Jul 12 23:02:29 2019 -0700
+
+    added skip(), get_next_value() to inc_bimap to subset VarStore with retain-gids
+
+ src/hb-bimap.hh            | 25 ++++++++++++++++++++++++-
+ src/hb-ot-layout-common.hh | 14 +++++++-------
+ 2 files changed, 31 insertions(+), 8 deletions(-)
+
+commit 386a4a64f5ae0e2ba941f80966585a0a66813576
+Author: blueshade7 <ariza@typekit.com>
+Date:   Fri Jul 12 17:05:34 2019 -0700
+
+    regenerate subset api test result SourceHanSans-Regular.41,4C2E.retaingids.otf
+
+ .../SourceHanSans-Regular.41,4C2E.retaingids.otf      | Bin 2736 -> 2664 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 670768e5b9f24958f60a74f3d194b24333def446
+Author: blueshade7 <ariza@typekit.com>
+Date:   Fri Jul 12 16:14:23 2019 -0700
+
+    fix inc-bimap for subsetting VarStore with retain-gids
+
+ src/hb-bimap.hh                                    |  19 ++++++++-
+ src/hb-ot-layout-common.hh                         |  43 ++++++++++-----------
+ src/hb-ot-var-hvar-table.hh                        |   5 ++-
+ test/api/fonts/AdobeVFPrototype.ac.retaingids.otf  | Bin 6416 -> 6412 bytes
+ .../SourceHanSans-Regular.41,4C2E.retaingids.otf   | Bin 2656 -> 2736 bytes
+ .../SourceSansVariable-Roman.ac.retaingids.ttf     | Bin 2616 -> 2616 bytes
+ ...ourceSerifVariable-Roman-VVAR.ac.retaingids.ttf | Bin 5296 -> 5288 bytes
+ 7 files changed, 42 insertions(+), 25 deletions(-)
+
+commit 4730b350b7ee90338caf3e962343af42412ce3df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 12 15:38:35 2019 -0700
+
+    Revert "Update Graphite API to latest (#1215)"
+    
+    This reverts commit e4e74c2751ac24178086cce2811d34d8019b6f85.
+    
+    See https://github.com/harfbuzz/harfbuzz/issues/1829
+
+ src/hb-graphite2.cc | 28 +---------------------------
+ 1 file changed, 1 insertion(+), 27 deletions(-)
+
+commit f8242b61ab01002e9f7374daa8755e92c6a92eb4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 11 15:10:36 2019 +0430
+
+    [fuzz] Increase subset runner timeout for tsan bot
+    
+    Now is flaky let's just increase and maybe investigate later
+
+ test/fuzzing/run-subset-fuzzer-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b65bad18aa527684af999b5808a9087404c0759a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 11 14:31:55 2019 +0430
+
+    [fuzz] Don't fail when blob is empty
+    
+    And enable more tests able to trig the issue.
+
+ ...zz-testcase-minimized-hb-subset-fuzzer-5738978499624960 | Bin 0 -> 28 bytes
+ test/fuzzing/hb-subset-fuzzer.cc                           |   2 +-
+ test/fuzzing/run-subset-fuzzer-tests.py                    |   9 +++++----
+ 3 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 7a9d643c297990f9889a2f7b4a470ef933bac131
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jul 11 01:35:06 2019 +0430
+
+    Fix unintialized memory read in cmap subset (#1826)
+
+ src/hb-ot-cmap-table.hh | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit a6065d05cf38620c06b6dd10b8a841ed236f76c2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 10 16:41:40 2019 +0430
+
+    Don't call memcpy when a table is empty
+
+ src/hb-open-file.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit c85f624b519df1db141bf55d9452bc2837ef35c4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 10 14:28:06 2019 +0430
+
+    Force blob generation and memory check in hb-subset-fuzzer
+
+ test/fuzzing/hb-subset-fuzzer.cc | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 0eef8113d8a7940b4529a340790976a577fe829e
+Author: blueshade7 <ariza@typekit.com>
+Date:   Tue Jul 9 11:43:59 2019 -0700
+
+    retain gids in HVAR so in sync with fontTools
+    regenerate Comfortaa subset test results
+
+ src/hb-bimap.hh                                    |   6 +
+ src/hb-ot-var-hvar-table.hh                        | 123 +++++++++++++--------
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 6492 -> 7460 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 6316 -> 7104 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 6148 -> 6752 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 6088 -> 6696 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 6068 -> 6676 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 3284 -> 4912 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 3164 -> 4620 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 2868 -> 4056 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 3020 -> 4296 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 3024 -> 4304 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 1952 -> 2920 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 1832 -> 2620 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 1704 -> 2308 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 1688 -> 2296 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 1688 -> 2296 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 6236 -> 7204 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 6060 -> 6848 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 5892 -> 6496 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 5832 -> 6440 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 5812 -> 6420 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 7824 -> 9452 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 7648 -> 9104 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 7312 -> 8500 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 7420 -> 8696 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 7404 -> 8684 bytes
+ test/subset/run-tests.py                           |   2 +-
+ 28 files changed, 85 insertions(+), 46 deletions(-)
+
+commit a87fbb872b31c7a292ed8b414be728aa951e2833
+Merge: 49252c42 6e35668b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Jul 9 10:25:54 2019 -0700
+
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
+
+commit 6e35668b452cef86702e2563f4006a1db5d8fd74
+Author: blueshade7 <ariza@typekit.com>
+Date:   Tue Jul 9 09:47:54 2019 -0700
+
+    fix var-subset build
+
+ src/harfbuzz.cc          | 1 +
+ test/subset/run-tests.py | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit 8bf989ea70804dad66fb1c2d0c625ef5e562a309
+Merge: 5763a927 2e7021da
+Author: blueshade7 <ariza@typekit.com>
+Date:   Mon Jul 8 17:13:29 2019 -0700
+
+    update from master
+
+commit 2e7021da7d1726a37822e6a001b9218f82255bc8
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Mon Jul 8 10:19:49 2019 +0300
+
+    Revert "Minor" - revert moving extern "C" definitions in-function
+    
+    This reverts commit 62e60322cb9e18b3ee75f1b4a2a6d3069f587407 since it
+    breaks building HarfBuzz as part of Chromium.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1821.
+
+ src/hb-unicode.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit f18ea1dd3a9961661a383b2966de57ea68a267e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 5 13:56:45 2019 -0700
+
+    [font] Remove division when scaling
+    
+    Yoohoo.  This seems to be precise enough!  Let's see if it sticks.
+    I'm asking Dominik to run this in Chrome test suite and report.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1801
+
+ src/hb-font.hh          | 23 +++++++++--------------
+ src/hb-ot-math-table.hh | 16 ++++++++--------
+ 2 files changed, 17 insertions(+), 22 deletions(-)
+
+commit b847769292aca13345fd1facae35aaf999198ad4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 5 13:52:09 2019 -0700
+
+    [font] Keep font-space to user-space multiplier
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1801
+
+ src/hb-font.cc |  5 +++++
+ src/hb-font.hh | 13 +++++++++++--
+ 2 files changed, 16 insertions(+), 2 deletions(-)
+
+commit df6edcd44ceb63d01d9c0d6d2aa06b6c6cbb914d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 5 13:45:15 2019 -0700
+
+    Make face immutable in hb_font_set_face()
+
+ src/hb-font.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0d425e1eeaea97bf5e4fc9ce40e549332bc0cea1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 5 13:18:05 2019 -0700
+
+    [ot-font] Optimize rounding
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1801
+    
+    The assumption that compiler optimizes "upem/2" to a shift only
+    works if upem is unsigned...  Anyway, spoon-feed the compiler.
+
+ src/hb-font.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 144326e215671a42fb3ac9f00ddef779ba354345
+Author: Simon Sapin <simon.sapin@exyr.org>
+Date:   Fri Jul 5 19:05:11 2019 +0200
+
+    Clusters are reversed based on the direction, not script
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1818
+
+ docs/usermanual-clusters.xml | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit cf1a782a5ca82a880906cae3d4cb76b10ec2aad2
+Author: Simon Sapin <simon.sapin@exyr.org>
+Date:   Thu Jul 4 21:06:59 2019 +0200
+
+    Docs: fix a typo in function name
+
+ docs/usermanual-fonts-and-faces.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ffa736f151f27adb76fb0bf91e18e1ec5cb8fe8d
+Author: Simon Sapin <simon.sapin@exyr.org>
+Date:   Thu Jul 4 23:05:50 2019 +0200
+
+    hb_set_previous_range docs: fix presumed copy/paste error
+
+ src/hb-set.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 641f33738089ef7ccbedce09886309edcd2e1718
+Author: Simon Sapin <simon.sapin@exyr.org>
+Date:   Thu Jul 4 23:03:45 2019 +0200
+
+    Docs typo fix: slower → lower
+
+ src/hb-set.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9fea6b4dd41bfe2b85f788523162658a7ab9bd49
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jul 5 18:46:41 2019 +0430
+
+    [amalgam] Use it in cmake port and fix conflicts (#1812)
+
+ .circleci/config.yml           |  8 ++---
+ CMakeLists.txt                 | 74 ++++--------------------------------------
+ src/Makefile.am                |  2 ++
+ src/hb-cff-interp-common.hh    |  6 ++--
+ src/hb-cff-interp-cs-common.hh |  2 +-
+ src/hb-coretext.cc             |  4 +--
+ src/hb-directwrite.cc          | 14 ++++----
+ src/hb-ft.cc                   |  4 +--
+ 8 files changed, 27 insertions(+), 87 deletions(-)
+
+commit b240d701fd98efa59a7f772ff39654fc95b8fc8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 3 12:17:57 2019 -0700
+
+    [amalgam] Include integration source files as well
+    
+    Just for those that are normally built into libharfbuzz itself.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+
+ src/Makefile.am | 12 ++++++++++--
+ src/harfbuzz.cc |  6 ++++++
+ 2 files changed, 16 insertions(+), 2 deletions(-)
+
+commit d51524204528b36907ab0f48bf2a48ec124c93d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 3 12:10:03 2019 -0700
+
+    [amalgam] Rename hb.cc to harfbuzz.cc
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+
+ src/Makefile.am            | 8 ++++----
+ src/{hb.cc => harfbuzz.cc} | 0
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 4cb180d227c1adc32e921c241a93cd1f50a98d33
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 19:44:18 2019 -0700
+
+    Revert "Use constexpr to replace passthru_ bools"
+    
+    This reverts commit c4aa10ebc8dc28b1f9c90af2ca2092a7535f8395.
+    
+    Broke several compilers... Sigh.  The version without constexpr
+    didn't fully optimize out the unreachable code on clang.
+    So, revert it is...
+
+ src/hb-algs.hh |  8 ++++++++
+ src/hb-set.hh  | 18 ++++++++----------
+ 2 files changed, 16 insertions(+), 10 deletions(-)
+
+commit c4aa10ebc8dc28b1f9c90af2ca2092a7535f8395
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 19:15:03 2019 -0700
+
+    Use constexpr to replace passthru_ bools
+
+ src/hb-algs.hh |  8 --------
+ src/hb-set.hh  | 18 ++++++++++--------
+ 2 files changed, 10 insertions(+), 16 deletions(-)
+
+commit 2e48fd077954410f59156b3100c16bf56a507948
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 17:55:58 2019 -0700
+
+    Sprinkle constexpr around
+    
+    Being conservative.  Also not sure it makes any real difference
+    in our codebase.
+
+ src/hb-algs.hh | 48 ++++++++++++++++++++++++------------------------
+ src/hb-meta.hh | 18 +++++++++---------
+ 2 files changed, 33 insertions(+), 33 deletions(-)
+
+commit df4448064e370a410404708a15ce819daf1d9386
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 17:11:09 2019 -0700
+
+    Remove unused 'inline' specifier
+
+ src/hb-ot-map.hh     |  4 ++--
+ src/hb-shape-plan.hh | 18 +++++++++---------
+ 2 files changed, 11 insertions(+), 11 deletions(-)
+
+commit 04a4957040380bba58880ff51d529c5cccf1d2c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 16:19:18 2019 -0700
+
+    [amalgam] Add hb.cc to git
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+
+ src/Makefile.am |  1 +
+ src/hb.cc       | 44 ++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 45 insertions(+)
+
+commit 62e60322cb9e18b3ee75f1b4a2a6d3069f587407
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 16:07:03 2019 -0700
+
+    Minor
+
+ src/hb-unicode.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit ceb4c212dc91a277f646c4a5354e4362f548a9f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 16:02:13 2019 -0700
+
+    [amalgam] Fix UCD issue
+    
+    This actually makes it build now!
+    
+    Part https://github.com/harfbuzz/harfbuzz/issues/1809
+    
+    Keeping open to add tests, CI, etc.
+
+ src/hb-ucd.cc     | 5 +----
+ src/hb-unicode.cc | 2 --
+ src/hb-unicode.hh | 3 +++
+ 3 files changed, 4 insertions(+), 6 deletions(-)
+
+commit 7ca54811f471a28163de6b3c561990c85aa39880
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 16:00:58 2019 -0700
+
+    [amalgam] Fix CFF
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+
+ src/hb-ot-cff1-table.cc | 18 +++++++++---------
+ src/hb-ot-cff2-table.cc | 16 ++++++++--------
+ 2 files changed, 17 insertions(+), 17 deletions(-)
+
+commit 3724f13ba0292055197efdbfcacfe3d7b067175c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 15:23:00 2019 -0700
+
+    [amalgam] Finish fixing Indic-like shapers
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+
+ src/hb-ot-shape-complex-indic.cc   | 34 +++++++++++++++++-----------------
+ src/hb-ot-shape-complex-indic.hh   |  9 ++++++++-
+ src/hb-ot-shape-complex-khmer.cc   | 18 +++++++++---------
+ src/hb-ot-shape-complex-khmer.hh   | 17 ++++++++---------
+ src/hb-ot-shape-complex-myanmar.cc |  8 ++++----
+ src/hb-ot-shape-complex-myanmar.hh | 16 ++++++++--------
+ src/hb-ot-shape-complex-use.cc     | 14 +++++++-------
+ 7 files changed, 61 insertions(+), 55 deletions(-)
+
+commit eb37bc9d93b3abebee24390708940510fe37477a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 15:19:39 2019 -0700
+
+    [use] Remove Syriac features
+    
+    This was non-standard, and unused anyway.
+
+ src/hb-ot-shape-complex-use.cc | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit dc480fc4717937d53cf38860a5c5d48211e8cbc8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 15:17:56 2019 -0700
+
+    [amalgam] More Indic-like issues
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+
+ src/hb-ot-shape-complex-indic.cc | 76 +++++++++++++++++++++-------------------
+ src/hb-ot-shape-complex-khmer.cc | 36 ++++++++++---------
+ src/hb-ot-shape-complex-use.cc   | 32 ++++++++---------
+ 3 files changed, 74 insertions(+), 70 deletions(-)
+
+commit d8b5353e07650cf243ba182dbf52e7f198719762
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 15:09:26 2019 -0700
+
+    [amalgam] More
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+
+ src/hb-ot-shape-complex-myanmar.cc | 28 ++++++++++++++--------------
+ src/hb-ot-shape-complex-use.cc     | 28 ++++++++++++++--------------
+ 2 files changed, 28 insertions(+), 28 deletions(-)
+
+commit d115a9e022c0b687fb402cfd2b90d516beded5c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 14:42:45 2019 -0700
+
+    [amalgam] Fix most duplicate-id instances in Indic-like shapers
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+
+ src/hb-ot-layout.hh                        |  22 +++++
+ src/hb-ot-shape-complex-indic-machine.hh   |   6 +-
+ src/hb-ot-shape-complex-indic-machine.rl   |   6 +-
+ src/hb-ot-shape-complex-indic.cc           | 130 +++++++++----------------
+ src/hb-ot-shape-complex-indic.hh           |  26 +++++
+ src/hb-ot-shape-complex-khmer-machine.hh   |   6 +-
+ src/hb-ot-shape-complex-khmer-machine.rl   |   6 +-
+ src/hb-ot-shape-complex-khmer.cc           |  97 ++++++-------------
+ src/hb-ot-shape-complex-myanmar-machine.hh |   4 +-
+ src/hb-ot-shape-complex-myanmar-machine.rl |   4 +-
+ src/hb-ot-shape-complex-myanmar.cc         |  69 ++++++--------
+ src/hb-ot-shape-complex-use-machine.hh     |   4 +-
+ src/hb-ot-shape-complex-use-machine.rl     |   4 +-
+ src/hb-ot-shape-complex-use.cc             | 148 ++++++++++++-----------------
+ 14 files changed, 230 insertions(+), 302 deletions(-)
+
+commit c073233f45da6ad8131dd38cb43b125f48c17432
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 14:26:45 2019 -0700
+
+    Add make rule to build hb.cc
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1809
+
+ src/Makefile.am | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit f1d20d9b4dcbeead3757650b9286393918b4be8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 2 14:18:38 2019 -0700
+
+    Add ucd-table make target
+
+ src/Makefile.am      | 23 +++++++++++++++--------
+ src/gen-ucd-table.py |  8 +++++---
+ 2 files changed, 20 insertions(+), 11 deletions(-)
+
+commit 634390ecaf600176245e3354edd8dfdcb7f64cc5
+Author: blueshade7 <ariza@typekit.com>
+Date:   Mon Jul 1 18:52:57 2019 -0700
+
+    added VariationStore serializer to be used by HVAR/VVAR subsetters
+
+ src/hb-ot-layout-common.hh | 165 ++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 163 insertions(+), 2 deletions(-)
+
+commit 5763a92749386e134f2b4073531c10e9586d1d19
+Merge: 6f35cf7a 6bcbe495
+Author: Michiharu Ariza <ariza@typekit.com>
+Date:   Mon Jul 1 15:17:19 2019 -0700
+
+    Merge branch 'master' into var-subset
+
+commit 040b261deeed8924edcb087e27a61392d1f85023
+Author: Michiharu Ariza <ariza@typekit.com>
+Date:   Sun Jun 30 16:13:07 2019 -0700
+
+    add bimap test along with bug fix/tweaks
+
+ src/Makefile.am   |  6 ++++-
+ src/hb-bimap.hh   |  4 +++
+ src/test-bimap.cc | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 85 insertions(+), 1 deletion(-)
+
+commit 9c93f5cc2de5c60d5464a65890fc7d8c25aa9702
+Merge: ad341d5f 4ab2d1d6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 1 20:08:22 2019 +0430
+
+    Merge pull request #1806 from carlo-bramini/master
+    
+    Make harfbuzz working on all existing versions of Windows
+
+commit 4ab2d1d6767568c45495be515e016805cce0c69a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jul 1 19:30:21 2019 +0430
+
+    [dwrite] Apply minor style improves
+
+ src/hb-directwrite.cc | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 5ebd265e66cbcd167469837dcf8647484310dfb5
+Author: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com>
+Date:   Mon Jul 1 16:06:43 2019 +0200
+
+    Fix error rised by GCC8+
+
+ src/hb-directwrite.cc | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 693dacbb1c0bc805e3e6aedaca5a57f04eb6ec9c
+Author: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com>
+Date:   Mon Jul 1 13:31:26 2019 +0200
+
+    Use lower case file name with #include
+    
+    I tried to cross compile harfbuzz for Windows and an error was generated because `DWrite_1.h` was not found.
+    This happened because the filesystem is case sensitive and for this reason that include file was not found.
+    The right name of the file to be used is `dwrite_1.h`, with all letters not capitalized:
+    https://docs.microsoft.com/en-us/windows/desktop/api/dwrite_1/
+    I also verified in the installation of VS2017 with Windows Kit v10 and in that place it was also lower case.
+    So, in my opinion it should be better to change this.
+
+ src/hb-directwrite.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a4543d408b31376c38bab878b2f72d4323abc564
+Author: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com>
+Date:   Sun Jun 30 15:06:30 2019 +0200
+
+    Empty DIRECTWRITE_LIBS
+    
+    Not used anymore since DWRITE is loaded dynamically.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 601b6825b05f67354b48dd3629b95e0d8bf68a14
+Author: Carlo Bramini <30959007+carlo-bramini@users.noreply.github.com>
+Date:   Sun Jun 30 15:03:44 2019 +0200
+
+    Dynamically load DWRITE
+    
+    Also checks if DWriteCreateFactory() has been executed successfully.
+
+ src/hb-directwrite.cc | 41 +++++++++++++++++++++++++++++++++--------
+ 1 file changed, 33 insertions(+), 8 deletions(-)
+
+commit ad341d5f1624f4e30b2d0eb2a171054a973053b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 28 16:00:37 2019 -0700
+
+    [config] Fix CoreText build with NO_AAT
+
+ src/hb-aat-layout.cc | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 3f806673fbeacdbe1b31399394ccc26c773a794b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 29 00:00:00 2019 +0430
+
+    Apply some minor improves on CFFIndex
+
+ src/hb-ot-cff-common.hh | 38 +++++++++++++-------------------------
+ 1 file changed, 13 insertions(+), 25 deletions(-)
+
+commit ddd29e5594ccc9d0281e6da7373a1f115f6f6f3a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 28 23:44:14 2019 +0430
+
+    minor, reuse StructAtOffset logic in StructAtOffsetOrNull
+
+ src/hb-ot-cff-common.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 9db7ce73d7ac6566837cdd70d38c45f3aefd7769
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 28 23:11:52 2019 +0430
+
+    minor style improve in hb-cff-interp-common.hh
+
+ src/hb-cff-interp-common.hh | 91 +++++++++++++++------------------------------
+ 1 file changed, 30 insertions(+), 61 deletions(-)
+
+commit 9a7b7bd9fc5bde7796ffdd997ee65cb33cbf6b29
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 28 22:53:51 2019 +0430
+
+    style fix for pylint complain
+
+ src/gen-emoji-table.py | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 8d36ef50c8712be476572514d73b7bddf43e5951
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 27 14:48:10 2019 -0700
+
+    [config] Add links
+
+ CONFIG.md | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit f53590971c5326dd15f4296764bfd1255ec0506a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 27 13:42:51 2019 -0700
+
+    [test] Make Unicode tests strict against internal UCD
+    
+    https://github.com/harfbuzz/harfbuzz/pull/1799
+
+ test/api/test-unicode.c | 30 ++++++++++++++++++++++--------
+ 1 file changed, 22 insertions(+), 8 deletions(-)
+
+commit d42264f151a61a4a77e5d5712e535fc6e2daf338
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Jun 26 21:10:11 2019 -0400
+
+    Test at least one character per Unicode version
+
+ test/api/test-unicode.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 138 insertions(+), 4 deletions(-)
+
+commit 7185bd6ffb4dd8c0efebdab5b930e62c5695e3ab
+Merge: cd65305b 8341c0b3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 27 22:09:28 2019 +0430
+
+    Merge pull request #1800 from harfbuzz/harfbuzz/cffnull_fix2
+    
+    [CFF] fix for Subrs null ptr access
+
+commit 8341c0b304ee3bb0b7d150bcfb42a8b9e6448687
+Author: Michiharu Ariza <ariza@typekit.com>
+Date:   Thu Jun 27 08:43:31 2019 -0700
+
+    add test case file
+
+ ...z-testcase-minimized-harfbuzz_fuzzer-5093685255077888 | Bin 0 -> 1160 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 01832fd16b605971466fc3b174cb932787ef4bfb
+Author: Michiharu Ariza <ariza@typekit.com>
+Date:   Wed Jun 26 15:58:38 2019 -0700
+
+    alternate fix for https://crbug.com/971933
+
+ src/hb-cff-interp-cs-common.hh | 6 +++---
+ src/hb-cff1-interp-cs.hh       | 2 +-
+ src/hb-cff2-interp-cs.hh       | 2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit cd65305b059e7495f4f993d25cfda4d88781589b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 14:57:48 2019 -0700
+
+    [config] Don't disable emoji sequences in HB_TINY
+    
+    It makes sense to disable this code these if editing is not needed.
+    However, this is also necessary to correctly display emoji sequences
+    in right-to-left direction.  For that reason, don't auto-disable it.
+
+ src/hb-config.hh   | 1 -
+ src/hb-ot-shape.cc | 2 +-
+ src/hb-unicode.cc  | 2 +-
+ 3 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 7298716a3cfbdabedd15960404623317a64db3ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 14:51:17 2019 -0700
+
+    [config] Compile out modified combining-class if HB_NO_OT_SHAPE
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-unicode.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 1cdd0fa60d9a6aaddc20e646d294d642e2db9be4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 14:49:15 2019 -0700
+
+    [emoji] Port generator to packtab
+
+ src/gen-emoji-table.py        |  18 ++++--
+ src/hb-unicode-emoji-table.hh | 126 ++++++++++++++++--------------------------
+ src/hb-unicode.cc             |   5 +-
+ 3 files changed, 60 insertions(+), 89 deletions(-)
+
+commit 5130c90ac0173c542b550049c93738ab5de84bb9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 14:29:39 2019 -0700
+
+    [config] Add HB_NO_EMOJI
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh   | 1 +
+ src/hb-ot-shape.cc | 2 ++
+ src/hb-unicode.cc  | 2 ++
+ 3 files changed, 5 insertions(+)
+
+commit 9d5b5348c7ca1e39faa9e197fdebfb8f5d3aeece
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 13:58:40 2019 -0700
+
+    [config] Add HB_NO_SHAPER
+    
+    Don't know who would want when why.  But makes sense to have.
+
+ src/hb-shaper-list.hh | 6 ++++++
+ src/hb-shaper.cc      | 2 ++
+ 2 files changed, 8 insertions(+)
+
+commit 8fe15485cbc2f56adb29d4d5f0c3957869bd0e1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 13:49:42 2019 -0700
+
+    [config] Add HB_NO_OT_TAG
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh    | 1 +
+ src/hb-ot-layout.cc | 4 ++++
+ src/hb-ot-tag.cc    | 5 +++++
+ src/hb-uniscribe.cc | 4 ++++
+ 4 files changed, 14 insertions(+)
+
+commit 7dcf8e126ecf52c67f59745e04d21df68b1a6992
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 13:44:10 2019 -0700
+
+    [config] Fix build with HB_NO_OT_LAYOUT
+
+ src/hb-ot-face-table-list.hh   | 2 ++
+ src/hb-ot-layout-gpos-table.hh | 3 ++-
+ src/hb-ot-layout-gsub-table.hh | 5 +++--
+ src/hb-ot-layout-gsubgpos.hh   | 8 +++++++-
+ 4 files changed, 14 insertions(+), 4 deletions(-)
+
+commit 2804790bceb9398cc9b668ca63f5aa9ffe29beeb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 13:38:14 2019 -0700
+
+    [config] Add dependency
+
+ src/hb-ot-shape.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit b0fd16eec62dea29d984bab879064ae9d91afdfc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 13:31:51 2019 -0700
+
+    [config] Add dependency
+
+ src/hb-config.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 12092a46d8826eec5dcf69e7817921380e4bc507
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 13:31:01 2019 -0700
+
+    [config] Rename HB_NO_SHAPE_AAT to HB_NO_AAT_SHAPE
+
+ src/hb-aat-map.cc       |  2 +-
+ src/hb-config.hh        |  2 +-
+ src/hb-ot-kern-table.hh | 14 +++++++-------
+ src/hb-ot-layout.cc     |  2 +-
+ src/hb-ot-shape.cc      | 36 ++++++++++++++++++------------------
+ src/hb-ot-shape.hh      |  8 ++++----
+ 6 files changed, 32 insertions(+), 32 deletions(-)
+
+commit bb4bbe617d3878ca7e5e359ada493c68ec7f0a90
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 13:29:58 2019 -0700
+
+    [config] Add HB_NO_OT_LAYOUT
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh    | 1 +
+ src/hb-ot-layout.cc | 7 +++++++
+ src/hb-ot-map.cc    | 7 +++++++
+ 3 files changed, 15 insertions(+)
+
+commit ab40a2feecf53d2ef787b7785132bf57e5bdcff9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 13:25:02 2019 -0700
+
+    [config] Enable HB_NO_OT_FONT in HB_NO_OT
+
+ CONFIG.md        | 4 ++--
+ src/hb-config.hh | 1 +
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 7aad53657eb23264f658711a71da3e50f2264455
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 13:21:03 2019 -0700
+
+    [config] Add HB_NO_OT_SHAPE / HB_NO_OT
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ CONFIG.md                                    | 14 ++++++++++++++
+ src/gen-indic-table.py                       |  6 ++++++
+ src/gen-use-table.py                         |  6 ++++++
+ src/gen-vowel-constraints.py                 |  7 +++++++
+ src/hb-config.hh                             |  4 ++++
+ src/hb-ot-shape-complex-arabic.cc            |  6 ++++++
+ src/hb-ot-shape-complex-default.cc           |  7 +++++++
+ src/hb-ot-shape-complex-hangul.cc            |  7 +++++++
+ src/hb-ot-shape-complex-hebrew.cc            |  7 +++++++
+ src/hb-ot-shape-complex-indic-table.cc       |  6 ++++++
+ src/hb-ot-shape-complex-indic.cc             |  7 +++++++
+ src/hb-ot-shape-complex-khmer.cc             |  7 +++++++
+ src/hb-ot-shape-complex-myanmar.cc           |  7 +++++++
+ src/hb-ot-shape-complex-thai.cc              |  7 +++++++
+ src/hb-ot-shape-complex-use-table.cc         |  6 ++++++
+ src/hb-ot-shape-complex-use.cc               |  7 +++++++
+ src/hb-ot-shape-complex-vowel-constraints.cc |  6 ++++++
+ src/hb-ot-shape-fallback.cc                  |  7 +++++++
+ src/hb-ot-shape-normalize.cc                 |  7 +++++++
+ src/hb-ot-shape.cc                           |  7 +++++++
+ src/hb-shape-plan.cc                         | 10 ++++++++++
+ src/hb-shape-plan.hh                         |  4 ++++
+ src/hb-shaper-list.hh                        |  2 ++
+ 23 files changed, 154 insertions(+)
+
+commit cee9f6e044278b590694f4dff6f22eaad9371385
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 13:01:58 2019 -0700
+
+    Fail compile if no shapers enabled
+
+ src/hb-shaper.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 8786820a5a7406be95bc4a6b6e2aca736126420c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 12:53:57 2019 -0700
+
+    [src] Add make targets "tiny" and "tinyz"
+
+ src/Makefile.am | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit b14e413fae8f14b75c5956e9b38e413c878ded0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 26 10:44:10 2019 -0700
+
+    2.5.3
+
+ NEWS             | 7 +++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 10 insertions(+), 3 deletions(-)
+
+commit 3bfa878c98cceeaae074d81c14329e358bea8912
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 25 19:07:07 2019 -0700
+
+    [gen-ucd] Protect against accidents like previous commit
+    
+    https://github.com/harfbuzz/harfbuzz/pull/1796
+
+ src/gen-ucd-table.py | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+commit f4ea1a9afb4849e7cfb7a5eb9e81e4f656c3f89e
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Jun 25 21:08:14 2019 -0400
+
+    [ucd] Include scripts added in Unicode 10 or later
+
+ src/gen-ucd-table.py |   2 +-
+ src/hb-ucd-table.hh  | 970 +++++++++++++++++++++++++++------------------------
+ 2 files changed, 511 insertions(+), 461 deletions(-)
+
+commit 10bd6b8d913a57260b35c1ef830db37c06eebd18
+Author: Michiharu Ariza <ariza@typekit.com>
+Date:   Thu Jun 20 16:22:08 2019 -0700
+
+    minor
+
+ src/hb-bimap.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f3ee2bd020f8ca313fae783cc49a374f1377e877
+Author: Michiharu Ariza <ariza@typekit.com>
+Date:   Thu Jun 20 14:33:09 2019 -0700
+
+    add ops & methods to hb_bimap_t making it more like hb_map_t
+    moved has () to hb_bimap_t from hb_inc_bimap_t
+    moved identity () to hb_inc_bimap_t
+    removed forward()
+
+ src/hb-bimap.hh             | 38 ++++++++++++++++++++++++--------------
+ src/hb-ot-cff-common.hh     |  2 +-
+ src/hb-ot-cff1-table.hh     |  4 ++--
+ src/hb-subset-cff-common.cc |  2 +-
+ src/hb-subset-cff-common.hh |  4 ++--
+ src/hb-subset-cff1.cc       |  4 ++--
+ src/hb-subset-cff2.cc       |  2 +-
+ 7 files changed, 33 insertions(+), 23 deletions(-)
+
+commit 094966959f96d9a41fb612fd0b870f5ae8f5a954
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Jun 17 22:12:40 2019 -0700
+
+    add hb_bimap_t, subclass hb_inc_bimap_t replacing CFF::remap_t
+
+ src/Makefile.sources        |   1 +
+ src/hb-bimap.hh             | 129 ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cff-common.hh     |  64 +++-------------------
+ src/hb-ot-cff1-table.hh     |  16 +++---
+ src/hb-subset-cff-common.cc |  12 ++---
+ src/hb-subset-cff-common.hh |  40 ++++++--------
+ src/hb-subset-cff1.cc       |  26 ++++-----
+ src/hb-subset-cff2.cc       |  31 +++++------
+ 8 files changed, 191 insertions(+), 128 deletions(-)
+
+commit 0660175dc82d82bbb38c45b9cb53190e06f55750
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Jun 25 10:14:03 2019 -0400
+
+    Categorize U+1133B for use in Tamil
+
+ src/hb-ot-shape-complex-indic.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fb0df17b2701c1c5623198440aa88a676985bd4f
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Jun 24 21:54:26 2019 -0400
+
+    Correct "nonunihan" to "nounihan"
+
+ src/gen-ucd-table.py | 4 ++--
+ src/hb-ucd-table.hh  | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit bb4cdf8e0bcc98a036c22cfd44242502b107fb32
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 25 01:42:42 2019 +0430
+
+    Replace create_from_file with empty blob if HB_NO_OPEN is defined
+
+ src/main.cc                       | 4 ++++
+ src/test-buffer-serialize.cc      | 4 ++++
+ src/test-gpos-size-params.cc      | 4 ++++
+ src/test-gsub-would-substitute.cc | 4 ++++
+ src/test-ot-color.cc              | 4 ++++
+ src/test-ot-name.cc               | 4 ++++
+ src/test.cc                       | 4 ++++
+ 7 files changed, 28 insertions(+)
+
+commit ccf1448238c91da3cba8370ee527229013f6d362
+Author: GaryQian <garyq@google.com>
+Date:   Mon Jun 24 12:57:13 2019 -0700
+
+    Cast long->size_t to ensure comparison of similar types
+
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec8e635e0c1a8e5c631a90820be68cf07c52c1a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 24 12:37:23 2019 -0700
+
+    [ucd] Use custom encoding to shrink composition data
+    
+    Saves another 2.5kb.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/gen-ucd-table.py |  22 +-
+ src/hb-algs.hh       |   5 +
+ src/hb-ucd-table.hh  | 963 ++++++++++++++++++++++++++++++++++-----------------
+ src/hb-ucd.cc        |  49 ++-
+ 4 files changed, 704 insertions(+), 335 deletions(-)
+
+commit 9c933acaa443889bc2484dbe3ef3e990b299cd52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jun 23 17:14:27 2019 -0700
+
+    [ucd] Save a few more bytes
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/gen-ucd-table.py | 11 ++++++-----
+ src/hb-ucd-table.hh  | 34 +++++++++++++++++-----------------
+ src/hb-ucd.cc        | 12 ++++++------
+ 3 files changed, 29 insertions(+), 28 deletions(-)
+
+commit 9bd8d66c2ba97aec57597ff85e059a7618260a1c
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Jun 12 11:02:48 2019 -0700
+
+    [subset] VORG table to use _subset2 method and new iterator frameworks
+
+ src/hb-ot-vorg-table.hh | 128 ++++++++++++++----------------------------------
+ src/hb-subset.cc        |   2 +-
+ 2 files changed, 39 insertions(+), 91 deletions(-)
+
+commit 8062979990d348671b465c877e4dd672e1337665
+Merge: ad97ec95 c2d7dfc6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 23 11:19:48 2019 +0430
+
+    Merge pull request #1788 from jameshilliard/configure-svg
+    
+    Add missing cairo-svg dependency to test-ot-color
+
+commit c2d7dfc68ffcb389c9f73b5ef94da7b270bdcf9e
+Author: James Hilliard <james.hilliard1@gmail.com>
+Date:   Sat Jun 22 19:38:48 2019 -0600
+
+    Add missing cairo-svg dependency to test-ot-color
+
+ src/test-ot-color.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit ad97ec95019b1e5170d00953d4dfe392cfb4abb0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 21 00:44:29 2019 -0700
+
+    [config/ucd] Add HB_NO_UNICODE_UNASSIGNED and activate in HB_TINY
+    
+    Saves another 12kb:
+    
+    $ python ./gen-ucd-table.py ucd.nounihan.grouped.zip > hb-ucd-table.hh && make -j5 CPPFLAGS='-Os -DHB_TINY' -C ~/hb/build/src/  && size ~/hb/build/src/.libs/libharfbuzz_la-hb-ucd.o
+    INFO: Loading UCDXML...
+    INFO: Preparing data tables...
+    INFO: Generating output...
+    INFO:   Compression=1:
+    INFO:       Dataset=gc       FullCost=18612
+    INFO:       Dataset=ccc      FullCost=3550
+    INFO:       Dataset=bmg      FullCost=1548
+    INFO:       Dataset=sc       FullCost=17765
+    INFO:       Dataset=dm       FullCost=13325
+    INFO:   Compression=3:
+    INFO:       Dataset=gc       FullCost=10726
+    INFO:       Dataset=ccc      FullCost=2389
+    INFO:       Dataset=bmg      FullCost=1052
+    INFO:       Dataset=sc       FullCost=13669
+    INFO:       Dataset=dm       FullCost=7780
+    INFO:   Compression=5:
+    INFO:       Dataset=gc       FullCost=8274
+    INFO:       Dataset=ccc      FullCost=2055
+    INFO:       Dataset=bmg      FullCost=908
+    INFO:       Dataset=sc       FullCost=4073
+    INFO:       Dataset=dm       FullCost=7780
+    INFO: Done.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ CONFIG.md            |    3 +-
+ src/gen-ucd-table.py |   27 +-
+ src/hb-config.hh     |    1 +
+ src/hb-ucd-table.hh  | 1161 +++++++++++++++++++++++++++++++++++++++++++++++++-
+ 4 files changed, 1185 insertions(+), 7 deletions(-)
+
+commit ccea7fa119d139b6a3a429b3b81fac8448f3bab1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 21 00:42:06 2019 -0700
+
+    [config] Make test build under HB_TINY
+
+ src/test-gpos-size-params.cc | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 12cec6c12ec1856e483097e702126214dd25a34a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 21 22:39:42 2019 +0430
+
+    Don't define hb_blob_create_from_file if HB_NO_OPEN is defined
+
+ src/hb-blob.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 7f3b409e85897ff267f1b6a5ce1b5cdafbfe7afe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 20 14:24:43 2019 -0700
+
+    Fix build with -O0
+    
+    message_impl was not defined.  That causes trouble if compiler didn't
+    optimize the unreachable call out...
+
+ src/hb-buffer.cc | 1 -
+ src/hb-buffer.hh | 4 ++++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 6b44bf85382146b355a5a3cbbfde48166721ce52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 20 11:57:19 2019 -0700
+
+    2.5.2
+
+ NEWS             | 12 ++++++++++++
+ configure.ac     |  2 +-
+ src/hb-version.h |  4 ++--
+ 3 files changed, 15 insertions(+), 3 deletions(-)
+
+commit e9f7b338ef599b9cbffa125fe594a9939b8517cb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 20 11:48:44 2019 -0700
+
+    [config] Adjust description of HB_LEAN
+    
+    https://github.com/harfbuzz/harfbuzz/commit/d84932ba50482b3b47e393714eb77b19173d1f14
+
+ CONFIG.md | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit fce3bf8127321bb53b14eb8a5528a2347cd9be8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 20:34:29 2019 -0700
+
+    [config] Add HB_NO_LAYOUT_COLLECT_GLYPHS
+    
+    Part of
+
+ src/hb-config.hh    | 1 +
+ src/hb-ot-layout.cc | 2 ++
+ 2 files changed, 3 insertions(+)
+
+commit 6c725c7799bf4870fb8b4f896a537a2c0f7a1ccc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 20:12:25 2019 -0700
+
+    [config] Add HB_NO_LAYOUT_FEATURE_PARAMS
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh           | 1 +
+ src/hb-ot-layout-common.hh | 7 +++++--
+ src/hb-ot-layout.cc        | 6 ++----
+ 3 files changed, 8 insertions(+), 6 deletions(-)
+
+commit 27de7c44fe80e69c527578c99c26280ba9f26c15
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 20:07:02 2019 -0700
+
+    [config] Add HB_NO_FACE_COLLECT_UNICODES
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh             | 1 +
+ src/hb-face.cc               | 5 ++---
+ src/hb-ot-face-table-list.hh | 2 ++
+ 3 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 3caa32d737e7c2b4fe6ccd10950760998524f573
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 19:50:54 2019 -0700
+
+    [config] Add HB_NO_CMAP_LEGACY_SUBTABLES
+    
+    Part of https://vimeo.com/331852453/06eec89c65
+
+ src/hb-config.hh        |  1 +
+ src/hb-ot-cmap-table.hh | 16 ++++++++++++----
+ 2 files changed, 13 insertions(+), 4 deletions(-)
+
+commit 8e3cde67dfa4aa17c0f1156b4a4acd0c95bdbe6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 19:58:24 2019 -0700
+
+    Fix MSVC build
+    
+    MSVC warning:
+    
+    c:\projects\harfbuzz\src\hb-ot-layout-gsubgpos.hh(2732): error C2121: '#': invalid character: possibly the result of a macro expansion [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+    
+    Clang warning for it:
+    
+    ./hb-ot-layout-gsubgpos.hh:2729:2: error: embedding a directive within macro arguments has undefined behavior [-Werror,-Wembedded-directive]
+
+ src/hb-ot-layout-gsubgpos.hh | 18 +++++++++++-------
+ src/hb.hh                    |  1 +
+ 2 files changed, 12 insertions(+), 7 deletions(-)
+
+commit c8f529a07eca06acf2216935921377e7cad8436f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 19:33:15 2019 -0700
+
+    [config] Add HB_NO_HINTING, enabled by HB_TINY
+    
+    Disables HintingDevice tables and Anchors addressing contour points.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh               | 3 ++-
+ src/hb-ot-layout-common.hh     | 6 ++++++
+ src/hb-ot-layout-gpos-table.hh | 7 +++++++
+ 3 files changed, 15 insertions(+), 1 deletion(-)
+
+commit a849873124efea6577b4938b23501d9e4f4af2f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 19:26:22 2019 -0700
+
+    [config] Add HB_NO_VAR to disable variations support, enabled by HB_TINY
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh             |  1 +
+ src/hb-font.cc               |  3 ++-
+ src/hb-ot-face-table-list.hh |  2 ++
+ src/hb-ot-layout-common.hh   | 34 ++++++++++++++++++++++++++++------
+ src/hb-ot-layout-gsubgpos.hh | 18 +++++++++++++++---
+ src/hb-ot-var.cc             |  7 ++++++-
+ src/hb-subset-plan.cc        |  2 ++
+ 7 files changed, 56 insertions(+), 11 deletions(-)
+
+commit 230adf2c417bbb6b5f367eb857dd6f98bea3ef26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 18:49:52 2019 -0700
+
+    [config] Add HB_NO_OT_FONT_GLYPH_NAMES
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh             | 1 +
+ src/hb-ot-face-table-list.hh | 4 +++-
+ src/hb-ot-font.cc            | 5 ++++-
+ 3 files changed, 8 insertions(+), 2 deletions(-)
+
+commit b0debc32f6cedfa76a4851aa391f88ed1860955d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 18:42:39 2019 -0700
+
+    [subset] Simplify collect_name_ids
+
+ src/hb-subset-plan.cc | 19 ++-----------------
+ 1 file changed, 2 insertions(+), 17 deletions(-)
+
+commit a5897463d4d0b83cb1bfe4ae1477dac4e3851252
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 18:36:35 2019 -0700
+
+    [config] Add HB_NO_STAT
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh             | 1 +
+ src/hb-ot-face-table-list.hh | 2 ++
+ src/hb-subset-plan.cc        | 2 ++
+ 3 files changed, 5 insertions(+)
+
+commit ffc2b8d56e5d35b4dc19499c830d8fc4b643213a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 18:33:29 2019 -0700
+
+    [config] Don't include name table in face if HB_NO_NAME
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-face-table-list.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 1432df102ebf206592f92677f48bb950871675b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 18:32:40 2019 -0700
+
+    [config] Disable hb-ot-font code if HB_NO_OT_FONT
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-font.cc | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit b1a2384a5244ea3ea63ca94eb095c4add2cd451d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 17:34:12 2019 -0700
+
+    [ucd] Print out table sizes
+
+ src/gen-ucd-table.py | 27 +++++++++++++++++++--------
+ src/hb-ucd-table.hh  |  1 -
+ 2 files changed, 19 insertions(+), 9 deletions(-)
+
+commit f4de0c775408e34474a688361fa319251e1a9c18
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 17:08:26 2019 -0700
+
+    [config] Disable AAT map
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-aat-map.cc  | 15 +++++++--------
+ src/hb-ot-shape.cc |  6 ++++++
+ 2 files changed, 13 insertions(+), 8 deletions(-)
+
+commit d8bf6723a1176ca26e97e8015044c8829ec77c36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 17:04:16 2019 -0700
+
+    [config] Disable more legacy kerning
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-shape.cc | 4 +++-
+ src/hb-ot-shape.hh | 8 ++++++++
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 43d7048d59b1a0af62b80bd914805bdec74a29d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 17:02:32 2019 -0700
+
+    [config] More trak disabling
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-shape.cc | 4 +++-
+ src/hb-ot-shape.hh | 8 ++++++++
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit d84932ba50482b3b47e393714eb77b19173d1f14
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 16:57:48 2019 -0700
+
+    [config] add HB_NO_OT_SHAPE_FRACTIONS, enabled in HB_LEAN
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh   |  1 +
+ src/hb-ot-shape.cc |  9 +++++++++
+ src/hb-ot-shape.hh | 10 ++++++++++
+ 3 files changed, 20 insertions(+)
+
+commit eaf4a7364c28663720a9da57bf4d576b6009e17d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 16:51:13 2019 -0700
+
+    [config] Minor trak disable
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-shape.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 971330c0588307bcd73934e44c6343db55b1f5b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 16:37:35 2019 -0700
+
+    [config] Add HB_NO_LANGUAGE_PRIVATE_SUBTAG
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh | 1 +
+ src/hb-ot-tag.cc | 4 ++++
+ 2 files changed, 5 insertions(+)
+
+commit f642a5fa6c42b145574593a0e18815dc74d3c617
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 16:36:09 2019 -0700
+
+    Restructure code
+
+ src/hb-ot-tag.cc | 44 ++++++++++++++++++++------------------------
+ 1 file changed, 20 insertions(+), 24 deletions(-)
+
+commit d2ff73b256599a655e4ddedbe1ca75abdf837d23
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 16:28:08 2019 -0700
+
+    [config] Remove remaining AAT context bits if HB_NO_OT_KERN
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-aat-layout.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 588697afd0ddf411e8201866ade1f593ccb61aab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 16:24:51 2019 -0700
+
+    [config] Add HB_NO_OT_KERN, enabled by HB_MINI / HB_NO_LEGACY
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh             |  1 +
+ src/hb-ot-face-table-list.hh |  6 +++++-
+ src/hb-ot-layout.cc          |  4 ++--
+ src/hb-ot-shape.cc           | 16 ++++++++++++++--
+ src/hb-ot-shape.hh           |  4 ++++
+ 5 files changed, 26 insertions(+), 5 deletions(-)
+
+commit 2e3e929d2b0fa6026c55eb92f91de0498fb22646
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 15:50:13 2019 -0700
+
+    Fix build
+
+ src/hb-ot-face-table-list.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 631da9d816da381c5fd4b3cc640c41fda736a96f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 19 15:36:14 2019 -0700
+
+    [config] Remove tables from hb_face_t for disabled features
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/Makefile.sources         |   1 +
+ src/hb-ot-face-table-list.hh | 112 +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-face.cc            |   8 +---
+ src/hb-ot-face.hh            |  52 ++------------------
+ src/hb-ot-layout.cc          |   2 +
+ 5 files changed, 120 insertions(+), 55 deletions(-)
+
+commit e710888188ff3285a162c25c89d886d9535d9f02
+Author: Misty De Meo <mistydemeo@gmail.com>
+Date:   Tue Jun 18 15:20:38 2019 -0700
+
+    coretext: remove trailing macro from SCRATCH_RESTORE
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 10bac21bb5b25cf20c2198934e99e444625dfd97
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 15:15:06 2019 -0700
+
+    [coretext/uniscribe/directwrite] Remove extra semicolons
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1783
+
+ src/hb-coretext.cc    | 2 +-
+ src/hb-directwrite.cc | 2 +-
+ src/hb-uniscribe.cc   | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit f0b0fd4e78e94315c9d01b9232ebfb09bbfef556
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 14:40:24 2019 -0700
+
+    Remove dead code
+
+ src/hb-ot-layout.cc | 10 ++--------
+ 1 file changed, 2 insertions(+), 8 deletions(-)
+
+commit d7e27cd65a085a76c85cddd93cea48ce4b7be03f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 14:38:05 2019 -0700
+
+    [config] Don't use VORG table if HB_NO_OT_FONT_CFF
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-font.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 37f8ebff5f1973423c7e4ed9dea88881d0642b61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 14:33:49 2019 -0700
+
+    [config] Fixup for AAT ltag table access
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-aat-layout.hh    | 8 --------
+ src/hb-ot-name-table.hh | 2 +-
+ 2 files changed, 1 insertion(+), 9 deletions(-)
+
+commit f08066ce9a41469e2a7396f0accd61e1c02e5649
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 14:29:27 2019 -0700
+
+    [config] One more morx disabling
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-layout.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 231d0257883ec9e8904afae1adfd73f3c225f177
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 14:25:52 2019 -0700
+
+    [config] Don't compile AAT API if HB_NO_AAT
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-aat-layout.cc | 131 ++++++++++++++++-----------------------------------
+ src/hb-ot-shape.cc   |  19 ++++++--
+ 2 files changed, 56 insertions(+), 94 deletions(-)
+
+commit bf9424a9a198b99d49c005536a10f27387630064
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 13:31:35 2019 -0700
+
+    [config] Don't compile unused layout API if HB_NO_LAYOUT_UNUSED
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-layout.cc | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit eb9798ef733da53e69966054b67752cd8937eb7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 13:29:55 2019 -0700
+
+    [config] Dont' compile buffer message API if HB_NO_BUFFER_MESSAGE
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-buffer.cc | 2 ++
+ src/hb-buffer.hh | 5 ++++-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit be1c0ab2186a728eabdf6666632a9f759474f901
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 13:26:03 2019 -0700
+
+    [config] Don't compile buffer serialize API if HB_NO_BUFFER_SERIALIZE
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-buffer-serialize.cc   | 19 +++++++------------
+ src/test-buffer-serialize.cc |  7 ++++++-
+ 2 files changed, 13 insertions(+), 13 deletions(-)
+
+commit bdbabd110cfdb4c59cf24bd500ce63073a5213e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 13:21:25 2019 -0700
+
+    Minor header include cleanup
+
+ src/hb-aat-layout.cc | 1 -
+ src/hb-ot-math.cc    | 3 ---
+ src/hb-ot-name.cc    | 1 -
+ src/hb-ot-var.cc     | 4 ++--
+ 4 files changed, 2 insertions(+), 7 deletions(-)
+
+commit 83de3a60ab7383cf3ee25c1f8c33a45a7778d003
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 13:18:15 2019 -0700
+
+    [config] Don't compile color API if HB_NO_COLOR
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-color.cc   | 55 +++++++++-------------------------------------------
+ src/test-ot-color.cc |  9 ++++++++-
+ 2 files changed, 17 insertions(+), 47 deletions(-)
+
+commit 350f98ea47aaf0fe008065b92c8b6fe2bc519fa7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 13:11:41 2019 -0700
+
+    [config] Don't compile name table API if HB_NO_NAME
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-name.cc   | 25 +++++--------------------
+ src/test-ot-name.cc |  5 ++++-
+ 2 files changed, 9 insertions(+), 21 deletions(-)
+
+commit da51a2cb0efae664d4ee83c6036f29a21621e993
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 13:09:22 2019 -0700
+
+    [config] Don't compile math API if HB_NO_MATH
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-math.cc | 47 +++++++----------------------------------------
+ 1 file changed, 7 insertions(+), 40 deletions(-)
+
+commit 737436d3f8aacfd0bd586cd54d7034bae3afc4e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 13:07:44 2019 -0700
+
+    Streamline HB_NO_CFF
+
+ src/hb-ot-cff1-table.cc     | 7 +++++--
+ src/hb-ot-cff2-table.cc     | 7 +++++--
+ src/hb-subset-cff-common.cc | 7 +++++++
+ src/hb-subset-cff1.cc       | 7 +++++--
+ src/hb-subset-cff2.cc       | 7 +++++--
+ 5 files changed, 27 insertions(+), 8 deletions(-)
+
+commit 60653a7adbbd8143d187b3edf33cb7a2dddadf74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 13:01:11 2019 -0700
+
+    Remove HB_VECTOR_SIZE
+    
+    It was cumbersome to get it to work reliably, for dubious performance
+    gain, mostly in the subsetter maybe...
+    
+    Life is easier without.  It was disabled forever anyway.
+
+ src/hb-algs.hh   | 36 +++++++++---------------------------
+ src/hb-null.hh   |  4 ++--
+ src/hb-static.cc |  4 ++--
+ src/hb.hh        | 32 --------------------------------
+ 4 files changed, 13 insertions(+), 63 deletions(-)
+
+commit 24060d3aa77f1e1a18960cc61c3d1ac241875507
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 12:50:42 2019 -0700
+
+    Add hb_bitwise_neg
+
+ src/hb-algs.hh | 33 +++++++++++++++++++++------------
+ 1 file changed, 21 insertions(+), 12 deletions(-)
+
+commit 7cf9169078f35299ec0633a7b212256acdd71661
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 12:44:03 2019 -0700
+
+    Remove accidentally left cruft
+
+ src/hb-algs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6172ec5d879653c536d7cb3d3b3760fbb6d0f3f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jun 18 12:41:56 2019 -0700
+
+    Remove (unused) posix_memalign fallback
+    
+    Was wrong.  The returned pointer couldn't be passed to free().  Ouch!
+
+ configure.ac |  2 +-
+ src/hb.hh    | 34 ----------------------------------
+ 2 files changed, 1 insertion(+), 35 deletions(-)
+
+commit eb28d6e48b02a8c49875cfcd084a16c1c66c367e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 18 12:14:10 2019 +0430
+
+    [ci] Test no build system builds
+    
+    Introduced in aa3450c, let's preserve it
+
+ .circleci/config.yml | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit efef672911dd6c3b80e53294f3fcd59dbb64597a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 22:57:51 2019 -0700
+
+    Fix cmake build
+    
+    Hopefullly.
+
+ CMakeLists.txt | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit aa3450cac148280f747fb88864b6fcc4ec70cc51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 22:41:49 2019 -0700
+
+    [config] Don't compile disabled features
+    
+    This makes it possible to include all .cc files into build, even if not
+    building CoreText, Uniscribe, etc.
+    
+    This was mostly to help custom builders.  But also means that we can
+    include all files in our own build system.  Not sure if we should.
+    Definitely simplifies things, but slightly only.
+
+ src/Makefile.am              | 1 +
+ src/hb-coretext.cc           | 6 ++++++
+ src/hb-directwrite.cc        | 6 ++++++
+ src/hb-ft.cc                 | 5 +++++
+ src/hb-glib.cc               | 5 +++++
+ src/hb-gobject-enums.cc.tmpl | 7 +++++++
+ src/hb-gobject-structs.cc    | 5 +++++
+ src/hb-graphite2.cc          | 7 +++++++
+ src/hb-icu.cc                | 5 +++++
+ src/hb-uniscribe.cc          | 4 ++++
+ 10 files changed, 51 insertions(+)
+
+commit 33d8b76e74579a27b06fa788d0bf696a9dd44cc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 21:54:20 2019 -0700
+
+    [config] Flesh out CONFIG.md
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ CONFIG.md | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 84 insertions(+), 3 deletions(-)
+
+commit 23ccd00a3d5033b812f2bebcc5b793a4415b252b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 20:35:04 2019 -0700
+
+    Minor
+
+ src/hb-config.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 23768a99e08cbe691772b7514c023d3184989ff8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 20:29:29 2019 -0700
+
+    [config] Replace HAVE_FALLBACK with HB_NO_FALLBACK_SHAPE
+    
+    This disables fallback shaper in tiny builds.  Projects that don't
+    use our build system and want to disable fallback shaper (eg. Firefox)
+    should define HB_NO_FALLBACK_SHAPE now.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ CMakeLists.txt           | 2 --
+ configure.ac             | 8 --------
+ src/Makefile.am          | 4 ----
+ src/Makefile.sources     | 5 +----
+ src/hb-config.hh         | 1 +
+ src/hb-fallback-shape.cc | 3 +++
+ src/hb-shaper-list.hh    | 2 +-
+ 7 files changed, 6 insertions(+), 19 deletions(-)
+
+commit 3a9394635ffd663d8acd0715236dd01d9f22f3b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 20:10:36 2019 -0700
+
+    Add CONFIG.md
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ CONFIG.md   | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ Makefile.am |  1 +
+ README.md   |  2 ++
+ 3 files changed, 54 insertions(+)
+
+commit 1c56b5d1d8307efd12519556e41fc50c5371f136
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 14:23:04 2019 -0700
+
+    [serialize] Fix copy() calling operator=
+    
+    https://github.com/googlefonts/harfbuzz/commit/9f610ae239a11e86f94621e26bc15849b65ce41b#commitcomment-33944686
+
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6492b2345cd913223b0eb931e9e11f7e5ad33049
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 14:19:13 2019 -0700
+
+    Minor
+
+ src/hb-open-type.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8938dd23c64f80dbd31f87133d9df88cd0c98c1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 14:12:11 2019 -0700
+
+    Use injected class name
+
+ src/hb-open-type.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit bfb5569d530a2b65dafd0d9be45d594af9e742ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 14:06:04 2019 -0700
+
+    Disable non-OpenType kerning with hb-ft in HB_TINY
+
+ src/hb-ft.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 0819f3ca863af520fe546e6ef0596300e9e28b01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 14:02:47 2019 -0700
+
+    Deprecate v_kerning callback again
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1682
+
+ docs/harfbuzz-sections.txt |  6 +++---
+ src/hb-deprecated.h        | 23 +++++++++++++++++++++++
+ src/hb-font.cc             |  7 +++----
+ src/hb-font.h              | 20 --------------------
+ src/hb-font.hh             |  2 +-
+ 5 files changed, 30 insertions(+), 28 deletions(-)
+
+commit eb2825c7f140185f41922a371434873a0114ef67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 13:42:53 2019 -0700
+
+    Minor
+
+ src/hb-ot-font.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 896416bd4c6ac486eb4e1926eaa09d5a9b693763
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 13:39:49 2019 -0700
+
+    Partially revert "[ft/ot] Remove implementation of deprecated kerning funcs"
+    
+    This reverts commit 47030b1855f04c0d75899ffb6f5021fea3c19b90.
+    
+    Reverts only the hb-ft part, to reinstate non-OpenType kerning with
+    FreeType.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1682
+
+ src/hb-ft.cc | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+commit 2682efb02df72fb254c819cb76fc23592c30fc45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 17 13:38:08 2019 -0700
+
+    Revert "Deprecate font kern API"
+    
+    This reverts commit d219f899f4b2fb4b39ebc1dff9fb648fc5d6d112.
+    
+    API change: Un-deprecate font kern API.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1682
+    
+    We should document that this API is only necessary to hook up
+    non-OpenType kerning.  hb-ot-font will continue to NOT implement them.
+
+ docs/harfbuzz-sections.txt | 16 +++++++-------
+ src/hb-deprecated.h        | 54 ----------------------------------------------
+ src/hb-font.cc             |  3 ---
+ src/hb-font.h              | 51 +++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 59 insertions(+), 65 deletions(-)
+
+commit d6cb244f7d63338e0cbfa774c2a32e6e7e06f15b
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sat Jun 15 21:38:27 2019 -0400
+
+    Canonically reorder U+0C55 and U+0C56
+
+ src/hb-unicode.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 82d4bfb8f3ac30fecce41f8abe59f58ad64ba98a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Jun 14 10:49:42 2019 -0700
+
+    enable cff subset tests
+    
+    add Unicode UCS-4 cmap
+    fix Unicode bits in OS/2
+    add Unicode cmap sub-table in SourceHanSans-Regular_subset.otf
+    regenerate cff subset test expected results
+
+ src/hb-ot-cmap-table.hh                            |  73 +++++++++++++++++----
+ src/hb-ot-os2-table.hh                             |  10 ++-
+ test/subset/data/Makefile.am                       |   2 +
+ test/subset/data/Makefile.sources                  |   2 +
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 32124 -> 20000 bytes
+ ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 29688 -> 2196 bytes
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 33316 -> 30412 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 31960 -> 19840 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 29564 -> 2072 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 33168 -> 30264 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 32052 -> 19932 bytes
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 29632 -> 2108 bytes
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 33180 -> 30276 bytes
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 32276 -> 20152 bytes
+ .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 29788 -> 2264 bytes
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 33332 -> 30428 bytes
+ ...ubset.default.3042,3044,3046,3048,304A,304B.otf | Bin 3028 -> 3036 bytes
+ ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 3240 -> 3248 bytes
+ ...eHanSans-Regular_subset.default.61,63,65,6B.otf | Bin 2200 -> 2208 bytes
+ ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3460 -> 3468 bytes
+ .../SourceHanSans-Regular_subset.default.660E.otf  | Bin 1920 -> 1928 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 90956 -> 8932 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125820 -> 116080 bytes
+ ...bset.desubroutinize-retain-gids.61,63,65,6B.otf | Bin 88392 -> 3016 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 126004 -> 116264 bytes
+ ...ular_subset.desubroutinize-retain-gids.660E.otf | Bin 103780 -> 50224 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 2952 -> 2960 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 3136 -> 3144 bytes
+ ...s-Regular_subset.desubroutinize.61,63,65,6B.otf | Bin 2132 -> 2140 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3256 -> 3264 bytes
+ ...eHanSans-Regular_subset.desubroutinize.660E.otf | Bin 1896 -> 1904 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 90656 -> 8672 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125468 -> 115768 bytes
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.otf | Bin 88156 -> 2892 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 125584 -> 115884 bytes
+ ....drop-hints-desubroutinize-retain-gids.660E.otf | Bin 103556 -> 50040 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 2792 -> 2800 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 2896 -> 2904 bytes
+ ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf | Bin 2028 -> 2036 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 2964 -> 2972 bytes
+ ...gular_subset.drop-hints-desubroutinize.660E.otf | Bin 1804 -> 1812 bytes
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 90724 -> 8740 bytes
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125560 -> 115864 bytes
+ ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf | Bin 88196 -> 2852 bytes
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 125780 -> 116084 bytes
+ ...-Regular_subset.drop-hints-retain-gids.660E.otf | Bin 103572 -> 50060 bytes
+ ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 2848 -> 2856 bytes
+ ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 2988 -> 2996 bytes
+ ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf | Bin 2060 -> 2068 bytes
+ ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 3164 -> 3172 bytes
+ ...ourceHanSans-Regular_subset.drop-hints.660E.otf | Bin 1824 -> 1832 bytes
+ ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 91040 -> 9016 bytes
+ ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 125924 -> 116184 bytes
+ ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf | Bin 88468 -> 3012 bytes
+ ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 126208 -> 116468 bytes
+ ...urceHanSans-Regular_subset.retain-gids.660E.otf | Bin 103800 -> 50244 bytes
+ .../data/fonts/SourceHanSans-Regular_subset.otf    | Bin 2707728 -> 2707736 bytes
+ 57 files changed, 70 insertions(+), 17 deletions(-)
+
+commit 6bcbe495bff221169f8c0769dde1b4b2c165a211
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jun 13 15:04:51 2019 +0430
+
+    [cff] minor format (#1774)
+
+ src/hb-subset-cff-common.cc | 104 ++++++++++++++++++++------------------------
+ 1 file changed, 48 insertions(+), 56 deletions(-)
+
+commit 4f37c0db9bf4e3d536a50126d17b36009b12f9cb
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Jun 11 17:55:31 2019 -0400
+
+    Remove 'mym3'
+
+ src/hb-ot-tag.cc       | 4 +++-
+ test/api/test-ot-tag.c | 2 +-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 90872a29ee5d0bef6df1c2900f7001c11106c4da
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Jun 11 12:28:30 2019 -0700
+
+    change assert(false) to failure
+
+ src/hb-subset-cff-common.cc                               |   2 +-
+ ...z-testcase-minimized-hb-subset-fuzzer-5680398559870976 | Bin 0 -> 145 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 0c5da57d1aab91d7677a5c6517a3da254d53267f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 10 14:06:25 2019 -0700
+
+    Fix typo :)
+
+ src/hb-blob.cc   | 3 ++-
+ src/hb-config.hh | 2 +-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 19b8eb08e5457cd643aee5f9b9ad1c80b2243895
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 11 01:33:30 2019 +0430
+
+    Move HB_NO_SETLOCALE to closer place to its to unbreak HB_TINY build (#1768)
+
+ src/hb-common.cc | 3 +++
+ src/hb.hh        | 4 ----
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+commit b4a5a69ad8625e3b90eb907a1b70e3ed24d4ff97
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 11 01:33:09 2019 +0430
+
+    Add HB_NO_OEPN (#1767)
+
+ src/hb-blob.cc   | 3 +++
+ src/hb-config.hh | 2 ++
+ 2 files changed, 5 insertions(+)
+
+commit a36ff941710b5a5f7e464e6d72aff36cf5549a91
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 10 15:48:28 2019 +0430
+
+    Add HB_NO_SETLOCALE
+
+ src/hb-config.hh | 1 +
+ src/hb.hh        | 6 +++++-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit c4cae81a26a816979f3206418c47856b5ed2d8bb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 10 15:32:54 2019 +0430
+
+    Remove round polyfill
+    
+    Added in 01dff1e and 19256bef, this was targeted at older
+    msvc versions that don't support C99 but now as we require
+    C++11 we don't target places those envs thus removing this.
+
+ CMakeLists.txt |  2 +-
+ configure.ac   |  6 ------
+ src/hb.hh      | 14 --------------
+ 3 files changed, 1 insertion(+), 21 deletions(-)
+
+commit ff9b9b1c89d5529fafc74ce84c0acb71b5d6031b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 10 12:48:25 2019 -0700
+
+    Simplify HB_PARTIALIZE impl
+    
+    +this works on gcc 4.8 as well as default code path.
+
+ src/hb-algs.hh | 17 +++++------------
+ 1 file changed, 5 insertions(+), 12 deletions(-)
+
+commit 451edbd4d063a4b43c1ca3d2b60c7392602ae7b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 10 12:46:54 2019 -0700
+
+    Revert "Test new solution for HB_PARTIALIZE"
+    
+    This reverts commit a0c4900799c26e4ff34180842a5ff21048fe31a0.
+
+ src/hb-algs.hh | 18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+commit a0c4900799c26e4ff34180842a5ff21048fe31a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jun 10 12:33:23 2019 -0700
+
+    Test new solution for HB_PARTIALIZE
+    
+    Just testing bots.  Will finish based on results.
+
+ src/hb-algs.hh | 18 +-----------------
+ 1 file changed, 1 insertion(+), 17 deletions(-)
+
+commit 4a2b58555f173b692b767c933d280a51142926dd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 10 08:16:51 2019 -0700
+
+    [ci] Use HB_OPTIMIZE_SIZE instead of __OPTIMIZE_SIZE__
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a228bb5f1d471a334bc9727f5d4f5b59dbe829ff
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 10 15:56:36 2019 +0430
+
+    [ci] Test -Os and optimize size in Alpine bot
+    
+    __OPTIMIZE_SIZE__ should be defined whenever -Os but some Internet thread
+    indicate may not so lets do that ourselves as that is the main intention
+
+ .circleci/config.yml | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 9407ef8d4bb96346b1f8b07757d79d3f8cc61cf7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 10 15:17:43 2019 +0430
+
+    minor, add HB_USE_INTERNAL_QSORT
+    
+    The only thing I need for a working wasm in a minimum libc,
+    otherwise I have to provide the very same qsort inside that libc
+
+ src/hb-algs.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 801d93fc58aa13082dea86fb2c3821bc6362f593
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 10 14:53:14 2019 +0430
+
+    [ci] remove wine from fedora bot
+    
+    We are not testing Windows exes in fedora mingw bot, we don't have to as
+    probably won't go that smoothly and we have real Windows bots anyway
+    and as wine installation itself is time taking let's remove it
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7dcfc5357df879491f847bd7d2941645e58f268c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 9 11:58:08 2019 +0430
+
+    [stat] minor format
+
+ src/hb-ot-stat-table.hh | 72 ++++++++++++++++++++++++-------------------------
+ 1 file changed, 36 insertions(+), 36 deletions(-)
+
+commit 2646c7149ce49d3b6cf90e354658df35254bcce0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 9 11:51:58 2019 +0430
+
+    [stat] minor
+
+ src/hb-ot-stat-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit c4669fda7890bc741ef934ebc360e366eba94866
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 9 11:50:36 2019 +0430
+
+    [algs] minor
+
+ src/hb-algs.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9b853f755dd05ccef3429d3d3d0d561a99cc4c2d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 9 11:49:25 2019 +0430
+
+    [cff] Use switch on multi-format structs (#1762)
+
+ src/hb-cff-interp-cs-common.hh   |   4 +-
+ src/hb-cff-interp-dict-common.hh |  12 +--
+ src/hb-ot-cff-common.hh          | 135 ++++++++++++------------
+ src/hb-ot-cff1-table.hh          | 215 ++++++++++++++++++++++-----------------
+ src/hb-ot-cff2-table.hh          |  68 +++++++------
+ src/hb-subset-cff1.cc            |   2 +-
+ src/hb-subset-cff2.cc            |   2 +-
+ 7 files changed, 233 insertions(+), 205 deletions(-)
+
+commit eff579f743a91c0b1c543f4b69ab33580cae6392
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 7 12:58:09 2019 +0430
+
+    Update and use internal qsort everywhere
+
+ src/hb-algs.hh          | 210 +++++++++++++++++++++++++++++++++++-------------
+ src/hb-array.hh         |   6 +-
+ src/hb-ot-post-table.hh |   2 +-
+ 3 files changed, 158 insertions(+), 60 deletions(-)
+
+commit 5074d665a8b0980f202a5986bda52808674cfb54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 7 14:20:45 2019 -0700
+
+    [ucd] Save another 1.5kb
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/gen-ucd-table.py |  8 +++++---
+ src/hb-ucd-table.hh  | 37 +++++++++++++++++++++----------------
+ src/hb-ucd.cc        | 12 +++++++++---
+ 3 files changed, 35 insertions(+), 22 deletions(-)
+
+commit 6d58b45782833f8c6c8efd9426e2785c78e6462a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 8 00:40:18 2019 +0430
+
+    [ci] use trusty for its gcc 4.8 again
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 973699c49b905e142ecc5cefd1f4fa15aad8e309
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 7 12:49:06 2019 -0700
+
+    Disable clang gcc impersonator
+
+ src/hb-algs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e4e518f33d933a02058bad86a6aae714e59814db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 7 12:41:09 2019 -0700
+
+    Fix build on gcc 4.8
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1724
+
+ src/hb-algs.hh | 29 +++++++++++++++++++++++++++--
+ 1 file changed, 27 insertions(+), 2 deletions(-)
+
+commit 3c240bd3dc0aaca38154da555d0aef350da62ee6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jun 7 10:56:24 2019 -0700
+
+    Downgrade double-promotion from error to warning
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1740
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 385e436692e94588fc4cb3a7afbeb862035db09b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 7 10:44:53 2019 -0700
+
+    Minor, fix gcc maybe-uninitialized complain
+    
+    I guess all of its field will be initialized anyway here but lets make it more defensive
+
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1bada656a86e9cb27d4a6b9fcc50748f0bd9c1d9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 7 02:01:27 2019 +0430
+
+    Minor, remove unnecessary semicolon
+    
+    Causing -Wextra-semi-stmt build error when no primitive has chosen
+    Interesting that nobody has noticed it yet.
+
+ src/hb-mutex.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f9b1ae73360054d9f121a2d36820377909888b35
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jun 5 17:40:59 2019 -0700
+
+    [subset] Move OS/2 to subset2.
+
+ src/hb-ot-os2-table.hh | 32 ++++++++++++++++----------------
+ src/hb-subset.cc       |  2 +-
+ 2 files changed, 17 insertions(+), 17 deletions(-)
+
+commit 93d592e0e181f436ea47038fef419134007208aa
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Jun 5 16:51:31 2019 -0700
+
+    [subset] post table to use _subset2
+
+ src/hb-ot-post-table.hh | 31 +++++++++++++++----------------
+ src/hb-subset.cc        |  2 +-
+ 2 files changed, 16 insertions(+), 17 deletions(-)
+
+commit 6f35cf7a637f5efc0ef3888d929a6392cc2863c3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Jun 6 09:15:34 2019 -0700
+
+    regenerate SourceSerifVariable expected subset results
+
+ .gitignore                                            |   1 +
+ ...SerifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 5464 -> 4132 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf    | Bin 5432 -> 4100 bytes
+ ...urceSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 5924 -> 4592 bytes
+ ...ifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 5464 -> 4132 bytes
+ .../SourceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 5432 -> 4100 bytes
+ ...eSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 5924 -> 4592 bytes
+ 7 files changed, 1 insertion(+)
+
+commit db938479d7b1e3ec35a39a9ad31c945e09e6d5e5
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Jun 4 10:30:53 2019 -0700
+
+    [subset] maxp table to use _subset2
+
+ src/hb-ot-maxp-table.hh | 48 ++++++++++++++++++++++--------------------------
+ src/hb-subset.cc        |  2 +-
+ 2 files changed, 23 insertions(+), 27 deletions(-)
+
+commit 66361c72f655cc9170fd8c25610ed192fa0ff86d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Jun 5 14:51:04 2019 -0700
+
+    restore gvar/MVAR/HVAR tables in subset tests
+
+ test/subset/generate-expected-outputs.py | 2 +-
+ test/subset/run-tests.py                 | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit d5e5f378329b6ce21944b79b568369ea7bc36cf3
+Author: Eli Zaretskii <eliz@gnu.org>
+Date:   Wed Jun 5 22:20:03 2019 +0300
+
+    This makes minor changes to allow building HarfBuzz with
+    mingw.org's MinGW.
+    
+    src/hb-algs.hh: Don't compile _BitScanForward and _BitScanReverse
+    for GCC >= 4.  mingw.org's MinGW doesn't have these functions.
+    
+    src/hb-atomic.hh: MemoryBarrier does exist in mingw.org's MinGW,
+    but it is not a macro, it is an inline function.  __MINGW32_VERSION
+    is a macro that exists only in mingw.org's MinGW, so conditioning
+    on it should not affect MinGW64, where MemoryBarrier is a macro.
+    
+    src/hb-uniscribe.cc: Define E_NOT_SUFFICIENT_BUFFER if it is not
+    defined (mingw.org's MinGW doesn't).
+    
+    src/hb.hh: Don't include intrin.h for mingw.org's MinGW, since that
+    header is not available; instead, include windows.h.  Conditioned
+    on __MINGW32_VERSION to avoid affecting MinGW64.
+
+ src/hb-algs.hh      | 4 ++--
+ src/hb-atomic.hh    | 2 +-
+ src/hb-uniscribe.cc | 4 ++++
+ src/hb.hh           | 7 +++++++
+ 4 files changed, 14 insertions(+), 3 deletions(-)
+
+commit 8f8e8a84795db45098c95e19a7ff83d898d3bc7d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Jun 5 12:59:09 2019 -0700
+
+    fix build
+
+ src/hb-ot-font.cc           | 2 +-
+ src/hb-ot-glyf-table.hh     | 8 ++++----
+ src/hb-ot-hmtx-table.hh     | 2 +-
+ src/hb-ot-var-gvar-table.hh | 6 +++---
+ src/hb-ot-var-hvar-table.hh | 2 +-
+ 5 files changed, 10 insertions(+), 10 deletions(-)
+
+commit c7439d4e3a76d596845aad4e4bc860bd61ee47e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jun 5 12:13:49 2019 -0700
+
+    Slightly massage buffer-messaging commit
+    
+    Saves a few bytes.
+
+ src/hb-buffer.cc | 3 ---
+ src/hb-buffer.hh | 8 +++++++-
+ 2 files changed, 7 insertions(+), 4 deletions(-)
+
+commit 4ddab6facc0c7ffe7623bf6449ab9b27166924a6
+Merge: 157a414b 4b1b0bf2
+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
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jun 5 12:57:28 2019 +0430
+
+    Merge pull request #1755 from ebraminio/slim
+    
+    Don't use vsnprintf when HB_NO_BUFFER_MESSAGE is defined
+
+commit 815f002bb9230a52768a165383497cc98c58eadb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jun 5 10:38:06 2019 +0430
+
+    Don't use vsnprintf when HB_NO_BUFFER_MESSAGE is defined
+
+ src/hb-buffer.cc | 5 ++++-
+ src/hb-config.hh | 1 +
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 659eeddb2df5b97cc01bd39e106381f65c9f41f1
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Mon Jun 3 22:31:50 2019 +0700
+
+    Use C++11 override keyword.
+
+ util/hb-ot-shape-closure.cc |  2 +-
+ util/options.hh             | 30 +++++++++++++++---------------
+ 2 files changed, 16 insertions(+), 16 deletions(-)
+
+commit 2e16593b70688dfcee1788f38c6af03c5a589f6e
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sat Jun 1 20:54:46 2019 -0400
+
+    [myanmar] Make medial_group match the OT spec
+    
+    Sometime between [July 2018] and [January 2019], the OpenType Myanmar
+    grammar changed: one asat is now allowed after a medial ya, before any
+    other medial consonant.
+    
+    [July 2018]: http://web.archive.org/web/20180711011550/https://docs.microsoft.com/en-us/typography/script-development/myanmar
+    [January 2019]: http://web.archive.org/web/20190115044451/https://docs.microsoft.com/en-us/typography/script-development/myanmar
+    
+    This also reverts commit 439b05867c0856a81fa8f9bea3a7465b4b4bdd91, which
+    allowed an asat immediately after a medial ra.
+
+ src/hb-ot-shape-complex-myanmar-machine.hh | 249 +++++++++++++++--------------
+ src/hb-ot-shape-complex-myanmar-machine.rl |   2 +-
+ 2 files changed, 129 insertions(+), 122 deletions(-)
+
+commit 209491fc37c46281e063c3e6707d686d5f2b2ba4
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed May 29 14:03:17 2019 -0700
+
+    [subset] Hmtx/vmtx tables to use subset2 and new iterator frameworks
+
+ src/hb-ot-hmtx-table.hh | 115 +++++++++++++++++++++++-------------------------
+ src/hb-subset.cc        |   6 +--
+ 2 files changed, 59 insertions(+), 62 deletions(-)
+
+commit 89a7a880a1d5cd5e585d43fdde6d44c6dba559cf
+Merge: 760eb1bf 12febd68
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jun 4 10:52:16 2019 +0430
+
+    Merge pull request #1747 from harfbuzz/cff2-fdselect-fix
+    
+    fixed faulty FDSelect::sanitize
+
+commit 12febd68d694cc1bae44b0b672d88bf9fbe8568d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Jun 3 16:40:03 2019 -0700
+
+    added parentheses to FDSelect::sanitize as well
+
+ src/hb-ot-cff-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 65e66a2d371f42d018b1a22f31a6428d19a90284
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Jun 3 16:31:41 2019 -0700
+
+    added test data
+
+ ...zz-testcase-minimized-harfbuzz_fuzzer-6252118652092416 | Bin 0 -> 126 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit be82a2fc0c7ad3553f2e6dc8082a3255cb6c917c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Jun 3 15:52:23 2019 -0700
+
+    parenthesized cond-exp in CFF2FDSelect::sanitize
+
+ src/hb-ot-cff2-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 760eb1bf9398bd37103ca879e825fad9bef4bfdd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 3 05:48:04 2019 -0700
+
+    Reapply possible bsearch overflow fix
+    
+    Originally introduced in 21ede86 (#1314) but as it wasn't applied to hb_bsearch
+    accidentally removed while merging hb_bsearch_r to it.
+
+ src/hb-algs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5846884f86cae61c1b0c369c81427712fb97ed83
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Mon Jun 3 15:00:25 2019 +0700
+
+    test: Use nullptr in C++ code. (#1744)
+
+ src/test-ot-color.cc             | 8 ++++----
+ test/fuzzing/hb-shape-fuzzer.cc  | 6 +++---
+ test/fuzzing/hb-subset-fuzzer.cc | 2 +-
+ util/options-subset.cc           | 2 +-
+ 4 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 7c14b9014587e1423ef7481058e48dae84a65fce
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 2 13:51:26 2019 +0430
+
+    [ci] revert to xenial
+    
+    It should've done in a branch
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8278ff7dce41e6694eba15a7c94a0c0eb3bca427
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 2 00:36:30 2019 +0430
+
+    minor
+
+ src/hb-algs.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 33d38e793e2e4882337e5f42fbbae7d00d343940
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Jun 2 00:19:57 2019 +0430
+
+    Use a unified bsearch (#1741)
+    
+    A part of #593
+
+ src/hb-aat-layout.cc        | 10 +++++-----
+ src/hb-algs.hh              | 29 ++++-------------------------
+ src/hb-ot-post-table.hh     |  4 ++--
+ src/hb-ot-var-mvar-table.hh |  6 +++---
+ 4 files changed, 14 insertions(+), 35 deletions(-)
+
+commit 97b92685775983a280f335423263a6a8d82c3941
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 1 21:25:09 2019 +0430
+
+    [ci] Downgrade Travis distribution upon Behdad request
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit faf69e03f5ab9f3926442525f6c6e30fbc7a93d5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 1 11:02:25 2019 +0430
+
+    [ci] Install ragel on appveyor mingw bots
+    
+    Hopefully autotools timestamps issues will go
+
+ appveyor.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c91f3fa3eaf77fa255292c779f88da4feaaae8a0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Jun 1 10:55:37 2019 +0430
+
+    [dwrite] Replace REPLACEME with release version the symbol had
+
+ src/hb-directwrite.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 93c455567fe3d92a7efe65bf0e9ac2af794e2c4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 22:53:27 2019 -0700
+
+    2.5.1
+
+ NEWS             | 11 +++++++++++
+ configure.ac     |  2 +-
+ src/hb-version.h |  4 ++--
+ 3 files changed, 14 insertions(+), 3 deletions(-)
+
+commit 10e3cb9246ab3d288af4effe484f4d8beb2243d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 22:56:37 2019 -0700
+
+    [docs] Fix dist
+
+ docs/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 619f5f1eb9e5e2a4f326f89c9e3e05b01f9c042f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 22:31:35 2019 -0700
+
+    Fourth try at building VS bots
+    
+    Based on https://github.com/harfbuzz/harfbuzz/issues/1730#issuecomment-497151210
+
+ src/hb-algs.hh | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit f387a09742bd8e4a7a8da6db954339609839a113
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 22:12:23 2019 -0700
+
+    [ci] Disable VS 2013
+    
+    That one doesn't even understand constexpr.
+
+ appveyor.yml | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit aba3888d933474a874d2f3ff02397b523846466c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 22:11:27 2019 -0700
+
+    Third try at fixing VS build
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1730
+
+ src/hb-algs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8aaecbb5832568135f6149254ed9e17ac4310341
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 21:41:40 2019 -0700
+
+    Second VS fix try
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1730
+
+ src/hb-algs.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5a1b5c0a8b91a2291e7327e84acba2406a14414e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 21:08:39 2019 -0700
+
+    Try fixing VS builds
+    
+    Hopefully fixes https://github.com/harfbuzz/harfbuzz/issues/1730
+
+ src/hb-algs.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 66381fb73f21e8e3c1c14b196e64d1004be303c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 20:20:43 2019 -0700
+
+    [ci] Enable other versions of Visual Studio
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1730
+
+ appveyor.yml | 44 ++++++++++++++++++++++++--------------------
+ 1 file changed, 24 insertions(+), 20 deletions(-)
+
+commit 92fde3dea282d308fad2b8e93cd638aa813c6f2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 20:16:25 2019 -0700
+
+    Whitespace
+
+ src/hb-algs.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 49879adbfc57c3173a25bbc55afc0796ee71b6da
+Author: rsheeter <rsheeter@google.com>
+Date:   Fri May 31 15:14:44 2019 -0700
+
+    [subset] Correct calculation of max offset; fixes bug where loca would erroneously be short
+
+ src/hb-ot-glyf-table.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 2ad4ba7bc04fbbd886a2da6fbc55a4e13468d878
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 15:48:54 2019 -0700
+
+    [gsub] Minor
+
+ src/hb-ot-layout-gsub-table.hh | 40 +++++++++++++++++++++-------------------
+ 1 file changed, 21 insertions(+), 19 deletions(-)
+
+commit 2dbdec66a17af94fffc50949e4712465aada9a68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 15:38:11 2019 -0700
+
+    [gsub] Porting serialize to iterators
+
+ src/hb-ot-layout-gsub-table.hh | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+commit 1834cf86d40abfbb536db1edb366c90318ba49fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 14:39:32 2019 -0700
+
+    [serialize] Pass offset to serialize_subset()
+
+ src/hb-open-type.hh            | 14 +++++++++-----
+ src/hb-ot-layout-common.hh     |  4 ++--
+ src/hb-ot-layout-gdef-table.hh | 12 ++++++------
+ src/hb-ot-layout-gsubgpos.hh   |  7 ++++---
+ 4 files changed, 21 insertions(+), 16 deletions(-)
+
+commit 926044162472aeca8f5032b11b544d38be587110
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 31 14:34:34 2019 -0700
+
+    [serialize] Pass offset to serialize_copy()
+
+ src/hb-open-type.hh          | 12 ++++++++----
+ src/hb-ot-layout-common.hh   |  4 ++--
+ src/hb-ot-layout-gsubgpos.hh |  2 +-
+ src/hb-ot-name-table.hh      |  2 +-
+ 4 files changed, 12 insertions(+), 8 deletions(-)
+
+commit 87dd4bff1c42f1845fb3d11477e5de210121d48e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 30 11:26:17 2019 -0400
+
+    [math] Rename HB_MATH_GLYPH_PART_FLAG_EXTENDER
+    
+    To HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER.  Added a deprecated macro.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1734
+
+ src/hb-ot-deprecated.h  |  4 ++++
+ src/hb-ot-math-table.hh |  2 +-
+ src/hb-ot-math.h        |  2 +-
+ test/api/test-ot-math.c | 16 ++++++++--------
+ 4 files changed, 14 insertions(+), 10 deletions(-)
+
+commit 88f9dab366491af144da316384991e74af443226
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed May 29 01:55:31 2019 +0430
+
+    [ci] Clean up and add disabled bots of other msvc versions (#1733)
+
+ appveyor.yml | 41 ++++++++++++++++++++++++++++++-----------
+ 1 file changed, 30 insertions(+), 11 deletions(-)
+
+commit da9d43171ba4ae0a78c92e9de83498fd2f513c8b
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Tue May 28 21:50:17 2019 +0700
+
+    Fix some typos.
+
+ docs/usermanual-clusters.xml        | 4 ++--
+ docs/usermanual-fonts-and-faces.xml | 2 +-
+ src/hb-ot-math.h                    | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 8a133718472d152fa1f69ec52862b019b71b371f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue May 28 13:54:45 2019 +0430
+
+    [test] minor, fix copyright
+    
+    nothing important, fixing a copy paste error inconsistency
+
+ test/api/test-aat-layout.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 13316ac5d435f11c2c65fd2d762841a819afb639
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue May 28 13:48:39 2019 +0430
+
+    [test] minor style improve
+
+ test/subset/run-tests.py | 38 +++++++++++++++++++-------------------
+ 1 file changed, 19 insertions(+), 19 deletions(-)
+
+commit d64fb9db520d77eb7bb40ceda4e20be5e602bf91
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sun May 26 11:05:54 2019 -0400
+
+    [use] Allow U+1A60 TAI THAM SIGN SAKOT after vowel
+
+ src/gen-use-table.py                               |   7 +-
+ src/hb-ot-shape-complex-use-machine.hh             | 609 +++++++++++----------
+ src/hb-ot-shape-complex-use-machine.rl             |  20 +-
+ src/hb-ot-shape-complex-use-table.cc               |   4 +-
+ src/hb-ot-shape-complex-use.cc                     |   3 +
+ src/hb-ot-shape-complex-use.hh                     |   2 +
+ .../3cc01fede4debd4b7794ccb1b16cdb9987ea7571.ttf   | Bin 0 -> 1144 bytes
+ .../fd565cabd5208d345d0ed4fda7ae742917d846a5.ttf   | Bin 1056 -> 0 bytes
+ .../shaping/data/in-house/tests/use-syllable.tests |   5 +-
+ 9 files changed, 351 insertions(+), 299 deletions(-)
+
+commit 179570d4cae9aefcd91d540b8865a81d569b3358
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 27 13:08:07 2019 -0400
+
+    [atomic] Fix warning, second time
+    
+    Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1554306
+
+ src/hb-atomic.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ad17a8bdd571c7b275f9735e3602a8068f12934f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 16:33:21 2019 -0400
+
+    [ucd] Update for latest packTab
+
+ src/gen-ucd-table.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 771712b3ca97035ba5690e65bd7e63a852286159
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 15:58:45 2019 -0400
+
+    [ucd] Update for recent packTab
+    
+    No need for separate youseedy package.
+
+ src/gen-ucd-table.py | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 52aa6c57c5a4b18807a1329549dface90b148f22
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 25 22:55:06 2019 +0430
+
+    [ci] minor
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9b75da4299adb5487519ddf96e99949b1dad2d5c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 25 22:46:10 2019 +0430
+
+    [ci] minor
+
+ .circleci/config.yml | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 9158cab3f9f9e1a4941c1dbf0aa71455ceb00da6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 25 22:33:02 2019 +0430
+
+    [ci] Store dist-win result instead
+
+ .circleci/config.yml | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit 85b68a42af541bc91f2851389ac09b012a6d3aa1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 12:59:01 2019 -0400
+
+    [atomic] Fix warnings
+    
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1554306
+
+ src/hb-atomic.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 941c1b6d711b8528d0f5faa5655b09ea74f7dfb4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 12:52:16 2019 -0400
+
+    [mingw] Update instructions
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1728
+
+ RELEASING.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 210f93c143d0fa2a7b293a6ffd138b3e01cab7c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 12:49:20 2019 -0400
+
+    [mutex] Prefer pthread over windows
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1728
+
+ src/hb-mutex.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit a5d1b0bdaa0183e2bd310640f5867426096e0b18
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 12:45:40 2019 -0400
+
+    Look for pthread even if win32
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1728
+
+ configure.ac | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit f3b132187fc734cbb3705b405361c8bad9a72582
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 12:42:38 2019 -0400
+
+    [mingw] Some more tweaks
+    
+    It now survives ./config.status --recheck as well.
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1728
+
+ mingw-configure.sh | 37 ++++++++++++++++++-------------------
+ mingw32.sh         |  2 +-
+ mingw64.sh         |  2 +-
+ 3 files changed, 20 insertions(+), 21 deletions(-)
+
+commit c41ed54b169c16fb9862e88ddf127ae68c1561e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 12:35:09 2019 -0400
+
+    [mingw] Add "make dist-win" to toplevel Makefile
+
+ Makefile.am | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit a0a75a7c701932f4533b104eeb3c6087d01aa2ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 12:16:28 2019 -0400
+
+    [mingw] More
+
+ Makefile.am        |  8 +++++++-
+ mingw-configure.sh | 29 +++++++++++++++++++++++++++++
+ mingw32.sh         | 25 ++-----------------------
+ mingw64.sh         | 25 ++-----------------------
+ 4 files changed, 40 insertions(+), 47 deletions(-)
+
+commit 309a9d8ffb499f89738864acef596685ca495150
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 25 20:40:03 2019 +0430
+
+    [ci] Remove --without-icu now that we have it in ./mingw{32,64} scripts
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ccfe642c0cdc9fbc8280669e3e8b01dc5eb682d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 12:08:05 2019 -0400
+
+    [mingw] Force off ICU
+    
+    If cross-compiled ICU is not available, we might end up finding the
+    native ICU via icu-config.  That's distracting.
+
+ mingw32.sh | 2 +-
+ mingw64.sh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 0e6b7f7cd51d7376f21a422881cb4eb542360b0b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 25 20:27:29 2019 +0430
+
+    [ci] Build mingw on Fedora and store .exe outputs
+
+ .circleci/config.yml | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+commit 7b716cbbe6de2902ca6b1f67024b3f8cdb41340c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 11:37:23 2019 -0400
+
+    [ming2] Update instructions
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1728
+    
+    Only left to write how to create a win32 bundle.
+
+ README.mingw.md | 44 ++++++++++++++++++++++++++------------------
+ RELEASING.md    | 54 ++++++------------------------------------------------
+ 2 files changed, 32 insertions(+), 66 deletions(-)
+
+commit 77a1b6b7c3bd5490ffa5bb48a8b52d9c4c18e669
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 11:18:40 2019 -0400
+
+    [mingw] Rename README.wine
+
+ Makefile.am                       | 2 +-
+ README.wine.md => README.mingw.md | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit c68b4264880c0f99bcb579345e51ce54e799655b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 11:17:56 2019 -0400
+
+    [mingw] Update for recent change
+
+ README.wine.md | 2 +-
+ RELEASING.md   | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 5cf2e648a67e1af20a23e010c86e8812a74ff7a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 25 11:15:15 2019 -0400
+
+    [mingw] Update for Fedora mingw installation location
+    
+    Also adds --with-uniscribe by default.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1728
+
+ mingw32.sh | 9 +++++----
+ mingw64.sh | 9 +++++----
+ 2 files changed, 10 insertions(+), 8 deletions(-)
+
+commit e7ed85de95d3ccdb674ec5a30ae66d53cea74b3a
+Merge: f93a5e6a 97ba206b
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 25 16:05:07 2019 +0100
+
+    Merge pull request #1691 from n8willis/usermanual-shaping
+    
+    Usermanual: Add new chapters.
+
+commit 97ba206bed341dc7c915a86531512b1e0617303d
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sat May 25 12:26:50 2019 +0100
+
+    Usermanual; minor.
+
+ ...usermanual-buffers-language-script-and-direction.xml |  2 +-
+ docs/usermanual-opentype-features.xml                   | 17 ++++++++++-------
+ 2 files changed, 11 insertions(+), 8 deletions(-)
+
+commit f93a5e6a7dad4fde2bf61c241bf32da678525c8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 24 17:02:38 2019 -0400
+
+    [win] Add mingw-ldd.py
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1728
+
+ mingw-ldd.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 58 insertions(+)
+
+commit 5fd3ece5237ac6a4ee95b2665b5e20102ed176bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 24 15:56:15 2019 -0400
+
+    2.5.0
+
+ Makefile.am      |  2 +-
+ NEWS             | 14 ++++++++++++++
+ configure.ac     |  2 +-
+ src/hb-version.h |  4 ++--
+ 4 files changed, 18 insertions(+), 4 deletions(-)
+
+commit 1da089179b9bd06f071f967d128819e85998b809
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 24 15:41:34 2019 -0400
+
+    Put back Since: tags for hb_color_get_*
+
+ src/hb-common.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit dd5ad6b6b5aed3db62bc03b89acf90c68795edb4
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri May 24 20:30:22 2019 +0100
+
+    Usermanual-buffers-chapter: trim out fallback-of-ufuncs talk and just mention that stuff exists if you care to go find it.
+
+ docs/usermanual-buffers-language-script-and-direction.xml | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit e1a5ce6aa661251e998df7b3612a1d5d39e28827
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri May 24 10:58:52 2019 -0700
+
+    Fix fuzzer crash testcase
+    
+    Add a check for stringOffSet(uint16) overflow,
+    return early if overflow happens
+
+ src/hb-ot-name-table.hh                                |   2 +-
+ ...estcase-minimized-hb-subset-fuzzer-5077547978588160 | Bin 0 -> 339602 bytes
+ ...estcase-minimized-hb-subset-fuzzer-5761434614497280 | Bin 0 -> 532 bytes
+ 3 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 240540ff9a463cf386ae5755471a5621b94290df
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri May 24 20:13:35 2019 +0100
+
+    Usermanual-buffers-chapter: explain ICU fallback for Ufuncs.
+
+ docs/usermanual-buffers-language-script-and-direction.xml | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit d100ccad02b038719472b2cc733940ffb0374cd1
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sun May 19 10:01:20 2019 -0400
+
+    [use] Allow multiple FMs in a cluster
+
+ src/gen-use-table.py                   |  12 +-
+ src/hb-ot-shape-complex-use-machine.hh | 567 ++++++++++++++++-----------------
+ src/hb-ot-shape-complex-use-machine.rl |  14 +-
+ src/hb-ot-shape-complex-use-table.cc   |  38 ++-
+ src/hb-ot-shape-complex-use.hh         |  11 +-
+ 5 files changed, 315 insertions(+), 327 deletions(-)
+
+commit 322df806eef74247c8bf0da200a2cde29133950e
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri May 24 19:49:19 2019 +0100
+
+    [Docs] Usermanual: integration chapter; add GI-Python section.
+
+ docs/usermanual-integration.xml | 35 +++++++++++++++++++++++------------
+ 1 file changed, 23 insertions(+), 12 deletions(-)
+
+commit 487879e013758aef2c7f824033a40cd56361d240
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 24 12:37:53 2019 -0400
+
+    Don't compile in UCD if HB_NO_UCD defined
+
+ src/hb-ucd.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 1fffe51a295b6106a442bed8107d305c325bef05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 24 10:52:09 2019 -0400
+
+    [blob] Shuffle
+
+ src/hb-blob.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 773c85f343e8958daf271d91d64033514289c236
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri May 24 19:23:19 2019 +0100
+
+    [Docs] Usermanual: integration chapter; add ICU section.
+
+ docs/usermanual-integration.xml | 47 +++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 45 insertions(+), 2 deletions(-)
+
+commit 96de94768b08287325be8947255917502368c337
+Merge: c96c6b28 1197bef2
+Author: rsheeter <rsheeter@google.com>
+Date:   Fri May 24 11:22:41 2019 -0700
+
+    Merge pull request #1722 from googlefonts/glyf
+    
+    [subset] Use iterators in glyf/loca subsetting
+
+commit 1197bef26c63ee896bea3fab5788635cb0fc9d18
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri May 24 10:52:49 2019 -0700
+
+    [subset] Per code review, use hb_array to avoid duplicated type name
+
+ src/hb-ot-glyf-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c0bb66ecbff712221fb7c97f628ed026926229b2
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri May 24 18:49:40 2019 +0100
+
+    [Docs] Usermanual: integration chapter; add CoreText/Mac section.
+
+ docs/usermanual-integration.xml | 107 +++++++++++++++++++++++++++++++++-------
+ 1 file changed, 89 insertions(+), 18 deletions(-)
+
+commit e66253283385aa67eb9c5ab627139a56f9ae5a71
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri May 24 10:39:56 2019 -0700
+
+    [subset] Cppcheck complaints
+
+ test/api/hb-test.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 13b3cd307e7dedea3b419fb06d81a008e49ccff6
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri May 24 10:10:12 2019 -0700
+
+    [subset] Address @behdad review feedback
+
+ src/hb-ot-glyf-table.hh | 18 ++++++++----------
+ 1 file changed, 8 insertions(+), 10 deletions(-)
+
+commit dd1c7656a5918702a81bc3aaf66e0e54fdb3c545
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri May 24 14:30:15 2019 +0100
+
+    [Docs] Usermanual: integration chapter; add Uniscribe/Windows section.
+
+ docs/usermanual-integration.xml | 110 ++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 105 insertions(+), 5 deletions(-)
+
+commit 2da567e7b69da95738015b445901afb00094d92b
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Fri May 24 11:13:53 2019 +0100
+
+    [Docs] Usermanual: platform integration chapter; add intro, GLib, FreeType sections. Update XML TOCs to match.
+
+ docs/Makefile.am                |   1 +
+ docs/harfbuzz-docs.xml          |   1 +
+ docs/usermanual-integration.xml | 365 ++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 367 insertions(+)
+
+commit c96c6b287ff1d96da6a50a8cb3f641fe8705e5f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 23 21:37:17 2019 -0400
+
+    One more
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b567d4ea14cc6ec0e8efc64a4993a9b0461adb20
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 23 21:36:42 2019 -0400
+
+    Fix build after UCDN -> UCD
+
+ CMakeLists.txt                       | 14 --------------
+ configure.ac                         | 18 +-----------------
+ docs/usermanual-install-harfbuzz.xml | 34 ++++++++--------------------------
+ 3 files changed, 9 insertions(+), 57 deletions(-)
+
+commit 226ab06ec110f4cbd56b39ce0d05d349dfec35b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 23 20:39:04 2019 -0400
+
+    [ucd] Add URL to dependencies
+
+ src/gen-ucd-table.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 65392b734e38668b870b1ffcbfb4b42ec289ef58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 22 16:21:21 2019 -0400
+
+    [ucdn] Replace UCDN with a new UCD implementation
+    
+    UCDN was ~120kb of data.  New implementatoin is 69kb in default builds,
+    and 49kb if built with HB_OPTIMIZE_SIZE or __OPTIMIZE_SIZE__.  The
+    latter automatically enabled if built with -Os or -Oz.
+    
+    There's room to shave off another 10kb or 20kb.  That will follow later.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/Makefile.am              |   11 -
+ src/Makefile.sources         |    5 +-
+ src/gen-ucd-table.py         |   11 +-
+ src/hb-algs.hh               |    8 +
+ src/hb-ot-layout.cc          |   76 +-
+ src/hb-ucd-table.hh          | 5160 +++++++++++++++++++++++++++++++++++++
+ src/hb-ucd.cc                |  209 ++
+ src/hb-ucdn.cc               |  272 --
+ src/hb-ucdn/COPYING          |   13 -
+ src/hb-ucdn/Makefile.am      |   16 -
+ src/hb-ucdn/Makefile.sources |    7 -
+ src/hb-ucdn/README           |   40 -
+ src/hb-ucdn/ucdn.c           |  361 ---
+ src/hb-ucdn/ucdn.h           |  472 ----
+ src/hb-ucdn/ucdn_db.h        | 5790 ------------------------------------------
+ src/hb-unicode.cc            |    8 +-
+ 16 files changed, 5427 insertions(+), 7032 deletions(-)
+
+commit 12c59f6c40401c8221facc5d0aed63f510a77dd7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 23 13:33:21 2019 -0400
+
+    [deprecated] Minor
+
+ src/hb-deprecated.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 36dee9221f8de3a2a6a23f0548460aab4982b594
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 22 15:51:53 2019 -0400
+
+    [gen-ucd] Rename
+
+ src/Makefile.am                      | 1 +
+ src/{gen-ucd.py => gen-ucd-table.py} | 0
+ 2 files changed, 1 insertion(+)
+
+commit 831c213501fc38229755be7958b2952fe0cdff0e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 22 15:46:19 2019 -0400
+
+    [gen-ucd] Minor
+
+ src/gen-ucd.py | 30 +++++++++++++++++++++++++++---
+ 1 file changed, 27 insertions(+), 3 deletions(-)
+
+commit 15a9e32b566fbf6f4a2c6fd488d8cc3865234b17
+Merge: 993d81b9 ff7fc6d4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 23 11:02:15 2019 +0430
+
+    Merge pull request #1723 from googlefonts/drop_tables
+    
+    [subset] Add morx, mort, kern, and kernx to the default layout tables…
+
+commit ff7fc6d488f37e3faaca4986cde35836f013b03f
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 22 17:36:16 2019 -0700
+
+    [subset] Add morx, mort, kern, and kernx to the default layout tables drop list.
+
+ src/hb-subset-input.cc | 4 ++++
+ src/hb-subset.cc       | 4 ++++
+ 2 files changed, 8 insertions(+)
+
+commit 993d81b9c57f2e27d80d276953b0430821129425
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue May 14 13:55:11 2019 -0700
+
+    [subset] Add one ttf file with fvar/STAT tables to integration test
+    Ignore gvar/MVAR/HVAR table
+    add support for --nameIDs=* option
+
+ src/hb-ot-cmap-table.hh                            |  27 +++++++++++++++++----
+ src/hb-ot-stat-table.hh                            |   2 +-
+ src/hb-subset-input.cc                             |   1 +
+ src/hb-subset-plan.cc                              |   6 +----
+ test/api/hb-subset-test.h                          |   2 +-
+ .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 0 -> 6492 bytes
+ .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 0 -> 6316 bytes
+ .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 0 -> 6148 bytes
+ .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 0 -> 6088 bytes
+ .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 0 -> 6068 bytes
+ ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 0 -> 3284 bytes
+ ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 0 -> 3164 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 0 -> 2868 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 0 -> 3020 bytes
+ ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 0 -> 3024 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 0 -> 1952 bytes
+ .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 0 -> 1832 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 0 -> 1704 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 0 -> 1688 bytes
+ .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 0 -> 1688 bytes
+ .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 0 -> 6236 bytes
+ .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 0 -> 6060 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 0 -> 5892 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 0 -> 5832 bytes
+ .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 0 -> 5812 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 0 -> 7824 bytes
+ .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 0 -> 7648 bytes
+ .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 0 -> 7312 bytes
+ .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 0 -> 7420 bytes
+ .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 0 -> 7404 bytes
+ ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 3784 -> 2384 bytes
+ .../SourceSansPro-Regular.default.61,62,63.otf     | Bin 3496 -> 2096 bytes
+ ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 3612 -> 2212 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 33516 -> 32124 bytes
+ ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 31080 -> 29688 bytes
+ ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34708 -> 33316 bytes
+ ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 3640 -> 2240 bytes
+ ...urceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 3400 -> 2000 bytes
+ ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 3596 -> 2196 bytes
+ ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 33352 -> 31960 bytes
+ ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 30956 -> 29564 bytes
+ ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34560 -> 33168 bytes
+ ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 3480 -> 2080 bytes
+ ...-Regular.drop-hints-desubroutinize.61,62,63.otf | Bin 3288 -> 1876 bytes
+ ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 3448 -> 2048 bytes
+ ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 33448 -> 32052 bytes
+ ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 31028 -> 29632 bytes
+ ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34576 -> 33180 bytes
+ ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 3564 -> 2164 bytes
+ .../SourceSansPro-Regular.drop-hints.61,62,63.otf  | Bin 3340 -> 1940 bytes
+ ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 3464 -> 2064 bytes
+ ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 33668 -> 32276 bytes
+ .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 31180 -> 29788 bytes
+ ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 34724 -> 33332 bytes
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 3772 -> 3164 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 3368 -> 2760 bytes
+ .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 3732 -> 3124 bytes
+ ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 2224 -> 1616 bytes
+ .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 2016 -> 1408 bytes
+ .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 2252 -> 1644 bytes
+ ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 3112 -> 2684 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 3356 -> 2928 bytes
+ .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2656 -> 2228 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3652 -> 3224 bytes
+ .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 2396 -> 1968 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 2384 -> 1956 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2628 -> 2200 bytes
+ .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1928 -> 1500 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2924 -> 2496 bytes
+ .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1668 -> 1240 bytes
+ test/subset/data/fonts/Comfortaa-Regular-new.ttf   | Bin 0 -> 230316 bytes
+ test/subset/data/tests/basics.tests                |   1 +
+ test/subset/generate-expected-outputs.py           |   3 +--
+ test/subset/run-tests.py                           |   3 ++-
+ util/options-subset.cc                             |  23 +++++++++++++++---
+ 75 files changed, 50 insertions(+), 18 deletions(-)
+
+commit 58ce477ac170969430310750b78dcb5f9e3b06a3
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue May 21 20:22:40 2019 -0700
+
+    [subset] Report failure more often
+
+ src/hb-ot-glyf-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 51a0129f7322e97825455df4eb6eecfea14980f5
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue May 21 20:12:19 2019 -0700
+
+    [subset] Thar be comparison of integers of different signs
+
+ test/api/hb-test.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 14e3b0cf41d9657c39f1f921f7e09a1418fa3278
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue May 21 20:09:36 2019 -0700
+
+    [subset] Code review feedback
+
+ src/hb-ot-glyf-table.hh | 53 +++++++++++++++++++++++++------------------------
+ 1 file changed, 27 insertions(+), 26 deletions(-)
+
+commit a03ed95e7d50b9dd947e8982c7730de969795b05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 21 16:43:14 2019 -0400
+
+    [gen-ucd] Generate decomposition tables
+    
+    Code is ugly.  Ugh.
+
+ src/gen-ucd.py | 40 ++++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
+
+commit 8a48c88fa9fe047a83ba4a45dbd6399412ca3302
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 21 13:02:54 2019 -0400
+
+    [gen-ucd] Comment
+
+ src/gen-ucd.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit b71d353cee89a6654810f75e7a1d7fd156b76faa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 17:33:55 2019 -0400
+
+    [gen-ucd] Remove some code
+
+ src/gen-ucd.py | 7 -------
+ 1 file changed, 7 deletions(-)
+
+commit 4ea44112b5163591ce0b086e0d13ec368f4f6ddc
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue May 21 13:07:43 2019 -0700
+
+    [subset] Remove missed reference to hb-subset-glyf, was deleted
+
+ src/Makefile.sources | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit b928de91a755788fd0fad9fa0f5f03c5670ac6a3
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue May 21 11:23:26 2019 -0700
+
+    [subset] Add test/subset/data/expected/layout to dist list.
+
+ test/subset/data/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0af9de13b78ddd35f58ee02ce8ffeffd99509ec5
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon May 20 15:04:20 2019 -0700
+
+    [subset] For gsub subsetting only consider glyphs reachable via gsub closure.
+
+ src/hb-ot-layout-gsub-table.hh |  4 +--
+ src/hb-subset-plan.cc          | 55 ++++++++++++++++++++----------------------
+ src/hb-subset-plan.hh          | 10 ++++++++
+ 3 files changed, 38 insertions(+), 31 deletions(-)
+
+commit c740c8636b48b1790bba42445a301e8e1cf8f749
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 16 10:57:33 2019 -0700
+
+    [subset] Add integration tests for SingleSubst.
+
+ test/subset/data/Makefile.sources                      |   1 +
+ ...ular.smallcaps.keep-layout-retain-gids.41,42,43.ttf | Bin 0 -> 6780 bytes
+ ...Regular.smallcaps.keep-layout-retain-gids.41,43.ttf | Bin 0 -> 6396 bytes
+ ...to-Regular.smallcaps.keep-layout-retain-gids.41.ttf | Bin 0 -> 6032 bytes
+ ...to-Regular.smallcaps.keep-layout-retain-gids.43.ttf | Bin 0 -> 6088 bytes
+ ...Regular.smallcaps.keep-layout-retain-gids.CA,CB.ttf | Bin 0 -> 7932 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf  | Bin 0 -> 2972 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.41,43.ttf     | Bin 0 -> 2572 bytes
+ .../layout/Roboto-Regular.smallcaps.keep-layout.41.ttf | Bin 0 -> 2196 bytes
+ .../layout/Roboto-Regular.smallcaps.keep-layout.43.ttf | Bin 0 -> 2268 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.CA,CB.ttf     | Bin 0 -> 2612 bytes
+ test/subset/data/fonts/Roboto-Regular.smallcaps.ttf    | Bin 0 -> 131632 bytes
+ test/subset/data/profiles/keep-layout-retain-gids.txt  |   2 ++
+ test/subset/data/profiles/keep-layout.txt              |   1 +
+ test/subset/data/tests/full-font.tests                 |   1 -
+ test/subset/data/tests/layout.tests                    |  13 +++++++++++++
+ test/subset/generate-expected-outputs.py               |   3 ++-
+ 17 files changed, 19 insertions(+), 2 deletions(-)
+
+commit 349d692b0ee45330220fd3ec9267979d73acd149
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue May 21 12:38:53 2019 -0700
+
+    [subset] Iter in and out for loca
+
+ src/hb-ot-glyf-table.hh | 31 ++++++++++++++++---------------
+ test/api/hb-test.h      |  7 ++-----
+ 2 files changed, 18 insertions(+), 20 deletions(-)
+
+commit 95445d79be0a79e6e2d384d46819730146d397d8
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue May 21 11:14:31 2019 -0700
+
+    [subset] Write loca using more idiomatic harfbuzzese
+
+ src/hb-ot-glyf-table.hh | 35 +++++++++++++++++++----------------
+ 1 file changed, 19 insertions(+), 16 deletions(-)
+
+commit d1b12a546561a78ae3c3e9d6bffa057caf82dbee
+Merge: 3a43603e f49a5bec
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon May 20 21:29:54 2019 -0700
+
+    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf
+
+commit 3a43603ecea2c349f58396e103a52948776681e0
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon May 20 20:40:55 2019 -0700
+
+    [subset] Fix memory leak caused by failure to cleanup glyf accelerator
+
+ src/hb-ot-glyf-table.hh | 42 ++++++++++++++++++++++++++----------------
+ 1 file changed, 26 insertions(+), 16 deletions(-)
+
+commit 5cedda5e4a3f726168b87d357aee723e6fd919cd
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu May 16 19:16:52 2019 -0700
+
+    [subset] Fix null pointer deref, tidy up a bit
+
+ src/hb-ot-glyf-table.hh     | 282 +++++++++++++++++++++++++-------------------
+ test/api/test-subset-glyf.c |  18 +--
+ 2 files changed, 167 insertions(+), 133 deletions(-)
+
+commit 8a84b540c7b850c1fb30d5bc1ffdeb43033be173
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu May 16 19:14:16 2019 -0700
+
+    [subset] Tests passing using iterator based glyf
+
+ src/hb-ot-glyf-table.hh     | 117 +++++++++++++++++++++++++++++++-------------
+ test/api/test-subset-glyf.c |   4 +-
+ 2 files changed, 86 insertions(+), 35 deletions(-)
+
+commit 82bbec306376d61b6700461c4038c6789e60a998
+Merge: 9d09ac13 b7be5931
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu May 16 15:14:01 2019 -0700
+
+    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf
+
+commit 9d09ac13a114967576284d0b006a0ac7965d928a
+Author: rsheeter <rsheeter@google.com>
+Date:   Sat May 11 23:16:40 2019 -0700
+
+    [subset] Tweak hint stripping
+
+ src/hb-ot-glyf-table.hh | 46 +++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 33 insertions(+), 13 deletions(-)
+
+commit 3a4c928fcfce5a8c7a56907b9945e87b0ce8e327
+Author: rsheeter <rsheeter@google.com>
+Date:   Sat May 11 22:06:46 2019 -0700
+
+    [subset] Fix glyf tests except hint stripping & local test asan
+
+ src/hb-ot-glyf-table.hh     | 93 +++++++++++++++++++++++++++++++++------------
+ test/api/hb-subset-test.h   |  2 +-
+ test/api/hb-test.h          | 13 +++++++
+ test/api/test-subset-glyf.c |  8 ++--
+ 4 files changed, 86 insertions(+), 30 deletions(-)
+
+commit b77dde8f138442935e5ca99460a520a4117d6dd2
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri May 10 16:52:19 2019 -0700
+
+    [subset] Destroy blob
+
+ src/hb-ot-glyf-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 14db6512f8dca80a575f468708949346b005834a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri May 10 09:32:43 2019 -0700
+
+    [subset] Correct flipped use short computation
+
+ src/hb-ot-glyf-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ab3fe5de2bbe10fdc13711537f824b62d091f995
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu May 9 22:12:20 2019 -0700
+
+    [subset] Glyf by iter now runs but fails tests
+
+ src/hb-ot-glyf-table.hh | 88 +++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 59 insertions(+), 29 deletions(-)
+
+commit f8de063b48c243d551c8892bdd2a799606fda3f4
+Merge: 0d7fef2d 8f174870
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu May 9 20:02:38 2019 -0700
+
+    Merge branch 'glyf' of github.com:googlefonts/harfbuzz into glyf
+
+commit 0d7fef2d50bba714815c0c13f3b3dd6464710a1d
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 16:52:00 2019 -0700
+
+    [subset] Dinner time, checkpoint
+
+ src/hb-ot-glyf-table.hh | 97 +++++++++++++++++++++++++++++--------------------
+ 1 file changed, 58 insertions(+), 39 deletions(-)
+
+commit 240bc86e3a0b177ee84ec9c60723304a0cf4c405
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 14:59:03 2019 -0700
+
+    [subset] Remove subset-glyf; want everything to point to new iter-based edition. Some of the code will resurface as impl builds out.
+
+ src/Makefile.sources    |   2 -
+ src/hb-ot-glyf-table.hh |   9 +-
+ src/hb-subset-glyf.cc   | 346 ------------------------------------------------
+ src/hb-subset-glyf.hh   |  40 ------
+ src/hb-subset.cc        |   1 -
+ 5 files changed, 6 insertions(+), 392 deletions(-)
+
+commit 02d4d4f3e67dcc37915bc386d506bb272455ff1e
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 14:43:18 2019 -0700
+
+    [subset] Starting to sketch glyf as iter
+
+ src/hb-ot-glyf-table.hh | 60 ++++++++++++++++++++++++++++++++++++-------------
+ src/hb-subset-plan.hh   |  2 ++
+ src/hb-subset.cc        |  2 +-
+ 3 files changed, 47 insertions(+), 17 deletions(-)
+
+commit 8f174870e9eed4c47463fdb0d4fe3e22a6f5fdc8
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 16:52:00 2019 -0700
+
+    [subset] Dinner time, checkpoint
+
+ src/hb-ot-glyf-table.hh | 97 +++++++++++++++++++++++++++++--------------------
+ 1 file changed, 58 insertions(+), 39 deletions(-)
+
+commit 723d054dcb6ad44e9eab4dc8cc55f8d480d2ff16
+Merge: ed727d4b e2a51ff7
+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
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 16:39:45 2019 -0700
+
+    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf
+
+commit fb9bff955a9356b053c5c9bcd7aa9101edb55767
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 14:59:03 2019 -0700
+
+    [subset] Remove subset-glyf; want everything to point to new iter-based edition. Some of the code will resurface as impl builds out.
+
+ src/Makefile.sources    |   2 -
+ src/hb-ot-glyf-table.hh |   9 +-
+ src/hb-subset-glyf.cc   | 346 ------------------------------------------------
+ src/hb-subset-glyf.hh   |  40 ------
+ src/hb-subset.cc        |   1 -
+ 5 files changed, 6 insertions(+), 392 deletions(-)
+
+commit f9b089b695edc89023e3d62700ae68d5648f8494
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 14:43:18 2019 -0700
+
+    [subset] Starting to sketch glyf as iter
+
+ src/hb-ot-glyf-table.hh | 60 ++++++++++++++++++++++++++++++++++++-------------
+ src/hb-subset-plan.hh   |  2 ++
+ src/hb-subset.cc        |  2 +-
+ 3 files changed, 47 insertions(+), 17 deletions(-)
+
+commit f49a5bec9fc241c098be5a49233aa83cd5dc098e
+Author: rsheeter <rsheeter@google.com>
+Date:   Mon May 20 20:45:11 2019 -0700
+
+    [docs] Tweak fuzzer doc
+
+ TESTING.md | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 1aadd1449c65c50d5f35191f43136841c64ad399
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 17:29:13 2019 -0400
+
+    [gen-ucd] Generate script order table
+
+ src/gen-ucd.py | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit be8de188671c04ddd8ec4d7af38b313322189136
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 17:17:38 2019 -0400
+
+    [gen-ucd] Start adding script-order
+
+ src/gen-ucd.py | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+commit 4a0eb066fdceb0cab48107f17670d6943ec0d61e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 16:57:04 2019 -0400
+
+    [gen-ucd] Add gc order
+
+ src/gen-ucd.py | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit d1f9b2f961c71e5218ee359e8fb20cfbdb894c7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 15:47:49 2019 -0400
+
+    [gen-ucd] Flesh out a bit more
+
+ src/gen-ucd.py | 52 ++++++++++++++++++++++++++++++++++++++++------------
+ 1 file changed, 40 insertions(+), 12 deletions(-)
+
+commit d6de4659aa7edb991507f8838dc566874e5b6a61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 15:33:23 2019 -0400
+
+    Add HB_OPTIMIZE_SIZE
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 0ff3618c2d841d16cce9ba2d73321048e7ca6a2d
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri May 17 15:30:01 2019 -0700
+
+    [subset] Use hb_subset_input_t inside of subset_options_t so that input defaults are shared between the library and cli.
+
+ src/hb-subset-input.cc           |  42 ++++++++-----
+ src/hb-subset-input.hh           |   7 +--
+ src/hb-subset-plan.cc            |   3 +-
+ src/hb-subset-plan.hh            |   1 -
+ src/hb-subset.cc                 |  23 +------
+ src/hb-subset.h                  |   6 --
+ test/api/test-subset-glyf.c      |   8 ++-
+ test/fuzzing/hb-subset-fuzzer.cc |   8 ++-
+ util/Makefile.am                 |   5 +-
+ util/Makefile.sources            |   1 +
+ util/hb-subset.cc                |   9 +--
+ util/options-subset.cc           | 127 +++++++++++++++++++++++++++++++++++++++
+ util/options.cc                  | 101 -------------------------------
+ util/options.hh                  |  20 ++----
+ 14 files changed, 182 insertions(+), 179 deletions(-)
+
+commit 67064294a0c521550f5277b51b8c7e5d6bb27e68
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 16 15:13:39 2019 -0700
+
+    [subset] Add drop-tables option to hb-subset util.
+
+ util/hb-subset.cc |  1 +
+ util/options.cc   | 45 ++++++++++++++++++++++++++++++++++++++++++---
+ util/options.hh   |  3 +++
+ 3 files changed, 46 insertions(+), 3 deletions(-)
+
+commit 3be0ffe45d1ba32ddd8d3af25ff2c420be85da76
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 16 11:29:15 2019 -0700
+
+    [subset] Add drop tables to subset input.
+
+ src/hb-subset-input.cc             |  8 +++++
+ src/hb-subset-input.hh             |  1 +
+ src/hb-subset-plan.cc              |  3 ++
+ src/hb-subset-plan.hh              |  5 ++-
+ src/hb-subset.cc                   |  3 ++
+ src/hb-subset.h                    |  3 ++
+ test/api/Makefile.am               |  2 ++
+ test/api/test-subset-drop-tables.c | 71 ++++++++++++++++++++++++++++++++++++++
+ 8 files changed, 95 insertions(+), 1 deletion(-)
+
+commit d00a20bedc5706d4d764f78ea108ca4316651b11
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon May 20 17:38:38 2019 +0100
+
+    [Docs] Add gtk-doc comments to hb-graphite2.
+
+ src/hb-graphite2.cc | 16 ++++++++++++++--
+ src/hb-graphite2.h  | 10 +++++++++-
+ 2 files changed, 23 insertions(+), 3 deletions(-)
+
+commit 0a5a8fcbceb49f317a16803da090864f9ea03577
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon May 20 17:38:13 2019 +0100
+
+    [Docs] Add gtk-doc comments to hb-icu.
+
+ src/hb-icu.cc | 35 ++++++++++++++++++++++++++++++++++-
+ 1 file changed, 34 insertions(+), 1 deletion(-)
+
+commit 9126a5ff070fe1191dfaf852aa601d506ddcffcb
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon May 20 17:37:56 2019 +0100
+
+    [Docs] Add gtk-doc comments to hb-ft.
+
+ src/hb-ft.cc | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 117 insertions(+), 18 deletions(-)
+
+commit bfa7b0af02a6ec66898723fe3e82f74760996a10
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon May 20 17:36:55 2019 +0100
+
+    [Docs] Add gtk-doc comments to hb-gobject and hb-glib.
+
+ src/hb-glib.cc            | 44 +++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-gobject-structs.cc | 13 +++++++++++--
+ 2 files changed, 54 insertions(+), 3 deletions(-)
+
+commit 27222253d42d0485ec5a9a3db602f5cba64df94e
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon May 20 17:36:18 2019 +0100
+
+    [Docs] Add gtk-doc comments to hb-uniscribe.
+
+ src/hb-uniscribe.cc | 22 +++++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+
+commit 32ae0d3e78c4e1f7299cb4fa251c0e66b3d5ae78
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon May 20 17:35:39 2019 +0100
+
+    [Docs] Add gtk-doc comments to hb-coretext.
+
+ src/hb-coretext.cc | 45 +++++++++++++++++++++++++++++++++++++++++----
+ src/hb-coretext.h  | 32 ++++++++++++++++++++++++++++++++
+ 2 files changed, 73 insertions(+), 4 deletions(-)
+
+commit 0ca7ad4352eff357cbb5cc1dfe62aa15b440de84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 11:39:07 2019 -0400
+
+    [cff] Fix unlikely invocations
+
+ src/hb-ot-cff-common.hh | 8 ++++----
+ src/hb-ot-cff1-table.hh | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 9ef241cd409b7ad4eeb8259cbf1a7a01358a766e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 11:38:02 2019 -0400
+
+    [test] Add one more
+
+ ...-testcase-minimized-hb-subset-fuzzer-5634197349203968 | Bin 0 -> 5791 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 3efb7af7e28061f8cd138eb2ed5261bf521abc63
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 20 11:37:16 2019 -0400
+
+    [STAT] Fix sanitize condition
+    
+    Oops!
+    
+    Fixes https://oss-fuzz.com/testcase-detail/5696825891225600
+
+ src/hb-ot-stat-table.hh                                    |   2 +-
+ ...zz-testcase-minimized-hb-subset-fuzzer-5696825891225600 | Bin 0 -> 69 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit e66eb21a46b2374bfb51f86ed9f5eec35ba87a61
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 18 07:44:48 2019 -0700
+
+    Don't set _POSIX_C_SOURCE in NetBSD
+    
+    According to a harfbuzz package patch on NetBSD project
+    https://github.com/NetBSD/pkgsrc/blob/trunk/fonts/harfbuzz/patches/patch-src_hb-blob.cc
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 08c3648c6e18a0969a64284337dbd5b435d40f37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 17 16:21:34 2019 -0700
+
+    Oops, fix include
+
+ src/hb-set.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 24958b8868a8003936e872d8fda873c52d528bcf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 17 16:20:36 2019 -0700
+
+    [set] Use StructAtOffsetUnaligned
+
+ src/hb-set.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a0febbac439ac4cc58af674f676e473d2f6d726f
+Author: rsheeter <rsheeter@google.com>
+Date:   Thu May 16 15:58:49 2019 -0700
+
+    Update TESTING.md
+
+ TESTING.md | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit b7be59311f27112791e9b9c6356464e1c3ff92c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 16 13:32:56 2019 -0700
+
+    Fix msan issue
+    
+    The fact that HB_AUTO_RETURN will return rvalue-references for rvalues
+    is very disturbing.
+    
+    Even apart from that, I'm totally lost re any hb_move needs or
+    hb_forward'ing to functions/templates where the type is fixed by
+    explicitly specifying template parameters.
+    
+    ==1==ERROR: AddressSanitizer: stack-use-after-return on address 0x7f6ad65e51e0 at pc 0x0000005da240 bp 0x7ffc104ab670 sp 0x7ffc104ab668
+    READ of size 4 at 0x7f6ad65e51e0 thread T0
+    SCARINESS: 55 (4-byte-read-stack-use-after-return)
+         #0 0x5da23f in bool OT::Coverage::serialize<hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, (void*)0>(hb_serialize_context_t*, hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>) harfbuzz/src/hb-ot-layout-common.hh:1055:16
+         #1 0x5d88f9 in bool OT::SingleSubstFormat1::serialize<hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, (void*)0>(hb_serialize_context_t*, hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, unsigned int) harfbuzz/src/hb-ot-layout-gsub-table.hh:98:9
+
+ src/hb-algs.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit bcd3ffc948f63f59a709923a3ba6dc9d591aae6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 16 13:22:09 2019 -0700
+
+    Whitespace
+
+ src/hb-ot-layout-gsub-table.hh | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit 05bc5f96fb0818531404174b71c6ff497d5e2738
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 16 13:05:58 2019 -0700
+
+    [subset] Remove extra iteration
+
+ src/hb-ot-layout-gsub-table.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 6555f209586886a4b2562412363cf152d7837d5c
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 15 09:42:38 2019 -0700
+
+    [subset] Truncate empty gids at the end in retain-gids mode.
+
+ src/hb-subset-plan.cc                              |   8 ++++---
+ test/api/fonts/Roboto-Regular.a.retaingids.ttf     | Bin 0 -> 2068 bytes
+ .../SourceHanSans-Regular.41,4C2E.retaingids.otf   | Bin 2736 -> 2656 bytes
+ test/api/test-subset-glyf.c                        |  25 +++++++++++++++++++++
+ ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 744 -> 732 bytes
+ ...oboto-Regular.abc.drop-hints-retain-gids.62.ttf | Bin 712 -> 704 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.61.ttf   | Bin 1808 -> 1792 bytes
+ .../basics/Roboto-Regular.abc.retain-gids.62.ttf   | Bin 1756 -> 1748 bytes
+ 8 files changed, 30 insertions(+), 3 deletions(-)
+
+commit 2376867649f97d25e4319f45845525ec207887f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 21:57:26 2019 -0700
+
+    Use hb_map(hb_add(this)) to dereference OffsetTo<>'s
+
+ src/hb-ot-layout-gsub-table.hh | 30 ++++++++++++++-------
+ src/hb-ot-layout-gsubgpos.hh   | 60 ++++++++++++++++++++++++++++--------------
+ src/hb-ot-stat-table.hh        |  2 +-
+ 3 files changed, 61 insertions(+), 31 deletions(-)
+
+commit 6f51e5552477125480f764a6af763dad9f8e3e1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 21:41:12 2019 -0700
+
+    [algs] Rename hb_bind to hb_partial
+    
+    Since our API is the invers of what std::bind is, and closer to Python
+    functools.partial().
+
+ src/hb-algs.hh   | 12 ++++++------
+ src/test-algs.cc |  6 +++---
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 0888e7bc86454020db45f78ee1136d6f3a1b9527
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 21:36:42 2019 -0700
+
+    [algs] Change hb_bind parameter number to be from one
+    
+    To match std:;bind, even though our interfaces are very different.
+
+ src/hb-algs.hh   | 24 +++++++++++++-----------
+ src/test-algs.cc |  6 +++---
+ 2 files changed, 16 insertions(+), 14 deletions(-)
+
+commit dfa5e4297147b52f0ed2f569c9b90a0c68c003c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 21:18:14 2019 -0700
+
+    Add back symmetric OffsetTo<>::friend operator+
+    
+    Finally seems to be working now.
+
+ src/hb-open-type.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit a06a236891611da9db601ddbc2b1513380ad12e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 21:12:22 2019 -0700
+
+    [algs] Partialize all operators
+
+ src/hb-algs.hh   | 66 +++++++++++++++++++++++++++++++++++---------------------
+ src/test-algs.cc |  4 ++--
+ 2 files changed, 44 insertions(+), 26 deletions(-)
+
+commit edc69ec935511d1993240fb68b54b2cfd6afa888
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 21:09:56 2019 -0700
+
+    [algs] Rewrite bind API
+    
+    And add a partialization API use example to hb_add()
+
+ src/hb-algs.hh   | 45 ++++++++++++++++++++-------------------------
+ src/test-algs.cc |  9 ++++++---
+ 2 files changed, 26 insertions(+), 28 deletions(-)
+
+commit 16a3540ea4257a19b9bfd9d5300a280e18b423a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 20:48:20 2019 -0700
+
+    [algs] Add hb_bind0 and hb_bind1
+
+ src/hb-algs.hh   | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/test-algs.cc |  7 +++++++
+ 2 files changed, 61 insertions(+)
+
+commit d214b07883a626f3ecebb027797e8bb994e174a4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 19:07:39 2019 -0700
+
+    Fix clang build
+    
+    Ugh.
+    
+    In file included from hb-ot-face.cc:41:
+    ./hb-ot-layout-gsub-table.hh:293:7: error: template parameter redefines default argument
+             hb_requires (hb_is_sorted_source_of (Iterator,
+             ^
+    ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires'
+     define hb_requires(Cond) hb_enable_if((Cond))
+                              ^
+    ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if'
+     define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr
+                                                                      ^
+    ./hb-ot-layout-gsub-table.hh:40:5: note: previous default template argument defined here
+        hb_requires (hb_is_sorted_source_of (Iterator,
+        ^
+    ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires'
+     define hb_requires(Cond) hb_enable_if((Cond))
+                              ^
+    ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if'
+     define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr
+                                                                      ^
+
+ src/hb-ot-layout-gsub-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 371b55c7a0c718fcaca0330edfeacf610797cf7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 18:54:07 2019 -0700
+
+    Fix clang build
+    
+    In file included from hb-ot-face.cc:41:
+    ./hb-ot-layout-gsub-table.hh:293:7: error: template parameter redefines default argument
+             hb_requires (hb_is_sorted_source_of (Iterator,
+             ^
+    ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires'
+     define hb_requires(Cond) hb_enable_if((Cond))
+                              ^
+    ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if'
+     define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr
+                                                                      ^
+    ./hb-ot-layout-gsub-table.hh:40:5: note: previous default template argument defined here
+        hb_requires (hb_is_sorted_source_of (Iterator,
+        ^
+    ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires'
+     define hb_requires(Cond) hb_enable_if((Cond))
+                              ^
+    ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if'
+     define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr
+                                                                      ^
+    1 error generated.
+
+ src/hb-ot-layout-gsub-table.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 243a5a6af2565937705d6bc20e65a62b686bb664
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 19:03:59 2019 -0700
+
+    [algs] Remove pair copy constructor
+    
+    Use default.
+
+ src/hb-algs.hh   | 1 -
+ src/test-algs.cc | 1 +
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit f92d188d7703184d04e8f205ae46ca3081d3e048
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 18:52:57 2019 -0700
+
+    Whitespace
+
+ src/hb-ot-layout-gsub-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 962f95cf802404dafadf2f999772d3f9fc949d63
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu May 9 13:04:11 2019 -0700
+
+    [subset] Switch SingleSubst to use iterators in serialize.
+
+ src/hb-ot-layout-common.hh     |  6 +--
+ src/hb-ot-layout-gsub-table.hh | 97 +++++++++++++++++++++++++-----------------
+ 2 files changed, 62 insertions(+), 41 deletions(-)
+
+commit 78d35f0e780dd811ae103c96f3b1060d49046a7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 18:15:05 2019 -0700
+
+    Reduce captures of lambdas
+
+ src/hb-ot-hdmx-table.hh        |  4 ++--
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-layout-gsub-table.hh | 29 +++++++++++++++--------------
+ src/hb-ot-layout-gsubgpos.hh   | 12 ++++++------
+ src/hb-ot-name-table.hh        |  2 +-
+ src/hb-ot-stat-table.hh        |  2 +-
+ src/hb-ot-var-fvar-table.hh    |  4 ++--
+ src/hb-subset-plan.cc          |  2 +-
+ src/test-iter.cc               |  4 ++--
+ 9 files changed, 31 insertions(+), 30 deletions(-)
+
+commit 5266ca86b633b84850492b7982334fb63271ccbc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 17:59:00 2019 -0700
+
+    Fix tests
+    
+    Oops.
+
+ src/test-algs.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 5da8a3a90db5e5ccaaf68de2ac312108af911821
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 17:11:18 2019 -0700
+
+    Remove variadic form of hb_min/hb_max
+    
+    Unused, and why here and not in other functions...
+
+ src/hb-algs.hh | 22 ++--------------------
+ 1 file changed, 2 insertions(+), 20 deletions(-)
+
+commit e5cfe9d582d86281eda2bcb85d3d1cbd4afbb5bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 16:59:36 2019 -0700
+
+    Add arithmetic operators
+
+ src/hb-algs.hh | 44 ++++++++++++++++++++++++++++++--------------
+ 1 file changed, 30 insertions(+), 14 deletions(-)
+
+commit f7a458510d9c34d1c52579985ded5082ad0f3458
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 16:49:35 2019 -0700
+
+    Add hb_bitwise_* ops
+
+ src/hb-algs.hh | 56 +++++++++++++++++++++++++++++++++++---------------------
+ src/hb-set.hh  | 14 +++++++-------
+ 2 files changed, 42 insertions(+), 28 deletions(-)
+
+commit d822e0a16f914ec6a7e629d21ed972d009a88561
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 16:30:08 2019 -0700
+
+    [array] Adjust operator!=
+    
+    See comments.
+
+ src/hb-array.hh  | 7 ++++++-
+ src/hb-vector.hh | 1 +
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 203ea58bf67b3df3e376f94cdfb37382dd3858a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 16:14:40 2019 -0700
+
+    More adjustment to OffsetTo<>::friend opeator+
+    
+    Let's see if I break any bots.  But yeah, it wasn't accepting a
+    non-const pointer.  It just happens that we don't use that in the
+    code it seems.
+
+ src/hb-open-type.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit ebf47a95f29dd959319feb7f8728f7c0162a181e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 15:14:26 2019 -0700
+
+    [iter] Simplify operator!= of iterator filters
+    
+    Both to save ops, and also because lambdas don't implement operator!=,
+    so this was failing in range-based for loop if a lambda was passed to
+    hb_map() or hb_filter().  Just check end-condition assuming that we
+    are comparing to .end() or iterators that are otherwise derived from
+    current iterator.  Ie. don't compare things that are expected to be
+    in common.
+
+ src/hb-iter.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit d3e1d5044f23a2dc910f4253c3f4976bf08f93ab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 14:25:54 2019 -0700
+
+    Add all pair_t comparison operators
+
+ src/hb-algs.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit f244224dbb5ee8929af109a0c4e23d2d993c8df8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 14:19:20 2019 -0700
+
+    [iter] Use default operators instead of redefining empty ones
+
+ src/hb-iter.hh | 26 +++++++++++++++-----------
+ 1 file changed, 15 insertions(+), 11 deletions(-)
+
+commit 125c45ed368ae61a74e2c558b9c884cfde6295e1
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed May 15 17:02:32 2019 -0400
+
+    Convert Consonant_Initial_Postfixed to CONS_MED
+
+ src/gen-use-table.py                                     |   6 +++---
+ src/hb-ot-shape-complex-use-table.cc                     |   2 +-
+ .../fonts/fd565cabd5208d345d0ed4fda7ae742917d846a5.ttf   | Bin 0 -> 1056 bytes
+ test/shaping/data/in-house/tests/use-syllable.tests      |   1 +
+ 4 files changed, 5 insertions(+), 4 deletions(-)
+
+commit 99ca956c131563b57d490b1ec3c8de920645e53f
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed May 15 16:29:51 2019 -0400
+
+    Fix record-test.sh on machines without sha1sum
+
+ test/shaping/record-test.sh | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit e2767e438c56b8ee0bc2f2040c10b13b34d37f95
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed May 15 13:14:09 2019 +0430
+
+    [ci][test] Ignore other gcov symbols also
+    
+    To fix https://travis-ci.org/harfbuzz/harfbuzz/jobs/532693197
+
+ src/check-symbols.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 397cbbd5ff25c9796ecd56b8270e83de1eb322ac
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed May 15 13:03:28 2019 +0430
+
+    [ci][travis] Update its distribution
+    
+    It may break things, lets see
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 763ea4224bf612f3efb80d5744d1e8852682683e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 01:15:11 2019 -0700
+
+    Another try
+
+ src/hb-open-type.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit e1b2edb04af7bd2b4eecb59392f75abcc72cd8a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 01:12:04 2019 -0700
+
+    Completely revert the thing back
+
+ src/hb-open-type.hh | 14 +++++---------
+ 1 file changed, 5 insertions(+), 9 deletions(-)
+
+commit c58eeb5fb35ec6a8d0a4394fd83cb2571cd5af4f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 01:10:31 2019 -0700
+
+    Another try at fix
+    
+    Fails locally.  Trying to understand.  Sigh
+
+ src/hb-open-type.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 004edf3bdac77564d39516b51b0666de60e65ece
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 01:02:50 2019 -0700
+
+    Ugh.  How was the Travis bot happy before, but isn't now?! :(
+
+ src/hb-open-type.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit e01c7b1648dbbb76966b3bd4437bcf7699e77c35
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 00:52:17 2019 -0700
+
+    Move OffsetTo operator+ back out of class
+    
+    Apparently there's different overload resolution rules that apply, at
+    least with some (older?) version of gcc.
+    
+    hb-ot-name-table.hh: In member function ‘void OT::name::accelerator_t::init(hb_face_t*)’:
+    hb-ot-name-table.hh:244:62: error: ambiguous overload for ‘operator+’ (operand types are ‘hb_blob_ptr_t<OT::name>’ and ‘OT::NNOffsetTo<OT::UnsizedArrayOf<OT::IntType<unsigned char, 1u> > > {aka const OT::OffsetTo<OT::UnsizedArrayOf<OT::IntType<unsigned char, 1u> >, OT::IntType<short unsigned int, 2u>, false>}’)
+           this->pool = (const char *) (const void *) (this->table+this->table->stringOffset);
+                                                                  ^
+    hb-ot-name-table.hh:244:62: note: candidates are:
+    hb-ot-name-table.hh:244:62: note: operator+(const C*, long int) <built-in>
+    hb-ot-name-table.hh:244:62: note: operator+(const char*, long int) <built-in>
+
+ src/hb-open-type.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit b213042f87dd736bad7a852fe98269f84cbff493
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 00:50:48 2019 -0700
+
+    Revert "Revert symmetric OffsetTo overloads"
+    
+    This reverts commit 01912efb74fc554a81c8cfe572145ce45b8fa58b.
+    
+    Actually this didn't break things.  Fixing
+
+ src/hb-open-type.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 01912efb74fc554a81c8cfe572145ce45b8fa58b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 00:42:47 2019 -0700
+
+    Revert symmetric OffsetTo overloads
+    
+    Reverts 57f65ae9355004044325dd6441cde761bca5e0a3
+    
+    Caused ambiguous-overload on some gcc...
+
+ src/hb-open-type.hh | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit d0df996cdc249a245c9dad1fa6503213c84dbcd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 15 00:32:41 2019 -0700
+
+    Use implicit lambda return type
+
+ src/hb-array.hh                |  4 ++--
+ src/hb-ot-layout-gsub-table.hh |  8 ++++----
+ src/hb-ot-layout-gsubgpos.hh   | 18 +++++++++---------
+ src/hb-ot-stat-table.hh        |  2 +-
+ src/hb-ot-var-fvar-table.hh    |  4 ++--
+ src/test-iter.cc               |  8 ++++----
+ src/test-meta.cc               |  1 -
+ 7 files changed, 22 insertions(+), 23 deletions(-)
+
+commit 57f65ae9355004044325dd6441cde761bca5e0a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 14 22:52:59 2019 -0700
+
+    Add symmetric friend operator+ for OffsetTo
+
+ src/hb-open-type.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 71208e5047c71108dec7361fd7c3e594c8b6c2d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 14 22:51:59 2019 -0700
+
+    Move OffsetTo<> deref operators in-class as friends
+
+ src/hb-open-type.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit e6d6f4b96dd5517406265093cd57834c00850d41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 14 22:45:03 2019 -0700
+
+    Whitespace
+
+ src/hb-ot-stat-table.hh     | 2 +-
+ src/hb-ot-var-fvar-table.hh | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 889dc1eb06a80ea9be4223a19011e47a52abebdd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 14 22:28:07 2019 -0700
+
+    [iter] Remove sort categorization
+    
+    See comments.
+
+ src/hb-array.hh            |  2 +-
+ src/hb-iter.hh             | 48 ++++++++++++++++++++++++++++++----------------
+ src/hb-ot-layout-common.hh |  2 +-
+ src/hb-set.hh              |  2 +-
+ 4 files changed, 35 insertions(+), 19 deletions(-)
+
+commit b4eff38397c2a4e475f426df38e040dddf94a4fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 14 09:07:20 2019 -0700
+
+    Start of gen-ucd.py, to replace UCDN
+
+ src/gen-ucd.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 46 insertions(+)
+
+commit 02e5e5d939be36d8f108029601a1ce1f533e5ccb
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon May 13 09:38:42 2019 -0700
+
+    [subset] retian nameids from STAT and fvar tables
+
+ src/hb-ot-stat-table.hh     | 76 +++++++++++++++++++++++++++++++++++++++++----
+ src/hb-ot-var-fvar-table.hh | 21 +++++++++++++
+ src/hb-subset-plan.cc       | 26 ++++++++++++++++
+ 3 files changed, 117 insertions(+), 6 deletions(-)
+
+commit ff7995200e706f3161b9fc5c27bb950e3d87e8e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 14 07:44:03 2019 -0700
+
+    Hopefully last warning fix
+
+ src/hb-subset-cff2.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d1baf99697d215584b2ecb8d2d38ba5b9045955c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue May 14 16:16:46 2019 +0430
+
+    [ci] add HB_TINY to asmjs builder
+
+ .circleci/config.yml | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+commit 9e7c9c3adb33b06610951be38f3c820342333092
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue May 14 15:58:51 2019 +0430
+
+    Fix -Wunused-function on HB_NO_SHAPE_AAT
+    
+    We should add a bot for it
+    Part of #1652
+
+ src/hb-ot-shape.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit c73d7ba75d4556d9b8e05b10d6572f74f4814f7a
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Tue May 14 13:26:18 2019 +0300
+
+    Fix building with HB_NO_SUBSET_LAYOUT
+    
+    Fixes an unused function warning when building with HB_NO_SUBSET_LAYOUT
+    as part of the Chrome build.
+
+ src/hb-subset-plan.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f39934983f459c992e27075cd2c45ac0025183d0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 14 00:13:21 2019 -0700
+
+    [ucdn] Fix Hangul composition
+    
+    https://github.com/grigorig/ucdn/issues/23
+
+ src/hb-ucdn/ucdn.c      | 3 ++-
+ test/api/test-unicode.c | 4 ++++
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+commit b2ab15a78c219016e20389582716e0ac0ee8aeb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 23:47:28 2019 -0700
+
+    Fix more warnings
+
+ src/hb-ot-cff1-table.hh | 8 ++++----
+ src/hb-subset-cff1.cc   | 4 ++--
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 42ae468a8a76e1e4e6a8121eec5dc118f52086ee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 23:43:45 2019 -0700
+
+    [config] Add NDEBUG and HB_NDEBUG
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh | 10 ++++++++++
+ src/hb.hh        | 10 ----------
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 0a01deb76fa582afa83da70a09478299d8080827
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 18:04:09 2019 -0700
+
+    One more warning fix
+    
+    No idea where these appear from...
+
+ src/hb-ot-cff-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f76e9f2ede76a189d48ddd4f2275442d8e849815
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 17:39:46 2019 -0700
+
+    [icu] Comment
+
+ src/hb-icu.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 70fe9e73555f3354238f7cda5ff0f0c0b75e1d62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 17:35:02 2019 -0700
+
+    Fix moreeeeeeeeeee
+
+ src/hb-icu.cc         | 28 +++++++++++++++-------------
+ src/hb-subset-plan.cc |  2 +-
+ 2 files changed, 16 insertions(+), 14 deletions(-)
+
+commit 68e12e68f813bfd22dda040463d042cc06b958ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 17:28:59 2019 -0700
+
+    Fix more semi-colon issues
+
+ src/hb-coretext.cc    | 4 ++--
+ src/hb-directwrite.cc | 4 ++--
+ src/hb-graphite2.cc   | 4 ++--
+ src/hb-uniscribe.cc   | 4 ++--
+ 4 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 4d3cf2adb669c345cc43832d11689271995e160a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 17:25:07 2019 -0700
+
+    [iter] Fix zip iterator sortedness classification logic
+
+ src/hb-iter.hh | 9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+commit c572732f29787d1cf7ff39b8160b3935d4b13ba4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 15:41:09 2019 -0700
+
+    Fix more excess semi-colon errors
+
+ src/hb-common.cc                 | 2 +-
+ src/hb-ot-name.cc                | 4 ++--
+ src/hb-ot-shape-complex-indic.hh | 2 +-
+ src/hb-ot-shape-complex-khmer.hh | 2 +-
+ 4 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 513762849a683914fc266a17ddf38f133cccf072
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 15:36:14 2019 -0700
+
+    [iter] Track strictly-sorted iterators
+    
+    This make output of hb_enumerate() sorted regardless of input iterator.
+
+ src/hb-array.hh            |  2 +-
+ src/hb-iter.hh             | 30 +++++++++++++++++++++---------
+ src/hb-ot-layout-common.hh |  2 +-
+ src/hb-set.hh              |  2 +-
+ 4 files changed, 24 insertions(+), 12 deletions(-)
+
+commit 7e02063f3202712b4e5fbddac0354adadb924f72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 15:26:00 2019 -0700
+
+    [iter] Minor
+
+ src/hb-iter.hh | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit a5fb44a8cbbaad194ddf6d02a6b6c98b0b637149
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon May 13 14:57:40 2019 -0700
+
+    [subset] Fix shadowed 'groups' param in cmap.
+
+ src/hb-ot-cmap-table.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 73943bdf21a96f4e12cb9efd8458a2711de0d870
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 14:48:31 2019 -0700
+
+    Adjust uniscribe_bug_compatible mode
+    
+    More correct behavior.  We were commenting out some legit conditions
+    before.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-shape-complex-indic.cc | 10 ++--------
+ 1 file changed, 2 insertions(+), 8 deletions(-)
+
+commit 809c58708359bcc22bb1273069886f2cbf68be65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 14:45:51 2019 -0700
+
+    [config] Better compile away morx/kerx/trak
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-shape.cc | 38 ++++++++++++++------------------------
+ src/hb-ot-shape.hh | 12 +++++++++++-
+ 2 files changed, 25 insertions(+), 25 deletions(-)
+
+commit b1d3e54bd3c881794b05831e811b1a77a7d427c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 14:35:04 2019 -0700
+
+    [indic] Don't constrain how many C, M, ... occur
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1709
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-shape-complex-indic-machine.hh | 1225 ++++++++----------------------
+ src/hb-ot-shape-complex-indic-machine.rl |    8 +-
+ 2 files changed, 305 insertions(+), 928 deletions(-)
+
+commit 148d88368013ba9bf70a7dd275b1a0f9c64fd45c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 14:33:06 2019 -0700
+
+    [test] Don't call deprecated API
+
+ test/api/test-font.c  |  3 ---
+ test/api/test-shape.c | 16 ++--------------
+ 2 files changed, 2 insertions(+), 17 deletions(-)
+
+commit a487fc33248ea2f934ff4cb857cb556065c11841
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 14:16:33 2019 -0700
+
+    Another extra semi-colon
+
+ src/hb-ot-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8461ade7832110d28001dc641342d3f9461e03b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 14:10:48 2019 -0700
+
+    Revert "[ragel] Regenerate ragel-generated files using ragel 7.0.0.11 May 2018"
+    
+    This reverts commit 9b05db33b54e6e5f0b4658f4c06e7fe563f8923b.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1708
+
+ src/hb-buffer-deserialize-json.hh          | 1051 ++++++-----
+ src/hb-buffer-deserialize-text.hh          | 1009 ++++++-----
+ src/hb-ot-shape-complex-indic-machine.hh   | 2678 ++++++++++++----------------
+ src/hb-ot-shape-complex-khmer-machine.hh   |  709 ++++----
+ src/hb-ot-shape-complex-myanmar-machine.hh |  820 ++++-----
+ src/hb-ot-shape-complex-use-machine.hh     | 1144 ++++++------
+ 6 files changed, 3452 insertions(+), 3959 deletions(-)
+
+commit 52c15b053aec06d351404a4c15609384946b26e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 14:10:28 2019 -0700
+
+    Revert "[ragel] Switch to -T1 output instead of -F1"
+    
+    This reverts commit ae8719eb596485ebff07dd5016256015cd0cf86b.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1708
+
+ src/Makefile.am                            |    2 +-
+ src/hb-buffer-deserialize-json.hh          |  381 ++-
+ src/hb-buffer-deserialize-text.hh          |  308 +--
+ src/hb-ot-shape-complex-indic-machine.hh   | 3527 +++++++---------------------
+ src/hb-ot-shape-complex-khmer-machine.hh   |  396 +---
+ src/hb-ot-shape-complex-myanmar-machine.hh |  742 ++----
+ src/hb-ot-shape-complex-use-machine.hh     | 1011 ++------
+ 7 files changed, 1658 insertions(+), 4709 deletions(-)
+
+commit e98f0ddd6373f64ef4b542daa36b5841399170af
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 13:53:06 2019 -0700
+
+    Fix extra semi-colon
+
+ src/hb-iter.hh | 2 +-
+ src/hb.hh      | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit ae8719eb596485ebff07dd5016256015cd0cf86b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 13 12:27:10 2019 -0700
+
+    [ragel] Switch to -T1 output instead of -F1
+    
+    Fedora upgraded to ragel 7, which is buggy if char is signed.
+    Switching to -G2 output fails with sign-compare error:
+    
+    ../../src/hb-buffer-deserialize-json.hh:107:12: error: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘const char’ [-Werror=sign-compare]
+        if ( 9u <= ( (*( p))) && ( (*( p))) <= 13u ) {
+             ~~~^~~~~~~~~~~~~
+    
+    Switching to -T1 for now.  It actually results in smaller code,
+    at the expense of some binary searching instead of flat tables.
+    In the not distant future, we might actually generate two different
+    outputs and choose between depending on size-optimize options.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1708
+
+ src/Makefile.am                            |    2 +-
+ src/hb-buffer-deserialize-json.hh          |  381 ++--
+ src/hb-buffer-deserialize-text.hh          |  308 ++-
+ src/hb-ot-shape-complex-indic-machine.hh   | 3401 +++++++++++++++++++++-------
+ src/hb-ot-shape-complex-khmer-machine.hh   |  396 +++-
+ src/hb-ot-shape-complex-myanmar-machine.hh |  742 ++++--
+ src/hb-ot-shape-complex-use-machine.hh     | 1011 ++++++---
+ 7 files changed, 4646 insertions(+), 1595 deletions(-)
+
+commit df3f36f0bb7aeed0554843f24f6542852e40f6cc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 12 20:56:36 2019 -0700
+
+    Minor
+
+ src/gen-os2-unicode-ranges.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ccc88e98f34453100830d6408fdabfe90e6b47b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 12 16:12:06 2019 -0700
+
+    Fix MSVC build
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f8f9cb93b7166b0d8c816610596da486443c7391
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 12 15:56:25 2019 -0700
+
+    [config] Define HB_NO_SUBSET_LAYOUT in HB_LEAN
+    
+    Assumning subsetter would be used for printing-like uses in that case,
+    which don't need GSUB/GPOS.
+
+ src/hb-config.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a1394a28fc4b3d15ef45481f3147f0685d343acb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 12 15:47:46 2019 -0700
+
+    [config] Add HB_NO_UNISCRIBE_BUG_COMPATIBLE
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh                 |  4 ++++
+ src/hb-ot-shape-complex-indic.cc | 24 ++++++++++++++++++------
+ 2 files changed, 22 insertions(+), 6 deletions(-)
+
+commit dba1ac1b0e8f5f96974fc1119b318ae6127daa82
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 12 15:33:31 2019 -0700
+
+    [config] Disable buffer serialize routines in HB_TINY
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-buffer-serialize.cc | 14 +++++++++++++-
+ src/hb-config.hh           |  1 +
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit 3d9be2ad5036aaf02b69095faaf9c18705c2c5bc
+Merge: a20db496 1a850abd
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sun May 12 20:03:29 2019 +0100
+
+    Merge pull request #1665 from n8willis/docs-gtkdoc-colormath
+    
+    [Docs] Add gtk-doc comments for OT color and OT math
+
+commit a20db496f090abc5b937857b7c5f077161b6ffe4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 12 11:08:45 2019 -0700
+
+    Fix builds
+
+ src/hb-subset-plan.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 8694d6082901661e90e2ffcf732e9985a215063f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 12 11:05:24 2019 -0700
+
+    [config] Enable HB_NO_MT in HB_TINY
+    
+    Now that user can override it if needed...
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7f6fca4ef78cf3c9384bf835def14219b2ce8791
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun May 12 10:29:47 2019 -0700
+
+    Force-disable CFF code under disabling conditions
+    
+    Subsetter size goes down from 190kb to 119kb.  Main library about 7kb.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-cff1-table.cc | 4 ++++
+ src/hb-ot-cff2-table.cc | 4 ++++
+ src/hb-subset-cff1.cc   | 4 ++++
+ src/hb-subset-cff2.cc   | 4 ++++
+ 4 files changed, 16 insertions(+)
+
+commit 5249eee43748db32b40ad2602b3243d2491642b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 16:12:07 2019 -0700
+
+    [config] Allow overriding chosen config
+
+ src/hb-config.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 30c059a978c91fcd38d47f1ac4a03295f887a7da
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 11 18:48:41 2019 -0400
+
+    [test] minor, fix -Weverything bot
+
+ test/fuzzing/main.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a29b1de55abca2e90733caff7423e5251d72e03c
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sat May 11 20:56:55 2019 +0100
+
+    Usermanual, fix up userfeatures example code in OpenType features section of shaping chapter.
+
+ docs/usermanual-opentype-features.xml | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+commit 78fcb14db9041af0e0d5ea209cf0cb1977f6dcc3
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sat May 11 20:56:02 2019 +0100
+
+    Usermanual, minor: flesh out invisible-glyph discussion in buffers chapter.
+
+ ...ermanual-buffers-language-script-and-direction.xml | 19 +++++++++++++++----
+ 1 file changed, 15 insertions(+), 4 deletions(-)
+
+commit 25531a30394c451a7a2aee77928e0a550015b803
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 11 19:50:42 2019 +0000
+
+    [test] minor
+    
+    style fix and add return statement
+
+ test/fuzzing/main.cc | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+commit 1a850abd66999707b6f4795050e748fc879b92ef
+Merge: 8a544171 a6048e4c
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 11 20:16:57 2019 +0100
+
+    Merge branch 'master' into docs-gtkdoc-colormath
+
+commit 8a544171d15bb36c15ca7bf679643b2b14f94b45
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sat May 11 20:11:49 2019 +0100
+
+    Corrections to OT Color gtk-doc comments.
+
+ src/hb-ot-color.cc | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit 301f5091f6663cc8a1fff848bf5285aa15cc0598
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sat May 11 20:11:36 2019 +0100
+
+    Corrections to OT Math gtk-doc comments.
+
+ src/hb-ot-math.cc | 33 +++++++++++++++++++++++----------
+ 1 file changed, 23 insertions(+), 10 deletions(-)
+
+commit a6048e4cd013987ecb846e0683a7cf6f0caa65f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 12:11:22 2019 -0700
+
+    Fix build
+
+ src/hb-ot-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 32d3c06b61f2f4252f4403b55c6ba07fbb572149
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 11:59:18 2019 -0700
+
+    Disable sbix if no-color or no-ot-font-bitmap
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-ot-font.cc | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit 606841b07017ac80dea2fc5ada25b5976f2f9192
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 11:54:30 2019 -0700
+
+    [iter] Check for more before forwarding/rewinding past ends
+
+ src/hb-iter.hh   | 4 ++--
+ src/test-iter.cc | 6 ++----
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+commit c1c122e7b3f60dc7b5a224c68d2acb106fda8b49
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sat May 11 11:38:06 2019 -0400
+
+    [iter] Fix filter rewinding
+
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b854d4ff46602104343201361919f30169144cf1
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri May 10 22:51:49 2019 -0400
+
+    [array] Fix rewinding
+
+ src/hb-array.hh | 22 +++++++++++++---------
+ 1 file changed, 13 insertions(+), 9 deletions(-)
+
+commit 76e80c5ca5e820e955438e4c727929ddd99e695e
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 11 19:51:24 2019 +0100
+
+    Update src/hb-ot-color.cc
+    
+    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+
+ src/hb-ot-color.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 79126df3070f00193fe3caefe9deb62c4520e048
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 11:23:31 2019 -0700
+
+    [iter] Add hb_map_sorted() and hb_map_retains_sorting()
+
+ src/hb-iter.hh | 38 +++++++++++++++++++++++++++++++-------
+ 1 file changed, 31 insertions(+), 7 deletions(-)
+
+commit bcd81932f0bcb2258276ae313709780e90e9b0f6
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 11 14:10:32 2019 +0100
+
+    Update src/hb-ot-math.cc
+    
+    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+
+ src/hb-ot-math.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ddc6dd42f753a20204898e41cc711b0100638330
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 11 14:10:11 2019 +0100
+
+    Update src/hb-ot-math.cc
+    
+    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+
+ src/hb-ot-math.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 46e05ecca16e561a0ff4ca60bb064f480374590a
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 11 14:09:52 2019 +0100
 
- src/hb-ot-cmap-table.hh                            |  27 +++++++++++++++++----
- src/hb-ot-stat-table.hh                            |   2 +-
- src/hb-subset-input.cc                             |   1 +
- src/hb-subset-plan.cc                              |   6 +----
- test/api/hb-subset-test.h                          |   2 +-
- .../Comfortaa-Regular-new.default.61,62,63.ttf     | Bin 0 -> 6492 bytes
- .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 0 -> 6316 bytes
- .../basics/Comfortaa-Regular-new.default.61.ttf    | Bin 0 -> 6148 bytes
- .../basics/Comfortaa-Regular-new.default.62.ttf    | Bin 0 -> 6088 bytes
- .../basics/Comfortaa-Regular-new.default.63.ttf    | Bin 0 -> 6068 bytes
- ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 0 -> 3284 bytes
- ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 0 -> 3164 bytes
- ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 0 -> 2868 bytes
- ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 0 -> 3020 bytes
- ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 0 -> 3024 bytes
- .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf  | Bin 0 -> 1952 bytes
- .../Comfortaa-Regular-new.drop-hints.61,63.ttf     | Bin 0 -> 1832 bytes
- .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 0 -> 1704 bytes
- .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 0 -> 1688 bytes
- .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 0 -> 1688 bytes
- .../Comfortaa-Regular-new.name-ids.61,62,63.ttf    | Bin 0 -> 6236 bytes
- .../Comfortaa-Regular-new.name-ids.61,63.ttf       | Bin 0 -> 6060 bytes
- .../basics/Comfortaa-Regular-new.name-ids.61.ttf   | Bin 0 -> 5892 bytes
- .../basics/Comfortaa-Regular-new.name-ids.62.ttf   | Bin 0 -> 5832 bytes
- .../basics/Comfortaa-Regular-new.name-ids.63.ttf   | Bin 0 -> 5812 bytes
- .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 0 -> 7824 bytes
- .../Comfortaa-Regular-new.retain-gids.61,63.ttf    | Bin 0 -> 7648 bytes
- .../Comfortaa-Regular-new.retain-gids.61.ttf       | Bin 0 -> 7312 bytes
- .../Comfortaa-Regular-new.retain-gids.62.ttf       | Bin 0 -> 7420 bytes
- .../Comfortaa-Regular-new.retain-gids.63.ttf       | Bin 0 -> 7404 bytes
- ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 3784 -> 2384 bytes
- .../SourceSansPro-Regular.default.61,62,63.otf     | Bin 3496 -> 2096 bytes
- ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 3612 -> 2212 bytes
- ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 33516 -> 32124 bytes
- ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 31080 -> 29688 bytes
- ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34708 -> 33316 bytes
- ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 3640 -> 2240 bytes
- ...urceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 3400 -> 2000 bytes
- ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 3596 -> 2196 bytes
- ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 33352 -> 31960 bytes
- ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 30956 -> 29564 bytes
- ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34560 -> 33168 bytes
- ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 3480 -> 2080 bytes
- ...-Regular.drop-hints-desubroutinize.61,62,63.otf | Bin 3288 -> 1876 bytes
- ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 3448 -> 2048 bytes
- ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 33448 -> 32052 bytes
- ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 31028 -> 29632 bytes
- ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34576 -> 33180 bytes
- ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 3564 -> 2164 bytes
- .../SourceSansPro-Regular.drop-hints.61,62,63.otf  | Bin 3340 -> 1940 bytes
- ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 3464 -> 2064 bytes
- ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 33668 -> 32276 bytes
- .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 31180 -> 29788 bytes
- ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 34724 -> 33332 bytes
- .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf  | Bin 3772 -> 3164 bytes
- .../full-font/Roboto-Regular.default.61,62,63.ttf  | Bin 3368 -> 2760 bytes
- .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf      | Bin 3732 -> 3124 bytes
- ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 2224 -> 1616 bytes
- .../Roboto-Regular.drop-hints.61,62,63.ttf         | Bin 2016 -> 1408 bytes
- .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf   | Bin 2252 -> 1644 bytes
- ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 3112 -> 2684 bytes
- ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 3356 -> 2928 bytes
- .../Mplus1p-Regular.default.61,63,65,6B.ttf        | Bin 2656 -> 2228 bytes
- ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3652 -> 3224 bytes
- .../japanese/Mplus1p-Regular.default.660E.ttf      | Bin 2396 -> 1968 bytes
- ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 2384 -> 1956 bytes
- ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2628 -> 2200 bytes
- .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf     | Bin 1928 -> 1500 bytes
- ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2924 -> 2496 bytes
- .../japanese/Mplus1p-Regular.drop-hints.660E.ttf   | Bin 1668 -> 1240 bytes
- test/subset/data/fonts/Comfortaa-Regular-new.ttf   | Bin 0 -> 230316 bytes
- test/subset/data/tests/basics.tests                |   1 +
- test/subset/generate-expected-outputs.py           |   3 +--
- test/subset/run-tests.py                           |   3 ++-
- util/options-subset.cc                             |  23 +++++++++++++++---
- 75 files changed, 50 insertions(+), 18 deletions(-)
+    Update src/hb-ot-color.cc
+    
+    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
 
-commit 58ce477ac170969430310750b78dcb5f9e3b06a3
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Tue May 21 20:22:40 2019 -0700
+ src/hb-ot-color.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    [subset] Report failure more often
+commit 6d9870b4799f20a6c58a2c071713e56aa93b0221
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 11 14:09:26 2019 +0100
 
- src/hb-ot-glyf-table.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+    Update src/hb-ot-color.cc
+    
+    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
 
-commit 51a0129f7322e97825455df4eb6eecfea14980f5
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Tue May 21 20:12:19 2019 -0700
+ src/hb-ot-color.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    [subset] Thar be comparison of integers of different signs
+commit 12ea4a24c40c7ac28d058e9721479347951e3482
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 11 14:08:40 2019 +0100
 
- test/api/hb-test.h | 2 +-
+    Update src/hb-ot-color.cc
+    
+    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+
+ src/hb-ot-color.cc | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 14e3b0cf41d9657c39f1f921f7e09a1418fa3278
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Tue May 21 20:09:36 2019 -0700
+commit 3535f2d31efe1ebe44ba63f980882ba23cdcde3b
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 11 14:07:38 2019 +0100
 
-    [subset] Code review feedback
+    Update src/hb-ot-color.cc
+    
+    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
 
- src/hb-ot-glyf-table.hh | 53 +++++++++++++++++++++++++------------------------
- 1 file changed, 27 insertions(+), 26 deletions(-)
+ src/hb-ot-color.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit a03ed95e7d50b9dd947e8982c7730de969795b05
+commit 12d2c472fe8ec3268a4b39a57603dcc734ab7b88
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Sat May 11 14:06:56 2019 +0100
+
+    Update src/hb-ot-color.cc
+    
+    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+
+ src/hb-ot-color.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7f45ce42dbf11366e904f48db45cf5405e4e94df
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 21 16:43:14 2019 -0400
+Date:   Sat May 11 01:28:31 2019 -0700
 
-    [gen-ucd] Generate decomposition tables
+    [config] Rename
+
+ src/hb-config.hh    | 2 +-
+ src/hb-ot-layout.cc | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 0e78d4ddaec5f29d6652cc4185cbcca98c3a2927
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 01:27:50 2019 -0700
+
+    [config] Add HB_NO_NAME
     
-    Code is ugly.  Ugh.
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/gen-ucd.py | 40 ++++++++++++++++++++--------------------
- 1 file changed, 20 insertions(+), 20 deletions(-)
+ src/hb-config.hh  |  6 +++++-
+ src/hb-ot-name.cc | 20 ++++++++++++++++++++
+ 2 files changed, 25 insertions(+), 1 deletion(-)
 
-commit 8a48c88fa9fe047a83ba4a45dbd6399412ca3302
+commit 1fc077211771c752768f63f178116d2b8f2f7d03
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 21 13:02:54 2019 -0400
+Date:   Sat May 11 01:24:23 2019 -0700
 
-    [gen-ucd] Comment
+    [config] HB_NO_OT_NAME_LANGUAGE AAT
 
- src/gen-ucd.py | 4 ++++
- 1 file changed, 4 insertions(+)
+ src/hb-config.hh                  | 4 ++--
+ src/hb-ot-name-language-static.hh | 3 +++
+ src/hb-ot-name-table.hh           | 4 +++-
+ 3 files changed, 8 insertions(+), 3 deletions(-)
 
-commit b71d353cee89a6654810f75e7a1d7fd156b76faa
+commit 4381bb2de7a554a148302836b86a5d73264abeae
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 20 17:33:55 2019 -0400
+Date:   Sat May 11 01:14:04 2019 -0700
 
-    [gen-ucd] Remove some code
+    [config] Comment
 
- src/gen-ucd.py | 7 -------
- 1 file changed, 7 deletions(-)
+ src/hb-config.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 4ea44112b5163591ce0b086e0d13ec368f4f6ddc
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Tue May 21 13:07:43 2019 -0700
+commit 9c921e6c32ab5ac4c524f554b7a7841eeeb0908f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 01:08:51 2019 -0700
 
-    [subset] Remove missed reference to hb-subset-glyf, was deleted
+    [config] Enable HB_NO_NAME_TABLE_AAT
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/Makefile.sources | 1 -
- 1 file changed, 1 deletion(-)
+ src/hb-config.hh | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit b928de91a755788fd0fad9fa0f5f03c5670ac6a3
-Author: Garret Rieger <grieger@google.com>
-Date:   Tue May 21 11:23:26 2019 -0700
+commit 81b79dfc397599182f43d63bf9346eee28e2d220
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 00:53:52 2019 -0700
 
-    [subset] Add test/subset/data/expected/layout to dist list.
+    [config] Add HB_NO_COLOR to HB_LEAN
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- test/subset/data/Makefile.am | 1 +
+ src/hb-config.hh   |  1 +
+ src/hb-ot-color.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++----
+ src/hb-ot-color.h  |  2 +-
+ src/hb-ot-layout.h |  2 +-
+ 4 files changed, 48 insertions(+), 6 deletions(-)
+
+commit b63a8e173cbc5a81f2ca4a0a82f20b9dafaedb30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 00:47:20 2019 -0700
+
+    [config Add HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS to LEAN
+    
+    Already I don't like the inflexibility of this approach :(.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh | 1 +
  1 file changed, 1 insertion(+)
 
-commit 0af9de13b78ddd35f58ee02ce8ffeffd99509ec5
-Author: Garret Rieger <grieger@google.com>
-Date:   Mon May 20 15:04:20 2019 -0700
+commit 42a21284778f3203d96133f74b0f846cd1567958
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 00:44:22 2019 -0700
 
-    [subset] For gsub subsetting only consider glyphs reachable via gsub closure.
+    [config] Disbale getenv() and atexit() if HB_LEAN
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-ot-layout-gsub-table.hh |  4 +--
- src/hb-subset-plan.cc          | 55 ++++++++++++++++++++----------------------
- src/hb-subset-plan.hh          | 10 ++++++++
- 3 files changed, 38 insertions(+), 31 deletions(-)
+ src/hb-config.hh | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit c740c8636b48b1790bba42445a301e8e1cf8f749
-Author: Garret Rieger <grieger@google.com>
-Date:   Thu May 16 10:57:33 2019 -0700
+commit fca27860417812d51e40f040de97c10177b1250e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 00:37:01 2019 -0700
 
-    [subset] Add integration tests for SingleSubst.
+    [config] Make HB_DISABLE_DEPRECATED actually compile
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+
+ src/hb-config.hh            |  7 +++++++
+ src/hb-font.cc              |  8 ++++++++
+ src/hb-font.hh              | 12 ++++++++++--
+ src/hb-graphite2.cc         |  2 ++
+ src/hb-icu.cc               |  2 +-
+ src/hb-ot-layout.cc         |  7 ++++++-
+ src/hb-ot-shape-fallback.cc |  4 ++++
+ src/hb-ot-tag.cc            |  4 ++++
+ src/hb-ot-var-fvar-table.hh |  6 ++++++
+ src/hb-ot-var.cc            |  2 ++
+ src/hb-set.cc               |  2 ++
+ src/hb-unicode.cc           |  6 ++++++
+ src/hb-unicode.hh           | 10 +++++++---
+ 13 files changed, 65 insertions(+), 7 deletions(-)
 
- test/subset/data/Makefile.sources                      |   1 +
- ...ular.smallcaps.keep-layout-retain-gids.41,42,43.ttf | Bin 0 -> 6780 bytes
- ...Regular.smallcaps.keep-layout-retain-gids.41,43.ttf | Bin 0 -> 6396 bytes
- ...to-Regular.smallcaps.keep-layout-retain-gids.41.ttf | Bin 0 -> 6032 bytes
- ...to-Regular.smallcaps.keep-layout-retain-gids.43.ttf | Bin 0 -> 6088 bytes
- ...Regular.smallcaps.keep-layout-retain-gids.CA,CB.ttf | Bin 0 -> 7932 bytes
- .../Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf  | Bin 0 -> 2972 bytes
- .../Roboto-Regular.smallcaps.keep-layout.41,43.ttf     | Bin 0 -> 2572 bytes
- .../layout/Roboto-Regular.smallcaps.keep-layout.41.ttf | Bin 0 -> 2196 bytes
- .../layout/Roboto-Regular.smallcaps.keep-layout.43.ttf | Bin 0 -> 2268 bytes
- .../Roboto-Regular.smallcaps.keep-layout.CA,CB.ttf     | Bin 0 -> 2612 bytes
- test/subset/data/fonts/Roboto-Regular.smallcaps.ttf    | Bin 0 -> 131632 bytes
- test/subset/data/profiles/keep-layout-retain-gids.txt  |   2 ++
- test/subset/data/profiles/keep-layout.txt              |   1 +
- test/subset/data/tests/full-font.tests                 |   1 -
- test/subset/data/tests/layout.tests                    |  13 +++++++++++++
- test/subset/generate-expected-outputs.py               |   3 ++-
- 17 files changed, 19 insertions(+), 2 deletions(-)
+commit 5a48611ccd045de5782ad2fd5f6718357fe232a2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 00:19:03 2019 -0700
 
-commit 349d692b0ee45330220fd3ec9267979d73acd149
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Tue May 21 12:38:53 2019 -0700
+    [config] Add HB_NO_OT_LAYOUT_UNUSED
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
-    [subset] Iter in and out for loca
+ src/hb-config.hh    |  1 +
+ src/hb-ot-layout.cc | 12 ++++++++++++
+ 2 files changed, 13 insertions(+)
 
- src/hb-ot-glyf-table.hh | 31 ++++++++++++++++---------------
- test/api/hb-test.h      |  7 ++-----
- 2 files changed, 18 insertions(+), 20 deletions(-)
+commit 771f1b21d1d7128440d6b4488705456d43dbc0e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 00:16:18 2019 -0700
 
-commit 95445d79be0a79e6e2d384d46819730146d397d8
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Tue May 21 11:14:31 2019 -0700
+    [config] Adjust
 
-    [subset] Write loca using more idiomatic harfbuzzese
+ src/hb-config.hh | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
 
- src/hb-ot-glyf-table.hh | 35 +++++++++++++++++++----------------
- 1 file changed, 19 insertions(+), 16 deletions(-)
+commit 484f6e8215038006a945da67d245f14db3eeeb2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 00:13:35 2019 -0700
 
-commit d1b12a546561a78ae3c3e9d6bffa057caf82dbee
-Merge: 3a43603e f49a5bec
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Mon May 20 21:29:54 2019 -0700
+    [config] Add HB_LEAN
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
-    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf
+ src/hb-config.hh  |  5 +++++
+ src/hb-ot-math.cc | 40 ++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 45 insertions(+)
 
-commit 3a43603ecea2c349f58396e103a52948776681e0
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Mon May 20 20:40:55 2019 -0700
+commit 0bfd14c0ed2f95f00d0b94d396c777399afa4d68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 00:06:57 2019 -0700
 
-    [subset] Fix memory leak caused by failure to cleanup glyf accelerator
+    [config] Fix tests
 
- src/hb-ot-glyf-table.hh | 42 ++++++++++++++++++++++++++----------------
- 1 file changed, 26 insertions(+), 16 deletions(-)
+ src/hb-config.hh | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit 5cedda5e4a3f726168b87d357aee723e6fd919cd
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Thu May 16 19:16:52 2019 -0700
+commit 784df8eba1aaf20d2db464f8b3ea0984f7ea1308
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat May 11 00:04:59 2019 -0700
 
-    [subset] Fix null pointer deref, tidy up a bit
+    [config] Flesh out more
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-ot-glyf-table.hh     | 282 +++++++++++++++++++++++++-------------------
- test/api/test-subset-glyf.c |  18 +--
- 2 files changed, 167 insertions(+), 133 deletions(-)
+ src/hb-config.hh | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
 
-commit 8a84b540c7b850c1fb30d5bc1ffdeb43033be173
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Thu May 16 19:14:16 2019 -0700
+commit 799c6a5081e5058260199eeeb2091ee2c1dfefff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 23:55:22 2019 -0700
 
-    [subset] Tests passing using iterator based glyf
+    [config] Add some
 
- src/hb-ot-glyf-table.hh     | 117 +++++++++++++++++++++++++++++++-------------
- test/api/test-subset-glyf.c |   4 +-
- 2 files changed, 86 insertions(+), 35 deletions(-)
+ src/hb-aat-layout.cc    | 26 +++++++++++++-------------
+ src/hb-aat-map.cc       |  4 ++--
+ src/hb-config.hh        | 18 ++++++++++++++++++
+ src/hb-ot-kern-table.hh | 14 +++++++-------
+ src/hb-ot-shape.cc      | 22 +++++++++++-----------
+ 5 files changed, 51 insertions(+), 33 deletions(-)
 
-commit 82bbec306376d61b6700461c4038c6789e60a998
-Merge: 9d09ac13 b7be5931
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Thu May 16 15:14:01 2019 -0700
+commit e6582de12f1af9ab5e3122d762a3e12438a66b6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 23:53:38 2019 -0700
 
-    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf
+    Add hb-config.hh
 
-commit 9d09ac13a114967576284d0b006a0ac7965d928a
-Author: rsheeter <rsheeter@google.com>
-Date:   Sat May 11 23:16:40 2019 -0700
+ src/Makefile.sources |  1 +
+ src/hb-config.hh     | 36 ++++++++++++++++++++++++++++++++++++
+ src/hb.hh            |  7 ++++---
+ 3 files changed, 41 insertions(+), 3 deletions(-)
 
-    [subset] Tweak hint stripping
+commit d43af339e7a7f5dab1690703a78d2690baefbd59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 23:46:22 2019 -0700
 
- src/hb-ot-glyf-table.hh | 46 +++++++++++++++++++++++++++++++++-------------
- 1 file changed, 33 insertions(+), 13 deletions(-)
+    [subset] More HB_NO_SUBSET_LAYOUT
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
-commit 3a4c928fcfce5a8c7a56907b9945e87b0ce8e327
-Author: rsheeter <rsheeter@google.com>
-Date:   Sat May 11 22:06:46 2019 -0700
+ src/hb-subset-plan.cc | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
 
-    [subset] Fix glyf tests except hint stripping & local test asan
+commit 31c591d69f6a7605088883db59149e83c80d019c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 23:39:53 2019 -0700
 
- src/hb-ot-glyf-table.hh     | 93 +++++++++++++++++++++++++++++++++------------
- test/api/hb-subset-test.h   |  2 +-
- test/api/hb-test.h          | 13 +++++++
- test/api/test-subset-glyf.c |  8 ++--
- 4 files changed, 86 insertions(+), 30 deletions(-)
+    [cff] Prune more code if HB_NO_OT_FONT_CFF
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
-commit b77dde8f138442935e5ca99460a520a4117d6dd2
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Fri May 10 16:52:19 2019 -0700
+ src/hb-ot-cff1-table.cc | 5 +++++
+ src/hb-ot-cff2-table.cc | 5 +++++
+ 2 files changed, 10 insertions(+)
 
-    [subset] Destroy blob
+commit 5ea8ad5c48f9baabc4ccf81dce4aee1067c401f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 23:36:42 2019 -0700
 
- src/hb-ot-glyf-table.hh | 2 ++
- 1 file changed, 2 insertions(+)
+    [subset] Add HB_NO_SUBSET_CFF
+    
+    Doesn't fully prune all the relevant code.  To be fixed later.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
-commit 14db6512f8dca80a575f468708949346b005834a
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Fri May 10 09:32:43 2019 -0700
+ src/hb-subset.cc | 3 +++
+ 1 file changed, 3 insertions(+)
 
-    [subset] Correct flipped use short computation
+commit 2c93f0dee31b2277567ccbee041539732b9bd26d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 23:31:05 2019 -0700
 
- src/hb-ot-glyf-table.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+    Add HB_NO_AAT
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
-commit ab3fe5de2bbe10fdc13711537f824b62d091f995
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Thu May 9 22:12:20 2019 -0700
+ src/hb-aat-layout.cc    | 58 +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-map.cc       |  8 +++++++
+ src/hb-ot-kern-table.hh | 14 ++++++++++++
+ src/hb-ot-shape.cc      | 28 +++++++++++++++++++++++-
+ 4 files changed, 107 insertions(+), 1 deletion(-)
 
-    [subset] Glyf by iter now runs but fails tests
+commit 62dfe7aea23c95f4550543085071990e20ee4d54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 23:17:15 2019 -0700
 
- src/hb-ot-glyf-table.hh | 88 +++++++++++++++++++++++++++++++++----------------
- 1 file changed, 59 insertions(+), 29 deletions(-)
+    [cff] Minor
 
-commit f8de063b48c243d551c8892bdd2a799606fda3f4
-Merge: 0d7fef2d 8f174870
-Author: Rod Sheeter <rsheeter@google.com>
-Date:   Thu May 9 20:02:38 2019 -0700
+ src/hb-subset-cff1.cc | 2 +-
+ src/hb-subset-cff2.cc | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
 
-    Merge branch 'glyf' of github.com:googlefonts/harfbuzz into glyf
+commit 227d85e138d4c785c2d658e225ed35f5acd1235f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 23:15:58 2019 -0700
 
-commit 0d7fef2d50bba714815c0c13f3b3dd6464710a1d
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 16:52:00 2019 -0700
+    Minor
 
-    [subset] Dinner time, checkpoint
+ src/hb-atomic.hh                             |  2 +-
+ src/hb-debug.hh                              |  2 +-
+ src/hb-font.cc                               |  2 +-
+ src/hb-ot-font.cc                            |  4 ++--
+ src/hb-ot-layout.cc                          |  6 +++---
+ src/hb-ot-name-table.hh                      |  2 +-
+ src/hb-ot-shape-complex-arabic.cc            |  2 +-
+ src/hb-ot-shape-complex-hebrew.cc            |  2 +-
+ src/hb-ot-shape-complex-thai.cc              |  2 +-
+ src/hb-ot-shape-complex-vowel-constraints.cc |  2 +-
+ src/hb-ot-shape-fallback.cc                  |  6 +++---
+ src/hb-subset.cc                             |  4 ++--
+ src/hb-warning.cc                            |  4 ++--
+ src/hb.hh                                    | 10 +++++-----
+ 14 files changed, 25 insertions(+), 25 deletions(-)
 
- src/hb-ot-glyf-table.hh | 97 +++++++++++++++++++++++++++++--------------------
- 1 file changed, 58 insertions(+), 39 deletions(-)
+commit 9bfe22af6113ee8cd24cb9ee091f0841c27bbf98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 22:44:19 2019 -0700
 
-commit 240bc86e3a0b177ee84ec9c60723304a0cf4c405
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 14:59:03 2019 -0700
+    [sanitize] Fix previous commit
 
-    [subset] Remove subset-glyf; want everything to point to new iter-based edition. Some of the code will resurface as impl builds out.
+ src/hb-open-type.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
 
- src/Makefile.sources    |   2 -
- src/hb-ot-glyf-table.hh |   9 +-
- src/hb-subset-glyf.cc   | 346 ------------------------------------------------
- src/hb-subset-glyf.hh   |  40 ------
- src/hb-subset.cc        |   1 -
- 5 files changed, 6 insertions(+), 392 deletions(-)
+commit 4dcf65328f04a11594fc190fd7e976afa54455e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 22:23:24 2019 -0700
 
-commit 02d4d4f3e67dcc37915bc386d506bb272455ff1e
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 14:43:18 2019 -0700
+    [sanitize] Simplify
 
-    [subset] Starting to sketch glyf as iter
+ src/hb-open-type.hh | 45 ++++++++++-----------------------------------
+ 1 file changed, 10 insertions(+), 35 deletions(-)
 
- src/hb-ot-glyf-table.hh | 60 ++++++++++++++++++++++++++++++++++++-------------
- src/hb-subset-plan.hh   |  2 ++
- src/hb-subset.cc        |  2 +-
- 3 files changed, 47 insertions(+), 17 deletions(-)
+commit 23168c3981f7c80883663fa69c608caee98d3d99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 22:11:51 2019 -0700
 
-commit 8f174870e9eed4c47463fdb0d4fe3e22a6f5fdc8
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 16:52:00 2019 -0700
+    [sanitize] Use hb_is_trivially_copyable()
 
-    [subset] Dinner time, checkpoint
+ src/hb-open-type.hh | 64 +++++++----------------------------------------------
+ 1 file changed, 8 insertions(+), 56 deletions(-)
 
- src/hb-ot-glyf-table.hh | 97 +++++++++++++++++++++++++++++--------------------
- 1 file changed, 58 insertions(+), 39 deletions(-)
+commit 0ff7954f9f09f80654ac91c16712154744a0dd2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 22:04:40 2019 -0700
 
-commit 723d054dcb6ad44e9eab4dc8cc55f8d480d2ff16
-Merge: ed727d4b e2a51ff7
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 16:45:35 2019 -0700
+    [meta] Add hb_is_trivial
 
-    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf
+ src/hb-meta.hh   | 7 +++++++
+ src/test-meta.cc | 4 ++++
+ 2 files changed, 11 insertions(+)
 
-commit ed727d4bb74860c126675e94f87f65ff7874dbb6
-Merge: fb9bff95 e8b45c19
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 16:39:45 2019 -0700
+commit 7162a97bca6e0dde3d277701a3bf15688deef61d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 22:03:03 2019 -0700
 
-    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf
+    [meta] Add hb_is_trivially_copyable()
 
-commit fb9bff955a9356b053c5c9bcd7aa9101edb55767
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 14:59:03 2019 -0700
+ src/hb-meta.hh   | 11 +++++++++++
+ src/test-meta.cc |  4 ++++
+ 2 files changed, 15 insertions(+)
 
-    [subset] Remove subset-glyf; want everything to point to new iter-based edition. Some of the code will resurface as impl builds out.
+commit f2398f34c019a55d4f0e1a7031961714afadf2b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 21:59:57 2019 -0700
 
- src/Makefile.sources    |   2 -
- src/hb-ot-glyf-table.hh |   9 +-
- src/hb-subset-glyf.cc   | 346 ------------------------------------------------
- src/hb-subset-glyf.hh   |  40 ------
- src/hb-subset.cc        |   1 -
- 5 files changed, 6 insertions(+), 392 deletions(-)
+    [meta] Add is_trivially_destructible
 
-commit f9b089b695edc89023e3d62700ae68d5648f8494
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 14:43:18 2019 -0700
+ src/hb-meta.hh   | 6 +++---
+ src/test-meta.cc | 7 +++++--
+ 2 files changed, 8 insertions(+), 5 deletions(-)
 
-    [subset] Starting to sketch glyf as iter
+commit 72cb5b8e52b7103c18adcb82cbcd4b91a2c85474
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 21:50:15 2019 -0700
 
- src/hb-ot-glyf-table.hh | 60 ++++++++++++++++++++++++++++++++++++-------------
- src/hb-subset-plan.hh   |  2 ++
- src/hb-subset.cc        |  2 +-
- 3 files changed, 47 insertions(+), 17 deletions(-)
+    Remove accidentally included include
 
-commit f49a5bec9fc241c098be5a49233aa83cd5dc098e
-Author: rsheeter <rsheeter@google.com>
-Date:   Mon May 20 20:45:11 2019 -0700
+ src/test-meta.cc | 3 ---
+ 1 file changed, 3 deletions(-)
 
-    [docs] Tweak fuzzer doc
+commit 086772e409759e8f1edd0e34f6f25374e51e9e10
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 21:49:25 2019 -0700
 
- TESTING.md | 6 ++++++
- 1 file changed, 6 insertions(+)
+    [meta] Add is_destructible
 
-commit 1aadd1449c65c50d5f35191f43136841c64ad399
+ src/hb-meta.hh | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit b14745278ad16fe7f4e838b685029e3fdda516ca
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 20 17:29:13 2019 -0400
+Date:   Fri May 10 21:42:59 2019 -0700
 
-    [gen-ucd] Generate script order table
+    [met]a Add is_constructible, ...
 
- src/gen-ucd.py | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
+ src/hb-meta.hh   | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/test-meta.cc | 23 ++++++++++++++++++
+ 2 files changed, 96 insertions(+)
 
-commit be8de188671c04ddd8ec4d7af38b313322189136
+commit 19e08a146712dacd11359370c91a7bad55bc6f62
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 20 17:17:38 2019 -0400
+Date:   Fri May 10 21:25:07 2019 -0700
 
-    [gen-ucd] Start adding script-order
+    [iter] Adjust source_of/sink_of
 
- src/gen-ucd.py | 14 +++++++++++++-
- 1 file changed, 13 insertions(+), 1 deletion(-)
+ src/hb-iter.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 4a0eb066fdceb0cab48107f17670d6943ec0d61e
+commit c0485e32a320e17dd0634b2cc8b4dd8c4fdc65e0
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 20 16:57:04 2019 -0400
+Date:   Fri May 10 21:03:14 2019 -0700
 
-    [gen-ucd] Add gc order
+    Use hb_void_t<> the way it's supposed to be used
 
- src/gen-ucd.py | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
+ src/hb-null.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
 
-commit d1f9b2f961c71e5218ee359e8fb20cfbdb894c7e
+commit 40fb36a39de5dd3ee9a4c84f1f76205b6bb68660
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 20 15:47:49 2019 -0400
+Date:   Fri May 10 21:01:19 2019 -0700
 
-    [gen-ucd] Flesh out a bit more
+    [meta] Minor
 
- src/gen-ucd.py | 52 ++++++++++++++++++++++++++++++++++++++++------------
- 1 file changed, 40 insertions(+), 12 deletions(-)
+ src/hb-meta.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit d6de4659aa7edb991507f8838dc566874e5b6a61
+commit f9a96a0a97f59a0b31ee0f901d1c21dde6b3cfaf
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 20 15:33:23 2019 -0400
+Date:   Fri May 10 20:56:16 2019 -0700
 
-    Add HB_OPTIMIZE_SIZE
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [meta] More rewrites
 
- src/hb-config.hh | 8 ++++++++
- 1 file changed, 8 insertions(+)
+ src/hb-meta.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
 
-commit 0ff3618c2d841d16cce9ba2d73321048e7ca6a2d
-Author: Garret Rieger <grieger@google.com>
-Date:   Fri May 17 15:30:01 2019 -0700
+commit 5252677e53ff4473701172bbbd4e953ac6b08e6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 20:49:52 2019 -0700
 
-    [subset] Use hb_subset_input_t inside of subset_options_t so that input defaults are shared between the library and cli.
+    [meta] Rewrite hb_int_min/max
 
- src/hb-subset-input.cc           |  42 ++++++++-----
- src/hb-subset-input.hh           |   7 +--
- src/hb-subset-plan.cc            |   3 +-
- src/hb-subset-plan.hh            |   1 -
- src/hb-subset.cc                 |  23 +------
- src/hb-subset.h                  |   6 --
- test/api/test-subset-glyf.c      |   8 ++-
- test/fuzzing/hb-subset-fuzzer.cc |   8 ++-
- util/Makefile.am                 |   5 +-
- util/Makefile.sources            |   1 +
- util/hb-subset.cc                |   9 +--
- util/options-subset.cc           | 127 +++++++++++++++++++++++++++++++++++++++
- util/options.cc                  | 101 -------------------------------
- util/options.hh                  |  20 ++----
- 14 files changed, 182 insertions(+), 179 deletions(-)
+ src/hb-meta.hh | 44 ++++++++++++++++++++++----------------------
+ 1 file changed, 22 insertions(+), 22 deletions(-)
 
-commit 67064294a0c521550f5277b51b8c7e5d6bb27e68
-Author: Garret Rieger <grieger@google.com>
-Date:   Thu May 16 15:13:39 2019 -0700
+commit caa3f92e91062ff78b657aec23569b099de48640
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 20:43:51 2019 -0700
 
-    [subset] Add drop-tables option to hb-subset util.
+    [meta] void_tt -> void_t
 
- util/hb-subset.cc |  1 +
- util/options.cc   | 45 ++++++++++++++++++++++++++++++++++++++++++---
- util/options.hh   |  3 +++
- 3 files changed, 46 insertions(+), 3 deletions(-)
+ src/hb-meta.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
 
-commit 3be0ffe45d1ba32ddd8d3af25ff2c420be85da76
-Author: Garret Rieger <grieger@google.com>
-Date:   Thu May 16 11:29:15 2019 -0700
+commit 7df3ecfb4069d275cd277c71165962bb5769364a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 20:43:26 2019 -0700
 
-    [subset] Add drop tables to subset input.
+    [meta] hb_void_t -> hb_empty_t
 
- src/hb-subset-input.cc             |  8 +++++
- src/hb-subset-input.hh             |  1 +
- src/hb-subset-plan.cc              |  3 ++
- src/hb-subset-plan.hh              |  5 ++-
- src/hb-subset.cc                   |  3 ++
- src/hb-subset.h                    |  3 ++
- test/api/Makefile.am               |  2 ++
- test/api/test-subset-drop-tables.c | 71 ++++++++++++++++++++++++++++++++++++++
- 8 files changed, 95 insertions(+), 1 deletion(-)
+ src/hb-debug.hh                |  6 +++---
+ src/hb-meta.hh                 |  2 +-
+ src/hb-ot-layout-gsub-table.hh |  2 +-
+ src/hb-ot-layout-gsubgpos.hh   | 18 +++++++++---------
+ 4 files changed, 14 insertions(+), 14 deletions(-)
 
-commit 0ca7ad4352eff357cbb5cc1dfe62aa15b440de84
+commit 149c3db8a2d41894b5d65f4c4b7c20757f6de6dd
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 20 11:39:07 2019 -0400
+Date:   Fri May 10 20:34:52 2019 -0700
 
-    [cff] Fix unlikely invocations
+    [meta] Minor
 
- src/hb-ot-cff-common.hh | 8 ++++----
- src/hb-ot-cff1-table.hh | 2 +-
- 2 files changed, 5 insertions(+), 5 deletions(-)
+ src/hb-meta.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 9ef241cd409b7ad4eeb8259cbf1a7a01358a766e
+commit 707ff5b59d3903b60312a028f2ba5d74c18db101
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 20 11:38:02 2019 -0400
+Date:   Fri May 10 20:31:20 2019 -0700
 
-    [test] Add one more
+    Minor
 
- ...-testcase-minimized-hb-subset-fuzzer-5634197349203968 | Bin 0 -> 5791 bytes
- 1 file changed, 0 insertions(+), 0 deletions(-)
+ src/hb-meta.hh      | 5 -----
+ src/hb-open-type.hh | 2 +-
+ 2 files changed, 1 insertion(+), 6 deletions(-)
 
-commit 3efb7af7e28061f8cd138eb2ed5261bf521abc63
+commit ce300f4fb68a25d46d165e8b0a4825482c83a966
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 20 11:37:16 2019 -0400
+Date:   Fri May 10 20:26:29 2019 -0700
 
-    [STAT] Fix sanitize condition
-    
-    Oops!
-    
-    Fixes https://oss-fuzz.com/testcase-detail/5696825891225600
+    [meta] Rewrite is_signed, add is_unsigned
 
- src/hb-ot-stat-table.hh                                    |   2 +-
- ...zz-testcase-minimized-hb-subset-fuzzer-5696825891225600 | Bin 0 -> 69 bytes
- 2 files changed, 1 insertion(+), 1 deletion(-)
+ src/hb-meta.hh | 29 ++++++++++++-----------------
+ 1 file changed, 12 insertions(+), 17 deletions(-)
 
-commit e66eb21a46b2374bfb51f86ed9f5eec35ba87a61
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat May 18 07:44:48 2019 -0700
+commit e939d88bd72e0db0ebe357649b7a0fa3447c0bf4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 20:20:51 2019 -0700
 
-    Don't set _POSIX_C_SOURCE in NetBSD
-    
-    According to a harfbuzz package patch on NetBSD project
-    https://github.com/NetBSD/pkgsrc/blob/trunk/fonts/harfbuzz/patches/patch-src_hb-blob.cc
+    [meta] Rewrite is_integral / is_floating_point, add is_arithmetic
 
- src/hb-blob.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-meta.hh | 49 +++++++++++++++++++++++++++++++------------------
+ 1 file changed, 31 insertions(+), 18 deletions(-)
 
-commit 08c3648c6e18a0969a64284337dbd5b435d40f37
+commit c3a456a26e8e5f8bc483b326f1928e9c603a7216
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 17 16:21:34 2019 -0700
+Date:   Fri May 10 20:17:30 2019 -0700
 
-    Oops, fix include
+    [meta] Rewrite is_cr_convertible
 
- src/hb-set.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-meta.hh | 13 +++++--------
+ 1 file changed, 5 insertions(+), 8 deletions(-)
 
-commit 24958b8868a8003936e872d8fda873c52d528bcf
+commit b4ad6af9c4ec30c462078bd93ae12653619c5fea
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 17 16:20:36 2019 -0700
+Date:   Fri May 10 20:15:03 2019 -0700
 
-    [set] Use StructAtOffsetUnaligned
+    [meta] Rewrite is_base_of
 
- src/hb-set.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-meta.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
 
-commit a0febbac439ac4cc58af674f676e473d2f6d726f
-Author: rsheeter <rsheeter@google.com>
-Date:   Thu May 16 15:58:49 2019 -0700
+commit 5a171ed3a69313e10df6e42a03affb5e8bfe8e95
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 20:11:29 2019 -0700
 
-    Update TESTING.md
+    [null] Modernize template work
 
- TESTING.md | 5 +++++
- 1 file changed, 5 insertions(+)
+ src/hb-null.hh | 19 ++++++-------------
+ 1 file changed, 6 insertions(+), 13 deletions(-)
 
-commit b7be59311f27112791e9b9c6356464e1c3ff92c1
+commit 61d150c916d181cc3f333d0378108e08210370ad
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 16 13:32:56 2019 -0700
+Date:   Fri May 10 20:06:31 2019 -0700
 
-    Fix msan issue
-    
-    The fact that HB_AUTO_RETURN will return rvalue-references for rvalues
-    is very disturbing.
-    
-    Even apart from that, I'm totally lost re any hb_move needs or
-    hb_forward'ing to functions/templates where the type is fixed by
-    explicitly specifying template parameters.
-    
-    ==1==ERROR: AddressSanitizer: stack-use-after-return on address 0x7f6ad65e51e0 at pc 0x0000005da240 bp 0x7ffc104ab670 sp 0x7ffc104ab668
-    READ of size 4 at 0x7f6ad65e51e0 thread T0
-    SCARINESS: 55 (4-byte-read-stack-use-after-return)
-         #0 0x5da23f in bool OT::Coverage::serialize<hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, (void*)0>(hb_serialize_context_t*, hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>) harfbuzz/src/hb-ot-layout-common.hh:1055:16
-         #1 0x5d88f9 in bool OT::SingleSubstFormat1::serialize<hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, (void*)0>(hb_serialize_context_t*, hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, unsigned int) harfbuzz/src/hb-ot-layout-gsub-table.hh:98:9
+    [meta] Add integral_constant, true_t -> true_type, false_t -> false_type
 
- src/hb-algs.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/hb-iter.hh | 20 ++++++++++----------
+ src/hb-meta.hh | 17 ++++++++---------
+ src/hb-null.hh |  4 ++--
+ 3 files changed, 20 insertions(+), 21 deletions(-)
 
-commit bcd3ffc948f63f59a709923a3ba6dc9d591aae6b
+commit 38e3a8bd531ef3d35ca0fbcfad09db3f83345038
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 16 13:22:09 2019 -0700
+Date:   Fri May 10 20:03:14 2019 -0700
 
-    Whitespace
+    [meta] bool_tt -> bool_constant
 
- src/hb-ot-layout-gsub-table.hh | 24 ++++++++++++------------
- 1 file changed, 12 insertions(+), 12 deletions(-)
+ src/hb-meta.hh | 6 +++---
+ src/hb-null.hh | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
 
-commit 05bc5f96fb0818531404174b71c6ff497d5e2738
+commit 3919ca41b5e657764c7f75dfdc21cf8ca20bd66f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 16 13:05:58 2019 -0700
+Date:   Fri May 10 19:56:36 2019 -0700
 
-    [subset] Remove extra iteration
+    [meta] Add is_floating_point
 
- src/hb-ot-layout-gsub-table.hh | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
+ src/hb-meta.hh | 33 +++++++++++++++++++--------------
+ 1 file changed, 19 insertions(+), 14 deletions(-)
 
-commit 6555f209586886a4b2562412363cf152d7837d5c
-Author: Garret Rieger <grieger@google.com>
-Date:   Wed May 15 09:42:38 2019 -0700
+commit 25bb7e005d96c367731fd8d129d764d101b1200f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 19:49:26 2019 -0700
 
-    [subset] Truncate empty gids at the end in retain-gids mode.
+    [meta] Add is_signed for floating point types
 
- src/hb-subset-plan.cc                              |   8 ++++---
- test/api/fonts/Roboto-Regular.a.retaingids.ttf     | Bin 0 -> 2068 bytes
- .../SourceHanSans-Regular.41,4C2E.retaingids.otf   | Bin 2736 -> 2656 bytes
- test/api/test-subset-glyf.c                        |  25 +++++++++++++++++++++
- ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 744 -> 732 bytes
- ...oboto-Regular.abc.drop-hints-retain-gids.62.ttf | Bin 712 -> 704 bytes
- .../basics/Roboto-Regular.abc.retain-gids.61.ttf   | Bin 1808 -> 1792 bytes
- .../basics/Roboto-Regular.abc.retain-gids.62.ttf   | Bin 1756 -> 1748 bytes
- 8 files changed, 30 insertions(+), 3 deletions(-)
+ src/hb-meta.hh | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit 2376867649f97d25e4319f45845525ec207887f7
+commit e0315b4aadb3fbc6b618de56d643471e8d1f7859
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 21:57:26 2019 -0700
+Date:   Fri May 10 19:48:02 2019 -0700
 
-    Use hb_map(hb_add(this)) to dereference OffsetTo<>'s
+    [meta] is_integer -> is_integral
 
- src/hb-ot-layout-gsub-table.hh | 30 ++++++++++++++-------
- src/hb-ot-layout-gsubgpos.hh   | 60 ++++++++++++++++++++++++++++--------------
- src/hb-ot-stat-table.hh        |  2 +-
- 3 files changed, 61 insertions(+), 31 deletions(-)
+ src/hb-algs.hh |  2 +-
+ src/hb-map.hh  |  4 ++--
+ src/hb-meta.hh | 26 +++++++++++++-------------
+ 3 files changed, 16 insertions(+), 16 deletions(-)
 
-commit 6f51e5552477125480f764a6af763dad9f8e3e1b
+commit 9574de7a3e763b9c5eacf65b4b8c148724c00b82
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 21:41:12 2019 -0700
+Date:   Fri May 10 19:29:32 2019 -0700
 
-    [algs] Rename hb_bind to hb_partial
-    
-    Since our API is the invers of what std::bind is, and closer to Python
-    functools.partial().
+    [meta] Add add_const, add_pointer, add_lvalue_reference, add_rvalue_reference
 
- src/hb-algs.hh   | 12 ++++++------
- src/test-algs.cc |  6 +++---
- 2 files changed, 9 insertions(+), 9 deletions(-)
+ src/hb-meta.hh | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
 
-commit 0888e7bc86454020db45f78ee1136d6f3a1b9527
+commit 2fb3a8327ab35248a0c7877c48422718cfbe375d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 21:36:42 2019 -0700
+Date:   Fri May 10 18:40:29 2019 -0700
 
-    [algs] Change hb_bind parameter number to be from one
+    [vector] Simplify arrayZ
     
-    To match std:;bind, even though our interfaces are very different.
+    Was turned into function when we had static ones and wanted to be
+    move-safe...  Not the case anymore.
 
- src/hb-algs.hh   | 24 +++++++++++++-----------
- src/test-algs.cc |  6 +++---
- 2 files changed, 16 insertions(+), 14 deletions(-)
+ src/hb-coretext.cc      |  2 +-
+ src/hb-ot-cff-common.hh |  2 +-
+ src/hb-uniscribe.cc     | 10 +++----
+ src/hb-vector.hh        | 71 ++++++++++++++++++++++---------------------------
+ 4 files changed, 39 insertions(+), 46 deletions(-)
 
-commit dfa5e4297147b52f0ed2f569c9b90a0c68c003c4
+commit 4d67743ffd99ed9f2278ab21adfac7eb314c0df0
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 21:18:14 2019 -0700
+Date:   Fri May 10 16:35:31 2019 -0700
 
-    Add back symmetric OffsetTo<>::friend operator+
-    
-    Finally seems to be working now.
+    [subset] Use more auto typing
 
- src/hb-open-type.hh | 6 ++++++
- 1 file changed, 6 insertions(+)
+ src/hb-ot-layout-common.hh     | 8 ++++----
+ src/hb-ot-layout-gdef-table.hh | 2 +-
+ src/hb-ot-layout-gsubgpos.hh   | 4 ++--
+ 3 files changed, 7 insertions(+), 7 deletions(-)
 
-commit a06a236891611da9db601ddbc2b1513380ad12e6
+commit a27a31b9ee2601a05575cb581dc227caa73742c4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 21:12:22 2019 -0700
+Date:   Fri May 10 16:26:19 2019 -0700
 
-    [algs] Partialize all operators
+    Minor
 
- src/hb-algs.hh   | 66 +++++++++++++++++++++++++++++++++++---------------------
- src/test-algs.cc |  4 ++--
- 2 files changed, 44 insertions(+), 26 deletions(-)
+ src/hb-ot-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit edc69ec935511d1993240fb68b54b2cfd6afa888
+commit 2ade0086286963ae2c65d44b94e63cb3836ce36b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 21:09:56 2019 -0700
+Date:   Fri May 10 16:21:03 2019 -0700
 
-    [algs] Rewrite bind API
-    
-    And add a partialization API use example to hb_add()
+    [serialize] More rewrite
 
- src/hb-algs.hh   | 45 ++++++++++++++++++++-------------------------
- src/test-algs.cc |  9 ++++++---
- 2 files changed, 26 insertions(+), 28 deletions(-)
+ src/hb-ot-layout-common.hh | 42 ++++++++++++++++++++++++------------------
+ 1 file changed, 24 insertions(+), 18 deletions(-)
 
-commit 16a3540ea4257a19b9bfd9d5300a280e18b423a1
+commit 99ed6e29d86bbf391c12ee1f980b8af9dc35615e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 20:48:20 2019 -0700
+Date:   Fri May 10 16:07:51 2019 -0700
 
-    [algs] Add hb_bind0 and hb_bind1
+    [serialize] Fix a TODO
 
- src/hb-algs.hh   | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
- src/test-algs.cc |  7 +++++++
- 2 files changed, 61 insertions(+)
+ src/hb-ot-layout-common.hh | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
 
-commit d214b07883a626f3ecebb027797e8bb994e174a4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 19:07:39 2019 -0700
+commit d8a49b53e3676ad742bdb8edf0ec3ca6f7a7cac9
+Author: rsheeter <rsheeter@google.com>
+Date:   Fri May 10 16:52:43 2019 -0700
 
-    Fix clang build
-    
-    Ugh.
-    
-    In file included from hb-ot-face.cc:41:
-    ./hb-ot-layout-gsub-table.hh:293:7: error: template parameter redefines default argument
-             hb_requires (hb_is_sorted_source_of (Iterator,
-             ^
-    ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires'
-     define hb_requires(Cond) hb_enable_if((Cond))
-                              ^
-    ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if'
-     define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr
-                                                                      ^
-    ./hb-ot-layout-gsub-table.hh:40:5: note: previous default template argument defined here
-        hb_requires (hb_is_sorted_source_of (Iterator,
-        ^
-    ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires'
-     define hb_requires(Cond) hb_enable_if((Cond))
-                              ^
-    ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if'
-     define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr
-                                                                      ^
+    Update TESTING.md
 
src/hb-ot-layout-gsub-table.hh | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
TESTING.md | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
 
-commit 371b55c7a0c718fcaca0330edfeacf610797cf7a
+commit 25a5b287f220802728cd3312692f368c45d22862
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 18:54:07 2019 -0700
+Date:   Fri May 10 16:01:39 2019 -0700
 
-    Fix clang build
+    Fix sanitize fail of extension sublookups
     
-    In file included from hb-ot-face.cc:41:
-    ./hb-ot-layout-gsub-table.hh:293:7: error: template parameter redefines default argument
-             hb_requires (hb_is_sorted_source_of (Iterator,
-             ^
-    ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires'
-     define hb_requires(Cond) hb_enable_if((Cond))
-                              ^
-    ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if'
-     define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr
-                                                                      ^
-    ./hb-ot-layout-gsub-table.hh:40:5: note: previous default template argument defined here
-        hb_requires (hb_is_sorted_source_of (Iterator,
-        ^
-    ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires'
-     define hb_requires(Cond) hb_enable_if((Cond))
-                              ^
-    ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if'
-     define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr
-                                                                      ^
-    1 error generated.
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=960331
+
+ src/hb-ot-layout-common.hh                                 |  10 ++++++++--
+ src/hb-sanitize.hh                                         |   2 ++
+ ...uzz-testcase-minimized-harfbuzz_fuzzer-5702671124791296 | Bin 0 -> 94 bytes
+ 3 files changed, 10 insertions(+), 2 deletions(-)
+
+commit 9c0c3589f31106d1898f8922cc9a2e18cb054989
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 13:56:50 2019 -0700
 
- src/hb-ot-layout-gsub-table.hh | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
+    Minor
 
-commit 243a5a6af2565937705d6bc20e65a62b686bb664
+ src/hb-ot-layout-common.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 5d773ec60029e1a6edec45c27ea918d9be4ea806
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 19:03:59 2019 -0700
+Date:   Fri May 10 13:53:15 2019 -0700
 
-    [algs] Remove pair copy constructor
-    
-    Use default.
+    Minor
 
- src/hb-algs.hh   | 1 -
- src/test-algs.cc | 1 +
- 2 files changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit f92d188d7703184d04e8f205ae46ca3081d3e048
+commit ac737f8c9e7cbc81cdb5a0542a2494671f236895
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 18:52:57 2019 -0700
+Date:   Fri May 10 13:51:12 2019 -0700
 
-    Whitespace
+    Minor again
 
- src/hb-ot-layout-gsub-table.hh | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 962f95cf802404dafadf2f999772d3f9fc949d63
-Author: Garret Rieger <grieger@google.com>
-Date:   Thu May 9 13:04:11 2019 -0700
+commit 5d4437fad0f99508ebd5c026a3d927f5d649615e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri May 10 13:43:29 2019 -0700
 
-    [subset] Switch SingleSubst to use iterators in serialize.
+    Minor
 
- src/hb-ot-layout-common.hh     |  6 +--
- src/hb-ot-layout-gsub-table.hh | 97 +++++++++++++++++++++++++-----------------
- 2 files changed, 62 insertions(+), 41 deletions(-)
+ src/hb-ot-layout-common.hh | 1 -
+ 1 file changed, 1 deletion(-)
 
-commit 78d35f0e780dd811ae103c96f3b1060d49046a7a
+commit cd9bc732a75c716121a86e39ab588d2e0af58eba
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 18:15:05 2019 -0700
+Date:   Fri May 10 13:17:41 2019 -0700
 
-    Reduce captures of lambdas
+    [gsubgpos] Minor
 
- src/hb-ot-hdmx-table.hh        |  4 ++--
- src/hb-ot-layout-gpos-table.hh |  2 +-
- src/hb-ot-layout-gsub-table.hh | 29 +++++++++++++++--------------
- src/hb-ot-layout-gsubgpos.hh   | 12 ++++++------
- src/hb-ot-name-table.hh        |  2 +-
- src/hb-ot-stat-table.hh        |  2 +-
- src/hb-ot-var-fvar-table.hh    |  4 ++--
- src/hb-subset-plan.cc          |  2 +-
- src/test-iter.cc               |  4 ++--
- 9 files changed, 31 insertions(+), 30 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh | 9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
 
-commit 5266ca86b633b84850492b7982334fb63271ccbc
+commit 6d63e27ca41b12ba2e8fb22fd6bc44417651c518
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 17:59:00 2019 -0700
+Date:   Fri May 10 11:53:02 2019 -0700
 
-    Fix tests
+    Generate tarball in .xz instead of .bz2
     
-    Oops.
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1662
 
src/test-algs.cc | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 5da8a3a90db5e5ccaaf68de2ac312108af911821
+commit 1d870cce68f7033f6d3967ce4e9ba622a6fafe79
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 17:11:18 2019 -0700
+Date:   Fri May 10 11:32:59 2019 -0700
 
-    Remove variadic form of hb_min/hb_max
+    Fix bot
     
-    Unused, and why here and not in other functions...
+    Any way to catch these?
 
- src/hb-algs.hh | 22 ++--------------------
- 1 file changed, 2 insertions(+), 20 deletions(-)
+ src/test-meta.cc | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
 
-commit e5cfe9d582d86281eda2bcb85d3d1cbd4afbb5bb
+commit 30e4ae6bd19bf297b029205b5f86c1a0ae14943d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 16:59:36 2019 -0700
+Date:   Fri May 10 11:26:39 2019 -0700
 
-    Add arithmetic operators
+    [meta] Add hb_is_base_of
 
- src/hb-algs.hh | 44 ++++++++++++++++++++++++++++++--------------
- 1 file changed, 30 insertions(+), 14 deletions(-)
+ src/hb-meta.hh   |  7 +++++++
+ src/test-meta.cc | 16 ++++++++++++++++
+ 2 files changed, 23 insertions(+)
 
-commit f7a458510d9c34d1c52579985ded5082ad0f3458
+commit 98974ac16f5caf282c9c7cf0c417b494efd6af1d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 16:49:35 2019 -0700
+Date:   Fri May 10 11:18:52 2019 -0700
 
-    Add hb_bitwise_* ops
+    [iter] Adjust is_source_of / is_sink_of
+    
+    There are two cases that we accept.  Encode both.
 
- src/hb-algs.hh | 56 +++++++++++++++++++++++++++++++++++---------------------
- src/hb-set.hh  | 14 +++++++-------
- 2 files changed, 42 insertions(+), 28 deletions(-)
+ src/hb-iter.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
 
-commit d822e0a16f914ec6a7e629d21ed972d009a88561
+commit 1b58bf22ca70908bb578910757795ee32d48b65a
+Author: rsheeter <rsheeter@google.com>
+Date:   Thu May 9 20:06:29 2019 -0700
+
+    Update TESTING.md
+
+ TESTING.md | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit ed972d5d73ba0592e1ba92426adf2a8f67acf9c9
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 16:30:08 2019 -0700
+Date:   Thu May 9 16:58:28 2019 -0700
 
-    [array] Adjust operator!=
+    [iter] Rewrite test functions
     
-    See comments.
+    Notably, add hb_is_source_of(,) and hb_is_sink_of(,) to replace most
+    uses of hb_is_iterator_of(,).
 
- src/hb-array.hh  | 7 ++++++-
- src/hb-vector.hh | 1 +
- 2 files changed, 7 insertions(+), 1 deletion(-)
+ src/hb-iter.hh             | 65 +++++++++++++++++++++++++++++-----------------
+ src/hb-open-type.hh        |  7 +++--
+ src/hb-ot-layout-common.hh |  6 ++---
+ src/hb-ot-name-table.hh    |  2 +-
+ src/test-iter.cc           |  2 +-
+ 5 files changed, 49 insertions(+), 33 deletions(-)
 
-commit 203ea58bf67b3df3e376f94cdfb37382dd3858a0
+commit 42901d7af91b4c5cffee9752f653447e4f4bd4f7
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 16:14:40 2019 -0700
+Date:   Thu May 9 16:22:08 2019 -0700
 
-    More adjustment to OffsetTo<>::friend opeator+
-    
-    Let's see if I break any bots.  But yeah, it wasn't accepting a
-    non-const pointer.  It just happens that we don't use that in the
-    code it seems.
+    Minor
 
- src/hb-open-type.hh | 10 ++++++----
- 1 file changed, 6 insertions(+), 4 deletions(-)
+ src/hb-meta.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit ebf47a95f29dd959319feb7f8728f7c0162a181e
+commit 322627ae1daa16f62f7a91c3c3ed02eb5b708ca5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 15:14:26 2019 -0700
+Date:   Thu May 9 16:08:10 2019 -0700
 
-    [iter] Simplify operator!= of iterator filters
-    
-    Both to save ops, and also because lambdas don't implement operator!=,
-    so this was failing in range-based for loop if a lambda was passed to
-    hb_map() or hb_filter().  Just check end-condition assuming that we
-    are comparing to .end() or iterators that are otherwise derived from
-    current iterator.  Ie. don't compare things that are expected to be
-    in common.
+    Whitespace
 
- src/hb-iter.hh | 8 +++++---
- 1 file changed, 5 insertions(+), 3 deletions(-)
+ src/hb-array.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
 
-commit d3e1d5044f23a2dc910f4253c3f4976bf08f93ab
+commit 489f3c35bddb22cfe40c45d3a5c1cb6d88ccaf1f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 14:25:54 2019 -0700
+Date:   Thu May 9 15:39:32 2019 -0700
 
-    Add all pair_t comparison operators
+    Fix bot
 
- src/hb-algs.hh | 5 +++++
- 1 file changed, 5 insertions(+)
+ src/test-meta.cc | 70 ++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 35 insertions(+), 35 deletions(-)
 
-commit f244224dbb5ee8929af109a0c4e23d2d993c8df8
+commit 790315e0dbc0ce796f0081a60953f74bd3fbdb63
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 14:19:20 2019 -0700
+Date:   Thu May 9 15:31:24 2019 -0700
 
-    [iter] Use default operators instead of redefining empty ones
+    [algs] Implement implicit casting between compatible pair types
 
- src/hb-iter.hh | 26 +++++++++++++++-----------
- 1 file changed, 15 insertions(+), 11 deletions(-)
+ src/hb-algs.hh   | 5 +++++
+ src/test-algs.cc | 3 +++
+ 2 files changed, 8 insertions(+)
 
-commit 125c45ed368ae61a74e2c558b9c884cfde6295e1
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Wed May 15 17:02:32 2019 -0400
+commit 69d9114b5372c1fcea5f20e75a187158c31c52f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 9 15:24:14 2019 -0700
 
-    Convert Consonant_Initial_Postfixed to CONS_MED
+    [meta] Rewrite hb_is_cr_converitble
 
- src/gen-use-table.py                                     |   6 +++---
- src/hb-ot-shape-complex-use-table.cc                     |   2 +-
- .../fonts/fd565cabd5208d345d0ed4fda7ae742917d846a5.ttf   | Bin 0 -> 1056 bytes
- test/shaping/data/in-house/tests/use-syllable.tests      |   1 +
- 4 files changed, 5 insertions(+), 4 deletions(-)
+ src/hb-meta.hh | 22 ++++++++++------------
+ 1 file changed, 10 insertions(+), 12 deletions(-)
 
-commit 99ca956c131563b57d490b1ec3c8de920645e53f
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Wed May 15 16:29:51 2019 -0400
+commit ceda1f03b7b06248ffd056eb7b2400088bb4a121
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 9 15:19:42 2019 -0700
 
-    Fix record-test.sh on machines without sha1sum
+    Fix compile
+    
+    NameRecord is not copy-constructible, so should be iterator of
+    const-reference.
 
- test/shaping/record-test.sh | 13 ++++++++++++-
- 1 file changed, 12 insertions(+), 1 deletion(-)
+ src/hb-meta.hh          |  2 --
+ src/hb-ot-name-table.hh |  2 +-
+ src/test-meta.cc        | 12 ++++++++++++
+ 3 files changed, 13 insertions(+), 3 deletions(-)
 
-commit e2767e438c56b8ee0bc2f2040c10b13b34d37f95
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed May 15 13:14:09 2019 +0430
+commit 3686c3b65c017cf8689b67db440b4cddd399538b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 9 15:09:07 2019 -0700
 
-    [ci][test] Ignore other gcov symbols also
+    Adjust is_cr_convertible
     
-    To fix https://travis-ci.org/harfbuzz/harfbuzz/jobs/532693197
+    If To is const& then From doesn't need to be &.
 
- src/check-symbols.sh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-meta.hh | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
 
-commit 397cbbd5ff25c9796ecd56b8270e83de1eb322ac
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed May 15 13:03:28 2019 +0430
+commit 726002a6a615e2d213186d402cca4e8d7e7a7f58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 9 14:53:02 2019 -0700
 
-    [ci][travis] Update its distribution
+    [iter] Make hb_is_iterator_of() check is_convertible
     
-    It may break things, lets see
+    Instead of is_cr_convertible.
+
+ src/hb-array.hh | 8 ++++----
+ src/hb-iter.hh  | 2 +-
+ src/hb-meta.hh  | 8 ++++----
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 70a49f2e4a9ab05fe04d1949bbf7a128d14a1284
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 9 14:35:15 2019 -0700
+
+    [meta] Add hb_conditional<> and hb_is_convertible()
 
- .travis.yml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/Makefile.am  |  6 ++++-
+ src/hb-meta.hh   | 56 +++++++++++++++++++++++++++++++++++++--------
+ src/test-meta.cc | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 121 insertions(+), 11 deletions(-)
 
-commit 763ea4224bf612f3efb80d5744d1e8852682683e
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 01:15:11 2019 -0700
+commit 5e3cbed048b19ee579277ab4c56167a15d13104e
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 8 16:33:03 2019 -0700
 
-    Another try
+    [subset] Switch building of glyph maps in subset plan to use iterators.
 
- src/hb-open-type.hh | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
+ src/hb-algs.hh        |  4 +---
+ src/hb-subset-plan.cc | 52 +++++++++++++++++++++++++--------------------------
+ 2 files changed, 27 insertions(+), 29 deletions(-)
 
-commit e1b2edb04af7bd2b4eecb59392f75abcc72cd8a6
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 01:12:04 2019 -0700
+commit 971020eca7c5d576816b93431607f1e63e9584a4
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed May 8 16:31:52 2019 -0700
 
-    Completely revert the thing back
+    Add sink support for hb_hashmap_t and a reverse call to hb_pair_t.
 
- src/hb-open-type.hh | 14 +++++---------
- 1 file changed, 5 insertions(+), 9 deletions(-)
+ src/hb-algs.hh | 5 +++++
+ src/hb-map.hh  | 4 ++++
+ 2 files changed, 9 insertions(+)
 
-commit c58eeb5fb35ec6a8d0a4394fd83cb2571cd5af4f
+commit 98eec3dd5f527cc562d98784429db0c7269e82a8
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 01:10:31 2019 -0700
+Date:   Thu May 9 13:15:36 2019 -0700
 
-    Another try at fix
+    Add hb_pair_t(,) macro as alternative to hb_pair_t<,>
     
-    Fails locally.  Trying to understand.  Sigh
+    Just so it's easier to use it in other macros.
 
- src/hb-open-type.hh | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
+ src/hb-algs.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 004edf3bdac77564d39516b51b0666de60e65ece
+commit c9b287a867d6130a0cc745d7fd3ccfa4dcb4c32e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 01:02:50 2019 -0700
+Date:   Thu May 9 12:43:57 2019 -0700
 
-    Ugh.  How was the Travis bot happy before, but isn't now?! :(
+    Add hb_lidentity(), and rename hb_rvalue() to hb_ridentity()
 
- src/hb-open-type.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/hb-algs.hh   | 13 ++++++++++++-
+ src/hb-map.hh    |  4 ++--
+ src/test-iter.cc |  2 +-
+ 3 files changed, 15 insertions(+), 4 deletions(-)
 
-commit e01c7b1648dbbb76966b3bd4437bcf7699e77c35
+commit 00195a22ce5198345cb39825a45863cef7d8f7fc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 00:52:17 2019 -0700
+Date:   Thu May 9 12:14:36 2019 -0700
 
-    Move OffsetTo operator+ back out of class
-    
-    Apparently there's different overload resolution rules that apply, at
-    least with some (older?) version of gcc.
+    [hdmx] Adjust to hb_iota() behavior change
     
-    hb-ot-name-table.hh: In member function ‘void OT::name::accelerator_t::init(hb_face_t*)’:
-    hb-ot-name-table.hh:244:62: error: ambiguous overload for ‘operator+’ (operand types are ‘hb_blob_ptr_t<OT::name>’ and ‘OT::NNOffsetTo<OT::UnsizedArrayOf<OT::IntType<unsigned char, 1u> > > {aka const OT::OffsetTo<OT::UnsizedArrayOf<OT::IntType<unsigned char, 1u> >, OT::IntType<short unsigned int, 2u>, false>}’)
-           this->pool = (const char *) (const void *) (this->table+this->table->stringOffset);
-                                                                  ^
-    hb-ot-name-table.hh:244:62: note: candidates are:
-    hb-ot-name-table.hh:244:62: note: operator+(const C*, long int) <built-in>
-    hb-ot-name-table.hh:244:62: note: operator+(const char*, long int) <built-in>
+    Use hb_range() instead.
 
- src/hb-open-type.hh | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
+ src/hb-ot-hdmx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit b213042f87dd736bad7a852fe98269f84cbff493
+commit 4f2ad75a839708de71e7341f23c2d4b72059fc58
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 00:50:48 2019 -0700
+Date:   Thu May 9 12:07:45 2019 -0700
 
-    Revert "Revert symmetric OffsetTo overloads"
-    
-    This reverts commit 01912efb74fc554a81c8cfe572145ce45b8fa58b.
-    
-    Actually this didn't break things.  Fixing
+    [enumerate] Fix hb_enumerate() len for step=0
 
- src/hb-open-type.hh | 4 ++++
- 1 file changed, 4 insertions(+)
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 01912efb74fc554a81c8cfe572145ce45b8fa58b
+commit 5da3c9c33f02010a3fc57cf0e1d07955af681e7c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 00:42:47 2019 -0700
+Date:   Thu May 9 11:30:31 2019 -0700
 
-    Revert symmetric OffsetTo overloads
-    
-    Reverts 57f65ae9355004044325dd6441cde761bca5e0a3
+    [iter] Fix hb_zip() end condition
     
-    Caused ambiguous-overload on some gcc...
+    We should compare-equal to end if either iterator's end reaches,
+    not if both reach at the same time.  Fixes infinite-loop in test
+    which was happening after hb_enumerate() switched to using hb_zip().
 
- src/hb-open-type.hh | 4 ----
- 1 file changed, 4 deletions(-)
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit d0df996cdc249a245c9dad1fa6503213c84dbcd2
+commit 57a5256fbcef6e5d29fc40cf019cc4b2c29c9dcf
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 15 00:32:41 2019 -0700
+Date:   Thu May 9 11:30:27 2019 -0700
 
-    Use implicit lambda return type
+    [iter] Minor
 
- src/hb-array.hh                |  4 ++--
- src/hb-ot-layout-gsub-table.hh |  8 ++++----
- src/hb-ot-layout-gsubgpos.hh   | 18 +++++++++---------
- src/hb-ot-stat-table.hh        |  2 +-
- src/hb-ot-var-fvar-table.hh    |  4 ++--
- src/test-iter.cc               |  8 ++++----
- src/test-meta.cc               |  1 -
- 7 files changed, 22 insertions(+), 23 deletions(-)
+ src/hb-iter.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 57f65ae9355004044325dd6441cde761bca5e0a3
+commit 12dd56f8573cb86169580d5ac31b986208805c03
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 14 22:52:59 2019 -0700
+Date:   Thu May 9 11:25:02 2019 -0700
 
-    Add symmetric friend operator+ for OffsetTo
+    [iter] Minor
 
- src/hb-open-type.hh | 4 ++++
- 1 file changed, 4 insertions(+)
+ src/hb-iter.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
 
-commit 71208e5047c71108dec7361fd7c3e594c8b6c2d8
+commit 57d545932f539d06c52862310ecdfe79c143bb6b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 14 22:51:59 2019 -0700
+Date:   Thu May 9 11:23:41 2019 -0700
 
-    Move OffsetTo<> deref operators in-class as friends
+    [test-iter] Don't walk past end
+    
+    That's not legal.
 
- src/hb-open-type.hh | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
+ src/test-iter.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
 
-commit e6d6f4b96dd5517406265093cd57834c00850d41
+commit 46837910e628248edc09e45e212532a3493905da
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 14 22:45:03 2019 -0700
+Date:   Thu May 9 11:20:41 2019 -0700
 
-    Whitespace
+    [iter] Allow negative step in hb_iota()
 
- src/hb-ot-stat-table.hh     | 2 +-
- src/hb-ot-var-fvar-table.hh | 4 ++--
- 2 files changed, 3 insertions(+), 3 deletions(-)
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 889dc1eb06a80ea9be4223a19011e47a52abebdd
+commit 087327af1eac8c3a16115904557cbf3ab0f28072
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 14 22:28:07 2019 -0700
+Date:   Thu May 9 11:14:06 2019 -0700
 
-    [iter] Remove sort categorization
-    
-    See comments.
+    [iter] Minor
 
- src/hb-array.hh            |  2 +-
- src/hb-iter.hh             | 48 ++++++++++++++++++++++++++++++----------------
- src/hb-ot-layout-common.hh |  2 +-
- src/hb-set.hh              |  2 +-
- 4 files changed, 35 insertions(+), 19 deletions(-)
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit b4eff38397c2a4e475f426df38e040dddf94a4fa
+commit 64f0899a9f5e5aff65c5a78fa796ceae6f35c008
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 14 09:07:20 2019 -0700
+Date:   Thu May 9 11:10:31 2019 -0700
 
-    Start of gen-ucd.py, to replace UCDN
+    [iter] Bug fix
 
- src/gen-ucd.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 46 insertions(+)
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 02e5e5d939be36d8f108029601a1ce1f533e5ccb
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Mon May 13 09:38:42 2019 -0700
+commit 5d263556b95047bced88e4a6252178d2fc0f9a19
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 9 11:08:25 2019 -0700
 
-    [subset] retian nameids from STAT and fvar tables
+    [iter] Fix
 
- src/hb-ot-stat-table.hh     | 76 +++++++++++++++++++++++++++++++++++++++++----
- src/hb-ot-var-fvar-table.hh | 21 +++++++++++++
- src/hb-subset-plan.cc       | 26 ++++++++++++++++
- 3 files changed, 117 insertions(+), 6 deletions(-)
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit ff7995200e706f3161b9fc5c27bb950e3d87e8e2
+commit 2c24ea37b1ef63f79fcc24752dd180ce53540eda
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 14 07:44:03 2019 -0700
+Date:   Thu May 9 11:07:38 2019 -0700
 
-    Hopefully last warning fix
+    [iter] Take start value in hb_enumerate()
+    
+    Also rewrite it via composition.
 
- src/hb-subset-cff2.cc | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-iter.hh   | 61 ++++++++++++--------------------------------------------
+ src/test-iter.cc |  1 +
+ 2 files changed, 14 insertions(+), 48 deletions(-)
 
-commit d1baf99697d215584b2ecb8d2d38ba5b9045955c
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue May 14 16:16:46 2019 +0430
+commit 7675d0d3a6cc13ade1a2047019ef7fac8c373a3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 9 11:02:56 2019 -0700
 
-    [ci] add HB_TINY to asmjs builder
+    [iter] Add hb_range()
+    
+    hb_range() is like Python range.  hb_iota() has slightly different API.
+    Ie. it takes a start, instead of end.
 
- .circleci/config.yml | 28 ++++++++++++++--------------
- 1 file changed, 14 insertions(+), 14 deletions(-)
+ src/hb-iter.hh   | 29 ++++++++++++++++++-----------
+ src/test-iter.cc | 19 +++++++++++--------
+ 2 files changed, 29 insertions(+), 19 deletions(-)
 
-commit 9e7c9c3adb33b06610951be38f3c820342333092
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue May 14 15:58:51 2019 +0430
+commit 05867d9f5315c7e4f49e5873a5aba6bba7121f04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 9 11:00:43 2019 -0700
 
-    Fix -Wunused-function on HB_NO_SHAPE_AAT
-    
-    We should add a bot for it
-    Part of #1652
+    [meta] Add hb_int_max()
 
- src/hb-ot-shape.cc | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-meta.hh | 91 ++++++++++++++++++++++++++++++++++++----------------------
+ 1 file changed, 56 insertions(+), 35 deletions(-)
 
-commit c73d7ba75d4556d9b8e05b10d6572f74f4814f7a
-Author: Dominik Röttsches <drott@chromium.org>
-Date:   Tue May 14 13:26:18 2019 +0300
+commit 71537f93e0ce27121012bf1e81270b6b03b22224
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 9 10:46:49 2019 -0700
 
-    Fix building with HB_NO_SUBSET_LAYOUT
-    
-    Fixes an unused function warning when building with HB_NO_SUBSET_LAYOUT
-    as part of the Chrome build.
+    [iota] end -> end_ to not shadow
+
+ src/hb-iter.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 6bc82579100992e3f04c11f36b9c2f0014d880f2
+Merge: 34764454 6d9a86ae
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Thu May 9 14:39:05 2019 +0100
 
- src/hb-subset-plan.cc | 2 ++
- 1 file changed, 2 insertions(+)
+    Merge pull request #1680 from n8willis/usermanual-obj
+    
+    Usermanual: object-model chapter
 
-commit f39934983f459c992e27075cd2c45ac0025183d0
+commit 3476445420d0e6432c09710b6667205453799129
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 14 00:13:21 2019 -0700
+Date:   Wed May 8 21:14:01 2019 -0700
 
-    [ucdn] Fix Hangul composition
+    Remove unnecessary template keyword
     
-    https://github.com/grigorig/ucdn/issues/23
+    Should fix MSVC.
 
- src/hb-ucdn/ucdn.c      | 3 ++-
- test/api/test-unicode.c | 4 ++++
- 2 files changed, 6 insertions(+), 1 deletion(-)
+ src/hb-array.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit b2ab15a78c219016e20389582716e0ac0ee8aeb5
+commit e2a51ff7264940312197184318f5ad4ec971492f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 23:47:28 2019 -0700
+Date:   Wed May 8 16:41:39 2019 -0700
 
-    Fix more warnings
+    Remove unused var
 
- src/hb-ot-cff1-table.hh | 8 ++++----
- src/hb-subset-cff1.cc   | 4 ++--
- 2 files changed, 6 insertions(+), 6 deletions(-)
+ src/hb-open-type.hh | 1 -
+ 1 file changed, 1 deletion(-)
 
-commit 42ae468a8a76e1e4e6a8121eec5dc118f52086ee
+commit e8b45c19330d8718cd6d7aef0ca2db0539a53294
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 23:43:45 2019 -0700
+Date:   Wed May 8 16:37:38 2019 -0700
 
-    [config] Add NDEBUG and HB_NDEBUG
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [array] Add .copy()
 
- src/hb-config.hh | 10 ++++++++++
- src/hb.hh        | 10 ----------
- 2 files changed, 10 insertions(+), 10 deletions(-)
+ src/hb-array.hh     | 11 +++++++++++
+ src/hb-open-type.hh | 10 ++++------
+ src/hb-serialize.hh |  2 +-
+ 3 files changed, 16 insertions(+), 7 deletions(-)
 
-commit 0a01deb76fa582afa83da70a09478299d8080827
+commit afb013f350b0022ae6c05f140aeba23d5de34101
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 18:04:09 2019 -0700
+Date:   Wed May 8 16:16:43 2019 -0700
 
-    One more warning fix
+    Fix msan issue
     
-    No idea where these appear from...
+    hb_identity returns rvalue-reference if input is rvalue.  That, can leak
+    the reference and cause in bad access to temporaries after they are
+    destructed.  This is unfortunately unfixable given the desired
+    transparency of hb_identity :(.  Just don't use it with hb_map().
 
- src/hb-ot-cff-common.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/test-iter.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit f76e9f2ede76a189d48ddd4f2275442d8e849815
+commit 4c94bc63d914fac7e11940eb165b6cf1039ba5a1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 17:39:46 2019 -0700
+Date:   Wed May 8 15:57:33 2019 -0700
 
-    [icu] Comment
+    Move hb_invoke() back to hb-algs.hh
 
- src/hb-icu.cc | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ src/hb-algs.hh | 32 ++++++++++++++++++++++++++++++++
+ src/hb-meta.hh | 32 --------------------------------
+ 2 files changed, 32 insertions(+), 32 deletions(-)
 
-commit 70fe9e73555f3354238f7cda5ff0f0c0b75e1d62
+commit b710176ce28e863a01797987d7ce37d19aaf2fd3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 17:35:02 2019 -0700
+Date:   Wed May 8 15:46:51 2019 -0700
 
-    Fix moreeeeeeeeeee
+    [hdmx] Touch up
 
- src/hb-icu.cc         | 28 +++++++++++++++-------------
- src/hb-subset-plan.cc |  2 +-
- 2 files changed, 16 insertions(+), 14 deletions(-)
+ src/hb-ot-hdmx-table.hh | 24 ++++++++++++++----------
+ 1 file changed, 14 insertions(+), 10 deletions(-)
 
-commit 68e12e68f813bfd22dda040463d042cc06b958ec
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 17:28:59 2019 -0700
+commit e8ef0e627c493af700e254bdd2767f8955f2d03f
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue May 7 17:23:02 2019 -0700
 
-    Fix more semi-colon issues
+    [subset] WIP convert hdmx subsetting to use iterators.
 
- src/hb-coretext.cc    | 4 ++--
- src/hb-directwrite.cc | 4 ++--
- src/hb-graphite2.cc   | 4 ++--
- src/hb-uniscribe.cc   | 4 ++--
- 4 files changed, 8 insertions(+), 8 deletions(-)
+ src/hb-ot-hdmx-table.hh     | 121 +++++++++++++++++++-------------------------
+ test/api/test-subset-hdmx.c |  23 ---------
+ 2 files changed, 51 insertions(+), 93 deletions(-)
 
-commit 4d3cf2adb669c345cc43832d11689271995e160a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 17:25:07 2019 -0700
+commit d5decf9bf77db914b67ffc446379df621516e362
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue May 7 15:47:38 2019 -0700
 
-    [iter] Fix zip iterator sortedness classification logic
+    [subset] Move hdmx to subset2.
 
- src/hb-iter.hh | 9 ++-------
- 1 file changed, 2 insertions(+), 7 deletions(-)
+ src/hb-ot-hdmx-table.hh | 36 ++++++------------------------------
+ src/hb-subset.cc        |  2 +-
+ 2 files changed, 7 insertions(+), 31 deletions(-)
 
-commit c572732f29787d1cf7ff39b8160b3935d4b13ba4
+commit 27b2093009745b6c30663605f45ac95deb1562cc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 15:41:09 2019 -0700
+Date:   Wed May 8 15:32:57 2019 -0700
 
-    Fix more excess semi-colon errors
+    [map] Return rvalues from keys()/values()
 
- src/hb-common.cc                 | 2 +-
- src/hb-ot-name.cc                | 4 ++--
- src/hb-ot-shape-complex-indic.hh | 2 +-
- src/hb-ot-shape-complex-khmer.hh | 2 +-
- 4 files changed, 5 insertions(+), 5 deletions(-)
+ src/hb-algs.hh | 7 +++++++
+ src/hb-map.hh  | 2 ++
+ 2 files changed, 9 insertions(+)
 
-commit 513762849a683914fc266a17ddf38f133cccf072
+commit 372c5b97bfa3b744de1d017cf662607eb8a2fa6e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 15:36:14 2019 -0700
+Date:   Wed May 8 15:28:39 2019 -0700
 
-    [iter] Track strictly-sorted iterators
+    [map] Fix bots
     
-    This make output of hb_enumerate() sorted regardless of input iterator.
+    Older compilers don't like calling iter() from return-type decltype()
+    
+    ../src/hb-map.hh:226:12: error: cannot call member function 'decltype ((((+ hb_array(((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::items, (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask ? (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask + 1) : 0))) | hb_filter((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: is_real))) | hb_map((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: get_pair)))) hb_hashmap_t<K, V, kINVALID, vINVALID>::iter() const [with K = const hb_serialize_context_t::object_t*; V = unsigned int; K kINVALID = 0u; V vINVALID = 0u; decltype ((((+ hb_array(((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::items, (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask ? (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask + 1) : 0))) | hb_filter((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: is_real))) | hb_map((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: get_pair)))) = hb_map_iter_t<hb_filter_iter_t<hb_array_t<hb_hashmap_t<const hb_serialize_context_t::object_t*, unsigned int, 0u, 0u>::item_t>, bool (hb_hashmap_t<const hb_serialize_context_t::object_t*, unsigned int, 0u, 0u>::item_t::*)() const, const<anonymous struct>&, 0u>, hb_pair_t<const hb_serialize_context_t::object_t*, unsigned int> (hb_hashmap_t<const hb_serialize_context_t::object_t*, unsigned int, 0u, 0u>::item_t::*)() const, 0u>]' without object
+         + iter()
+                ^
+    ../src/hb-meta.hh:58:41: note: in definition of macro 'HB_AUTO_RETURN'
+     #define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
+                                             ^
 
- src/hb-array.hh            |  2 +-
- src/hb-iter.hh             | 30 +++++++++++++++++++++---------
- src/hb-ot-layout-common.hh |  2 +-
- src/hb-set.hh              |  2 +-
- 4 files changed, 24 insertions(+), 12 deletions(-)
+ src/hb-map.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
 
-commit 7e02063f3202712b4e5fbddac0354adadb924f72
+commit a30482718491e3455365167e1c85981c8c0f542b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 15:26:00 2019 -0700
+Date:   Wed May 8 15:08:10 2019 -0700
 
-    [iter] Minor
+    [map] Add .values() iterator
 
- src/hb-iter.hh | 21 +++++++++++----------
- 1 file changed, 11 insertions(+), 10 deletions(-)
+ src/hb-map.hh    | 6 +++++-
+ src/test-iter.cc | 8 ++++++++
+ 2 files changed, 13 insertions(+), 1 deletion(-)
 
-commit a5fb44a8cbbaad194ddf6d02a6b6c98b0b637149
-Author: Garret Rieger <grieger@google.com>
-Date:   Mon May 13 14:57:40 2019 -0700
+commit 3c69505b3a7850b68a931849a2badb84b6b36d51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 8 15:05:10 2019 -0700
 
-    [subset] Fix shadowed 'groups' param in cmap.
+    [map] Fix iter
 
- src/hb-ot-cmap-table.hh | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
+ src/hb-map.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 73943bdf21a96f4e12cb9efd8458a2711de0d870
+commit 5ceaafa5de8dff51fe91f7008a12ec9c304a1376
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 14:48:31 2019 -0700
+Date:   Wed May 8 14:59:25 2019 -0700
 
-    Adjust uniscribe_bug_compatible mode
-    
-    More correct behavior.  We were commenting out some legit conditions
-    before.
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [algs] Fix identity return type
 
- src/hb-ot-shape-complex-indic.cc | 10 ++--------
- 1 file changed, 2 insertions(+), 8 deletions(-)
+ src/hb-algs.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 809c58708359bcc22bb1273069886f2cbf68be65
+commit f5705d7656817cbfdbc4479b1cb0be3af6f4abdf
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 14:45:51 2019 -0700
+Date:   Wed May 8 14:46:55 2019 -0700
 
-    [config] Better compile away morx/kerx/trak
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Whitespace
 
- src/hb-ot-shape.cc | 38 ++++++++++++++------------------------
- src/hb-ot-shape.hh | 12 +++++++++++-
- 2 files changed, 25 insertions(+), 25 deletions(-)
+ src/hb-map.hh    | 10 +++++-----
+ src/test-iter.cc | 11 +++++++----
+ 2 files changed, 12 insertions(+), 9 deletions(-)
 
-commit b1d3e54bd3c881794b05831e811b1a77a7d427c5
+commit a17f0fa3a10a25959561582ae63ef2e5208647e2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 14:35:04 2019 -0700
+Date:   Wed May 8 14:44:11 2019 -0700
 
-    [indic] Don't constrain how many C, M, ... occur
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1709
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [meta] Capture rvalue-references in is_reference / remove_reference
 
- src/hb-ot-shape-complex-indic-machine.hh | 1225 ++++++++----------------------
- src/hb-ot-shape-complex-indic-machine.rl |    8 +-
- 2 files changed, 305 insertions(+), 928 deletions(-)
+ src/hb-meta.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 148d88368013ba9bf70a7dd275b1a0f9c64fd45c
+commit 7166bd563447a64eda05c66668bd4a178292bd79
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 14:33:06 2019 -0700
+Date:   Wed May 8 14:24:57 2019 -0700
 
-    [test] Don't call deprecated API
+    Minor
 
- test/api/test-font.c  |  3 ---
- test/api/test-shape.c | 16 ++--------------
- 2 files changed, 2 insertions(+), 17 deletions(-)
+ src/hb-open-type.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit a487fc33248ea2f934ff4cb857cb556065c11841
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 14:16:33 2019 -0700
+commit b827181ba1f539c990e1bd8fdd3559f1589c8d28
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 13:51:11 2019 -0700
 
-    Another extra semi-colon
+    [map] tweak test-iter.cc
 
- src/hb-ot-layout-common.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-map.hh    | 1 -
+ src/test-iter.cc | 2 +-
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit 492af0f1bf1d7198b474fda2faca451908af267f
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 12:47:18 2019 -0700
+
+    [map] add keys()
+
+ src/hb-map.hh    | 9 ++++++++-
+ src/test-iter.cc | 4 ++++
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+commit ba60512813caafc2006b26214e95bbfe1c0e460a
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 12:09:10 2019 -0700
+
+    [map] add a test for iteration
+
+ src/hb-map.hh    | 2 +-
+ src/test-iter.cc | 4 ++++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
 
-commit 8461ade7832110d28001dc641342d3f9461e03b0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 14:10:48 2019 -0700
+commit 183b8094b577dcb7f40b7fcd64b60d405845897a
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 11:40:31 2019 -0700
 
-    Revert "[ragel] Regenerate ragel-generated files using ragel 7.0.0.11 May 2018"
-    
-    This reverts commit 9b05db33b54e6e5f0b4658f4c06e7fe563f8923b.
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1708
+    [map] add iteration
 
- src/hb-buffer-deserialize-json.hh          | 1051 ++++++-----
- src/hb-buffer-deserialize-text.hh          | 1009 ++++++-----
- src/hb-ot-shape-complex-indic-machine.hh   | 2678 ++++++++++++----------------
- src/hb-ot-shape-complex-khmer-machine.hh   |  709 ++++----
- src/hb-ot-shape-complex-myanmar-machine.hh |  820 ++++-----
- src/hb-ot-shape-complex-use-machine.hh     | 1144 ++++++------
- 6 files changed, 3452 insertions(+), 3959 deletions(-)
+ src/hb-map.hh | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
 
-commit 52c15b053aec06d351404a4c15609384946b26e1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 14:10:28 2019 -0700
+commit df237d2fe78086ad16bdbd2cc60639ae9ce909d6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed May 8 14:17:14 2019 -0700
 
-    Revert "[ragel] Switch to -T1 output instead of -F1"
-    
-    This reverts commit ae8719eb596485ebff07dd5016256015cd0cf86b.
+    [test] Add https://crbug.com/oss-fuzz/14641 testcase
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1708
+    As 503748d fix
 
- src/Makefile.am                            |    2 +-
- src/hb-buffer-deserialize-json.hh          |  381 ++-
- src/hb-buffer-deserialize-text.hh          |  308 +--
- src/hb-ot-shape-complex-indic-machine.hh   | 3527 +++++++---------------------
- src/hb-ot-shape-complex-khmer-machine.hh   |  396 +---
- src/hb-ot-shape-complex-myanmar-machine.hh |  742 ++----
- src/hb-ot-shape-complex-use-machine.hh     | 1011 ++------
- 7 files changed, 1658 insertions(+), 4709 deletions(-)
+ ...-testcase-minimized-hb-subset-fuzzer-5676773460672512 | Bin 0 -> 2172 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit e98f0ddd6373f64ef4b542daa36b5841399170af
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 13:53:06 2019 -0700
+commit 02ae2591d930563cec8c3c63086afb0a3a12c4aa
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed May 8 13:44:03 2019 -0700
 
-    Fix extra semi-colon
+    initialize return param subr_num in popSubrNum
+    
+    also snake_cased popSubrtNum and other surrounding function names
 
- src/hb-iter.hh | 2 +-
- src/hb.hh      | 1 +
- 2 files changed, 2 insertions(+), 1 deletion(-)
+ src/hb-cff-interp-cs-common.hh | 15 ++++++++-------
+ src/hb-subset-cff1.cc          |  4 ++--
+ src/hb-subset-cff2.cc          |  4 ++--
+ 3 files changed, 12 insertions(+), 11 deletions(-)
 
-commit ae8719eb596485ebff07dd5016256015cd0cf86b
+commit 503748d8a80dd5db450c8c4dc109f2b97049d989
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 13 12:27:10 2019 -0700
+Date:   Wed May 8 12:45:02 2019 -0700
 
-    [ragel] Switch to -T1 output instead of -F1
-    
-    Fedora upgraded to ragel 7, which is buggy if char is signed.
-    Switching to -G2 output fails with sign-compare error:
-    
-    ../../src/hb-buffer-deserialize-json.hh:107:12: error: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘const char’ [-Werror=sign-compare]
-        if ( 9u <= ( (*( p))) && ( (*( p))) <= 13u ) {
-             ~~~^~~~~~~~~~~~~
-    
-    Switching to -T1 for now.  It actually results in smaller code,
-    at the expense of some binary searching instead of flat tables.
-    In the not distant future, we might actually generate two different
-    outputs and choose between depending on size-optimize options.
+    [name] Sanitize records for reals
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1708
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14641
 
- src/Makefile.am                            |    2 +-
- src/hb-buffer-deserialize-json.hh          |  381 ++--
- src/hb-buffer-deserialize-text.hh          |  308 ++-
- src/hb-ot-shape-complex-indic-machine.hh   | 3401 +++++++++++++++++++++-------
- src/hb-ot-shape-complex-khmer-machine.hh   |  396 +++-
- src/hb-ot-shape-complex-myanmar-machine.hh |  742 ++++--
- src/hb-ot-shape-complex-use-machine.hh     | 1011 ++++++---
- 7 files changed, 4646 insertions(+), 1595 deletions(-)
+ src/hb-ot-name-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit df3f36f0bb7aeed0554843f24f6542852e40f6cc
+commit 5875d775e1253c0e14b900539c28c2de881da7aa
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 12 20:56:36 2019 -0700
+Date:   Wed May 8 12:25:34 2019 -0700
 
-    Minor
+    [iter] Rename hb_iter_t() to hb_iter_type<> and add hb_item_type<>
 
- src/gen-os2-unicode-ranges.py | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-iter.hh | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
 
-commit ccc88e98f34453100830d6408fdabfe90e6b47b8
+commit bad16066392e4dbdd8490a4b1c70d1dcddcc8ec8
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 12 16:12:06 2019 -0700
+Date:   Wed May 8 12:11:52 2019 -0700
 
-    Fix MSVC build
+    [map] Make .has() optionally return value
 
- src/hb-ot-shape-complex-indic.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-map.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
 
-commit f8f9cb93b7166b0d8c816610596da486443c7391
+commit 750d5af48e38627c3c84a2f3857a7ee602221e24
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 12 15:56:25 2019 -0700
+Date:   Wed May 8 12:01:55 2019 -0700
 
-    [config] Define HB_NO_SUBSET_LAYOUT in HB_LEAN
-    
-    Assumning subsetter would be used for printing-like uses in that case,
-    which don't need GSUB/GPOS.
+    Make compiler happy with -Og
 
- src/hb-config.hh | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ src/hb-cff-interp-cs-common.hh | 2 +-
+ src/hb-ot-cmap-table.hh        | 6 +++---
+ src/hb-ot-glyf-table.hh        | 2 +-
+ src/hb-subset-glyf.cc          | 4 ++--
+ 4 files changed, 7 insertions(+), 7 deletions(-)
 
-commit a1394a28fc4b3d15ef45481f3147f0685d343acb
+commit cdb61eb0431d426f7152f975e89ee3ba4431083f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 12 15:47:46 2019 -0700
+Date:   Wed May 8 11:00:18 2019 -0700
 
-    [config] Add HB_NO_UNISCRIBE_BUG_COMPATIBLE
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [iter] Accept pointer in hb_iter() and hb_iter_t()
 
- src/hb-config.hh                 |  4 ++++
- src/hb-ot-shape-complex-indic.cc | 24 ++++++++++++++++++------
- 2 files changed, 22 insertions(+), 6 deletions(-)
+ src/hb-iter.hh   | 4 ++--
+ src/test-iter.cc | 3 +++
+ 2 files changed, 5 insertions(+), 2 deletions(-)
 
-commit dba1ac1b0e8f5f96974fc1119b318ae6127daa82
+commit c93eeba9b21cb8f8ba64ebaf284bf9c8a8544886
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 12 15:33:31 2019 -0700
-
-    [config] Disable buffer serialize routines in HB_TINY
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
-
- src/hb-buffer-serialize.cc | 14 +++++++++++++-
- src/hb-config.hh           |  1 +
- 2 files changed, 14 insertions(+), 1 deletion(-)
+Date:   Wed May 8 10:56:09 2019 -0700
 
-commit 3d9be2ad5036aaf02b69095faaf9c18705c2c5bc
-Merge: a20db496 1a850abd
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sun May 12 20:03:29 2019 +0100
+    [iter] Accept pointer in hb_map()
 
-    Merge pull request #1665 from n8willis/docs-gtkdoc-colormath
-    
-    [Docs] Add gtk-doc comments for OT color and OT math
+ src/hb-iter.hh   | 4 ++--
+ src/test-iter.cc | 7 ++++++-
+ 2 files changed, 8 insertions(+), 3 deletions(-)
 
-commit a20db496f090abc5b937857b7c5f077161b6ffe4
+commit 4c9e0c37a34e8355d752af39507b310f473bffa5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 12 11:08:45 2019 -0700
+Date:   Wed May 8 10:40:39 2019 -0700
 
-    Fix builds
+    [serialize] LangSys subset->copy
 
- src/hb-subset-plan.cc | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-ot-layout-common.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
 
-commit 8694d6082901661e90e2ffcf732e9985a215063f
+commit 50dc3e7d9f4f290c7353313c5e5f888cb7c4846d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 12 11:05:24 2019 -0700
+Date:   Wed May 8 10:35:02 2019 -0700
 
-    [config] Enable HB_NO_MT in HB_TINY
-    
-    Now that user can override it if needed...
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Add hb_iota()
 
- src/hb-config.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-iter.hh   | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/test-iter.cc | 10 ++++++++++
+ 2 files changed, 61 insertions(+)
 
-commit 7f6fca4ef78cf3c9384bf835def14219b2ce8791
+commit aa4ac13f0be34bba66b00d04fd7806c474ff59c0
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 12 10:29:47 2019 -0700
+Date:   Wed May 8 10:02:30 2019 -0700
 
-    Force-disable CFF code under disabling conditions
-    
-    Subsetter size goes down from 190kb to 119kb.  Main library about 7kb.
+    [iter] Actually fix previous commit
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    The iter objects shouldn't not be const.  D'oh.
 
- src/hb-ot-cff1-table.cc | 4 ++++
- src/hb-ot-cff2-table.cc | 4 ++++
- src/hb-subset-cff1.cc   | 4 ++++
- src/hb-subset-cff2.cc   | 4 ++++
- 4 files changed, 16 insertions(+)
+ src/hb-iter.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
 
-commit 5249eee43748db32b40ad2602b3243d2491642b3
+commit a66598e0306fe80063c5d6a678bbca4a931bc4d4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 16:12:07 2019 -0700
+Date:   Wed May 8 09:56:29 2019 -0700
 
-    [config] Allow overriding chosen config
+    [iter] For ref-qualified variants
 
- src/hb-config.hh | 6 ++++++
- 1 file changed, 6 insertions(+)
+ src/hb-iter.hh | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
 
-commit 30c059a978c91fcd38d47f1ac4a03295f887a7da
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat May 11 18:48:41 2019 -0400
+commit fa576ce1874fd886688bf3f16b714d86aebb07ec
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 09:53:58 2019 -0700
 
-    [test] minor, fix -Weverything bot
+    Update README.md
 
test/fuzzing/main.cc | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
README.md | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit a29b1de55abca2e90733caff7423e5251d72e03c
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sat May 11 20:56:55 2019 +0100
+commit d109c9e767ff3198d51e23a7ac8931d0bc4d5d72
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 09:53:29 2019 -0700
 
-    Usermanual, fix up userfeatures example code in OpenType features section of shaping chapter.
+    Update README.md
 
docs/usermanual-opentype-features.xml | 15 +++++++++++----
- 1 file changed, 11 insertions(+), 4 deletions(-)
README.md | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 78fcb14db9041af0e0d5ea209cf0cb1977f6dcc3
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sat May 11 20:56:02 2019 +0100
+commit 4063181791d6b3efb35e7c748dee12273e64ebd4
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed May 8 09:47:34 2019 -0700
 
-    Usermanual, minor: flesh out invisible-glyph discussion in buffers chapter.
+    [docs] add fuzzer instructions (courtesy of Garret)
 
- ...ermanual-buffers-language-script-and-direction.xml | 19 +++++++++++++++----
- 1 file changed, 15 insertions(+), 4 deletions(-)
+ TESTING.md | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 00946ca3aa45f109c455871ce89c5872fd243624
+Author: Roderick Sheeter <rsheeter@rsheeter-macbookpro2.roam.corp.google.com>
+Date:   Wed May 8 09:42:35 2019 -0700
 
-commit 25531a30394c451a7a2aee77928e0a550015b803
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sat May 11 19:50:42 2019 +0000
+    [docs] add sample commands for test exec
 
-    [test] minor
-    
-    style fix and add return statement
+ README.md  |  4 ++++
+ TESTING.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 51 insertions(+)
 
- test/fuzzing/main.cc | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
+commit 8479eb5955c93cbc8951d0319b2fe43ff19cc403
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 8 09:48:55 2019 -0700
 
-commit 1a850abd66999707b6f4795050e748fc879b92ef
-Merge: 8a544171 a6048e4c
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sat May 11 20:16:57 2019 +0100
+    [iter] Fix hb_sink() to accept rvalue
 
-    Merge branch 'master' into docs-gtkdoc-colormath
+ src/hb-iter.hh   | 2 +-
+ src/test-iter.cc | 4 ++++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
 
-commit 8a544171d15bb36c15ca7bf679643b2b14f94b45
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sat May 11 20:11:49 2019 +0100
+commit 710d459acac88fd784d4ead0ba75b9aa623c48d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 8 09:33:09 2019 -0700
 
-    Corrections to OT Color gtk-doc comments.
+    [iter] Default predicates to hb_identity instead of hb_bool
+    
+    The bool conversion happens after predicate is called automatically.
 
- src/hb-ot-color.cc | 14 +++++++-------
- 1 file changed, 7 insertions(+), 7 deletions(-)
+ src/hb-iter.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
 
-commit 301f5091f6663cc8a1fff848bf5285aa15cc0598
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sat May 11 20:11:36 2019 +0100
+commit fe14a4000a58528878bcc75fde0972de2b779316
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 8 09:32:19 2019 -0700
 
-    Corrections to OT Math gtk-doc comments.
+    Adjust hb_all/any/none
 
- src/hb-ot-math.cc | 33 +++++++++++++++++++++++----------
- 1 file changed, 23 insertions(+), 10 deletions(-)
+ src/hb-iter.hh   | 18 +++++++++---------
+ src/test-iter.cc | 10 ++++++----
+ 2 files changed, 15 insertions(+), 13 deletions(-)
 
-commit a6048e4cd013987ecb846e0683a7cf6f0caa65f9
+commit 4a101d8ffccd6f907f16ef190125ded5e27e0d8b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 12:11:22 2019 -0700
+Date:   Wed May 8 09:16:33 2019 -0700
 
-    Fix build
+    Add hb_match
 
- src/hb-ot-font.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh | 30 +++++++++++++++++++++++++++++-
+ 1 file changed, 29 insertions(+), 1 deletion(-)
 
-commit 32d3c06b61f2f4252f4403b55c6ba07fbb572149
+commit 26adefd9eaf4bc1d80b1ffececf0d86f3308f9ee
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 11:59:18 2019 -0700
+Date:   Wed May 8 09:14:44 2019 -0700
 
-    Disable sbix if no-color or no-ot-font-bitmap
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [algs] Try f[v] in hb_get() as last resort
 
- src/hb-ot-font.cc | 21 +++++++++++----------
- 1 file changed, 11 insertions(+), 10 deletions(-)
+ src/hb-algs.hh | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
 
-commit 606841b07017ac80dea2fc5ada25b5976f2f9192
+commit 0601a19d38b2b0fc5dd36fd821af634a49322ebf
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 11:54:30 2019 -0700
+Date:   Wed May 8 07:47:36 2019 -0700
 
-    [iter] Check for more before forwarding/rewinding past ends
+    Fix a few more double-pomotion errors
 
- src/hb-iter.hh   | 4 ++--
- src/test-iter.cc | 6 ++----
- 2 files changed, 4 insertions(+), 6 deletions(-)
+ src/hb-coretext.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit c1c122e7b3f60dc7b5a224c68d2acb106fda8b49
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Sat May 11 11:38:06 2019 -0400
+commit 2ba984fcbbef4561d35c3a2c502610c38b26f4fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 7 23:28:22 2019 -0700
 
-    [iter] Fix filter rewinding
+    Fix signed comparison on 32bit
 
- src/hb-iter.hh | 2 +-
+ src/hb-sanitize.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit b854d4ff46602104343201361919f30169144cf1
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Fri May 10 22:51:49 2019 -0400
+commit dfc57802450360f06026668b7b61495aaa2d1943
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 7 23:26:09 2019 -0700
 
-    [array] Fix rewinding
+    Fix more double-promotion errors
+    
+    WHy do only some of the clang bots catch this I have no idea :(.
 
- src/hb-array.hh | 22 +++++++++++++---------
- 1 file changed, 13 insertions(+), 9 deletions(-)
+ src/hb-aat-layout-trak-table.hh |  4 ++--
+ src/hb-font.hh                  |  2 +-
+ src/hb-open-type.hh             |  4 ++--
+ src/hb-ot-color-cbdt-table.hh   | 12 ++++++------
+ src/hb-ot-color-sbix-table.hh   | 10 +++++-----
+ src/hb-ot-layout-gpos-table.hh  | 20 ++++++++++----------
+ 6 files changed, 26 insertions(+), 26 deletions(-)
 
-commit 76e80c5ca5e820e955438e4c727929ddd99e695e
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sat May 11 19:51:24 2019 +0100
+commit c2c9d204fa5c2189e369726276a1c0e92e09a9ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 7 23:13:38 2019 -0700
 
-    Update src/hb-ot-color.cc
+    Fix double-promotion warnings
     
-    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+    Make it an error.
 
- src/hb-ot-color.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-var-fvar-table.hh | 12 ++++++------
+ src/hb.hh                   |  1 +
+ 2 files changed, 7 insertions(+), 6 deletions(-)
 
-commit 79126df3070f00193fe3caefe9deb62c4520e048
+commit 2c7093ed01f417828d5521d983eae63042363197
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 11:23:31 2019 -0700
+Date:   Tue May 7 23:10:59 2019 -0700
 
-    [iter] Add hb_map_sorted() and hb_map_retains_sorting()
+    More tests
 
- src/hb-iter.hh | 38 +++++++++++++++++++++++++++++++-------
- 1 file changed, 31 insertions(+), 7 deletions(-)
+ src/test-algs.cc | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit bcd81932f0bcb2258276ae313709780e90e9b0f6
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sat May 11 14:10:32 2019 +0100
+commit 56d2d0294b836ea1e2dea9e242ae72c99387d00a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 7 23:08:49 2019 -0700
 
-    Update src/hb-ot-math.cc
+    [algs] Sprinkle hb_min/max with hb-forward salad
     
-    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+    Let's see if fixes MSVC fail.  Though, the error doesn't make sense to me.
+    
+      hb-blob.cc
+    c:\projects\harfbuzz\src\hb-algs.hh(166): error C2440: 'return': cannot convert from 'unsigned int' to 'unsigned int &&' [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+      c:\projects\harfbuzz\src\hb-algs.hh(166): note: You cannot bind an lvalue to an rvalue reference
+      c:\projects\harfbuzz\src\hb-algs.hh(174): note: see reference to function template instantiation 'T &&<unnamed-type-hb_min>::impl<T,unsigned int&>(T &&,T2) const' being compiled
+              with
+              [
+                  T=unsigned int,
+                  T2=unsigned int &
+              ]
 
- src/hb-ot-math.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
 
-commit ddc6dd42f753a20204898e41cc711b0100638330
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sat May 11 14:10:11 2019 +0100
+commit bdbfdc92b58d5c9f8654e430075dab543d1ba394
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 7 22:52:43 2019 -0700
 
-    Update src/hb-ot-math.cc
+    [iter] Add value and projection to hb_all/any/none
     
-    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+    Allows for eg, checking all values equal 2: hb_all (it, 2).
 
- src/hb-ot-math.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-iter.hh   | 24 ++++++++++++++++++------
+ src/test-iter.cc | 10 +++++++++-
+ 2 files changed, 27 insertions(+), 7 deletions(-)
 
-commit 46e05ecca16e561a0ff4ca60bb064f480374590a
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sat May 11 14:09:52 2019 +0100
+commit cf61acb9eaa2bb3fe479a9050116b4b96934e3ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 7 22:45:01 2019 -0700
 
-    Update src/hb-ot-color.cc
-    
-    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+    [iter] Accept rvalues to hb_enumerate()
 
- src/hb-ot-color.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-iter.hh   | 2 +-
+ src/test-iter.cc | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
 
-commit 6d9870b4799f20a6c58a2c071713e56aa93b0221
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sat May 11 14:09:26 2019 +0100
+commit e8bd5fc3fa2cc5c5f8f254629553902aed3496ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 7 22:29:40 2019 -0700
 
-    Update src/hb-ot-color.cc
-    
-    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+    [meta] Move hb_invoke from algs to meta
 
- src/hb-ot-color.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh | 31 -------------------------------
+ src/hb-meta.hh | 32 ++++++++++++++++++++++++++++++++
+ 2 files changed, 32 insertions(+), 31 deletions(-)
 
-commit 12ea4a24c40c7ac28d058e9721479347951e3482
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sat May 11 14:08:40 2019 +0100
+commit af571dbffc12e6bb7a3146762d12bb4ac3f19bdc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 7 21:39:20 2019 -0700
 
-    Update src/hb-ot-color.cc
+    [meta] Replace most hb_enable_if with hb_requires
     
-    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+    They do absolutely same thing.  hb_requires is to encode constraints,
+    whereas hb_enable_if is for more conditional enabling.
 
- src/hb-ot-color.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-iter.hh             | 63 +++++++++++++++++++++-------------------------
+ src/hb-open-type.hh        |  6 ++---
+ src/hb-ot-layout-common.hh |  6 ++---
+ src/test-iter.cc           |  6 ++---
+ 4 files changed, 37 insertions(+), 44 deletions(-)
 
-commit 3535f2d31efe1ebe44ba63f980882ba23cdcde3b
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sat May 11 14:07:38 2019 +0100
+commit 6fa1f38070e710b2f80a836bd633b6ab33e1bc80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 7 21:33:26 2019 -0700
 
-    Update src/hb-ot-color.cc
-    
-    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+    [algs] Accept varargs in hb_min/max
 
- src/hb-ot-color.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh   | 24 +++++++++++++++++++++---
+ src/test-algs.cc |  8 ++++++++
+ 2 files changed, 29 insertions(+), 3 deletions(-)
 
-commit 12d2c472fe8ec3268a4b39a57603dcc734ab7b88
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Sat May 11 14:06:56 2019 +0100
+commit 1ad07080c3ea7f6a1b3cb247529ec0c78575a6d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 7 21:00:23 2019 -0700
 
-    Update src/hb-ot-color.cc
-    
-    Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org>
+    Rename
 
- src/hb-ot-color.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
 
-commit 7f45ce42dbf11366e904f48db45cf5405e4e94df
+commit 83e3eabd84e2b53c696768d1357a6a259bcd3576
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 01:28:31 2019 -0700
+Date:   Tue May 7 20:58:43 2019 -0700
 
-    [config] Rename
+    Whitespace
 
- src/hb-config.hh    | 2 +-
- src/hb-ot-layout.cc | 4 ++--
- 2 files changed, 3 insertions(+), 3 deletions(-)
+ src/hb-aat-layout-common.hh     |  2 +-
+ src/hb-aat-layout-kerx-table.hh |  2 +-
+ src/hb-aat-layout-morx-table.hh |  2 +-
+ src/hb-algs.hh                  |  6 +++---
+ src/hb-dispatch.hh              |  2 +-
+ src/hb-open-type.hh             | 18 +++++++++---------
+ src/hb-ot-kern-table.hh         |  4 ++--
+ src/hb-ot-layout-common.hh      |  2 +-
+ src/hb-ot-layout-gpos-table.hh  | 16 ++++++++--------
+ src/hb-ot-layout-gsub-table.hh  | 14 +++++++-------
+ src/hb-ot-layout-gsubgpos.hh    |  8 ++++----
+ src/hb-sanitize.hh              |  6 +++---
+ src/hb-serialize.hh             | 12 ++++++------
+ src/hb-subset.hh                |  6 +++---
+ 14 files changed, 50 insertions(+), 50 deletions(-)
 
-commit 0e78d4ddaec5f29d6652cc4185cbcca98c3a2927
+commit 2b9402a86a4e37e6386f8028bdf3789ae262a4c4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 01:27:50 2019 -0700
+Date:   Tue May 7 20:55:33 2019 -0700
 
-    [config] Add HB_NO_NAME
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Use universal references in hb_min/max
 
- src/hb-config.hh  |  6 +++++-
- src/hb-ot-name.cc | 20 ++++++++++++++++++++
- 2 files changed, 25 insertions(+), 1 deletion(-)
+ src/hb-algs.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 1fc077211771c752768f63f178116d2b8f2f7d03
+commit 41248cce0e32653227a83eb4e42ccf793f040fc2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 01:24:23 2019 -0700
+Date:   Tue May 7 20:54:31 2019 -0700
 
-    [config] HB_NO_OT_NAME_LANGUAGE AAT
+    Remove MIN/MAX in favor of hb_min/hb_max
 
- src/hb-config.hh                  | 4 ++--
- src/hb-ot-name-language-static.hh | 3 +++
- src/hb-ot-name-table.hh           | 4 +++-
- 3 files changed, 8 insertions(+), 3 deletions(-)
+ src/hb-aat-layout-common.hh      |  8 ++++----
+ src/hb-aat-layout-feat-table.hh  |  2 +-
+ src/hb-aat-layout-kerx-table.hh  |  2 +-
+ src/hb-aat-layout-morx-table.hh  | 18 +++++++++---------
+ src/hb-algs.hh                   | 14 +++++---------
+ src/hb-array.hh                  |  4 ++--
+ src/hb-blob.cc                   |  2 +-
+ src/hb-buffer-serialize.cc       | 32 ++++++++++++++++----------------
+ src/hb-buffer.cc                 |  4 ++--
+ src/hb-buffer.hh                 |  2 +-
+ src/hb-common.cc                 | 20 ++++++++++----------
+ src/hb-coretext.cc               |  6 +++---
+ src/hb-debug.hh                  |  2 +-
+ src/hb-directwrite.cc            |  2 +-
+ src/hb-ft.cc                     |  2 +-
+ src/hb-iter.hh                   |  2 +-
+ src/hb-open-file.hh              |  2 +-
+ src/hb-open-type.hh              |  2 +-
+ src/hb-ot-cmap-table.hh          |  8 ++++----
+ src/hb-ot-color-cbdt-table.hh    |  6 +++---
+ src/hb-ot-color-cpal-table.hh    |  2 +-
+ src/hb-ot-color-sbix-table.hh    |  2 +-
+ src/hb-ot-glyf-table.hh          | 14 +++++++-------
+ src/hb-ot-hmtx-table.hh          |  2 +-
+ src/hb-ot-layout-gpos-table.hh   |  2 +-
+ src/hb-ot-layout-gsub-table.hh   |  4 ++--
+ src/hb-ot-layout-gsubgpos.hh     |  6 +++---
+ src/hb-ot-layout.cc              |  2 +-
+ src/hb-ot-map.cc                 |  8 ++++----
+ src/hb-ot-post-table.hh          |  2 +-
+ src/hb-ot-shape-complex-indic.cc |  8 ++++----
+ src/hb-ot-shape-complex-use.cc   |  2 +-
+ src/hb-ot-shape.cc               |  4 ++--
+ src/hb-ot-tag.cc                 |  2 +-
+ src/hb-ot-var-avar-table.hh      |  2 +-
+ src/hb-ot-var-fvar-table.hh      | 18 +++++++++---------
+ src/hb-sanitize.hh               |  4 ++--
+ src/hb-uniscribe.cc              |  2 +-
+ 38 files changed, 111 insertions(+), 115 deletions(-)
 
-commit 4381bb2de7a554a148302836b86a5d73264abeae
+commit 5c0f62adc969696b46c1ceb57cd3c2fa408eb94f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 01:14:04 2019 -0700
+Date:   Tue May 7 17:23:46 2019 -0700
 
-    [config] Comment
+    [serializer] Accept pointer & reference in more methods
 
- src/hb-config.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-serialize.hh | 39 ++++++++++++++++++++++++---------------
+ 1 file changed, 24 insertions(+), 15 deletions(-)
 
-commit 9c921e6c32ab5ac4c524f554b7a7841eeeb0908f
+commit 839618de3b3da285e8753b6ca6d767e9a483bfde
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 01:08:51 2019 -0700
+Date:   Tue May 7 17:21:27 2019 -0700
 
-    [config] Enable HB_NO_NAME_TABLE_AAT
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [serializer] Minor
 
- src/hb-config.hh | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 81b79dfc397599182f43d63bf9346eee28e2d220
+commit 035b818e34bbd2d5c1f65328c9847c845d74d919
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 00:53:52 2019 -0700
+Date:   Tue May 7 17:21:18 2019 -0700
 
-    [config] Add HB_NO_COLOR to HB_LEAN
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [meta] Fix addressof()
 
- src/hb-config.hh   |  1 +
- src/hb-ot-color.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++----
- src/hb-ot-color.h  |  2 +-
- src/hb-ot-layout.h |  2 +-
- 4 files changed, 48 insertions(+), 6 deletions(-)
+ src/hb-meta.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit b63a8e173cbc5a81f2ca4a0a82f20b9dafaedb30
+commit 7654ebe3a51c98b4d3bf6fb11779024f1c770962
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 00:47:20 2019 -0700
+Date:   Tue May 7 16:53:03 2019 -0700
 
-    [config Add HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS to LEAN
-    
-    Already I don't like the inflexibility of this approach :(.
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Whitespace
 
- src/hb-config.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-algs.hh | 30 ++++++++++++++++++++----------
+ src/hb-iter.hh | 39 ++++++++++++++++++++++++++-------------
+ src/hb-meta.hh | 11 ++++++-----
+ 3 files changed, 52 insertions(+), 28 deletions(-)
 
-commit 42a21284778f3203d96133f74b0f846cd1567958
+commit 95426ea983bde01fadf4681926cb77e3b3c0d40a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 00:44:22 2019 -0700
+Date:   Tue May 7 15:56:51 2019 -0700
 
-    [config] Disbale getenv() and atexit() if HB_LEAN
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Add comment
 
- src/hb-config.hh | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-open-type.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit fca27860417812d51e40f040de97c10177b1250e
+commit e33ad252222481a6078a8bb423505e713b081313
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 00:37:01 2019 -0700
+Date:   Tue May 7 15:46:24 2019 -0700
 
-    [config] Make HB_DISABLE_DEPRECATED actually compile
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [serialize] FeatureVariations subset->copy
 
- src/hb-config.hh            |  7 +++++++
- src/hb-font.cc              |  8 ++++++++
- src/hb-font.hh              | 12 ++++++++++--
- src/hb-graphite2.cc         |  2 ++
- src/hb-icu.cc               |  2 +-
- src/hb-ot-layout.cc         |  7 ++++++-
- src/hb-ot-shape-fallback.cc |  4 ++++
- src/hb-ot-tag.cc            |  4 ++++
- src/hb-ot-var-fvar-table.hh |  6 ++++++
- src/hb-ot-var.cc            |  2 ++
- src/hb-set.cc               |  2 ++
- src/hb-unicode.cc           |  6 ++++++
- src/hb-unicode.hh           | 10 +++++++---
- 13 files changed, 65 insertions(+), 7 deletions(-)
+ src/hb-ot-layout-common.hh   | 6 +++---
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
 
-commit 5a48611ccd045de5782ad2fd5f6718357fe232a2
+commit fa8c4ba81175f671c3f39f1586d0a1d9067d9f89
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 00:19:03 2019 -0700
+Date:   Tue May 7 14:26:03 2019 -0700
 
-    [config] Add HB_NO_OT_LAYOUT_UNUSED
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Minor
 
- src/hb-config.hh    |  1 +
- src/hb-ot-layout.cc | 12 ++++++++++++
- 2 files changed, 13 insertions(+)
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 771f1b21d1d7128440d6b4488705456d43dbc0e7
+commit c09d6c58e99dba50f29a569e4c53916b5b507ef1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 00:16:18 2019 -0700
+Date:   Tue May 7 14:09:00 2019 -0700
 
-    [config] Adjust
+    [iter] Require lvalue in operators that return reference
 
- src/hb-config.hh | 12 +++++++-----
- 1 file changed, 7 insertions(+), 5 deletions(-)
+ src/hb-iter.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
 
-commit 484f6e8215038006a945da67d245f14db3eeeb2e
+commit 52f6c04c1e0eab2aaa0c7d817b212c01ba993fe9
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 00:13:35 2019 -0700
+Date:   Tue May 7 13:45:48 2019 -0700
 
-    [config] Add HB_LEAN
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Minor
 
- src/hb-config.hh  |  5 +++++
- src/hb-ot-math.cc | 40 ++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 45 insertions(+)
+ src/hb-serialize.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 0bfd14c0ed2f95f00d0b94d396c777399afa4d68
+commit 7c037bd2be2e794dfd882b806f684ad74c56dbb8
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 00:06:57 2019 -0700
+Date:   Tue May 7 13:37:43 2019 -0700
 
-    [config] Fix tests
+    [name] Clean up some more
 
- src/hb-config.hh | 3 +++
- 1 file changed, 3 insertions(+)
+ src/hb-meta.hh          |  2 ++
+ src/hb-ot-name-table.hh | 30 ++++++++++++++----------------
+ 2 files changed, 16 insertions(+), 16 deletions(-)
 
-commit 784df8eba1aaf20d2db464f8b3ea0984f7ea1308
+commit f982b9d9f8d6b61efd2a3e89cc3d34923c1914b0
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat May 11 00:04:59 2019 -0700
+Date:   Tue May 7 13:29:01 2019 -0700
 
-    [config] Flesh out more
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [name] Clean up serialize() API
 
- src/hb-config.hh | 17 +++++++++++++++++
- 1 file changed, 17 insertions(+)
+ src/hb-ot-name-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
 
-commit 799c6a5081e5058260199eeeb2091ee2c1dfefff
+commit 59ee61fddc76cd18f19f351bca7dd293eb610333
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 23:55:22 2019 -0700
+Date:   Tue May 7 13:26:15 2019 -0700
 
-    [config] Add some
+    [name] Use iterators more
 
- src/hb-aat-layout.cc    | 26 +++++++++++++-------------
- src/hb-aat-map.cc       |  4 ++--
- src/hb-config.hh        | 18 ++++++++++++++++++
- src/hb-ot-kern-table.hh | 14 +++++++-------
- src/hb-ot-shape.cc      | 22 +++++++++++-----------
- 5 files changed, 51 insertions(+), 33 deletions(-)
+ src/hb-ot-name-table.hh | 46 +++++++++++++++-------------------------------
+ src/hb-subset-plan.cc   |  3 +++
+ 2 files changed, 18 insertions(+), 31 deletions(-)
 
-commit e6582de12f1af9ab5e3122d762a3e12438a66b6b
+commit 2eb7e0e0e923d096d2598133cacd6e5ee04a6a04
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 23:53:38 2019 -0700
+Date:   Tue May 7 12:45:38 2019 -0700
 
-    Add hb-config.hh
+    [serialize] Minor
 
- src/Makefile.sources |  1 +
- src/hb-config.hh     | 36 ++++++++++++++++++++++++++++++++++++
- src/hb.hh            |  7 ++++---
- 3 files changed, 41 insertions(+), 3 deletions(-)
+ src/hb-serialize.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
 
-commit d43af339e7a7f5dab1690703a78d2690baefbd59
+commit 1c81cff2d3f9df2c18ffbdfff02ed418560480c1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 23:46:22 2019 -0700
+Date:   Tue May 7 11:51:10 2019 -0700
 
-    [subset] More HB_NO_SUBSET_LAYOUT
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Fix signed-comparison error on 32bit
 
- src/hb-subset-plan.cc | 13 ++++++++-----
- 1 file changed, 8 insertions(+), 5 deletions(-)
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 31c591d69f6a7605088883db59149e83c80d019c
+commit 938de315756e08bd2b5fa816c7951640e5835b2e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 23:39:53 2019 -0700
+Date:   Tue May 7 11:47:02 2019 -0700
 
-    [cff] Prune more code if HB_NO_OT_FONT_CFF
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Comment
 
- src/hb-ot-cff1-table.cc | 5 +++++
- src/hb-ot-cff2-table.cc | 5 +++++
- 2 files changed, 10 insertions(+)
+ src/hb-subset-glyf.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 5ea8ad5c48f9baabc4ccf81dce4aee1067c401f6
+commit 159fe962e90dd3b758ad10046b9d75cf87c1d4f3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 23:36:42 2019 -0700
+Date:   Tue May 7 11:46:11 2019 -0700
 
-    [subset] Add HB_NO_SUBSET_CFF
-    
-    Doesn't fully prune all the relevant code.  To be fixed later.
+    [doc] Make header search more resilient
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    How stupid to scan all files... Sigh.
 
- src/hb-subset.cc | 3 +++
- 1 file changed, 3 insertions(+)
+ docs/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 2c93f0dee31b2277567ccbee041539732b9bd26d
+commit 9b05db33b54e6e5f0b4658f4c06e7fe563f8923b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 23:31:05 2019 -0700
+Date:   Tue May 7 11:39:44 2019 -0700
 
-    Add HB_NO_AAT
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [ragel] Regenerate ragel-generated files using ragel 7.0.0.11 May 2018
 
- src/hb-aat-layout.cc    | 58 +++++++++++++++++++++++++++++++++++++++++++++++++
- src/hb-aat-map.cc       |  8 +++++++
- src/hb-ot-kern-table.hh | 14 ++++++++++++
- src/hb-ot-shape.cc      | 28 +++++++++++++++++++++++-
- 4 files changed, 107 insertions(+), 1 deletion(-)
+ src/hb-buffer-deserialize-json.hh          | 1051 +++++------
+ src/hb-buffer-deserialize-text.hh          | 1009 +++++------
+ src/hb-ot-shape-complex-indic-machine.hh   | 2678 ++++++++++++++++------------
+ src/hb-ot-shape-complex-khmer-machine.hh   |  709 ++++----
+ src/hb-ot-shape-complex-myanmar-machine.hh |  820 +++++----
+ src/hb-ot-shape-complex-use-machine.hh     | 1144 ++++++------
+ 6 files changed, 3959 insertions(+), 3452 deletions(-)
 
-commit 62dfe7aea23c95f4550543085071990e20ee4d54
+commit 521262b236dacf7b2b64e0a1d3c79d6a10b07063
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 23:17:15 2019 -0700
+Date:   Tue May 7 11:08:08 2019 -0700
 
-    [cff] Minor
+    [subset] Add TODO
 
- src/hb-subset-cff1.cc | 2 +-
- src/hb-subset-cff2.cc | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
+ src/hb-subset.cc | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 227d85e138d4c785c2d658e225ed35f5acd1235f
+commit e6a622b5b202533d64f83e71d7ff8a8104d46e26
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 23:15:58 2019 -0700
+Date:   Tue May 7 11:06:43 2019 -0700
 
-    Minor
+    [serialize] Enable bias assertion
 
- src/hb-atomic.hh                             |  2 +-
- src/hb-debug.hh                              |  2 +-
- src/hb-font.cc                               |  2 +-
- src/hb-ot-font.cc                            |  4 ++--
- src/hb-ot-layout.cc                          |  6 +++---
- src/hb-ot-name-table.hh                      |  2 +-
- src/hb-ot-shape-complex-arabic.cc            |  2 +-
- src/hb-ot-shape-complex-hebrew.cc            |  2 +-
- src/hb-ot-shape-complex-thai.cc              |  2 +-
- src/hb-ot-shape-complex-vowel-constraints.cc |  2 +-
- src/hb-ot-shape-fallback.cc                  |  6 +++---
- src/hb-subset.cc                             |  4 ++--
- src/hb-warning.cc                            |  4 ++--
- src/hb.hh                                    | 10 +++++-----
- 14 files changed, 25 insertions(+), 25 deletions(-)
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 9bfe22af6113ee8cd24cb9ee091f0841c27bbf98
+commit 530ddbbc320bd24b4902ee6d49bf80242a591794
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 22:44:19 2019 -0700
+Date:   Tue May 7 11:05:51 2019 -0700
 
-    [sanitize] Fix previous commit
+    [serialize] Use range-based loop
 
- src/hb-open-type.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/hb-serialize.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
 
-commit 4dcf65328f04a11594fc190fd7e976afa54455e9
+commit 0987c4204fae66f80224c6f01d9c5dc3abe809e0
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 22:23:24 2019 -0700
+Date:   Tue May 7 11:01:02 2019 -0700
 
-    [sanitize] Simplify
+    [name] Remove dead code
 
- src/hb-open-type.hh | 45 ++++++++++-----------------------------------
- 1 file changed, 10 insertions(+), 35 deletions(-)
+ src/hb-ot-name-table.hh | 88 +------------------------------------------------
+ 1 file changed, 1 insertion(+), 87 deletions(-)
 
-commit 23168c3981f7c80883663fa69c608caee98d3d99
+commit 5ac4ab686809be9352e91bc3213e1edf3ba66a93
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 22:11:51 2019 -0700
+Date:   Thu May 2 16:29:07 2019 -0700
 
-    [sanitize] Use hb_is_trivially_copyable()
+    [subset] fix for name table serializing with new serializer machinery
 
- src/hb-open-type.hh | 64 +++++++----------------------------------------------
- 1 file changed, 8 insertions(+), 56 deletions(-)
+ src/hb-ot-name-table.hh            |   8 ++++++--
+ test/api/fonts/nameID.expected.ttf | Bin 170696 -> 2388 bytes
+ 2 files changed, 6 insertions(+), 2 deletions(-)
 
-commit 0ff7954f9f09f80654ac91c16712154744a0dd2d
+commit c548fcedc404c03442c042059a71194d97d23bb6
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 22:04:40 2019 -0700
+Date:   Thu May 2 16:29:07 2019 -0700
 
-    [meta] Add hb_is_trivial
+    [WIP] [name] Port to fancy serializer machinery
 
- src/hb-meta.hh   | 7 +++++++
- src/test-meta.cc | 4 ++++
- 2 files changed, 11 insertions(+)
+ src/hb-ot-name-table.hh | 18 +++++++++++-------
+ 1 file changed, 11 insertions(+), 7 deletions(-)
 
-commit 7162a97bca6e0dde3d277701a3bf15688deef61d
+commit fa2d97161f8b7de3d7a70e06d41b6f7e154012ad
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 22:03:03 2019 -0700
+Date:   Tue May 7 00:34:50 2019 -0700
 
-    [meta] Add hb_is_trivially_copyable()
+    Remove use of deprecated implicit copy/move assignment operators
+    
+    By removing custom copy constructor.
 
- src/hb-meta.hh   | 11 +++++++++++
- src/test-meta.cc |  4 ++++
- 2 files changed, 15 insertions(+)
+ src/hb-meta.hh | 2 --
+ 1 file changed, 2 deletions(-)
 
-commit f2398f34c019a55d4f0e1a7031961714afadf2b3
+commit 45f5e56236912359d0ac72310dcdba9259cfee66
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 21:59:57 2019 -0700
+Date:   Tue May 7 00:33:32 2019 -0700
 
-    [meta] Add is_trivially_destructible
+    Warn on -Wdeprecated
 
- src/hb-meta.hh   | 6 +++---
- src/test-meta.cc | 7 +++++--
- 2 files changed, 8 insertions(+), 5 deletions(-)
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 72cb5b8e52b7103c18adcb82cbcd4b91a2c85474
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 21:50:15 2019 -0700
+commit c3e0eafc80481f8c16516fdae1841c563e7253d4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue May 7 12:04:00 2019 +0430
 
-    Remove accidentally included include
+    [ci] Upgrade Ubuntu 17.10 bots to 19.04
 
src/test-meta.cc | 3 ---
- 1 file changed, 3 deletions(-)
.circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 086772e409759e8f1edd0e34f6f25374e51e9e10
+commit 8903040fcd09e7d7ad5112ac2a583718bb85795d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 21:49:25 2019 -0700
+Date:   Tue May 7 00:13:11 2019 -0700
 
-    [meta] Add is_destructible
+    Actually make it work
 
- src/hb-meta.hh | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
+ src/hb-iter.hh | 2 ++
+ src/hb-meta.hh | 6 ++++--
+ 2 files changed, 6 insertions(+), 2 deletions(-)
 
-commit b14745278ad16fe7f4e838b685029e3fdda516ca
+commit 025eaa3c81214cdb20f2f588bab665512d21507c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 21:42:59 2019 -0700
+Date:   Tue May 7 00:05:37 2019 -0700
 
-    [met]a Add is_constructible, ...
+    [iter] Make filter/map copyable
 
- src/hb-meta.hh   | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- src/test-meta.cc | 23 ++++++++++++++++++
- 2 files changed, 96 insertions(+)
+ src/hb-iter.hh   | 18 +++++++++---------
+ src/test-iter.cc |  4 ++--
+ 2 files changed, 11 insertions(+), 11 deletions(-)
 
-commit 19e08a146712dacd11359370c91a7bad55bc6f62
+commit 03a68165d8296ed5cc0eb2434500381419409e79
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 21:25:07 2019 -0700
+Date:   Tue May 7 00:03:35 2019 -0700
 
-    [iter] Adjust source_of/sink_of
+    [meta] Add hb_reference_wrapper<>
+    
+    Functionality kinda superset of std:: counterpart.
 
- src/hb-iter.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-meta.hh | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
 
-commit c0485e32a320e17dd0634b2cc8b4dd8c4fdc65e0
+commit 0bf86d9c5dcb0de206b38c3cf1824d2254376f37
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 21:03:14 2019 -0700
+Date:   Mon May 6 23:39:26 2019 -0700
 
-    Use hb_void_t<> the way it's supposed to be used
+    Whitespace
 
- src/hb-null.hh | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
+ src/hb-meta.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 40fb36a39de5dd3ee9a4c84f1f76205b6bb68660
+commit 72eb91deb9eb7a08e38e100a3234518651fe4cb8
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 21:01:19 2019 -0700
+Date:   Mon May 6 23:39:13 2019 -0700
 
-    [meta] Minor
+    Add hb_ref()
+    
+    Unused.
 
- src/hb-meta.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-meta.hh | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
 
-commit f9a96a0a97f59a0b31ee0f901d1c21dde6b3cfaf
+commit 240f57e58d3b0161feb90621d5db9e2fc4d99b27
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:56:16 2019 -0700
+Date:   Mon May 6 23:17:39 2019 -0700
 
-    [meta] More rewrites
+    Rename hb_deref_pointer() to hb_deref()
 
- src/hb-meta.hh | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
+ src/hb-algs.hh      | 12 ++++++------
+ src/hb-map.hh       |  2 +-
+ src/hb-meta.hh      |  2 +-
+ src/hb-serialize.hh |  2 +-
+ 4 files changed, 9 insertions(+), 9 deletions(-)
 
-commit 5252677e53ff4473701172bbbd4e953ac6b08e6f
+commit 0b1ca5a13b6921cb4d00f8651bb99fc7c7037ec2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:49:52 2019 -0700
-
-    [meta] Rewrite hb_int_min/max
+Date:   Mon May 6 23:04:32 2019 -0700
 
- src/hb-meta.hh | 44 ++++++++++++++++++++++----------------------
- 1 file changed, 22 insertions(+), 22 deletions(-)
+    [iter] Adjust hb_filter
 
-commit caa3f92e91062ff78b657aec23569b099de48640
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4c2fd05ca5fa34303b986c34948b512d770ab8fe
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:43:51 2019 -0700
+Date:   Mon May 6 19:57:15 2019 -0700
 
-    [meta] void_tt -> void_t
+    [iter] Implement range-based for loops
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1648
 
- src/hb-meta.hh | 9 ++++-----
- 1 file changed, 4 insertions(+), 5 deletions(-)
+ src/hb-array.hh            |  6 ++++
+ src/hb-iter.hh             | 74 ++++++++++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-layout-common.hh | 14 +++++++++
+ src/hb-set.hh              |  3 ++
+ src/test-iter.cc           | 28 ++++++++++++++----
+ 5 files changed, 118 insertions(+), 7 deletions(-)
 
-commit 7df3ecfb4069d275cd277c71165962bb5769364a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:43:26 2019 -0700
+commit e261dc3a4043230ae1b4f56e2cc7d3133b7da4ca
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue May 7 01:24:55 2019 +0430
 
-    [meta] hb_void_t -> hb_empty_t
+    Ignore -Wc++11-compat as we require C++11 actually
+    
+    pollutes gcc bots logs https://circleci.com/gh/harfbuzz/harfbuzz/85395
 
- src/hb-debug.hh                |  6 +++---
- src/hb-meta.hh                 |  2 +-
- src/hb-ot-layout-gsub-table.hh |  2 +-
- src/hb-ot-layout-gsubgpos.hh   | 18 +++++++++---------
- 4 files changed, 14 insertions(+), 14 deletions(-)
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 149c3db8a2d41894b5d65f4c4b7c20757f6de6dd
+commit 9f9890e9e82c620e733d123f421f7c63d91ce8e1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:34:52 2019 -0700
+Date:   Mon May 6 12:16:51 2019 -0700
 
-    [meta] Minor
+    Remove HB_NO_OPTIONS in favor of HB_NO_GETENV
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-meta.hh | 2 +-
+ src/hb-debug.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 707ff5b59d3903b60312a028f2ba5d74c18db101
+commit 36bb24f7b4dbbe171b945639bac749c46785e17c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:31:20 2019 -0700
+Date:   Sun May 5 10:14:17 2019 -0700
 
-    Minor
+    [dispatch] Forward arguments in all dispatch multiplexers
 
- src/hb-meta.hh      | 5 -----
- src/hb-open-type.hh | 2 +-
- 2 files changed, 1 insertion(+), 6 deletions(-)
+ src/hb-aat-layout-kerx-table.hh | 14 ++++-----
+ src/hb-aat-layout-morx-table.hh | 14 ++++-----
+ src/hb-ot-kern-table.hh         | 16 +++++-----
+ src/hb-ot-layout-common.hh      |  6 ++--
+ src/hb-ot-layout-gpos-table.hh  | 68 ++++++++++++++++++++---------------------
+ src/hb-ot-layout-gsub-table.hh  | 58 +++++++++++++++++------------------
+ src/hb-ot-layout-gsubgpos.hh    | 32 +++++++++----------
+ 7 files changed, 104 insertions(+), 104 deletions(-)
 
-commit ce300f4fb68a25d46d165e8b0a4825482c83a966
+commit c14efb8e68e31fb7537bcfe5eea779c0830a0b0c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:26:29 2019 -0700
+Date:   Sun May 5 09:54:58 2019 -0700
 
-    [meta] Rewrite is_signed, add is_unsigned
+    Fix previous commit
+    
+    Priority should be given to specific over dispatch.  Broke sanitize before.
+    This fixes it, by moving prioritization to the context implementation, since
+    the correct priority cannot be done in the dispatch implementation.  Done
+    for subset and sanitize only, which need it.
 
- src/hb-meta.hh | 29 ++++++++++++-----------------
- 1 file changed, 12 insertions(+), 17 deletions(-)
+ src/hb-aat-layout-common.hh  |  2 +-
+ src/hb-dispatch.hh           | 10 +---------
+ src/hb-ot-layout-gsubgpos.hh | 14 +++++++-------
+ src/hb-sanitize.hh           | 16 +++++++++++++---
+ src/hb-subset.hh             | 15 ++++++++++++---
+ 5 files changed, 34 insertions(+), 23 deletions(-)
 
-commit e939d88bd72e0db0ebe357649b7a0fa3447c0bf4
+commit b10f65933a77434bf8d68058793037f38a8ed5a6
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:20:51 2019 -0700
+Date:   Sun May 5 09:23:35 2019 -0700
 
-    [meta] Rewrite is_integral / is_floating_point, add is_arithmetic
+    [dispatch] Use functionality from previous commit
+    
+    To remove a couple of unwanted wrapper methods
 
- src/hb-meta.hh | 49 +++++++++++++++++++++++++++++++------------------
- 1 file changed, 31 insertions(+), 18 deletions(-)
+ src/hb-dispatch.hh             | 15 +++++++++------
+ src/hb-open-type.hh            | 10 +++++-----
+ src/hb-ot-layout-gpos-table.hh |  6 ------
+ src/hb-ot-layout-gsub-table.hh |  6 ------
+ src/hb-sanitize.hh             |  5 +++--
+ src/hb-subset.hh               |  5 +++--
+ 6 files changed, 20 insertions(+), 27 deletions(-)
 
-commit c3a456a26e8e5f8bc483b326f1928e9c603a7216
+commit ac350c92fd6b04845c6240a5f3b77ceaf29e51d0
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:17:30 2019 -0700
+Date:   Sun May 5 09:10:46 2019 -0700
 
-    [meta] Rewrite is_cr_convertible
+    [dispatch] Try obj.dispatch(c) before trying c->dispatch(obj)
 
- src/hb-meta.hh | 13 +++++--------
- 1 file changed, 5 insertions(+), 8 deletions(-)
+ src/hb-aat-layout-common.hh  |  2 +-
+ src/hb-dispatch.hh           | 13 +++++++++++++
+ src/hb-ot-layout-gsubgpos.hh | 14 +++++++-------
+ src/hb-sanitize.hh           |  2 +-
+ src/hb-subset.hh             |  4 ++--
+ 5 files changed, 24 insertions(+), 11 deletions(-)
 
-commit b4ad6af9c4ec30c462078bd93ae12653619c5fea
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:15:03 2019 -0700
+commit 49252c42bb00380663ba9612e075c07f1be606b3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri May 3 10:42:11 2019 -0700
 
-    [meta] Rewrite is_base_of
+    get rid of O(n^2) loop from apply_deltas_to_points
 
- src/hb-meta.hh | 5 +----
- 1 file changed, 1 insertion(+), 4 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 55 +++++++++++++++++++++++++++++++--------------
+ 1 file changed, 38 insertions(+), 17 deletions(-)
 
-commit 5a171ed3a69313e10df6e42a03affb5e8bfe8e95
+commit 0d5fd168f8e3c1202358a82161a28e407149b1b4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:11:29 2019 -0700
+Date:   Fri May 3 10:37:32 2019 -0700
 
-    [null] Modernize template work
+    Revert "[WIP] [name] Port to fancy serializer machinery"
+    
+    This reverts commit c7f366fbbb208d0a9103ac4ee4ac00ff726c31e4.
+    
+    Don't know how it got to master!
 
- src/hb-null.hh | 19 ++++++-------------
- 1 file changed, 6 insertions(+), 13 deletions(-)
+ src/hb-ot-name-table.hh | 18 +++++++-----------
+ 1 file changed, 7 insertions(+), 11 deletions(-)
 
-commit 61d150c916d181cc3f333d0378108e08210370ad
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:06:31 2019 -0700
+commit 72e3eba8f87e2a8b145a4f98e24499f0aafe099b
+Author: Cody Planteen <planteen@gmail.com>
+Date:   Thu May 2 13:03:15 2019 -0600
 
-    [meta] Add integral_constant, true_t -> true_type, false_t -> false_type
+    Add configuration option HB_NO_GETENV to disable use of getenv()
 
- src/hb-iter.hh | 20 ++++++++++----------
- src/hb-meta.hh | 17 ++++++++---------
- src/hb-null.hh |  4 ++--
- 3 files changed, 20 insertions(+), 21 deletions(-)
+ src/hb.hh | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
 
-commit 38e3a8bd531ef3d35ca0fbcfad09db3f83345038
+commit c7f366fbbb208d0a9103ac4ee4ac00ff726c31e4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 20:03:14 2019 -0700
+Date:   Thu May 2 16:29:07 2019 -0700
 
-    [meta] bool_tt -> bool_constant
+    [WIP] [name] Port to fancy serializer machinery
 
- src/hb-meta.hh | 6 +++---
- src/hb-null.hh | 4 ++--
- 2 files changed, 5 insertions(+), 5 deletions(-)
+ src/hb-ot-name-table.hh | 18 +++++++++++-------
+ 1 file changed, 11 insertions(+), 7 deletions(-)
 
-commit 3919ca41b5e657764c7f75dfdc21cf8ca20bd66f
+commit 8855af38a8497d7788924d368baa9eeae4916940
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 19:56:36 2019 -0700
+Date:   Thu May 2 16:26:06 2019 -0700
 
-    [meta] Add is_floating_point
+    [name] Add NameRecord::copy()
 
- src/hb-meta.hh | 33 +++++++++++++++++++--------------
- 1 file changed, 19 insertions(+), 14 deletions(-)
+ src/hb-ot-name-table.hh | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
 
-commit 25bb7e005d96c367731fd8d129d764d101b1200f
+commit 097bb3f0af391dbb5d498df548b769f165f35c8a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 19:49:26 2019 -0700
+Date:   Thu May 2 16:25:00 2019 -0700
 
-    [meta] Add is_signed for floating point types
+    [name] Minor changes
 
- src/hb-meta.hh | 3 +++
- 1 file changed, 3 insertions(+)
+ src/hb-ot-name-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit e0315b4aadb3fbc6b618de56d643471e8d1f7859
+commit 431b6e1c449582619169722e16b472e872b02d58
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 19:48:02 2019 -0700
+Date:   Thu May 2 16:22:32 2019 -0700
 
-    [meta] is_integer -> is_integral
+    [serialize] Disable assertion for now
 
- src/hb-algs.hh |  2 +-
- src/hb-map.hh  |  4 ++--
- src/hb-meta.hh | 26 +++++++++++++-------------
- 3 files changed, 16 insertions(+), 16 deletions(-)
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 9574de7a3e763b9c5eacf65b4b8c148724c00b82
+commit 8a32c9eecbdc907415195eca9ebad47c8acf2df5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 19:29:32 2019 -0700
+Date:   Thu May 2 16:20:18 2019 -0700
 
-    [meta] Add add_const, add_pointer, add_lvalue_reference, add_rvalue_reference
+    [serialize] Misc getting copy() to work
 
- src/hb-meta.hh | 11 +++++++++++
- 1 file changed, 11 insertions(+)
+ src/hb-open-type.hh | 16 +++++++++-------
+ src/hb-serialize.hh | 26 ++++++++++++++++----------
+ 2 files changed, 25 insertions(+), 17 deletions(-)
 
-commit 2fb3a8327ab35248a0c7877c48422718cfbe375d
+commit 7d497a3a92973d4cec14888b932091f49de1d190
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 18:40:29 2019 -0700
+Date:   Thu May 2 16:20:03 2019 -0700
 
-    [vector] Simplify arrayZ
-    
-    Was turned into function when we had static ones and wanted to be
-    move-safe...  Not the case anymore.
+    [debug] Allow return_trace() to return any type
 
- src/hb-coretext.cc      |  2 +-
- src/hb-ot-cff-common.hh |  2 +-
- src/hb-uniscribe.cc     | 10 +++----
- src/hb-vector.hh        | 71 ++++++++++++++++++++++---------------------------
- 4 files changed, 39 insertions(+), 46 deletions(-)
+ src/hb-debug.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
 
-commit 4d67743ffd99ed9f2278ab21adfac7eb314c0df0
+commit 49b1c763a0459d586b7f0aa86eadd13d21b24867
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 16:35:31 2019 -0700
+Date:   Thu May 2 16:19:34 2019 -0700
 
-    [subset] Use more auto typing
+    [test] Run "fonttools ttx" instead of "ttx"
 
- src/hb-ot-layout-common.hh     | 8 ++++----
- src/hb-ot-layout-gdef-table.hh | 2 +-
- src/hb-ot-layout-gsubgpos.hh   | 4 ++--
- 3 files changed, 7 insertions(+), 7 deletions(-)
+ test/subset/run-tests.py | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
 
-commit a27a31b9ee2601a05575cb581dc227caa73742c4
+commit 91176d5b778b44172591e82ba84127e5eff1372d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 16:26:19 2019 -0700
+Date:   Thu May 2 15:12:07 2019 -0700
 
-    Minor
+    [serialize] Check offset base is within (possibly end of) object
 
- src/hb-ot-layout-common.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-serialize.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 2ade0086286963ae2c65d44b94e63cb3836ce36b
+commit 0f1a6ce8268b197732aab40069bbda57eddac2e0
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 16:21:03 2019 -0700
+Date:   Thu May 2 15:03:41 2019 -0700
 
-    [serialize] More rewrite
+    [name] Fix format of susbetted table to 0
 
- src/hb-ot-layout-common.hh | 42 ++++++++++++++++++++++++------------------
- 1 file changed, 24 insertions(+), 18 deletions(-)
+ src/hb-ot-name-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 99ed6e29d86bbf391c12ee1f980b8af9dc35615e
+commit 87810fc958e28d0c5e05097b1b3fe78d962fdc62
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 16:07:51 2019 -0700
+Date:   Thu May 2 14:45:57 2019 -0700
 
-    [serialize] Fix a TODO
+    [name] Use variable forwarding to simplify sanitize()
 
- src/hb-ot-layout-common.hh | 16 ++++++++++------
- 1 file changed, 10 insertions(+), 6 deletions(-)
+ src/hb-ot-name-table.hh | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
 
-commit d8a49b53e3676ad742bdb8edf0ec3ca6f7a7cac9
-Author: rsheeter <rsheeter@google.com>
-Date:   Fri May 10 16:52:43 2019 -0700
+commit bf91b418b0e988619c230156f5f062c5d2802dd8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 2 14:42:37 2019 -0700
 
-    Update TESTING.md
+    [name]
 
TESTING.md | 9 ++++++++-
- 1 file changed, 8 insertions(+), 1 deletion(-)
src/hb-ot-name-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 25a5b287f220802728cd3312692f368c45d22862
+commit 998b0b68ac2eafd1d5bca51b3723fa753e4db7c4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 16:01:39 2019 -0700
+Date:   Thu May 2 14:39:52 2019 -0700
 
-    Fix sanitize fail of extension sublookups
-    
-    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=960331
+    [serializer] Add copy() to (Unsized)ArrayOf
 
- src/hb-ot-layout-common.hh                                 |  10 ++++++++--
- src/hb-sanitize.hh                                         |   2 ++
- ...uzz-testcase-minimized-harfbuzz_fuzzer-5702671124791296 | Bin 0 -> 94 bytes
- 3 files changed, 10 insertions(+), 2 deletions(-)
+ src/hb-open-type.hh | 41 +++++++++++++++++++++++++++++++++++++++++
+ src/hb-serialize.hh |  4 ++--
+ 2 files changed, 43 insertions(+), 2 deletions(-)
 
-commit 9c0c3589f31106d1898f8922cc9a2e18cb054989
+commit 88a41472404a8e7754e1099ca4a5b2146dae5298
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 13:56:50 2019 -0700
+Date:   Thu May 2 14:22:31 2019 -0700
 
-    Minor
+    [serializer] Accept exact type in serialize_subset/copy()
 
- src/hb-ot-layout-common.hh | 14 ++++++++------
- 1 file changed, 8 insertions(+), 6 deletions(-)
+ src/hb-open-type.hh            | 12 ++++++------
+ src/hb-ot-layout-common.hh     | 33 ++-------------------------------
+ src/hb-ot-layout-gpos-table.hh |  6 ++++++
+ src/hb-ot-layout-gsub-table.hh |  6 ++++++
+ 4 files changed, 20 insertions(+), 37 deletions(-)
 
-commit 5d773ec60029e1a6edec45c27ea918d9be4ea806
+commit 88fdeeecc0ef57e41219d92c90f35f13cbd3a35e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 13:53:15 2019 -0700
+Date:   Thu May 2 14:14:33 2019 -0700
 
-    Minor
+    [serialize] Take arguments in copy()
 
- src/hb-ot-layout-gsubgpos.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-open-type.hh |  6 +++---
+ src/hb-serialize.hh | 10 ++++++----
+ 2 files changed, 9 insertions(+), 7 deletions(-)
 
-commit ac737f8c9e7cbc81cdb5a0542a2494671f236895
+commit 273ed6127bd9471fd11b3c1c7f232638f1ff1dba
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 13:51:12 2019 -0700
+Date:   Thu May 2 14:04:51 2019 -0700
 
-    Minor again
+    [serializer] Add serialize_copy()
 
- src/hb-ot-layout-gsubgpos.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-open-type.hh | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
 
-commit 5d4437fad0f99508ebd5c026a3d927f5d649615e
+commit bf22338f49fb1711f7cbcad2d9949d7962cdc0bc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 13:43:29 2019 -0700
+Date:   Thu May 2 13:51:52 2019 -0700
 
-    Minor
+    Remove dead code
 
- src/hb-ot-layout-common.hh | 1 -
- 1 file changed, 1 deletion(-)
+ src/hb-algs.hh | 3 ---
+ 1 file changed, 3 deletions(-)
 
-commit cd9bc732a75c716121a86e39ab588d2e0af58eba
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 13:17:41 2019 -0700
+commit 157a414bd9fb8b1b7a066603e7c44b8680b48e28
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu May 2 11:25:10 2019 -0700
 
-    [gsubgpos] Minor
+    fix mixup of TRACE_SUBSET/SERIALIZE
 
- src/hb-ot-layout-gsubgpos.hh | 9 ++-------
- 1 file changed, 2 insertions(+), 7 deletions(-)
+ src/hb-ot-layout-common.hh  | 4 ++--
+ src/hb-ot-var-hvar-table.hh | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
 
-commit 6d63e27ca41b12ba2e8fb22fd6bc44417651c518
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 11:53:02 2019 -0700
+commit 14e1fabc41a9a5ead3d91d560773050469982f54
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed May 1 21:29:06 2019 -0400
 
-    Generate tarball in .xz instead of .bz2
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1662
+    Sync gen-vowel-constraints.py with current output
 
- configure.ac | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/gen-vowel-constraints.py | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit 1d870cce68f7033f6d3967ce4e9ba622a6fafe79
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 11:32:59 2019 -0700
+commit 026ab825c8e41980e286be911cc6fbb958dd7cd3
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed May 1 16:15:58 2019 -0400
 
-    Fix bot
-    
-    Any way to catch these?
+    Add dotted circles to more broken clusters
 
- src/test-meta.cc | 26 +++++++++++++-------------
- 1 file changed, 13 insertions(+), 13 deletions(-)
+ src/gen-use-table.py                       |   9 +
+ src/hb-ot-shape-complex-myanmar-machine.hh | 196 +++++-----
+ src/hb-ot-shape-complex-myanmar-machine.rl |   4 +-
+ src/hb-ot-shape-complex-use-machine.hh     | 602 +++++++++++++++--------------
+ src/hb-ot-shape-complex-use-machine.rl     |  11 +-
+ src/hb-ot-shape-complex-use-table.cc       |   2 +-
+ 6 files changed, 433 insertions(+), 391 deletions(-)
 
-commit 30e4ae6bd19bf297b029205b5f86c1a0ae14943d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 11:26:39 2019 -0700
+commit 92588782d7a45e0c023c5f48cbd19b11cfa8f0d2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 30 13:05:10 2019 -0700
 
-    [meta] Add hb_is_base_of
+    Remove space between right angle brackets now that we have C++11 (#1689)
 
- src/hb-meta.hh   |  7 +++++++
- src/test-meta.cc | 16 ++++++++++++++++
- 2 files changed, 23 insertions(+)
+ src/hb-aat-layout-ankr-table.hh |  2 +-
+ src/hb-aat-layout-common.hh     | 14 +++----
+ src/hb-aat-layout-just-table.hh |  4 +-
+ src/hb-aat-layout-kerx-table.hh | 14 +++----
+ src/hb-aat-layout-lcar-table.hh |  2 +-
+ src/hb-aat-layout-morx-table.hh | 14 +++----
+ src/hb-aat-layout-trak-table.hh |  2 +-
+ src/hb-aat-ltag-table.hh        |  2 +-
+ src/hb-cff-interp-cs-common.hh  |  2 +-
+ src/hb-cff1-interp-cs.hh        |  2 +-
+ src/hb-cff2-interp-cs.hh        |  2 +-
+ src/hb-iter.hh                  |  4 +-
+ src/hb-null.hh                  |  8 ++--
+ src/hb-open-file.hh             |  8 ++--
+ src/hb-open-type.hh             |  8 ++--
+ src/hb-ot-color-cbdt-table.hh   |  2 +-
+ src/hb-ot-color-colr-table.hh   |  4 +-
+ src/hb-ot-color-cpal-table.hh   |  8 ++--
+ src/hb-ot-color-sbix-table.hh   |  2 +-
+ src/hb-ot-color-svg-table.hh    |  4 +-
+ src/hb-ot-kern-table.hh         |  6 +--
+ src/hb-ot-layout-base-table.hh  |  2 +-
+ src/hb-ot-layout-common.hh      | 10 ++---
+ src/hb-ot-layout-gdef-table.hh  |  4 +-
+ src/hb-ot-layout-gpos-table.hh  |  6 +--
+ src/hb-ot-layout-gsub-table.hh  | 18 ++++-----
+ src/hb-ot-layout-gsubgpos.hh    | 86 ++++++++++++++++++++---------------------
+ src/hb-ot-math-table.hh         |  2 +-
+ src/hb-ot-name-table.hh         | 10 ++---
+ src/hb-ot-stat-table.hh         |  4 +-
+ src/hb-subset-cff1.cc           |  2 +-
+ src/test-iter.cc                | 10 ++---
+ 32 files changed, 134 insertions(+), 134 deletions(-)
 
-commit 98974ac16f5caf282c9c7cf0c417b494efd6af1d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 10 11:18:52 2019 -0700
+commit f27fdca4aa438ec366ee17370fbc9fdeb962c397
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 30 13:01:04 2019 -0700
 
-    [iter] Adjust is_source_of / is_sink_of
-    
-    There are two cases that we accept.  Encode both.
+    [doc] Add documentation to hb_color_get_* and hb_directwrite_face_* (#1690)
 
- src/hb-iter.hh | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
+ src/hb-common.cc      | 12 ++++++++----
+ src/hb-directwrite.cc |  8 ++++++--
+ 2 files changed, 14 insertions(+), 6 deletions(-)
 
-commit 1b58bf22ca70908bb578910757795ee32d48b65a
-Author: rsheeter <rsheeter@google.com>
-Date:   Thu May 9 20:06:29 2019 -0700
+commit c52294eb28e9b043306f91611e4444651fe5e8ef
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Apr 30 10:40:45 2019 -0700
 
-    Update TESTING.md
+    renaming & arg reorder
 
TESTING.md | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
src/hb-ot-var-hvar-table.hh | 56 ++++++++++++++++++++++-----------------------
+ 1 file changed, 28 insertions(+), 28 deletions(-)
 
-commit ed972d5d73ba0592e1ba92426adf2a8f67acf9c9
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 16:58:28 2019 -0700
+commit fe4a0ac707802b5bb36787723f8d55a58c2946a5
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Apr 30 13:35:50 2019 -0400
 
-    [iter] Rewrite test functions
-    
-    Notably, add hb_is_source_of(,) and hb_is_sink_of(,) to replace most
-    uses of hb_is_iterator_of(,).
+    Fix some dead links
 
- src/hb-iter.hh             | 65 +++++++++++++++++++++++++++++-----------------
- src/hb-open-type.hh        |  7 +++--
- src/hb-ot-layout-common.hh |  6 ++---
- src/hb-ot-name-table.hh    |  2 +-
- src/test-iter.cc           |  2 +-
- 5 files changed, 49 insertions(+), 33 deletions(-)
+ src/gen-os2-unicode-ranges.py      | 2 +-
+ src/gen-use-table.py               | 6 +++---
+ src/hb-ot-shape-complex-myanmar.hh | 2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
 
-commit 42901d7af91b4c5cffee9752f653447e4f4bd4f7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 16:22:08 2019 -0700
+commit 68749e996aedbae9b1c4553f5672f74e1727b850
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Apr 30 17:23:55 2019 +0100
 
-    Minor
+    [Docs] Usermanual; update XML manifest for new chapters.
 
- src/hb-meta.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ docs/Makefile.am       | 4 ++--
+ docs/harfbuzz-docs.xml | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
 
-commit 322627ae1daa16f62f7a91c3c3ed02eb5b708ca5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 16:08:10 2019 -0700
+commit 30d7d1064ee339ca216699851030f9bae8c07c68
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Apr 30 17:23:19 2019 +0100
 
-    Whitespace
+    [Docs] Usermanual; add Utilities chapter.
 
- src/hb-array.hh | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
+ docs/usermanual-utilities.xml | 244 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 244 insertions(+)
 
-commit 489f3c35bddb22cfe40c45d3a5c1cb6d88ccaf1f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 15:39:32 2019 -0700
+commit d0f5a05aef73293fe21ddb022084166a7a095862
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Apr 30 17:22:54 2019 +0100
 
-    Fix bot
+    [Docs] Usermanual; add Shaping, Features, and Plans.
 
src/test-meta.cc | 70 ++++++++++++++++++++++++++++----------------------------
- 1 file changed, 35 insertions(+), 35 deletions(-)
docs/usermanual-opentype-features.xml | 279 +++++++++++++++++++++++++++++++++-
+ 1 file changed, 277 insertions(+), 2 deletions(-)
 
-commit 790315e0dbc0ce796f0081a60953f74bd3fbdb63
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 15:31:24 2019 -0700
+commit 8354c99fbee2887cb71440f4e25ad1e6f46b2592
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Apr 30 17:22:08 2019 +0100
 
-    [algs] Implement implicit casting between compatible pair types
+    [Docs] Usermanual; add Fonts And Faces chapter.
+
+ docs/usermanual-fonts-and-faces.xml | 445 +++++++++++++++++++++++++++++++++++-
+ 1 file changed, 437 insertions(+), 8 deletions(-)
+
+commit 3b301c5ac6b15728f858cb6f5de8dfc6a77209fa
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Apr 30 17:21:33 2019 +0100
 
- src/hb-algs.hh   | 5 +++++
- src/test-algs.cc | 3 +++
- 2 files changed, 8 insertions(+)
+    [Docs] Usermanual; fill out Buffers chapter.
 
-commit 69d9114b5372c1fcea5f20e75a187158c31c52f8
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 15:24:14 2019 -0700
+ ...anual-buffers-language-script-and-direction.xml | 358 +++++++++++++++++++--
+ 1 file changed, 335 insertions(+), 23 deletions(-)
 
-    [meta] Rewrite hb_is_cr_converitble
+commit 6d9a86ae7535ea8e3c108a49c6da877a78cdac26
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Apr 30 16:09:01 2019 +0100
 
- src/hb-meta.hh | 22 ++++++++++------------
- 1 file changed, 10 insertions(+), 12 deletions(-)
+    [Docs] Usermanual; fixes to Object Model chapter
 
-commit ceda1f03b7b06248ffd056eb7b2400088bb4a121
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 15:19:42 2019 -0700
+ docs/usermanual-object-model.xml | 35 ++++++++++++++++++++++-------------
+ 1 file changed, 22 insertions(+), 13 deletions(-)
 
-    Fix compile
-    
-    NameRecord is not copy-constructible, so should be iterator of
-    const-reference.
+commit 1223a352b7c8d1cc362693b850f348af4d4d03fb
+Merge: aa3ac592 9542bdd0
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Apr 29 16:43:48 2019 -0700
 
- src/hb-meta.hh          |  2 --
- src/hb-ot-name-table.hh |  2 +-
- src/test-meta.cc        | 12 ++++++++++++
- 3 files changed, 13 insertions(+), 3 deletions(-)
+    Merge branch 'master' into var-subset
 
-commit 3686c3b65c017cf8689b67db440b4cddd399538b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 15:09:07 2019 -0700
+commit 9542bdd0ed2d581cdb4bd950ac3cd7e3bf899478
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Apr 29 14:52:28 2019 -0700
 
-    Adjust is_cr_convertible
+    Add color channels getters ABI (#1513)
     
-    If To is const& then From doesn't need to be &.
+    So can be used with language wrappers
 
- src/hb-meta.hh | 14 ++++++++++----
- 1 file changed, 10 insertions(+), 4 deletions(-)
+ src/hb-common.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-common.h  | 40 +++++++++++-----------------------------
+ 2 files changed, 64 insertions(+), 29 deletions(-)
 
-commit 726002a6a615e2d213186d402cca4e8d7e7a7f58
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 14:53:02 2019 -0700
+commit e200d165a4e8a5f901165c705d617b6e457ec595
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 30 02:10:50 2019 +0430
 
-    [iter] Make hb_is_iterator_of() check is_convertible
+    [ci] Remove crosscompile-notest-freebsd9 bot
     
-    Instead of is_cr_convertible.
+    It was testing an old version of freebsd and now it's image is gone.
+    We really like to test the environment.
 
- src/hb-array.hh | 8 ++++----
- src/hb-iter.hh  | 2 +-
- src/hb-meta.hh  | 8 ++++----
- 3 files changed, 9 insertions(+), 9 deletions(-)
+ .circleci/config.yml | 10 ----------
+ 1 file changed, 10 deletions(-)
 
-commit 70a49f2e4a9ab05fe04d1949bbf7a128d14a1284
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 14:35:15 2019 -0700
+commit 4aa546b70ad7b11154b901e67f98c1ec6bc5c364
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Apr 29 14:16:51 2019 -0400
 
-    [meta] Add hb_conditional<> and hb_is_convertible()
+    Allow some Balinese Po & So as aksara modre bases
 
- src/Makefile.am  |  6 ++++-
- src/hb-meta.hh   | 56 +++++++++++++++++++++++++++++++++++++--------
- src/test-meta.cc | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 121 insertions(+), 11 deletions(-)
+ src/gen-use-table.py                 | 10 ++++++++--
+ src/hb-ot-shape-complex-use-table.cc |  4 ++--
+ 2 files changed, 10 insertions(+), 4 deletions(-)
 
-commit 5e3cbed048b19ee579277ab4c56167a15d13104e
-Author: Garret Rieger <grieger@google.com>
-Date:   Wed May 8 16:33:03 2019 -0700
+commit 6d6edc8b25395c87477181a647a8e6d02f2cad4f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Apr 28 11:54:07 2019 -0700
 
-    [subset] Switch building of glyph maps in subset plan to use iterators.
+    [valgrind] Use libtool and support run-subset-fuzzer-tests (#1668)
 
- src/hb-algs.hh        |  4 +---
- src/hb-subset-plan.cc | 52 +++++++++++++++++++++++++--------------------------
- 2 files changed, 27 insertions(+), 29 deletions(-)
+ test/fuzzing/Makefile.am                |  4 +-
+ test/fuzzing/run-shape-fuzzer-tests.py  | 28 ++++++------
+ test/fuzzing/run-subset-fuzzer-tests.py | 75 ++++++++++++++++++++++++++++++---
+ 3 files changed, 85 insertions(+), 22 deletions(-)
 
-commit 971020eca7c5d576816b93431607f1e63e9584a4
-Author: Garret Rieger <grieger@google.com>
-Date:   Wed May 8 16:31:52 2019 -0700
+commit 62c6e170728303f4225aaa25523675fc260ae1ab
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Apr 28 10:55:07 2019 -0700
 
-    Add sink support for hb_hashmap_t and a reverse call to hb_pair_t.
+    [test] Add crbug.com/oss-fuzz/14474 testcase
+    
+    Fixed at 6977a95f
 
- src/hb-algs.hh | 5 +++++
- src/hb-map.hh  | 4 ++++
- 2 files changed, 9 insertions(+)
+ ...testcase-minimized-hb-subset-fuzzer-5716947896893440 | Bin 0 -> 65833 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit 98eec3dd5f527cc562d98784429db0c7269e82a8
+commit 6977a95fed8a35d6e915ed3fc3a3ea8709f3d4a4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 13:15:36 2019 -0700
+Date:   Sat Apr 27 10:05:25 2019 -0700
 
-    Add hb_pair_t(,) macro as alternative to hb_pair_t<,>
+    [subset] Don't crash if subsetting GSUB/GPOS fails
     
-    Just so it's easier to use it in other macros.
+    Fixes fuzzer issue.
 
- src/hb-algs.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-subset.cc | 27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
 
-commit c9b287a867d6130a0cc745d7fd3ccfa4dcb4c32e
+commit 2b051e7aa147c78cfbf953b6f0eb18c25b732eb2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 12:43:57 2019 -0700
+Date:   Sat Apr 27 10:01:11 2019 -0700
 
-    Add hb_lidentity(), and rename hb_rvalue() to hb_ridentity()
+    [subset] Check error after calling serializer end
 
- src/hb-algs.hh   | 13 ++++++++++++-
- src/hb-map.hh    |  4 ++--
- src/test-iter.cc |  2 +-
- 3 files changed, 15 insertions(+), 4 deletions(-)
+ src/hb-subset.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
 
-commit 00195a22ce5198345cb39825a45863cef7d8f7fc
+commit 750b65e9a980efc13e50ea5d0388ecf06e7a93b1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 12:14:36 2019 -0700
+Date:   Fri Apr 26 17:14:25 2019 -0700
 
-    [hdmx] Adjust to hb_iota() behavior change
+    [meta] Add hb_type_identity<>
     
-    Use hb_range() instead.
+    To block template argument deduction.
 
- src/hb-ot-hdmx-table.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-meta.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
 
-commit 4f2ad75a839708de71e7341f23c2d4b72059fc58
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 12:07:45 2019 -0700
+commit 8c8922a019eb1ceb8beffc05ca638ee0ca25b565
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Thu Apr 25 09:17:58 2019 -0700
 
-    [enumerate] Fix hb_enumerate() len for step=0
+    [subset] Updates due to changes in resolve_links() on master branch
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/Makefile.sources    | 1 +
+ src/hb-ot-name-table.hh | 7 +++++--
+ src/hb-static.cc        | 3 +--
+ 3 files changed, 7 insertions(+), 4 deletions(-)
 
-commit 5da3c9c33f02010a3fc57cf0e1d07955af681e7c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:30:31 2019 -0700
+commit 2f6ec35344db08d0c892152bc7a7eaa67e7c03f0
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Apr 24 15:15:36 2019 -0700
 
-    [iter] Fix hb_zip() end condition
-    
-    We should compare-equal to end if either iterator's end reaches,
-    not if both reach at the same time.  Fixes infinite-loop in test
-    which was happening after hb_enumerate() switched to using hb_zip().
+    Move implementations of hb-ot-name-language.cc into a hb-static.cc
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-aat-layout.hh              |   1 -
+ src/hb-ot-name-language-static.hh | 462 ++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-name-language.hh        | 432 +----------------------------------
+ src/hb-static.cc                  |   2 +
+ 4 files changed, 468 insertions(+), 429 deletions(-)
 
-commit 57a5256fbcef6e5d29fc40cf019cc4b2c29c9dcf
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:30:27 2019 -0700
+commit 19afd25004487cfaa7b487b1768b4dae1ab37296
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Apr 24 14:02:29 2019 -0700
 
-    [iter] Minor
+    [subset] Update to use _subset2() for name table
 
- src/hb-iter.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-ot-name-table.hh | 47 ++++++++++-------------------------------------
+ src/hb-subset.cc        |  4 ++--
+ 2 files changed, 12 insertions(+), 39 deletions(-)
 
-commit 12dd56f8573cb86169580d5ac31b986208805c03
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:25:02 2019 -0700
+commit 1ca4b5c77012ed586413f39e730b03bf965e1305
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Apr 22 11:31:23 2019 -0700
 
-    [iter] Minor
+    [subset] Add unit test for str de-dup
+    Also move the implementation of some methods from the .cc to the .hh
 
- src/hb-iter.hh | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
+ src/Makefile.sources                   |   1 -
+ src/hb-aat-layout.cc                   |   8 -
+ src/hb-aat-layout.hh                   |   9 +-
+ src/hb-ot-name-language.cc             | 457 ---------------------------------
+ src/hb-ot-name-language.hh             | 432 ++++++++++++++++++++++++++++++-
+ test/api/fonts/nameID.dup.expected.ttf | Bin 0 -> 2340 bytes
+ test/api/fonts/nameID.dup.origin.ttf   | Bin 0 -> 170680 bytes
+ test/api/test-subset-nameids.c         |  21 ++
+ 8 files changed, 456 insertions(+), 472 deletions(-)
 
-commit 57d545932f539d06c52862310ecdfe79c143bb6b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:23:41 2019 -0700
+commit 9ad14f56b6cf2a345104b3a897b52a1f4c0f33a5
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Apr 16 11:20:58 2019 -0700
 
-    [test-iter] Don't walk past end
-    
-    That's not legal.
+    [subset] update name table subsetting with new serializer
 
- src/test-iter.cc | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
+ src/hb-ot-name-table.hh | 126 ++++++++++++++++++++++++++++--------------------
+ 1 file changed, 75 insertions(+), 51 deletions(-)
+
+commit 6faac8df83bb59f08e5d329e76435ba438b2ea54
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Wed Apr 10 16:38:35 2019 -0700
+
+    [subset] Subsetting Name Table Step 4
+    Add unit test and integration test
+
+ test/api/Makefile.am                               |   2 +
+ test/api/fonts/nameID.expected.ttf                 | Bin 0 -> 170696 bytes
+ test/api/fonts/nameID.origin.ttf                   | Bin 0 -> 170976 bytes
+ test/api/hb-subset-test.h                          |   9 ++++
+ test/api/test-subset-nameids.c                     |  58 +++++++++++++++++++++
+ .../Roboto-Regular.abc.name-ids.61,62,63.ttf       | Bin 0 -> 2168 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61,63.ttf   | Bin 0 -> 1988 bytes
+ .../basics/Roboto-Regular.abc.name-ids.61.ttf      | Bin 0 -> 1792 bytes
+ .../basics/Roboto-Regular.abc.name-ids.62.ttf      | Bin 0 -> 1740 bytes
+ .../basics/Roboto-Regular.abc.name-ids.63.ttf      | Bin 0 -> 1716 bytes
+ test/subset/data/profiles/name-ids.txt             |   1 +
+ test/subset/data/tests/basics.tests                |   1 +
+ 12 files changed, 71 insertions(+)
+
+commit e501ea143d1e63974903cdb41932c50f4222ff4e
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Apr 5 10:05:55 2019 -0700
+
+    [subset] Subset name table step 3, add --nameids option to guide the
+    selection of which name records to keep in the subset method.
+
+ src/hb-ot-name-table.hh | 28 ++++++++++++++++------------
+ src/hb-subset-input.cc  |  8 ++++++++
+ src/hb-subset-input.hh  |  3 ++-
+ src/hb-subset-plan.cc   | 10 ++++++----
+ src/hb-subset-plan.hh   |  3 +++
+ src/hb-subset.h         |  3 +++
+ util/hb-subset.cc       |  1 +
+ util/options.cc         | 45 +++++++++++++++++++++++++++++++++++++++++++++
+ util/options.hh         |  8 ++++++++
+ 9 files changed, 92 insertions(+), 17 deletions(-)
 
-commit 46837910e628248edc09e45e212532a3493905da
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:20:41 2019 -0700
+commit 2637a81615c80443911a603cbd161ade525c79f1
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Apr 2 13:38:27 2019 -0700
 
-    [iter] Allow negative step in hb_iota()
+    [subset] subset name table step 2, add implementation for collecting subset
+    elements and serialize method
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-name-table.hh | 131 ++++++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 109 insertions(+), 22 deletions(-)
 
-commit 087327af1eac8c3a16115904557cbf3ab0f28072
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:14:06 2019 -0700
+commit 408c1daeb4ff86d2204ed1bdd059513357ada392
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Fri Mar 29 10:34:32 2019 -0700
 
-    [iter] Minor
+    [subset] subset name table step 1,  write out table unmodified, use accelerator to access
+    string
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-name-table.hh | 53 +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc        |  4 ++++
+ 2 files changed, 57 insertions(+)
 
-commit 64f0899a9f5e5aff65c5a78fa796ceae6f35c008
+commit 3a7f5bdd18314676425ec811199767a5f8e65a40
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:10:31 2019 -0700
+Date:   Fri Apr 26 14:40:01 2019 -0700
 
-    [iter] Bug fix
+    Rewrite hb_is_signed()
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-meta.hh | 20 +++++++++++---------
+ 1 file changed, 11 insertions(+), 9 deletions(-)
 
-commit 5d263556b95047bced88e4a6252178d2fc0f9a19
+commit 73c82f2301a52cf2111296b34691bc898a7a6363
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:08:25 2019 -0700
+Date:   Fri Apr 26 13:16:48 2019 -0700
 
-    [iter] Fix
+    [iter] Fix hb_is_iterator_of() to actually check item type
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-iter.hh | 20 +++++++++-----------
+ 1 file changed, 9 insertions(+), 11 deletions(-)
 
-commit 2c24ea37b1ef63f79fcc24752dd180ce53540eda
+commit c51f15ddfcae8578483693b761b81ceaebf05f2a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:07:38 2019 -0700
+Date:   Fri Apr 26 13:03:41 2019 -0700
 
-    [iter] Take start value in hb_enumerate()
-    
-    Also rewrite it via composition.
+    [array] Adjust hb_sorted_array_t copy constructor/assignment to match hb_array_t
 
- src/hb-iter.hh   | 61 ++++++++++++--------------------------------------------
- src/test-iter.cc |  1 +
- 2 files changed, 14 insertions(+), 48 deletions(-)
+ src/hb-array.hh | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
 
-commit 7675d0d3a6cc13ade1a2047019ef7fac8c373a3c
+commit b2758c360cc08d7a0334aae11845d0c5d50c46af
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:02:56 2019 -0700
+Date:   Fri Apr 26 12:58:06 2019 -0700
 
-    [iter] Add hb_range()
-    
-    hb_range() is like Python range.  hb_iota() has slightly different API.
-    Ie. it takes a start, instead of end.
+    [array] Use hb_is_cr_convertible_to()
 
- src/hb-iter.hh   | 29 ++++++++++++++++++-----------
- src/test-iter.cc | 19 +++++++++++--------
- 2 files changed, 29 insertions(+), 19 deletions(-)
+ src/hb-array.hh | 14 ++------------
+ 1 file changed, 2 insertions(+), 12 deletions(-)
 
-commit 05867d9f5315c7e4f49e5873a5aba6bba7121f04
+commit 8ecae793aa79056a312d3c8518106cfeca42390e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 11:00:43 2019 -0700
+Date:   Fri Apr 26 12:57:56 2019 -0700
 
-    [meta] Add hb_int_max()
+    [meta] Add hb_is_cr_convertible_to()
 
- src/hb-meta.hh | 91 ++++++++++++++++++++++++++++++++++++----------------------
- 1 file changed, 56 insertions(+), 35 deletions(-)
+ src/hb-meta.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
 
-commit 71537f93e0ce27121012bf1e81270b6b03b22224
+commit 52bb0346d319c322f117567a096fafa1bc804e26
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 9 10:46:49 2019 -0700
-
-    [iota] end -> end_ to not shadow
-
- src/hb-iter.hh | 22 +++++++++++-----------
- 1 file changed, 11 insertions(+), 11 deletions(-)
+Date:   Fri Apr 26 12:52:28 2019 -0700
 
-commit 6bc82579100992e3f04c11f36b9c2f0014d880f2
-Merge: 34764454 6d9a86ae
-Author: n8willis <n8willis@users.noreply.github.com>
-Date:   Thu May 9 14:39:05 2019 +0100
+    [meta] Add hb_decay<>
 
-    Merge pull request #1680 from n8willis/usermanual-obj
-    
-    Usermanual: object-model chapter
+ src/hb-meta.hh | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 3476445420d0e6432c09710b6667205453799129
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 21:14:01 2019 -0700
+commit 474f3587cd18fdaf86b2068647fa03b107557d8c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Apr 26 10:12:38 2019 -0700
 
-    Remove unnecessary template keyword
-    
-    Should fix MSVC.
+    copy retain_gids from input to plan
 
- src/hb-array.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-subset-plan.cc | 1 +
+ src/hb-subset-plan.hh | 1 +
+ 2 files changed, 2 insertions(+)
 
-commit e2a51ff7264940312197184318f5ad4ec971492f
+commit 3fc066314ac19005ea8157a6541412cfd24abbc2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 16:41:39 2019 -0700
+Date:   Wed Apr 24 16:41:57 2019 -0700
 
-    Remove unused var
+    Another try at fixing cmake build
 
src/hb-open-type.hh | 1 -
- 1 file changed, 1 deletion(-)
CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit e8b45c19330d8718cd6d7aef0ca2db0539a53294
+commit c69f02784ac53a7fd13eee559559b38d8224ef59
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 16:37:38 2019 -0700
+Date:   Wed Apr 24 16:31:37 2019 -0700
 
-    [array] Add .copy()
+    Fix sign-compare error on 32-bit systems
 
- src/hb-array.hh     | 11 +++++++++++
- src/hb-open-type.hh | 10 ++++------
- src/hb-serialize.hh |  2 +-
- 3 files changed, 16 insertions(+), 7 deletions(-)
+ src/hb-open-type.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit afb013f350b0022ae6c05f140aeba23d5de34101
+commit f2d20dd9d3b52f434f5fe9dbef82bd95eb499edf
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 16:16:43 2019 -0700
+Date:   Wed Apr 24 15:08:27 2019 -0700
 
-    Fix msan issue
+    [THANKS] Add Ivan Kuckir <https://photopea.com/>
     
-    hb_identity returns rvalue-reference if input is rvalue.  That, can leak
-    the reference and cause in bad access to temporaries after they are
-    destructed.  This is unfortunately unfixable given the desired
-    transparency of hb_identity :(.  Just don't use it with hb_map().
+    https://github.com/harfbuzz/harfbuzz/issues/1633#issuecomment-485764140
 
src/test-iter.cc | 2 +-
THANKS | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 4c94bc63d914fac7e11940eb165b6cf1039ba5a1
+commit 0ca358f21a2a6e86a3d5c145a70bb84ab6e2db32
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 15:57:33 2019 -0700
+Date:   Wed Apr 24 16:36:29 2019 -0400
 
-    Move hb_invoke() back to hb-algs.hh
+    Try fixing cmake build
 
- src/hb-algs.hh | 32 ++++++++++++++++++++++++++++++++
- src/hb-meta.hh | 32 --------------------------------
- 2 files changed, 32 insertions(+), 32 deletions(-)
+ CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit b710176ce28e863a01797987d7ce37d19aaf2fd3
+commit 59a8fa53533b10b9c25458d9ba2d68b7b01c3ff0
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 15:46:51 2019 -0700
-
-    [hdmx] Touch up
-
- src/hb-ot-hdmx-table.hh | 24 ++++++++++++++----------
- 1 file changed, 14 insertions(+), 10 deletions(-)
-
-commit e8ef0e627c493af700e254bdd2767f8955f2d03f
-Author: Garret Rieger <grieger@google.com>
-Date:   Tue May 7 17:23:02 2019 -0700
+Date:   Wed Apr 24 12:19:13 2019 -0400
 
-    [subset] WIP convert hdmx subsetting to use iterators.
+    [iter] Add tests for casting to hb_iter_t<> base class for hb_sorted_array_t<>
+    
+    Something's phishy about hb_sorted_array_t<>.  Can't get it work nicely with
+    change I'm making.  Ugh..
 
- src/hb-ot-hdmx-table.hh     | 121 +++++++++++++++++++-------------------------
- test/api/test-subset-hdmx.c |  23 ---------
- 2 files changed, 51 insertions(+), 93 deletions(-)
+ src/test-iter.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
 
-commit d5decf9bf77db914b67ffc446379df621516e362
-Author: Garret Rieger <grieger@google.com>
-Date:   Tue May 7 15:47:38 2019 -0700
+commit 714307cc437f375f128e17e5ab01eba0c57aaf01
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 24 10:56:12 2019 -0400
 
-    [subset] Move hdmx to subset2.
+    [iter] Remove fixed TODO
 
- src/hb-ot-hdmx-table.hh | 36 ++++++------------------------------
- src/hb-subset.cc        |  2 +-
- 2 files changed, 7 insertions(+), 31 deletions(-)
+ src/hb-iter.hh | 3 ---
+ 1 file changed, 3 deletions(-)
 
-commit 27b2093009745b6c30663605f45ac95deb1562cc
+commit 22da12318a3e9fd9955f24fd0092de1a4a1a940d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 15:32:57 2019 -0700
+Date:   Wed Apr 24 10:53:16 2019 -0400
 
-    [map] Return rvalues from keys()/values()
+    [map] Fix TODO
 
- src/hb-algs.hh | 7 +++++++
- src/hb-map.hh  | 2 ++
- 2 files changed, 9 insertions(+)
+ src/hb-map.hh           | 6 ++----
+ src/hb-meta.hh          | 6 ++++++
+ src/hb-ot-cff1-table.cc | 1 -
+ src/hb-ot-cff2-table.cc | 1 -
+ src/hb.hh               | 3 +--
+ 5 files changed, 9 insertions(+), 8 deletions(-)
 
-commit 372c5b97bfa3b744de1d017cf662607eb8a2fa6e
+commit 4c6136e976af4f7332f703f5a7625505ffc296b6
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 15:28:39 2019 -0700
+Date:   Wed Apr 24 10:44:24 2019 -0400
 
-    [map] Fix bots
-    
-    Older compilers don't like calling iter() from return-type decltype()
-    
-    ../src/hb-map.hh:226:12: error: cannot call member function 'decltype ((((+ hb_array(((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::items, (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask ? (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask + 1) : 0))) | hb_filter((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: is_real))) | hb_map((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: get_pair)))) hb_hashmap_t<K, V, kINVALID, vINVALID>::iter() const [with K = const hb_serialize_context_t::object_t*; V = unsigned int; K kINVALID = 0u; V vINVALID = 0u; decltype ((((+ hb_array(((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::items, (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask ? (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask + 1) : 0))) | hb_filter((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: is_real))) | hb_map((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: get_pair)))) = hb_map_iter_t<hb_filter_iter_t<hb_array_t<hb_hashmap_t<const hb_serialize_context_t::object_t*, unsigned int, 0u, 0u>::item_t>, bool (hb_hashmap_t<const hb_serialize_context_t::object_t*, unsigned int, 0u, 0u>::item_t::*)() const, const<anonymous struct>&, 0u>, hb_pair_t<const hb_serialize_context_t::object_t*, unsigned int> (hb_hashmap_t<const hb_serialize_context_t::object_t*, unsigned int, 0u, 0u>::item_t::*)() const, 0u>]' without object
-         + iter()
-                ^
-    ../src/hb-meta.hh:58:41: note: in definition of macro 'HB_AUTO_RETURN'
-     #define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
-                                             ^
+    [mutex] Remove TODO
 
- src/hb-map.hh | 10 ++++++----
- 1 file changed, 6 insertions(+), 4 deletions(-)
+ src/hb-mutex.hh | 2 --
+ 1 file changed, 2 deletions(-)
 
-commit a30482718491e3455365167e1c85981c8c0f542b
+commit 0268db11965d022883d5ef2ef828c0635165b7bd
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 15:08:10 2019 -0700
+Date:   Wed Apr 24 10:43:40 2019 -0400
 
-    [map] Add .values() iterator
+    [map] Use hb_invoke() with pointer-to-method
 
- src/hb-map.hh    | 6 +++++-
- src/test-iter.cc | 8 ++++++++
- 2 files changed, 13 insertions(+), 1 deletion(-)
+ src/hb-algs.hh   | 5 ++++-
+ src/hb-map.hh    | 4 ++--
+ src/test-algs.cc | 8 ++++++++
+ 3 files changed, 14 insertions(+), 3 deletions(-)
 
-commit 3c69505b3a7850b68a931849a2badb84b6b36d51
+commit 8f79a5750e8982f9ab73c0dc6a8534dffef74610
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 15:05:10 2019 -0700
+Date:   Wed Apr 24 10:32:49 2019 -0400
 
-    [map] Fix iter
+    [algs] Add more hb_forward<>()'s
 
- src/hb-map.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
 
-commit 5ceaafa5de8dff51fe91f7008a12ec9c304a1376
+commit 42526d1697e2449fa23741f84721dcf2ce688af7
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 14:59:25 2019 -0700
+Date:   Wed Apr 24 10:24:33 2019 -0400
 
-    [algs] Fix identity return type
+    [serialize] Fix SingleSubstFormat1 failure
 
- src/hb-algs.hh | 6 +++---
+ src/hb-ot-layout-gsub-table.hh | 6 +++---
  1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit f5705d7656817cbfdbc4479b1cb0be3af6f4abdf
+commit 6cc9707c9c0885a3133b7844f615cdcdaeccec18
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 14:46:55 2019 -0700
+Date:   Wed Apr 24 10:22:06 2019 -0400
 
-    Whitespace
+    [serialize] Rename
 
- src/hb-map.hh    | 10 +++++-----
- src/test-iter.cc | 11 +++++++----
- 2 files changed, 12 insertions(+), 9 deletions(-)
+ src/hb-serialize.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
 
-commit a17f0fa3a10a25959561582ae63ef2e5208647e2
+commit 085793d6cd35a1590a66712f39260030367490db
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 14:44:11 2019 -0700
+Date:   Wed Apr 24 10:15:59 2019 -0400
 
-    [meta] Capture rvalue-references in is_reference / remove_reference
+    Remove wrong TODOs
 
- src/hb-meta.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-ot-layout-gsubgpos.hh       | 2 +-
+ src/hb-ot-shape-complex-indic.cc   | 1 -
+ src/hb-ot-shape-complex-khmer.cc   | 4 ++--
+ src/hb-ot-shape-complex-myanmar.cc | 3 ++-
+ src/hb-ot-shape-complex-use.cc     | 4 ++--
+ 5 files changed, 7 insertions(+), 7 deletions(-)
 
-commit 7166bd563447a64eda05c66668bd4a178292bd79
+commit 915b9ea5f48d56df21419761477b2d4ba2843b54
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 14:24:57 2019 -0700
-
-    Minor
-
- src/hb-open-type.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-commit b827181ba1f539c990e1bd8fdd3559f1589c8d28
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 13:51:11 2019 -0700
+Date:   Wed Apr 24 10:07:19 2019 -0400
 
-    [map] tweak test-iter.cc
+    [serialize] Add c->check_assign()
+    
+    To check for assignment overflows.
 
- src/hb-map.hh    | 1 -
- src/test-iter.cc | 2 +-
- 2 files changed, 1 insertion(+), 2 deletions(-)
+ src/hb-open-type.hh            |  7 +++----
+ src/hb-ot-layout-gsub-table.hh |  2 +-
+ src/hb-serialize.hh            | 20 +++++++++++++-------
+ 3 files changed, 17 insertions(+), 12 deletions(-)
 
-commit 492af0f1bf1d7198b474fda2faca451908af267f
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 12:47:18 2019 -0700
+commit 00a00bc1f23c681d64fbd4df33582ec0165e337a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 24 10:01:30 2019 -0400
 
-    [map] add keys()
+    Fix two TODOs
 
- src/hb-map.hh    | 9 ++++++++-
- src/test-iter.cc | 4 ++++
- 2 files changed, 12 insertions(+), 1 deletion(-)
+ src/hb-ot-layout-gsub-table.hh | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
 
-commit ba60512813caafc2006b26214e95bbfe1c0e460a
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 12:09:10 2019 -0700
+commit 11ab889a8d743304c8ec17920e209a514f46739d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 24 09:55:24 2019 -0400
 
-    [map] add a test for iteration
+    Rename a few test programs
 
- src/hb-map.hh    | 2 +-
- src/test-iter.cc | 4 ++++
- 2 files changed, 5 insertions(+), 1 deletion(-)
+ src/Makefile.am                                    | 24 +++++++++++-----------
+ ...est-size-params.cc => test-gpos-size-params.cc} |  0
+ ...substitute.cc => test-gsub-would-substitute.cc} |  0
+ src/{test-name-table.cc => test-ot-name.cc}        |  0
+ 4 files changed, 12 insertions(+), 12 deletions(-)
 
-commit 183b8094b577dcb7f40b7fcd64b60d405845897a
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 11:40:31 2019 -0700
+commit 12017db0bfe62e7777e1ab6ba5b14729dcd4c351
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 24 09:24:38 2019 -0400
 
-    [map] add iteration
+    Move test code around
 
- src/hb-map.hh | 11 +++++++++++
- 1 file changed, 11 insertions(+)
+ src/test-algs.cc | 8 ++++++++
+ src/test-iter.cc | 9 ---------
+ 2 files changed, 8 insertions(+), 9 deletions(-)
 
-commit df237d2fe78086ad16bdbd2cc60639ae9ce909d6
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed May 8 14:17:14 2019 -0700
+commit 27377a7e287dd39e3f7caad5c1e0691ae381ccf8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 24 09:22:14 2019 -0400
 
-    [test] Add https://crbug.com/oss-fuzz/14641 testcase
-    
-    As 503748d fix
+    Rely on variadic parameter pack more
 
- ...-testcase-minimized-hb-subset-fuzzer-5676773460672512 | Bin 0 -> 2172 bytes
- 1 file changed, 0 insertions(+), 0 deletions(-)
+ src/hb-open-type.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
 
-commit 02ae2591d930563cec8c3c63086afb0a3a12c4aa
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Wed May 8 13:44:03 2019 -0700
+commit 3ad20c38ade76aca8aed024014977ecb5f2b636e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 24 09:09:00 2019 -0400
 
-    initialize return param subr_num in popSubrNum
-    
-    also snake_cased popSubrtNum and other surrounding function names
+    [serialize] Fix a few overflow TODO items
 
- src/hb-cff-interp-cs-common.hh | 15 ++++++++-------
- src/hb-subset-cff1.cc          |  4 ++--
- src/hb-subset-cff2.cc          |  4 ++--
- 3 files changed, 12 insertions(+), 11 deletions(-)
+ src/hb-open-type.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
 
-commit 503748d8a80dd5db450c8c4dc109f2b97049d989
+commit 175bdad8bff5b0e9732ab1fb97617a9293680fd4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 12:45:02 2019 -0700
+Date:   Tue Apr 23 23:57:11 2019 -0400
 
-    [name] Sanitize records for reals
-    
-    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14641
+    One more variadic parameter pack use
 
- src/hb-ot-name-table.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-aat-layout-common.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 5875d775e1253c0e14b900539c28c2de881da7aa
+commit 441cca235477a5399af214c9ac85320d4de69f0b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 12:25:34 2019 -0700
+Date:   Tue Apr 23 23:49:21 2019 -0400
 
-    [iter] Rename hb_iter_t() to hb_iter_type<> and add hb_item_type<>
+    Use hb_forward() when forwarding parameter pack
 
- src/hb-iter.hh | 18 ++++++++++--------
- 1 file changed, 10 insertions(+), 8 deletions(-)
+ src/hb-open-type.hh | 32 ++++++++++++++++----------------
+ src/hb-serialize.hh |  3 ++-
+ 2 files changed, 18 insertions(+), 17 deletions(-)
 
-commit bad16066392e4dbdd8490a4b1c70d1dcddcc8ec8
+commit 20f3134789f65b10f301c4635c9f80c2dda0fb97
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 12:11:52 2019 -0700
+Date:   Tue Apr 23 12:58:52 2019 -0400
 
-    [map] Make .has() optionally return value
+    Use variadic templates in OffsetTo<> and various ArrayOf<>s
 
- src/hb-map.hh | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
+ src/hb-open-type.hh | 145 ++++++++++++++++++----------------------------------
+ 1 file changed, 49 insertions(+), 96 deletions(-)
 
-commit 750d5af48e38627c3c84a2f3857a7ee602221e24
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 12:01:55 2019 -0700
+commit aa6692cb0079bbe1e003f211a321e8fe6a18ea94
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Apr 23 17:56:44 2019 +0100
 
-    Make compiler happy with -Og
+    Usermanual: update Makefile SGML list. Again.
 
- src/hb-cff-interp-cs-common.hh | 2 +-
- src/hb-ot-cmap-table.hh        | 6 +++---
- src/hb-ot-glyf-table.hh        | 2 +-
- src/hb-subset-glyf.cc          | 4 ++--
- 4 files changed, 7 insertions(+), 7 deletions(-)
+ docs/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit cdb61eb0431d426f7152f975e89ee3ba4431083f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 11:00:18 2019 -0700
+commit 98c54cdef8b0615a95382bdba4ecd008789f8c9e
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Apr 23 17:48:42 2019 +0100
 
-    [iter] Accept pointer in hb_iter() and hb_iter_t()
+    Usermanual: add chapter on object model.
 
- src/hb-iter.hh   | 4 ++--
src/test-iter.cc | 3 +++
- 2 files changed, 5 insertions(+), 2 deletions(-)
+ docs/harfbuzz-docs.xml           |   1 +
docs/usermanual-object-model.xml | 249 +++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 250 insertions(+)
 
-commit c93eeba9b21cb8f8ba64ebaf284bf9c8a8544886
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 10:56:09 2019 -0700
+commit 64ca2ffa4c88b961dcbd9d06be8ac7dd80ad8182
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 23 01:10:46 2019 -0700
 
-    [iter] Accept pointer in hb_map()
+    Fix clang's -Wmain complain (#1678)
 
- src/hb-iter.hh   | 4 ++--
- src/test-iter.cc | 7 ++++++-
- 2 files changed, 8 insertions(+), 3 deletions(-)
+ src/test-iter.cc | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
 
-commit 4c9e0c37a34e8355d752af39507b310f473bffa5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 10:40:39 2019 -0700
+commit 7c218351ab45c41e48147b2196393357f7b551d4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 23 12:40:29 2019 +0430
 
-    [serialize] LangSys subset->copy
+    .editorconfig, minor
+    
+    still doesn't work with vscode
 
src/hb-ot-layout-common.hh | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
.editorconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 50dc3e7d9f4f290c7353313c5e5f888cb7c4846d
+commit 25dd88efc6521b972babe1067c0de1b9d4f5dbe5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 10:35:02 2019 -0700
+Date:   Mon Apr 22 17:45:23 2019 -0400
 
-    Add hb_iota()
+    Err, fix hb_invoke() variadic
 
- src/hb-iter.hh   | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
- src/test-iter.cc | 10 ++++++++++
- 2 files changed, 61 insertions(+)
+ src/hb-algs.hh   | 6 +++---
+ src/test-iter.cc | 5 ++++-
+ 2 files changed, 7 insertions(+), 4 deletions(-)
 
-commit aa4ac13f0be34bba66b00d04fd7806c474ff59c0
+commit c862a532df0bc3ce0b47f3fde9bf1dd300ff8bee
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 10:02:30 2019 -0700
+Date:   Mon Apr 22 17:32:19 2019 -0400
 
-    [iter] Actually fix previous commit
-    
-    The iter objects shouldn't not be const.  D'oh.
+    Add variadic arguments to hb_invoke()
 
- src/hb-iter.hh | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
+ src/hb-algs.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
 
-commit a66598e0306fe80063c5d6a678bbca4a931bc4d4
+commit 9c724e48a2f5d61c31c79f0b4660f08e5d07db10
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 09:56:29 2019 -0700
+Date:   Mon Apr 22 15:37:10 2019 -0400
 
-    [iter] For ref-qualified variants
+    [serializer] Add err_propagaged_error()
 
- src/hb-iter.hh | 14 ++++++++++----
- 1 file changed, 10 insertions(+), 4 deletions(-)
+ src/hb-serialize.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
 
-commit fa576ce1874fd886688bf3f16b714d86aebb07ec
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 09:53:58 2019 -0700
+commit ae8da4b61b4cc3b55242b85fe7c63393d65bd6cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 22 15:25:11 2019 -0400
 
-    Update README.md
+    Minor
 
README.md | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
src/hb-iter.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
 
-commit d109c9e767ff3198d51e23a7ac8931d0bc4d5d72
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 09:53:29 2019 -0700
+commit 24da1d08603a7fe262ae88d687986efc0343956f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 22 15:20:25 2019 -0400
 
-    Update README.md
+    Use variadic template args for propagate_error()
+    
+    Let's see if bots happy.
+    
+    Not sure where else we can use these.  Mm.  Maybe in hb_invoke().
 
README.md | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
src/hb-serialize.hh | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
 
-commit 4063181791d6b3efb35e7c748dee12273e64ebd4
-Author: rsheeter <rsheeter@google.com>
-Date:   Wed May 8 09:47:34 2019 -0700
+commit 9bab398462fa598047f34fd6d23e07a91305b1b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 22 15:16:35 2019 -0400
 
-    [docs] add fuzzer instructions (courtesy of Garret)
+    Simplify propagate_error()
 
- TESTING.md | 10 ++++++++++
- 1 file changed, 10 insertions(+)
+ src/hb-serialize.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
 
-commit 00946ca3aa45f109c455871ce89c5872fd243624
-Author: Roderick Sheeter <rsheeter@rsheeter-macbookpro2.roam.corp.google.com>
-Date:   Wed May 8 09:42:35 2019 -0700
+commit ecac94ca763e80d217ba5db429745e8882b38464
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 21 12:27:32 2019 -0400
 
-    [docs] add sample commands for test exec
+    [docs] Remove fdo repo
+    
+    Has not been updated.
 
- README.md  |  4 ++++
- TESTING.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 51 insertions(+)
+ docs/harfbuzz-docs.xml | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
 
-commit 8479eb5955c93cbc8951d0319b2fe43ff19cc403
+commit 8ed7655be89c658219ab702e34a79734ba0efb73
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 09:48:55 2019 -0700
+Date:   Sun Apr 21 12:25:19 2019 -0400
 
-    [iter] Fix hb_sink() to accept rvalue
+    Update AUTHORS / COPYING
 
- src/hb-iter.hh   | 2 +-
- src/test-iter.cc | 4 ++++
+ AUTHORS | 3 +++
+ COPYING | 3 ++-
  2 files changed, 5 insertions(+), 1 deletion(-)
 
-commit 710d459acac88fd784d4ead0ba75b9aa623c48d4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 09:33:09 2019 -0700
+commit a464cbeecea73aeaa03c262f49fed8584057d9bb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Apr 19 12:14:09 2019 -0700
 
-    [iter] Default predicates to hb_identity instead of hb_bool
+    Revert "Add harfbuzzjs build configuration (#1636)" (#1675)
     
-    The bool conversion happens after predicate is called automatically.
+    This reverts commit 694cb1beeefe1c54b2e613d2d566a21e248a2c9c.
 
src/hb-iter.hh | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
CMakeLists.txt | 35 -----------------------------------
+ 1 file changed, 35 deletions(-)
 
-commit fe14a4000a58528878bcc75fde0972de2b779316
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 09:32:19 2019 -0700
+commit 694cb1beeefe1c54b2e613d2d566a21e248a2c9c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Apr 19 07:51:04 2019 -0700
 
-    Adjust hb_all/any/none
+    Add harfbuzzjs build configuration (#1636)
 
- src/hb-iter.hh   | 18 +++++++++---------
- src/test-iter.cc | 10 ++++++----
- 2 files changed, 15 insertions(+), 13 deletions(-)
+ CMakeLists.txt | 35 +++++++++++++++++++++++++++++++++++
+ 1 file changed, 35 insertions(+)
 
-commit 4a101d8ffccd6f907f16ef190125ded5e27e0d8b
+commit 42f4bd6b801f96fc33a365db8ab6390e74cef05a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 09:16:33 2019 -0700
+Date:   Thu Apr 18 19:04:59 2019 -0400
 
-    Add hb_match
+    Minor warning fix again
 
- src/hb-algs.hh | 30 +++++++++++++++++++++++++++++-
- 1 file changed, 29 insertions(+), 1 deletion(-)
+ src/hb-ot-map.cc        | 20 ++++++++++----------
+ test/api/test-ot-face.c |  2 +-
+ 2 files changed, 11 insertions(+), 11 deletions(-)
 
-commit 26adefd9eaf4bc1d80b1ffececf0d86f3308f9ee
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 09:14:44 2019 -0700
+commit 267fb9c7163e61c9cdbafbb16005bc659ec5a4a2
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Apr 18 15:17:10 2019 -0700
 
-    [algs] Try f[v] in hb_get() as last resort
+    add spaces
 
- src/hb-algs.hh | 10 ++++++++--
- 1 file changed, 8 insertions(+), 2 deletions(-)
+ src/hb-ot-cff1-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 0601a19d38b2b0fc5dd36fd821af634a49322ebf
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed May 8 07:47:36 2019 -0700
+commit ba0386060d92dffcde2d14f9e523a46ea8713de2
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Apr 18 14:53:35 2019 -0700
 
-    Fix a few more double-pomotion errors
+    fix oss-fuzz issue 14345
 
- src/hb-coretext.cc | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-ot-cff1-table.hh                                 |   3 ++-
+ ...testcase-minimized-hb-subset-fuzzer-5923632099885056 | Bin 0 -> 25847 bytes
+ 2 files changed, 2 insertions(+), 1 deletion(-)
 
-commit 2ba984fcbbef4561d35c3a2c502610c38b26f4fb
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 23:28:22 2019 -0700
+commit 63a2108480cca2d9c1a2f61d6642d70496f1a5e3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Apr 18 13:54:58 2019 -0700
 
-    Fix signed comparison on 32bit
+    silence MVC warnings 3rd attempt
 
- src/hb-sanitize.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-cff1-table.cc | 5 +++--
+ src/hb-ot-cff2-table.cc | 9 +++++----
+ 2 files changed, 8 insertions(+), 6 deletions(-)
 
-commit dfc57802450360f06026668b7b61495aaa2d1943
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 23:26:09 2019 -0700
+commit 705dde57fe7bd5aafe93f284db2aa809aad932dc
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Apr 18 11:32:10 2019 -0700
 
-    Fix more double-promotion errors
-    
-    WHy do only some of the clang bots catch this I have no idea :(.
+    silence MVC warnings 2nd attempt
 
- src/hb-aat-layout-trak-table.hh |  4 ++--
- src/hb-font.hh                  |  2 +-
- src/hb-open-type.hh             |  4 ++--
- src/hb-ot-color-cbdt-table.hh   | 12 ++++++------
- src/hb-ot-color-sbix-table.hh   | 10 +++++-----
- src/hb-ot-layout-gpos-table.hh  | 20 ++++++++++----------
- 6 files changed, 26 insertions(+), 26 deletions(-)
+ src/hb-ot-cff1-table.cc | 4 ++--
+ src/hb-ot-cff2-table.cc | 8 ++++----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
 
-commit c2c9d204fa5c2189e369726276a1c0e92e09a9ce
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 23:13:38 2019 -0700
+commit dd4c37529bcecee33d43015a852a3fcf9e978b7f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Apr 18 10:38:57 2019 -0700
 
-    Fix double-promotion warnings
-    
-    Make it an error.
+    silence MVC warnings
 
- src/hb-ot-var-fvar-table.hh | 12 ++++++------
- src/hb.hh                   |  1 +
- 2 files changed, 7 insertions(+), 6 deletions(-)
+ src/hb-cff-interp-common.hh | 2 +-
+ src/hb-ot-cff1-table.cc     | 4 ++--
+ src/hb-ot-cff2-table.cc     | 8 ++++----
+ 3 files changed, 7 insertions(+), 7 deletions(-)
 
-commit 2c7093ed01f417828d5521d983eae63042363197
+commit 518e6e07f29d9bb7e532313fb0af6177d8022ea5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 23:10:59 2019 -0700
+Date:   Thu Apr 18 12:21:25 2019 -0400
 
-    More tests
+    Minor
 
- src/test-algs.cc | 3 +++
- 1 file changed, 3 insertions(+)
+ src/hb-ot-map.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 56d2d0294b836ea1e2dea9e242ae72c99387d00a
+commit 91d958acc08cb99ddd3b656922e13497b9d1595d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 23:08:49 2019 -0700
+Date:   Thu Apr 18 10:04:10 2019 -0400
 
-    [algs] Sprinkle hb_min/max with hb-forward salad
+    [array] Simplify copy assignment/constructor
     
-    Let's see if fixes MSVC fail.  Though, the error doesn't make sense to me.
+    To fix bogus MSVC warnings:
     
-      hb-blob.cc
-    c:\projects\harfbuzz\src\hb-algs.hh(166): error C2440: 'return': cannot convert from 'unsigned int' to 'unsigned int &&' [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
-      c:\projects\harfbuzz\src\hb-algs.hh(166): note: You cannot bind an lvalue to an rvalue reference
-      c:\projects\harfbuzz\src\hb-algs.hh(174): note: see reference to function template instantiation 'T &&<unnamed-type-hb_min>::impl<T,unsigned int&>(T &&,T2) const' being compiled
-              with
-              [
-                  T=unsigned int,
-                  T2=unsigned int &
-              ]
+      c:\projects\harfbuzz\src\hb-array.hh(189): warning C4521: 'hb_array_t<Type>': multiple copy constructors specified [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+      c:\projects\harfbuzz\src\hb-array.hh(189): warning C4522: 'hb_array_t<Type>': multiple assignment operators specified [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
 
- src/hb-algs.hh | 10 ++++++----
- 1 file changed, 6 insertions(+), 4 deletions(-)
+ src/hb-array.hh | 29 +++++++++++++++++++----------
+ 1 file changed, 19 insertions(+), 10 deletions(-)
 
-commit bdbfdc92b58d5c9f8654e430075dab543d1ba394
+commit 693d91cd49fda3e728b59e6885bea8d7b01958ef
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 22:52:43 2019 -0700
+Date:   Wed Apr 17 17:59:39 2019 -0400
 
-    [iter] Add value and projection to hb_all/any/none
-    
-    Allows for eg, checking all values equal 2: hb_all (it, 2).
+    [serialize] Fix offset calculation
 
- src/hb-iter.hh   | 24 ++++++++++++++++++------
- src/test-iter.cc | 10 +++++++++-
- 2 files changed, 27 insertions(+), 7 deletions(-)
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit cf61acb9eaa2bb3fe479a9050116b4b96934e3ed
+commit db0c9a1485ae6ca7ca9af38a43504f1ae4ea09c8
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 22:45:01 2019 -0700
+Date:   Wed Apr 17 17:58:13 2019 -0400
 
-    [iter] Accept rvalues to hb_enumerate()
+    [subset] Assert offsets are zero during relocation
+    
+    If they're not, it's a bug in our subsetting logic somewhere.  So check.
 
- src/hb-iter.hh   | 2 +-
- src/test-iter.cc | 2 ++
- 2 files changed, 3 insertions(+), 1 deletion(-)
+ src/hb-serialize.hh | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit e8bd5fc3fa2cc5c5f8f254629553902aed3496ba
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 22:29:40 2019 -0700
+commit aa3ac59245a9f90c6636fbf6d3489d2b7caa4fd3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Apr 17 12:43:53 2019 -0700
 
-    [meta] Move hb_invoke from algs to meta
+    fix build
 
- src/hb-algs.hh | 31 -------------------------------
- src/hb-meta.hh | 32 ++++++++++++++++++++++++++++++++
- 2 files changed, 32 insertions(+), 31 deletions(-)
+ src/hb-ot-var-hvar-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c87488b46d1f302e1ad313c365e2cd440e60141a
+Merge: 49fe81fd c67a0d58
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Apr 17 12:07:15 2019 -0700
+
+    Merge branch 'master' into var-subset
+
+commit 49fe81fdeb236e10c1b525b34edb4ec8aaeac35f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Apr 17 11:48:12 2019 -0700
 
-commit af571dbffc12e6bb7a3146762d12bb4ac3f19bdc
+    updated api test results for HVAR/VVAR subset changes
+
+ test/api/fonts/AdobeVFPrototype.abc.otf               | Bin 6952 -> 6900 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nohints.otf        | Bin 6272 -> 6220 bytes
+ .../api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf | Bin 6152 -> 6100 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf        | Bin 6336 -> 6284 bytes
+ test/api/fonts/AdobeVFPrototype.ac.otf                | Bin 6460 -> 6408 bytes
+ test/api/fonts/AdobeVFPrototype.ac.retaingids.otf     | Bin 6464 -> 6416 bytes
+ .../fonts/SourceSansVariable-Roman.ac.retaingids.ttf  | Bin 3040 -> 2616 bytes
+ .../SourceSerifVariable-Roman-VVAR.ac.retaingids.ttf  | Bin 5288 -> 5296 bytes
+ 8 files changed, 0 insertions(+), 0 deletions(-)
+
+commit efbba7ad26dda5930f5d1bd5292304835432f504
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 21:39:20 2019 -0700
+Date:   Wed Apr 17 11:00:08 2019 -0400
 
-    [meta] Replace most hb_enable_if with hb_requires
+    [serializer] Add copy()
     
-    They do absolutely same thing.  hb_requires is to encode constraints,
-    whereas hb_enable_if is for more conditional enabling.
+    Calls obj.copy() or obj.operator=() in that order.
 
- src/hb-iter.hh             | 63 +++++++++++++++++++++-------------------------
- src/hb-open-type.hh        |  6 ++---
- src/hb-ot-layout-common.hh |  6 ++---
- src/test-iter.cc           |  6 ++---
- 4 files changed, 37 insertions(+), 44 deletions(-)
+ src/hb-serialize.hh | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
 
-commit 6fa1f38070e710b2f80a836bd633b6ab33e1bc80
+commit c67a0d581fcc50df5563c23060b4fcd9dac4c87c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 21:33:26 2019 -0700
+Date:   Wed Apr 17 10:20:02 2019 -0400
 
-    [algs] Accept varargs in hb_min/max
+    Add HB_RETURN
 
- src/hb-algs.hh   | 24 +++++++++++++++++++++---
- src/test-algs.cc |  8 ++++++++
- 2 files changed, 29 insertions(+), 3 deletions(-)
+ src/hb-algs.hh | 13 ++++++-------
+ src/hb-meta.hh | 34 ++++++++++++++++++++--------------
+ 2 files changed, 26 insertions(+), 21 deletions(-)
 
-commit 1ad07080c3ea7f6a1b3cb247529ec0c78575a6d3
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 21:00:23 2019 -0700
+commit 6745a600bfec13b3f5468b3d31bab7d82b1e61ce
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Apr 16 17:29:34 2019 -0400
 
-    Rename
+    Comment out ot_languages where fallback suffices
 
- src/hb-algs.hh | 24 ++++++++++++------------
- 1 file changed, 12 insertions(+), 12 deletions(-)
+ src/gen-tag-table.py   |  15 +-
+ src/hb-ot-tag-table.hh | 443 +++++++++++++++++++++++++------------------------
+ src/hb-ot-tag.cc       |  19 ++-
+ test/api/test-ot-tag.c |   5 +-
+ 4 files changed, 255 insertions(+), 227 deletions(-)
 
-commit 83e3eabd84e2b53c696768d1357a6a259bcd3576
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 20:58:43 2019 -0700
+commit 5daeff3e68e4e202effb152f52702a044c09f386
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Apr 17 09:11:44 2019 -0400
 
-    Whitespace
+    Fix "hb_script_" doc typo
 
- src/hb-aat-layout-common.hh     |  2 +-
- src/hb-aat-layout-kerx-table.hh |  2 +-
- src/hb-aat-layout-morx-table.hh |  2 +-
- src/hb-algs.hh                  |  6 +++---
- src/hb-dispatch.hh              |  2 +-
- src/hb-open-type.hh             | 18 +++++++++---------
- src/hb-ot-kern-table.hh         |  4 ++--
- src/hb-ot-layout-common.hh      |  2 +-
- src/hb-ot-layout-gpos-table.hh  | 16 ++++++++--------
- src/hb-ot-layout-gsub-table.hh  | 14 +++++++-------
- src/hb-ot-layout-gsubgpos.hh    |  8 ++++----
- src/hb-sanitize.hh              |  6 +++---
- src/hb-serialize.hh             | 12 ++++++------
- src/hb-subset.hh                |  6 +++---
- 14 files changed, 50 insertions(+), 50 deletions(-)
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 2b9402a86a4e37e6386f8028bdf3789ae262a4c4
+commit 6916b77863cd5ce492a274eb85f196f2152fbb96
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 20:55:33 2019 -0700
+Date:   Tue Apr 16 18:33:51 2019 -0400
 
-    Use universal references in hb_min/max
+    One more auto return type
 
- src/hb-algs.hh | 4 ++--
+ src/hb-iter.hh | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 41248cce0e32653227a83eb4e42ccf793f040fc2
+commit 5b33427f2c4d596a12f05ffebebfd68655fd63eb
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 20:54:31 2019 -0700
+Date:   Tue Apr 16 18:28:17 2019 -0400
 
-    Remove MIN/MAX in favor of hb_min/hb_max
+    Rename HB_AUTO_RETURN_EXPR to HB_AUTO_RETURN
 
- src/hb-aat-layout-common.hh      |  8 ++++----
- src/hb-aat-layout-feat-table.hh  |  2 +-
- src/hb-aat-layout-kerx-table.hh  |  2 +-
- src/hb-aat-layout-morx-table.hh  | 18 +++++++++---------
- src/hb-algs.hh                   | 14 +++++---------
- src/hb-array.hh                  |  4 ++--
- src/hb-blob.cc                   |  2 +-
- src/hb-buffer-serialize.cc       | 32 ++++++++++++++++----------------
- src/hb-buffer.cc                 |  4 ++--
- src/hb-buffer.hh                 |  2 +-
- src/hb-common.cc                 | 20 ++++++++++----------
- src/hb-coretext.cc               |  6 +++---
- src/hb-debug.hh                  |  2 +-
- src/hb-directwrite.cc            |  2 +-
- src/hb-ft.cc                     |  2 +-
- src/hb-iter.hh                   |  2 +-
- src/hb-open-file.hh              |  2 +-
- src/hb-open-type.hh              |  2 +-
- src/hb-ot-cmap-table.hh          |  8 ++++----
- src/hb-ot-color-cbdt-table.hh    |  6 +++---
- src/hb-ot-color-cpal-table.hh    |  2 +-
- src/hb-ot-color-sbix-table.hh    |  2 +-
- src/hb-ot-glyf-table.hh          | 14 +++++++-------
- src/hb-ot-hmtx-table.hh          |  2 +-
- src/hb-ot-layout-gpos-table.hh   |  2 +-
- src/hb-ot-layout-gsub-table.hh   |  4 ++--
- src/hb-ot-layout-gsubgpos.hh     |  6 +++---
- src/hb-ot-layout.cc              |  2 +-
- src/hb-ot-map.cc                 |  8 ++++----
- src/hb-ot-post-table.hh          |  2 +-
- src/hb-ot-shape-complex-indic.cc |  8 ++++----
- src/hb-ot-shape-complex-use.cc   |  2 +-
- src/hb-ot-shape.cc               |  4 ++--
- src/hb-ot-tag.cc                 |  2 +-
- src/hb-ot-var-avar-table.hh      |  2 +-
- src/hb-ot-var-fvar-table.hh      | 18 +++++++++---------
- src/hb-sanitize.hh               |  4 ++--
- src/hb-uniscribe.cc              |  2 +-
- 38 files changed, 111 insertions(+), 115 deletions(-)
+ src/hb-algs.hh | 34 +++++++++++++++++-----------------
+ src/hb-meta.hh |  8 ++++----
+ 2 files changed, 21 insertions(+), 21 deletions(-)
 
-commit 5c0f62adc969696b46c1ceb57cd3c2fa408eb94f
+commit da293b0e59a0d6c47e9b3a7807115a168a0a5c94
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 17:23:46 2019 -0700
+Date:   Tue Apr 16 18:27:25 2019 -0400
 
-    [serializer] Accept pointer & reference in more methods
+    Use HB_AUTO_RETURN_EXPR in hb_min/max
 
- src/hb-serialize.hh | 39 ++++++++++++++++++++++++---------------
- 1 file changed, 24 insertions(+), 15 deletions(-)
+ src/hb-algs.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
 
-commit 839618de3b3da285e8753b6ca6d767e9a483bfde
+commit 0241a40f2aff43aba045fb7de4a2c3e5f1e9626a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 17:21:27 2019 -0700
+Date:   Tue Apr 16 18:26:30 2019 -0400
 
-    [serializer] Minor
+    Use auto return type for hb_first/hb_second
 
- src/hb-serialize.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
 
-commit 035b818e34bbd2d5c1f65328c9847c845d74d919
+commit fe30fcd228ff95be1f169f580b30184c8511d1c3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 17:21:18 2019 -0700
+Date:   Tue Apr 16 17:34:06 2019 -0400
 
-    [meta] Fix addressof()
+    Use hb_deref_pointer() to reduce number of overloads
 
- src/hb-meta.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh | 27 ++++++++++-----------------
+ src/hb-meta.hh | 36 +++++++++++++++++++-----------------
+ 2 files changed, 29 insertions(+), 34 deletions(-)
 
-commit 7654ebe3a51c98b4d3bf6fb11779024f1c770962
+commit c918a6706fa759696569ad6dcaae03fed76306bc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 16:53:03 2019 -0700
+Date:   Tue Apr 16 17:28:18 2019 -0400
 
-    Whitespace
+    Properly prioritize hb_hash()
 
- src/hb-algs.hh | 30 ++++++++++++++++++++----------
- src/hb-iter.hh | 39 ++++++++++++++++++++++++++-------------
- src/hb-meta.hh | 11 ++++++-----
- 3 files changed, 52 insertions(+), 28 deletions(-)
+ src/hb-algs.hh | 46 +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
 
-commit 95426ea983bde01fadf4681926cb77e3b3c0d40a
+commit 75fd845a4abccc2596f0e1fe2294f936199e61f3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 15:56:51 2019 -0700
+Date:   Tue Apr 16 17:22:29 2019 -0400
 
-    Add comment
+    Move around
 
- src/hb-open-type.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-algs.hh | 25 ++++++++++++-------------
+ 1 file changed, 12 insertions(+), 13 deletions(-)
 
-commit e33ad252222481a6078a8bb423505e713b081313
+commit 973717175d46d62471772318bb0b607070c53ec7
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 15:46:24 2019 -0700
+Date:   Tue Apr 16 16:50:07 2019 -0400
 
-    [serialize] FeatureVariations subset->copy
+    Fix priorities
 
- src/hb-ot-layout-common.hh   | 6 +++---
- src/hb-ot-layout-gsubgpos.hh | 2 +-
- 2 files changed, 4 insertions(+), 4 deletions(-)
+ src/hb-algs.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
 
-commit fa8c4ba81175f671c3f39f1586d0a1d9067d9f89
+commit 54ece299bcb3436763cc4f3b6b0ca11de8133b28
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 14:26:03 2019 -0700
+Date:   Tue Apr 16 16:45:53 2019 -0400
 
-    Minor
+    Use type aliasing for meta-functions, ie. those returning a type
 
- src/hb-serialize.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-algs.hh   |  3 ++-
+ src/hb-array.hh  |  6 +++---
+ src/hb-atomic.hh |  2 +-
+ src/hb-blob.hh   |  2 +-
+ src/hb-common.cc |  2 +-
+ src/hb-ft.cc     |  2 +-
+ src/hb-iter.hh   |  2 +-
+ src/hb-meta.hh   | 12 ++++++------
+ src/hb-null.hh   |  6 +++---
+ 9 files changed, 19 insertions(+), 18 deletions(-)
 
-commit c09d6c58e99dba50f29a569e4c53916b5b507ef1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 14:09:00 2019 -0700
+commit 6cde814a360eaeab6755685cf7980887af3225d1
+Merge: 007bb3e0 1ce11b44
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Apr 16 11:35:07 2019 -0700
 
-    [iter] Require lvalue in operators that return reference
+    Merge branch 'master' into var-subset
 
- src/hb-iter.hh | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
+commit 007bb3e0d1478912f8006f4c440866b4628cc28f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Apr 16 10:33:51 2019 -0700
 
-commit 52f6c04c1e0eab2aaa0c7d817b212c01ba993fe9
+    retain-gids in HVAR/VVAR (unused deltas retained)
+
+ src/hb-ot-var-hvar-table.hh | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+commit 1ce11b44375dae74e8984ace1db4f08c51ac9c38
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Apr 16 10:04:45 2019 -0400
+
+    Reduce LangTag from 3 language system tags to 1
+
+ src/gen-tag-table.py   |   13 +-
+ src/hb-ot-tag-table.hh | 2078 ++++++++++++++++++++++++------------------------
+ src/hb-ot-tag.cc       |   22 +-
+ 3 files changed, 1053 insertions(+), 1060 deletions(-)
+
+commit 155e92f25908830bef192304a2039853f6f5d4b5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 13:45:48 2019 -0700
+Date:   Tue Apr 16 11:35:09 2019 -0400
 
-    Minor
+    Reduce NullPool size
 
- src/hb-serialize.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-null.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 7c037bd2be2e794dfd882b806f684ad74c56dbb8
+commit 4fc2d2d7248171c386c39630aa2612f240669a58
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 13:37:43 2019 -0700
+Date:   Tue Apr 16 11:24:42 2019 -0400
 
-    [name] Clean up some more
+    [meta] Flesh out hb_invoke()
 
- src/hb-meta.hh          |  2 ++
- src/hb-ot-name-table.hh | 30 ++++++++++++++----------------
- 2 files changed, 16 insertions(+), 16 deletions(-)
+ src/hb-algs.hh | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+commit e03d9395aa79a29d731607bfd46533b700dc1a37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 16 11:20:16 2019 -0400
+
+    Comment
 
-commit f982b9d9f8d6b61efd2a3e89cc3d34923c1914b0
+ src/hb-algs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b8e763fd7140b3e298863e04053ec0f3c73a6a70
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 13:29:01 2019 -0700
+Date:   Tue Apr 16 10:50:22 2019 -0400
 
-    [name] Clean up serialize() API
+    [meta] Add hb_invoke()
 
- src/hb-ot-name-table.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/hb-algs.hh | 34 ++++++++++++++++++++++++++++++++--
+ src/hb-iter.hh |  2 +-
+ 2 files changed, 33 insertions(+), 3 deletions(-)
 
-commit 59ee61fddc76cd18f19f351bca7dd293eb610333
+commit a3fcb9a370ad7a3c205342f831d8529c81660466
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 13:26:15 2019 -0700
+Date:   Tue Apr 16 10:45:20 2019 -0400
 
-    [name] Use iterators more
+    [meta] Add HB_AUTO_RETURN_EXPR, HB_VOID_RETURN_EXPR, hb_priority, hb_has(), hb_get()
+    
+    The first three based on range-v3.
 
- src/hb-ot-name-table.hh | 46 +++++++++++++++-------------------------------
- src/hb-subset-plan.cc   |  3 +++
- 2 files changed, 18 insertions(+), 31 deletions(-)
+ src/hb-algs.hh | 46 ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-iter.hh |  7 ++++---
+ src/hb-meta.hh | 32 +++++++++++++++-----------------
+ src/hb.hh      |  2 +-
+ 4 files changed, 66 insertions(+), 21 deletions(-)
 
-commit 2eb7e0e0e923d096d2598133cacd6e5ee04a6a04
+commit ff68be31bf2ea82bf6bfcc6f993fb6806a895f97
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 12:45:38 2019 -0700
+Date:   Tue Apr 16 09:59:08 2019 -0400
 
-    [serialize] Minor
+    Add hb_void_tt<> ala std::void_t
 
- src/hb-serialize.hh | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
+ src/hb-meta.hh | 7 +++++++
+ 1 file changed, 7 insertions(+)
 
-commit 1c81cff2d3f9df2c18ffbdfff02ed418560480c1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 11:51:10 2019 -0700
+commit eb348fc5c00df2330f98ea769699ce586f97e1d6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Apr 15 16:24:22 2019 -0700
 
-    Fix signed-comparison error on 32bit
+    optimize out regions & region index lists & short count
 
- src/hb-serialize.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-layout-common.hh | 107 +++++++++++++++++++++++++++++++++------------
+ 1 file changed, 80 insertions(+), 27 deletions(-)
 
-commit 938de315756e08bd2b5fa816c7951640e5835b2e
+commit 89fea21697adfbba5057dd1d69c9806ee86e5ca8
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 11:47:02 2019 -0700
+Date:   Mon Apr 15 17:36:09 2019 -0400
 
-    Comment
+    Fix copyright
 
- src/hb-subset-glyf.cc | 2 +-
+ src/hb-iter.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 159fe962e90dd3b758ad10046b9d75cf87c1d4f3
+commit b7384c89e2685cec1b6761c918ec7d91e8ae3af8
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 11:46:11 2019 -0700
+Date:   Mon Apr 15 16:53:10 2019 -0400
 
-    [doc] Make header search more resilient
-    
-    How stupid to scan all files... Sigh.
+    [fuzzing] Run valgrind with --leak-check=full
 
docs/Makefile.am | 2 +-
test/fuzzing/run-shape-fuzzer-tests.py | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 9b05db33b54e6e5f0b4658f4c06e7fe563f8923b
+commit 3ff66c00292b20325b0d991dfd5eee80284cb9a8
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 11:39:44 2019 -0700
+Date:   Mon Apr 15 16:52:21 2019 -0400
 
-    [ragel] Regenerate ragel-generated files using ragel 7.0.0.11 May 2018
+    [fuzzing] Fail if valgrind is requested but not found
 
- src/hb-buffer-deserialize-json.hh          | 1051 +++++------
- src/hb-buffer-deserialize-text.hh          | 1009 +++++------
- src/hb-ot-shape-complex-indic-machine.hh   | 2678 ++++++++++++++++------------
- src/hb-ot-shape-complex-khmer-machine.hh   |  709 ++++----
- src/hb-ot-shape-complex-myanmar-machine.hh |  820 +++++----
- src/hb-ot-shape-complex-use-machine.hh     | 1144 ++++++------
- 6 files changed, 3959 insertions(+), 3452 deletions(-)
+ test/fuzzing/run-shape-fuzzer-tests.py | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit 521262b236dacf7b2b64e0a1d3c79d6a10b07063
+commit 07776b60965d503dfb7fb5c611397e40759b0bdc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 11:08:08 2019 -0700
+Date:   Mon Apr 15 16:43:34 2019 -0400
 
-    [subset] Add TODO
+    More tweaks to previous commit
+    
+    Delete assignment operator of OffsetTo<> instead of Offset<>.
+    
+    In simple ArrayOf<>::sanitize() assert that Type has assignment operator.
+    Ideally we should SFINAE this and fallback to calling Type::sanitize()
+    if assignment operator is not available.  But we don't have a case of
+    that in the codebase.
 
- src/hb-subset.cc | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-open-file.hh |  4 ++--
+ src/hb-open-type.hh | 16 +++++++++++-----
+ 2 files changed, 13 insertions(+), 7 deletions(-)
 
-commit e6a622b5b202533d64f83e71d7ff8a8104d46e26
+commit 699de689e9aa2246ba9207c07140ccd564f5ec20
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 11:06:43 2019 -0700
+Date:   Mon Apr 15 16:00:20 2019 -0400
 
-    [serialize] Enable bias assertion
+    Delete default assignment operator Offset<>
 
- src/hb-serialize.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-open-type.hh        |  3 +++
+ src/hb-ot-cmap-table.hh    |  2 +-
+ src/hb-ot-layout-common.hh | 14 +++++++-------
+ 3 files changed, 11 insertions(+), 8 deletions(-)
 
-commit 530ddbbc320bd24b4902ee6d49bf80242a591794
+commit 02d864aa26359b7f057e2aa81404309e17180d47
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 11:05:51 2019 -0700
+Date:   Mon Apr 15 15:39:03 2019 -0400
 
-    [serialize] Use range-based loop
+    Add HB_FUNCOBJ()
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1651
 
- src/hb-serialize.hh | 15 ++++++---------
- 1 file changed, 6 insertions(+), 9 deletions(-)
+ src/hb-algs.hh | 28 +++++++++++++++-------------
+ src/hb-iter.hh | 56 ++++++++++++++++++++++++++++----------------------------
+ src/hb-meta.hh | 22 +++++++++++++---------
+ src/hb.hh      |  7 +++++++
+ 4 files changed, 63 insertions(+), 50 deletions(-)
 
-commit 0987c4204fae66f80224c6f01d9c5dc3abe809e0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 11:01:02 2019 -0700
+commit 60be1450ad04612a6c2a6116036dbf3e436018de
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Apr 15 18:05:14 2019 +0100
 
-    [name] Remove dead code
+    [Usermanual]: fix Tamil error in Why-do-I-need-a-shaping-engine section.
 
src/hb-ot-name-table.hh | 88 +------------------------------------------------
- 1 file changed, 1 insertion(+), 87 deletions(-)
docs/usermanual-what-is-harfbuzz.xml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 5ac4ab686809be9352e91bc3213e1edf3ba66a93
+commit 38b1d0b9b2e798dd808a816a397323ed7ba697ab
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 16:29:07 2019 -0700
+Date:   Mon Apr 15 12:44:31 2019 -0400
 
-    [subset] fix for name table serializing with new serializer machinery
+    Move static const to post-struct for a function object
+    
+    Just sending this to bots to see if all happy, then turn it into macro and
+    apply everywhere.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1651
 
- src/hb-ot-name-table.hh            |   8 ++++++--
- test/api/fonts/nameID.expected.ttf | Bin 170696 -> 2388 bytes
- 2 files changed, 6 insertions(+), 2 deletions(-)
+ src/hb-algs.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit c548fcedc404c03442c042059a71194d97d23bb6
+commit 19e800c9d881ec016ab2e5fcaadab55ab5188398
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 16:29:07 2019 -0700
+Date:   Mon Apr 15 12:07:00 2019 -0400
 
-    [WIP] [name] Port to fancy serializer machinery
+    Ugh.  Another try, to unbreak gcc this time!
+    
+    Jenga.
 
- src/hb-ot-name-table.hh | 18 +++++++++++-------
- 1 file changed, 11 insertions(+), 7 deletions(-)
+ src/hb-subset.cc | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
 
-commit fa2d97161f8b7de3d7a70e06d41b6f7e154012ad
+commit 3a88f55c15b625a0ad10fbfadf4562bcbb41ae53
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 00:34:50 2019 -0700
+Date:   Mon Apr 15 11:59:57 2019 -0400
 
-    Remove use of deprecated implicit copy/move assignment operators
-    
-    By removing custom copy constructor.
+    Move location of HB_UNUSED to make MSVC happy
 
- src/hb-meta.hh | 2 --
- 1 file changed, 2 deletions(-)
+ src/hb-subset.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 45f5e56236912359d0ac72310dcdba9259cfee66
+commit 1ae265888e144328dbf1df796d379bf742c4151a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 00:33:32 2019 -0700
+Date:   Mon Apr 15 11:31:40 2019 -0400
 
-    Warn on -Wdeprecated
+    Fix gcc warning
 
- src/hb.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-array.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
 
-commit c3e0eafc80481f8c16516fdae1841c563e7253d4
+commit c0ea37b557f53b50094042f11fe2611b1b30d725
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue May 7 12:04:00 2019 +0430
+Date:   Mon Apr 15 00:34:04 2019 +0430
 
-    [ci] Upgrade Ubuntu 17.10 bots to 19.04
+    [ci] Fix macOS glib issue
 
  .circleci/config.yml | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 8903040fcd09e7d7ad5112ac2a583718bb85795d
+commit ad126036643e44a98c4c42d2a2a4a3b4a3649937
+Merge: 341b70a3 47e538a3
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Apr 14 15:42:42 2019 +0100
+
+    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz
+
+commit cd9889cac3ac3b271f7335f3e94acc4667a59b40
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Apr 14 15:33:56 2019 +0100
+
+    Docs: update and extended GTK-Doc comments for hb-ot-math.
+
+ src/hb-ot-math.cc | 133 ++++++++++++++++++++++++++++++++----------------------
+ src/hb-ot-math.h  |  21 +++++++++
+ 2 files changed, 99 insertions(+), 55 deletions(-)
+
+commit 3f74b7a14bffb8e91cd98edd0c3ddf0b0ddc169a
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Apr 14 15:20:56 2019 +0100
+
+    Docs: Regularize GTK-Doc comments for hb-ot-color.
+
+ src/hb-ot-color.cc | 136 ++++++++++++++++++++++++++++++-----------------------
+ src/hb-ot-color.h  |   6 +--
+ 2 files changed, 80 insertions(+), 62 deletions(-)
+
+commit 47e538a35f9072e5775a65e2bf110ae895818321
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 00:13:11 2019 -0700
+Date:   Fri Apr 12 22:50:22 2019 -0400
 
-    Actually make it work
+    Add HB_NO_SUBSET_LAYOUT
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-iter.hh | 2 ++
- src/hb-meta.hh | 6 ++++--
- 2 files changed, 6 insertions(+), 2 deletions(-)
+ src/hb-subset.cc | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
 
-commit 025eaa3c81214cdb20f2f588bab665512d21507c
+commit a98e4068e76d50bd9562d85a452b56e681f1d62b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 00:05:37 2019 -0700
+Date:   Fri Apr 12 22:42:44 2019 -0400
 
-    [iter] Make filter/map copyable
+    Revert "Hide symbols in hb-iter"
+    
+    This reverts commit 98f14c4cdb837a962083a6702f401d41b4c1ec5c.
+    
+    Same as previous commit.
 
- src/hb-iter.hh   | 18 +++++++++---------
- src/test-iter.cc |  4 ++--
- 2 files changed, 11 insertions(+), 11 deletions(-)
+ src/hb-iter.hh | 88 +++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 44 insertions(+), 44 deletions(-)
 
-commit 03a68165d8296ed5cc0eb2434500381419409e79
+commit dab92bdd4623aa7dac8eb00b14131566d75d095e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue May 7 00:03:35 2019 -0700
+Date:   Fri Apr 12 22:39:38 2019 -0400
 
-    [meta] Add hb_reference_wrapper<>
+    Revert "Hide more symbols"
+    
+    This reverts commit 2e86d50915cf1a791da9acb95245aa820a3d70f4.
     
-    Functionality kinda superset of std:: counterpart.
+    I think the setup that caused me to do this is faulty and not hiding inlines.
 
- src/hb-meta.hh | 21 +++++++++++++++++++++
- 1 file changed, 21 insertions(+)
+ src/hb-blob.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 0bf86d9c5dcb0de206b38c3cf1824d2254376f37
+commit 98f14c4cdb837a962083a6702f401d41b4c1ec5c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 6 23:39:26 2019 -0700
+Date:   Fri Apr 12 18:11:18 2019 -0400
 
-    Whitespace
+    Hide symbols in hb-iter
+    
+    Painful.  All template methods need to be explicitly hidden :(.
+    
+    Maybe we should switch to -fvisibility=hidden pragma.
+    
+    A LOT more to go.
 
- src/hb-meta.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-iter.hh | 88 +++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 44 insertions(+), 44 deletions(-)
 
-commit 72eb91deb9eb7a08e38e100a3234518651fe4cb8
+commit 2e86d50915cf1a791da9acb95245aa820a3d70f4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 6 23:39:13 2019 -0700
+Date:   Fri Apr 12 18:07:42 2019 -0400
 
-    Add hb_ref()
+    Hide more symbols
     
-    Unused.
+    Exposed by:
+    
+    $ make -j5 CPPFLAGS="-O0" CXXFLAGS=-flto=thin LDFLAGS=-lc++ && ./check-symbols.sh
 
- src/hb-meta.hh | 10 ++++++++++
- 1 file changed, 10 insertions(+)
+ src/hb-blob.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 240f57e58d3b0161feb90621d5db9e2fc4d99b27
+commit caa20e4ef9dff61a86312daec5d5a1df27d95ff7
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 6 23:17:39 2019 -0700
+Date:   Fri Apr 12 17:59:18 2019 -0400
 
-    Rename hb_deref_pointer() to hb_deref()
+    Hide a few more symbols
+    
+    Exposed by:
+    
+    $ make CPPFLAGS=-O0
 
- src/hb-algs.hh      | 12 ++++++------
- src/hb-map.hh       |  2 +-
- src/hb-meta.hh      |  2 +-
- src/hb-serialize.hh |  2 +-
- 4 files changed, 9 insertions(+), 9 deletions(-)
+ src/hb-array.hh | 4 ++--
+ src/hb-meta.hh  | 6 +++---
+ 2 files changed, 5 insertions(+), 5 deletions(-)
 
-commit 0b1ca5a13b6921cb4d00f8651bb99fc7c7037ec2
+commit 95df00aec1996d521acdff6deff063ba98214fb9
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 6 23:04:32 2019 -0700
+Date:   Fri Apr 12 17:50:03 2019 -0400
 
-    [iter] Adjust hb_filter
+    Hide a few static methods
+    
+    Looks like static methods that do not get inlined end up exported.
+    We have a lot more.  Need to protect all at some point.  Wish there
+    was an easier way, like the visibility flag we pass that automatically
+    hides all inline methods.
+    
+    Was exposed by check-symbols.sh when compiling on OS X 10.14 with:
+    
+    $ make CPPFLAGS=-Oz CXXFLAGS=-flto=thin LDFLAGS=-lc++
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-aat-layout.hh           |  2 +-
+ src/hb-aat-map.hh              |  2 +-
+ src/hb-array.hh                |  2 +-
+ src/hb-coretext.cc             |  4 ++--
+ src/hb-open-file.hh            |  2 +-
+ src/hb-open-type.hh            |  3 ++-
+ src/hb-ot-cmap-table.hh        | 14 +++++++-------
+ src/hb-ot-layout-base-table.hh |  6 +++---
+ src/hb-ot-layout-gpos-table.hh |  8 ++++----
+ src/hb-ot-layout-gsub-table.hh |  8 ++++----
+ src/hb-ot-layout-gsubgpos.hh   |  2 +-
+ src/hb-ot-map.hh               |  4 ++--
+ src/hb-uniscribe.cc            |  4 ++--
+ 13 files changed, 31 insertions(+), 30 deletions(-)
 
-commit 4c2fd05ca5fa34303b986c34948b512d770ab8fe
+commit 2f4be4ba54b539fbadc31fc53bdcfca81d7db77a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 6 19:57:15 2019 -0700
+Date:   Fri Apr 12 16:21:58 2019 -0400
 
-    [iter] Implement range-based for loops
+    Add HB_NO_OPTIONS
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1648
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-array.hh            |  6 ++++
- src/hb-iter.hh             | 74 ++++++++++++++++++++++++++++++++++++++++++++--
- src/hb-ot-layout-common.hh | 14 +++++++++
- src/hb-set.hh              |  3 ++
- src/test-iter.cc           | 28 ++++++++++++++----
- 5 files changed, 118 insertions(+), 7 deletions(-)
+ src/hb-debug.hh | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit e261dc3a4043230ae1b4f56e2cc7d3133b7da4ca
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue May 7 01:24:55 2019 +0430
+commit 3e524bf77280e5f3cd0c4d7429d2a6a5ec49268d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Apr 12 12:48:48 2019 -0700
 
-    Ignore -Wc++11-compat as we require C++11 actually
+    fix VarData serialize to remove unused data sets
     
-    pollutes gcc bots logs https://circleci.com/gh/harfbuzz/harfbuzz/85395
+    add api test case for that
 
- src/hb.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-ot-layout-common.hh                         |  14 ++++++++++----
+ .../fonts/SourceSansVariable-Roman-modHVAR.abc.ttf | Bin 0 -> 3260 bytes
+ .../fonts/SourceSansVariable-Roman-modHVAR.ac.ttf  | Bin 0 -> 3032 bytes
+ test/api/test-subset-hvar.c                        |  21 +++++++++++++++++++++
+ 4 files changed, 31 insertions(+), 4 deletions(-)
 
-commit 9f9890e9e82c620e733d123f421f7c63d91ce8e1
+commit 079d2dcbb2607cda3daa497199090c5813a51de5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon May 6 12:16:51 2019 -0700
+Date:   Fri Apr 12 15:00:37 2019 -0400
 
-    Remove HB_NO_OPTIONS in favor of HB_NO_GETENV
+    Add HB_NO_NAME_TABLE_AAT
     
     Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-debug.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-name-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 36bb24f7b4dbbe171b945639bac749c46785e17c
+commit 60a58aa61c09cafd12c432fdc1f7325f2a6d44bd
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 5 10:14:17 2019 -0700
+Date:   Fri Apr 12 14:58:53 2019 -0400
 
-    [dispatch] Forward arguments in all dispatch multiplexers
+    Add HB_NO_OT_FONT_BITMAP
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-aat-layout-kerx-table.hh | 14 ++++-----
- src/hb-aat-layout-morx-table.hh | 14 ++++-----
- src/hb-ot-kern-table.hh         | 16 +++++-----
- src/hb-ot-layout-common.hh      |  6 ++--
- src/hb-ot-layout-gpos-table.hh  | 68 ++++++++++++++++++++---------------------
- src/hb-ot-layout-gsub-table.hh  | 58 +++++++++++++++++------------------
- src/hb-ot-layout-gsubgpos.hh    | 32 +++++++++----------
- 7 files changed, 104 insertions(+), 104 deletions(-)
+ src/hb-ot-font.cc | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit c14efb8e68e31fb7537bcfe5eea779c0830a0b0c
+commit 160c4d8b2d9f6c205b713236f043081e6dd532ee
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 5 09:54:58 2019 -0700
+Date:   Fri Apr 12 14:57:49 2019 -0400
 
-    Fix previous commit
+    Add HB_NO_OT_FONT_CFF
     
-    Priority should be given to specific over dispatch.  Broke sanitize before.
-    This fixes it, by moving prioritization to the context implementation, since
-    the correct priority cannot be done in the dispatch implementation.  Done
-    for subset and sanitize only, which need it.
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-aat-layout-common.hh  |  2 +-
- src/hb-dispatch.hh           | 10 +---------
- src/hb-ot-layout-gsubgpos.hh | 14 +++++++-------
- src/hb-sanitize.hh           | 16 +++++++++++++---
- src/hb-subset.hh             | 15 ++++++++++++---
- 5 files changed, 34 insertions(+), 23 deletions(-)
+ src/hb-ot-font.cc | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit b10f65933a77434bf8d68058793037f38a8ed5a6
+commit 35f3b97fac3b106d345a06a4970f6adce182797b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 5 09:23:35 2019 -0700
+Date:   Fri Apr 12 10:16:12 2019 -0400
 
-    [dispatch] Use functionality from previous commit
+    Add HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK
     
-    To remove a couple of unwanted wrapper methods
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-dispatch.hh             | 15 +++++++++------
- src/hb-open-type.hh            | 10 +++++-----
- src/hb-ot-layout-gpos-table.hh |  6 ------
- src/hb-ot-layout-gsub-table.hh |  6 ------
- src/hb-sanitize.hh             |  5 +++--
- src/hb-subset.hh               |  5 +++--
- 6 files changed, 20 insertions(+), 27 deletions(-)
+ src/hb-ot-shape-complex-hebrew.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
 
-commit ac350c92fd6b04845c6240a5f3b77ceaf29e51d0
+commit 414c5de26b34c0c53f6f4b5f00ddc8e1a3b62ac2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun May 5 09:10:46 2019 -0700
+Date:   Fri Apr 12 10:12:11 2019 -0400
 
-    [dispatch] Try obj.dispatch(c) before trying c->dispatch(obj)
+    Add HB_NO_OT_SHAPE_FALLBACK
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-aat-layout-common.hh  |  2 +-
- src/hb-dispatch.hh           | 13 +++++++++++++
- src/hb-ot-layout-gsubgpos.hh | 14 +++++++-------
- src/hb-sanitize.hh           |  2 +-
- src/hb-subset.hh             |  4 ++--
- 5 files changed, 24 insertions(+), 11 deletions(-)
+ src/hb-ot-shape-fallback.cc | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
 
-commit 0d5fd168f8e3c1202358a82161a28e407149b1b4
+commit fe0018f7ef804acefa729e888f5a9935e571079d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri May 3 10:37:32 2019 -0700
+Date:   Fri Apr 12 09:35:29 2019 -0400
 
-    Revert "[WIP] [name] Port to fancy serializer machinery"
-    
-    This reverts commit c7f366fbbb208d0a9103ac4ee4ac00ff726c31e4.
+    Add HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK
     
-    Don't know how it got to master!
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb-ot-name-table.hh | 18 +++++++-----------
- 1 file changed, 7 insertions(+), 11 deletions(-)
+ src/hb-ot-shape-complex-thai.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
 
-commit 72e3eba8f87e2a8b145a4f98e24499f0aafe099b
-Author: Cody Planteen <planteen@gmail.com>
-Date:   Thu May 2 13:03:15 2019 -0600
+commit 9ddbfa006d752f6ddd3610ff968f84cf18dec031
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Apr 12 09:33:25 2019 -0400
 
-    Add configuration option HB_NO_GETENV to disable use of getenv()
+    Add HB_NO_OT_LAYOUT_BLACKLIST
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
- src/hb.hh | 12 ++++++++++--
- 1 file changed, 10 insertions(+), 2 deletions(-)
+ src/hb-ot-layout.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
 
-commit c7f366fbbb208d0a9103ac4ee4ac00ff726c31e4
+commit 571fad4cf17d90434562d1b6f5d08b6f27343c7a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 16:29:07 2019 -0700
-
-    [WIP] [name] Port to fancy serializer machinery
+Date:   Thu Apr 11 17:54:38 2019 -0400
 
- src/hb-ot-name-table.hh | 18 +++++++++++-------
- 1 file changed, 11 insertions(+), 7 deletions(-)
+    Add HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
-commit 8855af38a8497d7788924d368baa9eeae4916940
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 16:26:06 2019 -0700
+ src/hb-ot-shape-complex-vowel-constraints.cc | 3 +++
+ 1 file changed, 3 insertions(+)
 
-    [name] Add NameRecord::copy()
+commit a90e4916df74f6f84ce78eb2a73b6f325e7e8617
+Merge: 94573702 3db22726
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Apr 11 15:57:32 2019 -0700
 
- src/hb-ot-name-table.hh | 10 ++++++++++
- 1 file changed, 10 insertions(+)
+    Merge branch 'master' into var-subset
 
-commit 097bb3f0af391dbb5d498df548b769f165f35c8a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 16:25:00 2019 -0700
+commit 3db227265bc0790ffd718bf265d245c78598a49d
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Apr 2 18:49:40 2019 +0100
 
-    [name] Minor changes
+    Update gtk-doc annotations for inout counts on various getter functions.
 
- src/hb-ot-name-table.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-ot-layout.cc | 122 ++++++++++++++++++++++++++++++----------------------
+ 1 file changed, 70 insertions(+), 52 deletions(-)
 
-commit 431b6e1c449582619169722e16b472e872b02d58
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 16:22:32 2019 -0700
+commit c08ddbd91b7f0fffe761638a2ee4893304b012db
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Mar 24 15:07:07 2019 +0000
 
-    [serialize] Disable assertion for now
+    [Docs] Minor edits to gtk-doc inline comment review.
 
- src/hb-serialize.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-layout.cc | 21 +++++++++++++--------
+ 1 file changed, 13 insertions(+), 8 deletions(-)
 
-commit 8a32c9eecbdc907415195eca9ebad47c8acf2df5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 16:20:18 2019 -0700
+commit af5230bce39020cf6fc87ee5e21cca3ba201a417
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Mon Mar 18 14:03:16 2019 +0000
 
-    [serialize] Misc getting copy() to work
+    [Docs] Minor; fix formatting for gtk-doc multiple-annotations.
 
- src/hb-open-type.hh | 16 +++++++++-------
- src/hb-serialize.hh | 26 ++++++++++++++++----------
- 2 files changed, 25 insertions(+), 17 deletions(-)
+ src/hb-ot-layout.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
 
-commit 7d497a3a92973d4cec14888b932091f49de1d190
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 16:20:03 2019 -0700
+commit 6c0a1e8cd67144d20c8b5fcad23953910eeeea51
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Mar 17 14:50:47 2019 +0000
 
-    [debug] Allow return_trace() to return any type
+    [Docs] Annotate gtk-doc formatting with some un-annotated (out)s.
 
- src/hb-debug.hh | 14 ++++++++------
- 1 file changed, 8 insertions(+), 6 deletions(-)
+ src/hb-ot-layout.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
 
-commit 49b1c763a0459d586b7f0aa86eadd13d21b24867
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 16:19:34 2019 -0700
+commit 5122805c740961d4fdfbff440ed68792b63d50ed
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Mar 17 14:43:06 2019 +0000
 
-    [test] Run "fonttools ttx" instead of "ttx"
+    [Docs] Fix gtk-doc formatting for (out) and (inout).
 
test/subset/run-tests.py | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
src/hb-ot-layout.cc | 108 ++++++++++++++++++++++++++--------------------------
+ 1 file changed, 54 insertions(+), 54 deletions(-)
 
-commit 91176d5b778b44172591e82ba84127e5eff1372d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 15:12:07 2019 -0700
+commit d3178aa52ae822ac6af606027ac8150ded0a2966
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sun Mar 17 14:27:27 2019 +0000
 
-    [serialize] Check offset base is within (possibly end of) object
+    [Docs] Fix gtk-doc references to 'kern' table functions, clarifying that GPOS is not examined.
 
- src/hb-serialize.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-ot-layout.cc | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
 
-commit 0f1a6ce8268b197732aab40069bbda57eddac2e0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 15:03:41 2019 -0700
+commit 3449031fad9dff7acedde7dceb0e47db708fc025
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sat Mar 16 15:38:08 2019 +0000
 
-    [name] Fix format of susbetted table to 0
+    [Docs] Add inline gtk-doc documentation of GDEF glyph classes.
 
- src/hb-ot-name-table.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-layout.h | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
 
-commit 87810fc958e28d0c5e05097b1b3fe78d962fdc62
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 14:45:57 2019 -0700
+commit 930f6fc3da04ce1897e65862fccb03afa9d3a780
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Sat Mar 16 15:10:21 2019 +0000
 
-    [name] Use variable forwarding to simplify sanitize()
+    [Docs] Add inlind gtk-doc comments for hb-ot-layout functions.
 
- src/hb-ot-name-table.hh | 7 ++-----
- 1 file changed, 2 insertions(+), 5 deletions(-)
+ src/hb-ot-layout.cc | 456 +++++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-layout.h  |  11 ++
+ 2 files changed, 462 insertions(+), 5 deletions(-)
 
-commit bf91b418b0e988619c230156f5f062c5d2802dd8
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 14:42:37 2019 -0700
+commit 945737026d5647c42c1fb897a88364613a7dd51c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Apr 11 10:52:11 2019 -0700
 
-    [name]
+    tweak: moved xshift code out of get_points_var
 
- src/hb-ot-name-table.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-ot-glyf-table.hh | 21 +++++++++------------
+ 1 file changed, 9 insertions(+), 12 deletions(-)
 
-commit 998b0b68ac2eafd1d5bca51b3723fa753e4db7c4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 14:39:52 2019 -0700
+commit e8140832025e31d62784ce16a03fc5667b0c4015
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Apr 11 09:59:13 2019 -0700
 
-    [serializer] Add copy() to (Unsized)ArrayOf
+    undo hb_ot_ge_glyph_v_origin to fix test failures
 
- src/hb-open-type.hh | 41 +++++++++++++++++++++++++++++++++++++++++
- src/hb-serialize.hh |  4 ++--
- 2 files changed, 43 insertions(+), 2 deletions(-)
+ src/hb-ot-font.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
 
-commit 88a41472404a8e7754e1099ca4a5b2146dae5298
+commit b52c0e54b9855a1f3d400e4dbcd0372520f2c2fc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 14:22:31 2019 -0700
+Date:   Thu Apr 11 11:20:10 2019 -0400
 
-    [serializer] Accept exact type in serialize_subset/copy()
+    Use injected class name to simplify macros
 
- src/hb-open-type.hh            | 12 ++++++------
- src/hb-ot-layout-common.hh     | 33 ++-------------------------------
- src/hb-ot-layout-gpos-table.hh |  6 ++++++
- src/hb-ot-layout-gsub-table.hh |  6 ++++++
- 4 files changed, 20 insertions(+), 37 deletions(-)
+ src/hb-open-type.hh | 10 +++++-----
+ src/hb.hh           | 14 --------------
+ 2 files changed, 5 insertions(+), 19 deletions(-)
 
-commit 88fdeeecc0ef57e41219d92c90f35f13cbd3a35e
+commit baf1e79075b0f917b79484446cd2ca47b58f50aa
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 14:14:33 2019 -0700
+Date:   Thu Apr 11 11:18:04 2019 -0400
 
-    [serialize] Take arguments in copy()
+    [C++11] Use deleted methods
 
- src/hb-open-type.hh |  6 +++---
- src/hb-serialize.hh | 10 ++++++----
- 2 files changed, 9 insertions(+), 7 deletions(-)
+ src/hb.hh | 30 +++++++++++++++---------------
+ 1 file changed, 15 insertions(+), 15 deletions(-)
 
-commit 273ed6127bd9471fd11b3c1c7f232638f1ff1dba
+commit 824fd342d5d66584a5ed88951e05975f33c55617
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 14:04:51 2019 -0700
+Date:   Thu Apr 11 11:16:01 2019 -0400
 
-    [serializer] Add serialize_copy()
+    Rename a few macros
 
- src/hb-open-type.hh | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
+ src/hb-map.hh       |  2 +-
+ src/hb-open-type.hh | 10 +++++-----
+ src/hb-set.hh       |  2 +-
+ src/hb.hh           | 12 ++++++------
+ 4 files changed, 13 insertions(+), 13 deletions(-)
 
-commit bf22338f49fb1711f7cbcad2d9949d7962cdc0bc
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu May 2 13:51:52 2019 -0700
+commit 9e79285ef3b4d7490b4bbad0eef16dd73fd8fb62
+Merge: 6d79a25b c5509be9
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Apr 10 17:24:29 2019 -0700
 
-    Remove dead code
+    Merge branch 'master' into var-subset
 
- src/hb-algs.hh | 3 ---
- 1 file changed, 3 deletions(-)
+commit 6d79a25bed110b2d8842bd102ffdb5606023b8a1
+Merge: ab9d3096 196481cc
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Apr 10 17:23:00 2019 -0700
 
-commit 14e1fabc41a9a5ead3d91d560773050469982f54
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Wed May 1 21:29:06 2019 -0400
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
-    Sync gen-vowel-constraints.py with current output
+commit ab9d30965d298c10e0f1934364b03276067cf8a5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Apr 10 17:21:37 2019 -0700
 
- src/gen-vowel-constraints.py | 3 +++
- 1 file changed, 3 insertions(+)
+    Add tt var metrics test cases & bug fixes
 
-commit 026ab825c8e41980e286be911cc6fbb958dd7cd3
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Wed May 1 16:15:58 2019 -0400
+ src/hb-ot-font.cc                                  |   4 +-
+ src/hb-ot-glyf-table.hh                            | 131 ++++++++++-----------
+ src/hb-ot-hmtx-table.hh                            |   4 +-
+ src/hb-ot-var-gvar-table.hh                        |   4 +-
+ .../api/fonts/SourceSansVariable-Roman.modcomp.ttf | Bin 0 -> 3252 bytes
+ test/api/test-ot-metrics-tt-var.c                  |  79 ++++++++++++-
+ 6 files changed, 147 insertions(+), 75 deletions(-)
 
-    Add dotted circles to more broken clusters
+commit edfc6be4a0362efa5c1d39f4792a28b5726c3ce5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 10 15:53:48 2019 -0400
 
- src/gen-use-table.py                       |   9 +
- src/hb-ot-shape-complex-myanmar-machine.hh | 196 +++++-----
- src/hb-ot-shape-complex-myanmar-machine.rl |   4 +-
- src/hb-ot-shape-complex-use-machine.hh     | 602 +++++++++++++++--------------
- src/hb-ot-shape-complex-use-machine.rl     |  11 +-
- src/hb-ot-shape-complex-use-table.cc       |   2 +-
- 6 files changed, 433 insertions(+), 391 deletions(-)
+    [arabic] Disable fallback shaping if HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK defined
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
-commit 92588782d7a45e0c023c5f48cbd19b11cfa8f0d2
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Apr 30 13:05:10 2019 -0700
+ src/hb-ot-shape-complex-arabic-fallback.hh | 1 -
+ src/hb-ot-shape-complex-arabic.cc          | 4 ++++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
 
-    Remove space between right angle brackets now that we have C++11 (#1689)
+commit 4d31662b5da20790f6f860cec8f5fdabf48210f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 10 15:40:03 2019 -0400
 
- src/hb-aat-layout-ankr-table.hh |  2 +-
- src/hb-aat-layout-common.hh     | 14 +++----
- src/hb-aat-layout-just-table.hh |  4 +-
- src/hb-aat-layout-kerx-table.hh | 14 +++----
- src/hb-aat-layout-lcar-table.hh |  2 +-
- src/hb-aat-layout-morx-table.hh | 14 +++----
- src/hb-aat-layout-trak-table.hh |  2 +-
- src/hb-aat-ltag-table.hh        |  2 +-
- src/hb-cff-interp-cs-common.hh  |  2 +-
- src/hb-cff1-interp-cs.hh        |  2 +-
- src/hb-cff2-interp-cs.hh        |  2 +-
- src/hb-iter.hh                  |  4 +-
- src/hb-null.hh                  |  8 ++--
- src/hb-open-file.hh             |  8 ++--
- src/hb-open-type.hh             |  8 ++--
- src/hb-ot-color-cbdt-table.hh   |  2 +-
- src/hb-ot-color-colr-table.hh   |  4 +-
- src/hb-ot-color-cpal-table.hh   |  8 ++--
- src/hb-ot-color-sbix-table.hh   |  2 +-
- src/hb-ot-color-svg-table.hh    |  4 +-
- src/hb-ot-kern-table.hh         |  6 +--
- src/hb-ot-layout-base-table.hh  |  2 +-
- src/hb-ot-layout-common.hh      | 10 ++---
- src/hb-ot-layout-gdef-table.hh  |  4 +-
- src/hb-ot-layout-gpos-table.hh  |  6 +--
- src/hb-ot-layout-gsub-table.hh  | 18 ++++-----
- src/hb-ot-layout-gsubgpos.hh    | 86 ++++++++++++++++++++---------------------
- src/hb-ot-math-table.hh         |  2 +-
- src/hb-ot-name-table.hh         | 10 ++---
- src/hb-ot-stat-table.hh         |  4 +-
- src/hb-subset-cff1.cc           |  2 +-
- src/test-iter.cc                | 10 ++---
- 32 files changed, 134 insertions(+), 134 deletions(-)
+    Don't install ot-font funcs on new fonts if HB_NO_OT_FONT defined
+    
+    Currently linker cannot GC hb-ot-font completely because we install
+    it on fonts by default.  Don't do that if HB_NO_OT_FONT defined.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
-commit f27fdca4aa438ec366ee17370fbc9fdeb962c397
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Apr 30 13:01:04 2019 -0700
+ src/hb-font.cc | 2 ++
+ 1 file changed, 2 insertions(+)
 
-    [doc] Add documentation to hb_color_get_* and hb_directwrite_face_* (#1690)
+commit b111b3de020cde6fb0686efc224cace4608f2e45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 10 15:38:15 2019 -0400
 
- src/hb-common.cc      | 12 ++++++++----
- src/hb-directwrite.cc |  8 ++++++--
- 2 files changed, 14 insertions(+), 6 deletions(-)
+    Don't use any default unicode funcs if HB_NO_UNICODE_FUNCS is defined
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
 
-commit fe4a0ac707802b5bb36787723f8d55a58c2946a5
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Tue Apr 30 13:35:50 2019 -0400
+ src/hb-unicode.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-    Fix some dead links
+commit c5509be93a351177724f2891dd5e9ddb02553452
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Apr 8 14:50:58 2019 -0400
 
- src/gen-os2-unicode-ranges.py      | 2 +-
- src/gen-use-table.py               | 6 +++---
- src/hb-ot-shape-complex-myanmar.hh | 2 +-
- 3 files changed, 5 insertions(+), 5 deletions(-)
+    [coretext] Fix unused-variable error
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1659
 
-commit 68749e996aedbae9b1c4553f5672f74e1727b850
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Tue Apr 30 17:23:55 2019 +0100
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 196481ccb913d23e30cbd267df296deada919e88
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Apr 5 16:37:12 2019 -0700
 
-    [Docs] Usermanual; update XML manifest for new chapters.
+    shift glyph horizontally at top level, not components
 
- docs/Makefile.am       | 4 ++--
- docs/harfbuzz-docs.xml | 4 ++--
- 2 files changed, 4 insertions(+), 4 deletions(-)
+ src/hb-ot-glyf-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 30d7d1064ee339ca216699851030f9bae8c07c68
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Tue Apr 30 17:23:19 2019 +0100
+commit 8a92ffd9bb9357cdf219e166c8a71abc90823976
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Apr 5 15:04:23 2019 -0700
 
-    [Docs] Usermanual; add Utilities chapter.
+    fix failure to check glyf recursion
 
- docs/usermanual-utilities.xml | 244 ++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 244 insertions(+)
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit d0f5a05aef73293fe21ddb022084166a7a095862
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Tue Apr 30 17:22:54 2019 +0100
+commit 4c19aa26204d0dc2f08b6e4a824e9088301f68d8
+Author: Maks Naumov <maksqwe1@ukr.net>
+Date:   Fri Apr 5 21:46:27 2019 +0300
 
-    [Docs] Usermanual; add Shaping, Features, and Plans.
+    Fix MSVC C4068 warning (#1656)
 
docs/usermanual-opentype-features.xml | 279 +++++++++++++++++++++++++++++++++-
- 1 file changed, 277 insertions(+), 2 deletions(-)
src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 8354c99fbee2887cb71440f4e25ad1e6f46b2592
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Tue Apr 30 17:22:08 2019 +0100
+commit e44b83aac0443bd23df15b505a3d638883621b0e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Apr 5 10:15:08 2019 -0700
 
-    [Docs] Usermanual; add Fonts And Faces chapter.
+    replace test font SourceHanSans with its subet
 
- docs/usermanual-fonts-and-faces.xml | 445 +++++++++++++++++++++++++++++++++++-
- 1 file changed, 437 insertions(+), 8 deletions(-)
+ ...gular.default.3042,3044,3046,3048,304A,304B.otf |    Bin 6356 -> 0 bytes
+ ...gular.default.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 6564 -> 0 bytes
+ .../SourceHanSans-Regular.default.61,63,65,6B.otf  |    Bin 5532 -> 0 bytes
+ ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6780 -> 0 bytes
+ .../SourceHanSans-Regular.default.660E.otf         |    Bin 5248 -> 0 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 537992 -> 0 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 692312 -> 0 bytes
+ ...ular.desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 531624 -> 0 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 692496 -> 0 bytes
+ ...ans-Regular.desubroutinize-retain-gids.660E.otf |    Bin 613836 -> 0 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 6272 -> 0 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 6456 -> 0 bytes
+ ...eHanSans-Regular.desubroutinize.61,63,65,6B.otf |    Bin 5460 -> 0 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6572 -> 0 bytes
+ .../SourceHanSans-Regular.desubroutinize.660E.otf  |    Bin 5224 -> 0 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 537424 -> 0 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 691692 -> 0 bytes
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 531124 -> 0 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 691808 -> 0 bytes
+ ....drop-hints-desubroutinize-retain-gids.660E.otf |    Bin 613348 -> 0 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 6096 -> 0 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 6204 -> 0 bytes
+ ...gular.drop-hints-desubroutinize.61,63,65,6B.otf |    Bin 5344 -> 0 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6268 -> 0 bytes
+ ...Sans-Regular.drop-hints-desubroutinize.660E.otf |    Bin 5120 -> 0 bytes
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 537492 -> 0 bytes
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 691788 -> 0 bytes
+ ...-Regular.drop-hints-retain-gids.61,63,65,6B.otf |    Bin 531164 -> 0 bytes
+ ...-Regular.drop-hints-retain-gids.61,63,65,6B.ttx | 393879 ------------------
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 692008 -> 0 bytes
+ ...HanSans-Regular.drop-hints-retain-gids.660E.otf |    Bin 613368 -> 0 bytes
+ ...ar.drop-hints.3042,3044,3046,3048,304A,304B.otf |    Bin 6164 -> 0 bytes
+ ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 6300 -> 0 bytes
+ ...ourceHanSans-Regular.drop-hints.61,63,65,6B.otf |    Bin 5376 -> 0 bytes
+ ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6472 -> 0 bytes
+ .../SourceHanSans-Regular.drop-hints.660E.otf      |    Bin 5140 -> 0 bytes
+ ...r.retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 538076 -> 0 bytes
+ ...r.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 692420 -> 0 bytes
+ ...urceHanSans-Regular.retain-gids.61,63,65,6B.otf |    Bin 531704 -> 0 bytes
+ ...r.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 692700 -> 0 bytes
+ .../SourceHanSans-Regular.retain-gids.660E.otf     |    Bin 613860 -> 0 bytes
+ ...ubset.default.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 3028 bytes
+ ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 3240 bytes
+ ...eHanSans-Regular_subset.default.61,63,65,6B.otf |    Bin 0 -> 2200 bytes
+ ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 3460 bytes
+ .../SourceHanSans-Regular_subset.default.660E.otf  |    Bin 0 -> 1920 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 90956 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 125820 bytes
+ ...bset.desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 0 -> 88392 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 126004 bytes
+ ...ular_subset.desubroutinize-retain-gids.660E.otf |    Bin 0 -> 103780 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 2952 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 3136 bytes
+ ...s-Regular_subset.desubroutinize.61,63,65,6B.otf |    Bin 0 -> 2132 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 3256 bytes
+ ...eHanSans-Regular_subset.desubroutinize.660E.otf |    Bin 0 -> 1896 bytes
+ ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 90656 bytes
+ ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 125468 bytes
+ ...ints-desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 0 -> 88156 bytes
+ ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 125584 bytes
+ ....drop-hints-desubroutinize-retain-gids.660E.otf |    Bin 0 -> 103556 bytes
+ ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 2792 bytes
+ ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 2896 bytes
+ ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf |    Bin 0 -> 2028 bytes
+ ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 2964 bytes
+ ...gular_subset.drop-hints-desubroutinize.660E.otf |    Bin 0 -> 1804 bytes
+ ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 90724 bytes
+ ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 125560 bytes
+ ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf |    Bin 0 -> 88196 bytes
+ ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 125780 bytes
+ ...-Regular_subset.drop-hints-retain-gids.660E.otf |    Bin 0 -> 103572 bytes
+ ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 2848 bytes
+ ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 2988 bytes
+ ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf |    Bin 0 -> 2060 bytes
+ ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 3164 bytes
+ ...ourceHanSans-Regular_subset.drop-hints.660E.otf |    Bin 0 -> 1824 bytes
+ ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 91040 bytes
+ ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 125924 bytes
+ ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf |    Bin 0 -> 88468 bytes
+ ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 126208 bytes
+ ...urceHanSans-Regular_subset.retain-gids.660E.otf |    Bin 0 -> 103800 bytes
+ test/subset/data/fonts/SourceHanSans-Regular.otf   |    Bin 16427580 -> 0 bytes
+ .../data/fonts/SourceHanSans-Regular_subset.otf    |    Bin 0 -> 2707728 bytes
+ test/subset/data/tests/cff-japanese.tests          |      2 +-
+ 84 files changed, 1 insertion(+), 393880 deletions(-)
 
-commit 3b301c5ac6b15728f858cb6f5de8dfc6a77209fa
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Tue Apr 30 17:21:33 2019 +0100
+commit a96d003d6ec4212fadad4f5b9058c9f8b07bcf89
+Author: Maks Naumov <maksqwe1@ukr.net>
+Date:   Fri Apr 5 12:29:56 2019 +0300
 
-    [Docs] Usermanual; fill out Buffers chapter.
+    Fix MSVC C4138 warning (#1657)
 
...anual-buffers-language-script-and-direction.xml | 358 +++++++++++++++++++--
- 1 file changed, 335 insertions(+), 23 deletions(-)
src/hb-ot-cff-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 6d9a86ae7535ea8e3c108a49c6da877a78cdac26
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Tue Apr 30 16:09:01 2019 +0100
+commit c68eb7002f1c2b847d955797e27f5403199e3d9d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 3 16:24:12 2019 -0700
 
-    [Docs] Usermanual; fixes to Object Model chapter
+    Minor
 
docs/usermanual-object-model.xml | 35 ++++++++++++++++++++++-------------
- 1 file changed, 22 insertions(+), 13 deletions(-)
src/hb-ot-layout-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 9542bdd0ed2d581cdb4bd950ac3cd7e3bf899478
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Apr 29 14:52:28 2019 -0700
+commit 85adf4ad5c76172514f281bfbe3850ef35473cc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 3 16:06:55 2019 -0700
 
-    Add color channels getters ABI (#1513)
+    [GDEF] Don't assume glyphlist is sorted
     
-    So can be used with language wrappers
+    As was hit by the fuzzer.
+    
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14032
 
- src/hb-common.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
- src/hb-common.h  | 40 +++++++++++-----------------------------
- 2 files changed, 64 insertions(+), 29 deletions(-)
+ src/hb-ot-layout-common.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
 
-commit e200d165a4e8a5f901165c705d617b6e457ec595
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Apr 30 02:10:50 2019 +0430
+commit ecabdffc61cb0b71424f4845aeda8cd0a6d25a29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 3 16:06:34 2019 -0700
 
-    [ci] Remove crosscompile-notest-freebsd9 bot
-    
-    It was testing an old version of freebsd and now it's image is gone.
-    We really like to test the environment.
+    [algs] Add hb_min() and hb_max()
 
- .circleci/config.yml | 10 ----------
- 1 file changed, 10 deletions(-)
+ src/hb-algs.hh | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
 
-commit 4aa546b70ad7b11154b901e67f98c1ec6bc5c364
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Mon Apr 29 14:16:51 2019 -0400
+commit 7b863142ceb82fc2fd23802f19f7379aa2f152e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 3 15:48:27 2019 -0700
 
-    Allow some Balinese Po & So as aksara modre bases
+    [serialize] Make putting breakpoint on out-of-memory easier
 
- src/gen-use-table.py                 | 10 ++++++++--
- src/hb-ot-shape-complex-use-table.cc |  4 ++--
- 2 files changed, 10 insertions(+), 4 deletions(-)
+ src/hb-serialize.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
 
-commit 6d6edc8b25395c87477181a647a8e6d02f2cad4f
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Apr 28 11:54:07 2019 -0700
+commit 2bd275023405b6a669d59ad4cdcb2e8cb410d593
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 3 15:31:53 2019 -0700
 
-    [valgrind] Use libtool and support run-subset-fuzzer-tests (#1668)
+    [iter] Tweak SFINAE again
+    
+    Don't think we need hb_is_same().
 
- test/fuzzing/Makefile.am                |  4 +-
- test/fuzzing/run-shape-fuzzer-tests.py  | 28 ++++++------
- test/fuzzing/run-subset-fuzzer-tests.py | 75 ++++++++++++++++++++++++++++++---
- 3 files changed, 85 insertions(+), 22 deletions(-)
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 62c6e170728303f4225aaa25523675fc260ae1ab
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Apr 28 10:55:07 2019 -0700
+commit f02ebc89ec89e78a348f9b67d613a2024feabc18
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Apr 3 15:23:06 2019 -0700
 
-    [test] Add crbug.com/oss-fuzz/14474 testcase
-    
-    Fixed at 6977a95f
+    [array] Add compy assignment operator since copy constructor is explicit
 
- ...testcase-minimized-hb-subset-fuzzer-5716947896893440 | Bin 0 -> 65833 bytes
- 1 file changed, 0 insertions(+), 0 deletions(-)
+ src/hb-array.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
 
-commit 6977a95fed8a35d6e915ed3fc3a3ea8709f3d4a4
+commit 20a73da2c9227a0f9bc943a3d766eedeb5bed3b3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Apr 27 10:05:25 2019 -0700
+Date:   Wed Apr 3 14:32:15 2019 -0700
 
-    [subset] Don't crash if subsetting GSUB/GPOS fails
+    [array] Add default copy constructor
     
-    Fixes fuzzer issue.
+    MSVC seems to need it.
 
- src/hb-subset.cc | 27 ++++++++++++++-------------
- 1 file changed, 14 insertions(+), 13 deletions(-)
+ src/hb-array.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 2b051e7aa147c78cfbf953b6f0eb18c25b732eb2
+commit d419a9a4376de7b2ae1dec7df09f8d034cc2d039
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Apr 27 10:01:11 2019 -0700
+Date:   Wed Apr 3 14:18:19 2019 -0700
 
-    [subset] Check error after calling serializer end
+    [iter] Use different SFINAE scheme to make MSVC happy
+    
+    From Orvid King: TLDR; MSVC has some issues using sizeof(declval<T>()) for
+    SFINAE of templated types, so I just used SFINAE in a different context where
+    MSVC doesn't have the issue.
 
- src/hb-subset.cc | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
+ src/hb-iter.hh | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
 
-commit 750b65e9a980efc13e50ea5d0388ecf06e7a93b1
+commit 2778df7972f537192b51cd0719adf2ab4d1f3397
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 26 17:14:25 2019 -0700
+Date:   Wed Apr 3 14:15:01 2019 -0700
 
-    [meta] Add hb_type_identity<>
-    
-    To block template argument deduction.
+    [meta] Add hb_is_same()
+
+ src/hb-meta.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
 
- src/hb-meta.hh | 4 ++++
- 1 file changed, 4 insertions(+)
+commit b999ce9bf06fc90c4cb3c531357967835d7e706d
+Merge: c2d727a4 6215fb8e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Apr 3 10:34:09 2019 -0700
 
-commit 8c8922a019eb1ceb8beffc05ca638ee0ca25b565
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Thu Apr 25 09:17:58 2019 -0700
+    Merge branch 'master' into var-subset
 
-    [subset] Updates due to changes in resolve_links() on master branch
+commit c2d727a479429b7c14126569e0f3e41d4b0beadf
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Apr 3 10:33:55 2019 -0700
 
- src/Makefile.sources    | 1 +
- src/hb-ot-name-table.hh | 7 +++++--
- src/hb-static.cc        | 3 +--
- 3 files changed, 7 insertions(+), 4 deletions(-)
+    fix xshift by (lsb - xMin)
 
-commit 2f6ec35344db08d0c892152bc7a7eaa67e7c03f0
-Author: Garret Rieger <grieger@google.com>
-Date:   Wed Apr 24 15:15:36 2019 -0700
+ src/hb-ot-glyf-table.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
 
-    Move implementations of hb-ot-name-language.cc into a hb-static.cc
+commit 6215fb8e68bdf69f4af9f7f4959ad55a70723774
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 2 23:10:03 2019 -0700
 
- src/hb-aat-layout.hh              |   1 -
- src/hb-ot-name-language-static.hh | 462 ++++++++++++++++++++++++++++++++++++++
- src/hb-ot-name-language.hh        | 432 +----------------------------------
- src/hb-static.cc                  |   2 +
- 4 files changed, 468 insertions(+), 429 deletions(-)
+    [serialize] Actually reclaim storage from duplicate objects
 
-commit 19afd25004487cfaa7b487b1768b4dae1ab37296
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Wed Apr 24 14:02:29 2019 -0700
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    [subset] Update to use _subset2() for name table
+commit 3305a2cad24f878f5d8773c2acae491ebd5a9059
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 2 22:42:22 2019 -0700
 
- src/hb-ot-name-table.hh | 47 ++++++++++-------------------------------------
- src/hb-subset.cc        |  4 ++--
- 2 files changed, 12 insertions(+), 39 deletions(-)
+    [serialize] Port to use object pool
+    
+    Tested, but feels fragile :(.
 
-commit 1ca4b5c77012ed586413f39e730b03bf965e1305
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Mon Apr 22 11:31:23 2019 -0700
+ src/hb-pool.hh      |   5 +-
+ src/hb-serialize.hh | 141 ++++++++++++++++++++++++++++++++--------------------
+ 2 files changed, 91 insertions(+), 55 deletions(-)
 
-    [subset] Add unit test for str de-dup
-    Also move the implementation of some methods from the .cc to the .hh
+commit 5efbc01174127bede4d533866acac239e5a0cfd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 2 22:41:06 2019 -0700
 
- src/Makefile.sources                   |   1 -
- src/hb-aat-layout.cc                   |   8 -
- src/hb-aat-layout.hh                   |   9 +-
- src/hb-ot-name-language.cc             | 457 ---------------------------------
- src/hb-ot-name-language.hh             | 432 ++++++++++++++++++++++++++++++-
- test/api/fonts/nameID.dup.expected.ttf | Bin 0 -> 2340 bytes
- test/api/fonts/nameID.dup.origin.ttf   | Bin 0 -> 170680 bytes
- test/api/test-subset-nameids.c         |  21 ++
- 8 files changed, 456 insertions(+), 472 deletions(-)
+    [pool] Uses memset() instead of assigning Null()
+    
+    Assignment is invalid on invalid object.
 
-commit 9ad14f56b6cf2a345104b3a897b52a1f4c0f33a5
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Tue Apr 16 11:20:58 2019 -0700
+ src/hb-pool.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
-    [subset] update name table subsetting with new serializer
+commit 434d78bf91ac5204ffbf2144f199eb7a0f65c421
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 2 21:46:40 2019 -0700
 
- src/hb-ot-name-table.hh | 126 ++++++++++++++++++++++++++++--------------------
- 1 file changed, 75 insertions(+), 51 deletions(-)
+    Add hb_pool_t<> for pooled memory allocation
 
-commit 6faac8df83bb59f08e5d329e76435ba438b2ea54
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Wed Apr 10 16:38:35 2019 -0700
+ src/Makefile.sources |  1 +
+ src/hb-pool.hh       | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 99 insertions(+)
 
-    [subset] Subsetting Name Table Step 4
-    Add unit test and integration test
+commit 8e4df1a152f3916613594fa1bac308efdb61d512
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 2 20:20:53 2019 -0700
 
- test/api/Makefile.am                               |   2 +
- test/api/fonts/nameID.expected.ttf                 | Bin 0 -> 170696 bytes
- test/api/fonts/nameID.origin.ttf                   | Bin 0 -> 170976 bytes
- test/api/hb-subset-test.h                          |   9 ++++
- test/api/test-subset-nameids.c                     |  58 +++++++++++++++++++++
- .../Roboto-Regular.abc.name-ids.61,62,63.ttf       | Bin 0 -> 2168 bytes
- .../basics/Roboto-Regular.abc.name-ids.61,63.ttf   | Bin 0 -> 1988 bytes
- .../basics/Roboto-Regular.abc.name-ids.61.ttf      | Bin 0 -> 1792 bytes
- .../basics/Roboto-Regular.abc.name-ids.62.ttf      | Bin 0 -> 1740 bytes
- .../basics/Roboto-Regular.abc.name-ids.63.ttf      | Bin 0 -> 1716 bytes
- test/subset/data/profiles/name-ids.txt             |   1 +
- test/subset/data/tests/basics.tests                |   1 +
- 12 files changed, 71 insertions(+)
+    [serialize] Disable packed_map again
+    
+    Ugh.  Need to think of something else.
 
-commit e501ea143d1e63974903cdb41932c50f4222ff4e
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Fri Apr 5 10:05:55 2019 -0700
+ src/hb-serialize.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-    [subset] Subset name table step 3, add --nameids option to guide the
-    selection of which name records to keep in the subset method.
+commit 31c1a83899147310b27bd40fac755c629cb59cef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 2 20:17:27 2019 -0700
 
- src/hb-ot-name-table.hh | 28 ++++++++++++++++------------
- src/hb-subset-input.cc  |  8 ++++++++
- src/hb-subset-input.hh  |  3 ++-
- src/hb-subset-plan.cc   | 10 ++++++----
- src/hb-subset-plan.hh   |  3 +++
- src/hb-subset.h         |  3 +++
- util/hb-subset.cc       |  1 +
- util/options.cc         | 45 +++++++++++++++++++++++++++++++++++++++++++++
- util/options.hh         |  8 ++++++++
- 9 files changed, 92 insertions(+), 17 deletions(-)
+    [map] Protect more against pointer deref
 
-commit 2637a81615c80443911a603cbd161ade525c79f1
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Tue Apr 2 13:38:27 2019 -0700
+ src/hb-map.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
-    [subset] subset name table step 2, add implementation for collecting subset
-    elements and serialize method
+commit 5bffa9e375fe294718452ad51e4c5ff017a046b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 2 20:13:16 2019 -0700
 
- src/hb-ot-name-table.hh | 131 ++++++++++++++++++++++++++++++++++++++++--------
- 1 file changed, 109 insertions(+), 22 deletions(-)
+    More
 
-commit 408c1daeb4ff86d2204ed1bdd059513357ada392
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Fri Mar 29 10:34:32 2019 -0700
+ src/hb-map.hh    | 5 +++++
+ src/hb-set.hh    | 9 ++++++++-
+ src/hb-vector.hh | 8 ++++----
+ 3 files changed, 17 insertions(+), 5 deletions(-)
 
-    [subset] subset name table step 1,  write out table unmodified, use accelerator to access
-    string
+commit 5b66b033fd2cd9c95284d283f08d6789c7ec985d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 2 19:27:02 2019 -0700
 
- src/hb-ot-name-table.hh | 53 +++++++++++++++++++++++++++++++++++++++++++++++++
- src/hb-subset.cc        |  4 ++++
- 2 files changed, 57 insertions(+)
+    [serialize] Fix hb_hashmap_t<> for pointers and use in packed_map
 
-commit 3a7f5bdd18314676425ec811199767a5f8e65a40
+ src/hb-array.hh     | 12 +++++++++++-
+ src/hb-map.hh       | 22 ++++++++++++++--------
+ src/hb-serialize.hh |  8 +++-----
+ src/hb-vector.hh    |  1 +
+ 4 files changed, 29 insertions(+), 14 deletions(-)
+
+commit 42ab32cbbaf8b403c351953f091c0fbe8464c4cb
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 26 14:40:01 2019 -0700
+Date:   Tue Apr 2 18:41:33 2019 -0700
 
-    Rewrite hb_is_signed()
+    [iter] Remove passing pointer to hb_iter()
+    
+    While doable with hb_deref_pointer() as well, we also would then
+    need to do it in a ton of places.  Not worth it / messy.
 
- src/hb-meta.hh | 20 +++++++++++---------
- 1 file changed, 11 insertions(+), 9 deletions(-)
+ src/hb-array.hh  | 2 +-
+ src/hb-iter.hh   | 5 -----
+ src/test-iter.cc | 3 ---
+ 3 files changed, 1 insertion(+), 9 deletions(-)
 
-commit 73c82f2301a52cf2111296b34691bc898a7a6363
+commit d0da547b3741323493398eed8975a76f4a5742c2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 26 13:16:48 2019 -0700
+Date:   Tue Apr 2 18:22:39 2019 -0700
 
-    [iter] Fix hb_is_iterator_of() to actually check item type
+    [array] Use dagger for hashing array
+    
+    Also switch to better mixing.
 
- src/hb-iter.hh | 20 +++++++++-----------
- 1 file changed, 9 insertions(+), 11 deletions(-)
+ src/hb-array.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
 
-commit c51f15ddfcae8578483693b761b81ceaebf05f2a
+commit b6f29bf14153cac51b218e3aaba9e1b3aa747a8c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 26 13:03:41 2019 -0700
+Date:   Tue Apr 2 18:12:01 2019 -0700
 
-    [array] Adjust hb_sorted_array_t copy constructor/assignment to match hb_array_t
+    [iter] Accept pointers in hb_iter()
+    
+    No idea how to avoid dupicating code.  Was hoping hb_deref_pointer()
+    would do it, but looks like a pointer can't bind to a universal
+    reference T&&.  Humm.
 
- src/hb-array.hh | 13 ++++++++++---
- 1 file changed, 10 insertions(+), 3 deletions(-)
+ src/hb-iter.hh   | 5 +++++
+ src/test-iter.cc | 3 +++
+ 2 files changed, 8 insertions(+)
 
-commit b2758c360cc08d7a0334aae11845d0c5d50c46af
+commit fc24bb9046e7e39d52a245bdc3480a30095cb6ee
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 26 12:58:06 2019 -0700
+Date:   Tue Apr 2 17:49:52 2019 -0700
 
-    [array] Use hb_is_cr_convertible_to()
+    [serialize] Towards maintaining packed_map
 
- src/hb-array.hh | 14 ++------------
- 1 file changed, 2 insertions(+), 12 deletions(-)
+ src/hb-serialize.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
 
-commit 8ecae793aa79056a312d3c8518106cfeca42390e
+commit aa2293a55eaa39f4e77b60851bbdee56b1120225
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 26 12:57:56 2019 -0700
+Date:   Tue Apr 2 17:42:10 2019 -0700
 
-    [meta] Add hb_is_cr_convertible_to()
+    [serialize] Minor
 
- src/hb-meta.hh | 5 +++++
- 1 file changed, 5 insertions(+)
+ src/hb-open-type.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
 
-commit 52bb0346d319c322f117567a096fafa1bc804e26
+commit e42b82c828ecec6f534040dae5518e04643b5f10
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 26 12:52:28 2019 -0700
+Date:   Tue Apr 2 17:21:54 2019 -0700
 
-    [meta] Add hb_decay<>
+    [serialize] Handle non-nullable offsets
 
- src/hb-meta.hh | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-open-type.hh | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
 
-commit 474f3587cd18fdaf86b2068647fa03b107557d8c
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Fri Apr 26 10:12:38 2019 -0700
+commit e04518bafc66224887bf7f478e1affb54bc7acd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Apr 2 17:20:04 2019 -0700
 
-    copy retain_gids from input to plan
+    [serialize] Movce empty-object handling earlier
 
- src/hb-subset-plan.cc | 1 +
- src/hb-subset-plan.hh | 1 +
- 2 files changed, 2 insertions(+)
+ src/hb-serialize.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit 3fc066314ac19005ea8157a6541412cfd24abbc2
+commit 7f73c9744e6c0e8dd37a208b75a4bc299bccbd4d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 16:41:57 2019 -0700
+Date:   Tue Apr 2 17:12:24 2019 -0700
+
+    [serialize] Minor
+
+ src/hb-open-type.hh | 14 +++++---------
+ 1 file changed, 5 insertions(+), 9 deletions(-)
+
+commit 27d3bac8ef77d56f91a7bd88bed02c3f1aceba0a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Apr 2 17:02:11 2019 -0700
 
-    Another try at fixing cmake build
+    fix 2x2 component transform
 
CMakeLists.txt | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
src/hb-ot-var-gvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit c69f02784ac53a7fd13eee559559b38d8224ef59
+commit 5a3de4f4f8791139d2c04a66244001aba192ef6b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 16:31:37 2019 -0700
+Date:   Tue Apr 2 16:53:05 2019 -0700
 
-    Fix sign-compare error on 32-bit systems
+    [serialize] Allow offset links that have base offset from the object base
+    
+    Rarely used, but used, in name table or similar constructs.
 
- src/hb-open-type.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-serialize.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
 
-commit f2d20dd9d3b52f434f5fe9dbef82bd95eb499edf
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 15:08:27 2019 -0700
+commit edad6b2c450e22e67ae86c5f2328cca3c29aaad2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Apr 3 00:48:59 2019 +0430
 
-    [THANKS] Add Ivan Kuckir <https://photopea.com/>
-    
-    https://github.com/harfbuzz/harfbuzz/issues/1633#issuecomment-485764140
+    [test][iter] minor, fix double promotion warning
 
THANKS | 2 +-
src/test-iter.cc | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 0ca358f21a2a6e86a3d5c145a70bb84ab6e2db32
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 16:36:29 2019 -0400
+commit 8801b80d724d36f9e6547b7975aaf1cc1a355734
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Apr 2 13:10:36 2019 -0700
 
-    Try fixing cmake build
+    refix: orig_points must be saved before any adjustment
 
CMakeLists.txt | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
src/hb-ot-var-gvar-table.hh | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
 
-commit 59a8fa53533b10b9c25458d9ba2d68b7b01c3ff0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 12:19:13 2019 -0400
+commit ee58f6012e9570c8d56e23d14c605a2186d4a265
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Apr 2 11:24:29 2019 -0700
 
-    [iter] Add tests for casting to hb_iter_t<> base class for hb_sorted_array_t<>
-    
-    Something's phishy about hb_sorted_array_t<>.  Can't get it work nicely with
-    change I'm making.  Ugh..
+    infer gvar deltas for each region (not after accumulation)
 
- src/test-iter.cc | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
+ src/hb-ot-var-gvar-table.hh | 74 ++++++++++++++++++++++-----------------------
+ 1 file changed, 37 insertions(+), 37 deletions(-)
 
-commit 714307cc437f375f128e17e5ab01eba0c57aaf01
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 10:56:12 2019 -0400
+commit 2c31652c8a9186068ee8958b46139121c51f1bf4
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Apr 2 10:07:43 2019 -0700
 
-    [iter] Remove fixed TODO
+    fix private_indices vs shared_indices
 
- src/hb-iter.hh | 3 ---
- 1 file changed, 3 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 22da12318a3e9fd9955f24fd0092de1a4a1a940d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 10:53:16 2019 -0400
+commit 062f5d6e7aa061358eb5874a8f3a3f3bd6e9f16f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 2 20:27:00 2019 +0430
 
-    [map] Fix TODO
+    [test] minor, c style comments
 
- src/hb-map.hh           | 6 ++----
- src/hb-meta.hh          | 6 ++++++
- src/hb-ot-cff1-table.cc | 1 -
- src/hb-ot-cff2-table.cc | 1 -
- src/hb.hh               | 3 +--
- 5 files changed, 9 insertions(+), 8 deletions(-)
+ src/test-iter.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 4c6136e976af4f7332f703f5a7625505ffc296b6
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 10:44:24 2019 -0400
+commit afdbf960d6147ec607ddb2c780d3a83068f61357
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 2 20:25:06 2019 +0430
 
-    [mutex] Remove TODO
+    [iter][test] Add another test for hb_reduce
+    
+    Different initial and accumulator types
 
- src/hb-mutex.hh | 2 --
- 1 file changed, 2 deletions(-)
+ src/test-iter.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
 
-commit 0268db11965d022883d5ef2ef828c0635165b7bd
+commit bfa02bef4546f448e048288c1162988c8c39322a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 10:43:40 2019 -0400
+Date:   Mon Apr 1 21:36:13 2019 -0700
 
-    [map] Use hb_invoke() with pointer-to-method
+    [serialize] Switch to tetris-packing
 
- src/hb-algs.hh   | 5 ++++-
- src/hb-map.hh    | 4 ++--
- src/test-algs.cc | 8 ++++++++
- 3 files changed, 14 insertions(+), 3 deletions(-)
+ src/hb-open-type.hh | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
 
-commit 8f79a5750e8982f9ab73c0dc6a8534dffef74610
+commit f0ea3ac17bef98409d302b9f285e94015e069823
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 10:32:49 2019 -0400
+Date:   Mon Apr 1 21:36:03 2019 -0700
 
-    [algs] Add more hb_forward<>()'s
+    [serialize] Fix linking
 
- src/hb-algs.hh | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
+ src/hb-serialize.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 42526d1697e2449fa23741f84721dcf2ce688af7
+commit 7c0e2054e0799ed89cdc5de8c1416d009c0029b5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 10:24:33 2019 -0400
+Date:   Mon Apr 1 21:32:29 2019 -0700
 
-    [serialize] Fix SingleSubstFormat1 failure
+    [serialize] Minor
 
- src/hb-ot-layout-gsub-table.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-serialize.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 6cc9707c9c0885a3133b7844f615cdcdaeccec18
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 10:22:06 2019 -0400
+commit dce9e5e622b94aaf8ba7e81dd6e09a0cead0c51f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Apr 1 20:55:02 2019 -0700
 
-    [serialize] Rename
+    fix get_start_tuple, get_end_tuple
 
- src/hb-serialize.hh | 8 +++-----
- 1 file changed, 3 insertions(+), 5 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 085793d6cd35a1590a66712f39260030367490db
+commit 64d0f0893812fa1cb2746071d8b021560969526d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 10:15:59 2019 -0400
+Date:   Mon Apr 1 16:50:28 2019 -0700
 
-    Remove wrong TODOs
+    [cmap] Minor
 
- src/hb-ot-layout-gsubgpos.hh       | 2 +-
- src/hb-ot-shape-complex-indic.cc   | 1 -
- src/hb-ot-shape-complex-khmer.cc   | 4 ++--
- src/hb-ot-shape-complex-myanmar.cc | 3 ++-
- src/hb-ot-shape-complex-use.cc     | 4 ++--
- 5 files changed, 7 insertions(+), 7 deletions(-)
+ src/hb-ot-cmap-table.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
 
-commit 915b9ea5f48d56df21419761477b2d4ba2843b54
+commit 2e675cc7b50b5a57ceddf799d63811801ffcfe94
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 10:07:19 2019 -0400
+Date:   Mon Apr 1 16:45:50 2019 -0700
 
-    [serialize] Add c->check_assign()
+    [subset] Call serialize start/end around it
     
-    To check for assignment overflows.
+    To be cleaned up.
 
- src/hb-open-type.hh            |  7 +++----
- src/hb-ot-layout-gsub-table.hh |  2 +-
- src/hb-serialize.hh            | 20 +++++++++++++-------
- 3 files changed, 17 insertions(+), 12 deletions(-)
+ src/hb-subset.cc | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 00a00bc1f23c681d64fbd4df33582ec0165e337a
+commit abe33c6149719eb371c5f2b0d8c143550938129e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 10:01:30 2019 -0400
+Date:   Mon Apr 1 16:45:40 2019 -0700
 
-    Fix two TODOs
+    [serialize] Assert stack
 
- src/hb-ot-layout-gsub-table.hh | 11 +++++------
- 1 file changed, 5 insertions(+), 6 deletions(-)
+ src/hb-serialize.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 11ab889a8d743304c8ec17920e209a514f46739d
+commit 72e9b2c16cd1bc183226ca0aa8a58a5b1222573d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 09:55:24 2019 -0400
+Date:   Mon Apr 1 16:17:30 2019 -0700
 
-    Rename a few test programs
+    [serialize] Add add_link() to add link
 
- src/Makefile.am                                    | 24 +++++++++++-----------
- ...est-size-params.cc => test-gpos-size-params.cc} |  0
- ...substitute.cc => test-gsub-would-substitute.cc} |  0
- src/{test-name-table.cc => test-ot-name.cc}        |  0
- 4 files changed, 12 insertions(+), 12 deletions(-)
+ src/hb-serialize.hh | 26 +++++++++++++++++++++++---
+ 1 file changed, 23 insertions(+), 3 deletions(-)
 
-commit 12017db0bfe62e7777e1ab6ba5b14729dcd4c351
+commit 74addbecac3b8be699ac90b3853970f6c7efd0eb
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 09:24:38 2019 -0400
+Date:   Mon Apr 1 14:17:09 2019 -0700
 
-    Move test code around
+    [serialize] Add default template type to push()
 
- src/test-algs.cc | 8 ++++++++
- src/test-iter.cc | 9 ---------
- 2 files changed, 8 insertions(+), 9 deletions(-)
+ src/hb-serialize.hh | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
 
-commit 27377a7e287dd39e3f7caad5c1e0691ae381ccf8
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 09:22:14 2019 -0400
+commit b8642087e6c2ec96dc70fcef617128b6ce353a7e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Apr 2 00:30:06 2019 +0430
 
-    Rely on variadic parameter pack more
+    [iter] hb_reduce, accumulator with a different type
 
- src/hb-open-type.hh | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
+ src/hb-iter.hh   | 22 ++++++++++++----------
+ src/test-iter.cc | 26 +++++++++++++++++++++++++-
+ 2 files changed, 37 insertions(+), 11 deletions(-)
 
-commit 3ad20c38ade76aca8aed024014977ecb5f2b636e
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 24 09:09:00 2019 -0400
+commit e526414c759ebca82f1071cdeafe1160bcaa9637
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Mar 31 12:41:58 2019 +0430
 
-    [serialize] Fix a few overflow TODO items
+    [iter] Implement hb_reduce
 
- src/hb-open-type.hh | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
+ src/hb-iter.hh   | 28 ++++++++++++++++++++++++++++
+ src/test-iter.cc |  5 +++++
+ 2 files changed, 33 insertions(+)
 
-commit 175bdad8bff5b0e9732ab1fb97617a9293680fd4
+commit 72545cb83949571393f06b0f26c36adf461b967e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Apr 1 16:49:15 2019 -0700
+
+    fixed off by one bug in apply_deltas_to_points()
+
+ src/hb-ot-var-gvar-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f3aca6aa267f7687a0406c7c545aefb5eed300b2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 23 23:57:11 2019 -0400
+Date:   Sun Mar 31 21:37:14 2019 -0700
 
-    One more variadic parameter pack use
+    [serialize] Implement linking
+    
+    Untested!
 
- src/hb-aat-layout-common.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-serialize.hh | 29 +++++++++++++++++++++++++++--
+ 1 file changed, 27 insertions(+), 2 deletions(-)
 
-commit 441cca235477a5399af214c9ac85320d4de69f0b
+commit 17f0cfa7ea3a5f0946d8800b98c1582c05dad853
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 23 23:49:21 2019 -0400
+Date:   Sun Mar 31 21:34:19 2019 -0700
 
-    Use hb_forward() when forwarding parameter pack
+    Move BEInt to hb.hh
+    
+    I knows...
 
- src/hb-open-type.hh | 32 ++++++++++++++++----------------
- src/hb-serialize.hh |  3 ++-
- 2 files changed, 18 insertions(+), 17 deletions(-)
+ src/hb-machinery.hh | 88 ----------------------------------------------------
+ src/hb.hh           | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 89 insertions(+), 88 deletions(-)
 
-commit 20f3134789f65b10f301c4635c9f80c2dda0fb97
+commit 78fc43f2930064cd6cf4229c1e4cb76edb8ed7f6
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 23 12:58:52 2019 -0400
+Date:   Sun Mar 31 19:17:07 2019 -0700
 
-    Use variadic templates in OffsetTo<> and various ArrayOf<>s
+    [iter] Fix up build, ouch
+    
+    Yeah, some things not very clear...
 
- src/hb-open-type.hh | 145 ++++++++++++++++++----------------------------------
- 1 file changed, 49 insertions(+), 96 deletions(-)
+ src/hb-iter.hh   | 8 ++++++--
+ src/test-iter.cc | 4 ++--
+ 2 files changed, 8 insertions(+), 4 deletions(-)
 
-commit aa6692cb0079bbe1e003f211a321e8fe6a18ea94
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Tue Apr 23 17:56:44 2019 +0100
+commit e5d6fe9782a9fcde0786392c075c6c0b85c24829
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Sun Mar 31 19:17:32 2019 +0100
 
-    Usermanual: update Makefile SGML list. Again.
+    Don't skip setting the .end field of the first range
+    
+    Fixes a bug in CoverageFormat2::serialize whereby the first range
+    was not serialized correctly if it consists of only a single glyph ID.
+    This broke shaping of U+0626 in the Arabic fallback shaper, because it
+    is not found in the coverage table of the 'init' and 'medi' lookups.
+    
+    Also fix similar bug in ClassDefFormat2::serialize, noted during code
+    inspection (I haven't observed a case that was actually affected by
+    this, but it looks broken).
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1504
 
- docs/Makefile.am | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-ot-layout-common.hh | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
 
-commit 98c54cdef8b0615a95382bdba4ecd008789f8c9e
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Tue Apr 23 17:48:42 2019 +0100
+commit 8a8d45b924cdb4343b4b11a7ef14e2d1fabb6f82
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Mar 31 19:00:09 2019 -0700
 
-    Usermanual: add chapter on object model.
+    [iter] Adjust hb_copy() and use it
+    
+    Untested.
 
- docs/harfbuzz-docs.xml           |   1 +
- docs/usermanual-object-model.xml | 249 +++++++++++++++++++++++++++++++++++++++
- 2 files changed, 250 insertions(+)
+ src/hb-iter.hh   | 11 ++++-------
+ src/hb-vector.hh |  4 ++--
+ 2 files changed, 6 insertions(+), 9 deletions(-)
 
-commit 64ca2ffa4c88b961dcbd9d06be8ac7dd80ad8182
+commit ba4b7be45523e88c26f763f8a329cc43c13b98a1
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Apr 23 01:10:46 2019 -0700
+Date:   Sun Mar 31 01:32:30 2019 -0700
 
-    Fix clang's -Wmain complain (#1678)
+    Remove coretext_aat shaper (#1581)
+    
+    coretext_aat was a temporary shaper to redirect shaping of AAT fonts
+    to CoreText and leaving the rest for HarfBuzz.  As HarfBuzz now supports
+    AAT and Chrome now actually ships that on a stable version on macOS,
+    we no longer care about such use-case.  If a client really wants 100%
+    metrics compatibility with CoreText better to use it directly or through
+    our API.  Replicating the same behavior still is possible using
+    hb_shape_full, something we don't care or like to offer anymore.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1478
 
- src/test-iter.cc | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
+ src/hb-coretext.cc    | 56 ---------------------------------------------------
+ src/hb-shaper-list.hh |  4 ----
+ 2 files changed, 60 deletions(-)
 
-commit 7c218351ab45c41e48147b2196393357f7b551d4
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Apr 23 12:40:29 2019 +0430
+commit ef11305bfda0e261f0793acd81c9478df1719b1e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 31 00:23:58 2019 -0700
 
-    .editorconfig, minor
+    fixed tt var extents
     
-    still doesn't work with vscode
+    max bounds were not correctly initialized
 
.editorconfig | 2 +-
src/hb-ot-glyf-table.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 25dd88efc6521b972babe1067c0de1b9d4f5dbe5
+commit f7700fc479c25599e89b9d59edaad66e103a742d
+Merge: 43725d36 d6005b49
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 30 20:49:34 2019 -0700
+
+    Merge branch 'master' into var-subset
+
+commit d6005b49b32410543a8dfa93ce2a213223cf8f01
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 22 17:45:23 2019 -0400
+Date:   Sat Mar 30 19:49:56 2019 -0700
 
-    Err, fix hb_invoke() variadic
+    [serialize] Start implementing linking
 
- src/hb-algs.hh   | 6 +++---
- src/test-iter.cc | 5 ++++-
- 2 files changed, 7 insertions(+), 4 deletions(-)
+ src/hb-serialize.hh | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
 
-commit c862a532df0bc3ce0b47f3fde9bf1dd300ff8bee
+commit 313b3057c335da6baa4cd447bac95812992413b9
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 22 17:32:19 2019 -0400
+Date:   Sat Mar 30 19:46:35 2019 -0700
 
-    Add variadic arguments to hb_invoke()
+    [serializer] Implement dedup!
 
- src/hb-algs.hh | 22 +++++++++++-----------
- 1 file changed, 11 insertions(+), 11 deletions(-)
+ src/hb-serialize.hh | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
 
-commit 9c724e48a2f5d61c31c79f0b4660f08e5d07db10
+commit b189bbc48fb4b7c251d30b26a57ad84d1cb6dbe4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 22 15:37:10 2019 -0400
+Date:   Sat Mar 30 19:41:48 2019 -0700
 
-    [serializer] Add err_propagaged_error()
+    Implement hashing of objects
+    
+    Should be improved for hb_bytes_t.
 
- src/hb-serialize.hh | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
+ src/hb-algs.hh      |  2 +-
+ src/hb-array.hh     | 13 +++++++++++++
+ src/hb-serialize.hh |  5 +++++
+ src/hb-vector.hh    |  5 +++++
+ 4 files changed, 24 insertions(+), 1 deletion(-)
 
-commit ae8da4b61b4cc3b55242b85fe7c63393d65bd6cf
+commit d6b28057a5cc636138cd453947d3a2008f18729f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 22 15:25:11 2019 -0400
+Date:   Sat Mar 30 19:31:51 2019 -0700
 
-    Minor
+    Fix hb_hash(pointer)
 
- src/hb-iter.hh | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
+ src/hb-algs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 24da1d08603a7fe262ae88d687986efc0343956f
+commit d74dc3ef65a159fe585e906deccdb32b570433aa
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 22 15:20:25 2019 -0400
+Date:   Sat Mar 30 19:26:37 2019 -0700
 
-    Use variadic template args for propagate_error()
-    
-    Let's see if bots happy.
-    
-    Not sure where else we can use these.  Mm.  Maybe in hb_invoke().
+    [serialize] Don't insert empty object into tree
 
- src/hb-serialize.hh | 7 ++-----
- 1 file changed, 2 insertions(+), 5 deletions(-)
+ src/hb-serialize.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
 
-commit 9bab398462fa598047f34fd6d23e07a91305b1b3
+commit 7fd82283263f8caded4870d6e12f74c7e660fa8d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 22 15:16:35 2019 -0400
+Date:   Sat Mar 30 19:16:20 2019 -0700
 
-    Simplify propagate_error()
+    [serialize] Towards maintaining hashmap
 
- src/hb-serialize.hh | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
+ src/hb-algs.hh      |  2 +-
+ src/hb-serialize.hh | 16 ++++++++++++++--
+ src/hb-vector.hh    |  1 +
+ 3 files changed, 16 insertions(+), 3 deletions(-)
 
-commit ecac94ca763e80d217ba5db429745e8882b38464
+commit f254f45a1e6b1de6d83c97033773d20408772763
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Apr 21 12:27:32 2019 -0400
+Date:   Sat Mar 30 19:05:51 2019 -0700
 
-    [docs] Remove fdo repo
+    [serialize] Only pack main object if there are other objects
     
-    Has not been updated.
+    Avoids a memmove for tables that don't use the object packing mechanism.
 
docs/harfbuzz-docs.xml | 6 +-----
- 1 file changed, 1 insertion(+), 5 deletions(-)
src/hb-serialize.hh | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
 
-commit 8ed7655be89c658219ab702e34a79734ba0efb73
+commit 946d446f9b795f657d56ca443edbc0b77d660a50
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Apr 21 12:25:19 2019 -0400
-
-    Update AUTHORS / COPYING
+Date:   Sat Mar 30 19:03:55 2019 -0700
 
- AUTHORS | 3 +++
- COPYING | 3 ++-
- 2 files changed, 5 insertions(+), 1 deletion(-)
+    [serialize] Copy both sides of the buffer
 
-commit a464cbeecea73aeaa03c262f49fed8584057d9bb
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Apr 19 12:14:09 2019 -0700
+ src/hb-serialize.hh | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
 
-    Revert "Add harfbuzzjs build configuration (#1636)" (#1675)
-    
-    This reverts commit 694cb1beeefe1c54b2e613d2d566a21e248a2c9c.
+commit 8512dc565d310e9fd80d831282736284cc3ecd2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 30 19:01:23 2019 -0700
 
- CMakeLists.txt | 35 -----------------------------------
- 1 file changed, 35 deletions(-)
+    [serialize] Simplify copy
 
-commit 694cb1beeefe1c54b2e613d2d566a21e248a2c9c
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Apr 19 07:51:04 2019 -0700
+ src/hb-serialize.hh | 22 +++++++---------------
+ 1 file changed, 7 insertions(+), 15 deletions(-)
 
-    Add harfbuzzjs build configuration (#1636)
+commit 43725d36322b7277d515b958b5e894e1c892cede
+Merge: 294d520f a7c63cd8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 30 18:51:15 2019 -0700
 
- CMakeLists.txt | 35 +++++++++++++++++++++++++++++++++++
- 1 file changed, 35 insertions(+)
+    Merge branch 'master' into var-subset
 
-commit 42f4bd6b801f96fc33a365db8ab6390e74cef05a
+commit 0b1fe7b716628f7b7b4098da9ef544e1518008f5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Apr 18 19:04:59 2019 -0400
-
-    Minor warning fix again
+Date:   Sat Mar 30 18:48:26 2019 -0700
 
- src/hb-ot-map.cc        | 20 ++++++++++----------
- test/api/test-ot-face.c |  2 +-
- 2 files changed, 11 insertions(+), 11 deletions(-)
+    [serializer] Unbreak for now
 
-commit 267fb9c7163e61c9cdbafbb16005bc659ec5a4a2
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Thu Apr 18 15:17:10 2019 -0700
+ src/hb-serialize.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
-    add spaces
+commit 10f062234eb7c762a36cf750e75fe6f74ee89a3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 30 18:44:01 2019 -0700
 
- src/hb-ot-cff1-table.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+    [map] Shuffle fini code
 
-commit ba0386060d92dffcde2d14f9e523a46ea8713de2
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Thu Apr 18 14:53:35 2019 -0700
+ src/hb-map.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    fix oss-fuzz issue 14345
+commit e6b78003efbe02ba4542cadcc13bc1dd0b1d57b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 30 18:33:30 2019 -0700
 
- src/hb-ot-cff1-table.hh                                 |   3 ++-
- ...testcase-minimized-hb-subset-fuzzer-5923632099885056 | Bin 0 -> 25847 bytes
- 2 files changed, 2 insertions(+), 1 deletion(-)
+    [vector] Add move semantics
 
-commit 63a2108480cca2d9c1a2f61d6642d70496f1a5e3
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Thu Apr 18 13:54:58 2019 -0700
+ src/hb-vector.hh | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
 
-    silence MVC warnings 3rd attempt
+commit 4c4d3c3ed55a8f1eea20593c08322e61fe1cdd3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 30 18:30:50 2019 -0700
 
- src/hb-ot-cff1-table.cc | 5 +++--
- src/hb-ot-cff2-table.cc | 9 +++++----
- 2 files changed, 8 insertions(+), 6 deletions(-)
+    [vector] Add some move and forwarding
 
-commit 705dde57fe7bd5aafe93f284db2aa809aad932dc
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Thu Apr 18 11:32:10 2019 -0700
+ src/hb-serialize.hh | 2 +-
+ src/hb-vector.hh    | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
 
-    silence MVC warnings 2nd attempt
+commit 7c9ceabcef426ca6fc54b70db9dd8cb63937710b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 30 18:19:36 2019 -0700
 
- src/hb-ot-cff1-table.cc | 4 ++--
- src/hb-ot-cff2-table.cc | 8 ++++----
- 2 files changed, 6 insertions(+), 6 deletions(-)
+    [meta] Add hb_move and hb_forward ala std::
 
-commit dd4c37529bcecee33d43015a852a3fcf9e978b7f
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Thu Apr 18 10:38:57 2019 -0700
+ src/hb-meta.hh | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
 
-    silence MVC warnings
+commit 9a19b885f9136b0b7cdfa04679274cd4b6d16188
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 30 18:14:30 2019 -0700
 
- src/hb-cff-interp-common.hh | 2 +-
- src/hb-ot-cff1-table.cc     | 4 ++--
- src/hb-ot-cff2-table.cc     | 8 ++++----
- 3 files changed, 7 insertions(+), 7 deletions(-)
+    [serialize] Flesh out packing
 
-commit 518e6e07f29d9bb7e532313fb0af6177d8022ea5
+ src/hb-serialize.hh | 58 +++++++++++++++++++++++++++++++----------------------
+ 1 file changed, 34 insertions(+), 24 deletions(-)
+
+commit 357c7c611cc20f86c646bd2d392c243140f92d34
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Apr 18 12:21:25 2019 -0400
+Date:   Sat Mar 30 18:13:57 2019 -0700
 
-    Minor
+    [vector] Add copy constructor and assignment operator
 
- src/hb-ot-map.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-vector.hh | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
 
-commit 91d958acc08cb99ddd3b656922e13497b9d1595d
+commit 6f69c9d26fa53cd8a2331395bbc146bfc85fd1e3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Apr 18 10:04:10 2019 -0400
+Date:   Sat Mar 30 18:00:03 2019 -0700
 
-    [array] Simplify copy assignment/constructor
-    
-    To fix bogus MSVC warnings:
-    
-      c:\projects\harfbuzz\src\hb-array.hh(189): warning C4521: 'hb_array_t<Type>': multiple copy constructors specified [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
-      c:\projects\harfbuzz\src\hb-array.hh(189): warning C4522: 'hb_array_t<Type>': multiple assignment operators specified [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+    [serialize] Minor
 
- src/hb-array.hh | 29 +++++++++++++++++++----------
- 1 file changed, 19 insertions(+), 10 deletions(-)
+ src/hb-serialize.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
 
-commit 693d91cd49fda3e728b59e6885bea8d7b01958ef
+commit a43290192beedc6335efc3841c05ec7fa54e8871
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 17 17:59:39 2019 -0400
+Date:   Sat Mar 30 17:51:26 2019 -0700
 
-    [serialize] Fix offset calculation
+    [serialize] Add packed_map
 
- src/hb-serialize.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-map.hh       |  7 +++++++
+ src/hb-serialize.hh | 24 +++++++++++++++++++++---
+ 2 files changed, 28 insertions(+), 3 deletions(-)
 
-commit db0c9a1485ae6ca7ca9af38a43504f1ae4ea09c8
+commit bed150bd2e8d61950ea17d1b5a4bf4705801c1cc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 17 17:58:13 2019 -0400
+Date:   Sat Mar 30 17:26:35 2019 -0700
 
-    [subset] Assert offsets are zero during relocation
-    
-    If they're not, it's a bug in our subsetting logic somewhere.  So check.
+    [serialize] Start fleshing out object stack
 
- src/hb-serialize.hh | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-serialize.hh | 91 ++++++++++++++++++++++++++++++++++++++---------------
+ src/hb-vector.hh    |  9 ++++--
+ 2 files changed, 72 insertions(+), 28 deletions(-)
 
-commit efbba7ad26dda5930f5d1bd5292304835432f504
+commit 63c35651893b2a1c555f728012e9ad36c0f84145
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 17 11:00:08 2019 -0400
+Date:   Sat Mar 30 17:12:40 2019 -0700
 
-    [serializer] Add copy()
-    
-    Calls obj.copy() or obj.operator=() in that order.
+    [serialize] Simplify propagate_error()
 
- src/hb-serialize.hh | 18 ++++++++++++++++++
- 1 file changed, 18 insertions(+)
+ src/hb-serialize.hh | 9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
 
-commit c67a0d581fcc50df5563c23060b4fcd9dac4c87c
+commit dbe9ba6711c6d35374de645097babfd81bc295b2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 17 10:20:02 2019 -0400
+Date:   Sat Mar 30 17:10:59 2019 -0700
 
-    Add HB_RETURN
+    [serialize] Add object_t, link_t, and snapshot_t
 
- src/hb-algs.hh | 13 ++++++-------
- src/hb-meta.hh | 34 ++++++++++++++++++++--------------
- 2 files changed, 26 insertions(+), 21 deletions(-)
+ src/hb-serialize.hh | 32 +++++++++++++++++++++++++++++++-
+ 1 file changed, 31 insertions(+), 1 deletion(-)
 
-commit 6745a600bfec13b3f5468b3d31bab7d82b1e61ce
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Tue Apr 16 17:29:34 2019 -0400
+commit 38d57b9a66008c9722125d4d677d759a910cf2a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 30 16:38:06 2019 -0700
 
-    Comment out ot_languages where fallback suffices
+    [map] Add another TODO item
 
- src/gen-tag-table.py   |  15 +-
- src/hb-ot-tag-table.hh | 443 +++++++++++++++++++++++++------------------------
- src/hb-ot-tag.cc       |  19 ++-
- test/api/test-ot-tag.c |   5 +-
- 4 files changed, 255 insertions(+), 227 deletions(-)
+ src/hb-map.hh | 2 ++
+ 1 file changed, 2 insertions(+)
 
-commit 5daeff3e68e4e202effb152f52702a044c09f386
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Wed Apr 17 09:11:44 2019 -0400
+commit 7fd940f899da4948d2c61ed497c1face42776187
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Mar 30 16:29:19 2019 -0700
 
-    Fix "hb_script_" doc typo
+    [map] Add TODO
 
- src/hb-common.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-map.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
 
-commit 6916b77863cd5ce492a274eb85f196f2152fbb96
+commit 6dcf7c4017619c782dbc8bd2c584bb33df96fc83
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 18:33:51 2019 -0400
+Date:   Sat Mar 30 15:08:39 2019 -0700
 
-    One more auto return type
+    [serialize] Add unused 'tail'
 
- src/hb-iter.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-serialize.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
-commit 5b33427f2c4d596a12f05ffebebfd68655fd63eb
+commit fe05e48086be9ed685b8a6ca4af966660744bc0f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 18:28:17 2019 -0400
+Date:   Sat Mar 30 15:06:25 2019 -0700
 
-    Rename HB_AUTO_RETURN_EXPR to HB_AUTO_RETURN
+    [serialize] Add ran_out_of_room
 
- src/hb-algs.hh | 34 +++++++++++++++++-----------------
- src/hb-meta.hh |  8 ++++----
- 2 files changed, 21 insertions(+), 21 deletions(-)
+ src/hb-serialize.hh | 8 +++++++-
+ src/hb-subset.cc    | 7 ++++++-
+ 2 files changed, 13 insertions(+), 2 deletions(-)
 
-commit da293b0e59a0d6c47e9b3a7807115a168a0a5c94
+commit a7c63cd8f8475c6de7fd5bb6444bf5d24082a191
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 18:27:25 2019 -0400
+Date:   Sat Mar 30 14:59:40 2019 -0700
 
-    Use HB_AUTO_RETURN_EXPR in hb_min/max
+    Split sanitize and dispatch into their own files
 
- src/hb-algs.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/Makefile.sources |   2 +
+ src/hb-dispatch.hh   |  50 +++++++
+ src/hb-machinery.hh  | 369 +-----------------------------------------------
+ src/hb-sanitize.hh   | 388 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 442 insertions(+), 367 deletions(-)
 
-commit 0241a40f2aff43aba045fb7de4a2c3e5f1e9626a
+commit be66b575fc15dbbe82cf1a7fa0b58020e86cffdc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 18:26:30 2019 -0400
+Date:   Sat Mar 30 14:53:54 2019 -0700
 
-    Use auto return type for hb_first/hb_second
+    Move serializer to hb-serialize.hh
 
- src/hb-algs.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/Makefile.sources |   1 +
+ src/hb-machinery.hh  | 164 +-----------------------------------------
+ src/hb-serialize.hh  | 196 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 198 insertions(+), 163 deletions(-)
 
-commit fe30fcd228ff95be1f169f580b30184c8511d1c3
+commit bb22462f292995a724bf20363adf52d3a8357a97
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 17:34:06 2019 -0400
+Date:   Sat Mar 30 14:46:54 2019 -0700
 
-    Use hb_deref_pointer() to reduce number of overloads
+    Whitespace
 
- src/hb-algs.hh | 27 ++++++++++-----------------
- src/hb-meta.hh | 36 +++++++++++++++++++-----------------
- 2 files changed, 29 insertions(+), 34 deletions(-)
+ src/hb-machinery.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
 
-commit c918a6706fa759696569ad6dcaae03fed76306bc
+commit ef33b5d1f6d3ec21e15ad74ca2524a117f594e06
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 17:28:18 2019 -0400
+Date:   Sat Mar 30 14:39:21 2019 -0700
 
-    Properly prioritize hb_hash()
+    [map] Deref pointers before equality check
 
- src/hb-algs.hh | 46 +++++++++++++++++++++++-----------------------
- 1 file changed, 23 insertions(+), 23 deletions(-)
+ src/hb-map.hh  | 6 ++++--
+ src/hb-meta.hh | 4 ++--
+ 2 files changed, 6 insertions(+), 4 deletions(-)
 
-commit 75fd845a4abccc2596f0e1fe2294f936199e61f3
+commit c98f51da719d1792bf23b53a9a345926056bf34d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 17:22:29 2019 -0400
+Date:   Sat Mar 30 14:30:22 2019 -0700
 
-    Move around
+    [map] Templatize hb_map_t
+    
+    Template name is hb_hashmap_t<K,V>.
 
- src/hb-algs.hh | 25 ++++++++++++-------------
- 1 file changed, 12 insertions(+), 13 deletions(-)
+ src/hb-map.hh | 65 ++++++++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 37 insertions(+), 28 deletions(-)
 
-commit 973717175d46d62471772318bb0b607070c53ec7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 16:50:07 2019 -0400
+commit 294d520f6542198fa6cf08764f7732fe138e5c97
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 30 13:58:22 2019 -0700
 
-    Fix priorities
+    more iter changes from master
 
- src/hb-algs.hh | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
+ src/hb-iter.hh               |  4 ++--
+ src/hb-ot-layout-gsubgpos.hh | 12 ++++++------
+ src/test-iter.cc             |  2 +-
+ 3 files changed, 9 insertions(+), 9 deletions(-)
 
-commit 54ece299bcb3436763cc4f3b6b0ca11de8133b28
+commit 4b7f4dbc0cf58d87f4c91f059734e91e4d988480
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 16:45:53 2019 -0400
+Date:   Sat Mar 30 13:48:32 2019 -0700
 
-    Use type aliasing for meta-functions, ie. those returning a type
+    Add hb_deref_pointer()
 
- src/hb-algs.hh   |  3 ++-
- src/hb-array.hh  |  6 +++---
- src/hb-atomic.hh |  2 +-
- src/hb-blob.hh   |  2 +-
- src/hb-common.cc |  2 +-
- src/hb-ft.cc     |  2 +-
- src/hb-iter.hh   |  2 +-
- src/hb-meta.hh   | 12 ++++++------
- src/hb-null.hh   |  6 +++---
- 9 files changed, 19 insertions(+), 18 deletions(-)
+ src/hb-algs.hh | 18 +++++++++++++-----
+ src/hb-meta.hh |  8 ++++++++
+ 2 files changed, 21 insertions(+), 5 deletions(-)
 
-commit 1ce11b44375dae74e8984ace1db4f08c51ac9c38
-Author: David Corbett <corbett.dav@husky.neu.edu>
-Date:   Tue Apr 16 10:04:45 2019 -0400
+commit 8f2ce82f7699e12b80986fcdf408f7b43358bcc8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 30 11:50:24 2019 -0700
 
-    Reduce LangTag from 3 language system tags to 1
+    hb.hh from master
 
- src/gen-tag-table.py   |   13 +-
- src/hb-ot-tag-table.hh | 2078 ++++++++++++++++++++++++------------------------
- src/hb-ot-tag.cc       |   22 +-
- 3 files changed, 1053 insertions(+), 1060 deletions(-)
+ src/hb.hh | 53 -----------------------------------------------------
+ 1 file changed, 53 deletions(-)
 
-commit 155e92f25908830bef192304a2039853f6f5d4b5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 11:35:09 2019 -0400
+commit 3bfd3a367cdd8714b151d2504148b772f1159558
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 30 00:27:02 2019 -0700
 
-    Reduce NullPool size
+    fix build
 
- src/hb-null.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/Makefile.sources | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 4fc2d2d7248171c386c39630aa2612f240669a58
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 11:24:42 2019 -0400
+commit c7ca8853ae286b685d8e3dea342c044237213341
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 30 00:11:58 2019 -0700
 
-    [meta] Flesh out hb_invoke()
+    more change set() to =
 
- src/hb-algs.hh | 14 ++++++++++++--
- 1 file changed, 12 insertions(+), 2 deletions(-)
+ src/hb-ot-layout-common.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
 
-commit e03d9395aa79a29d731607bfd46533b700dc1a37
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 11:20:16 2019 -0400
+commit d75b73a309d5b6064a6e13d9a7eb998e0ec53822
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 30 00:06:54 2019 -0700
 
-    Comment
+    fix rebase errors
+
+ .circleci/config.yml  | 11 -----------
+ src/hb-common.h       |  2 +-
+ src/hb-directwrite.cc | 15 ++++++++++++++-
+ src/hb-directwrite.h  |  3 +++
+ src/hb-null.hh        |  2 +-
+ 5 files changed, 19 insertions(+), 14 deletions(-)
 
- src/hb-algs.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+commit 3fbd242ba62835a5c41164807bfdb0e4f63260da
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 23:53:06 2019 -0700
 
-commit b8e763fd7140b3e298863e04053ec0f3c73a6a70
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 10:50:22 2019 -0400
+    replace .set() with =
+    
+    remove .gitignore
 
-    [meta] Add hb_invoke()
+ .gitignore                  |  1 -
+ src/hb-ot-var-gvar-table.hh | 26 +++++++++++++-------------
+ src/hb-ot-var-hvar-table.hh | 18 +++++++++---------
+ 3 files changed, 22 insertions(+), 23 deletions(-)
 
- src/hb-algs.hh | 34 ++++++++++++++++++++++++++++++++--
- src/hb-iter.hh |  2 +-
- 2 files changed, 33 insertions(+), 3 deletions(-)
+commit 8a8965be39d909198d6c91d5a45aede6802ebd71
+Merge: cc94a9ed 3236623e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 23:38:16 2019 -0700
 
-commit a3fcb9a370ad7a3c205342f831d8529c81660466
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 10:45:20 2019 -0400
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
-    [meta] Add HB_AUTO_RETURN_EXPR, HB_VOID_RETURN_EXPR, hb_priority, hb_has(), hb_get()
-    
-    The first three based on range-v3.
+commit cc94a9ed3b63cf74aa64c83a203137f16c6e152c
+Merge: 435bc7f3 ce6093a9
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 18:41:38 2019 -0700
 
- src/hb-algs.hh | 46 ++++++++++++++++++++++++++++++++++++++++++++++
- src/hb-iter.hh |  7 ++++---
- src/hb-meta.hh | 32 +++++++++++++++-----------------
- src/hb.hh      |  2 +-
- 4 files changed, 66 insertions(+), 21 deletions(-)
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
+    rebase master
 
-commit ff68be31bf2ea82bf6bfcc6f993fb6806a895f97
+commit e5306927994e8e412dea5dd960b8b3ed4ca848eb
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 16 09:59:08 2019 -0400
+Date:   Fri Mar 29 23:31:07 2019 -0700
 
-    Add hb_void_tt<> ala std::void_t
+    [iter] Fix bug in hb_any() and hb_none()
 
- src/hb-meta.hh | 7 +++++++
- 1 file changed, 7 insertions(+)
+ src/hb-iter.hh               |  4 ++--
+ src/hb-ot-layout-gsubgpos.hh | 12 ++++++------
+ src/test-iter.cc             |  2 +-
+ 3 files changed, 9 insertions(+), 9 deletions(-)
 
-commit 89fea21697adfbba5057dd1d69c9806ee86e5ca8
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 15 17:36:09 2019 -0400
+commit ce6093a96ba4c68b4eb4f1cd4b695eb41f1fa334
+Merge: ddb84dce a1177fec
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 10:32:45 2019 -0700
 
-    Fix copyright
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+commit a1177fec8f43a65bca6696378995d6d39d8f6330
+Merge: 58c8c7a4 f505b5d5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 08:43:47 2019 -0700
 
-commit b7384c89e2685cec1b6761c918ec7d91e8ae3af8
+    Merge branch 'master' into var-subset
+    
+    rebase master
+
+commit f505b5d5c9c05741a933b4b986503e1697bbdfdb
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 15 16:53:10 2019 -0400
+Date:   Fri Mar 29 22:55:02 2019 -0700
 
-    [fuzzing] Run valgrind with --leak-check=full
+    [iter] Port remaining "for (auto" instances to daggers
 
test/fuzzing/run-shape-fuzzer-tests.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
src/hb-ot-layout-gsubgpos.hh | 35 +++++++++++++++++++++++------------
+ 1 file changed, 23 insertions(+), 12 deletions(-)
 
-commit 3ff66c00292b20325b0d991dfd5eee80284cb9a8
+commit 668d2d562fec797d779c6d6a43eb6e1c7cfbc07a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 15 16:52:21 2019 -0400
+Date:   Fri Mar 29 22:48:38 2019 -0700
 
-    [fuzzing] Fail if valgrind is requested but not found
+    [iter] One more dagger
 
- test/fuzzing/run-shape-fuzzer-tests.py | 3 +++
- 1 file changed, 3 insertions(+)
+ src/hb-ot-layout-gsubgpos.hh | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
 
-commit 07776b60965d503dfb7fb5c611397e40759b0bdc
+commit d51452500f909803a346f26c71cf4b3f84f619bd
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 15 16:43:34 2019 -0400
+Date:   Fri Mar 29 22:48:12 2019 -0700
 
-    More tweaks to previous commit
-    
-    Delete assignment operator of OffsetTo<> instead of Offset<>.
+    [iter] Remove more wrong &&'s
     
-    In simple ArrayOf<>::sanitize() assert that Type has assignment operator.
-    Ideally we should SFINAE this and fallback to calling Type::sanitize()
-    if assignment operator is not available.  But we don't have a case of
-    that in the codebase.
+    Sigh...
 
- src/hb-open-file.hh |  4 ++--
- src/hb-open-type.hh | 16 +++++++++++-----
- 2 files changed, 13 insertions(+), 7 deletions(-)
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 699de689e9aa2246ba9207c07140ccd564f5ec20
+commit 05f2130a1c479afe7982e8ddcfb3d83af9960e5b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 15 16:00:20 2019 -0400
+Date:   Fri Mar 29 22:40:13 2019 -0700
 
-    Delete default assignment operator Offset<>
+    [iter] More daggers
 
- src/hb-open-type.hh        |  3 +++
- src/hb-ot-cmap-table.hh    |  2 +-
- src/hb-ot-layout-common.hh | 14 +++++++-------
- 3 files changed, 11 insertions(+), 8 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh | 110 +++++++++++++++++++++++++------------------
+ 1 file changed, 64 insertions(+), 46 deletions(-)
 
-commit 02d864aa26359b7f057e2aa81404309e17180d47
+commit 22ec4c3aa5aa41b7aa2a89290851ddd386273579
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 15 15:39:03 2019 -0400
+Date:   Fri Mar 29 22:27:46 2019 -0700
 
-    Add HB_FUNCOBJ()
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1651
+    [iter] More daggers
 
- src/hb-algs.hh | 28 +++++++++++++++-------------
- src/hb-iter.hh | 56 ++++++++++++++++++++++++++++----------------------------
- src/hb-meta.hh | 22 +++++++++++++---------
- src/hb.hh      |  7 +++++++
- 4 files changed, 63 insertions(+), 50 deletions(-)
+ src/hb-ot-layout-gsubgpos.hh | 55 ++++++++++++++++++++++++++------------------
+ 1 file changed, 33 insertions(+), 22 deletions(-)
 
-commit 60be1450ad04612a6c2a6116036dbf3e436018de
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Mon Apr 15 18:05:14 2019 +0100
+commit 688069bbfb40d69fb141371633cd499d91324cc2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 29 22:17:31 2019 -0700
 
-    [Usermanual]: fix Tamil error in Why-do-I-need-a-shaping-engine section.
+    [iter] One more dagger
 
docs/usermanual-what-is-harfbuzz.xml | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
src/hb-ot-layout-gsub-table.hh | 13 +++++--------
+ 1 file changed, 5 insertions(+), 8 deletions(-)
 
-commit 38b1d0b9b2e798dd808a816a397323ed7ba697ab
+commit 90b60bd6909ffc6d0bff3e6901057439460407ca
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 15 12:44:31 2019 -0400
+Date:   Fri Mar 29 22:12:42 2019 -0700
 
-    Move static const to post-struct for a function object
-    
-    Just sending this to bots to see if all happy, then turn it into macro and
-    apply everywhere.
+    Remove HB_DEBUG_WOULD_APPLY
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1651
+    Not that useful.
 
- src/hb-algs.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-debug.hh                | 15 +---------
+ src/hb-ot-layout-gsub-table.hh | 49 ++++++++++----------------------
+ src/hb-ot-layout-gsubgpos.hh   | 64 ++++++++++++++++++------------------------
+ 3 files changed, 43 insertions(+), 85 deletions(-)
 
-commit 19e800c9d881ec016ab2e5fcaadab55ab5188398
+commit 4d28267e59406cc85761131b84c5b2b4c65c6b35
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 15 12:07:00 2019 -0400
+Date:   Fri Mar 29 22:04:15 2019 -0700
 
-    Ugh.  Another try, to unbreak gcc this time!
-    
-    Jenga.
+    [iter] Port more to daggers
 
- src/hb-subset.cc | 7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
+ src/hb-ot-layout-gsub-table.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
 
-commit 3a88f55c15b625a0ad10fbfadf4562bcbb41ae53
+commit 9d8c72042b4a023b55cb39779407fdecaf098af1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 15 11:59:57 2019 -0400
+Date:   Fri Mar 29 21:59:28 2019 -0700
 
-    Move location of HB_UNUSED to make MSVC happy
+    Whitespace
 
- src/hb-subset.cc | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 1ae265888e144328dbf1df796d379bf742c4151a
+commit 418e9d07e2120f806852312f4c74204fa085a6cc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 15 11:31:40 2019 -0400
-
-    Fix gcc warning
-
- src/hb-array.hh | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
+Date:   Fri Mar 29 21:57:26 2019 -0700
 
-commit c0ea37b557f53b50094042f11fe2611b1b30d725
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Mon Apr 15 00:34:04 2019 +0430
+    Simplify code
 
-    [ci] Fix macOS glib issue
+ src/hb-ot-layout-gsub-table.hh | 20 +++-----------------
+ 1 file changed, 3 insertions(+), 17 deletions(-)
 
- .circleci/config.yml | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+commit f5ef8a7347656ad5f5bb8cec5f9a3de262a79411
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 29 21:57:17 2019 -0700
 
-commit ad126036643e44a98c4c42d2a2a4a3b4a3649937
-Merge: 341b70a3 47e538a3
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sun Apr 14 15:42:42 2019 +0100
+    [iter] Port one more function to dagger
 
-    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz
+ src/hb-ot-layout-gpos-table.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
 
-commit cd9889cac3ac3b271f7335f3e94acc4667a59b40
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sun Apr 14 15:33:56 2019 +0100
+commit bcab098c8f35ac4bef6618d949a7bf1d95869fa5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 29 21:49:18 2019 -0700
 
-    Docs: update and extended GTK-Doc comments for hb-ot-math.
+    [iter] Port more code to daggers
 
- src/hb-ot-math.cc | 133 ++++++++++++++++++++++++++++++++----------------------
- src/hb-ot-math.h  |  21 +++++++++
- 2 files changed, 99 insertions(+), 55 deletions(-)
+ src/hb-ot-layout-gsub-table.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
 
-commit 3f74b7a14bffb8e91cd98edd0c3ddf0b0ddc169a
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sun Apr 14 15:20:56 2019 +0100
+commit 4c75158e1803e73d6126f715aa4b22ebe30aa7c7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 29 21:46:13 2019 -0700
 
-    Docs: Regularize GTK-Doc comments for hb-ot-color.
+    [iter] Port two more functions to daggers
 
- src/hb-ot-color.cc | 136 ++++++++++++++++++++++++++++++-----------------------
- src/hb-ot-color.h  |   6 +--
- 2 files changed, 80 insertions(+), 62 deletions(-)
+ src/hb-ot-layout-gsub-table.hh | 29 +++++++++++++++++------------
+ 1 file changed, 17 insertions(+), 12 deletions(-)
 
-commit 47e538a35f9072e5775a65e2bf110ae895818321
+commit e70ccbe9edd4d5e033df4afa728b3593ba9f78af
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 22:50:22 2019 -0400
+Date:   Fri Mar 29 21:45:49 2019 -0700
 
-    Add HB_NO_SUBSET_LAYOUT
+    Fix pair signature
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Oh well.  Again, who does fully understand what is right???
 
- src/hb-subset.cc | 10 +++++++++-
- 1 file changed, 9 insertions(+), 1 deletion(-)
+ src/hb-algs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit a98e4068e76d50bd9562d85a452b56e681f1d62b
+commit 6237b47f0c59fd3913b19b23800cdf83eaa01fb6
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 22:42:44 2019 -0400
+Date:   Fri Mar 29 21:36:49 2019 -0700
 
-    Revert "Hide symbols in hb-iter"
-    
-    This reverts commit 98f14c4cdb837a962083a6702f401d41b4c1ec5c.
-    
-    Same as previous commit.
+    [iter] Add hb_unzip()
 
- src/hb-iter.hh | 88 +++++++++++++++++++++++++++++-----------------------------
- 1 file changed, 44 insertions(+), 44 deletions(-)
+ src/hb-iter.hh | 38 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
 
-commit dab92bdd4623aa7dac8eb00b14131566d75d095e
+commit f1dad91eb3ce9dcdedbb4a0d6e34517db0154a84
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 22:39:38 2019 -0400
+Date:   Fri Mar 29 21:17:08 2019 -0700
 
-    Revert "Hide more symbols"
-    
-    This reverts commit 2e86d50915cf1a791da9acb95245aa820a3d70f4.
-    
-    I think the setup that caused me to do this is faulty and not hiding inlines.
+    Whitespace
 
- src/hb-blob.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-layout-gsub-table.hh | 3 +++
+ 1 file changed, 3 insertions(+)
 
-commit 98f14c4cdb837a962083a6702f401d41b4c1ec5c
+commit 896b31670d07cbe276feff1db249b64faa5c552c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 18:11:18 2019 -0400
+Date:   Fri Mar 29 21:16:30 2019 -0700
 
-    Hide symbols in hb-iter
-    
-    Painful.  All template methods need to be explicitly hidden :(.
-    
-    Maybe we should switch to -fvisibility=hidden pragma.
-    
-    A LOT more to go.
+    [iter] Port two more loops to dagger
 
- src/hb-iter.hh | 88 +++++++++++++++++++++++++++++-----------------------------
- 1 file changed, 44 insertions(+), 44 deletions(-)
+ src/hb-ot-layout-gsub-table.hh | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
 
-commit 2e86d50915cf1a791da9acb95245aa820a3d70f4
+commit 8e34cb251a9b22d6fbc637fd2f25965beb260270
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 18:07:42 2019 -0400
+Date:   Fri Mar 29 21:14:20 2019 -0700
 
-    Hide more symbols
-    
-    Exposed by:
+    [iter] Remove unneeded &&
     
-    $ make -j5 CPPFLAGS="-O0" CXXFLAGS=-flto=thin LDFLAGS=-lc++ && ./check-symbols.sh
+    Next commit needs this.  I never fully get this, sigh.
 
- src/hb-blob.hh | 2 +-
+ src/hb-iter.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit caa20e4ef9dff61a86312daec5d5a1df27d95ff7
+commit 12a4c0441ff13e56bb87f53eab45930c2a6142ed
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 17:59:18 2019 -0400
+Date:   Fri Mar 29 21:06:10 2019 -0700
 
-    Hide a few more symbols
-    
-    Exposed by:
-    
-    $ make CPPFLAGS=-O0
+    Whitespace
 
- src/hb-array.hh | 4 ++--
- src/hb-meta.hh  | 6 +++---
- 2 files changed, 5 insertions(+), 5 deletions(-)
+ src/hb-ot-layout-gsub-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
 
-commit 95df00aec1996d521acdff6deff063ba98214fb9
+commit 4c38a9f6011a9b1dd6c4fc98620e23decc340322
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 17:50:03 2019 -0400
+Date:   Fri Mar 29 20:23:07 2019 -0700
 
-    Hide a few static methods
-    
-    Looks like static methods that do not get inlined end up exported.
-    We have a lot more.  Need to protect all at some point.  Wish there
-    was an easier way, like the visibility flag we pass that automatically
-    hides all inline methods.
-    
-    Was exposed by check-symbols.sh when compiling on OS X 10.14 with:
+    Remove hb_assign()
     
-    $ make CPPFLAGS=-Oz CXXFLAGS=-flto=thin LDFLAGS=-lc++
+    Not needed anymore.  We just use operator= now.
 
- src/hb-aat-layout.hh           |  2 +-
- src/hb-aat-map.hh              |  2 +-
- src/hb-array.hh                |  2 +-
- src/hb-coretext.cc             |  4 ++--
- src/hb-open-file.hh            |  2 +-
- src/hb-open-type.hh            |  3 ++-
- src/hb-ot-cmap-table.hh        | 14 +++++++-------
- src/hb-ot-layout-base-table.hh |  6 +++---
- src/hb-ot-layout-gpos-table.hh |  8 ++++----
- src/hb-ot-layout-gsub-table.hh |  8 ++++----
- src/hb-ot-layout-gsubgpos.hh   |  2 +-
- src/hb-ot-map.hh               |  4 ++--
- src/hb-uniscribe.cc            |  4 ++--
- 13 files changed, 31 insertions(+), 30 deletions(-)
+ src/hb-iter.hh      |  2 +-
+ src/hb-machinery.hh |  2 +-
+ src/hb-null.hh      | 13 -------------
+ src/hb-open-type.hh |  2 +-
+ 4 files changed, 3 insertions(+), 16 deletions(-)
 
-commit 2f4be4ba54b539fbadc31fc53bdcfca81d7db77a
+commit b986c6a321f7d997eba0a9308b651966644bf336
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 16:21:58 2019 -0400
+Date:   Fri Mar 29 20:17:46 2019 -0700
 
-    Add HB_NO_OPTIONS
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [C++11] Remove IntType::set() in favor of operator=
 
- src/hb-debug.hh | 3 +++
- 1 file changed, 3 insertions(+)
+ src/hb-cff-interp-common.hh                |  4 +-
+ src/hb-ft.cc                               |  2 +-
+ src/hb-null.hh                             |  6 ---
+ src/hb-open-file.hh                        | 14 +++---
+ src/hb-open-type.hh                        | 43 +++++++++++------
+ src/hb-ot-cff-common.hh                    | 24 +++++-----
+ src/hb-ot-cff1-table.hh                    | 32 ++++++-------
+ src/hb-ot-cmap-table.hh                    | 77 +++++++++++++++---------------
+ src/hb-ot-glyf-table.hh                    |  2 +-
+ src/hb-ot-hdmx-table.hh                    | 12 ++---
+ src/hb-ot-hmtx-table.hh                    |  8 ++--
+ src/hb-ot-layout-common.hh                 | 44 ++++++++---------
+ src/hb-ot-layout-gdef-table.hh             |  8 ++--
+ src/hb-ot-layout-gsub-table.hh             | 18 +++----
+ src/hb-ot-maxp-table.hh                    | 16 +++----
+ src/hb-ot-os2-table.hh                     | 10 ++--
+ src/hb-ot-post-table.hh                    |  2 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh | 10 ++--
+ src/hb-ot-vorg-table.hh                    | 12 ++---
+ src/hb-subset-cff-common.cc                | 12 ++---
+ src/hb-subset-cff-common.hh                |  2 +-
+ src/hb-subset-cff1.cc                      | 10 ++--
+ src/hb-subset-cff2.cc                      |  8 ++--
+ src/hb-subset-glyf.cc                      |  8 ++--
+ src/hb-uniscribe.cc                        | 22 ++++-----
+ 25 files changed, 206 insertions(+), 200 deletions(-)
 
-commit 079d2dcbb2607cda3daa497199090c5813a51de5
+commit 58ad357951a732f05d9680573d00a4764171a9dd
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 15:00:37 2019 -0400
+Date:   Fri Mar 29 20:05:19 2019 -0700
 
-    Add HB_NO_NAME_TABLE_AAT
+    [vector] Accept all types in push(...)
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Let assignment operator worry about conversion.
 
- src/hb-ot-name-table.hh | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-vector.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
 
-commit 60a58aa61c09cafd12c432fdc1f7325f2a6d44bd
+commit 489faf826ca16e9bc89515869ebaf52653450b54
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 14:58:53 2019 -0400
+Date:   Fri Mar 29 20:01:37 2019 -0700
 
-    Add HB_NO_OT_FONT_BITMAP
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    [C++11] Use type aliases for template partial instantiations
 
- src/hb-ot-font.cc | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-open-type.hh | 24 ++++++++++++++----------
+ 1 file changed, 14 insertions(+), 10 deletions(-)
 
-commit 160c4d8b2d9f6c205b713236f043081e6dd532ee
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 14:57:49 2019 -0400
+commit 3236623e1f4a11c23f8f2fb41d886d1255c2bc63
+Merge: 435bc7f3 d30e5e74
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 18:41:38 2019 -0700
 
-    Add HB_NO_OT_FONT_CFF
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
- src/hb-ot-font.cc | 2 ++
- 1 file changed, 2 insertions(+)
+commit 435bc7f3e2290e108550ed460f4fdeacf25e9f28
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 18:39:30 2019 -0700
 
-commit 35f3b97fac3b106d345a06a4970f6adce182797b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 10:16:12 2019 -0400
+    Update hb-ot-var-gvar-table.hh
 
-    Add HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+ src/hb-ot-var-gvar-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
 
- src/hb-ot-shape-complex-hebrew.cc | 4 ++++
- 1 file changed, 4 insertions(+)
+commit 8fdb8fcf808da7d928aa289e0d1c432223fb1a26
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 18:39:27 2019 -0700
 
-commit 414c5de26b34c0c53f6f4b5f00ddc8e1a3b62ac2
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 10:12:11 2019 -0400
+    fix rebase errors
 
-    Add HB_NO_OT_SHAPE_FALLBACK
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+ src/hb-ot-layout-common.hh  |  21 ++++++--
+ src/hb-ot-var-gvar-table.hh | 119 ++++++++++++++------------------------------
+ 2 files changed, 54 insertions(+), 86 deletions(-)
 
- src/hb-ot-shape-fallback.cc | 12 ++++++++++++
- 1 file changed, 12 insertions(+)
+commit 1ccb457cbb7be2466536661d76d62de9fe582639
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 18:28:25 2019 -0700
 
-commit fe0018f7ef804acefa729e888f5a9935e571079d
+    fix gvar fuzz bug
+
+ src/hb-ot-var-gvar-table.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 3f84589232b5a6397e711774351bfe8dc6b1cfd7
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 09:35:29 2019 -0400
+Date:   Thu Mar 28 21:21:26 2019 -0700
 
-    Add HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    2.4.0
 
- src/hb-ot-shape-complex-thai.cc | 4 ++++
- 1 file changed, 4 insertions(+)
+ NEWS             | 11 +++++++++++
+ configure.ac     |  2 +-
+ src/hb-buffer.h  |  2 +-
+ src/hb-version.h |  6 +++---
+ 4 files changed, 16 insertions(+), 5 deletions(-)
 
-commit 9ddbfa006d752f6ddd3610ff968f84cf18dec031
+commit 282c76d9a01cbe4300d9306d391c387f1890c391
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 12 09:33:25 2019 -0400
+Date:   Thu Mar 28 21:00:58 2019 -0700
 
-    Add HB_NO_OT_LAYOUT_BLACKLIST
+    Use internal bsearch() for language tags
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1639
 
- src/hb-ot-layout.cc | 9 +++++++++
- 1 file changed, 9 insertions(+)
+ src/hb-ot-tag.cc | 46 ++++++++++++++++++++++------------------------
+ 1 file changed, 22 insertions(+), 24 deletions(-)
 
-commit 571fad4cf17d90434562d1b6f5d08b6f27343c7a
+commit 3bed03dc6aded78037b09f21ea1defe842bfb73c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Apr 11 17:54:38 2019 -0400
+Date:   Thu Mar 28 20:50:04 2019 -0700
 
-    Add HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS
+    [indic] Add back medial-consonant to grammar
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1592
 
- src/hb-ot-shape-complex-vowel-constraints.cc | 3 +++
- 1 file changed, 3 insertions(+)
+ src/hb-ot-shape-complex-indic-machine.hh           | 1244 +++++++++++---------
+ src/hb-ot-shape-complex-indic-machine.rl           |    5 +-
+ src/hb-ot-shape-complex-indic.cc                   |    2 +-
+ src/hb-ot-shape-complex-indic.hh                   |    6 +-
+ .../f75c4b05a0a4d67c1a808081ae3d74a9c66509e8.ttf   |  Bin 0 -> 1924 bytes
+ .../data/in-house/tests/indic-syllable.tests       |    2 +
+ 6 files changed, 672 insertions(+), 587 deletions(-)
 
-commit 3db227265bc0790ffd718bf265d245c78598a49d
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Tue Apr 2 18:49:40 2019 +0100
+commit f8803fbacec52d633adc37acfd2c9c79c4c12041
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 28 20:23:12 2019 -0700
 
-    Update gtk-doc annotations for inout counts on various getter functions.
+    [khmer] Add trailing Coeng to syllable grammar
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1541
 
- src/hb-ot-layout.cc | 122 ++++++++++++++++++++++++++++++----------------------
- 1 file changed, 70 insertions(+), 52 deletions(-)
+ src/hb-ot-shape-complex-khmer-machine.hh           | 248 ++++++++++-----------
+ src/hb-ot-shape-complex-khmer-machine.rl           |   2 +-
+ .../ad01ab2ea1cb1a4d3a2783e2675112ef11ae6404.ttf   | Bin 0 -> 1500 bytes
+ test/shaping/data/in-house/tests/khmer-misc.tests  |   1 +
+ 4 files changed, 122 insertions(+), 129 deletions(-)
 
-commit c08ddbd91b7f0fffe761638a2ee4893304b012db
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sun Mar 24 15:07:07 2019 +0000
+commit 93a6a063dc448b7b8303fe10fc9bbf1c2298b5f8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 28 16:57:56 2019 -0700
 
-    [Docs] Minor edits to gtk-doc inline comment review.
+    [ci] Tweak macos and psvita bots (#1638)
+    
+    * Add --with-graphite2 to macOS
+    * Add a dummy ragel script for psvita
 
src/hb-ot-layout.cc | 21 +++++++++++++--------
- 1 file changed, 13 insertions(+), 8 deletions(-)
.circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit af5230bce39020cf6fc87ee5e21cca3ba201a417
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Mon Mar 18 14:03:16 2019 +0000
+commit f84342c094727a41be6225d484d30170d1ddf118
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 28 16:17:36 2019 -0700
 
-    [Docs] Minor; fix formatting for gtk-doc multiple-annotations.
+    minor
 
- src/hb-ot-layout.cc | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
+ src/hb-ot-var-hvar-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 6c0a1e8cd67144d20c8b5fcad23953910eeeea51
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sun Mar 17 14:50:47 2019 +0000
+commit 7e8c4585accc9608a7cb167279ab1ca9e6e1f779
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 28 15:42:45 2019 -0700
 
-    [Docs] Annotate gtk-doc formatting with some un-annotated (out)s.
+    [ci] Use only CircleCI for macOS (#1637)
 
- src/hb-ot-layout.cc | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ .circleci/config.yml |  5 +++--
+ .travis.yml          | 18 ------------------
+ 2 files changed, 3 insertions(+), 20 deletions(-)
 
-commit 5122805c740961d4fdfbff440ed68792b63d50ed
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sun Mar 17 14:43:06 2019 +0000
+commit 3e18447c6445f4d5e35f706f086872a21f46e9f4
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 28 15:07:49 2019 -0700
 
-    [Docs] Fix gtk-doc formatting for (out) and (inout).
+    fixed a fuzzer bug
 
- src/hb-ot-layout.cc | 108 ++++++++++++++++++++++++++--------------------------
- 1 file changed, 54 insertions(+), 54 deletions(-)
+ src/hb-ot-var-hvar-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit d3178aa52ae822ac6af606027ac8150ded0a2966
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sun Mar 17 14:27:27 2019 +0000
+commit 4774283a2c8c286bc431fa1c56950ece3b57f13f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 28 13:44:38 2019 -0700
 
-    [Docs] Fix gtk-doc references to 'kern' table functions, clarifying that GPOS is not examined.
+    Fix shell syntax error
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1612
 
- src/hb-ot-layout.cc | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
+ src/check-symbols.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 3449031fad9dff7acedde7dceb0e47db708fc025
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sat Mar 16 15:38:08 2019 +0000
+commit 4b763affa640735cf5c7382e15f16dbcb88cf54e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Mar 28 11:11:52 2019 -0700
 
-    [Docs] Add inline gtk-doc documentation of GDEF glyph classes.
+    Comment
 
- src/hb-ot-layout.h | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 930f6fc3da04ce1897e65862fccb03afa9d3a780
-Author: Nathan Willis <nwillis@glyphography.com>
-Date:   Sat Mar 16 15:10:21 2019 +0000
+commit d9d6649bf2de061704651eb2b7f57f4434e75c49
+Author: punchcutter <zarijoscha@gmail.com>
+Date:   Wed Mar 27 23:12:58 2019 -0700
 
-    [Docs] Add inlind gtk-doc comments for hb-ot-layout functions.
+    Override USE category for Grantha and Tirhuta visargas to allow marks
 
- src/hb-ot-layout.cc | 456 +++++++++++++++++++++++++++++++++++++++++++++++++++-
- src/hb-ot-layout.h  |  11 ++
- 2 files changed, 462 insertions(+), 5 deletions(-)
+ src/gen-use-table.py                 | 3 ++-
+ src/hb-ot-shape-complex-use-table.cc | 4 ++--
+ 2 files changed, 4 insertions(+), 3 deletions(-)
 
-commit b52c0e54b9855a1f3d400e4dbcd0372520f2c2fc
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Apr 11 11:20:10 2019 -0400
+commit 13ae138af3e108eb81a0df907f1232f581245091
+Author: Egor Pugin <egor.pugin@gmail.com>
+Date:   Thu Mar 28 19:06:12 2019 +0300
 
-    Use injected class name to simplify macros
+    Disable unwanted C++ definitions for MSVC.
+    
+    MSVC does not set __cplusplus to the latest standard and also it does not like redefining some keywords.
 
- src/hb-open-type.hh | 10 +++++-----
- src/hb.hh           | 14 --------------
- 2 files changed, 5 insertions(+), 19 deletions(-)
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit baf1e79075b0f917b79484446cd2ca47b58f50aa
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Apr 11 11:18:04 2019 -0400
+commit 53d40426e10f14b2b4e583b7d51f23bfefbd0700
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Mar 27 08:52:46 2019 -0700
 
-    [C++11] Use deleted methods
+    tweaked recursion checks
 
- src/hb.hh | 30 +++++++++++++++---------------
- 1 file changed, 15 insertions(+), 15 deletions(-)
+ src/hb-ot-glyf-table.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
 
-commit 824fd342d5d66584a5ed88951e05975f33c55617
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Apr 11 11:16:01 2019 -0400
+commit dc07ecbd80814f79733ce3a2662d17bcbb54b1e9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 27 16:38:39 2019 +0430
 
-    Rename a few macros
+    [ci] remove ragel from psvita compile bot
 
- src/hb-map.hh       |  2 +-
- src/hb-open-type.hh | 10 +++++-----
- src/hb-set.hh       |  2 +-
- src/hb.hh           | 12 ++++++------
- 4 files changed, 13 insertions(+), 13 deletions(-)
+ .circleci/config.yml | 1 -
+ 1 file changed, 1 deletion(-)
 
-commit edfc6be4a0362efa5c1d39f4792a28b5726c3ce5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 10 15:53:48 2019 -0400
+commit dd3624b6d5186e910dd70dd6939192507324b089
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 27 16:21:47 2019 +0430
 
-    [arabic] Disable fallback shaping if HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK defined
+    [ci] Don't install ragel on cmake build bot images
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    It is not needed anyway
 
- src/hb-ot-shape-complex-arabic-fallback.hh | 1 -
- src/hb-ot-shape-complex-arabic.cc          | 4 ++++
- 2 files changed, 4 insertions(+), 1 deletion(-)
+ .circleci/config.yml | 5 -----
+ 1 file changed, 5 deletions(-)
 
-commit 4d31662b5da20790f6f860cec8f5fdabf48210f0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 10 15:40:03 2019 -0400
+commit 4f351754bbb91795b373e12c2c004f59c071af1d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 26 20:35:01 2019 -0700
 
-    Don't install ot-font funcs on new fonts if HB_NO_OT_FONT defined
-    
-    Currently linker cannot GC hb-ot-font completely because we install
-    it on fonts by default.  Don't do that if HB_NO_OT_FONT defined.
-    
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    add recursion checks
 
- src/hb-font.cc | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-ot-glyf-table.hh | 24 ++++++++++++++----------
+ 1 file changed, 14 insertions(+), 10 deletions(-)
 
-commit b111b3de020cde6fb0686efc224cace4608f2e45
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 10 15:38:15 2019 -0400
+commit 0008963b28d57f180bcd7930d63b451381f4a02f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 26 17:10:46 2019 -0700
 
-    Don't use any default unicode funcs if HB_NO_UNICODE_FUNCS is defined
+    add support of anchor point & SCALED/UNSCALED_COMPONENT_OFFSET
     
-    Part of https://github.com/harfbuzz/harfbuzz/issues/1652
+    some code cleanup
 
- src/hb-unicode.cc | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ src/hb-ot-glyf-table.hh                            | 166 ++++++++++++++-------
+ src/hb-ot-var-gvar-table.hh                        |  38 ++++-
+ test/api/fonts/SourceSansVariable-Roman.anchor.ttf | Bin 0 -> 4708 bytes
+ test/api/test-ot-metrics-tt-var.c                  |  33 ++++
+ 4 files changed, 179 insertions(+), 58 deletions(-)
 
-commit c5509be93a351177724f2891dd5e9ddb02553452
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 8 14:50:58 2019 -0400
+commit ea281aa8d07dac2b90bf4762882a3f3d2bca8249
+Author: Behdad Esfahbod <behdad@fb.com>
+Date:   Tue Mar 26 16:18:03 2019 -0700
 
-    [coretext] Fix unused-variable error
+    Use class templates for Null objects
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1659
+    This allows partial-instantiating custom Null object for template Lookup<T>.
+    Before, this had to be handcoded per instantiation.  Apparently I missed
+    adding one for AAT::ankr.lookupTable, so it was getting the wrong (generic)
+    null for Lookup object, which is wrong and unsafe.
+    
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=944346
 
- src/hb-coretext.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-aat-layout-common.hh                        |  14 ++++------
+ src/hb-null.hh                                     |  31 +++++++++++++--------
+ ...case-minimized-harfbuzz_fuzzer-5748102301614080 | Bin 0 -> 213 bytes
+ 3 files changed, 24 insertions(+), 21 deletions(-)
 
-commit 4c19aa26204d0dc2f08b6e4a824e9088301f68d8
-Author: Maks Naumov <maksqwe1@ukr.net>
-Date:   Fri Apr 5 21:46:27 2019 +0300
+commit 1dfc2dfff57802633d819a66708c210f76174461
+Author: Behdad Esfahbod <behdad@fb.com>
+Date:   Tue Mar 26 16:17:45 2019 -0700
 
-    Fix MSVC C4068 warning (#1656)
+    [aat] Add missing check to ankr table
+    
+    Isn't absolutely needed.  But helps.
 
- src/hb-blob.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-aat-layout-ankr-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit e44b83aac0443bd23df15b505a3d638883621b0e
-Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Fri Apr 5 10:15:08 2019 -0700
+commit 782961d216f53ff3237bdb6fd9544f54a1bc69a5
+Author: Behdad Esfahbod <behdad@fb.com>
+Date:   Mon Mar 25 15:15:37 2019 -0700
 
-    replace test font SourceHanSans with its subet
+    [docs] Update
 
- ...gular.default.3042,3044,3046,3048,304A,304B.otf |    Bin 6356 -> 0 bytes
- ...gular.default.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 6564 -> 0 bytes
- .../SourceHanSans-Regular.default.61,63,65,6B.otf  |    Bin 5532 -> 0 bytes
- ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6780 -> 0 bytes
- .../SourceHanSans-Regular.default.660E.otf         |    Bin 5248 -> 0 bytes
- ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 537992 -> 0 bytes
- ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 692312 -> 0 bytes
- ...ular.desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 531624 -> 0 bytes
- ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 692496 -> 0 bytes
- ...ans-Regular.desubroutinize-retain-gids.660E.otf |    Bin 613836 -> 0 bytes
- ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 6272 -> 0 bytes
- ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 6456 -> 0 bytes
- ...eHanSans-Regular.desubroutinize.61,63,65,6B.otf |    Bin 5460 -> 0 bytes
- ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6572 -> 0 bytes
- .../SourceHanSans-Regular.desubroutinize.660E.otf  |    Bin 5224 -> 0 bytes
- ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 537424 -> 0 bytes
- ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 691692 -> 0 bytes
- ...ints-desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 531124 -> 0 bytes
- ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 691808 -> 0 bytes
- ....drop-hints-desubroutinize-retain-gids.660E.otf |    Bin 613348 -> 0 bytes
- ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 6096 -> 0 bytes
- ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 6204 -> 0 bytes
- ...gular.drop-hints-desubroutinize.61,63,65,6B.otf |    Bin 5344 -> 0 bytes
- ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6268 -> 0 bytes
- ...Sans-Regular.drop-hints-desubroutinize.660E.otf |    Bin 5120 -> 0 bytes
- ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 537492 -> 0 bytes
- ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 691788 -> 0 bytes
- ...-Regular.drop-hints-retain-gids.61,63,65,6B.otf |    Bin 531164 -> 0 bytes
- ...-Regular.drop-hints-retain-gids.61,63,65,6B.ttx | 393879 ------------------
- ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 692008 -> 0 bytes
- ...HanSans-Regular.drop-hints-retain-gids.660E.otf |    Bin 613368 -> 0 bytes
- ...ar.drop-hints.3042,3044,3046,3048,304A,304B.otf |    Bin 6164 -> 0 bytes
- ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 6300 -> 0 bytes
- ...ourceHanSans-Regular.drop-hints.61,63,65,6B.otf |    Bin 5376 -> 0 bytes
- ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 6472 -> 0 bytes
- .../SourceHanSans-Regular.drop-hints.660E.otf      |    Bin 5140 -> 0 bytes
- ...r.retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 538076 -> 0 bytes
- ...r.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 692420 -> 0 bytes
- ...urceHanSans-Regular.retain-gids.61,63,65,6B.otf |    Bin 531704 -> 0 bytes
- ...r.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 692700 -> 0 bytes
- .../SourceHanSans-Regular.retain-gids.660E.otf     |    Bin 613860 -> 0 bytes
- ...ubset.default.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 3028 bytes
- ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 3240 bytes
- ...eHanSans-Regular_subset.default.61,63,65,6B.otf |    Bin 0 -> 2200 bytes
- ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 3460 bytes
- .../SourceHanSans-Regular_subset.default.660E.otf  |    Bin 0 -> 1920 bytes
- ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 90956 bytes
- ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 125820 bytes
- ...bset.desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 0 -> 88392 bytes
- ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 126004 bytes
- ...ular_subset.desubroutinize-retain-gids.660E.otf |    Bin 0 -> 103780 bytes
- ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 2952 bytes
- ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 3136 bytes
- ...s-Regular_subset.desubroutinize.61,63,65,6B.otf |    Bin 0 -> 2132 bytes
- ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 3256 bytes
- ...eHanSans-Regular_subset.desubroutinize.660E.otf |    Bin 0 -> 1896 bytes
- ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 90656 bytes
- ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 125468 bytes
- ...ints-desubroutinize-retain-gids.61,63,65,6B.otf |    Bin 0 -> 88156 bytes
- ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 125584 bytes
- ....drop-hints-desubroutinize-retain-gids.660E.otf |    Bin 0 -> 103556 bytes
- ...esubroutinize.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 2792 bytes
- ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 2896 bytes
- ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf |    Bin 0 -> 2028 bytes
- ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 2964 bytes
- ...gular_subset.drop-hints-desubroutinize.660E.otf |    Bin 0 -> 1804 bytes
- ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 90724 bytes
- ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 125560 bytes
- ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf |    Bin 0 -> 88196 bytes
- ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 125780 bytes
- ...-Regular_subset.drop-hints-retain-gids.660E.otf |    Bin 0 -> 103572 bytes
- ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 2848 bytes
- ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 2988 bytes
- ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf |    Bin 0 -> 2060 bytes
- ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 3164 bytes
- ...ourceHanSans-Regular_subset.drop-hints.660E.otf |    Bin 0 -> 1824 bytes
- ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf |    Bin 0 -> 91040 bytes
- ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf |    Bin 0 -> 125924 bytes
- ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf |    Bin 0 -> 88468 bytes
- ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf |    Bin 0 -> 126208 bytes
- ...urceHanSans-Regular_subset.retain-gids.660E.otf |    Bin 0 -> 103800 bytes
- test/subset/data/fonts/SourceHanSans-Regular.otf   |    Bin 16427580 -> 0 bytes
- .../data/fonts/SourceHanSans-Regular_subset.otf    |    Bin 0 -> 2707728 bytes
- test/subset/data/tests/cff-japanese.tests          |      2 +-
- 84 files changed, 1 insertion(+), 393880 deletions(-)
+ docs/harfbuzz-docs.xml | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit a96d003d6ec4212fadad4f5b9058c9f8b07bcf89
-Author: Maks Naumov <maksqwe1@ukr.net>
-Date:   Fri Apr 5 12:29:56 2019 +0300
+commit d4fb54508d17d1c64636f336a699ef8352d8c863
+Author: Behdad Esfahbod <behdad@fb.com>
+Date:   Mon Mar 25 15:08:14 2019 -0700
 
-    Fix MSVC C4138 warning (#1657)
+    Update ChangeLog generation
+    
+    Let's see if I can make a release on Mac...
 
src/hb-ot-cff-common.hh | 2 +-
Makefile.am | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit c68eb7002f1c2b847d955797e27f5403199e3d9d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 3 16:24:12 2019 -0700
+commit 2f97cd7a525c64a98730466f195d1d3c5cd3ea50
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Mar 26 10:37:24 2019 -0700
 
-    Minor
+    completely remove lines that are commented out
 
- src/hb-ot-layout-common.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-subset-plan.cc | 6 ------
+ src/hb-subset-plan.hh | 3 ---
+ 2 files changed, 9 deletions(-)
 
-commit 85adf4ad5c76172514f281bfbe3850ef35473cc7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 3 16:06:55 2019 -0700
+commit e74d646d9ee3ecfda4f338a0e3bf2e0564fb1858
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Mar 26 09:15:56 2019 -0700
 
-    [GDEF] Don't assume glyphlist is sorted
-    
-    As was hit by the fuzzer.
-    
-    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14032
+    update arguments in_populate_gids_to_retain() and _create_old_gid_to_new_gid_map()
+    so they don't use deprecated variable
 
- src/hb-ot-layout-common.hh | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
+ src/hb-subset-plan.cc | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
 
-commit ecabdffc61cb0b71424f4845aeda8cd0a6d25a29
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 3 16:06:34 2019 -0700
+commit b12a5daad7cd5ec4c019c8d4827bf8456ef632c9
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Mar 25 19:59:37 2019 -0700
 
-    [algs] Add hb_min() and hb_max()
+    try to remove deprecated variable from struct definition
 
- src/hb-algs.hh | 11 +++++++++++
- 1 file changed, 11 insertions(+)
+ src/hb-subset-plan.cc | 9 +++++----
+ src/hb-subset-plan.hh | 2 +-
+ 2 files changed, 6 insertions(+), 5 deletions(-)
 
-commit 7b863142ceb82fc2fd23802f19f7379aa2f152e5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 3 15:48:27 2019 -0700
+commit 9c5d694af2c6146833011498c3adcf68c0123c31
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 22 11:05:23 2019 -0700
 
-    [serialize] Make putting breakpoint on out-of-memory easier
+    add HVAR & VVAR advance width api test
 
src/hb-serialize.hh | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
test/api/test-ot-metrics-tt-var.c | 41 +++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 39 insertions(+), 2 deletions(-)
 
-commit 2bd275023405b6a669d59ad4cdcb2e8cb410d593
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 3 15:31:53 2019 -0700
+commit ae3db1f4e3bb1c451e04b96125cb95cdfce964d4
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 21 18:09:37 2019 -0700
 
-    [iter] Tweak SFINAE again
+    added api test for subset VVAR & bug fix
     
-    Don't think we need hb_is_same().
+    added a mod copy of SourceSerifVariable-Roman.ttf with VVAR as a test font
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-var-hvar-table.hh                        |   7 +-
+ test/api/Makefile.am                               |   2 +
+ .../fonts/SourceSerifVariable-Roman-VVAR.abc.ttf   | Bin 0 -> 5632 bytes
+ ...ourceSerifVariable-Roman-VVAR.ac.retaingids.ttf | Bin 0 -> 5288 bytes
+ .../fonts/SourceSerifVariable-Roman-VVAR.ac.ttf    | Bin 0 -> 3224 bytes
+ test/api/test-subset-vvar.c                        | 103 +++++++++++++++++++++
+ 6 files changed, 108 insertions(+), 4 deletions(-)
 
-commit f02ebc89ec89e78a348f9b67d613a2024feabc18
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 3 15:23:06 2019 -0700
+commit b3007ec2098884721979c1105a0f1e428b95e2ca
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 21 09:50:53 2019 -0700
 
-    [array] Add compy assignment operator since copy constructor is explicit
+    regenerated expected full fonts data after fontTools bug 1550 fixed
 
- src/hb-array.hh | 6 ++++++
- 1 file changed, 6 insertions(+)
+ ...eSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 5928 -> 5924 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-commit 20a73da2c9227a0f9bc943a3d766eedeb5bed3b3
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 3 14:32:15 2019 -0700
+commit fe5aa8b36c040b3561e33aac79006337fffda282
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Mar 20 15:10:59 2019 -0700
+
+    added TT VF full font test & fixed bugs
+    
+    updated CFF2 VF api test results too
+
+ src/hb-ot-layout-common.hh                         |  34 +++++++++++---
+ src/hb-ot-var-hvar-table.hh                        |  51 +++++++++++----------
+ test/api/fonts/AdobeVFPrototype.abc.otf            | Bin 6772 -> 6952 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nohints.otf     | Bin 6096 -> 6272 bytes
+ .../fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf  | Bin 6160 -> 6152 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf     | Bin 6376 -> 6336 bytes
+ test/api/fonts/AdobeVFPrototype.ac.otf             | Bin 6312 -> 6460 bytes
+ test/api/fonts/AdobeVFPrototype.ac.retaingids.otf  | Bin 6316 -> 6464 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 0 -> 5464 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 0 -> 5432 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 0 -> 5924 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 0 -> 5464 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 0 -> 5432 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 0 -> 5928 bytes
+ .../data/fonts/SourceSerifVariable-Roman.ttf       | Bin 0 -> 586100 bytes
+ test/subset/data/tests/full-font.tests             |   1 +
+ 16 files changed, 56 insertions(+), 30 deletions(-)
+
+commit 2bd2e656f96111bc1261e4670851c2dc5f3acfd9
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 19 18:23:14 2019 -0700
 
-    [array] Add default copy constructor
-    
-    MSVC seems to need it.
+    update CFF2 test results
 
- src/hb-array.hh | 1 +
- 1 file changed, 1 insertion(+)
+ test/api/fonts/AdobeVFPrototype.abc.otf               | Bin 7456 -> 6772 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nohints.otf        | Bin 6780 -> 6096 bytes
+ .../api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf | Bin 6844 -> 6160 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf        | Bin 7060 -> 6376 bytes
+ test/api/fonts/AdobeVFPrototype.ac.otf                | Bin 6996 -> 6312 bytes
+ test/api/fonts/AdobeVFPrototype.ac.retaingids.otf     | Bin 7000 -> 6316 bytes
+ 6 files changed, 0 insertions(+), 0 deletions(-)
 
-commit d419a9a4376de7b2ae1dec7df09f8d034cc2d039
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 3 14:18:19 2019 -0700
+commit 212dcb758c9c43dc74da3d4507a54ac78c6bee57
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 19 16:00:01 2019 -0700
 
-    [iter] Use different SFINAE scheme to make MSVC happy
+    add api test cases for HVAR with index map (and fix)
+
+ src/hb-ot-var-hvar-table.hh |  2 +-
+ test/api/test-subset-hvar.c | 76 +++++++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 71 insertions(+), 7 deletions(-)
+
+commit dc10a7ef603b911b15596e80f12b702ecfcd60c4
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 19 12:34:03 2019 -0700
+
+    add gvar & HVAR retain-gids test cases
+
+ .../SourceSansVariable-Roman.ac.retaingids.ttf     | Bin 0 -> 3040 bytes
+ test/api/test-subset-gvar.c                        |  22 ++++++++++++++++++++
+ test/api/test-subset-hvar.c                        |  23 +++++++++++++++++++++
+ 3 files changed, 45 insertions(+)
+
+commit 43420dfa964c2ee4ccc359001e5664def5371623
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 19 01:00:53 2019 -0700
+
+    fix test build
+
+ test/api/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6ee71166b0003b3464d9a20554a0270f5ead5194
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 19 00:41:41 2019 -0700
+
+    add api tests for subset gvar & HVAR; bug fixes
+
+ src/hb-ot-layout-common.hh                      |   3 +-
+ src/hb-ot-var-gvar-table.hh                     |  24 +++----
+ src/hb-ot-var-hvar-table.hh                     |  19 +++++-
+ test/api/Makefile.am                            |   2 +
+ test/api/fonts/SourceSansVariable-Roman.abc.ttf | Bin 0 -> 3240 bytes
+ test/api/fonts/SourceSansVariable-Roman.ac.ttf  | Bin 0 -> 3028 bytes
+ test/api/test-subset-gvar.c                     |  81 ++++++++++++++++++++++++
+ test/api/test-subset-hvar.c                     |  81 ++++++++++++++++++++++++
+ 8 files changed, 194 insertions(+), 16 deletions(-)
+
+commit 6e066464f0c1611738ff784ee7f8f3d84645e85f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Mar 18 18:11:00 2019 -0700
+
+    replaced tt var api test with a composite glyph
     
-    From Orvid King: TLDR; MSVC has some issues using sizeof(declval<T>()) for
-    SFINAE of templated types, so I just used SFINAE in a different context where
-    MSVC doesn't have the issue.
+    for better coverage
 
- src/hb-iter.hh | 21 ++++++++++++---------
- 1 file changed, 12 insertions(+), 9 deletions(-)
+ .../SourceSansVariable-Roman-nohvar-41,C1.ttf      | Bin 0 -> 4696 bytes
+ test/api/fonts/SourceSansVariable-Roman.abc.ttf    | Bin 3168 -> 0 bytes
+ test/api/test-ot-metrics-tt-var.c                  |  36 ++++++++++-----------
+ 3 files changed, 18 insertions(+), 18 deletions(-)
 
-commit 2778df7972f537192b51cd0719adf2ab4d1f3397
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Apr 3 14:15:01 2019 -0700
+commit 84d0af456bb42f5a468fb5ef9edb04647e7840d8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Mar 18 17:50:20 2019 -0700
 
-    [meta] Add hb_is_same()
+    move rounding advance width to glyf
 
- src/hb-meta.hh | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
+ src/hb-ot-glyf-table.hh | 24 ++++++++++++++----------
+ src/hb-ot-hmtx-table.cc |  8 ++++----
+ 2 files changed, 18 insertions(+), 14 deletions(-)
 
-commit 6215fb8e68bdf69f4af9f7f4959ad55a70723774
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 23:10:03 2019 -0700
+commit 10f264da7518ba3cc48b635d00343ecce9d734e7
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Mar 18 17:16:43 2019 -0700
 
-    [serialize] Actually reclaim storage from duplicate objects
+    fix empty glyf's advance width
 
- src/hb-serialize.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-glyf-table.hh | 8 +++++++-
+ src/hb-ot-hmtx-table.cc | 4 ++--
+ 2 files changed, 9 insertions(+), 3 deletions(-)
 
-commit 3305a2cad24f878f5d8773c2acae491ebd5a9059
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 22:42:22 2019 -0700
+commit 511518c759c13ebad32e4879146c036c9af031ac
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Mar 18 15:39:10 2019 -0700
 
-    [serialize] Port to use object pool
+    add api test for tt var advance widths
     
-    Tested, but feels fragile :(.
+    stripped HVAR from SourceSansVariable-Roman.abc.ttf so glyf gets parsed
 
- src/hb-pool.hh      |   5 +-
- src/hb-serialize.hh | 141 ++++++++++++++++++++++++++++++++--------------------
- 2 files changed, 91 insertions(+), 55 deletions(-)
+ src/hb-ot-hmtx-table.hh                         |   1 -
+ test/api/fonts/SourceSansVariable-Roman.abc.ttf | Bin 3240 -> 3168 bytes
+ test/api/test-ot-metrics-tt-var.c               |  37 ++++++++++++++++++++++++
+ 3 files changed, 37 insertions(+), 1 deletion(-)
 
-commit 5efbc01174127bede4d533866acac239e5a0cfd5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 22:41:06 2019 -0700
+commit bee8d86671c45b093d4f238ceba9eebe4120e0bb
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Mar 18 10:48:53 2019 -0700
 
-    [pool] Uses memset() instead of assigning Null()
+    fix build
+
+ src/hb-ot-hmtx-table.cc     | 15 ++++-----------
+ src/hb-ot-hmtx-table.hh     | 15 +++++++++------
+ src/hb-ot-var-gvar-table.hh |  1 +
+ 3 files changed, 14 insertions(+), 17 deletions(-)
+
+commit f74712a4e025375730176be7578359945bedcef0
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 17 22:49:18 2019 -0700
+
+    fix composite glyf extents
+
+ src/hb-ot-glyf-table.hh     | 41 +++++++++++++++++++++++++++--------------
+ src/hb-ot-var-gvar-table.hh |  3 +++
+ 2 files changed, 30 insertions(+), 14 deletions(-)
+
+commit cd817e7955c45c3e56b33a304027e7fd6c6e0520
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 17 18:45:30 2019 -0700
+
+    fix unpack_points
+
+ src/hb-ot-var-gvar-table.hh | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit a35e3dfc775f8a86b8a95623059f581c02cf8e00
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 17 17:48:10 2019 -0700
+
+    fix infer_delta
     
-    Assignment is invalid on invalid object.
+    code cleanup
 
- src/hb-pool.hh | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
+ src/hb-ot-glyf-table.hh     | 22 ++++++++++++++--------
+ src/hb-ot-var-gvar-table.hh |  9 +++++++--
+ 2 files changed, 21 insertions(+), 10 deletions(-)
 
-commit 434d78bf91ac5204ffbf2144f199eb7a0f65c421
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 21:46:40 2019 -0700
+commit 4f4fbb1d5e4b120336a2f8f6d23417b64888b37e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 17 16:01:49 2019 -0700
 
-    Add hb_pool_t<> for pooled memory allocation
+    added explicit casts to metrics
 
- src/Makefile.sources |  1 +
- src/hb-pool.hh       | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 99 insertions(+)
+ src/hb-ot-hmtx-table.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
 
-commit 8e4df1a152f3916613594fa1bac308efdb61d512
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 20:20:53 2019 -0700
+commit c302ec6d945411b3023e9a633ea288aa3024366d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 17 15:36:26 2019 -0700
 
-    [serialize] Disable packed_map again
+    moved most of var code from gvar to glyf
     
-    Ugh.  Need to think of something else.
+    initialize phantom points from metrics from htmx/vmtx & glyf bbox before execution
+    added source file hb-ot-hmtx-table.cc to call glyf from hmtx/vmtx indirectly & temporarily, workaround a cyclic reference between the two
 
- src/hb-serialize.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/Makefile.sources        |   1 +
+ src/hb-ot-face.hh           |   1 -
+ src/hb-ot-font.cc           |   8 +-
+ src/hb-ot-glyf-table.hh     | 236 +++++++++++++++++++++++++++++++++++++-------
+ src/hb-ot-hmtx-table.cc     |  61 ++++++++++++
+ src/hb-ot-hmtx-table.hh     |  39 ++++----
+ src/hb-ot-var-gvar-table.hh | 123 ++++++++---------------
+ src/hb-ot-var-hvar-table.hh |  10 +-
+ 8 files changed, 333 insertions(+), 146 deletions(-)
+
+commit bd040a43548b30e8e7ff56cacbf35885becb6173
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 16 16:27:33 2019 -0700
 
-commit 31c1a83899147310b27bd40fac755c629cb59cef
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 20:17:27 2019 -0700
+    add components transformation
 
-    [map] Protect more against pointer deref
+ src/hb-ot-glyf-table.hh     | 44 ++++++++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-var-gvar-table.hh | 31 ++++++++++++++++++-------------
+ 2 files changed, 60 insertions(+), 15 deletions(-)
 
- src/hb-map.hh | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
+commit 139e87b56caf46a63bb78290316b3ddeb71e1e65
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 16 00:08:03 2019 -0700
 
-commit 5bffa9e375fe294718452ad51e4c5ff017a046b4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 20:13:16 2019 -0700
+    fix tt var extents & add test
 
-    More
+ src/hb-ot-glyf-table.hh                         |  32 +--
+ src/hb-ot-var-gvar-table.hh                     | 257 ++++++++++++------------
+ test/api/Makefile.am                            |   1 +
+ test/api/fonts/SourceSansVariable-Roman.abc.ttf | Bin 0 -> 3240 bytes
+ test/api/test-ot-metrics-tt-var.c               |  72 +++++++
+ 5 files changed, 223 insertions(+), 139 deletions(-)
 
- src/hb-map.hh    | 5 +++++
- src/hb-set.hh    | 9 ++++++++-
- src/hb-vector.hh | 8 ++++----
- 3 files changed, 17 insertions(+), 5 deletions(-)
+commit 9584b090bbd4286d611dda4de00f81c87f808ec7
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 15 13:46:25 2019 -0700
 
-commit 5b66b033fd2cd9c95284d283f08d6789c7ec985d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 19:27:02 2019 -0700
+    cff2 subset fuzzer issues (#1619)
+    
+    * add check to FDArray::serialize
+    
+    * add test files
+    
+    * fix off by one
 
-    [serialize] Fix hb_hashmap_t<> for pointers and use in packed_map
+ src/hb-ot-cff-common.hh                                   |   1 +
+ ...z-testcase-minimized-hb-subset-fuzzer-5739000398086144 | Bin 0 -> 620 bytes
+ ...z-testcase-minimized-hb-subset-fuzzer-5760768497156096 | Bin 0 -> 210 bytes
+ ...z-testcase-minimized-hb-subset-fuzzer-5764268627066880 | Bin 0 -> 687 bytes
+ 4 files changed, 1 insertion(+)
 
- src/hb-array.hh     | 12 +++++++++++-
- src/hb-map.hh       | 22 ++++++++++++++--------
- src/hb-serialize.hh |  8 +++-----
- src/hb-vector.hh    |  1 +
- 4 files changed, 29 insertions(+), 14 deletions(-)
+commit 161e61fc3beae6173253f7ec13b504dc70052cc1
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 21:49:04 2019 -0800
 
-commit 42ab32cbbaf8b403c351953f091c0fbe8464c4cb
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 18:41:33 2019 -0700
+    minor edits
 
-    [iter] Remove passing pointer to hb_iter()
+ src/hb-ot-layout-common.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ebbfe36510e50fb713469437d625c5c9293154cd
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 15:14:22 2019 -0800
+
+    calculate VF advance widths from gvar & glyf
+
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9690461a91df3a6bb467cc111e0dfe1da20a821e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Feb 26 11:11:50 2019 -0800
+
+    Added hb-ot-var-gvar-table.hh
     
-    While doable with hb_deref_pointer() as well, we also would then
-    need to do it in a ton of places.  Not worth it / messy.
+    implemented sanitize()
+    placeholder subset()
+    some code cleanup
 
- src/hb-array.hh  | 2 +-
- src/hb-iter.hh   | 5 -----
- src/test-iter.cc | 3 ---
- 3 files changed, 1 insertion(+), 9 deletions(-)
+ src/hb-ot-gvar-table.hh     | 211 --------------------------------------------
+ src/hb-ot-var-gvar-table.hh |  12 +--
+ 2 files changed, 6 insertions(+), 217 deletions(-)
 
-commit d0da547b3741323493398eed8975a76f4a5742c2
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 18:22:39 2019 -0700
+commit 9168b32a1bb4ce4efbdefbee8ea7d0b73fb84753
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Feb 25 09:59:27 2019 -0800
 
-    [array] Use dagger for hashing array
+    renamed hb_map2_t to hb_bimap_h in its own .hh
+
+ src/hb-ot-gvar-table.hh    | 211 +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-common.hh |  77 -----------------
+ 2 files changed, 211 insertions(+), 77 deletions(-)
+
+commit d102c7a65258b3421f4d5628e5630e8688528743
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Feb 22 10:22:08 2019 -0800
+
+    unuse set in hb_map2_t impl
     
-    Also switch to better mixing.
+    also some code cleanup
 
- src/hb-array.hh | 9 +++++----
- 1 file changed, 5 insertions(+), 4 deletions(-)
+ src/hb-ot-layout-common.hh | 46 +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
 
-commit b6f29bf14153cac51b218e3aaba9e1b3aa747a8c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 18:12:01 2019 -0700
+commit dd67214210da15c6b61096cde3d60ac3a238967c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Feb 20 15:48:29 2019 -0800
 
-    [iter] Accept pointers in hb_iter()
+    subset HVAR
     
-    No idea how to avoid dupicating code.  Was hoping hb_deref_pointer()
-    would do it, but looks like a pointer can't bind to a universal
-    reference T&&.  Humm.
+    Re-implemented & repurposed CFF:remap_t as hb_map2_t (moved to hb-ot-layout-common.hh) for two-way mapping for use by index map subsetting.
+    Hooked up HVAR subsetter through _subset2.
+    Some renaming in CFF code.
 
- src/hb-iter.hh   | 5 +++++
- src/test-iter.cc | 3 +++
- 2 files changed, 8 insertions(+)
+ src/hb-ot-layout-common.hh  | 81 +++++++++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-var-hvar-table.hh |  2 +-
+ 2 files changed, 79 insertions(+), 4 deletions(-)
 
-commit fc24bb9046e7e39d52a245bdc3480a30095cb6ee
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 17:49:52 2019 -0700
+commit 5bbe78a0f353bb806a686fd97ad411fa8a9ebf5b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 14 16:49:42 2019 -0700
 
-    [serialize] Towards maintaining packed_map
+    Allow zero length ranges in sanitization (#1617)
+    
+    Fixes fvar table sanitization where there are no named instance
+    by allowing zero length ranges starting from Null() address.
+    
+    Fixes #1607
 
- src/hb-serialize.hh | 4 ++++
- 1 file changed, 4 insertions(+)
+ src/hb-machinery.hh      |  30 ++++++++++++++++--------------
+ test/api/fonts/Zycon.ttf | Bin 0 -> 21036 bytes
+ test/api/test-ot-face.c  |   9 +++++++++
+ 3 files changed, 25 insertions(+), 14 deletions(-)
 
-commit aa2293a55eaa39f4e77b60851bbdee56b1120225
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 17:42:10 2019 -0700
+commit ee8719eaaf4d5719053f0ba21a2b116771aa1b2f
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Mar 14 21:41:25 2019 +0200
 
-    [serialize] Minor
+    [ci] Cache FreeType build on Travis
 
- src/hb-open-type.hh | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
+ .ci/build-freetype.sh | 17 +++++++++++++++++
+ .travis.yml           | 18 ++++++++++++------
+ 2 files changed, 29 insertions(+), 6 deletions(-)
 
-commit e42b82c828ecec6f534040dae5518e04643b5f10
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 17:21:54 2019 -0700
+commit 5d7725ad1a950bceaef184b113fd5a8b7ba3dff7
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Mar 12 19:30:47 2019 -0400
 
-    [serialize] Handle non-nullable offsets
+    Categorize U+09FC as Consonant_Placeholder
 
- src/hb-open-type.hh | 13 +++++++++----
- 1 file changed, 9 insertions(+), 4 deletions(-)
+ src/hb-ot-shape-complex-indic.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit e04518bafc66224887bf7f478e1affb54bc7acd0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 17:20:04 2019 -0700
+commit b150bb4a49d9214f747c55d506975ea9b4f0a60e
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Mar 13 13:21:12 2019 +0200
 
-    [serialize] Movce empty-object handling earlier
+    [ci] Simplify and fix Travis CI macOS build
 
src/hb-serialize.hh | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
.travis.yml | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
 
-commit 7f73c9744e6c0e8dd37a208b75a4bc299bccbd4d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 17:12:24 2019 -0700
+commit 628d457c871954bdbf2bca2cc7b1bb821f4bd638
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 12 11:03:53 2019 -0700
 
-    [serialize] Minor
+    add gvar::get_extents
 
- src/hb-open-type.hh | 14 +++++---------
- 1 file changed, 5 insertions(+), 9 deletions(-)
+ src/hb-ot-face.hh           |   1 +
+ src/hb-ot-font.cc           |   3 +
+ src/hb-ot-glyf-table.hh     |  21 ++++--
+ src/hb-ot-var-gvar-table.hh | 164 +++++++++++++++++++++++++++++++++++++++++---
+ 4 files changed, 175 insertions(+), 14 deletions(-)
 
-commit 5a3de4f4f8791139d2c04a66244001aba192ef6b
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Apr 2 16:53:05 2019 -0700
+commit 7b27fe5255b14e7701966b1435e2bb5585b29cbc
+Author: Behdad Esfahbod <behdad@fb.com>
+Date:   Mon Mar 11 18:09:51 2019 -0700
 
-    [serialize] Allow offset links that have base offset from the object base
-    
-    Rarely used, but used, in name table or similar constructs.
+    Remove redundant hb_ot_layout_lookup_would_substitute_fast
 
- src/hb-serialize.hh | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
+ src/hb-ot-layout.cc              | 13 -------------
+ src/hb-ot-layout.hh              |  7 -------
+ src/hb-ot-shape-complex-indic.cc |  2 +-
+ src/hb-ot-shape-complex-khmer.cc |  2 +-
+ 4 files changed, 2 insertions(+), 22 deletions(-)
 
-commit edad6b2c450e22e67ae86c5f2328cca3c29aaad2
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Apr 3 00:48:59 2019 +0430
+commit 56164f754f0302cb99fecc30298699a1216c94ab
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Mar 12 01:09:27 2019 +0200
 
-    [test][iter] minor, fix double promotion warning
+    [doc] Add placeholder since version for new flag
 
- src/test-iter.cc | 2 +-
+ src/hb-buffer.h | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 062f5d6e7aa061358eb5874a8f3a3f3bd6e9f16f
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Apr 2 20:27:00 2019 +0430
+commit cb758f2669cfd04e732788f6ca8bead67a1a5ee8
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Mar 8 09:46:48 2019 -0500
 
-    [test] minor, c style comments
+    Remove obsolete overrides from Indic/USE scripts
 
- src/test-iter.cc | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/gen-indic-table.py               |  4 ----
+ src/gen-use-table.py                 | 30 +++++++-----------------------
+ src/hb-ot-shape-complex-use-table.cc |  2 +-
+ 3 files changed, 8 insertions(+), 28 deletions(-)
 
-commit afdbf960d6147ec607ddb2c780d3a83068f61357
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Apr 2 20:25:06 2019 +0430
+commit 40c4bd3e123deb97506526d868cbc94b972b4bee
+Author: Eric Muller <emuller@amazon.com>
+Date:   Tue Feb 12 11:41:16 2019 -0800
 
-    [iter][test] Add another test for hb_reduce
-    
-    Different initial and accumulator types
+    Update generation code for hb-ot-shape-complex-vowel-constraints.cc. Remove 'unlikely'
 
- src/test-iter.cc | 6 ++++++
- 1 file changed, 6 insertions(+)
+ src/gen-vowel-constraints.py                 | 3 +++
+ src/hb-ot-shape-complex-vowel-constraints.cc | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
 
-commit bfa02bef4546f448e048288c1162988c8c39322a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 1 21:36:13 2019 -0700
+commit ce7f2c4da3a933444b3c331c08847a9d7d0f2ef0
+Author: Eric Muller <emuller@amazon.com>
+Date:   Sun Feb 10 04:31:41 2019 -0800
 
-    [serialize] Switch to tetris-packing
+    Fix coding style.
 
- src/hb-open-type.hh | 15 +++++++++++----
- 1 file changed, 11 insertions(+), 4 deletions(-)
+ src/hb-ot-shape-complex-hangul.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit f0ea3ac17bef98409d302b9f285e94015e069823
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 1 21:36:03 2019 -0700
+commit a86356913e65efff195697016de27cc8cbd2186f
+Author: Eric Muller <emuller@amazon.com>
+Date:   Sat Feb 9 02:55:27 2019 -0800
 
-    [serialize] Fix linking
+    Add a flag to hb_buffer_t to prevent the insertion of dotted circles on incorrect character sequences.
+    
+    Current behavior unchanged if this flag is not set (and it isn't by default).
 
- src/hb-serialize.hh | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ src/hb-buffer.h                              | 7 ++++++-
+ src/hb-ot-shape-complex-hangul.cc            | 3 ++-
+ src/hb-ot-shape-complex-indic.cc             | 3 +++
+ src/hb-ot-shape-complex-khmer.cc             | 3 +++
+ src/hb-ot-shape-complex-myanmar.cc           | 3 +++
+ src/hb-ot-shape-complex-use.cc               | 3 +++
+ src/hb-ot-shape-complex-vowel-constraints.cc | 3 +++
+ src/hb-ot-shape.cc                           | 3 +++
+ 8 files changed, 26 insertions(+), 2 deletions(-)
 
-commit 7c0e2054e0799ed89cdc5de8c1416d009c0029b5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 1 21:32:29 2019 -0700
+commit 9b5556d985b6d06a2475af588cc329385b29ffa4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 8 01:33:41 2019 +0330
 
-    [serialize] Minor
+    Add a macOS 10.14.3 fonts tests (#1608)
 
- src/hb-serialize.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ .circleci/config.yml                         | 11 +++++++++++
+ test/shaping/data/in-house/tests/macos.tests | 19 +++++++++++++++++++
+ 2 files changed, 30 insertions(+)
 
-commit 64d0f0893812fa1cb2746071d8b021560969526d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 1 16:50:28 2019 -0700
+commit 4a19d3b0806ed110ac5f05492ab98caabfa6306e
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Mar 6 12:37:25 2019 -0500
 
-    [cmap] Minor
+    Update to Unicode 12.0.0
 
- src/hb-ot-cmap-table.hh | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
+ src/gen-use-table.py                         |    1 -
+ src/gen-vowel-constraints.py                 |    1 +
+ src/hb-common.h                              |    8 +
+ src/hb-ot-shape-complex-arabic-table.hh      |   14 +-
+ src/hb-ot-shape-complex-indic-table.cc       |   56 +-
+ src/hb-ot-shape-complex-use-table.cc         |   49 +-
+ src/hb-ot-shape-complex-vowel-constraints.cc |    4 +-
+ src/hb-ot-shape-complex.hh                   |    3 +
+ src/hb-ot-tag-table.hh                       |   12 +-
+ src/hb-ucdn.cc                               |    4 +
+ src/hb-ucdn/ucdn.h                           |   11 +
+ src/hb-ucdn/ucdn_db.h                        | 2998 +++++++++++++-------------
+ src/hb-unicode-emoji-table.hh                |    6 +-
+ 13 files changed, 1631 insertions(+), 1536 deletions(-)
 
-commit 2e675cc7b50b5a57ceddf799d63811801ffcfe94
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 1 16:45:50 2019 -0700
+commit 4f03d5c79d6fccbd63ede421daa9d270e7677964
+Author: Adrian Wong <adrianwjw@gmail.com>
+Date:   Wed Feb 13 21:04:46 2019 +1100
 
-    [subset] Call serialize start/end around it
+    [indic] Remove superfluous ZWNJ check in final reorder of pre-base matras
+
+ src/hb-ot-shape-complex-indic.cc | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 7b7852efa5422b2e1481addf09e6c0afa0b25830
+Author: Stephan Bergmann <sbergman@redhat.com>
+Date:   Tue Mar 5 17:18:57 2019 +0100
+
+    Fix hb_atomic_* variants based on C++11 atomics
     
-    To be cleaned up.
+    I stumbled over this when trying to upgrade the version of HarfBuzz used by
+    LibreOffice to 3.2.1 (see <https://gerrit.libreoffice.org/plugins/gitiles/core/
+    +/b7ddc514bff9bdf682abae537f990aa01dc2c0fb%5E!/> "Upgrade to latest
+    HarfBuzz 2.3.1"), where building with MSVC 2017 failed like
+    
+    > c:\cygwin\home\tdf\lode\jenkins\workspace\gerrit_windows\workdir\unpackedtarball\harfbuzz\src\hb-atomic.hh(272): error C2440: 'reinterpret_cast': cannot convert from 'const int *' to 'std::atomic<int> *'
+    > c:\cygwin\home\tdf\lode\jenkins\workspace\gerrit_windows\workdir\unpackedtarball\harfbuzz\src\hb-atomic.hh(272): note: Conversion loses qualifiers
+    > c:\cygwin\home\tdf\lode\jenkins\workspace\gerrit_windows\workdir\unpackedtarball\harfbuzz\src\hb-atomic.hh(272): error C2227: left of '->load' must point to class/struct/union/generic type
+    
+    (see <https://ci.libreoffice.org/job/gerrit_windows/29916/>).
+    
+    I added all the necessary "const" to make building of HarfBuzz 2.3.1 with
+    MSVC 2017 succeed for me.  There may be more missing at least conceptually.
 
- src/hb-subset.cc | 2 ++
- 1 file changed, 2 insertions(+)
+ src/hb-atomic.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit abe33c6149719eb371c5f2b0d8c143550938129e
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 1 16:45:40 2019 -0700
+commit 72962420465f6d4b6b140032f2b14feea0e54fb9
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Mon Mar 4 11:12:21 2019 +0700
 
-    [serialize] Assert stack
+    Fix offset drift in graphite integration
 
- src/hb-serialize.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/hb-graphite2.cc | 35 +++++++++++++++++++----------------
+ 1 file changed, 19 insertions(+), 16 deletions(-)
 
-commit 72e9b2c16cd1bc183226ca0aa8a58a5b1222573d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 1 16:17:30 2019 -0700
+commit 5fc99b3d341a120d22f9789d0ce112af3eaa0d83
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 21:54:49 2019 -0800
 
-    [serialize] Add add_link() to add link
+    fix build
 
- src/hb-serialize.hh | 26 +++++++++++++++++++++++---
- 1 file changed, 23 insertions(+), 3 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-commit 74addbecac3b8be699ac90b3853970f6c7efd0eb
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Apr 1 14:17:09 2019 -0700
+commit 696b841a5a0c8b3d54514e76f442455c31c5107d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 21:49:04 2019 -0800
 
-    [serialize] Add default template type to push()
+    minor edits
 
- src/hb-serialize.hh | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
+ src/hb-ot-cff-common.hh    | 2 +-
+ src/hb-ot-layout-common.hh | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
 
-commit b8642087e6c2ec96dc70fcef617128b6ce353a7e
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Tue Apr 2 00:30:06 2019 +0430
+commit 14be8b9e877c2f3998e28241f1c1cc9aa2d03238
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 21:33:21 2019 -0800
 
-    [iter] hb_reduce, accumulator with a different type
+    build fix attempt
 
- src/hb-iter.hh   | 22 ++++++++++++----------
- src/test-iter.cc | 26 +++++++++++++++++++++++++-
- 2 files changed, 37 insertions(+), 11 deletions(-)
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit e526414c759ebca82f1071cdeafe1160bcaa9637
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Mar 31 12:41:58 2019 +0430
+commit 618de1c7f9973c2297e4488e2d5e0698e209a87d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 18:24:56 2019 -0800
 
-    [iter] Implement hb_reduce
+    more build fixes
 
- src/hb-iter.hh   | 28 ++++++++++++++++++++++++++++
- src/test-iter.cc |  5 +++++
- 2 files changed, 33 insertions(+)
+ src/hb-ot-glyf-table.hh     |  2 +-
+ src/hb-ot-var-gvar-table.hh | 13 ++++++-------
+ 2 files changed, 7 insertions(+), 8 deletions(-)
 
-commit f3aca6aa267f7687a0406c7c545aefb5eed300b2
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Mar 31 21:37:14 2019 -0700
+commit f2c556594a54196ed3cce771afc6371249463068
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 18:12:31 2019 -0800
 
-    [serialize] Implement linking
-    
-    Untested!
+    fix build attempt
 
- src/hb-serialize.hh | 29 +++++++++++++++++++++++++++--
- 1 file changed, 27 insertions(+), 2 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
 
-commit 17f0cfa7ea3a5f0946d8800b98c1582c05dad853
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Mar 31 21:34:19 2019 -0700
+commit 64eb1ddc2685d830fb0f96447dbd3a2734874218
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 2 03:24:49 2019 +0330
 
-    Move BEInt to hb.hh
+    Minor, remove .editorconfig hack
     
-    I knows...
+    As vscode is going to support it soon
 
- src/hb-machinery.hh | 88 ----------------------------------------------------
- src/hb.hh           | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 89 insertions(+), 88 deletions(-)
+ .editorconfig | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
 
-commit 78fc43f2930064cd6cf4229c1e4cb76edb8ed7f6
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Mar 31 19:17:07 2019 -0700
+commit 40dfca72132775b8a2fc34b3b9aea0999f1e193a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 15:14:22 2019 -0800
 
-    [iter] Fix up build, ouch
-    
-    Yeah, some things not very clear...
+    calculate VF advance widths from gvar & glyf
 
- src/hb-iter.hh   | 8 ++++++--
- src/test-iter.cc | 4 ++--
- 2 files changed, 8 insertions(+), 4 deletions(-)
+ src/hb-ot-glyf-table.hh     | 151 ++++++++++++++++
+ src/hb-ot-hmtx-table.hh     |  23 ++-
+ src/hb-ot-var-gvar-table.hh | 410 +++++++++++++++++++++++++++++++++++++++-----
+ 3 files changed, 542 insertions(+), 42 deletions(-)
 
-commit e5d6fe9782a9fcde0786392c075c6c0b85c24829
-Author: Jonathan Kew <jfkthame@gmail.com>
-Date:   Sun Mar 31 19:17:32 2019 +0100
+commit d0b6d539f6b5424b8f769f800c1126a5cf5374c9
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 28 17:25:05 2019 -0800
 
-    Don't skip setting the .end field of the first range
-    
-    Fixes a bug in CoverageFormat2::serialize whereby the first range
-    was not serialized correctly if it consists of only a single glyph ID.
-    This broke shaping of U+0626 in the Arabic fallback shaper, because it
-    is not found in the coverage table of the 'init' and 'medi' lookups.
-    
-    Also fix similar bug in ClassDefFormat2::serialize, noted during code
-    inspection (I haven't observed a case that was actually affected by
-    this, but it looks broken).
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1504
+    Make hb_subset_input_glyph_set () actually do something.
 
- src/hb-ot-layout-common.hh | 14 +++++++++-----
- 1 file changed, 9 insertions(+), 5 deletions(-)
+ src/hb-subset-plan.cc       |  3 +++
+ test/api/hb-subset-test.h   | 11 ++++++++++-
+ test/api/test-subset-glyf.c | 24 ++++++++++++++++++++++++
+ 3 files changed, 37 insertions(+), 1 deletion(-)
 
-commit 8a8d45b924cdb4343b4b11a7ef14e2d1fabb6f82
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Mar 31 19:00:09 2019 -0700
+commit a842fdfbf0986c05b91efa02a5d95583e80511e9
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Feb 26 16:54:00 2019 -0800
 
-    [iter] Adjust hb_copy() and use it
-    
-    Untested.
+    gvar::subset()
 
- src/hb-iter.hh   | 11 ++++-------
- src/hb-vector.hh |  4 ++--
- 2 files changed, 6 insertions(+), 9 deletions(-)
+ src/hb-ot-var-gvar-table.hh | 81 +++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 71 insertions(+), 10 deletions(-)
 
-commit ba4b7be45523e88c26f763f8a329cc43c13b98a1
+commit c2e9d750351665324fa86d8d20eace9fe349892d
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Sun Mar 31 01:32:30 2019 -0700
+Date:   Fri Feb 22 13:13:42 2019 +0330
 
-    Remove coretext_aat shaper (#1581)
-    
-    coretext_aat was a temporary shaper to redirect shaping of AAT fonts
-    to CoreText and leaving the rest for HarfBuzz.  As HarfBuzz now supports
-    AAT and Chrome now actually ships that on a stable version on macOS,
-    we no longer care about such use-case.  If a client really wants 100%
-    metrics compatibility with CoreText better to use it directly or through
-    our API.  Replicating the same behavior still is possible using
-    hb_shape_full, something we don't care or like to offer anymore.
+    [dwrite] hb_directwrite_face_create, a new API
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1478
-
- src/hb-coretext.cc    | 56 ---------------------------------------------------
- src/hb-shaper-list.hh |  4 ----
- 2 files changed, 60 deletions(-)
+    It makes a hb_face_t from IDWriteFontFace, useful when using
+    DirectWrite facilities for font selection, loading and rendering
+    but using harfbuzz for shaping.
 
-commit d6005b49b32410543a8dfa93ce2a213223cf8f01
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 19:49:56 2019 -0700
+ src/hb-directwrite.cc | 70 +++++++++++++++++++++++++++++++++++++++++++++++----
+ src/hb-directwrite.h  |  5 +++-
+ 2 files changed, 69 insertions(+), 6 deletions(-)
 
-    [serialize] Start implementing linking
+commit 2c5ed7f152afe989e039de4e6d41a7e72f0de80f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Feb 26 11:11:50 2019 -0800
 
- src/hb-serialize.hh | 15 ++++++++++++---
- 1 file changed, 12 insertions(+), 3 deletions(-)
+    Added hb-ot-var-gvar-table.hh
+    
+    implemented sanitize()
+    placeholder subset()
+    some code cleanup
 
-commit 313b3057c335da6baa4cd447bac95812992413b9
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 19:46:35 2019 -0700
+ src/Makefile.sources        |   1 +
+ src/hb-bimap.hh             |   6 +-
+ src/hb-ot-gvar-table.hh     | 211 --------------------------------------------
+ src/hb-ot-var-gvar-table.hh | 207 +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-var-hvar-table.hh |  14 +--
+ src/hb-subset.cc            |   4 +
+ 6 files changed, 222 insertions(+), 221 deletions(-)
+
+commit 087b9a0ad0759f6c190597ec5ee65d998fd2b829
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Feb 18 22:30:40 2019 -0500
 
-    [serializer] Implement dedup!
+    Fix or document unsupported font-feature-settings
 
- src/hb-serialize.hh | 18 +++++++++++++++---
- 1 file changed, 15 insertions(+), 3 deletions(-)
+ src/hb-common.cc | 18 ++++++++++++------
+ util/options.cc  |  3 ++-
+ 2 files changed, 14 insertions(+), 7 deletions(-)
 
-commit b189bbc48fb4b7c251d30b26a57ad84d1cb6dbe4
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 19:41:48 2019 -0700
+commit bb29ece23ae860f923741bb09af6efcf56ac41c4
+Author: Joël R. Langlois <joel.r.langlois@gmail.com>
+Date:   Mon Feb 25 15:26:58 2019 -0500
 
-    Implement hashing of objects
+    Remove Forcing Diagnostic Colours from CMakeLists.txt (#1597)
     
-    Should be improved for hb_bytes_t.
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1596
 
- src/hb-algs.hh      |  2 +-
- src/hb-array.hh     | 13 +++++++++++++
- src/hb-serialize.hh |  5 +++++
- src/hb-vector.hh    |  5 +++++
- 4 files changed, 24 insertions(+), 1 deletion(-)
+ CMakeLists.txt | 12 ------------
+ 1 file changed, 12 deletions(-)
 
-commit d6b28057a5cc636138cd453947d3a2008f18729f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 19:31:51 2019 -0700
+commit f1e97c189ec506ec1dfd74a413884b63dedcb682
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Feb 25 09:59:27 2019 -0800
 
-    Fix hb_hash(pointer)
+    renamed hb_map2_t to hb_bimap_h in its own .hh
 
- src/hb-algs.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/Makefile.sources        |   1 +
+ src/hb-bimap.hh             | 109 +++++++++++++++++++++++
+ src/hb-ot-cff-common.hh     |   4 +-
+ src/hb-ot-cff1-table.hh     |   4 +-
+ src/hb-ot-gvar-table.hh     | 211 ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-common.hh  |  84 +-----------------
+ src/hb-ot-var-hvar-table.hh |  12 +--
+ src/hb-subset-cff-common.cc |   2 +-
+ src/hb-subset-cff-common.hh |   4 +-
+ src/hb-subset-cff1.cc       |   8 +-
+ src/hb-subset-cff2.cc       |   2 +-
+ 11 files changed, 343 insertions(+), 98 deletions(-)
+
+commit 655bc96bc23265f85c1c3c531957ee7e4aa3bf2c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Feb 22 14:53:06 2019 -0800
 
-commit d74dc3ef65a159fe585e906deccdb32b570433aa
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 19:26:37 2019 -0700
+    subset VVAR & outer indices
 
-    [serialize] Don't insert empty object into tree
+ src/hb-ot-var-hvar-table.hh | 49 ++++++++++++++++++++++++++++++++++++---------
+ src/hb-subset.cc            |  3 +++
+ 2 files changed, 43 insertions(+), 9 deletions(-)
 
- src/hb-serialize.hh | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
+commit 6ecfaaa6d5f0fd7f3ab3e1670a055b372975fffb
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Feb 22 10:22:08 2019 -0800
 
-commit 7fd82283263f8caded4870d6e12f74c7e660fa8d
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 19:16:20 2019 -0700
+    unuse set in hb_map2_t impl
+    
+    also some code cleanup
 
-    [serialize] Towards maintaining hashmap
+ src/hb-ot-layout-common.hh | 46 +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
 
- src/hb-algs.hh      |  2 +-
- src/hb-serialize.hh | 16 ++++++++++++++--
- src/hb-vector.hh    |  1 +
- 3 files changed, 16 insertions(+), 3 deletions(-)
+commit a762cf5033e4520cc01949854a772207bb27191f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Feb 21 16:42:30 2019 -0800
 
-commit f254f45a1e6b1de6d83c97033773d20408772763
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 19:05:51 2019 -0700
+    fixed compiler gripes
 
-    [serialize] Only pack main object if there are other objects
+ src/hb-ot-var-hvar-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit a00d1d5e7454dadf70328c723111f219b0ef9a39
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Feb 21 16:34:49 2019 -0800
+
+    fix CFF2 local subr subsetting
     
-    Avoids a memmove for tables that don't use the object packing mechanism.
+    bug exposed by impl change of fdmap
+    also fixed name of subr_remap_ts as subr_remaps_t
 
- src/hb-serialize.hh | 7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
+ src/hb-subset-cff-common.hh |  8 ++++----
+ src/hb-subset-cff2.cc       | 20 +++++++++-----------
+ 2 files changed, 13 insertions(+), 15 deletions(-)
 
-commit 946d446f9b795f657d56ca443edbc0b77d660a50
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 19:03:55 2019 -0700
+commit 8bd9d28e2a4d21aa939918626121e90e37d1e61f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Feb 21 15:47:27 2019 -0800
 
-    [serialize] Copy both sides of the buffer
+    fix HVAR & VarStore subsetting
 
- src/hb-serialize.hh | 13 +++++++++----
- 1 file changed, 9 insertions(+), 4 deletions(-)
+ src/hb-ot-layout-common.hh  |  15 +++--
+ src/hb-ot-var-hvar-table.hh | 140 ++++++++++++++++++++++----------------------
+ 2 files changed, 77 insertions(+), 78 deletions(-)
 
-commit 8512dc565d310e9fd80d831282736284cc3ecd2e
+commit 4fd02f6ee58ebf7b4ecf0526328938c5bd74a180
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 19:01:23 2019 -0700
+Date:   Fri Mar 29 17:57:59 2019 -0700
 
-    [serialize] Simplify copy
+    Remove unused line
 
- src/hb-serialize.hh | 22 +++++++---------------
- 1 file changed, 7 insertions(+), 15 deletions(-)
+ src/hb-machinery.hh | 1 -
+ 1 file changed, 1 deletion(-)
 
-commit 0b1fe7b716628f7b7b4098da9ef544e1518008f5
+commit 9a5b15dc1eda4f34496bb942d78f0df4e975b469
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 18:48:26 2019 -0700
+Date:   Fri Mar 29 17:57:24 2019 -0700
 
-    [serializer] Unbreak for now
+    [C++11] Replace BEInt.set() with operator=
 
- src/hb-serialize.hh | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
+ src/hb-machinery.hh | 15 +++++++++++----
+ src/hb-open-type.hh |  8 ++++----
+ 2 files changed, 15 insertions(+), 8 deletions(-)
 
-commit 10f062234eb7c762a36cf750e75fe6f74ee89a3d
+commit 0aa59b1de34ddebc242cca3ebddde6859269f5f1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 18:44:01 2019 -0700
+Date:   Fri Mar 29 17:49:55 2019 -0700
 
-    [map] Shuffle fini code
+    [C++11] Add operator= to IntType<>
+    
+    Now that we require C++11 we can do this.
 
- src/hb-map.hh | 2 +-
+ src/hb-open-type.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit e6b78003efbe02ba4542cadcc13bc1dd0b1d57b0
+commit eca466e6b1a3e29532af92a2d30b2555c0fafbfc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 18:33:30 2019 -0700
+Date:   Fri Mar 29 15:59:04 2019 -0700
 
-    [vector] Add move semantics
+    Err.  Fixup C++11 polyfill removal
+    
+    Fixes 1d75db19fb5df139b9648ff3f5e6184a5c554345
 
- src/hb-vector.hh | 16 ++++++++++++++++
- 1 file changed, 16 insertions(+)
+ src/hb.hh | 27 +++++++++++++++++++++------
+ 1 file changed, 21 insertions(+), 6 deletions(-)
 
-commit 4c4d3c3ed55a8f1eea20593c08322e61fe1cdd3c
+commit 3f36c89f2ea16e293f8af7e7f549ebcd7247ea97
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 18:30:50 2019 -0700
+Date:   Fri Mar 29 15:22:46 2019 -0700
 
-    [vector] Add some move and forwarding
+    Inline explicit_operator macro
+    
+    Now that we require C++11, no need to macro.
 
- src/hb-serialize.hh | 2 +-
- src/hb-vector.hh    | 8 ++++----
- 2 files changed, 5 insertions(+), 5 deletions(-)
+ src/hb-iter.hh      | 2 +-
+ src/hb-machinery.hh | 2 +-
+ src/hb-open-type.hh | 2 +-
+ src/hb-vector.hh    | 6 +++---
+ src/hb.hh           | 5 -----
+ 5 files changed, 6 insertions(+), 11 deletions(-)
 
-commit 7c9ceabcef426ca6fc54b70db9dd8cb63937710b
+commit 1d75db19fb5df139b9648ff3f5e6184a5c554345
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 18:19:36 2019 -0700
+Date:   Fri Mar 29 15:20:34 2019 -0700
+
+    Remove C++<11 polyfill
+    
+    Leaving hb-atomic.hh as is since harmless and other projects might
+    copy from that file.
+
+ src/hb.hh | 81 ---------------------------------------------------------------
+ 1 file changed, 81 deletions(-)
 
-    [meta] Add hb_move and hb_forward ala std::
+commit 8e7887ca5f8a2822345bdcbdc873c73a31c81177
+Merge: 7929b0f0 90aebc6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 29 14:37:04 2019 -0700
 
- src/hb-meta.hh | 11 +++++++++++
- 1 file changed, 11 insertions(+)
+    Merge branch 'master' into iter
 
-commit 9a19b885f9136b0b7cdfa04679274cd4b6d16188
+commit 90aebc6cf1aaca281ce51cb8e23831d7167cdcd3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 18:14:30 2019 -0700
+Date:   Fri Mar 29 14:30:02 2019 -0700
 
-    [serialize] Flesh out packing
+    Update RELEASING
 
src/hb-serialize.hh | 58 +++++++++++++++++++++++++++++++----------------------
- 1 file changed, 34 insertions(+), 24 deletions(-)
RELEASING.md | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
 
-commit 357c7c611cc20f86c646bd2d392c243140f92d34
+commit 7929b0f07e87a77687ea50205e6e4013c9264f85
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 18:13:57 2019 -0700
+Date:   Fri Mar 29 14:14:55 2019 -0700
 
-    [vector] Add copy constructor and assignment operator
+    [ci] Fix build
 
src/hb-vector.hh | 17 ++++++++++++++++-
- 1 file changed, 16 insertions(+), 1 deletion(-)
.circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 6f69c9d26fa53cd8a2331395bbc146bfc85fd1e3
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 18:00:03 2019 -0700
+commit b292772e6ef15728dd66329e637265748df0efe1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 29 13:00:56 2019 -0700
 
-    [serialize] Minor
+    [dwrite] A new API, hb_directwrite_face_get_font_face (#1600)
+    
+    Can be useful when using HarfBuzz for font loading and shaping
+    but using DirectWrite for rendering.
 
- src/hb-serialize.hh | 9 +++++----
- 1 file changed, 5 insertions(+), 4 deletions(-)
+ docs/harfbuzz-sections.txt | 10 ++++++++--
+ src/hb-directwrite.cc      | 34 ++++++++++++++++++++++++++++++----
+ src/hb-directwrite.h       |  3 +++
+ 3 files changed, 41 insertions(+), 6 deletions(-)
 
-commit a43290192beedc6335efc3841c05ec7fa54e8871
+commit 59f36f36820f6e6fb1d3b6da26d6b5ee7588c42f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 17:51:26 2019 -0700
+Date:   Fri Mar 29 10:55:12 2019 -0700
 
-    [serialize] Add packed_map
+    Replace REPLACEME's left out of 2.4.0
+    
+    https://github.com/harfbuzz/harfbuzz/issues/1641
 
- src/hb-map.hh       |  7 +++++++
- src/hb-serialize.hh | 24 +++++++++++++++++++++---
- 2 files changed, 28 insertions(+), 3 deletions(-)
+ src/hb-common.h        | 2 +-
+ src/hb-directwrite.cc  | 2 +-
+ src/hb-subset-input.cc | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
 
-commit bed150bd2e8d61950ea17d1b5a4bf4705801c1cc
+commit fe570bc043ca2c6be71b18f7401c8f06e73527e0
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 17:26:35 2019 -0700
+Date:   Fri Mar 29 10:51:38 2019 -0700
 
-    [serialize] Start fleshing out object stack
+    [docs] Remove unexisting section
 
- src/hb-serialize.hh | 91 ++++++++++++++++++++++++++++++++++++++---------------
- src/hb-vector.hh    |  9 ++++--
- 2 files changed, 72 insertions(+), 28 deletions(-)
+ docs/harfbuzz-docs.xml | 1 -
+ 1 file changed, 1 deletion(-)
 
-commit 63c35651893b2a1c555f728012e9ad36c0f84145
+commit 443db2a24624b63c49fa3ad9a10d3b4c523af1ce
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 17:12:40 2019 -0700
+Date:   Fri Mar 29 10:46:44 2019 -0700
 
-    [serialize] Simplify propagate_error()
+    [iter] Remove hb_len()
+    
+    Not planning on using it.  So remove.  Can add later if needed.
 
- src/hb-serialize.hh | 9 ++-------
- 1 file changed, 2 insertions(+), 7 deletions(-)
+ src/hb-iter.hh   | 8 --------
+ src/test-iter.cc | 2 --
+ 2 files changed, 10 deletions(-)
 
-commit dbe9ba6711c6d35374de645097babfd81bc295b2
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 17:10:59 2019 -0700
+commit d30e5e74814c6db23fdedbe75fd9b89c0dfb4dce
+Merge: ddb84dce a252392b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 10:32:45 2019 -0700
 
-    [serialize] Add object_t, link_t, and snapshot_t
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
- src/hb-serialize.hh | 32 +++++++++++++++++++++++++++++++-
- 1 file changed, 31 insertions(+), 1 deletion(-)
+commit ddb84dcece8a12a5615cb1609030a52387bd2fce
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 10:32:42 2019 -0700
 
-commit 38d57b9a66008c9722125d4d677d759a910cf2a1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 16:38:06 2019 -0700
+    fix gvar fuzz bug
 
-    [map] Add another TODO item
+ .gitignore                  | 1 +
+ src/hb-ot-var-gvar-table.hh | 8 +++++++-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
 
- src/hb-map.hh | 2 ++
- 1 file changed, 2 insertions(+)
+commit a252392bc05e8e9e4127e0002b10fe514323730f
+Merge: 58c8c7a4 d6fc1d49
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 29 08:43:47 2019 -0700
 
-commit 7fd940f899da4948d2c61ed497c1face42776187
+    Merge branch 'master' into var-subset
+
+commit bdd5a9c48d644b660f8fcac16902a576cc7ff443
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 16:29:19 2019 -0700
+Date:   Thu Mar 28 21:58:07 2019 -0700
 
-    [map] Add TODO
+    Add hb_hash()
+    
+    I don't like the hb_remove_reference() hack, but necessary.
 
- src/hb-map.hh | 8 ++++++++
- 1 file changed, 8 insertions(+)
+ src/hb-algs.hh | 17 +++++++++++++++++
+ src/hb-map.hh  | 10 +---------
+ src/hb.hh      |  2 +-
+ 3 files changed, 19 insertions(+), 10 deletions(-)
 
-commit 6dcf7c4017619c782dbc8bd2c584bb33df96fc83
+commit 343e6063dcd512164a999f1d12bae50877392a82
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 15:08:39 2019 -0700
+Date:   Thu Mar 28 21:44:12 2019 -0700
 
-    [serialize] Add unused 'tail'
+    Add hb_is_integer(T)
 
- src/hb-serialize.hh | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
+ src/hb-meta.hh | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
 
-commit fe05e48086be9ed685b8a6ca4af966660744bc0f
+commit f639b9a8eab369bee6e36b3e60b585b4f720e77e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 15:06:25 2019 -0700
+Date:   Thu Mar 28 21:34:47 2019 -0700
 
-    [serialize] Add ran_out_of_room
+    [iter] Add hb_len() function-object
 
- src/hb-serialize.hh | 8 +++++++-
- src/hb-subset.cc    | 7 ++++++-
- 2 files changed, 13 insertions(+), 2 deletions(-)
+ src/hb-iter.hh   | 8 ++++++++
+ src/test-iter.cc | 2 ++
+ 2 files changed, 10 insertions(+)
 
-commit a7c63cd8f8475c6de7fd5bb6444bf5d24082a191
+commit a030ce4ff83e0948e4f865accc5670e8b5e78dde
+Merge: 11456b2d d6fc1d49
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 14:59:40 2019 -0700
-
-    Split sanitize and dispatch into their own files
+Date:   Thu Mar 28 21:26:50 2019 -0700
 
- src/Makefile.sources |   2 +
- src/hb-dispatch.hh   |  50 +++++++
- src/hb-machinery.hh  | 369 +-----------------------------------------------
- src/hb-sanitize.hh   | 388 +++++++++++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 442 insertions(+), 367 deletions(-)
+    Merge branch 'master' into iter
 
-commit be66b575fc15dbbe82cf1a7fa0b58020e86cffdc
+commit d6fc1d49aa099104a889c96bc9087c21d8fc0960
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 14:53:54 2019 -0700
+Date:   Thu Mar 28 21:21:26 2019 -0700
 
-    Move serializer to hb-serialize.hh
+    2.4.0
 
- src/Makefile.sources |   1 +
- src/hb-machinery.hh  | 164 +-----------------------------------------
- src/hb-serialize.hh  | 196 +++++++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 198 insertions(+), 163 deletions(-)
+ NEWS             | 11 +++++++++++
+ configure.ac     |  2 +-
+ src/hb-buffer.h  |  2 +-
+ src/hb-version.h |  6 +++---
+ 4 files changed, 16 insertions(+), 5 deletions(-)
 
-commit bb22462f292995a724bf20363adf52d3a8357a97
+commit d2db71fdc4764eecf8320cf465ee0e4254146b6e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 14:46:54 2019 -0700
+Date:   Thu Mar 28 21:00:58 2019 -0700
 
-    Whitespace
+    Use internal bsearch() for language tags
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1639
 
- src/hb-machinery.hh | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
+ src/hb-ot-tag.cc | 46 ++++++++++++++++++++++------------------------
+ 1 file changed, 22 insertions(+), 24 deletions(-)
 
-commit ef33b5d1f6d3ec21e15ad74ca2524a117f594e06
+commit 21bb80ebf2e20025a196386cee8fd92dd1eb4597
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 14:39:21 2019 -0700
+Date:   Thu Mar 28 20:50:04 2019 -0700
 
-    [map] Deref pointers before equality check
+    [indic] Add back medial-consonant to grammar
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1592
 
- src/hb-map.hh  | 6 ++++--
- src/hb-meta.hh | 4 ++--
- 2 files changed, 6 insertions(+), 4 deletions(-)
+ src/hb-ot-shape-complex-indic-machine.hh           | 1244 +++++++++++---------
+ src/hb-ot-shape-complex-indic-machine.rl           |    5 +-
+ src/hb-ot-shape-complex-indic.cc                   |    2 +-
+ src/hb-ot-shape-complex-indic.hh                   |    6 +-
+ .../f75c4b05a0a4d67c1a808081ae3d74a9c66509e8.ttf   |  Bin 0 -> 1924 bytes
+ .../data/in-house/tests/indic-syllable.tests       |    2 +
+ 6 files changed, 672 insertions(+), 587 deletions(-)
 
-commit c98f51da719d1792bf23b53a9a345926056bf34d
+commit 5ab6de7a6fbad4c4a954c2c81d216486a5a14f72
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 14:30:22 2019 -0700
+Date:   Thu Mar 28 20:23:12 2019 -0700
 
-    [map] Templatize hb_map_t
+    [khmer] Add trailing Coeng to syllable grammar
     
-    Template name is hb_hashmap_t<K,V>.
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1541
 
- src/hb-map.hh | 65 ++++++++++++++++++++++++++++++++++-------------------------
- 1 file changed, 37 insertions(+), 28 deletions(-)
+ src/hb-ot-shape-complex-khmer-machine.hh           | 248 ++++++++++-----------
+ src/hb-ot-shape-complex-khmer-machine.rl           |   2 +-
+ .../ad01ab2ea1cb1a4d3a2783e2675112ef11ae6404.ttf   | Bin 0 -> 1500 bytes
+ test/shaping/data/in-house/tests/khmer-misc.tests  |   1 +
+ 4 files changed, 122 insertions(+), 129 deletions(-)
 
-commit 4b7f4dbc0cf58d87f4c91f059734e91e4d988480
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Mar 30 13:48:32 2019 -0700
+commit 7360265e69a8cdaa9f993c36def2860a79cca49f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 28 16:57:56 2019 -0700
 
-    Add hb_deref_pointer()
+    [ci] Tweak macos and psvita bots (#1638)
+    
+    * Add --with-graphite2 to macOS
+    * Add a dummy ragel script for psvita
 
- src/hb-algs.hh | 18 +++++++++++++-----
- src/hb-meta.hh |  8 ++++++++
- 2 files changed, 21 insertions(+), 5 deletions(-)
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
-commit e5306927994e8e412dea5dd960b8b3ed4ca848eb
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 23:31:07 2019 -0700
+commit 58c8c7a495fcc353d09158fc23a45f35b2dab2dc
+Merge: 485fe06f a548d1da
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 28 16:17:41 2019 -0700
 
-    [iter] Fix bug in hb_any() and hb_none()
+    Merge branch 'master' into var-subset
 
- src/hb-iter.hh               |  4 ++--
- src/hb-ot-layout-gsubgpos.hh | 12 ++++++------
- src/test-iter.cc             |  2 +-
- 3 files changed, 9 insertions(+), 9 deletions(-)
+commit 485fe06f74d7dce41480d7d6f0dbe0129a7b2a39
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 28 16:17:36 2019 -0700
 
-commit f505b5d5c9c05741a933b4b986503e1697bbdfdb
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 22:55:02 2019 -0700
+    minor
 
-    [iter] Port remaining "for (auto" instances to daggers
+ src/hb-ot-var-hvar-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
- src/hb-ot-layout-gsubgpos.hh | 35 +++++++++++++++++++++++------------
- 1 file changed, 23 insertions(+), 12 deletions(-)
+commit a548d1da78b506cc6460fdde3715f6ef13ccad48
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 28 15:42:45 2019 -0700
 
-commit 668d2d562fec797d779c6d6a43eb6e1c7cfbc07a
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 22:48:38 2019 -0700
+    [ci] Use only CircleCI for macOS (#1637)
+
+ .circleci/config.yml |  5 +++--
+ .travis.yml          | 18 ------------------
+ 2 files changed, 3 insertions(+), 20 deletions(-)
 
-    [iter] One more dagger
+commit 5f36771c2ab612b403e55504b7901b0390b1b76d
+Merge: 99f0c107 061bd0a9
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 28 15:07:53 2019 -0700
 
- src/hb-ot-layout-gsubgpos.hh | 13 +++++++------
- 1 file changed, 7 insertions(+), 6 deletions(-)
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
-commit d51452500f909803a346f26c71cf4b3f84f619bd
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 22:48:12 2019 -0700
+commit 99f0c107f7e1083d3b8ad8354876770f69fddf52
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 28 15:07:49 2019 -0700
 
-    [iter] Remove more wrong &&'s
-    
-    Sigh...
+    fixed a fuzzer bug
 
- src/hb-iter.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-var-hvar-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 05f2130a1c479afe7982e8ddcfb3d83af9960e5b
+commit 160b4a2b01e925812fbf0e7db5bc9dcb90dc81cc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 22:40:13 2019 -0700
+Date:   Thu Mar 28 13:44:38 2019 -0700
 
-    [iter] More daggers
+    Fix shell syntax error
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1612
 
- src/hb-ot-layout-gsubgpos.hh | 110 +++++++++++++++++++++++++------------------
- 1 file changed, 64 insertions(+), 46 deletions(-)
+ src/check-symbols.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 22ec4c3aa5aa41b7aa2a89290851ddd386273579
+commit 8665b9b0a24e4d46e486057d72c0486b9da16523
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 22:27:46 2019 -0700
+Date:   Thu Mar 28 11:11:52 2019 -0700
 
-    [iter] More daggers
+    Comment
 
- src/hb-ot-layout-gsubgpos.hh | 55 ++++++++++++++++++++++++++------------------
- 1 file changed, 33 insertions(+), 22 deletions(-)
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 688069bbfb40d69fb141371633cd499d91324cc2
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 22:17:31 2019 -0700
+commit a7eed7e41dba8e583a9c740a4ca7ddf53e77de63
+Author: punchcutter <zarijoscha@gmail.com>
+Date:   Wed Mar 27 23:12:58 2019 -0700
 
-    [iter] One more dagger
+    Override USE category for Grantha and Tirhuta visargas to allow marks
 
- src/hb-ot-layout-gsub-table.hh | 13 +++++--------
- 1 file changed, 5 insertions(+), 8 deletions(-)
+ src/gen-use-table.py                 | 3 ++-
+ src/hb-ot-shape-complex-use-table.cc | 4 ++--
+ 2 files changed, 4 insertions(+), 3 deletions(-)
 
-commit 90b60bd6909ffc6d0bff3e6901057439460407ca
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 22:12:42 2019 -0700
+commit cf040c0fef4a049a75a5ec7972f518b9034bdc76
+Author: Egor Pugin <egor.pugin@gmail.com>
+Date:   Thu Mar 28 19:06:12 2019 +0300
 
-    Remove HB_DEBUG_WOULD_APPLY
+    Disable unwanted C++ definitions for MSVC.
     
-    Not that useful.
+    MSVC does not set __cplusplus to the latest standard and also it does not like redefining some keywords.
 
- src/hb-debug.hh                | 15 +---------
- src/hb-ot-layout-gsub-table.hh | 49 ++++++++++----------------------
- src/hb-ot-layout-gsubgpos.hh   | 64 ++++++++++++++++++------------------------
- 3 files changed, 43 insertions(+), 85 deletions(-)
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 4d28267e59406cc85761131b84c5b2b4c65c6b35
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 22:04:15 2019 -0700
+commit 061bd0a99b0724953fcbdaaef4ea91a54cd7d3ce
+Merge: d8e3e360 67175987
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Mar 27 08:53:50 2019 -0700
 
-    [iter] Port more to daggers
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
- src/hb-ot-layout-gsub-table.hh | 22 +++++++++++-----------
- 1 file changed, 11 insertions(+), 11 deletions(-)
+commit d8e3e3607e6435b994a3e2f4285c5b4d17c5dfa4
+Merge: bcd689bb 717181c5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Mar 27 08:53:48 2019 -0700
 
-commit 9d8c72042b4a023b55cb39779407fdecaf098af1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:59:28 2019 -0700
+    Merge branch 'master' into var-subset
 
-    Whitespace
+commit 67175987bd6c90ca2e79e8d604a73e6052e82823
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Mar 27 08:52:46 2019 -0700
 
- src/hb-ot-layout-gpos-table.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+    tweaked recursion checks
 
-commit 418e9d07e2120f806852312f4c74204fa085a6cc
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:57:26 2019 -0700
+ src/hb-ot-glyf-table.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
 
-    Simplify code
+commit 717181c5943c13a682c719dce10bfc3d9cc47e6b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 27 16:38:39 2019 +0430
 
- src/hb-ot-layout-gsub-table.hh | 20 +++-----------------
- 1 file changed, 3 insertions(+), 17 deletions(-)
+    [ci] remove ragel from psvita compile bot
 
-commit f5ef8a7347656ad5f5bb8cec5f9a3de262a79411
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:57:17 2019 -0700
+ .circleci/config.yml | 1 -
+ 1 file changed, 1 deletion(-)
 
-    [iter] Port one more function to dagger
+commit 08e36c5d8be22b3a7e31f33af9452372dafeacc0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 27 16:21:47 2019 +0430
 
- src/hb-ot-layout-gpos-table.hh | 14 ++++++++------
- 1 file changed, 8 insertions(+), 6 deletions(-)
+    [ci] Don't install ragel on cmake build bot images
+    
+    It is not needed anyway
 
-commit bcab098c8f35ac4bef6618d949a7bf1d95869fa5
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:49:18 2019 -0700
+ .circleci/config.yml | 5 -----
+ 1 file changed, 5 deletions(-)
 
-    [iter] Port more code to daggers
+commit feb712d8d80c48e08f3f715a41400e4ef19b80de
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 26 20:35:01 2019 -0700
 
- src/hb-ot-layout-gsub-table.hh | 14 ++++++++------
- 1 file changed, 8 insertions(+), 6 deletions(-)
+    add recursion checks
 
-commit 4c75158e1803e73d6126f715aa4b22ebe30aa7c7
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:46:13 2019 -0700
+ src/hb-ot-glyf-table.hh | 24 ++++++++++++++----------
+ 1 file changed, 14 insertions(+), 10 deletions(-)
 
-    [iter] Port two more functions to daggers
+commit bcd689bb1090a1bf5113e67edfce583832bb2187
+Merge: 49f93596 ec2a5dc8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 26 17:13:31 2019 -0700
 
- src/hb-ot-layout-gsub-table.hh | 29 +++++++++++++++++------------
- 1 file changed, 17 insertions(+), 12 deletions(-)
+    Merge branch 'master' into var-subset
 
-commit e70ccbe9edd4d5e033df4afa728b3593ba9f78af
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:45:49 2019 -0700
+commit 49f9359632c78754b6e1eb32f2505b340cde55c8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 26 17:10:46 2019 -0700
 
-    Fix pair signature
+    add support of anchor point & SCALED/UNSCALED_COMPONENT_OFFSET
     
-    Oh well.  Again, who does fully understand what is right???
+    some code cleanup
 
- src/hb-algs.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+ src/hb-ot-glyf-table.hh                            | 166 ++++++++++++++-------
+ src/hb-ot-var-gvar-table.hh                        |  38 ++++-
+ test/api/fonts/SourceSansVariable-Roman.anchor.ttf | Bin 0 -> 4708 bytes
+ test/api/test-ot-metrics-tt-var.c                  |  33 ++++
+ 4 files changed, 179 insertions(+), 58 deletions(-)
 
-commit 6237b47f0c59fd3913b19b23800cdf83eaa01fb6
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:36:49 2019 -0700
+commit ec2a5dc859b03ceb92518aa992e4e9c053b30534
+Author: Behdad Esfahbod <behdad@fb.com>
+Date:   Tue Mar 26 16:18:03 2019 -0700
 
-    [iter] Add hb_unzip()
+    Use class templates for Null objects
+    
+    This allows partial-instantiating custom Null object for template Lookup<T>.
+    Before, this had to be handcoded per instantiation.  Apparently I missed
+    adding one for AAT::ankr.lookupTable, so it was getting the wrong (generic)
+    null for Lookup object, which is wrong and unsafe.
+    
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=944346
 
- src/hb-iter.hh | 38 ++++++++++++++++++++++++++++++++++++++
- 1 file changed, 38 insertions(+)
+ src/hb-aat-layout-common.hh                        |  14 ++++------
+ src/hb-null.hh                                     |  31 +++++++++++++--------
+ ...case-minimized-harfbuzz_fuzzer-5748102301614080 | Bin 0 -> 213 bytes
+ 3 files changed, 24 insertions(+), 21 deletions(-)
 
-commit f1dad91eb3ce9dcdedbb4a0d6e34517db0154a84
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:17:08 2019 -0700
+commit 96f12377942dbe1c6b1d0ffa7d626d99cb265443
+Author: Behdad Esfahbod <behdad@fb.com>
+Date:   Tue Mar 26 16:17:45 2019 -0700
 
-    Whitespace
+    [aat] Add missing check to ankr table
+    
+    Isn't absolutely needed.  But helps.
 
- src/hb-ot-layout-gsub-table.hh | 3 +++
- 1 file changed, 3 insertions(+)
+ src/hb-aat-layout-ankr-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 896b31670d07cbe276feff1db249b64faa5c552c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:16:30 2019 -0700
+commit e5dfffb1ef610a982ed9878fbf3f9ee49cbc3a97
+Author: Behdad Esfahbod <behdad@fb.com>
+Date:   Mon Mar 25 15:15:37 2019 -0700
 
-    [iter] Port two more loops to dagger
+    [docs] Update
 
- src/hb-ot-layout-gsub-table.hh | 14 +++++++++-----
- 1 file changed, 9 insertions(+), 5 deletions(-)
+ docs/harfbuzz-docs.xml | 1 +
+ 1 file changed, 1 insertion(+)
 
-commit 8e34cb251a9b22d6fbc637fd2f25965beb260270
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:14:20 2019 -0700
+commit 0dd3fdf9d227f9bd79f395078f8e58dcfc32d1bf
+Author: Behdad Esfahbod <behdad@fb.com>
+Date:   Mon Mar 25 15:08:14 2019 -0700
 
-    [iter] Remove unneeded &&
+    Update ChangeLog generation
     
-    Next commit needs this.  I never fully get this, sigh.
+    Let's see if I can make a release on Mac...
 
src/hb-iter.hh | 2 +-
Makefile.am | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit 12a4c0441ff13e56bb87f53eab45930c2a6142ed
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 21:06:10 2019 -0700
-
-    Whitespace
-
- src/hb-ot-layout-gsub-table.hh | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
+commit 2d9034491eca0a63db82d3801f05c067a5241b7d
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Mar 26 10:37:24 2019 -0700
 
-commit 4c38a9f6011a9b1dd6c4fc98620e23decc340322
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 20:23:07 2019 -0700
+    completely remove lines that are commented out
 
-    Remove hb_assign()
-    
-    Not needed anymore.  We just use operator= now.
+ src/hb-subset-plan.cc | 6 ------
+ src/hb-subset-plan.hh | 3 ---
+ 2 files changed, 9 deletions(-)
 
- src/hb-iter.hh      |  2 +-
- src/hb-machinery.hh |  2 +-
- src/hb-null.hh      | 13 -------------
- src/hb-open-type.hh |  2 +-
- 4 files changed, 3 insertions(+), 16 deletions(-)
+commit 3147133b6173487c26813a2a406aebd067b53fbf
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Tue Mar 26 09:15:56 2019 -0700
 
-commit b986c6a321f7d997eba0a9308b651966644bf336
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 20:17:46 2019 -0700
+    update arguments in_populate_gids_to_retain() and _create_old_gid_to_new_gid_map()
+    so they don't use deprecated variable
 
-    [C++11] Remove IntType::set() in favor of operator=
+ src/hb-subset-plan.cc | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
 
- src/hb-cff-interp-common.hh                |  4 +-
- src/hb-ft.cc                               |  2 +-
- src/hb-null.hh                             |  6 ---
- src/hb-open-file.hh                        | 14 +++---
- src/hb-open-type.hh                        | 43 +++++++++++------
- src/hb-ot-cff-common.hh                    | 24 +++++-----
- src/hb-ot-cff1-table.hh                    | 32 ++++++-------
- src/hb-ot-cmap-table.hh                    | 77 +++++++++++++++---------------
- src/hb-ot-glyf-table.hh                    |  2 +-
- src/hb-ot-hdmx-table.hh                    | 12 ++---
- src/hb-ot-hmtx-table.hh                    |  8 ++--
- src/hb-ot-layout-common.hh                 | 44 ++++++++---------
- src/hb-ot-layout-gdef-table.hh             |  8 ++--
- src/hb-ot-layout-gsub-table.hh             | 18 +++----
- src/hb-ot-maxp-table.hh                    | 16 +++----
- src/hb-ot-os2-table.hh                     | 10 ++--
- src/hb-ot-post-table.hh                    |  2 +-
- src/hb-ot-shape-complex-arabic-fallback.hh | 10 ++--
- src/hb-ot-vorg-table.hh                    | 12 ++---
- src/hb-subset-cff-common.cc                | 12 ++---
- src/hb-subset-cff-common.hh                |  2 +-
- src/hb-subset-cff1.cc                      | 10 ++--
- src/hb-subset-cff2.cc                      |  8 ++--
- src/hb-subset-glyf.cc                      |  8 ++--
- src/hb-uniscribe.cc                        | 22 ++++-----
- 25 files changed, 206 insertions(+), 200 deletions(-)
+commit 79a6c258497e80be15245a7b576e34443d9f7bff
+Author: Qunxin Liu <qxliu@google.com>
+Date:   Mon Mar 25 19:59:37 2019 -0700
 
-commit 58ad357951a732f05d9680573d00a4764171a9dd
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 20:05:19 2019 -0700
+    try to remove deprecated variable from struct definition
 
-    [vector] Accept all types in push(...)
-    
-    Let assignment operator worry about conversion.
+ src/hb-subset-plan.cc | 9 +++++----
+ src/hb-subset-plan.hh | 2 +-
+ 2 files changed, 6 insertions(+), 5 deletions(-)
 
- src/hb-vector.hh | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
+commit 94ef1a703ff20614538680587a23cec5f1649189
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 22 11:05:23 2019 -0700
 
-commit 489faf826ca16e9bc89515869ebaf52653450b54
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 20:01:37 2019 -0700
+    add HVAR & VVAR advance width api test
 
-    [C++11] Use type aliases for template partial instantiations
+ test/api/test-ot-metrics-tt-var.c | 41 +++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 39 insertions(+), 2 deletions(-)
 
- src/hb-open-type.hh | 24 ++++++++++++++----------
- 1 file changed, 14 insertions(+), 10 deletions(-)
+commit 3c4f041e9e8adc5d906a7bd37dc86345c2bf91e8
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 22 10:26:48 2019 -0700
 
-commit 4fd02f6ee58ebf7b4ecf0526328938c5bd74a180
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 17:57:59 2019 -0700
+    fix uninitialized memory bug
 
-    Remove unused line
+ src/hb-ot-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
- src/hb-machinery.hh | 1 -
- 1 file changed, 1 deletion(-)
+commit d2a0149c2999eab315a0582a5e1fa31a2511b869
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 21 18:09:37 2019 -0700
 
-commit 9a5b15dc1eda4f34496bb942d78f0df4e975b469
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 17:57:24 2019 -0700
+    added api test for subset VVAR & bug fix
+    
+    added a mod copy of SourceSerifVariable-Roman.ttf with VVAR as a test font
 
-    [C++11] Replace BEInt.set() with operator=
+ src/hb-ot-var-hvar-table.hh                        |   7 +-
+ test/api/Makefile.am                               |   2 +
+ .../fonts/SourceSerifVariable-Roman-VVAR.abc.ttf   | Bin 0 -> 5632 bytes
+ ...ourceSerifVariable-Roman-VVAR.ac.retaingids.ttf | Bin 0 -> 5288 bytes
+ .../fonts/SourceSerifVariable-Roman-VVAR.ac.ttf    | Bin 0 -> 3224 bytes
+ test/api/test-subset-vvar.c                        | 103 +++++++++++++++++++++
+ 6 files changed, 108 insertions(+), 4 deletions(-)
 
- src/hb-machinery.hh | 15 +++++++++++----
- src/hb-open-type.hh |  8 ++++----
- 2 files changed, 15 insertions(+), 8 deletions(-)
+commit 8ec279072e039c7a75ea90e2284d46bd9faee8ee
+Merge: 0593a95e 5390e393
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 21 10:38:12 2019 -0700
 
-commit 0aa59b1de34ddebc242cca3ebddde6859269f5f1
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 17:49:55 2019 -0700
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
-    [C++11] Add operator= to IntType<>
-    
-    Now that we require C++11 we can do this.
+commit 0593a95e28e08a130c87f23c527156ac1d46219b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 21 10:36:53 2019 -0700
 
- src/hb-open-type.hh | 2 +-
+    refix short count
+
+ src/hb-ot-layout-common.hh | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-commit eca466e6b1a3e29532af92a2d30b2555c0fafbfc
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 15:59:04 2019 -0700
+commit 5390e39342e78566095b580603bd1f76cdafc010
+Merge: 084be9a0 5f15fca6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 21 10:21:50 2019 -0700
 
-    Err.  Fixup C++11 polyfill removal
-    
-    Fixes 1d75db19fb5df139b9648ff3f5e6184a5c554345
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
- src/hb.hh | 27 +++++++++++++++++++++------
- 1 file changed, 21 insertions(+), 6 deletions(-)
+commit 084be9a0f466134998da79e9a81191836f847ab8
+Merge: 3faaa52a bcb4e505
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 21 10:21:31 2019 -0700
 
-commit 3f36c89f2ea16e293f8af7e7f549ebcd7247ea97
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 15:22:46 2019 -0700
+    Merge branch 'master' into var-subset
 
-    Inline explicit_operator macro
-    
-    Now that we require C++11, no need to macro.
+commit 5f15fca66206af36cafc9a7b650462b544460d6e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 21 10:18:03 2019 -0700
 
- src/hb-iter.hh      | 2 +-
- src/hb-machinery.hh | 2 +-
- src/hb-open-type.hh | 2 +-
- src/hb-vector.hh    | 6 +++---
- src/hb.hh           | 5 -----
- 5 files changed, 6 insertions(+), 11 deletions(-)
+    fix short count optimization
 
-commit 1d75db19fb5df139b9648ff3f5e6184a5c554345
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 15:20:34 2019 -0700
+ src/hb-ot-layout-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-    Remove C++<11 polyfill
-    
-    Leaving hb-atomic.hh as is since harmless and other projects might
-    copy from that file.
+commit 3faaa52aa7e4c72d94657702047e2d3dddbb3292
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 21 09:50:53 2019 -0700
 
- src/hb.hh | 81 ---------------------------------------------------------------
- 1 file changed, 81 deletions(-)
+    regenerated expected full fonts data after fontTools bug 1550 fixed
 
-commit 8e7887ca5f8a2822345bdcbdc873c73a31c81177
-Merge: 7929b0f0 90aebc6c
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 14:37:04 2019 -0700
+ ...eSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 5928 -> 5924 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
 
-    Merge branch 'master' into iter
+commit 325918172e7a346b6de6a8afcd94a4d7fd35d5c0
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Mar 20 15:10:59 2019 -0700
+
+    added TT VF full font test & fixed bugs
+    
+    updated CFF2 VF api test results too
+
+ src/hb-ot-layout-common.hh                         |  53 +++++++++++++++++----
+ src/hb-ot-var-hvar-table.hh                        |  51 +++++++++++---------
+ test/api/fonts/AdobeVFPrototype.abc.otf            | Bin 6772 -> 6952 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nohints.otf     | Bin 6096 -> 6272 bytes
+ .../fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf  | Bin 6160 -> 6152 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf     | Bin 6376 -> 6336 bytes
+ test/api/fonts/AdobeVFPrototype.ac.otf             | Bin 6312 -> 6460 bytes
+ test/api/fonts/AdobeVFPrototype.ac.retaingids.otf  | Bin 6316 -> 6464 bytes
+ ...ifVariable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 0 -> 5464 bytes
+ .../SourceSerifVariable-Roman.default.61,62,63.ttf | Bin 0 -> 5432 bytes
+ ...eSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 0 -> 5924 bytes
+ ...ariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 0 -> 5464 bytes
+ ...urceSerifVariable-Roman.drop-hints.61,62,63.ttf | Bin 0 -> 5432 bytes
+ ...rifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 0 -> 5928 bytes
+ .../data/fonts/SourceSerifVariable-Roman.ttf       | Bin 0 -> 586100 bytes
+ test/subset/data/tests/full-font.tests             |   1 +
+ 16 files changed, 72 insertions(+), 33 deletions(-)
+
+commit 92bc74055831acae3d296f6e1470fa4cd4d193fd
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 19 18:23:14 2019 -0700
 
-commit 90aebc6cf1aaca281ce51cb8e23831d7167cdcd3
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 14:30:02 2019 -0700
+    update CFF2 test results
 
-    Update RELEASING
+ test/api/fonts/AdobeVFPrototype.abc.otf               | Bin 7456 -> 6772 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nohints.otf        | Bin 6780 -> 6096 bytes
+ .../api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf | Bin 6844 -> 6160 bytes
+ test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf        | Bin 7060 -> 6376 bytes
+ test/api/fonts/AdobeVFPrototype.ac.otf                | Bin 6996 -> 6312 bytes
+ test/api/fonts/AdobeVFPrototype.ac.retaingids.otf     | Bin 7000 -> 6316 bytes
+ 6 files changed, 0 insertions(+), 0 deletions(-)
 
- RELEASING.md | 9 +++++----
- 1 file changed, 5 insertions(+), 4 deletions(-)
+commit 1051faf7aa639abc27974da213eb48f549f8c39c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 19 16:00:01 2019 -0700
 
-commit 7929b0f07e87a77687ea50205e6e4013c9264f85
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 14:14:55 2019 -0700
+    add api test cases for HVAR with index map (and fix)
 
-    [ci] Fix build
+ src/hb-ot-var-hvar-table.hh |  2 +-
+ test/api/test-subset-hvar.c | 76 +++++++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 71 insertions(+), 7 deletions(-)
 
- .circleci/config.yml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+commit 0576253a340243eb8e4feabb3481f354a82a11a1
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 19 12:34:03 2019 -0700
 
-commit b292772e6ef15728dd66329e637265748df0efe1
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Fri Mar 29 13:00:56 2019 -0700
+    add gvar & HVAR retain-gids test cases
 
-    [dwrite] A new API, hb_directwrite_face_get_font_face (#1600)
-    
-    Can be useful when using HarfBuzz for font loading and shaping
-    but using DirectWrite for rendering.
+ .../SourceSansVariable-Roman.ac.retaingids.ttf     | Bin 0 -> 3040 bytes
+ test/api/test-subset-gvar.c                        |  22 ++++++++++++++++++++
+ test/api/test-subset-hvar.c                        |  23 +++++++++++++++++++++
+ 3 files changed, 45 insertions(+)
 
- docs/harfbuzz-sections.txt | 10 ++++++++--
- src/hb-directwrite.cc      | 34 ++++++++++++++++++++++++++++++----
- src/hb-directwrite.h       |  3 +++
- 3 files changed, 41 insertions(+), 6 deletions(-)
+commit 6dd1077b68e20e97b595c676267b964dd5cbbe1c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 19 01:00:53 2019 -0700
 
-commit 59f36f36820f6e6fb1d3b6da26d6b5ee7588c42f
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 10:55:12 2019 -0700
+    fix test build
 
-    Replace REPLACEME's left out of 2.4.0
+ test/api/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 2e6038a209022c8b7957daf661488edfc166bdc5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 19 00:41:41 2019 -0700
+
+    add api tests for subset gvar & HVAR; bug fixes
+
+ src/hb-ot-layout-common.hh                      |   3 +-
+ src/hb-ot-var-gvar-table.hh                     |  24 +++----
+ src/hb-ot-var-hvar-table.hh                     |  19 +++++-
+ test/api/Makefile.am                            |   2 +
+ test/api/fonts/SourceSansVariable-Roman.abc.ttf | Bin 0 -> 3240 bytes
+ test/api/fonts/SourceSansVariable-Roman.ac.ttf  | Bin 0 -> 3028 bytes
+ test/api/test-subset-gvar.c                     |  81 ++++++++++++++++++++++++
+ test/api/test-subset-hvar.c                     |  81 ++++++++++++++++++++++++
+ 8 files changed, 194 insertions(+), 16 deletions(-)
+
+commit aeddb30f87ea957e7e780705c099e849c6d7e27d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Mar 18 18:11:00 2019 -0700
+
+    replaced tt var api test with a composite glyph
     
-    https://github.com/harfbuzz/harfbuzz/issues/1641
+    for better coverage
 
- src/hb-common.h        | 2 +-
- src/hb-directwrite.cc  | 2 +-
src/hb-subset-input.cc | 4 ++--
- 3 files changed, 4 insertions(+), 4 deletions(-)
+ .../SourceSansVariable-Roman-nohvar-41,C1.ttf      | Bin 0 -> 4696 bytes
+ test/api/fonts/SourceSansVariable-Roman.abc.ttf    | Bin 3168 -> 0 bytes
test/api/test-ot-metrics-tt-var.c                  |  36 ++++++++++-----------
+ 3 files changed, 18 insertions(+), 18 deletions(-)
 
-commit fe570bc043ca2c6be71b18f7401c8f06e73527e0
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 10:51:38 2019 -0700
+commit 560bcd774473691b310e746d2e7c0287c2bea9fe
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Mar 18 17:50:20 2019 -0700
 
-    [docs] Remove unexisting section
+    move rounding advance width to glyf
 
- docs/harfbuzz-docs.xml | 1 -
- 1 file changed, 1 deletion(-)
+ src/hb-ot-glyf-table.hh | 24 ++++++++++++++----------
+ src/hb-ot-hmtx-table.cc |  8 ++++----
+ 2 files changed, 18 insertions(+), 14 deletions(-)
 
-commit 443db2a24624b63c49fa3ad9a10d3b4c523af1ce
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Mar 29 10:46:44 2019 -0700
+commit c7edd14dc96af59cb53e9560a45f48d809fe8bb1
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Mar 18 17:16:43 2019 -0700
 
-    [iter] Remove hb_len()
-    
-    Not planning on using it.  So remove.  Can add later if needed.
+    fix empty glyf's advance width
 
- src/hb-iter.hh   | 8 --------
- src/test-iter.cc | 2 --
- 2 files changed, 10 deletions(-)
+ src/hb-ot-glyf-table.hh | 8 +++++++-
+ src/hb-ot-hmtx-table.cc | 4 ++--
+ 2 files changed, 9 insertions(+), 3 deletions(-)
 
-commit bdd5a9c48d644b660f8fcac16902a576cc7ff443
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Mar 28 21:58:07 2019 -0700
+commit 9d3a252030e8f86aff4a35ce56fe77eb718e2071
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Mar 18 15:39:10 2019 -0700
 
-    Add hb_hash()
+    add api test for tt var advance widths
     
-    I don't like the hb_remove_reference() hack, but necessary.
+    stripped HVAR from SourceSansVariable-Roman.abc.ttf so glyf gets parsed
 
- src/hb-algs.hh | 17 +++++++++++++++++
- src/hb-map.hh  | 10 +---------
- src/hb.hh      |  2 +-
- 3 files changed, 19 insertions(+), 10 deletions(-)
+ src/hb-ot-hmtx-table.hh                         |   1 -
+ test/api/fonts/SourceSansVariable-Roman.abc.ttf | Bin 3240 -> 3168 bytes
+ test/api/test-ot-metrics-tt-var.c               |  37 ++++++++++++++++++++++++
+ 3 files changed, 37 insertions(+), 1 deletion(-)
 
-commit 343e6063dcd512164a999f1d12bae50877392a82
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Mar 28 21:44:12 2019 -0700
+commit 9d9d5c706b68a16b2d07f8b8972b2b499c94bf0a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Mar 18 10:48:53 2019 -0700
 
-    Add hb_is_integer(T)
+    fix build
 
- src/hb-meta.hh | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
+ src/hb-ot-hmtx-table.cc     | 15 ++++-----------
+ src/hb-ot-hmtx-table.hh     | 15 +++++++++------
+ src/hb-ot-var-gvar-table.hh |  1 +
+ 3 files changed, 14 insertions(+), 17 deletions(-)
 
-commit f639b9a8eab369bee6e36b3e60b585b4f720e77e
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Mar 28 21:34:47 2019 -0700
+commit b6cc838888cc302f0de19030b75773fe0fda372f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 17 22:49:18 2019 -0700
 
-    [iter] Add hb_len() function-object
+    fix composite glyf extents
 
- src/hb-iter.hh   | 8 ++++++++
- src/test-iter.cc | 2 ++
- 2 files changed, 10 insertions(+)
+ src/hb-ot-glyf-table.hh     | 41 +++++++++++++++++++++++++++--------------
+ src/hb-ot-var-gvar-table.hh |  3 +++
+ 2 files changed, 30 insertions(+), 14 deletions(-)
 
-commit a030ce4ff83e0948e4f865accc5670e8b5e78dde
-Merge: 11456b2d d6fc1d49
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Mar 28 21:26:50 2019 -0700
+commit 597ad4df0cdff4a0355121e3da2a59e7fa8ee68f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 17 18:45:30 2019 -0700
 
-    Merge branch 'master' into iter
+    fix unpack_points
 
-commit d6fc1d49aa099104a889c96bc9087c21d8fc0960
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Mar 28 21:21:26 2019 -0700
+ src/hb-ot-var-gvar-table.hh | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
 
-    2.4.0
+commit cabe22fc6967e6299c3a06bbfa9c19e9a23a0ae3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 17 17:48:10 2019 -0700
 
- NEWS             | 11 +++++++++++
- configure.ac     |  2 +-
- src/hb-buffer.h  |  2 +-
- src/hb-version.h |  6 +++---
- 4 files changed, 16 insertions(+), 5 deletions(-)
+    fix infer_delta
+    
+    code cleanup
 
-commit d2db71fdc4764eecf8320cf465ee0e4254146b6e
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Mar 28 21:00:58 2019 -0700
+ src/hb-ot-glyf-table.hh     | 22 ++++++++++++-------
+ src/hb-ot-var-gvar-table.hh | 52 ++++++++++++++++++++++++++++++---------------
+ 2 files changed, 49 insertions(+), 25 deletions(-)
 
-    Use internal bsearch() for language tags
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/pull/1639
+commit c8b31773a6513e7051e5db98d7d26700856a32a3
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 17 16:01:49 2019 -0700
 
- src/hb-ot-tag.cc | 46 ++++++++++++++++++++++------------------------
- 1 file changed, 22 insertions(+), 24 deletions(-)
+    added explicit casts to metrics
 
-commit 21bb80ebf2e20025a196386cee8fd92dd1eb4597
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Mar 28 20:50:04 2019 -0700
+ src/hb-ot-hmtx-table.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
 
-    [indic] Add back medial-consonant to grammar
+commit 8a7998fd6ce730dd0f182d69d598b802476250dc
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sun Mar 17 15:36:26 2019 -0700
+
+    moved most of var code from gvar to glyf
     
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1592
+    initialize phantom points from metrics from htmx/vmtx & glyf bbox before execution
+    added source file hb-ot-hmtx-table.cc to call glyf from hmtx/vmtx indirectly & temporarily, workaround a cyclic reference between the two
 
- src/hb-ot-shape-complex-indic-machine.hh           | 1244 +++++++++++---------
- src/hb-ot-shape-complex-indic-machine.rl           |    5 +-
- src/hb-ot-shape-complex-indic.cc                   |    2 +-
- src/hb-ot-shape-complex-indic.hh                   |    6 +-
- .../f75c4b05a0a4d67c1a808081ae3d74a9c66509e8.ttf   |  Bin 0 -> 1924 bytes
- .../data/in-house/tests/indic-syllable.tests       |    2 +
- 6 files changed, 672 insertions(+), 587 deletions(-)
+ src/Makefile.sources        |   1 +
+ src/hb-ot-face.hh           |   1 -
+ src/hb-ot-font.cc           |   8 +-
+ src/hb-ot-glyf-table.hh     | 236 +++++++++++++++++++++++++++++++++++++-------
+ src/hb-ot-hmtx-table.cc     |  61 ++++++++++++
+ src/hb-ot-hmtx-table.hh     |  39 ++++----
+ src/hb-ot-var-gvar-table.hh | 195 ++++++++----------------------------
+ src/hb-ot-var-hvar-table.hh |  10 +-
+ 8 files changed, 333 insertions(+), 218 deletions(-)
+
+commit 00b2653ac3b927f93ac350dbe1d3711790a50119
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 16 16:27:33 2019 -0700
 
-commit 5ab6de7a6fbad4c4a954c2c81d216486a5a14f72
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Mar 28 20:23:12 2019 -0700
+    add components transformation
+
+ src/hb-ot-glyf-table.hh     | 44 ++++++++++++++++++++++++++++++++++++++++++--
+ src/hb-ot-var-gvar-table.hh | 31 ++++++++++++++++++-------------
+ 2 files changed, 60 insertions(+), 15 deletions(-)
+
+commit 434ea06841e60b98601b529ca20cf6bf25f6c165
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Sat Mar 16 00:08:03 2019 -0700
+
+    fix tt var extents & add test
+
+ src/hb-ot-glyf-table.hh                         |  32 +--
+ src/hb-ot-var-gvar-table.hh                     | 270 +++++++++++++-----------
+ test/api/Makefile.am                            |   1 +
+ test/api/fonts/SourceSansVariable-Roman.abc.ttf | Bin 0 -> 3240 bytes
+ test/api/test-ot-metrics-tt-var.c               |  72 +++++++
+ 5 files changed, 236 insertions(+), 139 deletions(-)
+
+commit bcb4e505d6ffe33e3268a06698e75d6be0e64957
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 15 13:46:25 2019 -0700
+
+    cff2 subset fuzzer issues (#1619)
+    
+    * add check to FDArray::serialize
+    
+    * add test files
+    
+    * fix off by one
+
+ src/hb-ot-cff-common.hh                                   |   1 +
+ ...z-testcase-minimized-hb-subset-fuzzer-5739000398086144 | Bin 0 -> 620 bytes
+ ...z-testcase-minimized-hb-subset-fuzzer-5760768497156096 | Bin 0 -> 210 bytes
+ ...z-testcase-minimized-hb-subset-fuzzer-5764268627066880 | Bin 0 -> 687 bytes
+ 4 files changed, 1 insertion(+)
 
-    [khmer] Add trailing Coeng to syllable grammar
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1541
+commit a5118c1db51d6d3b24622a52e50246e00b07fa74
+Merge: 90ea140a 079c386c
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 15 10:33:03 2019 -0700
 
- src/hb-ot-shape-complex-khmer-machine.hh           | 248 ++++++++++-----------
- src/hb-ot-shape-complex-khmer-machine.rl           |   2 +-
- .../ad01ab2ea1cb1a4d3a2783e2675112ef11ae6404.ttf   | Bin 0 -> 1500 bytes
- test/shaping/data/in-house/tests/khmer-misc.tests  |   1 +
- 4 files changed, 122 insertions(+), 129 deletions(-)
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
-commit 7360265e69a8cdaa9f993c36def2860a79cca49f
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Mar 28 16:57:56 2019 -0700
+commit 079c386ca89b6d2833786db3ba54b7137d045188
+Merge: 99502b32 8aaab78e
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 15 10:12:19 2019 -0700
 
-    [ci] Tweak macos and psvita bots (#1638)
-    
-    * Add --with-graphite2 to macOS
-    * Add a dummy ragel script for psvita
+    Merge branch 'master' into var-subset
 
- .circleci/config.yml | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+commit 90ea140aca18d073401fc971681ce48403fbf399
+Merge: d23c201f 99502b32
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Mar 14 16:58:19 2019 -0700
 
-commit a548d1da78b506cc6460fdde3715f6ef13ccad48
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Thu Mar 28 15:42:45 2019 -0700
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
-    [ci] Use only CircleCI for macOS (#1637)
+commit d23c201f5d8af8f9b38c666e1ba6525d38ef0806
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 12 11:03:53 2019 -0700
 
- .circleci/config.yml |  5 +++--
- .travis.yml          | 18 ------------------
- 2 files changed, 3 insertions(+), 20 deletions(-)
+    add gvar::get_extents
 
-commit 160b4a2b01e925812fbf0e7db5bc9dcb90dc81cc
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Mar 28 13:44:38 2019 -0700
+ src/hb-ot-face.hh           |   1 +
+ src/hb-ot-font.cc           |   3 +
+ src/hb-ot-glyf-table.hh     |  21 ++++--
+ src/hb-ot-var-gvar-table.hh | 164 +++++++++++++++++++++++++++++++++++++++++---
+ 4 files changed, 175 insertions(+), 14 deletions(-)
 
-    Fix shell syntax error
-    
-    Fixes https://github.com/harfbuzz/harfbuzz/issues/1612
+commit dde8bb1f6d0bfaac283fd8c2ad15e354c233bac1
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 21:54:49 2019 -0800
 
- src/check-symbols.sh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+    fix build
 
-commit 8665b9b0a24e4d46e486057d72c0486b9da16523
-Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Mar 28 11:11:52 2019 -0700
+ src/hb-ot-var-gvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
 
-    Comment
+commit 5ec65f779bef1ebf2479f83f4b76f4e24d69ddad
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 21:49:04 2019 -0800
 
- src/hb.hh | 1 +
- 1 file changed, 1 insertion(+)
+    minor edits
 
-commit a7eed7e41dba8e583a9c740a4ca7ddf53e77de63
-Author: punchcutter <zarijoscha@gmail.com>
-Date:   Wed Mar 27 23:12:58 2019 -0700
+ src/hb-ot-cff-common.hh    | 2 +-
+ src/hb-ot-layout-common.hh | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
 
-    Override USE category for Grantha and Tirhuta visargas to allow marks
+commit 2d7ad3f28ba3a9c97287eb9e1bf75ad353a908c6
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 21:33:21 2019 -0800
 
- src/gen-use-table.py                 | 3 ++-
- src/hb-ot-shape-complex-use-table.cc | 4 ++--
- 2 files changed, 4 insertions(+), 3 deletions(-)
+    build fix attempt
 
-commit cf040c0fef4a049a75a5ec7972f518b9034bdc76
-Author: Egor Pugin <egor.pugin@gmail.com>
-Date:   Thu Mar 28 19:06:12 2019 +0300
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
-    Disable unwanted C++ definitions for MSVC.
-    
-    MSVC does not set __cplusplus to the latest standard and also it does not like redefining some keywords.
+commit cf2ef92c741a20158d15d7ea7c14f6ba82906d36
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 18:24:56 2019 -0800
 
- src/hb.hh | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
+    more build fixes
 
-commit 717181c5943c13a682c719dce10bfc3d9cc47e6b
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Mar 27 16:38:39 2019 +0430
+ src/hb-ot-glyf-table.hh     |  2 +-
+ src/hb-ot-var-gvar-table.hh | 13 ++++++-------
+ 2 files changed, 7 insertions(+), 8 deletions(-)
 
-    [ci] remove ragel from psvita compile bot
+commit ae0a557c2e56064d204ae549a3be135dca884f67
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 18:12:31 2019 -0800
 
- .circleci/config.yml | 1 -
- 1 file changed, 1 deletion(-)
+    fix build attempt
 
-commit 08e36c5d8be22b3a7e31f33af9452372dafeacc0
-Author: Ebrahim Byagowi <ebrahim@gnu.org>
-Date:   Wed Mar 27 16:21:47 2019 +0430
+ src/hb-ot-var-gvar-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
 
-    [ci] Don't install ragel on cmake build bot images
-    
-    It is not needed anyway
+commit baf2ccf1471856f948ed8d2d46e4d68b0c0b739a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 15:14:22 2019 -0800
 
- .circleci/config.yml | 5 -----
- 1 file changed, 5 deletions(-)
+    calculate VF advance widths from gvar & glyf
 
-commit ec2a5dc859b03ceb92518aa992e4e9c053b30534
-Author: Behdad Esfahbod <behdad@fb.com>
-Date:   Tue Mar 26 16:18:03 2019 -0700
+ src/hb-ot-glyf-table.hh     | 151 ++++++++++++++++
+ src/hb-ot-hmtx-table.hh     |  23 ++-
+ src/hb-ot-var-gvar-table.hh | 410 +++++++++++++++++++++++++++++++++++++++-----
+ 3 files changed, 542 insertions(+), 42 deletions(-)
 
-    Use class templates for Null objects
-    
-    This allows partial-instantiating custom Null object for template Lookup<T>.
-    Before, this had to be handcoded per instantiation.  Apparently I missed
-    adding one for AAT::ankr.lookupTable, so it was getting the wrong (generic)
-    null for Lookup object, which is wrong and unsafe.
-    
-    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=944346
+commit 0b1ae2385b5564efe3dbcd5d068462bcd55effe2
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Feb 26 16:54:00 2019 -0800
 
- src/hb-aat-layout-common.hh                        |  14 ++++------
- src/hb-null.hh                                     |  31 +++++++++++++--------
- ...case-minimized-harfbuzz_fuzzer-5748102301614080 | Bin 0 -> 213 bytes
- 3 files changed, 24 insertions(+), 21 deletions(-)
+    gvar::subset()
 
-commit 96f12377942dbe1c6b1d0ffa7d626d99cb265443
-Author: Behdad Esfahbod <behdad@fb.com>
-Date:   Tue Mar 26 16:17:45 2019 -0700
+ src/hb-ot-var-gvar-table.hh | 81 +++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 71 insertions(+), 10 deletions(-)
 
-    [aat] Add missing check to ankr table
+commit eddbc9d0dbb09589a09e7d8e661004cdd7487e87
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Feb 26 11:11:50 2019 -0800
+
+    Added hb-ot-var-gvar-table.hh
     
-    Isn't absolutely needed.  But helps.
+    implemented sanitize()
+    placeholder subset()
+    some code cleanup
 
- src/hb-aat-layout-ankr-table.hh | 1 +
- 1 file changed, 1 insertion(+)
+ src/Makefile.sources        |   1 +
+ src/hb-bimap.hh             |   6 +-
+ src/hb-ot-gvar-table.hh     | 211 --------------------------------------------
+ src/hb-ot-var-gvar-table.hh | 207 +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-var-hvar-table.hh |  14 +--
+ src/hb-subset.cc            |   4 +
+ 6 files changed, 222 insertions(+), 221 deletions(-)
+
+commit f289ffe5eaf1c8cc87f9ee80f77a4af974919611
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Feb 25 09:59:27 2019 -0800
 
-commit e5dfffb1ef610a982ed9878fbf3f9ee49cbc3a97
-Author: Behdad Esfahbod <behdad@fb.com>
-Date:   Mon Mar 25 15:15:37 2019 -0700
+    renamed hb_map2_t to hb_bimap_h in its own .hh
 
-    [docs] Update
+ src/Makefile.sources        |   1 +
+ src/hb-bimap.hh             | 109 +++++++++++++++++++++++
+ src/hb-ot-cff-common.hh     |   4 +-
+ src/hb-ot-cff1-table.hh     |   4 +-
+ src/hb-ot-gvar-table.hh     | 211 ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-common.hh  |  84 +-----------------
+ src/hb-ot-var-hvar-table.hh |  12 +--
+ src/hb-subset-cff-common.cc |   2 +-
+ src/hb-subset-cff-common.hh |   4 +-
+ src/hb-subset-cff1.cc       |   8 +-
+ src/hb-subset-cff2.cc       |   2 +-
+ 11 files changed, 343 insertions(+), 98 deletions(-)
+
+commit 8563169291bf257400608aa0900fc3ee8c2f9e8b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Feb 22 14:53:06 2019 -0800
 
- docs/harfbuzz-docs.xml | 1 +
- 1 file changed, 1 insertion(+)
+    subset VVAR & outer indices
 
-commit 0dd3fdf9d227f9bd79f395078f8e58dcfc32d1bf
-Author: Behdad Esfahbod <behdad@fb.com>
-Date:   Mon Mar 25 15:08:14 2019 -0700
+ src/hb-ot-var-hvar-table.hh | 49 ++++++++++++++++++++++++++++++++++++---------
+ src/hb-subset.cc            |  3 +++
+ 2 files changed, 43 insertions(+), 9 deletions(-)
 
-    Update ChangeLog generation
+commit 08dc86594bb17e31df2d5c0e25521ee1f072871b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Feb 22 10:22:08 2019 -0800
+
+    unuse set in hb_map2_t impl
     
-    Let's see if I can make a release on Mac...
+    also some code cleanup
 
Makefile.am | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
src/hb-ot-layout-common.hh | 46 +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
 
-commit 2d9034491eca0a63db82d3801f05c067a5241b7d
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Tue Mar 26 10:37:24 2019 -0700
+commit 1b13cc775c3b8143b1218e205b21b91b0852f8bd
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Feb 21 16:42:30 2019 -0800
 
-    completely remove lines that are commented out
+    fixed compiler gripes
 
- src/hb-subset-plan.cc | 6 ------
- src/hb-subset-plan.hh | 3 ---
- 2 files changed, 9 deletions(-)
+ src/hb-ot-var-hvar-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
 
-commit 3147133b6173487c26813a2a406aebd067b53fbf
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Tue Mar 26 09:15:56 2019 -0700
+commit c485b77c7c1df2fcd2f21107692d1afd0ed34e1f
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Feb 21 16:34:49 2019 -0800
 
-    update arguments in_populate_gids_to_retain() and _create_old_gid_to_new_gid_map()
-    so they don't use deprecated variable
+    fix CFF2 local subr subsetting
+    
+    bug exposed by impl change of fdmap
+    also fixed name of subr_remap_ts as subr_remaps_t
 
- src/hb-subset-plan.cc | 36 ++++++++++++++++++------------------
- 1 file changed, 18 insertions(+), 18 deletions(-)
+ src/hb-subset-cff-common.hh |  8 ++++----
+ src/hb-subset-cff2.cc       | 20 +++++++++-----------
+ 2 files changed, 13 insertions(+), 15 deletions(-)
 
-commit 79a6c258497e80be15245a7b576e34443d9f7bff
-Author: Qunxin Liu <qxliu@google.com>
-Date:   Mon Mar 25 19:59:37 2019 -0700
+commit c9b07c75a14b6efb4b32cb12b2f3e8cfc1953638
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Feb 21 15:47:27 2019 -0800
 
-    try to remove deprecated variable from struct definition
+    fix HVAR & VarStore subsetting
 
- src/hb-subset-plan.cc | 9 +++++----
- src/hb-subset-plan.hh | 2 +-
- 2 files changed, 6 insertions(+), 5 deletions(-)
+ src/hb-ot-layout-common.hh  |  15 +++--
+ src/hb-ot-var-hvar-table.hh | 140 ++++++++++++++++++++++----------------------
+ 2 files changed, 77 insertions(+), 78 deletions(-)
 
-commit bcb4e505d6ffe33e3268a06698e75d6be0e64957
+commit c8420109ccb74a7bf15c4af425f9f58bc315d2ce
 Author: Michiharu Ariza <ariza@adobe.com>
-Date:   Fri Mar 15 13:46:25 2019 -0700
+Date:   Wed Feb 20 15:48:29 2019 -0800
 
-    cff2 subset fuzzer issues (#1619)
+    subset HVAR
     
-    * add check to FDArray::serialize
-    
-    * add test files
-    
-    * fix off by one
+    Re-implemented & repurposed CFF:remap_t as hb_map2_t (moved to hb-ot-layout-common.hh) for two-way mapping for use by index map subsetting.
+    Hooked up HVAR subsetter through _subset2.
+    Some renaming in CFF code.
 
- src/hb-ot-cff-common.hh                                   |   1 +
- ...z-testcase-minimized-hb-subset-fuzzer-5739000398086144 | Bin 0 -> 620 bytes
- ...z-testcase-minimized-hb-subset-fuzzer-5760768497156096 | Bin 0 -> 210 bytes
- ...z-testcase-minimized-hb-subset-fuzzer-5764268627066880 | Bin 0 -> 687 bytes
- 4 files changed, 1 insertion(+)
+ src/hb-ot-cff-common.hh     |  63 ++----------
+ src/hb-ot-cff1-table.hh     |   8 +-
+ src/hb-ot-layout-common.hh  | 158 ++++++++++++++++++++++++++++--
+ src/hb-ot-var-hvar-table.hh | 232 +++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-subset-cff-common.cc |   9 +-
+ src/hb-subset-cff-common.hh |  27 ++----
+ src/hb-subset-cff1.cc       |  29 +++---
+ src/hb-subset-cff2.cc       |  12 +--
+ src/hb-subset.cc            |   4 +
+ 9 files changed, 426 insertions(+), 116 deletions(-)
 
 commit 8aaab78efcac81a05ec919be13792c98741ea1b5
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
@@ -14306,6 +25800,25 @@ Date:   Wed Mar 13 13:21:12 2019 +0200
  .travis.yml | 16 +++++++++-------
  1 file changed, 9 insertions(+), 7 deletions(-)
 
+commit 99502b324dd6cb45d401bc5f6cc08d7a77677ba5
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 12 11:03:53 2019 -0700
+
+    add gvar::get_extents
+
+ src/hb-ot-face.hh           |   1 +
+ src/hb-ot-font.cc           |   3 +
+ src/hb-ot-glyf-table.hh     |  21 ++++--
+ src/hb-ot-var-gvar-table.hh | 164 +++++++++++++++++++++++++++++++++++++++++---
+ 4 files changed, 175 insertions(+), 14 deletions(-)
+
+commit 23e2d5ac86968c7548df0d212c1a321d09328ffa
+Merge: f5a46638 e52ec3fc
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Mar 12 10:53:15 2019 -0700
+
+    Merge branch 'master' into var-subset
+
 commit e52ec3fc23c2d5a881849f047885e0423bd74740
 Author: Behdad Esfahbod <behdad@fb.com>
 Date:   Mon Mar 11 18:09:51 2019 -0700
@@ -14447,6 +25960,60 @@ Date:   Mon Mar 4 11:12:21 2019 +0700
  src/hb-graphite2.cc | 35 +++++++++++++++++++----------------
  1 file changed, 19 insertions(+), 16 deletions(-)
 
+commit f5a466389382183cbc009b66734e0fa339f168ff
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 21:54:49 2019 -0800
+
+    fix build
+
+ src/hb-ot-var-gvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2e1965e572f5643c56e5a0c11a8bf7d5cf68a483
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 21:49:04 2019 -0800
+
+    minor edits
+
+ src/hb-ot-cff-common.hh    | 2 +-
+ src/hb-ot-layout-common.hh | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit ff60f34dd6b57401c8904a8808c1775ee09f4458
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 21:33:21 2019 -0800
+
+    build fix attempt
+
+ src/hb-ot-glyf-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9aa5805a44e883c3dcb09a43e952b8bf40016423
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 18:24:56 2019 -0800
+
+    more build fixes
+
+ src/hb-ot-glyf-table.hh     |  2 +-
+ src/hb-ot-var-gvar-table.hh | 13 ++++++-------
+ 2 files changed, 7 insertions(+), 8 deletions(-)
+
+commit 3f3da718632e9beef9a1d9cf8b5775025ffe3fd6
+Merge: 21aaf300 f448195a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 18:12:35 2019 -0800
+
+    Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
+
+commit 21aaf30058823e06c121908734b05c6c7f0bdeec
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 18:12:31 2019 -0800
+
+    fix build attempt
+
+ src/hb-ot-var-gvar-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
 commit 8a25868e6a41a3d82782aadb3c7b744ad87d20ff
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Sat Mar 2 03:24:49 2019 +0330
@@ -14458,6 +26025,24 @@ Date:   Sat Mar 2 03:24:49 2019 +0330
  .editorconfig | 7 ++-----
  1 file changed, 2 insertions(+), 5 deletions(-)
 
+commit f448195a4b041db83b0e515c829b99d2349bf73f
+Merge: fa2b3d30 4f37ab63
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 15:22:17 2019 -0800
+
+    Merge branch 'master' into var-subset
+
+commit fa2b3d30f6562a7457acca205f1bf544089c88ba
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Mar 1 15:14:22 2019 -0800
+
+    calculate VF advance widths from gvar & glyf
+
+ src/hb-ot-glyf-table.hh     | 151 ++++++++++++++++
+ src/hb-ot-hmtx-table.hh     |  23 ++-
+ src/hb-ot-var-gvar-table.hh | 410 +++++++++++++++++++++++++++++++++++++++-----
+ 3 files changed, 542 insertions(+), 42 deletions(-)
+
 commit 4f37ab63de9705d7bf74ee75364747e41b7c06a1
 Author: Garret Rieger <grieger@google.com>
 Date:   Thu Feb 28 17:25:05 2019 -0800
@@ -14469,6 +26054,15 @@ Date:   Thu Feb 28 17:25:05 2019 -0800
  test/api/test-subset-glyf.c | 24 ++++++++++++++++++++++++
  3 files changed, 37 insertions(+), 1 deletion(-)
 
+commit 33354ab6b87211ae2e702bee162fa4260078e70a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Feb 26 16:54:00 2019 -0800
+
+    gvar::subset()
+
+ src/hb-ot-var-gvar-table.hh | 81 +++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 71 insertions(+), 10 deletions(-)
+
 commit 45149eb34f9735b5d690a2a7956adb42b938c8d9
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Fri Feb 22 13:13:42 2019 +0330
@@ -14483,6 +26077,24 @@ Date:   Fri Feb 22 13:13:42 2019 +0330
  src/hb-directwrite.h  |  5 +++-
  2 files changed, 69 insertions(+), 6 deletions(-)
 
+commit 6f91e0d903d7510a4612a9cc7306ec04260cefed
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Tue Feb 26 11:11:50 2019 -0800
+
+    Added hb-ot-var-gvar-table.hh
+    
+    implemented sanitize()
+    placeholder subset()
+    some code cleanup
+
+ src/Makefile.sources        |   1 +
+ src/hb-bimap.hh             |   6 +-
+ src/hb-ot-gvar-table.hh     | 211 --------------------------------------------
+ src/hb-ot-var-gvar-table.hh | 207 +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-var-hvar-table.hh |  14 +--
+ src/hb-subset.cc            |   4 +
+ 6 files changed, 222 insertions(+), 221 deletions(-)
+
 commit 45adc185260f0fa1fa86472aafb7f91f942c567e
 Author: David Corbett <corbett.dav@husky.neu.edu>
 Date:   Mon Feb 18 22:30:40 2019 -0500
@@ -14504,6 +26116,99 @@ Date:   Mon Feb 25 15:26:58 2019 -0500
  CMakeLists.txt | 12 ------------
  1 file changed, 12 deletions(-)
 
+commit d817b446a132816e48e9ce4e3619a52a340ab35a
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Mon Feb 25 09:59:27 2019 -0800
+
+    renamed hb_map2_t to hb_bimap_h in its own .hh
+
+ src/Makefile.sources        |   1 +
+ src/hb-bimap.hh             | 109 +++++++++++++++++++++++
+ src/hb-ot-cff-common.hh     |   4 +-
+ src/hb-ot-cff1-table.hh     |   4 +-
+ src/hb-ot-gvar-table.hh     | 211 ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-common.hh  |  84 +-----------------
+ src/hb-ot-var-hvar-table.hh |  12 +--
+ src/hb-subset-cff-common.cc |   2 +-
+ src/hb-subset-cff-common.hh |   4 +-
+ src/hb-subset-cff1.cc       |   8 +-
+ src/hb-subset-cff2.cc       |   2 +-
+ 11 files changed, 343 insertions(+), 98 deletions(-)
+
+commit 5d781f62ba4df4f322b01ded5008d1c936acd585
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Feb 22 14:53:06 2019 -0800
+
+    subset VVAR & outer indices
+
+ src/hb-ot-var-hvar-table.hh | 49 ++++++++++++++++++++++++++++++++++++---------
+ src/hb-subset.cc            |  3 +++
+ 2 files changed, 43 insertions(+), 9 deletions(-)
+
+commit 2d545e1e86d94af05550118cac20ec097bc843b4
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Fri Feb 22 10:22:08 2019 -0800
+
+    unuse set in hb_map2_t impl
+    
+    also some code cleanup
+
+ src/hb-ot-layout-common.hh | 46 +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
+
+commit ca3b4a21dff4fcd804b0bf2249fb3f286486d8fa
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Feb 21 16:42:30 2019 -0800
+
+    fixed compiler gripes
+
+ src/hb-ot-var-hvar-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit a7b801f6d1410443f518cec5dad4d89a8feaf01d
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Feb 21 16:34:49 2019 -0800
+
+    fix CFF2 local subr subsetting
+    
+    bug exposed by impl change of fdmap
+    also fixed name of subr_remap_ts as subr_remaps_t
+
+ src/hb-subset-cff-common.hh |  8 ++++----
+ src/hb-subset-cff2.cc       | 20 +++++++++-----------
+ 2 files changed, 13 insertions(+), 15 deletions(-)
+
+commit a190140fa47ff5655edbb4eb414175852f722f85
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Thu Feb 21 15:47:27 2019 -0800
+
+    fix HVAR & VarStore subsetting
+
+ src/hb-ot-layout-common.hh  |  15 +++--
+ src/hb-ot-var-hvar-table.hh | 140 ++++++++++++++++++++++----------------------
+ 2 files changed, 77 insertions(+), 78 deletions(-)
+
+commit 09df17e71b1860e250638e8e76deee1da5e7a06b
+Author: Michiharu Ariza <ariza@adobe.com>
+Date:   Wed Feb 20 15:48:29 2019 -0800
+
+    subset HVAR
+    
+    Re-implemented & repurposed CFF:remap_t as hb_map2_t (moved to hb-ot-layout-common.hh) for two-way mapping for use by index map subsetting.
+    Hooked up HVAR subsetter through _subset2.
+    Some renaming in CFF code.
+
+ src/hb-ot-cff-common.hh     |  63 ++----------
+ src/hb-ot-cff1-table.hh     |   8 +-
+ src/hb-ot-layout-common.hh  | 158 ++++++++++++++++++++++++++++--
+ src/hb-ot-var-hvar-table.hh | 232 +++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-subset-cff-common.cc |   9 +-
+ src/hb-subset-cff-common.hh |  27 ++----
+ src/hb-subset-cff1.cc       |  29 +++---
+ src/hb-subset-cff2.cc       |  12 +--
+ src/hb-subset.cc            |   4 +
+ 9 files changed, 426 insertions(+), 116 deletions(-)
+
 commit 93739242e1aab9b745d0ba3c22c33b4acaf9526c
 Author: Michiharu Ariza <ariza@adobe.com>
 Date:   Wed Feb 20 13:23:12 2019 -0800
index 2bbd3c5..4a2a8c8 100644 (file)
@@ -10,7 +10,6 @@ EXTRA_DIST = \
        autogen.sh \
        harfbuzz.doap \
        README.md \
-       README.mingw.md \
        README.python.md \
        BUILD.md \
        CONFIG.md \
@@ -18,10 +17,17 @@ EXTRA_DIST = \
        TESTING.md \
        CMakeLists.txt \
        replace-enum-strings.cmake \
-       mingw-configure.sh \
-       mingw-ldd.py \
-       mingw32.sh \
-       mingw64.sh \
+       meson.build \
+       meson_options.txt \
+       subprojects/expat.wrap \
+       subprojects/fontconfig.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 \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
@@ -86,18 +92,4 @@ $(gpg_file): $(sha256_file)
 
 release-files: $(tar_file) $(sha256_file) $(gpg_file)
 
-dist-win:
-       @case $(host_triplet) in *-w64-mingw32) ;; *) echo "Error: Requires mingw build. See README.mingw.md.">&2; exit 1 ;; esac
-       @DIR=$(PACKAGE_TARNAME)-$(VERSION)-win`case $(host_triplet) in i686-*) echo 32 ;; x86_64-*) echo 64 ;; esac`; \
-       $(RM) -r $$DIR; $(MKDIR_P) $$DIR || exit 1; \
-       cp util/.libs/hb-{shape,view,subset}.exe $$DIR && \
-       $(top_srcdir)/mingw-ldd.py $$DIR/hb-view.exe | grep -v 'not found' | cut -d '>' -f 2 | xargs cp -t $$DIR && \
-       cp src/.libs/libharfbuzz{,-subset}-0.dll $$DIR && \
-       chmod a+x $$DIR/*.{exe,dll} && \
-       $(STRIP) $$DIR/*.{exe,dll} && \
-       zip -r $$DIR.zip $$DIR && \
-       $(RM) -r $$DIR && \
-       echo "$$DIR.zip is ready."
-
-
 -include $(top_srcdir)/git.mk
index 27d3a99..74e52e8 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -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.
@@ -345,6 +345,8 @@ 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@
@@ -407,7 +409,6 @@ EXTRA_DIST = \
        autogen.sh \
        harfbuzz.doap \
        README.md \
-       README.mingw.md \
        README.python.md \
        BUILD.md \
        CONFIG.md \
@@ -415,10 +416,17 @@ EXTRA_DIST = \
        TESTING.md \
        CMakeLists.txt \
        replace-enum-strings.cmake \
-       mingw-configure.sh \
-       mingw-ldd.py \
-       mingw32.sh \
-       mingw64.sh \
+       meson.build \
+       meson_options.txt \
+       subprojects/expat.wrap \
+       subprojects/fontconfig.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 \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
@@ -712,6 +720,10 @@ 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
@@ -754,6 +766,8 @@ 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)
@@ -932,7 +946,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 distcheck distclean \
+       dist-tarZ dist-xz dist-zip dist-zstd 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 \
@@ -975,19 +989,6 @@ $(gpg_file): $(sha256_file)
 
 release-files: $(tar_file) $(sha256_file) $(gpg_file)
 
-dist-win:
-       @case $(host_triplet) in *-w64-mingw32) ;; *) echo "Error: Requires mingw build. See README.mingw.md.">&2; exit 1 ;; esac
-       @DIR=$(PACKAGE_TARNAME)-$(VERSION)-win`case $(host_triplet) in i686-*) echo 32 ;; x86_64-*) echo 64 ;; esac`; \
-       $(RM) -r $$DIR; $(MKDIR_P) $$DIR || exit 1; \
-       cp util/.libs/hb-{shape,view,subset}.exe $$DIR && \
-       $(top_srcdir)/mingw-ldd.py $$DIR/hb-view.exe | grep -v 'not found' | cut -d '>' -f 2 | xargs cp -t $$DIR && \
-       cp src/.libs/libharfbuzz{,-subset}-0.dll $$DIR && \
-       chmod a+x $$DIR/*.{exe,dll} && \
-       $(STRIP) $$DIR/*.{exe,dll} && \
-       zip -r $$DIR.zip $$DIR && \
-       $(RM) -r $$DIR && \
-       echo "$$DIR.zip is ready."
-
 -include $(top_srcdir)/git.mk
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/NEWS b/NEWS
index 7dde119..04fbe13 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,35 @@
+Overview of changes leading to 2.6.7
+Wednesday, June 3, 2020
+====================================
+- Update to Unicode 13.0.0.
+- Fix hb_ot_layout_get_ligature_carets for fonts without lcar table, it was
+  completely broken for all the other fonts since 2.1.2.
+- As a part of our migration to meson, this release will be the last one
+  to provide cmake port files but autotools still is our main build system.
+  There is a possibility that the next version or the after be released
+  using meson.
+
+
+Overview of changes leading to 2.6.6
+Tuesday, May 12, 2020
+====================================
+- A fix in AAT kerning for Geeza Pro.
+- Better support for resource fork fonts on macOS.
+
+
+Overview of changes leading to 2.6.5
+Friday, April 17, 2020
+====================================
+- Add experimental meson build system.  Autotools is still the primary
+  and supported build system.
+- AAT is now always preferred for horizontal scripts when both AAT and OT
+  layout tables exist at the same time.
+- Subsetter improvements.
+- New API:
++hb_ft_font_lock_face()
++hb_ft_font_unlock_face()
+
+
 Overview of changes leading to 2.6.4
 Monday, October 29, 2019
 ====================================
diff --git a/README b/README
index e0ef935..3610912 100644 (file)
--- a/README
+++ b/README
@@ -27,8 +27,8 @@ Documentation: https://harfbuzz.github.io
 
 
 <details>
-  <summary>Packaging status of HarfBuzz</summary
+  <summary>Packaging status of HarfBuzz</summary>
 
-[![Packaging status](https://repology.org/badge/vertical-allrepos/harfbuzz.svg?header=harfbuzz)](https://repology.org/project/harfbuzz/versions)  
+[![Packaging status](https://repology.org/badge/vertical-allrepos/harfbuzz.svg?header=harfbuzz)](https://repology.org/project/harfbuzz/versions)
 
 </details>
index e0ef935..3610912 100644 (file)
--- a/README.md
+++ b/README.md
@@ -27,8 +27,8 @@ Documentation: https://harfbuzz.github.io
 
 
 <details>
-  <summary>Packaging status of HarfBuzz</summary
+  <summary>Packaging status of HarfBuzz</summary>
 
-[![Packaging status](https://repology.org/badge/vertical-allrepos/harfbuzz.svg?header=harfbuzz)](https://repology.org/project/harfbuzz/versions)  
+[![Packaging status](https://repology.org/badge/vertical-allrepos/harfbuzz.svg?header=harfbuzz)](https://repology.org/project/harfbuzz/versions)
 
 </details>
diff --git a/README.mingw.md b/README.mingw.md
deleted file mode 100644 (file)
index 76d1a87..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-For the development of HarfBuzz, the Microsoft shaping technology, Uniscribe,
-as a widely used and tested shaper is used as more-or-less OpenType reference
-implementation and that specially is important where OpenType specification
-is or wasn't that clear. For having access to Uniscribe on Linux/macOS these
-steps are recommended:
-
-1. Install Wine from your favorite package manager.  On Fedora that's `dnf install wine`.
-
-2. And `mingw-w64` compiler.
-   With `brew` on macOS, you can have it like `brew install mingw-w64`.
-   On Fedora, with `dnf install mingw32-gcc-c++`, or `dnf install mingw64-gcc-c++` for the
-   64-bit Windows.
-
-3. Install cross-compiled dependency packages.  Alternatively see [^1] below.
-   On Fedora that would be `dnf install mingw32-glib2 mingw32-cairo mingw32-freetype`
-   for 32-bit, or `dnf install mingw64-glib2 mingw64-cairo mingw64-freetype` for 64-bit.
-
-5. `NOCONFIGURE=1 ./autogen.sh && mkdir winbuild && cd winbuild`
-
-6. Run `../mingw32.sh` for 32-bit build, or `../mingw64.sh` for 64-bit.  This configures
-   HarfBuzz for cross-compiling.  It enables Uniscribe backend as well.
-
-7. `make`
-
-Now you can use hb-shape using `wine util/hb-shape.exe` but if you like to shape with
-the Microsoft Uniscribe,
-
-8. Bring a 32bit version of `usp10.dll` for yourself from `C:\Windows\SysWOW64\usp10.dll` of your
-   Windows installation (assuming you have a 64-bit installation, otherwise
-   `C:\Windows\System32\usp10.dll`) that it is not a DirectWrite proxy
-   ([for more info](https://en.wikipedia.org/wiki/Uniscribe)).
-   Rule of thumb, your `usp10.dll` should have a size more than 500kb, otherwise
-   it is designed to work with DirectWrite which Wine can't work with its original one.
-   You want a Uniscribe from Windows 7 or older.
-
-   Put the DLL in the folder you are going to run the next command,
-
-9. `WINEDLLOVERRIDES="usp10=n" wine util/hb-shape.exe fontname.ttf -u 0061,0062,0063 --shaper=uniscribe`
-
-(`0061,0062,0063` means `abc`, use test/shaping/hb-unicode-decode to generate ones you need)
-
-
-[^1] Download and put [this](https://drive.google.com/open?id=0B3_fQkxDZZXXbWltRGd5bjVrUDQ)
-     in your `~/.local/i686-w64-mingw32`.  Then replace all the instances of
-     `/home/behdad/.local/i586-mingw32msvc` and `/home/behdad/.local/i686-w64-mingw32`
-     with `<$HOME>/.local/i686-w64-mingw32` on that folder.
-     (`<$HOME>` replace it with `/home/XXX` or `/Users/XXX` on macOS)
-     You shouldn't replace the instances of those inside binary files.
index 360aea7..a26350b 100644 (file)
@@ -22,7 +22,7 @@ HarfBuzz release walk-through checklist:
 
 4. Make sure you have correct date and new version at the top of NEWS file,
 
-5. Bump version in configure.ac line 3,
+5. Bump version in configure.ac line 3 and meson.build line 4.
 
 6. Do "make distcheck", if it passes, you get a tarball.
    Otherwise, fix things and commit them separately before making release,
@@ -44,29 +44,13 @@ HarfBuzz release walk-through checklist:
 9. Tag the release and sign it: Eg. "git tag -s 1.4.7 -m 1.4.7".  Enter your
    GPG password again.
 
-10. Build win32 bundle.
+10. Build win32 bundle.  See [README.mingw.md](README.mingw.md).
 
-   a. Build Win32 binaries.  See [README.mingw.md](README.mingw.md).
-
-   b. Run "make dist-win" to build Win32 bundle.
-
-11. Copy all artefacts to users.freedesktop.org and move them into
-    `/srv/www.freedesktop.org/www/software/harfbuzz/release` There should be four
-    files.  Eg.:
- ```
--rw-r--r--  1 behdad eng 1592693 Jul 18 11:25 harfbuzz-1.4.7.tar.xz
--rw-r--r--  1 behdad eng      89 Jul 18 11:34 harfbuzz-1.4.7.tar.xz.sha256
--rw-r--r--  1 behdad eng     339 Jul 18 11:34 harfbuzz-1.4.7.tar.xz.sha256.asc
--rw-r--r--  1 behdad eng 2895619 Jul 18 11:34 harfbuzz-1.4.7-win32.zip
-```
-
-12. While doing that, quickly double-check the size of the .tar.xz and .zip
-    files against their previous releases to make sure nothing bad happened.
+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.
 
-13. Push the commit and tag out: "git push --follow-tags".  Make sure it's
-    pushed both to freedesktop repo and github.
-
-14. Go to GitHub release page [here](https://github.com/harfbuzz/harfbuzz/releases),
-    edit the tag, upload artefacts and NEWS entry and save.
+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.
index 94be3a0..d70da07 100644 (file)
@@ -55,10 +55,9 @@ make CPPFLAGS=-DHB_DEBUG_SUBSET=100
 Note: You'll need to first install ninja-build via apt-get.
 
 ```shell
-cd harfbuzz
-mkdir buid
-cmake -DHB_CHECK=ON -Bbuild -H. -GNinja && ninja -Cbuild && CTEST_OUTPUT_ON_FAILURE=1 ninja -Cbuild test
+meson build && ninja -Cbuild && ninja -Cbuild test
 ```
+
 ## Test with the Fuzzer
 
 ```shell
index a2efd89..23e51cd 100644 (file)
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.2 -*- Autoconf -*-
 
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -30,6 +30,47 @@ dnl
 
 # serial 1
 
+dnl This is a copy of AS_AC_EXPAND
+dnl
+dnl (C) 2003, 2004, 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+dnl Copying and distribution of this file, with or without modification,
+dnl are permitted in any medium without royalty provided the copyright
+dnl notice and this notice are preserved.
+m4_define([_GOBJECT_INTROSPECTION_AS_AC_EXPAND],
+[
+  EXP_VAR=[$1]
+  FROM_VAR=[$2]
+
+  dnl first expand prefix and exec_prefix if necessary
+  prefix_save=$prefix
+  exec_prefix_save=$exec_prefix
+
+  dnl if no prefix given, then use /usr/local, the default prefix
+  if test "x$prefix" = "xNONE"; then
+    prefix="$ac_default_prefix"
+  fi
+  dnl if no exec_prefix given, then use prefix
+  if test "x$exec_prefix" = "xNONE"; then
+    exec_prefix=$prefix
+  fi
+
+  full_var="$FROM_VAR"
+  dnl loop until it doesn't change anymore
+  while true; do
+    new_full_var="`eval echo $full_var`"
+    if test "x$new_full_var" = "x$full_var"; then break; fi
+    full_var=$new_full_var
+  done
+
+  dnl clean up
+  full_var=$new_full_var
+  AC_SUBST([$1], "$full_var")
+
+  dnl restore prefix and exec_prefix
+  prefix=$prefix_save
+  exec_prefix=$exec_prefix_save
+])
+
 m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
 [
     AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
@@ -72,20 +113,25 @@ m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
 
     AC_MSG_RESULT([$found_introspection])
 
+    dnl expand datadir/libdir so we can pass them to pkg-config
+    dnl and get paths relative to our target directories
+    _GOBJECT_INTROSPECTION_AS_AC_EXPAND(_GI_EXP_DATADIR, "$datadir")
+    _GOBJECT_INTROSPECTION_AS_AC_EXPAND(_GI_EXP_LIBDIR, "$libdir")
+
     INTROSPECTION_SCANNER=
     INTROSPECTION_COMPILER=
     INTROSPECTION_GENERATE=
     INTROSPECTION_GIRDIR=
     INTROSPECTION_TYPELIBDIR=
     if test "x$found_introspection" = "xyes"; then
-       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
-       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
-       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
-       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
-       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
+       INTROSPECTION_SCANNER=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
+       INTROSPECTION_COMPILER=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
+       INTROSPECTION_GENERATE=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
+       INTROSPECTION_GIRDIR=`$PKG_CONFIG --define-variable=datadir="${_GI_EXP_DATADIR}" --variable=girdir gobject-introspection-1.0`
+       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --define-variable=libdir="${_GI_EXP_LIBDIR}" --variable=typelibdir gobject-introspection-1.0)"
        INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
        INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
-       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
+       INTROSPECTION_MAKEFILE=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
     fi
     AC_SUBST(INTROSPECTION_SCANNER)
     AC_SUBST(INTROSPECTION_COMPILER)
@@ -461,7 +507,7 @@ 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-2018 Free Software Foundation, Inc.
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -476,7 +522,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.1], [],
+m4_if([$1], [1.16.2], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -492,12 +538,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.1])dnl
+[AM_AUTOMAKE_VERSION([1.16.2])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-2018 Free Software Foundation, Inc.
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -559,7 +605,7 @@ AC_SUBST([AR])dnl
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -611,7 +657,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -642,7 +688,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -833,7 +879,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -872,7 +918,9 @@ 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.  Try re-running configure with the
+    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
     '--disable-dependency-tracking' option to at least be able to build
     the package (albeit without support for automatic dependency tracking).])
   fi
@@ -899,7 +947,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1096,7 +1144,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-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1117,7 +1165,7 @@ if test x"${install_sh+set}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2018 Free Software Foundation, Inc.
+# Copyright (C) 2003-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1138,7 +1186,7 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1181,7 +1229,7 @@ AC_SUBST([am__quote])])
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1220,7 +1268,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1249,7 +1297,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1296,7 +1344,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1315,7 +1363,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1396,7 +1444,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2018 Free Software Foundation, Inc.
+# Copyright (C) 2009-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1456,7 +1504,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1484,7 +1532,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1503,7 +1551,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2018 Free Software Foundation, Inc.
+# Copyright (C) 2004-2020 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 0baa4f6..1e9388e 100755 (executable)
--- a/ar-lib
+++ b/ar-lib
@@ -2,9 +2,9 @@
 # Wrapper for Microsoft lib.exe
 
 me=ar-lib
-scriptversion=2012-03-01.08; # UTC
+scriptversion=2019-07-04.01; # UTC
 
-# Copyright (C) 2010-2018 Free Software Foundation, Inc.
+# Copyright (C) 2010-2020 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*)
+         CYGWIN* | MSYS*)
            file_conv=cygwin
            ;;
          *)
@@ -65,7 +65,7 @@ func_file_conv ()
        mingw)
          file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
          ;;
-       cygwin)
+       cygwin | msys)
          file=`cygpath -m "$file" || echo "$file"`
          ;;
        wine)
@@ -224,10 +224,11 @@ elif test -n "$extract"; then
       esac
     done
   else
-    $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
-    do
-      $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
-    done
+    $AR -NOLOGO -LIST "$archive" | tr -d '\r' | sed -e 's/\\/\\\\/g' \
+      | while read member
+        do
+          $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
+        done
   fi
 
 elif test -n "$quick$replace"; then
diff --git a/compile b/compile
index 99e5052..23fcba0 100755 (executable)
--- a/compile
+++ b/compile
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2020 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*)
+         CYGWIN* | MSYS*)
            file_conv=cygwin
            ;;
          *)
@@ -67,7 +67,7 @@ func_file_conv ()
        mingw/*)
          file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
          ;;
-       cygwin/*)
+       cygwin/* | msys/*)
          file=`cygpath -m "$file" || echo "$file"`
          ;;
        wine/*)
index 256083a..45001cf 100755 (executable)
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2018 Free Software Foundation, Inc.
+#   Copyright 1992-2020 Free Software Foundation, Inc.
 
-timestamp='2018-03-08'
+timestamp='2020-01-01'
 
 # 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-2018 Free Software Foundation, Inc.
+Copyright 1992-2020 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,8 +84,6 @@ 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
@@ -96,34 +94,40 @@ trap 'exit 1' 1 2 15
 
 # Portable tmp directory creation inspired by the Autoconf team.
 
-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= ;'
+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
+}
 
 # 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) >/dev/null 2>&1 ; then
+if test -f /.attbin/uname ; then
        PATH=$PATH:/.attbin ; export PATH
 fi
 
@@ -138,7 +142,7 @@ Linux|GNU|GNU/*)
        # We could probably try harder.
        LIBC=gnu
 
-       eval "$set_cc_for_build"
+       set_cc_for_build
        cat <<-EOF > "$dummy.c"
        #include <features.h>
        #if defined(__UCLIBC__)
@@ -199,7 +203,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
                os=netbsdelf
                ;;
            arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-               eval "$set_cc_for_build"
+               set_cc_for_build
                if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
                        | grep -q __ELF__
                then
@@ -237,7 +241,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.//'`
@@ -260,6 +264,9 @@ 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 ;;
@@ -269,12 +276,15 @@ 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)
@@ -389,7 +399,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
        echo i386-pc-auroraux"$UNAME_RELEASE"
        exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-       eval "$set_cc_for_build"
+       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.
@@ -482,7 +492,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
        echo clipper-intergraph-clix"$UNAME_RELEASE"
        exit ;;
     mips:*:*:UMIPS | mips:*:*:RISCos)
-       eval "$set_cc_for_build"
+       set_cc_for_build
        sed 's/^        //' << EOF > "$dummy.c"
 #ifdef __cplusplus
 #include <stdio.h>  /* for printf() prototype */
@@ -579,7 +589,7 @@ EOF
        exit ;;
     *:AIX:2:3)
        if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-               eval "$set_cc_for_build"
+               set_cc_for_build
                sed 's/^                //' << EOF > "$dummy.c"
                #include <sys/systemcfg.h>
 
@@ -660,7 +670,7 @@ EOF
                    esac
                fi
                if [ "$HP_ARCH" = "" ]; then
-                   eval "$set_cc_for_build"
+                   set_cc_for_build
                    sed 's/^            //' << EOF > "$dummy.c"
 
                #define _HPUX_SOURCE
@@ -700,7 +710,7 @@ EOF
        esac
        if [ "$HP_ARCH" = hppa2.0w ]
        then
-           eval "$set_cc_for_build"
+           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
@@ -726,7 +736,7 @@ EOF
        echo ia64-hp-hpux"$HPUX_REV"
        exit ;;
     3050*:HI-UX:*:*)
-       eval "$set_cc_for_build"
+       set_cc_for_build
        sed 's/^        //' << EOF > "$dummy.c"
        #include <unistd.h>
        int
@@ -840,6 +850,17 @@ 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
@@ -881,7 +902,7 @@ EOF
        echo "$UNAME_MACHINE"-pc-uwin
        exit ;;
     amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-       echo x86_64-unknown-cygwin
+       echo x86_64-pc-cygwin
        exit ;;
     prep*:SunOS:5.*:*)
        echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
@@ -894,8 +915,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 ;;
-    i*86:Minix:*:*)
-       echo "$UNAME_MACHINE"-pc-minix
+    *:Minix:*:*)
+       echo "$UNAME_MACHINE"-unknown-minix
        exit ;;
     aarch64:Linux:*:*)
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -905,7 +926,7 @@ EOF
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
        exit ;;
     alpha:Linux:*:*)
-       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
          EV5)   UNAME_MACHINE=alphaev5 ;;
          EV56)  UNAME_MACHINE=alphaev56 ;;
          PCA56) UNAME_MACHINE=alphapca56 ;;
@@ -922,7 +943,7 @@ EOF
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
        exit ;;
     arm*:Linux:*:*)
-       eval "$set_cc_for_build"
+       set_cc_for_build
        if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
            | grep -q __ARM_EABI__
        then
@@ -971,23 +992,51 @@ EOF
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
        exit ;;
     mips:Linux:*:* | mips64:Linux:*:*)
-       eval "$set_cc_for_build"
+       set_cc_for_build
+       IS_GLIBC=0
+       test x"${LIBC}" = xgnu && IS_GLIBC=1
        sed 's/^        //' << EOF > "$dummy.c"
        #undef CPU
-       #undef ${UNAME_MACHINE}
-       #undef ${UNAME_MACHINE}el
+       #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
+
        #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-       CPU=${UNAME_MACHINE}el
+       MIPS_ENDIAN=el
        #else
        #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-       CPU=${UNAME_MACHINE}
+       MIPS_ENDIAN=
        #else
-       CPU=
+       MIPS_ENDIAN=
        #endif
        #endif
 EOF
-       eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`"
-       test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; }
+       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; }
        ;;
     mips64el:Linux:*:*)
        echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -1100,7 +1149,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
@@ -1284,38 +1333,39 @@ EOF
        echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
        exit ;;
     *:Darwin:*:*)
-       UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-       eval "$set_cc_for_build"
-       if test "$UNAME_PROCESSOR" = unknown ; then
-           UNAME_PROCESSOR=powerpc
+       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
        fi
-       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
+       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
        elif test "$UNAME_PROCESSOR" = i386 ; then
-           # 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
+           # uname -m returns i386 or x86_64
+           UNAME_PROCESSOR=$UNAME_MACHINE
        fi
        echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
        exit ;;
@@ -1358,6 +1408,7 @@ 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
@@ -1414,8 +1465,148 @@ 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
index 381036e..934252e 100644 (file)
@@ -81,9 +81,6 @@
 /* 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
 
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
 
-/* Define to 1 if you have the `strtod_l' function. */
-#undef HAVE_STRTOD_L
-
 /* Define to 1 if you have the `sysconf' function. */
 #undef HAVE_SYSCONF
 
 /* 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 20f7cf2..f02d43a 100755 (executable)
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2018 Free Software Foundation, Inc.
+#   Copyright 1992-2020 Free Software Foundation, Inc.
 
-timestamp='2018-05-05'
+timestamp='2020-01-01'
 
 # 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-2018 Free Software Foundation, Inc.
+Copyright 1992-2020 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"
+       echo "$me: invalid option $1$help" >&2
        exit 1 ;;
 
     *local*)
@@ -110,16 +110,21 @@ case $# in
     exit 1;;
 esac
 
-# Spilt fields of configuration type
-IFS="-" read -r field1 field2 field3 field4 <<EOF
+# Split fields of configuration type
+# shellcheck disable=SC2162
+IFS="-" read field1 field2 field3 field4 <<EOF
 $1
 EOF
 
 # Separate into logical components for further validation
 case $1 in
+       *-*-*-*-*)
+               echo Invalid configuration \`"$1"\': more than four components >&2
+               exit 1
+               ;;
        *-*-*-*)
                basic_machine=$field1-$field2
-               os=-$field3-$field4
+               os=$field3-$field4
                ;;
        *-*-*)
                # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
@@ -132,1227 +137,1137 @@ case $1 in
                        | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
                        | storm-chaos* | os2-emx* | rtmk-nova*)
                                basic_machine=$field1
-                               os=-$maybe_os
+                               os=$maybe_os
                                ;;
                        android-linux)
                                basic_machine=$field1-unknown
-                               os=-linux-android
+                               os=linux-android
                                ;;
                        *)
                                basic_machine=$field1-$field2
-                               os=-$field3
+                               os=$field3
                                ;;
                esac
                ;;
        *-*)
-               basic_machine=$field1
-               os=-$field2
+               # 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
                ;;
        *)
-               basic_machine=$1
-               os=
-               ;;
-esac
-
-### 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.
-               ;;
-       -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
-               ;;
-       -bluegene*)
-               os=-cnk
-               ;;
-       -sim | -cisco | -oki | -wec | -winbond)
-               os=
-               basic_machine=$1
-               ;;
-       -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
+               # 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
                ;;
 esac
 
-# Decode aliases for certain CPU-COMPANY combinations.
+# Decode 1-component or ad-hoc basic machines
 case $basic_machine in
-       # 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] | armv6m | armv[78][arm] \
-       | avr | avr32 \
-       | ba \
-       | be32 | be64 \
-       | bfin \
-       | c4x | c8051 | clipper | csky \
-       | 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 \
-       | nfp \
-       | 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
-               ;;
-       leon|leon[3-9])
-               basic_machine=sparc-$basic_machine
-               ;;
-       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
-               basic_machine=$basic_machine-unknown
-               os=-none
-               ;;
-       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)
+       # 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
                ;;
-       m9s12z | m68hcs12z | hcs12z | s12z)
-               basic_machine=s12z-unknown
-               os=-none
+       op50n)
+               cpu=hppa1.1
+               vendor=oki
                ;;
-       ms1)
-               basic_machine=mt-unknown
+       op60c)
+               cpu=hppa1.1
+               vendor=oki
                ;;
-
-       strongarm | thumb | xscale)
-               basic_machine=arm-unknown
+       ibm*)
+               cpu=i370
+               vendor=ibm
                ;;
-       xgate)
-               basic_machine=$basic_machine-unknown
-               os=-none
+       orion105)
+               cpu=clipper
+               vendor=highlevel
                ;;
-       xscaleeb)
-               basic_machine=armeb-unknown
+       mac | mpw | mac-mpw)
+               cpu=m68k
+               vendor=apple
                ;;
-
-       xscaleel)
-               basic_machine=armel-unknown
+       pmac | pmac-mpw)
+               cpu=powerpc
+               vendor=apple
                ;;
 
-       # 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-* | csky-* | 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-* \
-       | nfp-* \
-       | 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)
-               basic_machine=m68000-att
+               cpu=m68000
+               vendor=att
                ;;
        3b*)
-               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
+               cpu=we32k
+               vendor=att
                ;;
        bluegene*)
-               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
+               cpu=powerpc
+               vendor=ibm
+               os=cnk
                ;;
        decsystem10* | dec10*)
-               basic_machine=pdp10-dec
-               os=-tops10
+               cpu=pdp10
+               vendor=dec
+               os=tops10
                ;;
        decsystem20* | dec20*)
-               basic_machine=pdp10-dec
-               os=-tops20
+               cpu=pdp10
+               vendor=dec
+               os=tops20
                ;;
        delta | 3300 | motorola-3300 | motorola-delta \
              | 3300-motorola | delta-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
+               cpu=m68k
+               vendor=motorola
                ;;
        dpx2*)
-               basic_machine=m68k-bull
-               os=-sysv3
-               ;;
-       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)
-               basic_machine=elxsi-elxsi
-               os=-bsd
+               cpu=m68k
+               vendor=bull
+               os=sysv3
                ;;
        encore | umax | mmax)
-               basic_machine=ns32k-encore
+               cpu=ns32k
+               vendor=encore
                ;;
-       es1800 | OSE68k | ose68k | ose | OSE)
-               basic_machine=m68k-ericsson
-               os=-ose
+       elxsi)
+               cpu=elxsi
+               vendor=elxsi
+               os=${os:-bsd}
                ;;
        fx2800)
-               basic_machine=i860-alliant
+               cpu=i860
+               vendor=alliant
                ;;
        genix)
-               basic_machine=ns32k-ns
-               ;;
-       gmicro)
-               basic_machine=tron-gmicro
-               os=-sysv
-               ;;
-       go32)
-               basic_machine=i386-pc
-               os=-go32
+               cpu=ns32k
+               vendor=ns
                ;;
        h3050r* | hiux*)
-               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
+               cpu=hppa1.1
+               vendor=hitachi
+               os=hiuxwe2
                ;;
        hp3k9[0-9][0-9] | hp9[0-9][0-9])
-               basic_machine=hppa1.0-hp
+               cpu=hppa1.0
+               vendor=hp
                ;;
        hp9k2[0-9][0-9] | hp9k31[0-9])
-               basic_machine=m68000-hp
+               cpu=m68000
+               vendor=hp
                ;;
        hp9k3[2-9][0-9])
-               basic_machine=m68k-hp
+               cpu=m68k
+               vendor=hp
                ;;
        hp9k6[0-9][0-9] | hp6[0-9][0-9])
-               basic_machine=hppa1.0-hp
+               cpu=hppa1.0
+               vendor=hp
                ;;
        hp9k7[0-79][0-9] | hp7[0-79][0-9])
-               basic_machine=hppa1.1-hp
+               cpu=hppa1.1
+               vendor=hp
                ;;
        hp9k78[0-9] | hp78[0-9])
                # FIXME: really hppa2.0-hp
-               basic_machine=hppa1.1-hp
+               cpu=hppa1.1
+               vendor=hp
                ;;
        hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
                # FIXME: really hppa2.0-hp
-               basic_machine=hppa1.1-hp
+               cpu=hppa1.1
+               vendor=hp
                ;;
        hp9k8[0-9][13679] | hp8[0-9][13679])
-               basic_machine=hppa1.1-hp
+               cpu=hppa1.1
+               vendor=hp
                ;;
        hp9k8[0-9][0-9] | hp8[0-9][0-9])
-               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
+               cpu=hppa1.0
+               vendor=hp
                ;;
        i*86v32)
-               basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
-               os=-sysv32
+               cpu=`echo "$1" | sed -e 's/86.*/86/'`
+               vendor=pc
+               os=sysv32
                ;;
        i*86v4*)
-               basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
-               os=-sysv4
+               cpu=`echo "$1" | sed -e 's/86.*/86/'`
+               vendor=pc
+               os=sysv4
                ;;
        i*86v)
-               basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
-               os=-sysv
+               cpu=`echo "$1" | sed -e 's/86.*/86/'`
+               vendor=pc
+               os=sysv
                ;;
        i*86sol2)
-               basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
-               os=-solaris2
-               ;;
-       i386mach)
-               basic_machine=i386-mach
-               os=-mach
+               cpu=`echo "$1" | sed -e 's/86.*/86/'`
+               vendor=pc
+               os=solaris2
                ;;
-       vsta)
-               basic_machine=i386-unknown
-               os=-vsta
+       j90 | j90-cray)
+               cpu=j90
+               vendor=cray
+               os=${os:-unicos}
                ;;
        iris | iris4d)
-               basic_machine=mips-sgi
+               cpu=mips
+               vendor=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)
-               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
-               ;;
-       netbsd386)
-               basic_machine=i386-unknown
-               os=-netbsd
-               ;;
-       netwinder)
-               basic_machine=armv4l-rebel
-               os=-linux
+               cpu=m68000
+               vendor=convergent
                ;;
-       news | news700 | news800 | news900)
-               basic_machine=m68k-sony
-               os=-newsos
-               ;;
-       news1000)
-               basic_machine=m68030-sony
-               os=-newsos
+       *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               cpu=m68k
+               vendor=atari
+               os=mint
                ;;
        news-3600 | risc-news)
-               basic_machine=mips-sony
-               os=-newsos
-               ;;
-       necv70)
-               basic_machine=v70-nec
-               os=-sysv
+               cpu=mips
+               vendor=sony
+               os=newsos
                ;;
        next | m*-next)
-               basic_machine=m68k-next
+               cpu=m68k
+               vendor=next
                case $os in
-                   -nextstep* )
+                   openstep*)
+                       ;;
+                   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)
-               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
+               cpu=np1
+               vendor=gould
                ;;
        op50n-* | op60c-*)
-               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
+               cpu=hppa1.1
+               vendor=oki
+               os=proelf
                ;;
        pa-hitachi)
-               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
+               cpu=hppa1.1
+               vendor=hitachi
+               os=hiuxwe2
                ;;
        pbd)
-               basic_machine=sparc-tti
+               cpu=sparc
+               vendor=tti
                ;;
        pbb)
-               basic_machine=m68k-tti
-               ;;
-       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
+               cpu=m68k
+               vendor=tti
                ;;
-       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/^[^-]*-//'`
+       pc532)
+               cpu=ns32k
+               vendor=pc532
                ;;
        pn)
-               basic_machine=pn-gould
-               ;;
-       power)  basic_machine=power-ibm
+               cpu=pn
+               vendor=gould
                ;;
-       ppc | ppcbe)    basic_machine=powerpc-unknown
+       power)
+               cpu=power
+               vendor=ibm
                ;;
-       ppc-* | ppcbe-*)
-               basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
-               ;;
-       ppcle | powerpclittle)
-               basic_machine=powerpcle-unknown
-               ;;
-       ppcle-* | powerpclittle-*)
-               basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'`
-               ;;
-       ppc64)  basic_machine=powerpc64-unknown
+       ps2)
+               cpu=i386
+               vendor=ibm
                ;;
-       ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+       rm[46]00)
+               cpu=mips
+               vendor=siemens
                ;;
-       ppc64le | powerpc64little)
-               basic_machine=powerpc64le-unknown
+       rtpc | rtpc-*)
+               cpu=romp
+               vendor=ibm
                ;;
-       ppc64le-* | powerpc64little-*)
-               basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+       sde)
+               cpu=mipsisa32
+               vendor=sde
+               os=${os:-elf}
                ;;
-       ps2)
-               basic_machine=i386-ibm
+       simso-wrs)
+               cpu=sparclite
+               vendor=wrs
+               os=vxworks
                ;;
-       pw32)
-               basic_machine=i586-unknown
-               os=-pw32
+       tower | tower-32)
+               cpu=m68k
+               vendor=ncr
                ;;
-       rdos | rdos64)
-               basic_machine=x86_64-pc
-               os=-rdos
+       vpp*|vx|vx-*)
+               cpu=f301
+               vendor=fujitsu
                ;;
-       rdos32)
-               basic_machine=i386-pc
-               os=-rdos
+       w65)
+               cpu=w65
+               vendor=wdc
                ;;
-       rom68k)
-               basic_machine=m68k-rom68k
-               os=-coff
+       w89k-*)
+               cpu=hppa1.1
+               vendor=winbond
+               os=proelf
                ;;
-       rm[46]00)
-               basic_machine=mips-siemens
+       none)
+               cpu=none
+               vendor=none
                ;;
-       rtpc | rtpc-*)
-               basic_machine=romp-ibm
+       leon|leon[3-9])
+               cpu=sparc
+               vendor=$basic_machine
                ;;
-       s390 | s390-*)
-               basic_machine=s390-ibm
+       leon-*|leon[3-9]-*)
+               cpu=sparc
+               vendor=`echo "$basic_machine" | sed 's/-.*//'`
                ;;
-       s390x | s390x-*)
-               basic_machine=s390x-ibm
+
+       *-*)
+               # shellcheck disable=SC2162
+               IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
                ;;
-       sa29200)
-               basic_machine=a29k-amd
-               os=-udi
+       # 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
                ;;
-       sb1)
-               basic_machine=mipsisa64sb1-unknown
+       # 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
                ;;
-       sb1el)
-               basic_machine=mipsisa64sb1el-unknown
+       x64 | amd64)
+               cpu=x86_64
+               vendor=pc
                ;;
-       sde)
-               basic_machine=mipsisa32-sde
-               os=-elf
+       # Recognize the basic CPU types without company name.
+       *)
+               cpu=$basic_machine
+               vendor=unknown
                ;;
-       sei)
-               basic_machine=mips-sei
-               os=-seiux
+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}
                ;;
-       sequent)
-               basic_machine=i386-sequent
+       c90-unknown | c90-cray)
+               vendor=cray
+               os=${os:-unicos}
                ;;
-       sh5el)
-               basic_machine=sh5le-unknown
+       fx80-unknown)
+               vendor=alliant
                ;;
-       simso-wrs)
-               basic_machine=sparclite-wrs
-               os=-vxworks
+       romp-unknown)
+               vendor=ibm
                ;;
-       sps7)
-               basic_machine=m68k-bull
-               os=-sysv2
+       mmix-unknown)
+               vendor=knuth
                ;;
-       spur)
-               basic_machine=spur-unknown
+       microblaze-unknown | microblazeel-unknown)
+               vendor=xilinx
                ;;
-       st2000)
-               basic_machine=m68k-tandem
+       rs6000-unknown)
+               vendor=ibm
                ;;
-       stratus)
-               basic_machine=i860-stratus
-               os=-sysv4
+       vax-unknown)
+               vendor=dec
                ;;
-       strongarm-* | thumb-*)
-               basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+       pdp11-unknown)
+               vendor=dec
                ;;
-       sun2)
-               basic_machine=m68000-sun
+       we32k-unknown)
+               vendor=att
                ;;
-       sun2os3)
-               basic_machine=m68000-sun
-               os=-sunos3
+       cydra-unknown)
+               vendor=cydrome
                ;;
-       sun2os4)
-               basic_machine=m68000-sun
-               os=-sunos4
+       i370-ibm*)
+               vendor=ibm
                ;;
-       sun3os3)
-               basic_machine=m68k-sun
-               os=-sunos3
+       orion-unknown)
+               vendor=highlevel
                ;;
-       sun3os4)
-               basic_machine=m68k-sun
-               os=-sunos4
+       xps-unknown | xps100-unknown)
+               cpu=xps100
+               vendor=honeywell
                ;;
-       sun4os3)
-               basic_machine=sparc-sun
-               os=-sunos3
+
+       # Here we normalize CPU types with a missing or matching vendor
+       dpx20-unknown | dpx20-bull)
+               cpu=rs6000
+               vendor=bull
+               os=${os:-bosx}
                ;;
-       sun4os4)
-               basic_machine=sparc-sun
-               os=-sunos4
+
+       # Here we normalize CPU types irrespective of the vendor
+       amd64-*)
+               cpu=x86_64
                ;;
-       sun4sol2)
-               basic_machine=sparc-sun
-               os=-solaris2
+       blackfin-*)
+               cpu=bfin
+               os=linux
                ;;
-       sun3 | sun3-*)
-               basic_machine=m68k-sun
+       c54x-*)
+               cpu=tic54x
                ;;
-       sun4)
-               basic_machine=sparc-sun
+       c55x-*)
+               cpu=tic55x
                ;;
-       sun386 | sun386i | roadrunner)
-               basic_machine=i386-sun
+       c6x-*)
+               cpu=tic6x
                ;;
-       sv1)
-               basic_machine=sv1-cray
-               os=-unicos
+       e500v[12]-*)
+               cpu=powerpc
+               os=$os"spe"
                ;;
-       symmetry)
-               basic_machine=i386-sequent
-               os=-dynix
+       mips3*-*)
+               cpu=mips64
                ;;
-       t3e)
-               basic_machine=alphaev5-cray
-               os=-unicos
+       ms1-*)
+               cpu=mt
                ;;
-       t90)
-               basic_machine=t90-cray
-               os=-unicos
+       m68knommu-*)
+               cpu=m68k
+               os=linux
                ;;
-       tile*)
-               basic_machine=$basic_machine-unknown
-               os=-linux-gnu
+       m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+               cpu=s12z
                ;;
-       tx39)
-               basic_machine=mipstx39-unknown
+       openrisc-*)
+               cpu=or32
                ;;
-       tx39el)
-               basic_machine=mipstx39el-unknown
+       parisc-*)
+               cpu=hppa
+               os=linux
                ;;
-       toad1)
-               basic_machine=pdp10-xkl
-               os=-tops20
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               cpu=i586
                ;;
-       tower | tower-32)
-               basic_machine=m68k-ncr
+       pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+               cpu=i686
                ;;
-       tpf)
-               basic_machine=s390x-ibm
-               os=-tpf
+       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+               cpu=i686
                ;;
-       udi29k)
-               basic_machine=a29k-amd
-               os=-udi
+       pentium4-*)
+               cpu=i786
                ;;
-       ultra3)
-               basic_machine=a29k-nyu
-               os=-sym1
+       pc98-*)
+               cpu=i386
                ;;
-       v810 | necv810)
-               basic_machine=v810-nec
-               os=-none
+       ppc-* | ppcbe-*)
+               cpu=powerpc
                ;;
-       vaxv)
-               basic_machine=vax-dec
-               os=-sysv
+       ppcle-* | powerpclittle-*)
+               cpu=powerpcle
                ;;
-       vms)
-               basic_machine=vax-dec
-               os=-vms
+       ppc64-*)
+               cpu=powerpc64
                ;;
-       vpp*|vx|vx-*)
-               basic_machine=f301-fujitsu
+       ppc64le-* | powerpc64little-*)
+               cpu=powerpc64le
                ;;
-       vxworks960)
-               basic_machine=i960-wrs
-               os=-vxworks
+       sb1-*)
+               cpu=mipsisa64sb1
                ;;
-       vxworks68)
-               basic_machine=m68k-wrs
-               os=-vxworks
+       sb1el-*)
+               cpu=mipsisa64sb1el
                ;;
-       vxworks29k)
-               basic_machine=a29k-wrs
-               os=-vxworks
+       sh5e[lb]-*)
+               cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
                ;;
-       w65*)
-               basic_machine=w65-wdc
-               os=-none
+       spur-*)
+               cpu=spur
                ;;
-       w89k-*)
-               basic_machine=hppa1.1-winbond
-               os=-proelf
+       strongarm-* | thumb-*)
+               cpu=arm
                ;;
-       x64)
-               basic_machine=x86_64-pc
+       tx39-*)
+               cpu=mipstx39
                ;;
-       xbox)
-               basic_machine=i686-pc
-               os=-mingw32
+       tx39el-*)
+               cpu=mipstx39el
                ;;
-       xps | xps100)
-               basic_machine=xps100-honeywell
+       x64-*)
+               cpu=x86_64
                ;;
        xscale-* | xscalee[bl]-*)
-               basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'`
-               ;;
-       ymp)
-               basic_machine=ymp-cray
-               os=-unicos
-               ;;
-       none)
-               basic_machine=none-none
-               os=-none
+               cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
                ;;
 
-# 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
-               ;;
-       op60c)
-               basic_machine=hppa1.1-oki
-               ;;
-       romp)
-               basic_machine=romp-ibm
+       # Recognize the canonical CPU Types that limit and/or modify the
+       # company names they are paired with.
+       cr16-*)
+               os=${os:-elf}
                ;;
-       mmix)
-               basic_machine=mmix-knuth
+       crisv32-* | etraxfs*-*)
+               cpu=crisv32
+               vendor=axis
                ;;
-       rs6000)
-               basic_machine=rs6000-ibm
+       cris-* | etrax*-*)
+               cpu=cris
+               vendor=axis
                ;;
-       vax)
-               basic_machine=vax-dec
+       crx-*)
+               os=${os:-elf}
                ;;
-       pdp11)
-               basic_machine=pdp11-dec
-               ;;
-       we32k)
-               basic_machine=we32k-att
+       neo-tandem)
+               cpu=neo
+               vendor=tandem
                ;;
-       sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-               basic_machine=sh-unknown
+       nse-tandem)
+               cpu=nse
+               vendor=tandem
                ;;
-       cydra)
-               basic_machine=cydra-cydrome
+       nsr-tandem)
+               cpu=nsr
+               vendor=tandem
                ;;
-       orion)
-               basic_machine=orion-highlevel
+       nsv-tandem)
+               cpu=nsv
+               vendor=tandem
                ;;
-       orion105)
-               basic_machine=clipper-highlevel
+       nsx-tandem)
+               cpu=nsx
+               vendor=tandem
                ;;
-       mac | mpw | mac-mpw)
-               basic_machine=m68k-apple
+       s390-*)
+               cpu=s390
+               vendor=ibm
                ;;
-       pmac | pmac-mpw)
-               basic_machine=powerpc-apple
+       s390x-*)
+               cpu=s390x
+               vendor=ibm
                ;;
-       *-unknown)
-               # Make sure to match an already-canonicalized machine name.
+       tile*-*)
+               os=${os:-linux-gnu}
                ;;
+
        *)
-               echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
-               exit 1
+               # 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
                ;;
 esac
 
 # Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-       *-digital*)
-               basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'`
+case $vendor in
+       digital*)
+               vendor=dec
                ;;
-       *-commodore*)
-               basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'`
+       commodore*)
+               vendor=cbm
                ;;
        *)
                ;;
@@ -1365,200 +1280,238 @@ 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
+       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
                ;;
        # 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* | -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* | -hcos* \
-             | -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*)
+       # 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)
        # Remember, each alternative MUST END IN *, to match a version number.
                ;;
-       -qnx*)
-               case $basic_machine in
-                   x86-* | i*86-*)
+       qnx*)
+               case $cpu in
+                   x86 | i*86)
                        ;;
                    *)
-                       os=-nto$os
+                       os=nto-$os
                        ;;
                esac
                ;;
-       -nto-qnx*)
+       hiux*)
+               os=hiuxwe2
                ;;
-       -nto*)
-               os=`echo $os | sed -e 's|nto|nto-qnx|'`
+       nto-qnx*)
                ;;
-       -sim | -xray | -os68k* | -v88r* \
-             | -windows* | -osx | -abug | -netware* | -os9* \
-             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+       nto*)
+               os=`echo $os | sed -e 's|nto|nto-qnx|'`
                ;;
-       -mac*)
-               os=`echo "$os" | sed -e 's|mac|macos|'`
+       sim | xray | os68k* | v88r* \
+           | windows* | osx | abug | netware* | os9* \
+           | macos* | mpw* | magic* | mmixware* | mon960* | lnews*)
                ;;
-       -linux-dietlibc)
-               os=-linux-dietlibc
+       linux-dietlibc)
+               os=linux-dietlibc
                ;;
-       -linux*)
+       linux*)
                os=`echo $os | sed -e 's|linux|linux-gnu|'`
                ;;
-       -sunos5*)
-               os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+       lynx*178)
+               os=lynxos178
                ;;
-       -sunos6*)
-               os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+       lynx*5)
+               os=lynxos5
                ;;
-       -opened*)
-               os=-openedition
+       lynx*)
+               os=lynxos
                ;;
-       -os400*)
-               os=-os400
+       mac*)
+               os=`echo "$os" | sed -e 's|mac|macos|'`
                ;;
-       -wince*)
-               os=-wince
+       opened*)
+               os=openedition
                ;;
-       -utek*)
-               os=-bsd
+       os400*)
+               os=os400
                ;;
-       -dynix*)
-               os=-bsd
+       sunos5*)
+               os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
                ;;
-       -acis*)
-               os=-aos
+       sunos6*)
+               os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
                ;;
-       -atheos*)
-               os=-atheos
+       wince*)
+               os=wince
                ;;
-       -syllable*)
-               os=-syllable
+       utek*)
+               os=bsd
                ;;
-       -386bsd)
-               os=-bsd
+       dynix*)
+               os=bsd
                ;;
-       -ctix* | -uts*)
-               os=-sysv
+       acis*)
+               os=aos
                ;;
-       -nova*)
-               os=-rtmk-nova
+       atheos*)
+               os=atheos
                ;;
-       -ns2)
-               os=-nextstep2
+       syllable*)
+               os=syllable
                ;;
-       -nsk*)
-               os=-nsk
+       386bsd)
+               os=bsd
+               ;;
+       ctix* | uts*)
+               os=sysv
+               ;;
+       nova*)
+               os=rtmk-nova
+               ;;
+       ns2)
+               os=nextstep2
                ;;
        # 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 $basic_machine in
+               case $cpu in
                    arm*)
-                       os=-eabi
+                       os=eabi
                        ;;
                    *)
-                       os=-elf
+                       os=elf
                        ;;
                esac
                ;;
-       -nacl*)
+       nacl*)
                ;;
-       -ios)
+       ios)
                ;;
-       -none)
+       none)
                ;;
-       -*-eabi)
-               case $basic_machine in
-                   arm*)
-                       ;;
-               esac
+       *-eabi)
                ;;
        *)
-               # 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
                ;;
@@ -1575,254 +1528,261 @@ else
 # will signal an error saying that MANUFACTURER isn't an operating
 # system, and we'll never get to this point.
 
-case $basic_machine in
+case $cpu-$vendor 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
+               os=elf
+               ;;
+       clipper-intergraph)
+               os=clix
                ;;
        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
+               os=mint
+               ;;
+       *-wrs)
+               os=vxworks
                ;;
        *)
-               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.
-vendor=unknown
-case $basic_machine in
-       *-unknown)
+case $vendor 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
                                ;;
-                       -mvs* | -opened*)
+                       clix*)
+                               vendor=intergraph
+                               ;;
+                       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 "$basic_machine$os"
+echo "$cpu-$vendor-$os"
 exit
 
 # Local variables:
index 8d63038..1b5bc56 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.4.
+# Generated by GNU Autoconf 2.69 for HarfBuzz 2.6.7.
 #
 # 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.4'
-PACKAGE_STRING='HarfBuzz 2.6.4'
+PACKAGE_VERSION='2.6.7'
+PACKAGE_STRING='HarfBuzz 2.6.7'
 PACKAGE_BUGREPORT='https://github.com/harfbuzz/harfbuzz/issues/new'
 PACKAGE_URL='http://harfbuzz.org/'
 
@@ -691,6 +691,8 @@ INTROSPECTION_GIRDIR
 INTROSPECTION_GENERATE
 INTROSPECTION_COMPILER
 INTROSPECTION_SCANNER
+_GI_EXP_LIBDIR
+_GI_EXP_DATADIR
 have_gobject
 HAVE_GOBJECT_FALSE
 HAVE_GOBJECT_TRUE
@@ -1485,7 +1487,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.4 to adapt to many kinds of systems.
+\`configure' configures HarfBuzz 2.6.7 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1555,7 +1557,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of HarfBuzz 2.6.4:";;
+     short | recursive ) echo "Configuration of HarfBuzz 2.6.7:";;
    esac
   cat <<\_ACEOF
 
@@ -1739,7 +1741,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-HarfBuzz configure 2.6.4
+HarfBuzz configure 2.6.7
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2557,7 +2559,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.4, which was
+It was created by HarfBuzz $as_me 2.6.7, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3426,7 +3428,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='harfbuzz'
- VERSION='2.6.4'
+ VERSION='2.6.7'
 
 
 # Some tools Automake needs.
@@ -5326,8 +5328,8 @@ esac
 
 
 
-macro_version='2.4.6'
-macro_revision='2.4.6'
+macro_version='2.4.6.42-b88ce-dirty'
+macro_revision='2.4.6.42'
 
 
 
@@ -6989,13 +6991,29 @@ esac
 fi
 
 : ${AR=ar}
-: ${AR_FLAGS=cru}
 
 
 
 
 
 
+# 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.
+
 
 
 
@@ -7444,7 +7462,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++,
+    # Also find C++ and __fastcall symbols from MSVC++ or ICC,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK '"\
 "     {last_section=section; section=\$ 3};"\
@@ -8713,8 +8731,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 cru libconftest.a conftest.o" >&5
-      $AR cru libconftest.a conftest.o 2>&5
+      echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5
+      $AR $AR_FLAGS libconftest.a conftest.o 2>&5
       echo "$RANLIB libconftest.a" >&5
       $RANLIB libconftest.a 2>&5
       cat > conftest.c << _LT_EOF
@@ -9376,8 +9394,8 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a '.a' archive for static linking (except MSVC,
-# which needs '.lib').
+# All known linkers require a '.a' archive for static linking (except MSVC and
+# ICC, which need '.lib').
 libext=a
 
 with_gnu_ld=$lt_cv_prog_gnu_ld
@@ -10304,15 +10322,15 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 
   case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
+    # Microsoft Visual C++ or Intel C++ Compiler.
     if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
   interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
     with_gnu_ld=yes
     ;;
   openbsd* | bitrig*)
@@ -10476,6 +10494,7 @@ _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]*)
@@ -10693,7 +10712,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 == "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 == "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'
        fi
        aix_use_runtimelinking=no
 
 
     cygwin* | mingw* | pw32* | cegcc*)
       # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
+      # Microsoft Visual C++ or Intel C++ Compiler.
       # hardcode_libdir_flag_spec is actually meaningless, as there is
       # no search path for DLLs.
       case $cc_basename in
-      cl*)
-       # Native MSVC
+      cl* | icl*)
+       # Native MSVC or ICC
        hardcode_libdir_flag_spec=' '
        allow_undefined_flag=unsupported
        always_export_symbols=yes
@@ -11006,7 +11025,7 @@ fi
           fi'
        ;;
       *)
-       # Assume MSVC wrapper
+       # Assume MSVC and ICC wrapper
        hardcode_libdir_flag_spec=' '
        allow_undefined_flag=unsupported
        # Tell ltmain to make .lib files, not .a files.
@@ -11330,6 +11349,7 @@ $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*)
@@ -12037,8 +12057,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     dynamic_linker='Win32 ld.exe'
     ;;
 
-  *,cl*)
-    # Native MSVC
+  *,cl* | *,icl*)
+    # Native MSVC or ICC
     libname_spec='$name'
     soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
     library_names_spec='$libname.dll.lib'
@@ -12094,7 +12114,7 @@ cygwin* | mingw* | pw32* | cegcc*)
     ;;
 
   *)
-    # Assume MSVC wrapper
+    # Assume MSVC and ICC wrapper
     library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
@@ -12358,9 +12378,6 @@ fi
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Add ABI-specific directories to the system library path.
-  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
   # Ideally, we could use ldconfig to report *all* directores which are
   # searched for libraries, however this is still not possible.  Aside from not
   # being certain /sbin/ldconfig is available, command
@@ -12369,7 +12386,7 @@ fi
   # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
   fi
 
   # We used to test for /lib/ld.so.1 and disable shared libraries on
@@ -13276,30 +13293,41 @@ 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 -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; }
+if test -z "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP"; then
+  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
+$as_echo "yes" >&6; }
+  else
+    case $host_os in
+    darwin*)
+      # FIXME - insert some real tests, host_os isn't really good enough
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       { $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
+      ;;
+    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
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+      fi
+      ;;
+    *)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-    ;;
-  esac
+      ;;
+    esac
+  fi
 fi
 
 
@@ -15390,8 +15418,8 @@ fi
 
       cygwin* | mingw* | pw32* | cegcc*)
        case $GXX,$cc_basename in
-       ,cl* | no,cl*)
-         # Native MSVC
+       ,cl* | no,cl* | ,icl* | no,icl*)
+         # Native MSVC or ICC
          # hardcode_libdir_flag_spec is actually meaningless, as there is
          # no search path for DLLs.
          hardcode_libdir_flag_spec_CXX=' '
@@ -15521,6 +15549,7 @@ 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*)
@@ -16956,7 +16985,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 == "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 == "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'
     fi
     ;;
   pw32*)
@@ -16964,7 +16993,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
-    cl*)
+    cl* | icl*)
       exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
       ;;
     *)
@@ -17326,8 +17355,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     dynamic_linker='Win32 ld.exe'
     ;;
 
-  *,cl*)
-    # Native MSVC
+  *,cl* | *,icl*)
+    # Native MSVC or ICC
     libname_spec='$name'
     soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
     library_names_spec='$libname.dll.lib'
@@ -17383,7 +17412,7 @@ cygwin* | mingw* | pw32* | cegcc*)
     ;;
 
   *)
-    # Assume MSVC wrapper
+    # Assume MSVC and ICC wrapper
     library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
@@ -17646,9 +17675,6 @@ fi
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Add ABI-specific directories to the system library path.
-  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
   # Ideally, we could use ldconfig to report *all* directores which are
   # searched for libraries, however this is still not possible.  Aside from not
   # being certain /sbin/ldconfig is available, command
@@ -17657,7 +17683,7 @@ fi
   # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
   fi
 
   # We used to test for /lib/ld.so.1 and disable shared libraries on
@@ -17997,7 +18023,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-  ax_cxx_compile_alternatives="11 0x"    ax_cxx_compile_cxx11_required=false
+  ax_cxx_compile_alternatives="11 0x"    ax_cxx_compile_cxx11_required=true
   ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -18268,7 +18294,7 @@ namespace cxx11
 
   }
 
-  // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+  // https://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
   // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
   // because of this.
   namespace test_template_alias_sfinae
@@ -18581,7 +18607,7 @@ namespace cxx11
 
   }
 
-  // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+  // https://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
   // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
   // because of this.
   namespace test_template_alias_sfinae
@@ -18903,7 +18929,7 @@ namespace cxx11
 
   }
 
-  // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+  // https://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
   // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
   // because of this.
   namespace test_template_alias_sfinae
@@ -19316,8 +19342,8 @@ GIT=${GIT-"${am_missing_run}git"}
 
 HB_VERSION_MAJOR=2
 HB_VERSION_MINOR=6
-HB_VERSION_MICRO=4
-HB_VERSION=2.6.4
+HB_VERSION_MICRO=7
+HB_VERSION=2.6.7
 
 
 
@@ -19328,7 +19354,7 @@ HB_VERSION=2.6.4
 
 
 
-HB_LIBTOOL_VERSION_INFO=20600:4:20600
+HB_LIBTOOL_VERSION_INFO=20600:7:20600
 
 
 
@@ -19727,7 +19753,7 @@ fi
 
 
 # Functions and headers
-for ac_func in atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l roundf
+for ac_func in atexit mprotect sysconf getpagesize mmap isatty roundf
 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"
@@ -19739,7 +19765,7 @@ _ACEOF
 fi
 done
 
-for ac_header in unistd.h sys/mman.h xlocale.h stdbool.h
+for ac_header in unistd.h sys/mman.h stdbool.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"
@@ -20810,20 +20836,77 @@ esac
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5
 $as_echo "$found_introspection" >&6; }
 
+
+  EXP_VAR=_GI_EXP_DATADIR
+  FROM_VAR="$datadir"
+
+    prefix_save=$prefix
+  exec_prefix_save=$exec_prefix
+
+    if test "x$prefix" = "xNONE"; then
+    prefix="$ac_default_prefix"
+  fi
+    if test "x$exec_prefix" = "xNONE"; then
+    exec_prefix=$prefix
+  fi
+
+  full_var="$FROM_VAR"
+    while true; do
+    new_full_var="`eval echo $full_var`"
+    if test "x$new_full_var" = "x$full_var"; then break; fi
+    full_var=$new_full_var
+  done
+
+    full_var=$new_full_var
+  _GI_EXP_DATADIR="$full_var"
+
+
+    prefix=$prefix_save
+  exec_prefix=$exec_prefix_save
+
+
+  EXP_VAR=_GI_EXP_LIBDIR
+  FROM_VAR="$libdir"
+
+    prefix_save=$prefix
+  exec_prefix_save=$exec_prefix
+
+    if test "x$prefix" = "xNONE"; then
+    prefix="$ac_default_prefix"
+  fi
+    if test "x$exec_prefix" = "xNONE"; then
+    exec_prefix=$prefix
+  fi
+
+  full_var="$FROM_VAR"
+    while true; do
+    new_full_var="`eval echo $full_var`"
+    if test "x$new_full_var" = "x$full_var"; then break; fi
+    full_var=$new_full_var
+  done
+
+    full_var=$new_full_var
+  _GI_EXP_LIBDIR="$full_var"
+
+
+    prefix=$prefix_save
+  exec_prefix=$exec_prefix_save
+
+
     INTROSPECTION_SCANNER=
     INTROSPECTION_COMPILER=
     INTROSPECTION_GENERATE=
     INTROSPECTION_GIRDIR=
     INTROSPECTION_TYPELIBDIR=
     if test "x$found_introspection" = "xyes"; then
-       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
-       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
-       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
-       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
-       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
+       INTROSPECTION_SCANNER=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
+       INTROSPECTION_COMPILER=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
+       INTROSPECTION_GENERATE=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
+       INTROSPECTION_GIRDIR=`$PKG_CONFIG --define-variable=datadir="${_GI_EXP_DATADIR}" --variable=girdir gobject-introspection-1.0`
+       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --define-variable=libdir="${_GI_EXP_LIBDIR}" --variable=typelibdir gobject-introspection-1.0)"
        INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
        INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
-       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
+       INTROSPECTION_MAKEFILE=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
     fi
 
 
@@ -22621,7 +22704,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.4, which was
+This file was extended by HarfBuzz $as_me 2.6.7, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -22688,7 +22771,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.4
+HarfBuzz config.status 2.6.7
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -22859,6 +22942,7 @@ 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"`'
@@ -23041,7 +23125,6 @@ want_nocaseglob \
 DLLTOOL \
 sharedlib_from_linklib_cmd \
 AR \
-AR_FLAGS \
 archiver_list_spec \
 STRIP \
 RANLIB \
@@ -23894,7 +23977,9 @@ $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.  Try re-running configure with the
+    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
     '--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; }
@@ -23921,7 +24006,6 @@ See \`config.log' for more details" "$LINENO" 5; }
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
 # Generated automatically by $as_me ($PACKAGE) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
 
 # Provide generalized library-building support services.
@@ -24065,8 +24149,11 @@ 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=$lt_AR_FLAGS
+AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"}
 
 # How to feed a file listing to the archiver.
 archiver_list_spec=$lt_archiver_list_spec
index 4125756..3af266b 100644 (file)
@@ -1,6 +1,6 @@
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
-        [2.6.4],
+        [2.6.7],
         [https://github.com/harfbuzz/harfbuzz/issues/new],
         [harfbuzz],
         [http://harfbuzz.org/])
@@ -23,7 +23,7 @@ AC_PROG_CC
 AC_PROG_CC_C99
 AM_PROG_CC_C_O
 AC_PROG_CXX
-AX_CXX_COMPILE_STDCXX(11,, optional)
+AX_CXX_COMPILE_STDCXX(11)
 AC_SYS_LARGEFILE
 PKG_PROG_PKG_CONFIG([0.20])
 AM_MISSING_PROG([RAGEL], [ragel])
@@ -77,8 +77,8 @@ GTK_DOC_CHECK([1.15],[--flavour no-tmpl])
 ])
 
 # Functions and headers
-AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l roundf)
-AC_CHECK_HEADERS(unistd.h sys/mman.h xlocale.h stdbool.h)
+AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty roundf)
+AC_CHECK_HEADERS(unistd.h sys/mman.h stdbool.h)
 
 # Compiler flags
 AC_CANONICAL_HOST
diff --git a/depcomp b/depcomp
index 65cbf70..6b39162 100755 (executable)
--- a/depcomp
+++ b/depcomp
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2020 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 771d955..44a9b66 100644 (file)
Binary files a/docs/HarfBuzz.png and b/docs/HarfBuzz.png differ
index 4e2df25..beb13ad 100644 (file)
@@ -1,277 +1,8 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.1"
-   id="svg2"
-   width="682.66669"
-   height="682.66669"
-   viewBox="0 0 682.66669 682.66669"
-   sodipodi:docname="harfbuzz2.svg"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   inkscape:export-filename="harfbuzz2.png"
-   inkscape:export-xdpi="72"
-   inkscape:export-ydpi="72">
-  <metadata
-     id="metadata8">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs6">
-    <g
-       id="g50">
-      <symbol
-         id="glyph0-0"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path26"
-           d="M 32,0 V -192 H 224 V 0 Z M 48,-16 H 208 V -176 H 48 Z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-1"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path29"
-           d="m 52.5,-64.875 c -0.08594,2.25 -0.9375,6.335938 -2.5625,12.25 -1.625,5.917969 -3.75,12.375 -6.375,19.375 -2.625,7 -4.9375,12.292969 -6.9375,15.875 -2,3.585938 -4.1875,6.3125 -6.5625,8.1875 -2.375,1.875 -6.210938,3.585938 -11.5,5.125 -5.292969,1.542969 -9.542969,2.585938 -12.75,3.125 -3.210938,0.542969 -5.230469,0.8125 -6.0625,0.8125 -0.832031,-0.082031 -1.332031,-0.414062 -1.5,-1 -0.164062,-0.582031 0.085938,-1.332031 0.75,-2.25 0.9179688,-1.414062 3.226562,-3.269531 6.9375,-5.5625 3.707031,-2.289062 8.019531,-5.164062 12.9375,-8.625 4.914062,-3.457031 8.414062,-6.476562 10.5,-9.0625 2.082031,-2.582031 4.4375,-6.457031 7.0625,-11.625 2.625,-5.164062 5,-10.375 7.125,-15.625 2.125,-5.25 3.644531,-8.832031 4.5625,-10.75 0.914062,-1.914062 1.914062,-2.832031 3,-2.75 0.914062,0.167969 1.375,1 1.375,2.5 z M 41.75,-117.75 c 0,-1.83203 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.64844 8,4.1875 3.5,3.54297 5.375,6.3125 5.625,8.3125 0,2.66797 -1.460938,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 -0.5,-0.25 -2.230469,-1.35156 -5.1875,-3.3125 -2.960938,-1.95703 -5.148438,-3.4375 -6.5625,-4.4375 -1.25,-0.83203 -1.875,-1.70703 -1.875,-2.625 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-2"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path32"
-           d="m 19.75,-47.125 c -0.167969,3.167969 -0.5,6.023438 -1,8.5625 -0.5,2.542969 -1.167969,4.710938 -2,6.5 -0.835938,1.792969 -1.898438,3.125 -3.1875,4 -1.292969,0.875 -2.855469,1.1875 -4.6875,0.9375 0.082031,-6.5 0.769531,-15.5625 2.0625,-27.1875 1.289062,-11.625 3.226562,-24.476562 5.8125,-38.5625 1.332031,-4.082031 4.039062,-11.28906 8.125,-21.625 0.414062,-1 0.851562,-1.41406 1.3125,-1.25 0.457031,0.16797 0.6875,0.58594 0.6875,1.25 -0.25,5.08594 -1.292969,14.792969 -3.125,29.125 -1.835938,14.335938 -2.960938,24.167969 -3.375,29.5 -0.417969,5.335938 -0.625,8.25 -0.625,8.75 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-3"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path35"
-           d="m -10.875,-27.25 c 1.667969,-7.164062 3.5625,-12.457031 5.6875,-15.875 2.125,-3.414062 3.855469,-5.289062 5.1875,-5.625 v 5.5 c 0,7 1.875,11.875 5.625,14.625 2.25,1.5 4.5,2 6.75,1.5 2.25,-0.5 3.976562,-1.664062 5.1875,-3.5 1.207031,-1.832031 2.226562,-3.976562 3.0625,-6.4375 0.832031,-2.457031 1.625,-3.6875 2.375,-3.6875 0.914062,0 1.289062,0.875 1.125,2.625 -0.08594,3 -1.023438,7.875 -2.8125,14.625 C 19.519531,-16.75 17.082031,-11.207031 14,-6.875 10.914062,-2.539062 7.164062,-0.25 2.75,0 c -4.5,-0.164062 -8,-2.707031 -10.5,-7.625 -2.25,-4.832031 -3.289062,-11.082031 -3.125,-18.75 z m 6.625,111.5 c 0,-1.835938 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.644531 8,4.1875 3.5,3.539062 5.375,6.3125 5.625,8.3125 0,2.664062 -1.460938,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 C 8.875,94.375 7.144531,93.269531 4.1875,91.3125 1.226562,89.351562 -0.957031,87.875 -2.375,86.875 -3.625,86.039062 -4.25,85.164062 -4.25,84.25 Z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-4"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path38"
-           d=""
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-5"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path41"
-           d="m 118.5,-33 c 15.33203,-3.914062 27.375,-8.289062 36.125,-13.125 7.5,-4.082031 11.25,-7.5 11.25,-10.25 0,-0.832031 -0.5625,-1.894531 -1.6875,-3.1875 -1.125,-1.289062 -1.9375,-1.9375 -2.4375,-1.9375 -0.83594,0 -2.02344,0.148438 -3.5625,0.4375 -1.54297,0.292969 -2.64844,0.4375 -3.3125,0.4375 -2.91797,0 -4.98047,-0.769531 -6.1875,-2.3125 -1.21094,-1.539062 -1.8125,-3.601562 -1.8125,-6.1875 0,-1.5 2.16406,-6.539062 6.5,-15.125 1.66406,-3.414062 3.0625,-5.8125 4.1875,-7.1875 1.125,-1.375 2.76953,-2.0625 4.9375,-2.0625 3.58203,0 6.91406,1.9375 10,5.8125 3.08203,3.875 4.625,8.855469 4.625,14.9375 0,6 -0.8125,11.4375 -2.4375,16.3125 -1.625,4.875 -4.14844,9.605469 -7.5625,14.1875 -3.41797,4.585938 -7.83594,9.042969 -13.25,13.375 -8.08594,6.085938 -17.625,11.230469 -28.625,15.4375 -11,4.210938 -23.83594,7.5 -38.5,9.875 C 72.082031,-1.1875 58.082031,0 44.75,0 37.082031,0 30.082031,-0.375 23.75,-1.125 17.414062,-1.875 12.582031,-3.289062 9.25,-5.375 3.082031,-8.789062 0.25,-14.5 0.75,-22.5 c 0.332031,-4.082031 0.832031,-8.4375 1.5,-13.0625 0.664062,-4.625 1.351562,-8.3125 2.0625,-11.0625 0.707031,-2.75 1.5625,-4.125 2.5625,-4.125 0.832031,0 1.332031,1.75 1.5,5.25 0.164062,3.5 0.6875,6.0625 1.5625,7.6875 0.875,1.625 2.207031,3 4,4.125 1.789062,1.125 4.6875,2.210938 8.6875,3.25 4,1.042969 8.6875,1.855469 14.0625,2.4375 5.375,0.585938 12.519531,0.875 21.4375,0.875 12.414062,0 23.019531,-0.4375 31.8125,-1.3125 C 98.726562,-29.3125 108.25,-30.832031 118.5,-33 Z m -38.75,-86.75 c 0,-1.83203 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.64844 8,4.1875 3.5,3.54297 5.375,6.3125 5.625,8.3125 0,2.66797 -1.46094,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 -0.5,-0.25 -2.230469,-1.35156 -5.1875,-3.3125 -2.960938,-1.95703 -5.148438,-3.4375 -6.5625,-4.4375 -1.25,-0.83203 -1.875,-1.70703 -1.875,-2.625 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-6"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path44"
-           d="m 78,-56.875 c -1.335938,2.25 -2.25,3.875 -2.75,4.875 -1.417969,2.335938 -2.875,4.210938 -4.375,5.625 -1.75,1.75 -4.042969,3.292969 -6.875,4.625 -6.085938,2.917969 -10.460938,5.75 -13.125,8.5 -1.75,1.75 -3.792969,4.960938 -6.125,9.625 -4.25,8.585938 -8.417969,14.292969 -12.5,17.125 -4.085938,2.917969 -11.417969,5 -22,6.25 C 9.414062,-0.0820312 8.414062,0 7.25,0 H 4.375 c -1.5,0 -2.25,-0.164062 -2.25,-0.5 0,-1.914062 2.539062,-4.5 7.625,-7.75 4,-2.414062 7,-4.207031 9,-5.375 6,-3.414062 10.414062,-6.125 13.25,-8.125 4,-2.914062 6.625,-5.75 7.875,-8.5 4.164062,-8.5 7.625,-14.414062 10.375,-17.75 3.082031,-3.664062 6.625,-6.5 10.625,-8.5 C 67.289062,-60.082031 71,-62.207031 72,-62.875 l 10,2.375 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-7"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path47"
-           d="m 13,-17.625 c -1,1.75 -2.0625,3.480469 -3.1875,5.1875 C 8.6875,-10.726562 7.539062,-9.082031 6.375,-7.5 5.207031,-5.914062 4.0625,-4.476562 2.9375,-3.1875 1.8125,-1.894531 0.832031,-0.832031 0,0 c -0.5,-2.582031 -0.832031,-5.125 -1,-7.625 -0.164062,-2.5 0.167969,-5.039062 1,-7.625 1.25,-0.75 2.207031,-1.414062 2.875,-2 1.664062,-1.5 5.375,-6.582031 11.125,-15.25 -0.667969,-0.664062 -2.585938,-1.601562 -5.75,-2.8125 -3.167969,-1.207031 -6.167969,-1.894531 -9,-2.0625 -2.582031,-0.164062 -4.726562,0.3125 -6.4375,1.4375 -1.707031,1.125 -3.25,2.710938 -4.625,4.75 -1.375,2.042969 -2.5625,2.980469 -3.5625,2.8125 -0.332031,-0.164062 -0.375,-0.851562 -0.125,-2.0625 0.25,-1.207031 0.625,-2.394531 1.125,-3.5625 2.085938,-4.832031 4.480469,-8.4375 7.1875,-10.8125 2.710938,-2.375 5.9375,-3.5625 9.6875,-3.5625 2.75,0 6.164062,0.667969 10.25,2 2.582031,0.917969 4.789062,1.375 6.625,1.375 3.832031,0 7.625,-1.375 11.375,-4.125 0.832031,0 1.125,0.542969 0.875,1.625 -0.25,1.085938 -0.605469,2.355469 -1.0625,3.8125 -0.460938,1.460938 -0.773438,2.4375 -0.9375,2.9375 -0.835938,2.585938 -1.5,4.085938 -2,4.5 -0.5,0.417969 -1.960938,1.5 -4.375,3.25 -1.335938,1 -2.480469,2.148438 -3.4375,3.4375 -0.960938,1.292969 -1.9375,2.835938 -2.9375,4.625 -1,1.792969 -2.292969,4.230469 -3.875,7.3125 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-    </g>
-    <g
-       id="g184">
-      <symbol
-         id="glyph0-0-3"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path163"
-           d=""
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-1-6"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path166"
-           d="m 79.625,-103.25 c -3.585938,22 -6.8125,38.417969 -9.6875,49.25 -2.875,10.835938 -5.480469,19.105469 -7.8125,24.8125 -2.335938,5.710938 -4.898438,10.0625 -7.6875,13.0625 -2.792969,3 -7.917969,5.855469 -15.375,8.5625 -7.460938,2.710938 -13.6875,4.605469 -18.6875,5.6875 -5,1.085938 -8.125,1.667969 -9.375,1.75 C 9.75,-0.207031 8.957031,-0.4375 8.625,-0.8125 8.289062,-1.1875 8.582031,-2.082031 9.5,-3.5 c 1.582031,-2.25 4.894531,-5.332031 9.9375,-9.25 5.039062,-3.914062 11,-8.789062 17.875,-14.625 6.875,-5.832031 12.019531,-10.976562 15.4375,-15.4375 3.414062,-4.457031 6.4375,-10.539062 9.0625,-18.25 C 64.4375,-68.769531 67,-76.832031 69.5,-85.25 c 2.5,-8.414062 4.3125,-14.125 5.4375,-17.125 1.125,-3 2.269531,-4.45703 3.4375,-4.375 1.332031,0.25 1.75,1.41797 1.25,3.5 z m 8.875,-68.625 c 0.664062,2.41797 0.644531,4.91797 -0.0625,7.5 -0.710938,2.58594 -2.023438,5.29297 -3.9375,8.125 -1.167969,1.91797 -2.398438,3.64844 -3.6875,5.1875 -1.292969,1.54297 -2.648438,3.02344 -4.0625,4.4375 -0.417969,0.5 -1.085938,1.125 -2,1.875 -0.917969,0.75 -1.875,1.46094 -2.875,2.125 -1,0.66797 -1.960938,1.14844 -2.875,1.4375 -0.917969,0.29297 -1.585938,0.1875 -2,-0.3125 -3,-2.41406 -5.960938,-4.875 -8.875,-7.375 -2.917969,-2.5 -6.125,-4.83203 -9.625,-7 -0.585938,-0.41406 -0.855469,-0.8125 -0.8125,-1.1875 0.03906,-0.375 0.269531,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.582031,-0.83203 1.164062,-1.22656 1.75,-1.1875 0.582031,0.043 1.207031,0.27344 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.60547 4.875,4.0625 1.5,1.46094 2.8125,3.04297 3.9375,4.75 1.125,1.71094 1.9375,3.60547 2.4375,5.6875 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-2-7"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path169"
-           d="m 29.625,-70.625 c -0.667969,8.335938 -2.542969,15.417969 -5.625,21.25 -3.085938,5.835938 -6.585938,8.75 -10.5,8.75 0,-3.164062 1.019531,-13 3.0625,-29.5 2.039062,-16.5 3.582031,-28.3125 4.625,-35.4375 1.039062,-7.125 2.226562,-14.6875 3.5625,-22.6875 1.332031,-8 2.625,-14.45703 3.875,-19.375 1.414062,-4.08203 2.9375,-8.20703 4.5625,-12.375 1.625,-4.16406 3.3125,-8.28906 5.0625,-12.375 1.164062,-1.83203 1.914062,-1.53906 2.25,0.875 -2.085938,13.83594 -4,28.1875 -5.75,43.0625 -1.75,14.875 -2.9375,25.52344 -3.5625,31.9375 -0.625,6.417969 -0.9375,10.167969 -0.9375,11.25 -0.417969,6.835938 -0.625,11.710938 -0.625,14.625 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-3-5"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path172"
-           d="m -16.125,-40.625 c 1.25,-5.332031 2.625,-10 4.125,-14 1.5,-4 2.960938,-7.3125 4.375,-9.9375 1.417969,-2.625 2.792969,-4.644531 4.125,-6.0625 1.335938,-1.414062 2.5,-2.25 3.5,-2.5 v 8.25 c 0,10.5 2.789062,17.835938 8.375,22 3.414062,2.25 6.8125,3 10.1875,2.25 3.375,-0.75 5.957031,-2.5 7.75,-5.25 1.789062,-2.75 3.3125,-5.976562 4.5625,-9.6875 1.25,-3.707031 2.457031,-5.5625 3.625,-5.5625 1.332031,0 1.875,1.335938 1.625,4 -0.08594,4.5 -1.480469,11.8125 -4.1875,21.9375 -2.710938,10.125 -6.375,18.4375 -11,24.9375 -4.625,6.5 -10.230469,9.917969 -16.8125,10.25 -6.75,-0.25 -12,-4.039062 -15.75,-11.375 -3.414062,-7.25 -4.914062,-16.625 -4.5,-28.125 z M 28.5,82.125 c 0.664062,2.414062 0.644531,4.914062 -0.0625,7.5 -0.710938,2.582031 -2.023438,5.289062 -3.9375,8.125 -1.167969,1.914062 -2.398438,3.64453 -3.6875,5.1875 -1.292969,1.53906 -2.648438,3.01953 -4.0625,4.4375 -0.417969,0.5 -1.085938,1.125 -2,1.875 -0.917969,0.75 -1.875,1.45703 -2.875,2.125 -1,0.66406 -1.960938,1.14453 -2.875,1.4375 C 8.082031,113.10156 7.414062,113 7,112.5 c -3,-2.41797 -5.960938,-4.875 -8.875,-7.375 -2.914062,-2.5 -6.125,-4.83594 -9.625,-7 -0.582031,-0.417969 -0.851562,-0.8125 -0.8125,-1.1875 0.04297,-0.375 0.273438,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.582031,-0.835938 1.164062,-1.230469 1.75,-1.1875 0.582031,0.03906 1.207031,0.269531 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.601562 4.875,4.0625 1.5,1.457031 2.8125,3.039062 3.9375,4.75 1.125,1.707031 1.9375,3.601562 2.4375,5.6875 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-4-3"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path175"
-           d=""
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-5-5"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path178"
-           d="M 72.125,0.125 C 58.039062,0.0390625 47.164062,-0.582031 39.5,-1.75 26.164062,-3.832031 16.664062,-7.832031 11,-13.75 5.914062,-18.332031 3.375,-24.582031 3.375,-32.5 c 0,-3.082031 0.289062,-7.5 0.875,-13.25 0.582031,-5.75 1.375,-11.5 2.375,-17.25 0.414062,-2.414062 0.789062,-4.582031 1.125,-6.5 0.25,-1.332031 0.582031,-2.414062 1,-3.25 0.414062,-0.832031 0.875,-1.3125 1.375,-1.4375 0.5,-0.125 0.976562,0.210938 1.4375,1 0.457031,0.792969 0.894531,2.148438 1.3125,4.0625 0.332031,2.085938 0.789062,4.25 1.375,6.5 1.332031,5.417969 4.957031,9.460938 10.875,12.125 15,6.417969 37.914062,9.75 68.75,10 12.75,-0.164062 24.58203,-0.625 35.5,-1.375 11.16406,-0.832031 23.75,-2.789062 37.75,-5.875 14,-3.082031 25.14453,-6.457031 33.4375,-10.125 8.28906,-3.664062 15.35156,-7.625 21.1875,-11.875 4.58203,-3.332031 6.875,-6.539062 6.875,-9.625 0,-1.25 -1.1875,-2.726562 -3.5625,-4.4375 -2.375,-1.707031 -3.9375,-2.5625 -4.6875,-2.5625 -1.41797,0.667969 -3.08594,1.1875 -5,1.5625 -1.91797,0.375 -3.66797,0.480469 -5.25,0.3125 -4.41797,-0.5 -7.71094,-1.875 -9.875,-4.125 -2.16797,-2.25 -3.25,-5.289062 -3.25,-9.125 0,-2.41406 3.20703,-10 9.625,-22.75 2.58203,-5.16406 4.85156,-8.76953 6.8125,-10.8125 1.95703,-2.03906 4.64453,-3.0625 8.0625,-3.0625 5.41406,0 10.4375,2.91797 15.0625,8.75 4.625,5.83594 6.9375,13.29297 6.9375,22.375 0,9 -1.21094,16.792969 -3.625,23.375 -3,9 -7.08594,17.335938 -12.25,25 -6.5,9.25 -13.625,16.5625 -21.375,21.9375 -7.75,5.375 -15.58594,9.648438 -23.5,12.8125 -7.08594,3.5 -16.23047,6.773438 -27.4375,9.8125 -11.21094,3.042969 -24.8125,5.523438 -40.8125,7.4375 -15.835938,1.917969 -29.960938,2.9140625 -42.375,3 z m 82.375,-172 c 0.66406,2.41797 0.64453,4.91797 -0.0625,7.5 -0.71094,2.58594 -2.02344,5.29297 -3.9375,8.125 -1.16797,1.91797 -2.39844,3.64844 -3.6875,5.1875 -1.29297,1.54297 -2.64844,3.02344 -4.0625,4.4375 -0.41797,0.5 -1.08594,1.125 -2,1.875 -0.91797,0.75 -1.875,1.46094 -2.875,2.125 -1,0.66797 -1.96094,1.14844 -2.875,1.4375 -0.91797,0.29297 -1.58594,0.1875 -2,-0.3125 -3,-2.41406 -5.96094,-4.875 -8.875,-7.375 -2.91797,-2.5 -6.125,-4.83203 -9.625,-7 -0.58594,-0.41406 -0.85547,-0.8125 -0.8125,-1.1875 0.0391,-0.375 0.26953,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.58203,-0.83203 1.16406,-1.22656 1.75,-1.1875 0.58203,0.043 1.20703,0.27344 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.60547 4.875,4.0625 1.5,1.46094 2.8125,3.04297 3.9375,4.75 1.125,1.71094 1.9375,3.60547 2.4375,5.6875 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-6-6"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path181"
-           d="m 115,-102.5 c -1.83594,3.25 -3.75,6.523438 -5.75,9.8125 -2,3.292969 -4.23047,6.398438 -6.6875,9.3125 -2.46094,2.917969 -5.167969,5.5625 -8.125,7.9375 -2.960938,2.375 -6.3125,4.273438 -10.0625,5.6875 -3.085938,1.25 -5.710938,2.648438 -7.875,4.1875 -2.167969,1.542969 -3.960938,3.1875 -5.375,4.9375 -2.167969,2.335938 -4.042969,5.5625 -5.625,9.6875 -1.585938,4.125 -3.230469,8.480469 -4.9375,13.0625 -1.710938,4.585938 -3.585938,9.0625 -5.625,13.4375 -2.042969,4.375 -4.605469,7.980469 -7.6875,10.8125 C 43,-9.125 36.707031,-6.082031 28.375,-4.5 L 5.5,-0.625 C 4.832031,-0.539062 4.019531,-0.476562 3.0625,-0.4375 2.101562,-0.394531 1.414062,-0.414062 1,-0.5 -0.914062,-1.082031 -1.5,-2.351562 -0.75,-4.3125 0,-6.269531 1.957031,-8.25 5.125,-10.25 c 6.414062,-4.25 11.539062,-7.6875 15.375,-10.3125 3.832031,-2.625 6.957031,-4.769531 9.375,-6.4375 2.414062,-1.664062 4.351562,-3.039062 5.8125,-4.125 1.457031,-1.082031 3.019531,-2.289062 4.6875,-3.625 6.75,-5.082031 11.414062,-10.414062 14,-16 1.5,-2.914062 2.875,-5.75 4.125,-8.5 1.25,-2.75 2.5625,-5.457031 3.9375,-8.125 1.375,-2.664062 2.851562,-5.3125 4.4375,-7.9375 1.582031,-2.625 3.414062,-5.269531 5.5,-7.9375 2.164062,-2.664062 5.082031,-5.269531 8.75,-7.8125 3.664062,-2.539062 8.082031,-5.0625 13.25,-7.5625 0.582031,-0.25 1.539062,-0.8125 2.875,-1.6875 1.332031,-0.875 2.95703,-2.26953 4.875,-4.1875 1.91406,-1.91406 4.10156,-4.51953 6.5625,-7.8125 2.45703,-3.28906 5.0625,-7.47656 7.8125,-12.5625 -1,-1 -3.875,-2.375 -8.625,-4.125 -4.75,-1.83203 -9.25,-2.875 -13.5,-3.125 -3.917969,-0.25 -7.148438,0.46094 -9.6875,2.125 -2.542969,1.66797 -4.855469,4.04297 -6.9375,7.125 -2.085938,3.08594 -3.875,4.5 -5.375,4.25 -0.5,-0.25 -0.585938,-1.28906 -0.25,-3.125 0.414062,-1.83203 1,-3.625 1.75,-5.375 3.164062,-7.25 6.75,-12.625 10.75,-16.125 4.082031,-3.58203 8.957031,-5.375 14.625,-5.375 4.08203,0 9.20703,1 15.375,3 3.83203,1.33594 7.125,2 9.875,2 5.75,0 11.45703,-2.03906 17.125,-6.125 1.25,0 1.6875,0.8125 1.3125,2.4375 -0.375,1.625 -0.9375,3.52344 -1.6875,5.6875 -0.66797,2.16797 -1.125,3.625 -1.375,4.375 -1.25,3.91797 -2.25,6.21094 -3,6.875 -0.75,0.58594 -2.91797,2.16797 -6.5,4.75 -2,1.5 -3.73047,3.23047 -5.1875,5.1875 -1.46094,1.96094 -2.9375,4.27344 -4.4375,6.9375 -1.5,2.66797 -3.41797,6.33594 -5.75,11 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-    </g>
-  </defs>
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="2560"
-     inkscape:window-height="1471"
-     id="namedview4"
-     showgrid="false"
-     inkscape:zoom="0.59454973"
-     inkscape:cx="-165.7731"
-     inkscape:cy="361.75575"
-     inkscape:window-x="0"
-     inkscape:window-y="55"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg2" />
-  <path
-     id="path871"
-     d="m 205.59223,196.11402 c -5.97657,36.66667 -11.35417,64.02995 -16.14583,82.08333 -4.79167,18.0599 -9.13412,31.84245 -13.02084,41.35417 -3.89323,9.51823 -8.16406,16.77083 -12.8125,21.77083 -4.65495,5 -13.19661,9.75912 -25.625,14.27083 -12.43489,4.51823 -22.8125,7.67579 -31.14583,9.47917 -8.333331,1.8099 -13.541664,2.77995 -15.624997,2.91667 -2.083334,-0.13672 -3.404949,-0.52084 -3.958334,-1.14584 -0.559896,-0.625 -0.07161,-2.11588 1.458334,-4.47916 2.636718,-3.75 8.157551,-8.88672 16.562497,-15.41667 8.39844,-6.52344 18.33333,-14.64844 29.79167,-24.375 11.45833,-9.72005 20.03255,-18.29427 25.72916,-25.72916 5.69011,-7.42839 10.72917,-17.56511 15.10417,-30.41667 4.375,-12.84505 8.64583,-26.28255 12.8125,-40.3125 4.16667,-14.02343 7.1875,-23.54166 9.0625,-28.54166 1.875,-5 3.78255,-7.42839 5.72916,-7.29167 2.22006,0.41667 2.91667,2.36328 2.08334,5.83333 z M 220.38389,81.739028 c 1.10677,4.02995 1.07422,8.196616 -0.10416,12.5 -1.1849,4.309899 -3.3724,8.821612 -6.5625,13.541662 -1.94662,3.19662 -3.9974,6.08074 -6.14584,8.64584 -2.15494,2.57161 -4.41406,5.03906 -6.77083,7.39583 -0.69661,0.83333 -1.8099,1.875 -3.33333,3.125 -1.52995,1.25 -3.125,2.4349 -4.79167,3.54167 -1.66666,1.11328 -3.26823,1.91406 -4.79166,2.39583 -1.52995,0.48828 -2.64323,0.3125 -3.33334,-0.52083 -5,-4.02344 -9.93489,-8.125 -14.79166,-12.29167 -4.86329,-4.16667 -10.20834,-8.05338 -16.04167,-11.66667 -0.97656,-0.6901 -1.42578,-1.35416 -1.35417,-1.97916 0.0651,-0.625 0.44922,-1.5625 1.14584,-2.8125 l 33.33333,-50.833334 c 0.97005,-1.386717 1.9401,-2.044267 2.91667,-1.979167 0.97005,0.07167 2.01171,0.455734 3.125,1.145834 2.91666,1.666666 5.83333,3.541666 8.74999,5.624999 2.91667,2.083334 5.625,4.34245 8.125,6.770833 2.5,2.4349 4.6875,5.071617 6.5625,7.916667 1.875,2.851566 3.22917,6.009116 4.0625,9.479166 z m 0,0"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     inkscape:connector-curvature="0" />
-  <path
-     inkscape:connector-curvature="0"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     d="m 256.21722,250.48902 c -1.11328,13.89323 -4.23828,25.69662 -9.375,35.41667 -5.14323,9.72656 -10.97656,14.58333 -17.5,14.58333 0,-5.27344 1.69922,-21.66667 5.10417,-49.16667 3.39843,-27.49999 5.97005,-47.18749 7.70833,-59.06249 1.73177,-11.875 3.71094,-24.47917 5.9375,-37.8125 2.22005,-13.33333 4.375,-24.09505 6.45833,-32.29167 2.35677,-6.80338 4.89583,-13.67838 7.60417,-20.625 2.70833,-6.940096 5.52083,-13.815095 8.4375,-20.624995 1.9401,-3.053383 3.1901,-2.5651 3.75,1.458333 -3.47657,23.059902 -6.66667,46.979162 -9.58334,71.770832 -2.91666,24.79166 -4.89583,42.53906 -5.9375,53.22916 -1.04166,10.69662 -1.5625,16.94662 -1.5625,18.75 -0.69661,11.39323 -1.04166,19.51823 -1.04166,24.375 z m 0,0"
-     id="path875" />
-  <path
-     id="path945"
-     d="m 229.34222,300.48902 c 2.08333,-8.88672 4.375,-16.66667 6.875,-23.33333 2.5,-6.66667 4.9349,-12.1875 7.29167,-16.5625 2.36328,-4.375 4.65495,-7.74089 6.875,-10.10417 2.22656,-2.35677 4.16666,-3.75 5.83333,-4.16667 v 13.75 c 0,17.5 4.64844,29.72657 13.95833,36.66667 5.69011,3.75 11.35417,5 16.97917,3.75 5.625,-1.25 9.92838,-4.16667 12.91666,-8.75 2.98177,-4.58333 5.52084,-9.96094 7.60417,-16.14583 2.08333,-6.17839 4.09505,-9.27084 6.04167,-9.27084 2.22005,0 3.125,2.22657 2.70833,6.66667 -0.14323,7.5 -2.46745,19.6875 -6.97917,36.5625 -4.51823,16.875 -10.625,30.72916 -18.33333,41.5625 -7.70833,10.83333 -17.05078,16.52995 -28.02083,17.08333 -11.25,-0.41667 -20,-6.73177 -26.25,-18.95833 -5.6901,-12.08334 -8.1901,-27.70833 -7.5,-46.875 z"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     inkscape:connector-curvature="0" />
-  <path
-     id="path943"
-     d="m 286.78334,583.03989 c 1.10677,4.02343 1.07422,8.1901 -0.10416,12.5 -1.1849,4.30338 -3.3724,8.8151 -6.5625,13.54167 -1.94662,3.1901 -3.9974,6.07421 -6.14584,8.64583 -2.15495,2.5651 -4.41406,5.03255 -6.77083,7.39583 -0.69662,0.83334 -1.8099,1.875 -3.33333,3.125 -1.52995,1.25 -3.125,2.42839 -4.79167,3.54167 -1.66667,1.10677 -3.26823,1.90755 -4.79167,2.39583 -1.52994,0.48177 -2.64323,0.3125 -3.33333,-0.52083 -5,-4.02995 -9.9349,-8.125 -14.79167,-12.29167 -4.85677,-4.16666 -10.20833,-8.0599 -16.04166,-11.66666 -0.97005,-0.69662 -1.41927,-1.35417 -1.35417,-1.97917 0.0716,-0.625 0.45573,-1.5625 1.14583,-2.8125 l 33.33334,-50.83333 c 0.97005,-1.39323 1.9401,-2.05078 2.91666,-1.97917 0.97006,0.0652 2.01172,0.44922 3.125,1.14584 2.91667,1.66666 5.83334,3.54166 8.75,5.625 2.91667,2.08333 5.625,4.33593 8.125,6.77083 2.5,2.42838 4.6875,5.0651 6.5625,7.91667 1.875,2.84505 3.22917,6.00259 4.0625,9.47916 z"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     inkscape:connector-curvature="0" />
-  <path
-     id="path879"
-     d="M 303.71722,505.07234"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     inkscape:connector-curvature="0" />
-  <path
-     inkscape:connector-curvature="0"
-     id="path925"
-     d="m 168.42167,500.82557 c -23.47656,-0.14323 -41.60156,-1.17838 -54.375,-3.125 -22.226562,-3.47005 -38.059894,-10.13671 -47.499997,-20 -8.476563,-7.63671 -12.708333,-18.05338 -12.708333,-31.24999 0,-5.13672 0.48177,-12.5 1.458333,-22.08334 0.970052,-9.58333 2.291667,-19.16666 3.958333,-28.75 0.690104,-4.02343 1.315104,-7.63671 1.875,-10.83333 0.416667,-2.22005 0.970052,-4.02344 1.666667,-5.41667 0.690103,-1.38671 1.458333,-2.1875 2.291666,-2.39583 0.833334,-0.20833 1.627604,0.35156 2.395834,1.66667 0.761718,1.32161 1.490885,3.58073 2.187499,6.77083 0.553385,3.47656 1.315104,7.08333 2.291667,10.83333 2.220052,9.02995 8.261718,15.76823 18.124999,20.20834 25.000002,10.69661 63.190102,16.25 114.583332,16.66666 21.25,-0.27343 40.97005,-1.04166 59.16666,-2.29166 18.60677,-1.38672 39.58333,-4.64844 62.91667,-9.79167 23.33333,-5.13672 41.90754,-10.76172 55.72916,-16.875 13.8151,-6.10677 25.58593,-12.70833 35.3125,-19.79167 7.63671,-5.55338 11.45833,-10.89843 11.45833,-16.04166 0,-2.08333 -1.97917,-4.54427 -5.9375,-7.39583 -3.95833,-2.84506 -6.5625,-4.27084 -7.8125,-4.27084 -2.36328,1.11328 -5.14323,1.97917 -8.33333,2.60417 -3.19662,0.625 -6.11328,0.80078 -8.75,0.52083 -7.36328,-0.83333 -12.85157,-3.125 -16.45833,-6.875 -3.61329,-3.75 -5.41667,-8.8151 -5.41667,-15.20833 0,-4.02343 5.34505,-16.66667 16.04167,-37.91667 4.30338,-8.60676 8.08593,-14.61588 11.35416,-18.02083 3.26172,-3.39843 7.74089,-5.10416 13.4375,-5.10416 9.02343,0 17.39583,4.86328 25.10417,14.58333 7.70833,9.72656 11.5625,22.15495 11.5625,37.29166 0,15 -2.01824,27.98828 -6.04167,38.95834 -5,14.99999 -11.8099,28.89322 -20.41667,41.66666 -10.83333,15.41667 -22.70833,27.60417 -35.62499,36.5625 -12.91667,8.95833 -25.97657,16.08073 -39.16667,21.35416 -11.8099,5.83334 -27.05078,11.28907 -45.72916,16.35417 -18.6849,5.07162 -41.35417,9.20573 -68.02083,12.39583 -26.39323,3.19662 -49.9349,4.85677 -70.625,5 z"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
-  <path
-     inkscape:connector-curvature="0"
-     id="path923"
-     d="m 430.22191,133.16177 c 1.10676,4.02995 1.07421,8.19662 -0.10417,12.5 -1.1849,4.3099 -3.3724,8.82162 -6.5625,13.54167 -1.94661,3.19661 -3.9974,6.08073 -6.14583,8.64583 -2.15495,2.57162 -4.41407,5.03907 -6.77083,7.39583 -0.69662,0.83334 -1.8099,1.875 -3.33334,3.125 -1.52995,1.25 -3.125,2.4349 -4.79166,3.54167 -1.66667,1.11328 -3.26824,1.91407 -4.79167,2.39583 -1.52995,0.48829 -2.64323,0.3125 -3.33333,-0.52083 -5,-4.02343 -9.9349,-8.125 -14.79167,-12.29167 -4.86328,-4.16666 -10.20833,-8.05338 -16.04167,-11.66666 -0.97656,-0.6901 -1.42578,-1.35417 -1.35416,-1.97917 0.0652,-0.625 0.44921,-1.5625 1.14583,-2.8125 l 33.33333,-50.83333 c 0.97005,-1.38672 1.9401,-2.04427 2.91667,-1.97917 0.97005,0.0717 2.01172,0.45574 3.125,1.14584 2.91667,1.66666 5.83333,3.54166 8.75,5.625 2.91667,2.08333 5.625,4.34245 8.125,6.77083 2.5,2.4349 4.6875,5.07162 6.5625,7.91667 1.875,2.85156 3.22916,6.00911 4.0625,9.47916 z"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
-  <path
-     inkscape:connector-curvature="0"
-     id="path883"
-     d="M 305.71333,214.15892"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
-  <path
-     id="path887"
-     d="m 599.12998,319.78391 c -3.0599,5.41667 -6.25,10.8724 -9.58333,16.35417 -3.33334,5.48828 -7.05079,10.66406 -11.14584,15.52083 -4.10156,4.86328 -8.61328,9.27084 -13.54166,13.22917 -4.9349,3.95833 -10.52084,7.12239 -16.77084,9.47916 -5.14323,2.08334 -9.51823,4.41407 -13.125,6.97917 -3.61328,2.57162 -6.60156,5.3125 -8.95833,8.22917 -3.61328,3.89323 -6.73828,9.27083 -9.375,16.14583 -2.64323,6.875 -5.38411,14.13411 -8.22916,21.77083 -2.85157,7.64323 -5.97657,15.10417 -9.375,22.39583 -3.40495,7.29167 -7.67579,13.30079 -12.8125,18.02084 -7.08334,7.5 -17.57162,12.57161 -31.45834,15.20833 l -38.12499,6.45833 c -1.11329,0.14323 -2.46745,0.2474 -4.0625,0.3125 -1.60157,0.0716 -2.7474,0.0391 -3.4375,-0.10416 -3.19011,-0.97005 -4.16667,-3.08594 -2.91667,-6.35417 1.25,-3.26172 4.51172,-6.5625 9.79167,-9.89583 10.6901,-7.08334 19.23177,-12.8125 25.625,-17.1875 6.38671,-4.375 11.59505,-7.94922 15.62499,-10.72917 4.02344,-2.77343 7.25261,-5.0651 9.6875,-6.875 2.42839,-1.80338 5.03256,-3.8151 7.8125,-6.04166 11.25,-8.47006 19.02344,-17.35677 23.33334,-26.66667 2.5,-4.85677 4.79166,-9.58333 6.875,-14.16667 2.08333,-4.58333 4.27083,-9.09505 6.5625,-13.54166 2.29166,-4.44011 4.7526,-8.85417 7.39583,-13.22917 2.63672,-4.375 5.6901,-8.78255 9.16667,-13.22916 3.60677,-4.44011 8.47005,-8.78256 14.58333,-13.02084 6.10677,-4.23177 13.47005,-8.4375 22.08333,-12.60416 0.97005,-0.41667 2.5651,-1.35417 4.79167,-2.8125 2.22005,-1.45834 4.92838,-3.78255 8.125,-6.97917 3.1901,-3.1901 6.83593,-7.53255 10.9375,-13.02083 4.09505,-5.48177 8.4375,-12.46094 13.02083,-20.9375 -1.66667,-1.66667 -6.45833,-3.95833 -14.375,-6.875 -7.91667,-3.05338 -15.41667,-4.79167 -22.5,-5.20833 -6.52995,-0.41667 -11.91406,0.76823 -16.14583,3.54166 -4.23828,2.77995 -8.09245,6.73829 -11.5625,11.875 -3.47657,5.14323 -6.45833,7.5 -8.95833,7.08333 -0.83334,-0.41666 -0.97657,-2.14843 -0.41667,-5.20833 0.6901,-3.05338 1.66667,-6.04166 2.91667,-8.95833 5.27343,-12.08333 11.24999,-21.04167 17.91666,-26.875 6.80339,-5.97005 14.92839,-8.95833 24.375,-8.95833 6.80338,0 15.34505,1.66666 25.625,5 6.38672,2.22656 11.875,3.33333 16.45833,3.33333 9.58333,0 19.09505,-3.39843 28.54167,-10.20833 2.08333,0 2.8125,1.35416 2.1875,4.0625 -0.625,2.70833 -1.5625,5.8724 -2.8125,9.47916 -1.11329,3.61329 -1.875,6.04167 -2.29167,7.29167 -2.08333,6.52995 -3.75,10.35157 -5,11.45833 -1.25,0.97657 -4.86328,3.61329 -10.83333,7.91667 -3.33334,2.5 -6.21745,5.38411 -8.64584,8.64583 -2.43489,3.26823 -4.89583,7.1224 -7.39583,11.5625 -2.5,4.44662 -5.69661,10.5599 -9.58333,18.33333 z m 0,0"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     inkscape:connector-curvature="0" />
-  <use
-     style="fill:#000000;fill-opacity:1"
-     id="use62"
-     y="291"
-     x="119.25"
-     xlink:href="#glyph0-4"
-     width="100%"
-     height="100%"
-     transform="matrix(1.3333333,0,0,1.3333333,72.589732,-189.32751)" />
-  <use
-     style="fill:#000000;fill-opacity:1"
-     id="use196"
-     y="391"
-     x="168.375"
-     xlink:href="#glyph0-4-3"
-     width="100%"
-     height="100%"
-     transform="matrix(1.3333333,0,0,1.3333333,-861.41828,-631.73483)" />
+<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 682.667 682.667">
+  <!-- Harf -->
+  <path d="M168.422 500.826c-23.477-.144-41.602-1.179-54.375-3.125-22.227-3.47-38.06-10.137-47.5-20-8.477-7.637-12.709-18.054-12.709-31.25 0-5.137.482-12.5 1.459-22.084a406.941 406.941 0 013.958-28.75c.69-4.023 1.315-7.636 1.875-10.833.417-2.22.97-4.024 1.667-5.417.69-1.386 1.458-2.187 2.291-2.396.834-.208 1.628.352 2.396 1.667.762 1.322 1.491 3.58 2.188 6.77a114.35 114.35 0 002.291 10.834c2.22 9.03 8.262 15.768 18.125 20.209 25 10.696 63.19 16.25 114.584 16.666 21.25-.273 40.97-1.041 59.166-2.291 18.607-1.387 39.584-4.649 62.917-9.792 23.333-5.137 41.908-10.762 55.73-16.875 13.814-6.107 25.585-12.708 35.312-19.792 7.636-5.553 11.458-10.898 11.458-16.041 0-2.084-1.98-4.545-5.938-7.396-3.958-2.845-6.562-4.271-7.812-4.271-2.363 1.113-5.143 1.98-8.333 2.604-3.197.625-6.114.8-8.75.52-7.364-.832-12.852-3.124-16.459-6.874-3.613-3.75-5.416-8.815-5.416-15.208 0-4.024 5.345-16.667 16.041-37.917 4.304-8.607 8.086-14.616 11.354-18.02 3.262-3.4 7.741-5.105 13.438-5.105 9.023 0 17.396 4.863 25.104 14.583 7.708 9.727 11.563 22.155 11.563 37.292 0 15-2.019 27.988-6.042 38.958-5 15-11.81 28.893-20.417 41.667-10.833 15.417-22.708 27.604-35.625 36.562-12.916 8.959-25.976 16.081-39.166 21.355-11.81 5.833-27.051 11.289-45.73 16.354-18.684 5.071-41.354 9.205-68.02 12.396-26.394 3.196-49.935 4.856-70.625 5zM430.222 133.162c1.107 4.03 1.074 8.196-.104 12.5-1.185 4.31-3.373 8.821-6.563 13.541-1.946 3.197-3.997 6.081-6.146 8.646a114.073 114.073 0 01-6.77 7.396c-.697.833-1.81 1.875-3.334 3.125a60.28 60.28 0 01-4.791 3.542c-1.667 1.113-3.269 1.914-4.792 2.396-1.53.488-2.643.312-3.333-.521-5-4.024-9.935-8.125-14.792-12.292-4.863-4.167-10.208-8.053-16.042-11.667-.976-.69-1.426-1.354-1.354-1.979.065-.625.45-1.562 1.146-2.812l33.333-50.834c.97-1.386 1.94-2.044 2.917-1.979.97.072 2.012.456 3.125 1.146a102.942 102.942 0 018.75 5.625 70.208 70.208 0 018.125 6.77 47.58 47.58 0 016.562 7.918c1.875 2.851 3.23 6.009 4.063 9.479zM599.13 319.784a589.994 589.994 0 01-9.583 16.354 123.488 123.488 0 01-11.146 15.52 97.741 97.741 0 01-13.542 13.23c-4.935 3.958-10.52 7.122-16.77 9.48-5.144 2.083-9.519 4.413-13.126 6.978-3.613 2.572-6.601 5.313-8.958 8.23-3.613 3.893-6.738 9.27-9.375 16.145a2240.458 2240.458 0 00-8.23 21.771 307.032 307.032 0 01-9.374 22.396c-3.405 7.292-7.676 13.3-12.813 18.02-7.083 7.5-17.571 12.573-31.458 15.21l-38.125 6.458c-1.113.143-2.467.247-4.063.312-1.601.072-2.747.04-3.437-.104-3.19-.97-4.167-3.086-2.917-6.354 1.25-3.262 4.512-6.563 9.792-9.896 10.69-7.083 19.232-12.813 25.625-17.188a6164.29 6164.29 0 0015.625-10.729c4.023-2.773 7.253-5.065 9.687-6.875a271.19 271.19 0 007.813-6.041c11.25-8.47 19.023-17.357 23.333-26.667 2.5-4.857 4.792-9.583 6.875-14.167a305.502 305.502 0 016.563-13.541 226.164 226.164 0 017.396-13.23c2.636-4.375 5.69-8.782 9.166-13.229 3.607-4.44 8.47-8.782 14.584-13.02 6.106-4.232 13.47-8.438 22.083-12.605.97-.416 2.565-1.354 4.792-2.812 2.22-1.459 4.928-3.783 8.125-6.98 3.19-3.19 6.836-7.532 10.937-13.02 4.095-5.482 8.438-12.461 13.021-20.938-1.667-1.666-6.458-3.958-14.375-6.875-7.917-3.053-15.417-4.791-22.5-5.208-6.53-.417-11.914.768-16.146 3.542-4.238 2.78-8.092 6.738-11.562 11.875-3.477 5.143-6.459 7.5-8.959 7.083-.833-.417-.976-2.149-.416-5.208a51.587 51.587 0 012.916-8.959c5.274-12.083 11.25-21.041 17.917-26.875 6.803-5.97 14.928-8.958 24.375-8.958 6.803 0 15.345 1.667 25.625 5 6.387 2.226 11.875 3.333 16.458 3.333 9.584 0 19.095-3.398 28.542-10.208 2.083 0 2.812 1.354 2.187 4.062-.625 2.709-1.562 5.873-2.812 9.48-1.113 3.613-1.875 6.041-2.292 7.291-2.083 6.53-3.75 10.352-5 11.459-1.25.976-4.863 3.613-10.833 7.916a42.505 42.505 0 00-8.646 8.646c-2.435 3.268-4.896 7.122-7.396 11.563-2.5 4.446-5.696 10.56-9.583 18.333zm0 0"/>
+  <!-- B -->
+  <path d="M229.342 300.489c2.084-8.887 4.375-16.667 6.875-23.333 2.5-6.667 4.935-12.188 7.292-16.563 2.363-4.375 4.655-7.74 6.875-10.104 2.226-2.357 4.167-3.75 5.833-4.167v13.75c0 17.5 4.649 29.727 13.959 36.667 5.69 3.75 11.354 5 16.979 3.75s9.928-4.167 12.916-8.75c2.982-4.583 5.521-9.96 7.605-16.146 2.083-6.178 4.095-9.27 6.041-9.27 2.22 0 3.125 2.226 2.709 6.666-.144 7.5-2.468 19.688-6.98 36.563-4.518 16.875-10.625 30.729-18.333 41.562-7.708 10.833-17.05 16.53-28.02 17.083-11.25-.416-20-6.731-26.25-18.958-5.69-12.083-8.19-27.708-7.5-46.875zM286.783 583.04c1.107 4.023 1.075 8.19-.104 12.5-1.185 4.303-3.372 8.815-6.562 13.542-1.947 3.19-3.998 6.074-6.146 8.645a117.59 117.59 0 01-6.771 7.396c-.697.834-1.81 1.875-3.333 3.125a61.927 61.927 0 01-4.792 3.542c-1.667 1.107-3.268 1.907-4.792 2.396-1.53.481-2.643.312-3.333-.521-5-4.03-9.935-8.125-14.792-12.292-4.856-4.166-10.208-8.06-16.041-11.666-.97-.697-1.42-1.355-1.354-1.98.071-.625.455-1.562 1.145-2.812l33.334-50.833c.97-1.394 1.94-2.051 2.916-1.98.97.066 2.012.45 3.125 1.146a102.94 102.94 0 018.75 5.625 69.555 69.555 0 018.125 6.771 47.057 47.057 0 016.563 7.917c1.875 2.845 3.229 6.002 4.062 9.479z"/>
+  <!-- uzz -->
+  <path d="M205.592 196.114c-5.976 36.667-11.354 64.03-16.146 82.083-4.791 18.06-9.134 31.843-13.02 41.355-3.894 9.518-8.164 16.77-12.813 21.77-4.655 5-13.197 9.76-25.625 14.271-12.435 4.518-22.812 7.676-31.146 9.48-8.333 1.81-13.541 2.78-15.625 2.916-2.083-.137-3.405-.52-3.958-1.146-.56-.625-.072-2.116 1.458-4.479 2.637-3.75 8.158-8.887 16.563-15.417 8.398-6.523 18.333-14.648 29.791-24.375 11.459-9.72 20.033-18.294 25.73-25.729 5.69-7.428 10.729-17.565 15.104-30.416 4.375-12.846 8.646-26.283 12.812-40.313 4.167-14.023 7.188-23.542 9.063-28.542 1.875-5 3.782-7.428 5.729-7.291 2.22.416 2.917 2.363 2.083 5.833zm14.792-114.375c1.107 4.03 1.074 8.197-.104 12.5-1.185 4.31-3.373 8.822-6.563 13.542-1.946 3.196-3.997 6.08-6.146 8.646a114.072 114.072 0 01-6.77 7.395c-.697.834-1.81 1.875-3.334 3.125a60.279 60.279 0 01-4.791 3.542c-1.667 1.113-3.269 1.914-4.792 2.396-1.53.488-2.643.312-3.333-.521-5-4.023-9.935-8.125-14.792-12.292-4.863-4.166-10.208-8.053-16.042-11.666-.976-.69-1.426-1.354-1.354-1.98.065-.624.45-1.562 1.146-2.812l33.333-50.833c.97-1.387 1.94-2.045 2.917-1.98.97.072 2.012.456 3.125 1.146a102.945 102.945 0 018.75 5.625 70.208 70.208 0 018.125 6.771 47.58 47.58 0 016.562 7.917c1.875 2.851 3.23 6.009 4.063 9.479zm0 0M256.217 250.489c-1.113 13.893-4.238 25.697-9.375 35.417-5.143 9.726-10.976 14.583-17.5 14.583 0-5.273 1.7-21.667 5.104-49.167 3.399-27.5 5.97-47.187 7.709-59.062 1.731-11.875 3.71-24.48 5.937-37.813 2.22-13.333 4.375-24.095 6.459-32.291a574.618 574.618 0 017.604-20.625 683.688 683.688 0 018.437-20.625c1.94-3.054 3.19-2.565 3.75 1.458-3.476 23.06-6.666 46.98-9.583 71.77-2.917 24.793-4.896 42.54-5.938 53.23-1.041 10.697-1.562 16.947-1.562 18.75-.697 11.393-1.042 19.518-1.042 24.375zm0 0"/>
 </svg>
index f4bf2fd..987feb5 100644 (file)
@@ -83,6 +83,7 @@ content_files=        \
        usermanual-opentype-features.xml \
        usermanual-clusters.xml \
        usermanual-utilities.xml \
+       usermanual-integration.xml \
        version.xml
 
 # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
@@ -106,7 +107,7 @@ include $(top_srcdir)/gtk-doc.make
 
 # Other files to distribute
 # e.g. EXTRA_DIST += version.xml.in
-EXTRA_DIST += version.xml.in
+EXTRA_DIST += version.xml.in meson.build
 
 # Files not to distribute
 # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
index c4c2902..2df1092 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -288,6 +288,8 @@ 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@
@@ -426,6 +428,7 @@ content_files = \
        usermanual-opentype-features.xml \
        usermanual-clusters.xml \
        usermanual-utilities.xml \
+       usermanual-integration.xml \
        version.xml
 
 
@@ -467,7 +470,7 @@ SETUP_FILES = \
 
 # Other files to distribute
 # e.g. EXTRA_DIST += version.xml.in
-EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in
+EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in meson.build
 DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
        html-build.stamp pdf-build.stamp \
        sgml.stamp html.stamp pdf.stamp
index 433c206..96965f4 100644 (file)
@@ -39,6 +39,7 @@
       <xi:include href="usermanual-opentype-features.xml"/>
       <xi:include href="usermanual-clusters.xml"/>
       <xi:include href="usermanual-utilities.xml"/>
+      <xi:include href="usermanual-integration.xml"/>
   </part>
 
   <part>
index c625b92..bcad37a 100644 (file)
@@ -325,6 +325,7 @@ hb_font_get_scale
 hb_font_get_user_data
 hb_font_get_variation_glyph
 hb_font_get_variation_glyph_func_t
+hb_font_get_var_coords_design
 hb_font_get_var_coords_normalized
 hb_font_glyph_from_string
 hb_font_glyph_to_string
@@ -365,6 +366,8 @@ hb_ft_font_create
 hb_ft_font_create_referenced
 hb_ft_font_changed
 hb_ft_font_get_face
+hb_ft_font_lock_face
+hb_ft_font_unlock_face
 hb_ft_font_set_load_flags
 hb_ft_font_get_load_flags
 hb_ft_font_set_funcs
@@ -549,6 +552,8 @@ 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
diff --git a/docs/harfbuzz.types b/docs/harfbuzz.types
deleted file mode 100644 (file)
index ef81792..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-hb_gobject_aat_layout_feature_selector_get_type
-hb_gobject_aat_layout_feature_type_get_type
-hb_gobject_blob_get_type
-hb_gobject_buffer_cluster_level_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_feature_get_type
-hb_gobject_font_funcs_get_type
-hb_gobject_font_get_type
-hb_gobject_glyph_flags_get_type
-hb_gobject_glyph_info_get_type
-hb_gobject_glyph_position_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_baseline_tag_get_type
-hb_gobject_ot_layout_glyph_class_get_type
-hb_gobject_ot_math_constant_get_type
-hb_gobject_ot_math_glyph_part_flags_get_type
-hb_gobject_ot_math_glyph_part_get_type
-hb_gobject_ot_math_glyph_variant_get_type
-hb_gobject_ot_math_kern_get_type
-hb_gobject_ot_meta_tag_get_type
-hb_gobject_ot_metrics_tag_get_type
-hb_gobject_ot_var_axis_flags_get_type
-hb_gobject_script_get_type
-hb_gobject_segment_properties_get_type
-hb_gobject_set_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_user_data_key_get_type
index 771d955..44a9b66 100644 (file)
Binary files a/docs/html/HarfBuzz.png and b/docs/html/HarfBuzz.png differ
index 4e2df25..beb13ad 100644 (file)
@@ -1,277 +1,8 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.1"
-   id="svg2"
-   width="682.66669"
-   height="682.66669"
-   viewBox="0 0 682.66669 682.66669"
-   sodipodi:docname="harfbuzz2.svg"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   inkscape:export-filename="harfbuzz2.png"
-   inkscape:export-xdpi="72"
-   inkscape:export-ydpi="72">
-  <metadata
-     id="metadata8">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs6">
-    <g
-       id="g50">
-      <symbol
-         id="glyph0-0"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path26"
-           d="M 32,0 V -192 H 224 V 0 Z M 48,-16 H 208 V -176 H 48 Z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-1"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path29"
-           d="m 52.5,-64.875 c -0.08594,2.25 -0.9375,6.335938 -2.5625,12.25 -1.625,5.917969 -3.75,12.375 -6.375,19.375 -2.625,7 -4.9375,12.292969 -6.9375,15.875 -2,3.585938 -4.1875,6.3125 -6.5625,8.1875 -2.375,1.875 -6.210938,3.585938 -11.5,5.125 -5.292969,1.542969 -9.542969,2.585938 -12.75,3.125 -3.210938,0.542969 -5.230469,0.8125 -6.0625,0.8125 -0.832031,-0.082031 -1.332031,-0.414062 -1.5,-1 -0.164062,-0.582031 0.085938,-1.332031 0.75,-2.25 0.9179688,-1.414062 3.226562,-3.269531 6.9375,-5.5625 3.707031,-2.289062 8.019531,-5.164062 12.9375,-8.625 4.914062,-3.457031 8.414062,-6.476562 10.5,-9.0625 2.082031,-2.582031 4.4375,-6.457031 7.0625,-11.625 2.625,-5.164062 5,-10.375 7.125,-15.625 2.125,-5.25 3.644531,-8.832031 4.5625,-10.75 0.914062,-1.914062 1.914062,-2.832031 3,-2.75 0.914062,0.167969 1.375,1 1.375,2.5 z M 41.75,-117.75 c 0,-1.83203 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.64844 8,4.1875 3.5,3.54297 5.375,6.3125 5.625,8.3125 0,2.66797 -1.460938,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 -0.5,-0.25 -2.230469,-1.35156 -5.1875,-3.3125 -2.960938,-1.95703 -5.148438,-3.4375 -6.5625,-4.4375 -1.25,-0.83203 -1.875,-1.70703 -1.875,-2.625 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-2"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path32"
-           d="m 19.75,-47.125 c -0.167969,3.167969 -0.5,6.023438 -1,8.5625 -0.5,2.542969 -1.167969,4.710938 -2,6.5 -0.835938,1.792969 -1.898438,3.125 -3.1875,4 -1.292969,0.875 -2.855469,1.1875 -4.6875,0.9375 0.082031,-6.5 0.769531,-15.5625 2.0625,-27.1875 1.289062,-11.625 3.226562,-24.476562 5.8125,-38.5625 1.332031,-4.082031 4.039062,-11.28906 8.125,-21.625 0.414062,-1 0.851562,-1.41406 1.3125,-1.25 0.457031,0.16797 0.6875,0.58594 0.6875,1.25 -0.25,5.08594 -1.292969,14.792969 -3.125,29.125 -1.835938,14.335938 -2.960938,24.167969 -3.375,29.5 -0.417969,5.335938 -0.625,8.25 -0.625,8.75 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-3"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path35"
-           d="m -10.875,-27.25 c 1.667969,-7.164062 3.5625,-12.457031 5.6875,-15.875 2.125,-3.414062 3.855469,-5.289062 5.1875,-5.625 v 5.5 c 0,7 1.875,11.875 5.625,14.625 2.25,1.5 4.5,2 6.75,1.5 2.25,-0.5 3.976562,-1.664062 5.1875,-3.5 1.207031,-1.832031 2.226562,-3.976562 3.0625,-6.4375 0.832031,-2.457031 1.625,-3.6875 2.375,-3.6875 0.914062,0 1.289062,0.875 1.125,2.625 -0.08594,3 -1.023438,7.875 -2.8125,14.625 C 19.519531,-16.75 17.082031,-11.207031 14,-6.875 10.914062,-2.539062 7.164062,-0.25 2.75,0 c -4.5,-0.164062 -8,-2.707031 -10.5,-7.625 -2.25,-4.832031 -3.289062,-11.082031 -3.125,-18.75 z m 6.625,111.5 c 0,-1.835938 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.644531 8,4.1875 3.5,3.539062 5.375,6.3125 5.625,8.3125 0,2.664062 -1.460938,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 C 8.875,94.375 7.144531,93.269531 4.1875,91.3125 1.226562,89.351562 -0.957031,87.875 -2.375,86.875 -3.625,86.039062 -4.25,85.164062 -4.25,84.25 Z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-4"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path38"
-           d=""
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-5"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path41"
-           d="m 118.5,-33 c 15.33203,-3.914062 27.375,-8.289062 36.125,-13.125 7.5,-4.082031 11.25,-7.5 11.25,-10.25 0,-0.832031 -0.5625,-1.894531 -1.6875,-3.1875 -1.125,-1.289062 -1.9375,-1.9375 -2.4375,-1.9375 -0.83594,0 -2.02344,0.148438 -3.5625,0.4375 -1.54297,0.292969 -2.64844,0.4375 -3.3125,0.4375 -2.91797,0 -4.98047,-0.769531 -6.1875,-2.3125 -1.21094,-1.539062 -1.8125,-3.601562 -1.8125,-6.1875 0,-1.5 2.16406,-6.539062 6.5,-15.125 1.66406,-3.414062 3.0625,-5.8125 4.1875,-7.1875 1.125,-1.375 2.76953,-2.0625 4.9375,-2.0625 3.58203,0 6.91406,1.9375 10,5.8125 3.08203,3.875 4.625,8.855469 4.625,14.9375 0,6 -0.8125,11.4375 -2.4375,16.3125 -1.625,4.875 -4.14844,9.605469 -7.5625,14.1875 -3.41797,4.585938 -7.83594,9.042969 -13.25,13.375 -8.08594,6.085938 -17.625,11.230469 -28.625,15.4375 -11,4.210938 -23.83594,7.5 -38.5,9.875 C 72.082031,-1.1875 58.082031,0 44.75,0 37.082031,0 30.082031,-0.375 23.75,-1.125 17.414062,-1.875 12.582031,-3.289062 9.25,-5.375 3.082031,-8.789062 0.25,-14.5 0.75,-22.5 c 0.332031,-4.082031 0.832031,-8.4375 1.5,-13.0625 0.664062,-4.625 1.351562,-8.3125 2.0625,-11.0625 0.707031,-2.75 1.5625,-4.125 2.5625,-4.125 0.832031,0 1.332031,1.75 1.5,5.25 0.164062,3.5 0.6875,6.0625 1.5625,7.6875 0.875,1.625 2.207031,3 4,4.125 1.789062,1.125 4.6875,2.210938 8.6875,3.25 4,1.042969 8.6875,1.855469 14.0625,2.4375 5.375,0.585938 12.519531,0.875 21.4375,0.875 12.414062,0 23.019531,-0.4375 31.8125,-1.3125 C 98.726562,-29.3125 108.25,-30.832031 118.5,-33 Z m -38.75,-86.75 c 0,-1.83203 1.5625,-5.8125 4.6875,-11.9375 3.125,-6.125 5.144531,-9.1875 6.0625,-9.1875 1.832031,-0.75 4.5,0.64844 8,4.1875 3.5,3.54297 5.375,6.3125 5.625,8.3125 0,2.66797 -1.46094,6.5 -4.375,11.5 -2.917969,5 -5.042969,7.5 -6.375,7.5 -0.5,-0.25 -2.230469,-1.35156 -5.1875,-3.3125 -2.960938,-1.95703 -5.148438,-3.4375 -6.5625,-4.4375 -1.25,-0.83203 -1.875,-1.70703 -1.875,-2.625 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-6"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path44"
-           d="m 78,-56.875 c -1.335938,2.25 -2.25,3.875 -2.75,4.875 -1.417969,2.335938 -2.875,4.210938 -4.375,5.625 -1.75,1.75 -4.042969,3.292969 -6.875,4.625 -6.085938,2.917969 -10.460938,5.75 -13.125,8.5 -1.75,1.75 -3.792969,4.960938 -6.125,9.625 -4.25,8.585938 -8.417969,14.292969 -12.5,17.125 -4.085938,2.917969 -11.417969,5 -22,6.25 C 9.414062,-0.0820312 8.414062,0 7.25,0 H 4.375 c -1.5,0 -2.25,-0.164062 -2.25,-0.5 0,-1.914062 2.539062,-4.5 7.625,-7.75 4,-2.414062 7,-4.207031 9,-5.375 6,-3.414062 10.414062,-6.125 13.25,-8.125 4,-2.914062 6.625,-5.75 7.875,-8.5 4.164062,-8.5 7.625,-14.414062 10.375,-17.75 3.082031,-3.664062 6.625,-6.5 10.625,-8.5 C 67.289062,-60.082031 71,-62.207031 72,-62.875 l 10,2.375 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-7"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path47"
-           d="m 13,-17.625 c -1,1.75 -2.0625,3.480469 -3.1875,5.1875 C 8.6875,-10.726562 7.539062,-9.082031 6.375,-7.5 5.207031,-5.914062 4.0625,-4.476562 2.9375,-3.1875 1.8125,-1.894531 0.832031,-0.832031 0,0 c -0.5,-2.582031 -0.832031,-5.125 -1,-7.625 -0.164062,-2.5 0.167969,-5.039062 1,-7.625 1.25,-0.75 2.207031,-1.414062 2.875,-2 1.664062,-1.5 5.375,-6.582031 11.125,-15.25 -0.667969,-0.664062 -2.585938,-1.601562 -5.75,-2.8125 -3.167969,-1.207031 -6.167969,-1.894531 -9,-2.0625 -2.582031,-0.164062 -4.726562,0.3125 -6.4375,1.4375 -1.707031,1.125 -3.25,2.710938 -4.625,4.75 -1.375,2.042969 -2.5625,2.980469 -3.5625,2.8125 -0.332031,-0.164062 -0.375,-0.851562 -0.125,-2.0625 0.25,-1.207031 0.625,-2.394531 1.125,-3.5625 2.085938,-4.832031 4.480469,-8.4375 7.1875,-10.8125 2.710938,-2.375 5.9375,-3.5625 9.6875,-3.5625 2.75,0 6.164062,0.667969 10.25,2 2.582031,0.917969 4.789062,1.375 6.625,1.375 3.832031,0 7.625,-1.375 11.375,-4.125 0.832031,0 1.125,0.542969 0.875,1.625 -0.25,1.085938 -0.605469,2.355469 -1.0625,3.8125 -0.460938,1.460938 -0.773438,2.4375 -0.9375,2.9375 -0.835938,2.585938 -1.5,4.085938 -2,4.5 -0.5,0.417969 -1.960938,1.5 -4.375,3.25 -1.335938,1 -2.480469,2.148438 -3.4375,3.4375 -0.960938,1.292969 -1.9375,2.835938 -2.9375,4.625 -1,1.792969 -2.292969,4.230469 -3.875,7.3125 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-    </g>
-    <g
-       id="g184">
-      <symbol
-         id="glyph0-0-3"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path163"
-           d=""
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-1-6"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path166"
-           d="m 79.625,-103.25 c -3.585938,22 -6.8125,38.417969 -9.6875,49.25 -2.875,10.835938 -5.480469,19.105469 -7.8125,24.8125 -2.335938,5.710938 -4.898438,10.0625 -7.6875,13.0625 -2.792969,3 -7.917969,5.855469 -15.375,8.5625 -7.460938,2.710938 -13.6875,4.605469 -18.6875,5.6875 -5,1.085938 -8.125,1.667969 -9.375,1.75 C 9.75,-0.207031 8.957031,-0.4375 8.625,-0.8125 8.289062,-1.1875 8.582031,-2.082031 9.5,-3.5 c 1.582031,-2.25 4.894531,-5.332031 9.9375,-9.25 5.039062,-3.914062 11,-8.789062 17.875,-14.625 6.875,-5.832031 12.019531,-10.976562 15.4375,-15.4375 3.414062,-4.457031 6.4375,-10.539062 9.0625,-18.25 C 64.4375,-68.769531 67,-76.832031 69.5,-85.25 c 2.5,-8.414062 4.3125,-14.125 5.4375,-17.125 1.125,-3 2.269531,-4.45703 3.4375,-4.375 1.332031,0.25 1.75,1.41797 1.25,3.5 z m 8.875,-68.625 c 0.664062,2.41797 0.644531,4.91797 -0.0625,7.5 -0.710938,2.58594 -2.023438,5.29297 -3.9375,8.125 -1.167969,1.91797 -2.398438,3.64844 -3.6875,5.1875 -1.292969,1.54297 -2.648438,3.02344 -4.0625,4.4375 -0.417969,0.5 -1.085938,1.125 -2,1.875 -0.917969,0.75 -1.875,1.46094 -2.875,2.125 -1,0.66797 -1.960938,1.14844 -2.875,1.4375 -0.917969,0.29297 -1.585938,0.1875 -2,-0.3125 -3,-2.41406 -5.960938,-4.875 -8.875,-7.375 -2.917969,-2.5 -6.125,-4.83203 -9.625,-7 -0.585938,-0.41406 -0.855469,-0.8125 -0.8125,-1.1875 0.03906,-0.375 0.269531,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.582031,-0.83203 1.164062,-1.22656 1.75,-1.1875 0.582031,0.043 1.207031,0.27344 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.60547 4.875,4.0625 1.5,1.46094 2.8125,3.04297 3.9375,4.75 1.125,1.71094 1.9375,3.60547 2.4375,5.6875 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-2-7"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path169"
-           d="m 29.625,-70.625 c -0.667969,8.335938 -2.542969,15.417969 -5.625,21.25 -3.085938,5.835938 -6.585938,8.75 -10.5,8.75 0,-3.164062 1.019531,-13 3.0625,-29.5 2.039062,-16.5 3.582031,-28.3125 4.625,-35.4375 1.039062,-7.125 2.226562,-14.6875 3.5625,-22.6875 1.332031,-8 2.625,-14.45703 3.875,-19.375 1.414062,-4.08203 2.9375,-8.20703 4.5625,-12.375 1.625,-4.16406 3.3125,-8.28906 5.0625,-12.375 1.164062,-1.83203 1.914062,-1.53906 2.25,0.875 -2.085938,13.83594 -4,28.1875 -5.75,43.0625 -1.75,14.875 -2.9375,25.52344 -3.5625,31.9375 -0.625,6.417969 -0.9375,10.167969 -0.9375,11.25 -0.417969,6.835938 -0.625,11.710938 -0.625,14.625 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-3-5"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path172"
-           d="m -16.125,-40.625 c 1.25,-5.332031 2.625,-10 4.125,-14 1.5,-4 2.960938,-7.3125 4.375,-9.9375 1.417969,-2.625 2.792969,-4.644531 4.125,-6.0625 1.335938,-1.414062 2.5,-2.25 3.5,-2.5 v 8.25 c 0,10.5 2.789062,17.835938 8.375,22 3.414062,2.25 6.8125,3 10.1875,2.25 3.375,-0.75 5.957031,-2.5 7.75,-5.25 1.789062,-2.75 3.3125,-5.976562 4.5625,-9.6875 1.25,-3.707031 2.457031,-5.5625 3.625,-5.5625 1.332031,0 1.875,1.335938 1.625,4 -0.08594,4.5 -1.480469,11.8125 -4.1875,21.9375 -2.710938,10.125 -6.375,18.4375 -11,24.9375 -4.625,6.5 -10.230469,9.917969 -16.8125,10.25 -6.75,-0.25 -12,-4.039062 -15.75,-11.375 -3.414062,-7.25 -4.914062,-16.625 -4.5,-28.125 z M 28.5,82.125 c 0.664062,2.414062 0.644531,4.914062 -0.0625,7.5 -0.710938,2.582031 -2.023438,5.289062 -3.9375,8.125 -1.167969,1.914062 -2.398438,3.64453 -3.6875,5.1875 -1.292969,1.53906 -2.648438,3.01953 -4.0625,4.4375 -0.417969,0.5 -1.085938,1.125 -2,1.875 -0.917969,0.75 -1.875,1.45703 -2.875,2.125 -1,0.66406 -1.960938,1.14453 -2.875,1.4375 C 8.082031,113.10156 7.414062,113 7,112.5 c -3,-2.41797 -5.960938,-4.875 -8.875,-7.375 -2.914062,-2.5 -6.125,-4.83594 -9.625,-7 -0.582031,-0.417969 -0.851562,-0.8125 -0.8125,-1.1875 0.04297,-0.375 0.273438,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.582031,-0.835938 1.164062,-1.230469 1.75,-1.1875 0.582031,0.03906 1.207031,0.269531 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.601562 4.875,4.0625 1.5,1.457031 2.8125,3.039062 3.9375,4.75 1.125,1.707031 1.9375,3.601562 2.4375,5.6875 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-4-3"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path175"
-           d=""
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-5-5"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path178"
-           d="M 72.125,0.125 C 58.039062,0.0390625 47.164062,-0.582031 39.5,-1.75 26.164062,-3.832031 16.664062,-7.832031 11,-13.75 5.914062,-18.332031 3.375,-24.582031 3.375,-32.5 c 0,-3.082031 0.289062,-7.5 0.875,-13.25 0.582031,-5.75 1.375,-11.5 2.375,-17.25 0.414062,-2.414062 0.789062,-4.582031 1.125,-6.5 0.25,-1.332031 0.582031,-2.414062 1,-3.25 0.414062,-0.832031 0.875,-1.3125 1.375,-1.4375 0.5,-0.125 0.976562,0.210938 1.4375,1 0.457031,0.792969 0.894531,2.148438 1.3125,4.0625 0.332031,2.085938 0.789062,4.25 1.375,6.5 1.332031,5.417969 4.957031,9.460938 10.875,12.125 15,6.417969 37.914062,9.75 68.75,10 12.75,-0.164062 24.58203,-0.625 35.5,-1.375 11.16406,-0.832031 23.75,-2.789062 37.75,-5.875 14,-3.082031 25.14453,-6.457031 33.4375,-10.125 8.28906,-3.664062 15.35156,-7.625 21.1875,-11.875 4.58203,-3.332031 6.875,-6.539062 6.875,-9.625 0,-1.25 -1.1875,-2.726562 -3.5625,-4.4375 -2.375,-1.707031 -3.9375,-2.5625 -4.6875,-2.5625 -1.41797,0.667969 -3.08594,1.1875 -5,1.5625 -1.91797,0.375 -3.66797,0.480469 -5.25,0.3125 -4.41797,-0.5 -7.71094,-1.875 -9.875,-4.125 -2.16797,-2.25 -3.25,-5.289062 -3.25,-9.125 0,-2.41406 3.20703,-10 9.625,-22.75 2.58203,-5.16406 4.85156,-8.76953 6.8125,-10.8125 1.95703,-2.03906 4.64453,-3.0625 8.0625,-3.0625 5.41406,0 10.4375,2.91797 15.0625,8.75 4.625,5.83594 6.9375,13.29297 6.9375,22.375 0,9 -1.21094,16.792969 -3.625,23.375 -3,9 -7.08594,17.335938 -12.25,25 -6.5,9.25 -13.625,16.5625 -21.375,21.9375 -7.75,5.375 -15.58594,9.648438 -23.5,12.8125 -7.08594,3.5 -16.23047,6.773438 -27.4375,9.8125 -11.21094,3.042969 -24.8125,5.523438 -40.8125,7.4375 -15.835938,1.917969 -29.960938,2.9140625 -42.375,3 z m 82.375,-172 c 0.66406,2.41797 0.64453,4.91797 -0.0625,7.5 -0.71094,2.58594 -2.02344,5.29297 -3.9375,8.125 -1.16797,1.91797 -2.39844,3.64844 -3.6875,5.1875 -1.29297,1.54297 -2.64844,3.02344 -4.0625,4.4375 -0.41797,0.5 -1.08594,1.125 -2,1.875 -0.91797,0.75 -1.875,1.46094 -2.875,2.125 -1,0.66797 -1.96094,1.14844 -2.875,1.4375 -0.91797,0.29297 -1.58594,0.1875 -2,-0.3125 -3,-2.41406 -5.96094,-4.875 -8.875,-7.375 -2.91797,-2.5 -6.125,-4.83203 -9.625,-7 -0.58594,-0.41406 -0.85547,-0.8125 -0.8125,-1.1875 0.0391,-0.375 0.26953,-0.9375 0.6875,-1.6875 l 20,-30.5 c 0.58203,-0.83203 1.16406,-1.22656 1.75,-1.1875 0.58203,0.043 1.20703,0.27344 1.875,0.6875 1.75,1 3.5,2.125 5.25,3.375 1.75,1.25 3.375,2.60547 4.875,4.0625 1.5,1.46094 2.8125,3.04297 3.9375,4.75 1.125,1.71094 1.9375,3.60547 2.4375,5.6875 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-      <symbol
-         id="glyph0-6-6"
-         overflow="visible"
-         style="overflow:visible">
-        <path
-           id="path181"
-           d="m 115,-102.5 c -1.83594,3.25 -3.75,6.523438 -5.75,9.8125 -2,3.292969 -4.23047,6.398438 -6.6875,9.3125 -2.46094,2.917969 -5.167969,5.5625 -8.125,7.9375 -2.960938,2.375 -6.3125,4.273438 -10.0625,5.6875 -3.085938,1.25 -5.710938,2.648438 -7.875,4.1875 -2.167969,1.542969 -3.960938,3.1875 -5.375,4.9375 -2.167969,2.335938 -4.042969,5.5625 -5.625,9.6875 -1.585938,4.125 -3.230469,8.480469 -4.9375,13.0625 -1.710938,4.585938 -3.585938,9.0625 -5.625,13.4375 -2.042969,4.375 -4.605469,7.980469 -7.6875,10.8125 C 43,-9.125 36.707031,-6.082031 28.375,-4.5 L 5.5,-0.625 C 4.832031,-0.539062 4.019531,-0.476562 3.0625,-0.4375 2.101562,-0.394531 1.414062,-0.414062 1,-0.5 -0.914062,-1.082031 -1.5,-2.351562 -0.75,-4.3125 0,-6.269531 1.957031,-8.25 5.125,-10.25 c 6.414062,-4.25 11.539062,-7.6875 15.375,-10.3125 3.832031,-2.625 6.957031,-4.769531 9.375,-6.4375 2.414062,-1.664062 4.351562,-3.039062 5.8125,-4.125 1.457031,-1.082031 3.019531,-2.289062 4.6875,-3.625 6.75,-5.082031 11.414062,-10.414062 14,-16 1.5,-2.914062 2.875,-5.75 4.125,-8.5 1.25,-2.75 2.5625,-5.457031 3.9375,-8.125 1.375,-2.664062 2.851562,-5.3125 4.4375,-7.9375 1.582031,-2.625 3.414062,-5.269531 5.5,-7.9375 2.164062,-2.664062 5.082031,-5.269531 8.75,-7.8125 3.664062,-2.539062 8.082031,-5.0625 13.25,-7.5625 0.582031,-0.25 1.539062,-0.8125 2.875,-1.6875 1.332031,-0.875 2.95703,-2.26953 4.875,-4.1875 1.91406,-1.91406 4.10156,-4.51953 6.5625,-7.8125 2.45703,-3.28906 5.0625,-7.47656 7.8125,-12.5625 -1,-1 -3.875,-2.375 -8.625,-4.125 -4.75,-1.83203 -9.25,-2.875 -13.5,-3.125 -3.917969,-0.25 -7.148438,0.46094 -9.6875,2.125 -2.542969,1.66797 -4.855469,4.04297 -6.9375,7.125 -2.085938,3.08594 -3.875,4.5 -5.375,4.25 -0.5,-0.25 -0.585938,-1.28906 -0.25,-3.125 0.414062,-1.83203 1,-3.625 1.75,-5.375 3.164062,-7.25 6.75,-12.625 10.75,-16.125 4.082031,-3.58203 8.957031,-5.375 14.625,-5.375 4.08203,0 9.20703,1 15.375,3 3.83203,1.33594 7.125,2 9.875,2 5.75,0 11.45703,-2.03906 17.125,-6.125 1.25,0 1.6875,0.8125 1.3125,2.4375 -0.375,1.625 -0.9375,3.52344 -1.6875,5.6875 -0.66797,2.16797 -1.125,3.625 -1.375,4.375 -1.25,3.91797 -2.25,6.21094 -3,6.875 -0.75,0.58594 -2.91797,2.16797 -6.5,4.75 -2,1.5 -3.73047,3.23047 -5.1875,5.1875 -1.46094,1.96094 -2.9375,4.27344 -4.4375,6.9375 -1.5,2.66797 -3.41797,6.33594 -5.75,11 z m 0,0"
-           style="stroke:none"
-           inkscape:connector-curvature="0" />
-      </symbol>
-    </g>
-  </defs>
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="2560"
-     inkscape:window-height="1471"
-     id="namedview4"
-     showgrid="false"
-     inkscape:zoom="0.59454973"
-     inkscape:cx="-165.7731"
-     inkscape:cy="361.75575"
-     inkscape:window-x="0"
-     inkscape:window-y="55"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg2" />
-  <path
-     id="path871"
-     d="m 205.59223,196.11402 c -5.97657,36.66667 -11.35417,64.02995 -16.14583,82.08333 -4.79167,18.0599 -9.13412,31.84245 -13.02084,41.35417 -3.89323,9.51823 -8.16406,16.77083 -12.8125,21.77083 -4.65495,5 -13.19661,9.75912 -25.625,14.27083 -12.43489,4.51823 -22.8125,7.67579 -31.14583,9.47917 -8.333331,1.8099 -13.541664,2.77995 -15.624997,2.91667 -2.083334,-0.13672 -3.404949,-0.52084 -3.958334,-1.14584 -0.559896,-0.625 -0.07161,-2.11588 1.458334,-4.47916 2.636718,-3.75 8.157551,-8.88672 16.562497,-15.41667 8.39844,-6.52344 18.33333,-14.64844 29.79167,-24.375 11.45833,-9.72005 20.03255,-18.29427 25.72916,-25.72916 5.69011,-7.42839 10.72917,-17.56511 15.10417,-30.41667 4.375,-12.84505 8.64583,-26.28255 12.8125,-40.3125 4.16667,-14.02343 7.1875,-23.54166 9.0625,-28.54166 1.875,-5 3.78255,-7.42839 5.72916,-7.29167 2.22006,0.41667 2.91667,2.36328 2.08334,5.83333 z M 220.38389,81.739028 c 1.10677,4.02995 1.07422,8.196616 -0.10416,12.5 -1.1849,4.309899 -3.3724,8.821612 -6.5625,13.541662 -1.94662,3.19662 -3.9974,6.08074 -6.14584,8.64584 -2.15494,2.57161 -4.41406,5.03906 -6.77083,7.39583 -0.69661,0.83333 -1.8099,1.875 -3.33333,3.125 -1.52995,1.25 -3.125,2.4349 -4.79167,3.54167 -1.66666,1.11328 -3.26823,1.91406 -4.79166,2.39583 -1.52995,0.48828 -2.64323,0.3125 -3.33334,-0.52083 -5,-4.02344 -9.93489,-8.125 -14.79166,-12.29167 -4.86329,-4.16667 -10.20834,-8.05338 -16.04167,-11.66667 -0.97656,-0.6901 -1.42578,-1.35416 -1.35417,-1.97916 0.0651,-0.625 0.44922,-1.5625 1.14584,-2.8125 l 33.33333,-50.833334 c 0.97005,-1.386717 1.9401,-2.044267 2.91667,-1.979167 0.97005,0.07167 2.01171,0.455734 3.125,1.145834 2.91666,1.666666 5.83333,3.541666 8.74999,5.624999 2.91667,2.083334 5.625,4.34245 8.125,6.770833 2.5,2.4349 4.6875,5.071617 6.5625,7.916667 1.875,2.851566 3.22917,6.009116 4.0625,9.479166 z m 0,0"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     inkscape:connector-curvature="0" />
-  <path
-     inkscape:connector-curvature="0"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     d="m 256.21722,250.48902 c -1.11328,13.89323 -4.23828,25.69662 -9.375,35.41667 -5.14323,9.72656 -10.97656,14.58333 -17.5,14.58333 0,-5.27344 1.69922,-21.66667 5.10417,-49.16667 3.39843,-27.49999 5.97005,-47.18749 7.70833,-59.06249 1.73177,-11.875 3.71094,-24.47917 5.9375,-37.8125 2.22005,-13.33333 4.375,-24.09505 6.45833,-32.29167 2.35677,-6.80338 4.89583,-13.67838 7.60417,-20.625 2.70833,-6.940096 5.52083,-13.815095 8.4375,-20.624995 1.9401,-3.053383 3.1901,-2.5651 3.75,1.458333 -3.47657,23.059902 -6.66667,46.979162 -9.58334,71.770832 -2.91666,24.79166 -4.89583,42.53906 -5.9375,53.22916 -1.04166,10.69662 -1.5625,16.94662 -1.5625,18.75 -0.69661,11.39323 -1.04166,19.51823 -1.04166,24.375 z m 0,0"
-     id="path875" />
-  <path
-     id="path945"
-     d="m 229.34222,300.48902 c 2.08333,-8.88672 4.375,-16.66667 6.875,-23.33333 2.5,-6.66667 4.9349,-12.1875 7.29167,-16.5625 2.36328,-4.375 4.65495,-7.74089 6.875,-10.10417 2.22656,-2.35677 4.16666,-3.75 5.83333,-4.16667 v 13.75 c 0,17.5 4.64844,29.72657 13.95833,36.66667 5.69011,3.75 11.35417,5 16.97917,3.75 5.625,-1.25 9.92838,-4.16667 12.91666,-8.75 2.98177,-4.58333 5.52084,-9.96094 7.60417,-16.14583 2.08333,-6.17839 4.09505,-9.27084 6.04167,-9.27084 2.22005,0 3.125,2.22657 2.70833,6.66667 -0.14323,7.5 -2.46745,19.6875 -6.97917,36.5625 -4.51823,16.875 -10.625,30.72916 -18.33333,41.5625 -7.70833,10.83333 -17.05078,16.52995 -28.02083,17.08333 -11.25,-0.41667 -20,-6.73177 -26.25,-18.95833 -5.6901,-12.08334 -8.1901,-27.70833 -7.5,-46.875 z"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     inkscape:connector-curvature="0" />
-  <path
-     id="path943"
-     d="m 286.78334,583.03989 c 1.10677,4.02343 1.07422,8.1901 -0.10416,12.5 -1.1849,4.30338 -3.3724,8.8151 -6.5625,13.54167 -1.94662,3.1901 -3.9974,6.07421 -6.14584,8.64583 -2.15495,2.5651 -4.41406,5.03255 -6.77083,7.39583 -0.69662,0.83334 -1.8099,1.875 -3.33333,3.125 -1.52995,1.25 -3.125,2.42839 -4.79167,3.54167 -1.66667,1.10677 -3.26823,1.90755 -4.79167,2.39583 -1.52994,0.48177 -2.64323,0.3125 -3.33333,-0.52083 -5,-4.02995 -9.9349,-8.125 -14.79167,-12.29167 -4.85677,-4.16666 -10.20833,-8.0599 -16.04166,-11.66666 -0.97005,-0.69662 -1.41927,-1.35417 -1.35417,-1.97917 0.0716,-0.625 0.45573,-1.5625 1.14583,-2.8125 l 33.33334,-50.83333 c 0.97005,-1.39323 1.9401,-2.05078 2.91666,-1.97917 0.97006,0.0652 2.01172,0.44922 3.125,1.14584 2.91667,1.66666 5.83334,3.54166 8.75,5.625 2.91667,2.08333 5.625,4.33593 8.125,6.77083 2.5,2.42838 4.6875,5.0651 6.5625,7.91667 1.875,2.84505 3.22917,6.00259 4.0625,9.47916 z"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     inkscape:connector-curvature="0" />
-  <path
-     id="path879"
-     d="M 303.71722,505.07234"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     inkscape:connector-curvature="0" />
-  <path
-     inkscape:connector-curvature="0"
-     id="path925"
-     d="m 168.42167,500.82557 c -23.47656,-0.14323 -41.60156,-1.17838 -54.375,-3.125 -22.226562,-3.47005 -38.059894,-10.13671 -47.499997,-20 -8.476563,-7.63671 -12.708333,-18.05338 -12.708333,-31.24999 0,-5.13672 0.48177,-12.5 1.458333,-22.08334 0.970052,-9.58333 2.291667,-19.16666 3.958333,-28.75 0.690104,-4.02343 1.315104,-7.63671 1.875,-10.83333 0.416667,-2.22005 0.970052,-4.02344 1.666667,-5.41667 0.690103,-1.38671 1.458333,-2.1875 2.291666,-2.39583 0.833334,-0.20833 1.627604,0.35156 2.395834,1.66667 0.761718,1.32161 1.490885,3.58073 2.187499,6.77083 0.553385,3.47656 1.315104,7.08333 2.291667,10.83333 2.220052,9.02995 8.261718,15.76823 18.124999,20.20834 25.000002,10.69661 63.190102,16.25 114.583332,16.66666 21.25,-0.27343 40.97005,-1.04166 59.16666,-2.29166 18.60677,-1.38672 39.58333,-4.64844 62.91667,-9.79167 23.33333,-5.13672 41.90754,-10.76172 55.72916,-16.875 13.8151,-6.10677 25.58593,-12.70833 35.3125,-19.79167 7.63671,-5.55338 11.45833,-10.89843 11.45833,-16.04166 0,-2.08333 -1.97917,-4.54427 -5.9375,-7.39583 -3.95833,-2.84506 -6.5625,-4.27084 -7.8125,-4.27084 -2.36328,1.11328 -5.14323,1.97917 -8.33333,2.60417 -3.19662,0.625 -6.11328,0.80078 -8.75,0.52083 -7.36328,-0.83333 -12.85157,-3.125 -16.45833,-6.875 -3.61329,-3.75 -5.41667,-8.8151 -5.41667,-15.20833 0,-4.02343 5.34505,-16.66667 16.04167,-37.91667 4.30338,-8.60676 8.08593,-14.61588 11.35416,-18.02083 3.26172,-3.39843 7.74089,-5.10416 13.4375,-5.10416 9.02343,0 17.39583,4.86328 25.10417,14.58333 7.70833,9.72656 11.5625,22.15495 11.5625,37.29166 0,15 -2.01824,27.98828 -6.04167,38.95834 -5,14.99999 -11.8099,28.89322 -20.41667,41.66666 -10.83333,15.41667 -22.70833,27.60417 -35.62499,36.5625 -12.91667,8.95833 -25.97657,16.08073 -39.16667,21.35416 -11.8099,5.83334 -27.05078,11.28907 -45.72916,16.35417 -18.6849,5.07162 -41.35417,9.20573 -68.02083,12.39583 -26.39323,3.19662 -49.9349,4.85677 -70.625,5 z"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
-  <path
-     inkscape:connector-curvature="0"
-     id="path923"
-     d="m 430.22191,133.16177 c 1.10676,4.02995 1.07421,8.19662 -0.10417,12.5 -1.1849,4.3099 -3.3724,8.82162 -6.5625,13.54167 -1.94661,3.19661 -3.9974,6.08073 -6.14583,8.64583 -2.15495,2.57162 -4.41407,5.03907 -6.77083,7.39583 -0.69662,0.83334 -1.8099,1.875 -3.33334,3.125 -1.52995,1.25 -3.125,2.4349 -4.79166,3.54167 -1.66667,1.11328 -3.26824,1.91407 -4.79167,2.39583 -1.52995,0.48829 -2.64323,0.3125 -3.33333,-0.52083 -5,-4.02343 -9.9349,-8.125 -14.79167,-12.29167 -4.86328,-4.16666 -10.20833,-8.05338 -16.04167,-11.66666 -0.97656,-0.6901 -1.42578,-1.35417 -1.35416,-1.97917 0.0652,-0.625 0.44921,-1.5625 1.14583,-2.8125 l 33.33333,-50.83333 c 0.97005,-1.38672 1.9401,-2.04427 2.91667,-1.97917 0.97005,0.0717 2.01172,0.45574 3.125,1.14584 2.91667,1.66666 5.83333,3.54166 8.75,5.625 2.91667,2.08333 5.625,4.34245 8.125,6.77083 2.5,2.4349 4.6875,5.07162 6.5625,7.91667 1.875,2.85156 3.22916,6.00911 4.0625,9.47916 z"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
-  <path
-     inkscape:connector-curvature="0"
-     id="path883"
-     d="M 305.71333,214.15892"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663" />
-  <path
-     id="path887"
-     d="m 599.12998,319.78391 c -3.0599,5.41667 -6.25,10.8724 -9.58333,16.35417 -3.33334,5.48828 -7.05079,10.66406 -11.14584,15.52083 -4.10156,4.86328 -8.61328,9.27084 -13.54166,13.22917 -4.9349,3.95833 -10.52084,7.12239 -16.77084,9.47916 -5.14323,2.08334 -9.51823,4.41407 -13.125,6.97917 -3.61328,2.57162 -6.60156,5.3125 -8.95833,8.22917 -3.61328,3.89323 -6.73828,9.27083 -9.375,16.14583 -2.64323,6.875 -5.38411,14.13411 -8.22916,21.77083 -2.85157,7.64323 -5.97657,15.10417 -9.375,22.39583 -3.40495,7.29167 -7.67579,13.30079 -12.8125,18.02084 -7.08334,7.5 -17.57162,12.57161 -31.45834,15.20833 l -38.12499,6.45833 c -1.11329,0.14323 -2.46745,0.2474 -4.0625,0.3125 -1.60157,0.0716 -2.7474,0.0391 -3.4375,-0.10416 -3.19011,-0.97005 -4.16667,-3.08594 -2.91667,-6.35417 1.25,-3.26172 4.51172,-6.5625 9.79167,-9.89583 10.6901,-7.08334 19.23177,-12.8125 25.625,-17.1875 6.38671,-4.375 11.59505,-7.94922 15.62499,-10.72917 4.02344,-2.77343 7.25261,-5.0651 9.6875,-6.875 2.42839,-1.80338 5.03256,-3.8151 7.8125,-6.04166 11.25,-8.47006 19.02344,-17.35677 23.33334,-26.66667 2.5,-4.85677 4.79166,-9.58333 6.875,-14.16667 2.08333,-4.58333 4.27083,-9.09505 6.5625,-13.54166 2.29166,-4.44011 4.7526,-8.85417 7.39583,-13.22917 2.63672,-4.375 5.6901,-8.78255 9.16667,-13.22916 3.60677,-4.44011 8.47005,-8.78256 14.58333,-13.02084 6.10677,-4.23177 13.47005,-8.4375 22.08333,-12.60416 0.97005,-0.41667 2.5651,-1.35417 4.79167,-2.8125 2.22005,-1.45834 4.92838,-3.78255 8.125,-6.97917 3.1901,-3.1901 6.83593,-7.53255 10.9375,-13.02083 4.09505,-5.48177 8.4375,-12.46094 13.02083,-20.9375 -1.66667,-1.66667 -6.45833,-3.95833 -14.375,-6.875 -7.91667,-3.05338 -15.41667,-4.79167 -22.5,-5.20833 -6.52995,-0.41667 -11.91406,0.76823 -16.14583,3.54166 -4.23828,2.77995 -8.09245,6.73829 -11.5625,11.875 -3.47657,5.14323 -6.45833,7.5 -8.95833,7.08333 -0.83334,-0.41666 -0.97657,-2.14843 -0.41667,-5.20833 0.6901,-3.05338 1.66667,-6.04166 2.91667,-8.95833 5.27343,-12.08333 11.24999,-21.04167 17.91666,-26.875 6.80339,-5.97005 14.92839,-8.95833 24.375,-8.95833 6.80338,0 15.34505,1.66666 25.625,5 6.38672,2.22656 11.875,3.33333 16.45833,3.33333 9.58333,0 19.09505,-3.39843 28.54167,-10.20833 2.08333,0 2.8125,1.35416 2.1875,4.0625 -0.625,2.70833 -1.5625,5.8724 -2.8125,9.47916 -1.11329,3.61329 -1.875,6.04167 -2.29167,7.29167 -2.08333,6.52995 -3.75,10.35157 -5,11.45833 -1.25,0.97657 -4.86328,3.61329 -10.83333,7.91667 -3.33334,2.5 -6.21745,5.38411 -8.64584,8.64583 -2.43489,3.26823 -4.89583,7.1224 -7.39583,11.5625 -2.5,4.44662 -5.69661,10.5599 -9.58333,18.33333 z m 0,0"
-     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.66666663"
-     inkscape:connector-curvature="0" />
-  <use
-     style="fill:#000000;fill-opacity:1"
-     id="use62"
-     y="291"
-     x="119.25"
-     xlink:href="#glyph0-4"
-     width="100%"
-     height="100%"
-     transform="matrix(1.3333333,0,0,1.3333333,72.589732,-189.32751)" />
-  <use
-     style="fill:#000000;fill-opacity:1"
-     id="use196"
-     y="391"
-     x="168.375"
-     xlink:href="#glyph0-4-3"
-     width="100%"
-     height="100%"
-     transform="matrix(1.3333333,0,0,1.3333333,-861.41828,-631.73483)" />
+<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 682.667 682.667">
+  <!-- Harf -->
+  <path d="M168.422 500.826c-23.477-.144-41.602-1.179-54.375-3.125-22.227-3.47-38.06-10.137-47.5-20-8.477-7.637-12.709-18.054-12.709-31.25 0-5.137.482-12.5 1.459-22.084a406.941 406.941 0 013.958-28.75c.69-4.023 1.315-7.636 1.875-10.833.417-2.22.97-4.024 1.667-5.417.69-1.386 1.458-2.187 2.291-2.396.834-.208 1.628.352 2.396 1.667.762 1.322 1.491 3.58 2.188 6.77a114.35 114.35 0 002.291 10.834c2.22 9.03 8.262 15.768 18.125 20.209 25 10.696 63.19 16.25 114.584 16.666 21.25-.273 40.97-1.041 59.166-2.291 18.607-1.387 39.584-4.649 62.917-9.792 23.333-5.137 41.908-10.762 55.73-16.875 13.814-6.107 25.585-12.708 35.312-19.792 7.636-5.553 11.458-10.898 11.458-16.041 0-2.084-1.98-4.545-5.938-7.396-3.958-2.845-6.562-4.271-7.812-4.271-2.363 1.113-5.143 1.98-8.333 2.604-3.197.625-6.114.8-8.75.52-7.364-.832-12.852-3.124-16.459-6.874-3.613-3.75-5.416-8.815-5.416-15.208 0-4.024 5.345-16.667 16.041-37.917 4.304-8.607 8.086-14.616 11.354-18.02 3.262-3.4 7.741-5.105 13.438-5.105 9.023 0 17.396 4.863 25.104 14.583 7.708 9.727 11.563 22.155 11.563 37.292 0 15-2.019 27.988-6.042 38.958-5 15-11.81 28.893-20.417 41.667-10.833 15.417-22.708 27.604-35.625 36.562-12.916 8.959-25.976 16.081-39.166 21.355-11.81 5.833-27.051 11.289-45.73 16.354-18.684 5.071-41.354 9.205-68.02 12.396-26.394 3.196-49.935 4.856-70.625 5zM430.222 133.162c1.107 4.03 1.074 8.196-.104 12.5-1.185 4.31-3.373 8.821-6.563 13.541-1.946 3.197-3.997 6.081-6.146 8.646a114.073 114.073 0 01-6.77 7.396c-.697.833-1.81 1.875-3.334 3.125a60.28 60.28 0 01-4.791 3.542c-1.667 1.113-3.269 1.914-4.792 2.396-1.53.488-2.643.312-3.333-.521-5-4.024-9.935-8.125-14.792-12.292-4.863-4.167-10.208-8.053-16.042-11.667-.976-.69-1.426-1.354-1.354-1.979.065-.625.45-1.562 1.146-2.812l33.333-50.834c.97-1.386 1.94-2.044 2.917-1.979.97.072 2.012.456 3.125 1.146a102.942 102.942 0 018.75 5.625 70.208 70.208 0 018.125 6.77 47.58 47.58 0 016.562 7.918c1.875 2.851 3.23 6.009 4.063 9.479zM599.13 319.784a589.994 589.994 0 01-9.583 16.354 123.488 123.488 0 01-11.146 15.52 97.741 97.741 0 01-13.542 13.23c-4.935 3.958-10.52 7.122-16.77 9.48-5.144 2.083-9.519 4.413-13.126 6.978-3.613 2.572-6.601 5.313-8.958 8.23-3.613 3.893-6.738 9.27-9.375 16.145a2240.458 2240.458 0 00-8.23 21.771 307.032 307.032 0 01-9.374 22.396c-3.405 7.292-7.676 13.3-12.813 18.02-7.083 7.5-17.571 12.573-31.458 15.21l-38.125 6.458c-1.113.143-2.467.247-4.063.312-1.601.072-2.747.04-3.437-.104-3.19-.97-4.167-3.086-2.917-6.354 1.25-3.262 4.512-6.563 9.792-9.896 10.69-7.083 19.232-12.813 25.625-17.188a6164.29 6164.29 0 0015.625-10.729c4.023-2.773 7.253-5.065 9.687-6.875a271.19 271.19 0 007.813-6.041c11.25-8.47 19.023-17.357 23.333-26.667 2.5-4.857 4.792-9.583 6.875-14.167a305.502 305.502 0 016.563-13.541 226.164 226.164 0 017.396-13.23c2.636-4.375 5.69-8.782 9.166-13.229 3.607-4.44 8.47-8.782 14.584-13.02 6.106-4.232 13.47-8.438 22.083-12.605.97-.416 2.565-1.354 4.792-2.812 2.22-1.459 4.928-3.783 8.125-6.98 3.19-3.19 6.836-7.532 10.937-13.02 4.095-5.482 8.438-12.461 13.021-20.938-1.667-1.666-6.458-3.958-14.375-6.875-7.917-3.053-15.417-4.791-22.5-5.208-6.53-.417-11.914.768-16.146 3.542-4.238 2.78-8.092 6.738-11.562 11.875-3.477 5.143-6.459 7.5-8.959 7.083-.833-.417-.976-2.149-.416-5.208a51.587 51.587 0 012.916-8.959c5.274-12.083 11.25-21.041 17.917-26.875 6.803-5.97 14.928-8.958 24.375-8.958 6.803 0 15.345 1.667 25.625 5 6.387 2.226 11.875 3.333 16.458 3.333 9.584 0 19.095-3.398 28.542-10.208 2.083 0 2.812 1.354 2.187 4.062-.625 2.709-1.562 5.873-2.812 9.48-1.113 3.613-1.875 6.041-2.292 7.291-2.083 6.53-3.75 10.352-5 11.459-1.25.976-4.863 3.613-10.833 7.916a42.505 42.505 0 00-8.646 8.646c-2.435 3.268-4.896 7.122-7.396 11.563-2.5 4.446-5.696 10.56-9.583 18.333zm0 0"/>
+  <!-- B -->
+  <path d="M229.342 300.489c2.084-8.887 4.375-16.667 6.875-23.333 2.5-6.667 4.935-12.188 7.292-16.563 2.363-4.375 4.655-7.74 6.875-10.104 2.226-2.357 4.167-3.75 5.833-4.167v13.75c0 17.5 4.649 29.727 13.959 36.667 5.69 3.75 11.354 5 16.979 3.75s9.928-4.167 12.916-8.75c2.982-4.583 5.521-9.96 7.605-16.146 2.083-6.178 4.095-9.27 6.041-9.27 2.22 0 3.125 2.226 2.709 6.666-.144 7.5-2.468 19.688-6.98 36.563-4.518 16.875-10.625 30.729-18.333 41.562-7.708 10.833-17.05 16.53-28.02 17.083-11.25-.416-20-6.731-26.25-18.958-5.69-12.083-8.19-27.708-7.5-46.875zM286.783 583.04c1.107 4.023 1.075 8.19-.104 12.5-1.185 4.303-3.372 8.815-6.562 13.542-1.947 3.19-3.998 6.074-6.146 8.645a117.59 117.59 0 01-6.771 7.396c-.697.834-1.81 1.875-3.333 3.125a61.927 61.927 0 01-4.792 3.542c-1.667 1.107-3.268 1.907-4.792 2.396-1.53.481-2.643.312-3.333-.521-5-4.03-9.935-8.125-14.792-12.292-4.856-4.166-10.208-8.06-16.041-11.666-.97-.697-1.42-1.355-1.354-1.98.071-.625.455-1.562 1.145-2.812l33.334-50.833c.97-1.394 1.94-2.051 2.916-1.98.97.066 2.012.45 3.125 1.146a102.94 102.94 0 018.75 5.625 69.555 69.555 0 018.125 6.771 47.057 47.057 0 016.563 7.917c1.875 2.845 3.229 6.002 4.062 9.479z"/>
+  <!-- uzz -->
+  <path d="M205.592 196.114c-5.976 36.667-11.354 64.03-16.146 82.083-4.791 18.06-9.134 31.843-13.02 41.355-3.894 9.518-8.164 16.77-12.813 21.77-4.655 5-13.197 9.76-25.625 14.271-12.435 4.518-22.812 7.676-31.146 9.48-8.333 1.81-13.541 2.78-15.625 2.916-2.083-.137-3.405-.52-3.958-1.146-.56-.625-.072-2.116 1.458-4.479 2.637-3.75 8.158-8.887 16.563-15.417 8.398-6.523 18.333-14.648 29.791-24.375 11.459-9.72 20.033-18.294 25.73-25.729 5.69-7.428 10.729-17.565 15.104-30.416 4.375-12.846 8.646-26.283 12.812-40.313 4.167-14.023 7.188-23.542 9.063-28.542 1.875-5 3.782-7.428 5.729-7.291 2.22.416 2.917 2.363 2.083 5.833zm14.792-114.375c1.107 4.03 1.074 8.197-.104 12.5-1.185 4.31-3.373 8.822-6.563 13.542-1.946 3.196-3.997 6.08-6.146 8.646a114.072 114.072 0 01-6.77 7.395c-.697.834-1.81 1.875-3.334 3.125a60.279 60.279 0 01-4.791 3.542c-1.667 1.113-3.269 1.914-4.792 2.396-1.53.488-2.643.312-3.333-.521-5-4.023-9.935-8.125-14.792-12.292-4.863-4.166-10.208-8.053-16.042-11.666-.976-.69-1.426-1.354-1.354-1.98.065-.624.45-1.562 1.146-2.812l33.333-50.833c.97-1.387 1.94-2.045 2.917-1.98.97.072 2.012.456 3.125 1.146a102.945 102.945 0 018.75 5.625 70.208 70.208 0 018.125 6.771 47.58 47.58 0 016.562 7.917c1.875 2.851 3.23 6.009 4.063 9.479zm0 0M256.217 250.489c-1.113 13.893-4.238 25.697-9.375 35.417-5.143 9.726-10.976 14.583-17.5 14.583 0-5.273 1.7-21.667 5.104-49.167 3.399-27.5 5.97-47.187 7.709-59.062 1.731-11.875 3.71-24.48 5.937-37.813 2.22-13.333 4.375-24.095 6.459-32.291a574.618 574.618 0 017.604-20.625 683.688 683.688 0 018.437-20.625c1.94-3.054 3.19-2.565 3.75 1.458-3.476 23.06-6.666 46.98-9.583 71.77-2.917 24.793-4.896 42.54-5.938 53.23-1.041 10.697-1.562 16.947-1.562 18.75-.697 11.393-1.042 19.518-1.042 24.375zm0 0"/>
 </svg>
index 6fc8e16..6a28e03 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index eede307..165567d 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -40,6 +40,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index e44694b..72fcd2e 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index f44d567..a4b2b16 100644 (file)
@@ -7,7 +7,7 @@
 <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.29 (XML mode)">
+<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">
@@ -52,6 +52,8 @@
 <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>
@@ -76,6 +78,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.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 2f9ee96..c6c152e 100644 (file)
@@ -8,7 +8,7 @@
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">
 <link rel="next" href="deprecated-api-index.html" title="Index of deprecated API">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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">
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t">hb_blob_t</a>, typedef in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t">hb_blob_t</a>, typedef in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t">hb_buffer_t</a>, typedef in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
+<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t">hb_buffer_t</a>, typedef in <a class="link" href="harfbuzz-hb-buffer.html" title="hb-buffer">hb-buffer</a>
 </dt>
 <dd></dd>
 <a name="idxC"></a><h3 class="title">C</h3>
@@ -614,7 +614,7 @@ hb_directwrite_face_get_font_face, function in hb-directwrite
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-face.html#hb-face-t">hb_face_t</a>, typedef in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t">hb_face_t</a>, typedef in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
 </dt>
 <dd></dd>
 <dt>
@@ -630,7 +630,7 @@ hb_directwrite_face_get_font_face, function in hb-directwrite
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-common.html#hb-feature-t-struct" title="hb_feature_t">hb_feature_t</a>, struct in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+<a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t">hb_feature_t</a>, struct in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
 </dt>
 <dd></dd>
 <dt>
@@ -754,7 +754,7 @@ hb_directwrite_face_get_font_face, function in hb-directwrite
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t">hb_font_funcs_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t">hb_font_funcs_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
 <dt>
@@ -938,6 +938,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-nominal-glyphs-func-t" title="hb_font_get_nominal_glyphs_func_t ()">hb_font_get_nominal_glyphs_func_t</a>, user_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-func-t" title="hb_font_get_nominal_glyph_func_t ()">hb_font_get_nominal_glyph_func_t</a>, user_function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
@@ -970,6 +974,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-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-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>
@@ -1050,7 +1058,7 @@ hb_directwrite_face_get_font_face, function in hb-directwrite
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-font.html#hb-font-t">hb_font_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t">hb_font_t</a>, typedef in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
 <dt>
@@ -1086,6 +1094,10 @@ hb_directwrite_face_get_font_face, function in hb-directwrite
 </dt>
 <dd></dd>
 <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-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>
@@ -1093,6 +1105,10 @@ hb_directwrite_face_get_font_face, function in hb-directwrite
 <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>
+<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>
 <a name="idxG"></a><h3 class="title">G</h3>
 <dt>
 hb_gdi_face_create, function in hb-gdi
@@ -1123,271 +1139,7 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct" 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>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-blob-get-type" title="hb_gobject_blob_get_type ()">hb_gobject_blob_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-cluster-level-get-type" title="hb_gobject_buffer_cluster_level_get_type ()">hb_gobject_buffer_cluster_level_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-content-type-get-type" title="hb_gobject_buffer_content_type_get_type ()">hb_gobject_buffer_content_type_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-diff-flags-get-type" title="hb_gobject_buffer_diff_flags_get_type ()">hb_gobject_buffer_diff_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-flags-get-type" title="hb_gobject_buffer_flags_get_type ()">hb_gobject_buffer_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-get-type" title="hb_gobject_buffer_get_type ()">hb_gobject_buffer_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-flags-get-type" title="hb_gobject_buffer_serialize_flags_get_type ()">hb_gobject_buffer_serialize_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-format-get-type" title="hb_gobject_buffer_serialize_format_get_type ()">hb_gobject_buffer_serialize_format_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-direction-get-type" title="hb_gobject_direction_get_type ()">hb_gobject_direction_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-face-get-type" title="hb_gobject_face_get_type ()">hb_gobject_face_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-feature-get-type" title="hb_gobject_feature_get_type ()">hb_gobject_feature_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-font-funcs-get-type" title="hb_gobject_font_funcs_get_type ()">hb_gobject_font_funcs_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-font-get-type" title="hb_gobject_font_get_type ()">hb_gobject_font_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-flags-get-type" title="hb_gobject_glyph_flags_get_type ()">hb_gobject_glyph_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-info-get-type" title="hb_gobject_glyph_info_get_type ()">hb_gobject_glyph_info_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-position-get-type" title="hb_gobject_glyph_position_get_type ()">hb_gobject_glyph_position_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-map-get-type" title="hb_gobject_map_get_type ()">hb_gobject_map_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-memory-mode-get-type" title="hb_gobject_memory_mode_get_type ()">hb_gobject_memory_mode_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-color-palette-flags-get-type" title="hb_gobject_ot_color_palette_flags_get_type ()">hb_gobject_ot_color_palette_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-layout-glyph-class-get-type" title="hb_gobject_ot_layout_glyph_class_get_type ()">hb_gobject_ot_layout_glyph_class_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-constant-get-type" title="hb_gobject_ot_math_constant_get_type ()">hb_gobject_ot_math_constant_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-flags-get-type" title="hb_gobject_ot_math_glyph_part_flags_get_type ()">hb_gobject_ot_math_glyph_part_flags_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-get-type" title="hb_gobject_ot_math_glyph_part_get_type ()">hb_gobject_ot_math_glyph_part_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-variant-get-type" title="hb_gobject_ot_math_glyph_variant_get_type ()">hb_gobject_ot_math_glyph_variant_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-kern-get-type" title="hb_gobject_ot_math_kern_get_type ()">hb_gobject_ot_math_kern_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-script-get-type" title="hb_gobject_script_get_type ()">hb_gobject_script_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-segment-properties-get-type" title="hb_gobject_segment_properties_get_type ()">hb_gobject_segment_properties_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-set-get-type" title="hb_gobject_set_get_type ()">hb_gobject_set_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-shape-plan-get-type" title="hb_gobject_shape_plan_get_type ()">hb_gobject_shape_plan_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BLOB:CAPS" title="HB_GOBJECT_TYPE_BLOB">HB_GOBJECT_TYPE_BLOB</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER:CAPS" title="HB_GOBJECT_TYPE_BUFFER">HB_GOBJECT_TYPE_BUFFER</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CLUSTER-LEVEL:CAPS" title="HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL">HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CONTENT-TYPE:CAPS" title="HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE">HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-DIFF-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS">HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_FLAGS">HB_GOBJECT_TYPE_BUFFER_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS">HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FORMAT:CAPS" title="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT">HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-DIRECTION:CAPS" title="HB_GOBJECT_TYPE_DIRECTION">HB_GOBJECT_TYPE_DIRECTION</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FACE:CAPS" title="HB_GOBJECT_TYPE_FACE">HB_GOBJECT_TYPE_FACE</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FEATURE:CAPS" title="HB_GOBJECT_TYPE_FEATURE">HB_GOBJECT_TYPE_FEATURE</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT:CAPS" title="HB_GOBJECT_TYPE_FONT">HB_GOBJECT_TYPE_FONT</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT-FUNCS:CAPS" title="HB_GOBJECT_TYPE_FONT_FUNCS">HB_GOBJECT_TYPE_FONT_FUNCS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-FLAGS:CAPS" title="HB_GOBJECT_TYPE_GLYPH_FLAGS">HB_GOBJECT_TYPE_GLYPH_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-INFO:CAPS" title="HB_GOBJECT_TYPE_GLYPH_INFO">HB_GOBJECT_TYPE_GLYPH_INFO</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-POSITION:CAPS" title="HB_GOBJECT_TYPE_GLYPH_POSITION">HB_GOBJECT_TYPE_GLYPH_POSITION</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MAP:CAPS" title="HB_GOBJECT_TYPE_MAP">HB_GOBJECT_TYPE_MAP</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MEMORY-MODE:CAPS" title="HB_GOBJECT_TYPE_MEMORY_MODE">HB_GOBJECT_TYPE_MEMORY_MODE</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-COLOR-PALETTE-FLAGS:CAPS" title="HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS">HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-LAYOUT-GLYPH-CLASS:CAPS" title="HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS">HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-CONSTANT:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_CONSTANT">HB_GOBJECT_TYPE_OT_MATH_CONSTANT</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART">HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART-FLAGS:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS">HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-VARIANT:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT">HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-KERN:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_KERN">HB_GOBJECT_TYPE_OT_MATH_KERN</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SCRIPT:CAPS" title="HB_GOBJECT_TYPE_SCRIPT">HB_GOBJECT_TYPE_SCRIPT</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SEGMENT-PROPERTIES:CAPS" title="HB_GOBJECT_TYPE_SEGMENT_PROPERTIES">HB_GOBJECT_TYPE_SEGMENT_PROPERTIES</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SET:CAPS" title="HB_GOBJECT_TYPE_SET">HB_GOBJECT_TYPE_SET</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SHAPE-PLAN:CAPS" title="HB_GOBJECT_TYPE_SHAPE_PLAN">HB_GOBJECT_TYPE_SHAPE_PLAN</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-COMBINING-CLASS:CAPS" title="HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS">HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-FUNCS:CAPS" title="HB_GOBJECT_TYPE_UNICODE_FUNCS">HB_GOBJECT_TYPE_UNICODE_FUNCS</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-GENERAL-CATEGORY:CAPS" title="HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY">HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-USER-DATA-KEY:CAPS" title="HB_GOBJECT_TYPE_USER_DATA_KEY">HB_GOBJECT_TYPE_USER_DATA_KEY</a>, macro in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-combining-class-get-type" title="hb_gobject_unicode_combining_class_get_type ()">hb_gobject_unicode_combining_class_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-funcs-get-type" title="hb_gobject_unicode_funcs_get_type ()">hb_gobject_unicode_funcs_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-general-category-get-type" title="hb_gobject_unicode_general_category_get_type ()">hb_gobject_unicode_general_category_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-user-data-key-get-type" title="hb_gobject_user_data_key_get_type ()">hb_gobject_user_data_key_get_type</a>, function in <a class="link" href="harfbuzz-hb-gobject.html" title="hb-gobject">hb-gobject</a>
+<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>
 <dt>
@@ -1490,7 +1242,7 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-map.html#hb-map-t">hb_map_t</a>, typedef in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
+<a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t">hb_map_t</a>, typedef in <a class="link" href="harfbuzz-hb-map.html" title="hb-map">hb-map</a>
 </dt>
 <dd></dd>
 <dt>
@@ -1571,6 +1323,14 @@ 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>
@@ -1759,11 +1519,11 @@ hb_gdi_face_create, function in hb-gdi
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct" 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>
+<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-struct" 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>
+<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>
@@ -2014,7 +1774,7 @@ 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-t-struct" 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>
+<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>
 <dt>
@@ -2126,7 +1886,7 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-set.html#hb-set-t">hb_set_t</a>, typedef in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t">hb_set_t</a>, typedef in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
 </dt>
 <dd></dd>
 <dt>
@@ -2194,7 +1954,7 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-shape-plan.html#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>
+<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>
 <a name="idxT"></a><h3 class="title">T</h3>
@@ -2252,10 +2012,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-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-unicode.html#hb-unicode-decompose-func-t" title="hb_unicode_decompose_func_t ()">hb_unicode_decompose_func_t</a>, user_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-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-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>
@@ -2320,7 +2088,7 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t">hb_unicode_funcs_t</a>, typedef in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
+<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t">hb_unicode_funcs_t</a>, typedef in <a class="link" href="harfbuzz-hb-unicode.html" title="hb-unicode">hb-unicode</a>
 </dt>
 <dd></dd>
 <dt>
@@ -2372,7 +2140,7 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t-struct" title="hb_user_data_key_t">hb_user_data_key_t</a>, struct in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
+<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>, struct in <a class="link" href="harfbuzz-hb-common.html" title="hb-common">hb-common</a>
 </dt>
 <dd></dd>
 <a name="idxV"></a><h3 class="title">V</h3>
@@ -2426,6 +2194,6 @@ hb_ot_metrics_tag_t, enum in hb-ot-metrics
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 2f0aca5..68f2772 100644 (file)
@@ -8,7 +8,7 @@
 <link rel="up" href="pt01.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.29 (XML mode)">
+<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">
@@ -95,6 +95,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 8870342..84feb5f 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 96bf10a..d820afb 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 0cbc6a6..fc3884c 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 08bb473..69e2e81 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -94,6 +94,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/ch11.html b/docs/html/ch11.html
deleted file mode 100644 (file)
index c6cac7b..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.29 (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.29</div>
-</body>
-</html>
\ No newline at end of file
index 7c615c1..3c3fed8 100644 (file)
@@ -2,13 +2,13 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>OpenType API: HarfBuzz Manual</title>
+<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="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.29 (XML mode)">
+<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">
 <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>
+<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.5"></a>OpenType API</h2></div></div></div>
+<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-ot-color.html">hb-ot-color</a></span><span class="refpurpose"> — OpenType Color Fonts</span>
+<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-ot-font.html">hb-ot-font</a></span><span class="refpurpose"> — OpenType font implementation</span>
+<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-ot-layout.html">hb-ot-layout</a></span><span class="refpurpose"> — OpenType Layout</span>
+<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-ot-math.html">hb-ot-math</a></span><span class="refpurpose"> — OpenType Math information</span>
+<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-ot-name.html">hb-ot-name</a></span><span class="refpurpose"> — OpenType font name information</span>
+<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-ot-shape.html">hb-ot-shape</a></span><span class="refpurpose"> — OpenType shaping support</span>
+<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-ot-var.html">hb-ot-var</a></span><span class="refpurpose"> — OpenType Font Variations</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>
+</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.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 4081a6d..ba6f99a 100644 (file)
@@ -2,13 +2,13 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Apple Advanced Typography API: HarfBuzz Manual</title>
+<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-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.29 (XML mode)">
+<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">
 <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>
+<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.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>
+<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.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index b504c84..28645ba 100644 (file)
@@ -2,13 +2,13 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Integration API: HarfBuzz Manual</title>
+<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-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.29 (XML mode)">
+<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">
 <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>
+<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.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</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>
+<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.29</div>
+<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
new file mode 100644 (file)
index 0000000..95cb975
--- /dev/null
@@ -0,0 +1,52 @@
+<!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 d6f3d6a..7dd84ac 100644 (file)
@@ -8,7 +8,7 @@
 <link rel="up" href="pt01.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.29 (XML mode)">
+<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">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 8584a15..4198a58 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -52,6 +52,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 76b4645..8160f4f 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 80221f2..ff09212 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 48daf19..218051e 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -88,6 +88,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index b0a1f39..b336252 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -95,6 +95,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 97a1a7a..3db404e 100644 (file)
@@ -8,7 +8,7 @@
 <link rel="up" href="pt01.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.29 (XML mode)">
+<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">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 8249803..5cbeb90 100644 (file)
@@ -8,7 +8,7 @@
 <link rel="up" href="pt01.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.29 (XML mode)">
+<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">
@@ -91,6 +91,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index ebff1b1..527a2e3 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -40,6 +40,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index b2e3e01..f4bfc30 100644 (file)
@@ -5,23 +5,22 @@
 <title>hb-aat-layout: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch13.html" title="Apple Advanced Typography API">
-<link rel="prev" href="ch13.html" title="Apple Advanced Typography API">
-<link rel="next" href="ch14.html" title="Integration API">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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="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-aat-layout.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-aat-layout.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="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="n" href="ch14.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></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>
 </tr></table>
 <div class="refentry">
 <a name="harfbuzz-hb-aat-layout"></a><div class="titlepage"></div>
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-aat-layout.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -93,8 +92,8 @@
 <a name="harfbuzz-hb-aat-layout.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-aat-layout.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
-    <span class="lineart">├──</span> hb_aat_layout_feature_selector_t
-    <span class="lineart">╰──</span> hb_aat_layout_feature_type_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-aat-layout.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb-aat.h&gt;
 </pre>
 <a name="hb-aat-layout-feature-type-get-name-id"></a><h3>hb_aat_layout_feature_type_get_name_id ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
 hb_aat_layout_feature_type_get_name_id
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <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>
 <div class="refsect3">
 <a name="hb-aat-layout-feature-type-get-name-id.parameters"></a><h4>Parameters</h4>
@@ -169,7 +161,7 @@ hb_aat_layout_feature_type_get_name_id
 <a name="hb-aat-layout-feature-type-get-selector-infos"></a><h3>hb_aat_layout_feature_type_get_selector_infos ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_aat_layout_feature_type_get_selector_infos
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <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>,
@@ -180,7 +172,7 @@ hb_aat_layout_feature_type_get_selector_infos
 <div class="refsect2">
 <a name="hb-aat-layout-get-feature-types"></a><h3>hb_aat_layout_get_feature_types ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_aat_layout_get_feature_types (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_aat_layout_get_feature_types (<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> *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>
@@ -226,19 +218,19 @@ hb_aat_layout_get_feature_types (<em class="parameter"><code><a class="link" hre
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 </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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 </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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 </div>
 </div>
 <div class="refsect1">
@@ -1750,6 +1742,6 @@ hb_aat_layout_has_tracking (<em class="parameter"><code><a class="link" href="ha
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 6a4cf42..88c5ee3 100644 (file)
@@ -5,22 +5,21 @@
 <title>hb-blob: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
-<link rel="prev" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.html" title="Core API">
+<link rel="prev" href="ch12.html" title="Core API">
 <link rel="next" href="harfbuzz-hb-buffer.html" title="hb-buffer">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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-blob.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-blob.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="ch11.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></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="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 name="harfbuzz-hb-blob.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<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-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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" title="hb_blob_create ()">hb_blob_create</a> <span class="c_punctuation">()</span>
@@ -50,7 +49,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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>
@@ -58,7 +57,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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>
@@ -66,7 +65,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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-copy-writable-or-fail" title="hb_blob_copy_writable_or_fail ()">hb_blob_copy_writable_or_fail</a> <span class="c_punctuation">()</span>
@@ -97,7 +96,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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-get-empty" title="hb_blob_get_empty ()">hb_blob_get_empty</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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-reference" title="hb_blob_reference ()">hb_blob_reference</a> <span class="c_punctuation">()</span>
 </tbody>
 </table></div>
 </div>
-<a name="hb-blob-t"></a><div class="refsect1">
+<div class="refsect1">
 <a name="harfbuzz-hb-blob.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 <td class="typedef_keyword">typedef</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t">hb_blob_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t">hb_blob_t</a></td>
 </tr>
 <tr>
 <td class="datatype_keyword">enum</td>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-blob.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
-    <span class="lineart">╰──</span> hb_blob_t
-    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
-    <span class="lineart">╰──</span> hb_memory_mode_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-blob.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb.h&gt;
 </pre>
@@ -196,7 +187,7 @@ pass around other binary data.</p>
 <a name="harfbuzz-hb-blob.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="hb-blob-create"></a><h3>hb_blob_create ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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 (<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>,
@@ -260,7 +251,7 @@ zero.  Destroy with <a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy"
 <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"><span class="returnvalue">hb_blob_t</span></a> *
+<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>
 <div class="refsect3">
 <a name="hb-blob-create-from-file.parameters"></a><h4>Parameters</h4>
@@ -286,8 +277,8 @@ hb_blob_create_from_file (<em class="parameter"><code>const <span class="type">c
 <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"><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"><span class="type">hb_blob_t</span></a> *parent</code></em>,
+<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>,
                          <em class="parameter"><code>unsigned <span class="type">int</span> offset</code></em>,
                          <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>
@@ -340,8 +331,8 @@ with <a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy" title="hb_blob
 <hr>
 <div class="refsect2">
 <a name="hb-blob-copy-writable-or-fail"></a><h3>hb_blob_copy_writable_or_fail ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
-hb_blob_copy_writable_or_fail (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<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_copy_writable_or_fail (<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 writable copy of <em class="parameter"><code>blob</code></em>
 .</p>
 <div class="refsect3">
@@ -369,7 +360,7 @@ hb_blob_copy_writable_or_fail (<em class="parameter"><code><a class="link" href=
 <div class="refsect2">
 <a name="hb-blob-destroy"></a><h3>hb_blob_destroy ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_blob_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+hb_blob_destroy (<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>Decreases the reference count on <em class="parameter"><code>blob</code></em>
 , and if it reaches zero, destroys
 <em class="parameter"><code>blob</code></em>
@@ -398,7 +389,7 @@ was created for if it has not been called already.</p>
 <div class="refsect2">
 <a name="hb-blob-get-data"></a><h3>hb_blob_get_data ()</h3>
 <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"><span class="type">hb_blob_t</span></a> *blob</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-blob-get-data.parameters"></a><h4>Parameters</h4>
@@ -433,7 +424,7 @@ hb_blob_get_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-blob-get-data-writable"></a><h3>hb_blob_get_data_writable ()</h3>
 <pre class="programlisting"><span class="returnvalue">char</span> *
-hb_blob_get_data_writable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
+hb_blob_get_data_writable (<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>Tries to make blob data writable (possibly copying it) and
 return pointer to data.</p>
@@ -464,7 +455,7 @@ fails.</p>
 <div class="refsect3">
 <a name="hb-blob-get-data-writable.returns"></a><h4>Returns</h4>
 <p>Writable blob data,
-or <code class="literal">NULL</code> if failed. </p>
+or <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> 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>
@@ -472,7 +463,7 @@ or <code class="literal">NULL</code> if failed. </p>
 <hr>
 <div class="refsect2">
 <a name="hb-blob-get-empty"></a><h3>hb_blob_get_empty ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <p>Returns the singleton empty blob.</p>
 <p>See TODO:link object types for more information.</p>
@@ -487,7 +478,7 @@ hb_blob_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <div class="refsect2">
 <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"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-blob-get-length.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -513,8 +504,8 @@ hb_blob_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <div class="refsect2">
 <a name="hb-blob-get-user-data"></a><h3>hb_blob_get_user_data ()</h3>
 <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"><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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+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><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>
@@ -549,7 +540,7 @@ hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <div class="refsect2">
 <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"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-blob-is-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -575,7 +566,7 @@ hb_blob_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 <div class="refsect2">
 <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"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-blob-make-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -596,8 +587,8 @@ hb_blob_make_immutable (<em class="parameter"><code><a class="link" href="harfbu
 <hr>
 <div class="refsect2">
 <a name="hb-blob-reference"></a><h3>hb_blob_reference ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
-hb_blob_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+<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_reference (<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>Increases the reference count on <em class="parameter"><code>blob</code></em>
 .</p>
 <p>See TODO:link object types for more information.</p>
@@ -628,8 +619,8 @@ hb_blob_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <div class="refsect2">
 <a name="hb-blob-set-user-data"></a><h3>hb_blob_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_blob_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+hb_blob_set_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>,
                        <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>
@@ -721,6 +712,6 @@ is not needed anymore.</p></td>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 0ab8ae1..6eba9bd 100644 (file)
@@ -5,21 +5,20 @@
 <title>hb-buffer: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.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.29 (XML mode)">
+<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-buffer.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-buffer.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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 name="harfbuzz-hb-buffer.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<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-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
+<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" title="hb_buffer_create ()">hb_buffer_create</a> <span class="c_punctuation">()</span>
@@ -50,7 +49,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
+<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>
@@ -58,7 +57,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
+<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-get-empty" title="hb_buffer_get_empty ()">hb_buffer_get_empty</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t"><span class="returnvalue">hb_glyph_position_t</span></a> *
+<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t" title="hb_glyph_position_t"><span class="returnvalue">hb_glyph_position_t</span></a> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
 </tbody>
 </table></div>
 </div>
-<a name="hb-buffer-t"></a><a name="hb-glyph-position-t"></a><a name="hb-segment-properties-t"></a><div class="refsect1">
+<div class="refsect1">
 <a name="harfbuzz-hb-buffer.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </tr>
 <tr>
 <td class="typedef_keyword">typedef</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t">hb_buffer_t</a></td>
+<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">enum</td>
 </tr>
 <tr>
 <td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct" title="hb_glyph_position_t">hb_glyph_position_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t" title="hb_glyph_position_t">hb_glyph_position_t</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-buffer.html#hb-segment-properties-t-struct" title="hb_segment_properties_t">hb_segment_properties_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t" title="hb_segment_properties_t">hb_segment_properties_t</a></td>
 </tr>
 <tr>
 <td class="datatype_keyword">enum</td>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-buffer.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
-    <span class="lineart">├──</span> hb_buffer_t
-    <span class="lineart">├──</span> hb_glyph_position_t
-    <span class="lineart">╰──</span> hb_segment_properties_t
-    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
-    <span class="lineart">├──</span> hb_buffer_cluster_level_t
-    <span class="lineart">├──</span> hb_buffer_content_type_t
-    <span class="lineart">╰──</span> hb_buffer_serialize_format_t
-    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
-    <span class="lineart">├──</span> hb_buffer_diff_flags_t
-    <span class="lineart">├──</span> hb_buffer_flags_t
-    <span class="lineart">├──</span> hb_buffer_serialize_flags_t
-    <span class="lineart">╰──</span> hb_glyph_flags_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-buffer.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb.h&gt;
 </pre>
@@ -584,16 +566,16 @@ passed to <a class="link" href="harfbuzz-hb-shape.html#hb-shape" title="hb_shape
 <a name="harfbuzz-hb-buffer.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="hb-buffer-create"></a><h3>hb_buffer_create ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
+<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 (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>Creates a new <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> with all properties to defaults.</p>
+<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> with all properties to defaults.</p>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <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"><span class="type">hb_buffer_t</span></a> with a reference count of 1. The initial
+<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"><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"><span class="type">hb_buffer_t</span></a> object will be returned on which
+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
+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>
 </div>
@@ -602,8 +584,8 @@ be allocated, a special <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-
 <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"><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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<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>
 <p>Increases the reference count on <em class="parameter"><code>buffer</code></em>
  by one. This prevents <em class="parameter"><code>buffer</code></em>
  from
@@ -619,14 +601,14 @@ 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"><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-reference.returns"></a><h4>Returns</h4>
-<p>The referenced <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>. </p>
+<p>The referenced <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_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>
@@ -634,7 +616,7 @@ being destroyed until a matching call to <a class="link" href="harfbuzz-hb-buffe
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_buffer_t</span></a> *
+<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>
 <div class="refsect3">
 <a name="hb-buffer-get-empty.returns"></a><h4>Returns</h4>
@@ -647,7 +629,7 @@ hb_buffer_get_empty (<em class="parameter"><code><span class="type">void</span><
 <div class="refsect2">
 <a name="hb-buffer-destroy"></a><h3>hb_buffer_destroy ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+hb_buffer_destroy (<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>Deallocate the <em class="parameter"><code>buffer</code></em>
 .
 Decreases the reference count on <em class="parameter"><code>buffer</code></em>
@@ -665,7 +647,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"><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>
@@ -676,7 +658,7 @@ Decreases the reference count on <em class="parameter"><code>buffer</code></em>
 <div class="refsect2">
 <a name="hb-buffer-reset"></a><h3>hb_buffer_reset ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_reset (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+hb_buffer_reset (<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>Resets the buffer to its initial status, as if it was just newly created
 with <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create" title="hb_buffer_create ()"><code class="function">hb_buffer_create()</code></a>.</p>
 <div class="refsect3">
@@ -689,7 +671,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"><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>
@@ -700,7 +682,7 @@ with <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-create" title="hb_b
 <div class="refsect2">
 <a name="hb-buffer-clear-contents"></a><h3>hb_buffer_clear_contents ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_clear_contents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+hb_buffer_clear_contents (<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>Similar to <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-reset" title="hb_buffer_reset ()"><code class="function">hb_buffer_reset()</code></a>, but does not clear the Unicode functions and
 the replacement code point.</p>
 <div class="refsect3">
@@ -713,7 +695,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"><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>
@@ -724,7 +706,7 @@ the replacement code point.</p>
 <div class="refsect2">
 <a name="hb-buffer-pre-allocate"></a><h3>hb_buffer_pre_allocate ()</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_pre_allocate (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_pre_allocate (<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> size</code></em>);</pre>
 <p>Pre allocates memory for <em class="parameter"><code>buffer</code></em>
  to fit at least <em class="parameter"><code>size</code></em>
@@ -740,7 +722,7 @@ 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"><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>
@@ -762,7 +744,7 @@ memory allocation succeeded, <code class="literal">false</code> otherwise.</p>
 <div class="refsect2">
 <a name="hb-buffer-allocation-successful"></a><h3>hb_buffer_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_buffer_allocation_successful (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+hb_buffer_allocation_successful (<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>Check if allocating memory for the buffer succeeded.</p>
 <div class="refsect3">
 <a name="hb-buffer-allocation-successful.parameters"></a><h4>Parameters</h4>
@@ -774,7 +756,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"><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>
@@ -790,7 +772,7 @@ memory allocation succeeded, <code class="literal">false</code> otherwise.</p>
 <div class="refsect2">
 <a name="hb-buffer-add"></a><h3>hb_buffer_add ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_add (<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> codepoint</code></em>,
                <em class="parameter"><code>unsigned <span class="type">int</span> cluster</code></em>);</pre>
 <p>Appends a character with the Unicode value of <em class="parameter"><code>codepoint</code></em>
@@ -815,7 +797,7 @@ 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"><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>
@@ -838,7 +820,7 @@ caller to ensure it is a valid Unicode code point.</p>
 <div class="refsect2">
 <a name="hb-buffer-add-codepoints"></a><h3>hb_buffer_add_codepoints ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_add_codepoints (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_add_codepoints (<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-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *text</code></em>,
                           <em class="parameter"><code><span class="type">int</span> text_length</code></em>,
                           <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
@@ -873,7 +855,7 @@ to ensure it contains a valid Unicode code points.</p>
 <tbody>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> to append characters to.</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a> to append characters to.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -884,7 +866,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 <code class="literal">NULL</code> terminated.</p></td>
+, 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_annotations"> </td>
 </tr>
 <tr>
@@ -898,7 +880,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 <code class="literal">NULL</code> terminated).</p></td>
+(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>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -910,7 +892,7 @@ end of <em class="parameter"><code>text</code></em>
 <div class="refsect2">
 <a name="hb-buffer-add-utf32"></a><h3>hb_buffer_add_utf32 ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_add_utf32 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_add_utf32 (<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">uint32_t</span> *text</code></em>,
                      <em class="parameter"><code><span class="type">int</span> text_length</code></em>,
                      <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
@@ -930,7 +912,7 @@ 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"><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>
@@ -941,7 +923,7 @@ see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-code
 <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 <code class="literal">NULL</code> terminated.</p></td>
+, 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_annotations"> </td>
 </tr>
 <tr>
@@ -955,7 +937,7 @@ see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-code
 <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 <code class="literal">NULL</code> terminated).</p></td>
+(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>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -967,7 +949,7 @@ end of <em class="parameter"><code>text</code></em>
 <div class="refsect2">
 <a name="hb-buffer-add-utf16"></a><h3>hb_buffer_add_utf16 ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_add_utf16 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_add_utf16 (<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">uint16_t</span> *text</code></em>,
                      <em class="parameter"><code><span class="type">int</span> text_length</code></em>,
                      <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
@@ -987,7 +969,7 @@ 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"><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>
@@ -998,7 +980,7 @@ see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-code
 <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 <code class="literal">NULL</code> terminated.</p></td>
+, 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_annotations"> </td>
 </tr>
 <tr>
@@ -1012,7 +994,7 @@ see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-replacement-code
 <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 <code class="literal">NULL</code> terminated).</p></td>
+(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>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1024,7 +1006,7 @@ end of <em class="parameter"><code>text</code></em>
 <div class="refsect2">
 <a name="hb-buffer-add-utf8"></a><h3>hb_buffer_add_utf8 ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_add_utf8 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_add_utf8 (<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> *text</code></em>,
                     <em class="parameter"><code><span class="type">int</span> text_length</code></em>,
                     <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
@@ -1044,7 +1026,7 @@ 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"><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>
@@ -1056,7 +1038,7 @@ 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 <code class="literal">NULL</code> terminated.</p></td>
+, 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_annotations"> </td>
 </tr>
 <tr>
@@ -1070,7 +1052,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 <code class="literal">NULL</code> terminated).</p></td>
+(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>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1082,7 +1064,7 @@ end of <em class="parameter"><code>text</code></em>
 <div class="refsect2">
 <a name="hb-buffer-add-latin1"></a><h3>hb_buffer_add_latin1 ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_add_latin1 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_add_latin1 (<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">uint8_t</span> *text</code></em>,
                       <em class="parameter"><code><span class="type">int</span> text_length</code></em>,
                       <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
@@ -1101,7 +1083,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"><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>
@@ -1113,7 +1095,7 @@ 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 <code class="literal">NULL</code> terminated.</p></td>
+, 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_annotations"> </td>
 </tr>
 <tr>
@@ -1127,7 +1109,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 <code class="literal">NULL</code> terminated).</p></td>
+(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>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1139,8 +1121,8 @@ end of <em class="parameter"><code>text</code></em>
 <div class="refsect2">
 <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"><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"><span class="type">hb_buffer_t</span></a> *source</code></em>,
+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>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>
@@ -1155,12 +1137,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"><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"><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>
@@ -1170,7 +1152,8 @@ hb_buffer_append (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </tr>
 <tr>
 <td class="parameter_name"><p>end</p></td>
-<td class="parameter_description"><p>end index into source buffer to copy.  Use (unsigned int) -1 to copy to end of buffer.</p></td>
+<td class="parameter_description"><p>end index into source buffer to copy.  Use <em class="parameter"><code>HB_FEATURE_GLOBAL_END</code></em>
+to copy to end of buffer.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -1182,7 +1165,7 @@ hb_buffer_append (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-buffer-set-content-type"></a><h3>hb_buffer_set_content_type ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_set_content_type (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+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
@@ -1198,7 +1181,7 @@ 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"><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>
@@ -1215,7 +1198,7 @@ characters (before shaping) or glyphs (the result of shaping).</p>
 <div class="refsect2">
 <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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-buffer-get-content-type.parameters"></a><h4>Parameters</h4>
@@ -1227,7 +1210,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"><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>
@@ -1243,7 +1226,7 @@ contents.</p>
 <div class="refsect2">
 <a name="hb-buffer-set-direction"></a><h3>hb_buffer_set_direction ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_set_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_set_direction (<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-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>);</pre>
 <p>Set the text flow direction of the buffer. No shaping can happen without
 setting <em class="parameter"><code>buffer</code></em>
@@ -1264,7 +1247,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"><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>
@@ -1282,7 +1265,7 @@ direction.</p>
 <div class="refsect2">
 <a name="hb-buffer-get-direction"></a><h3>hb_buffer_get_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_buffer_get_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+hb_buffer_get_direction (<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-direction" title="hb_buffer_set_direction ()"><code class="function">hb_buffer_set_direction()</code></a></p>
 <div class="refsect3">
 <a name="hb-buffer-get-direction.parameters"></a><h4>Parameters</h4>
@@ -1294,7 +1277,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"><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>
@@ -1310,7 +1293,7 @@ hb_buffer_get_direction (<em class="parameter"><code><a class="link" href="harfb
 <div class="refsect2">
 <a name="hb-buffer-set-script"></a><h3>hb_buffer_set_script ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_set_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_set_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>,
                       <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>Sets the script of <em class="parameter"><code>buffer</code></em>
  to <em class="parameter"><code>script</code></em>
@@ -1320,7 +1303,7 @@ require it (e.g. Arabic) and the which OpenType features defined in the font
 to be applied.</p>
 <p>You can pass one of the predefined <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> values, or use
 <a class="link" href="harfbuzz-hb-common.html#hb-script-from-string" title="hb_script_from_string ()"><code class="function">hb_script_from_string()</code></a> or <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> to get the
-corresponding script from an ISO 15924 script tag.</p>
+corresponding script from an ISO 15924 script tag.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-script.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1332,7 +1315,7 @@ 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"><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>
@@ -1349,7 +1332,7 @@ corresponding script from an ISO 15924 script tag.</p>
 <div class="refsect2">
 <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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-buffer-get-script.parameters"></a><h4>Parameters</h4>
@@ -1361,7 +1344,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"><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>
@@ -1377,7 +1360,7 @@ hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz
 <div class="refsect2">
 <a name="hb-buffer-set-language"></a><h3>hb_buffer_set_language ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_set_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_set_language (<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-language-t" title="hb_language_t"><span class="type">hb_language_t</span></a> language</code></em>);</pre>
 <p>Sets the language of <em class="parameter"><code>buffer</code></em>
  to <em class="parameter"><code>language</code></em>
@@ -1386,7 +1369,7 @@ hb_buffer_set_language (<em class="parameter"><code><a class="link" href="harfbu
 buffer which can result in applying language-specific behaviour. Languages
 are orthogonal to the scripts, and though they are related, they are
 different concepts and should not be confused with each other.</p>
-<p>Use <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> to convert from BCP 47 language tags to
+<p>Use <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> to convert from BCP 47 language tags to
 <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-buffer-set-language.parameters"></a><h4>Parameters</h4>
@@ -1399,7 +1382,7 @@ 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"><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>
@@ -1416,7 +1399,7 @@ different concepts and should not be confused with each other.</p>
 <div class="refsect2">
 <a name="hb-buffer-get-language"></a><h3>hb_buffer_get_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_buffer_get_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+hb_buffer_get_language (<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-language" title="hb_buffer_set_language ()"><code class="function">hb_buffer_set_language()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-language.parameters"></a><h4>Parameters</h4>
@@ -1428,7 +1411,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"><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>
@@ -1444,7 +1427,7 @@ hb_buffer_get_language (<em class="parameter"><code><a class="link" href="harfbu
 <div class="refsect2">
 <a name="hb-buffer-set-flags"></a><h3>hb_buffer_set_flags ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_set_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_set_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>,
                      <em class="parameter"><code><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> flags</code></em>);</pre>
 <p>Sets <em class="parameter"><code>buffer</code></em>
  flags to <em class="parameter"><code>flags</code></em>
@@ -1460,7 +1443,7 @@ 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"><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>
@@ -1477,7 +1460,7 @@ hb_buffer_set_flags (<em class="parameter"><code><a class="link" href="harfbuzz-
 <div class="refsect2">
 <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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-buffer-get-flags.parameters"></a><h4>Parameters</h4>
@@ -1489,7 +1472,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"><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>
@@ -1505,7 +1488,7 @@ flags.</p>
 <div class="refsect2">
 <a name="hb-buffer-set-cluster-level"></a><h3>hb_buffer_set_cluster_level ()</h3>
 <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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-buffer-set-cluster-level.parameters"></a><h4>Parameters</h4>
@@ -1517,7 +1500,7 @@ hb_buffer_set_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"><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>
@@ -1528,7 +1511,7 @@ hb_buffer_set_cluster_level (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+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>
 <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">
@@ -1539,7 +1522,7 @@ 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"><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>
@@ -1550,7 +1533,7 @@ hb_buffer_get_cluster_level (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-buffer-set-length"></a><h3>hb_buffer_set_length ()</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_set_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_set_length (<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>Similar to <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-pre-allocate" title="hb_buffer_pre_allocate ()"><code class="function">hb_buffer_pre_allocate()</code></a>, but clears any new items added at the
 end.</p>
@@ -1565,7 +1548,7 @@ 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"><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>
@@ -1588,7 +1571,7 @@ memory allocation succeeded, <code class="literal">false</code> otherwise.</p>
 <div class="refsect2">
 <a name="hb-buffer-get-length"></a><h3>hb_buffer_get_length ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_buffer_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+hb_buffer_get_length (<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 the number of items in the buffer.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-length.parameters"></a><h4>Parameters</h4>
@@ -1600,7 +1583,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"><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>
@@ -1617,8 +1600,8 @@ The value valid as long as buffer has not been modified.</p>
 <div class="refsect2">
 <a name="hb-buffer-set-segment-properties"></a><h3>hb_buffer_set_segment_properties ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_set_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#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-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>);</pre>
+hb_buffer_set_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>,
+                                  <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> *props</code></em>);</pre>
 <p>Sets the segment properties of the buffer, a shortcut for calling
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-direction" title="hb_buffer_set_direction ()"><code class="function">hb_buffer_set_direction()</code></a>, <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> and
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-language" title="hb_buffer_set_language ()"><code class="function">hb_buffer_set_language()</code></a> individually.</p>
@@ -1633,12 +1616,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"><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"><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>
@@ -1650,10 +1633,10 @@ hb_buffer_set_segment_properties (<em class="parameter"><code><a class="link" hr
 <div class="refsect2">
 <a name="hb-buffer-get-segment-properties"></a><h3>hb_buffer_get_segment_properties ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_get_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#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-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>);</pre>
+hb_buffer_get_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>,
+                                  <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> *props</code></em>);</pre>
 <p>Sets <em class="parameter"><code>props</code></em>
- to the <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> of <em class="parameter"><code>buffer</code></em>
+ to 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 <em class="parameter"><code>buffer</code></em>
 .</p>
 <div class="refsect3">
 <a name="hb-buffer-get-segment-properties.parameters"></a><h4>Parameters</h4>
@@ -1666,12 +1649,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"><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"><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>
@@ -1683,7 +1666,7 @@ hb_buffer_get_segment_properties (<em class="parameter"><code><a class="link" hr
 <div class="refsect2">
 <a name="hb-buffer-guess-segment-properties"></a><h3>hb_buffer_guess_segment_properties ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_guess_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+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>
@@ -1712,7 +1695,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"><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>
@@ -1723,8 +1706,8 @@ it is called.  See documentation for that function for details.</p>
 <div class="refsect2">
 <a name="hb-buffer-set-unicode-funcs"></a><h3>hb_buffer_set_unicode_funcs ()</h3>
 <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"><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"><span class="type">hb_unicode_funcs_t</span></a> *unicode_funcs</code></em>);</pre>
+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>
 <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">
@@ -1735,7 +1718,7 @@ hb_buffer_set_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"><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>
@@ -1745,8 +1728,8 @@ hb_buffer_set_unicode_funcs (<em class="parameter"><code><a class="link" href="h
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+<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>
 <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">
@@ -1757,7 +1740,7 @@ 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"><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>
@@ -1768,8 +1751,8 @@ hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-buffer-set-user-data"></a><h3>hb_buffer_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_buffer_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+hb_buffer_set_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>,
                          <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>
@@ -1784,7 +1767,7 @@ hb_buffer_set_user_data (<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"><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>
@@ -1795,8 +1778,8 @@ hb_buffer_set_user_data (<em class="parameter"><code><a class="link" href="harfb
 <div class="refsect2">
 <a name="hb-buffer-get-user-data"></a><h3>hb_buffer_get_user_data ()</h3>
 <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"><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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+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><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>
@@ -1808,7 +1791,7 @@ hb_buffer_get_user_data (<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"><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>
@@ -1819,7 +1802,7 @@ hb_buffer_get_user_data (<em class="parameter"><code><a class="link" href="harfb
 <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> *
-hb_buffer_get_glyph_infos (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+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>
  glyph information array.  Returned pointer
@@ -1836,7 +1819,7 @@ 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"><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>
@@ -1859,8 +1842,8 @@ The value valid as long as buffer has not been modified. </p>
 <hr>
 <div class="refsect2">
 <a name="hb-buffer-get-glyph-positions"></a><h3>hb_buffer_get_glyph_positions ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t"><span class="returnvalue">hb_glyph_position_t</span></a> *
-hb_buffer_get_glyph_positions (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+<pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t" title="hb_glyph_position_t"><span class="returnvalue">hb_glyph_position_t</span></a> *
+hb_buffer_get_glyph_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>,
                                <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
 <p>Returns <em class="parameter"><code>buffer</code></em>
  glyph position array.  Returned pointer
@@ -1877,7 +1860,7 @@ 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"><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>
@@ -1901,7 +1884,7 @@ The value valid as long as buffer has not been modified. </p>
 <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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+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>
 <p>See <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-invisible-glyph" title="hb_buffer_set_invisible_glyph ()"><code class="function">hb_buffer_set_invisible_glyph()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-invisible-glyph.parameters"></a><h4>Parameters</h4>
@@ -1913,7 +1896,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"><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>
@@ -1929,7 +1912,7 @@ invisible <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="h
 <div class="refsect2">
 <a name="hb-buffer-set-invisible-glyph"></a><h3>hb_buffer_set_invisible_glyph ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_set_invisible_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_set_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>,
                                <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> invisible</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 invisible characters in
 the shaping result.  If set to zero (default), the glyph for the
@@ -1946,7 +1929,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"><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>
@@ -1963,7 +1946,7 @@ verbatim.</p>
 <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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+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>,
                                      <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> replacement</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 invalid entries for a given encoding
 when adding text to <em class="parameter"><code>buffer</code></em>
@@ -1980,7 +1963,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"><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>
@@ -1997,7 +1980,7 @@ when adding text to <em class="parameter"><code>buffer</code></em>
 <div class="refsect2">
 <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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-buffer-get-replacement-codepoint.parameters"></a><h4>Parameters</h4>
@@ -2009,7 +1992,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"><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>
@@ -2025,7 +2008,7 @@ replacement <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title=
 <div class="refsect2">
 <a name="hb-buffer-normalize-glyphs"></a><h3>hb_buffer_normalize_glyphs ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_normalize_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+hb_buffer_normalize_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>);</pre>
 <p>Reorders a glyph buffer to have canonical in-cluster glyph order / position.
 The resulting clusters should behave identical to pre-reordering clusters.</p>
 <div class="note">This has nothing to do with Unicode normalization.</div>
@@ -2039,7 +2022,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"><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>
@@ -2050,7 +2033,7 @@ The resulting clusters should behave identical to pre-reordering clusters.</p>
 <div class="refsect2">
 <a name="hb-buffer-reverse"></a><h3>hb_buffer_reverse ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_reverse (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+hb_buffer_reverse (<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>Reverses buffer contents.</p>
 <div class="refsect3">
 <a name="hb-buffer-reverse.parameters"></a><h4>Parameters</h4>
@@ -2062,7 +2045,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"><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>
@@ -2073,7 +2056,7 @@ hb_buffer_reverse (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <div class="refsect2">
 <a name="hb-buffer-reverse-range"></a><h3>hb_buffer_reverse_range ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_reverse_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+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>
@@ -2088,7 +2071,7 @@ 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"><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>
@@ -2110,7 +2093,7 @@ hb_buffer_reverse_range (<em class="parameter"><code><a class="link" href="harfb
 <div class="refsect2">
 <a name="hb-buffer-reverse-clusters"></a><h3>hb_buffer_reverse_clusters ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_reverse_clusters (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
+hb_buffer_reverse_clusters (<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>Reverses buffer clusters.  That is, the buffer contents are
 reversed, then each cluster (consecutive items having the
 same cluster number) are reversed again.</p>
@@ -2124,7 +2107,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"><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>
@@ -2135,13 +2118,13 @@ same cluster number) are reversed again.</p>
 <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"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+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>,
                             <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"><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> *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>
@@ -2149,7 +2132,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.11.48.5"></a><h4>text</h4>
+<a name="id-1.3.4.3.7.48.5"></a><h4>text</h4>
 <p>A human-readable, plain text format.
 The serialized glyphs will look something like:</p>
 <p><code class="literal">
@@ -2164,10 +2147,10 @@ The serialized glyphs will look something like:</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-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"><span class="type">hb_glyph_position_t</span></a> in the format:</p>
+<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; ">
-<li class="listitem"><p>If both <span class="type">hb_glyph_position_t.x_offset</span> and <span class="type">hb_glyph_position_t.y_offset</span> are not 0, <code class="literal">@x_offset,y_offset</code>. Then,</p></li>
-<li class="listitem"><p><code class="literal">+x_advance</code>, then <code class="literal">,y_advance</code> if <span class="type">hb_glyph_position_t.y_advance</span> is not 0. Then,</p></li>
+<li class="listitem"><p>If both <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> and <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> are not 0, <code class="literal">@x_offset,y_offset</code>. Then,</p></li>
+<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
@@ -2178,7 +2161,7 @@ The serialized glyphs will look something like:</p>
 </ul></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.4.3.11.48.6"></a><h4>json</h4>
+<a name="id-1.3.4.3.7.48.6"></a><h4>json</h4>
 <p>TODO.</p>
 </div>
 <div class="refsect3">
@@ -2192,7 +2175,7 @@ The serialized glyphs will look something like:</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"><span class="type">hb_buffer_t</span></a> 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>
@@ -2221,14 +2204,14 @@ write serialized buffer into. </p></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>
+<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>
 . </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>
 </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"><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_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>
 </tr>
 <tr>
@@ -2255,11 +2238,11 @@ to serialize.</p></td>
 <div class="refsect2">
 <a name="hb-buffer-deserialize-glyphs"></a><h3>hb_buffer_deserialize_glyphs ()</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_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_deserialize_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>,
                               <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-font.html#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> *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>
 <div class="refsect3">
 <a name="hb-buffer-deserialize-glyphs.parameters"></a><h4>Parameters</h4>
@@ -2272,7 +2255,7 @@ hb_buffer_deserialize_glyphs (<em class="parameter"><code><a class="link" href="
 <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"><span class="type">hb_buffer_t</span></a> 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>
@@ -2318,7 +2301,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 <code class="literal">NULL</code> terminated</p></td>
+, 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>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -2336,7 +2319,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 <code class="literal">NULL</code> if it is not a valid
+ 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
 <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>
@@ -2355,7 +2338,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 <code class="literal">NULL</code> terminated string corresponding to <em class="parameter"><code>format</code></em>
+<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>
 . 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>
@@ -2378,9 +2361,9 @@ hb_buffer_serialize_list_formats (<em class="parameter"><code><span class="type"
 <div class="refsect2">
 <a name="hb-segment-properties-equal"></a><h3>hb_segment_properties_equal ()</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_segment_properties_equal (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *a</code></em>,
-                             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *b</code></em>);</pre>
-<p>Checks the equality of two <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a>'s.</p>
+hb_segment_properties_equal (<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> *a</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> *b</code></em>);</pre>
+<p>Checks the equality of two <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>'s.</p>
 <div class="refsect3">
 <a name="hb-segment-properties-equal.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2392,12 +2375,12 @@ hb_segment_properties_equal (<em class="parameter"><code>const <a class="link" h
 <tbody>
 <tr>
 <td class="parameter_name"><p>a</p></td>
-<td class="parameter_description"><p>first <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> to compare.</p></td>
+<td class="parameter_description"><p>first <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 compare.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>b</p></td>
-<td class="parameter_description"><p>second <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> to compare.</p></td>
+<td class="parameter_description"><p>second <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 compare.</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
@@ -2415,7 +2398,7 @@ equal those of <em class="parameter"><code>b</code></em>
 <div class="refsect2">
 <a name="hb-segment-properties-hash"></a><h3>hb_segment_properties_hash ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *p</code></em>);</pre>
+hb_segment_properties_hash (<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> *p</code></em>);</pre>
 <p>Creates a hash representing <em class="parameter"><code>p</code></em>
 .</p>
 <div class="refsect3">
@@ -2428,7 +2411,7 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 </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"><span class="type">hb_segment_properties_t</span></a> to hash.</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 hash.</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -2444,8 +2427,8 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" 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"><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"><span class="type">hb_buffer_t</span></a> *reference</code></em>,
+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>
@@ -2489,7 +2472,7 @@ callers if just comparing two buffers is needed.</p>
 <div class="refsect2">
 <a name="hb-buffer-set-message-func"></a><h3>hb_buffer_set_message_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_buffer_set_message_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+hb_buffer_set_message_func (<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-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>
@@ -2504,7 +2487,7 @@ 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"><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>
@@ -2549,8 +2532,8 @@ hb_glyph_info_get_glyph_flags (<em class="parameter"><code>const <span class="ty
 <div class="refsect2">
 <a name="hb-buffer-message-func-t"></a><h3>hb_buffer_message_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_buffer_message_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
-                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<span class="c_punctuation">(</span>*hb_buffer_message_func_t<span class="c_punctuation">)</span> (<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-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>
 </div>
@@ -2625,7 +2608,7 @@ and output glyphs and their information after shaping.</p>
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-glyph-position-t-struct"></a><h3>hb_glyph_position_t</h3>
+<a name="hb-glyph-position-t"></a><h3>hb_glyph_position_t</h3>
 <pre class="programlisting">typedef struct {
   hb_position_t  x_advance;
   hb_position_t  y_advance;
@@ -2633,9 +2616,9 @@ and output glyphs and their information after shaping.</p>
   hb_position_t  y_offset;
 } hb_glyph_position_t;
 </pre>
-<p>The <a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t"><span class="type">hb_glyph_position_t</span></a> is the structure that holds the positions of the
+<p>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> is the structure that holds the positions of the
 glyph in both horizontal and vertical directions. All positions in
-<a class="link" href="harfbuzz-hb-buffer.html#hb-glyph-position-t"><span class="type">hb_glyph_position_t</span></a> are relative to the current point.</p>
+<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> are relative to the current point.</p>
 <div class="refsect3">
 <a name="hb-glyph-position-t.members"></a><h4>Members</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2646,25 +2629,25 @@ glyph in both horizontal and vertical directions. All positions in
 </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-position-t-struct.x-advance"></a>x_advance</code></em>;</p></td>
+<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-position-t.x-advance"></a>x_advance</code></em>;</p></td>
 <td class="struct_member_description"><p>how much the line advances after drawing this glyph when setting
 text in horizontal direction.</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-position-t-struct.y-advance"></a>y_advance</code></em>;</p></td>
+<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-position-t.y-advance"></a>y_advance</code></em>;</p></td>
 <td class="struct_member_description"><p>how much the line advances after drawing this glyph when setting
 text in vertical direction.</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-position-t-struct.x-offset"></a>x_offset</code></em>;</p></td>
+<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-position-t.x-offset"></a>x_offset</code></em>;</p></td>
 <td class="struct_member_description"><p>how much the glyph moves on the X-axis before drawing it, this
 should not affect how much the line advances.</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-position-t-struct.y-offset"></a>y_offset</code></em>;</p></td>
+<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-position-t.y-offset"></a>y_offset</code></em>;</p></td>
 <td class="struct_member_description"><p>how much the glyph moves on the Y-axis before drawing it, this
 should not affect how much the line advances.</p></td>
 <td class="struct_member_annotations"> </td>
@@ -2733,9 +2716,9 @@ should not affect how much the line advances.</p></td>
 <td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-BOT:CAPS"></a>HB_BUFFER_FLAG_BOT</p></td>
 <td class="enum_member_description">
 <p>flag indicating that special handling of the beginning
-                     of text paragraph can be applied to this buffer. Should usually
-                     be set, unless you are passing to the buffer only part
-                     of the text without the full context.</p>
+of text paragraph can be applied to this buffer. Should usually
+be set, unless you are passing to the buffer only part
+of the text without the full context.</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -2743,8 +2726,8 @@ should not affect how much the line advances.</p></td>
 <td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-EOT:CAPS"></a>HB_BUFFER_FLAG_EOT</p></td>
 <td class="enum_member_description">
 <p>flag indicating that special handling of the end of text
-                     paragraph can be applied to this buffer, similar to
-                     <em class="parameter"><code>HB_BUFFER_FLAG_BOT</code></em>
+paragraph can be applied to this buffer, similar to
+<em class="parameter"><code>HB_BUFFER_FLAG_BOT</code></em>
 .</p>
 </td>
 <td class="enum_member_annotations"> </td>
@@ -2752,12 +2735,12 @@ should not affect how much the line advances.</p></td>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-PRESERVE-DEFAULT-IGNORABLES:CAPS"></a>HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES</p></td>
 <td class="enum_member_description">
-<p>                     flag indication that character with Default_Ignorable
-                     Unicode property should use the corresponding glyph
-                     from the font, instead of hiding them (done by
-                     replacing them with the space glyph and zeroing the
-                     advance width.)  This flag takes precedence over
-                     <em class="parameter"><code>HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES</code></em>
+<p>flag indication that character with Default_Ignorable
+Unicode property should use the corresponding glyph
+from the font, instead of hiding them (done by
+replacing them with the space glyph and zeroing the
+advance width.)  This flag takes precedence over
+<em class="parameter"><code>HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES</code></em>
 .</p>
 </td>
 <td class="enum_member_annotations"> </td>
@@ -2765,22 +2748,22 @@ should not affect how much the line advances.</p></td>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-REMOVE-DEFAULT-IGNORABLES:CAPS"></a>HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES</p></td>
 <td class="enum_member_description">
-<p>                     flag indication that character with Default_Ignorable
-                     Unicode property should be removed from glyph string
-                     instead of hiding them (done by replacing them with the
-                     space glyph and zeroing the advance width.)
-                     <em class="parameter"><code>HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES</code></em>
+<p>flag indication that character with Default_Ignorable
+Unicode property should be removed from glyph string
+instead of hiding them (done by replacing them with the
+space glyph and zeroing the advance width.)
+<em class="parameter"><code>HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES</code></em>
  takes
-                     precedence over this flag. Since: 1.8.0</p>
+precedence over this flag. Since: 1.8.0</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-BUFFER-FLAG-DO-NOT-INSERT-DOTTED-CIRCLE:CAPS"></a>HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE</p></td>
 <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>
+<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>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -2805,7 +2788,7 @@ should not affect how much the line advances.</p></td>
 <td class="enum_member_name"><p><a name="HB-BUFFER-CLUSTER-LEVEL-MONOTONE-GRAPHEMES:CAPS"></a>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES</p></td>
 <td class="enum_member_description">
 <p>Return cluster values grouped by graphemes into
-  monotone order.</p>
+monotone order.</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -2827,7 +2810,7 @@ should not affect how much the line advances.</p></td>
 <td class="enum_member_name"><p><a name="HB-BUFFER-CLUSTER-LEVEL-DEFAULT:CAPS"></a>HB_BUFFER_CLUSTER_LEVEL_DEFAULT</p></td>
 <td class="enum_member_description">
 <p>Default cluster level,
-  equal to <em class="parameter"><code>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES</code></em>
+equal to <em class="parameter"><code>HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES</code></em>
 .</p>
 </td>
 <td class="enum_member_annotations"> </td>
@@ -2839,14 +2822,14 @@ should not affect how much the line advances.</p></td>
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-segment-properties-t-struct"></a><h3>hb_segment_properties_t</h3>
+<a name="hb-segment-properties-t"></a><h3>hb_segment_properties_t</h3>
 <pre class="programlisting">typedef struct {
   hb_direction_t  direction;
   hb_script_t     script;
   hb_language_t   language;
 } hb_segment_properties_t;
 </pre>
-<p>The structure that holds various text properties of an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>. Can be
+<p>The structure that holds various text properties of an <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t" title="hb_buffer_t"><span class="type">hb_buffer_t</span></a>. Can be
 set and retrieved using <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-segment-properties" title="hb_buffer_set_segment_properties ()"><code class="function">hb_buffer_set_segment_properties()</code></a> and
 <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-get-segment-properties" title="hb_buffer_get_segment_properties ()"><code class="function">hb_buffer_get_segment_properties()</code></a>, respectively.</p>
 <div class="refsect3">
@@ -2859,17 +2842,17 @@ set and retrieved using <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-
 </colgroup>
 <tbody>
 <tr>
-<td class="struct_member_name"><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> <em class="structfield"><code><a name="hb-segment-properties-t-struct.direction"></a>direction</code></em>;</p></td>
+<td class="struct_member_name"><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> <em class="structfield"><code><a name="hb-segment-properties-t.direction"></a>direction</code></em>;</p></td>
 <td class="struct_member_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> of the buffer, see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-direction" title="hb_buffer_set_direction ()"><code class="function">hb_buffer_set_direction()</code></a>.</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-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> <em class="structfield"><code><a name="hb-segment-properties-t-struct.script"></a>script</code></em>;</p></td>
+<td class="struct_member_name"><p><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> <em class="structfield"><code><a name="hb-segment-properties-t.script"></a>script</code></em>;</p></td>
 <td class="struct_member_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> of the buffer, 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></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-segment-properties-t-struct.language"></a>language</code></em>;</p></td>
+<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-segment-properties-t.language"></a>language</code></em>;</p></td>
 <td class="struct_member_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> of the buffer, see <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-set-language" title="hb_buffer_set_language ()"><code class="function">hb_buffer_set_language()</code></a>.</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
@@ -2976,7 +2959,7 @@ set and retrieved using <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-
 <td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FLAG-NO-ADVANCES:CAPS"></a>HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES</p></td>
 <td class="enum_member_description">
 <p>do not serialize glyph advances,
- glyph offsets will reflect absolute glyph positions. Since: 1.8.0</p>
+glyph offsets will reflect absolute glyph positions. Since: 1.8.0</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -3049,6 +3032,6 @@ set and retrieved using <a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 9e6e597..b754d4a 100644 (file)
@@ -5,21 +5,20 @@
 <title>hb-common: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.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.29 (XML mode)">
+<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-common.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-common.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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>
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-common.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </tbody>
 </table></div>
 </div>
-<a name="hb-feature-t"></a><a name="hb-user-data-key-t"></a><div class="refsect1">
+<div class="refsect1">
 <a name="harfbuzz-hb-common.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </tr>
 <tr>
 <td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-feature-t-struct" title="hb_feature_t">hb_feature_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t">hb_feature_t</a></td>
 </tr>
 <tr>
 <td class="datatype_keyword"> </td>
 </tr>
 <tr>
 <td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t-struct" title="hb_user_data_key_t">hb_user_data_key_t</a></td>
+<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>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-common.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
-    <span class="lineart">├──</span> hb_feature_t
-    <span class="lineart">╰──</span> hb_user_data_key_t
-    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
-    <span class="lineart">├──</span> hb_direction_t
-    <span class="lineart">╰──</span> hb_script_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-common.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb.h&gt;
 </pre>
@@ -406,7 +395,7 @@ hb_direction_to_string (<em class="parameter"><code><a class="link" href="harfbu
 <a name="hb-script-from-iso15924-tag"></a><h3>hb_script_from_iso15924_tag ()</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_script_from_iso15924_tag (<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 an ISO 15924 script tag to a corresponding <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>Converts an ISO 15924 script tag to a corresponding <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-script-from-iso15924-tag.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -417,14 +406,14 @@ hb_script_from_iso15924_tag (<em class="parameter"><code><a class="link" href="h
 </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> representing an ISO 15924 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> representing an ISO 15924 tag.</p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-script-from-iso15924-tag.returns"></a><h4>Returns</h4>
-<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> corresponding to the ISO 15924 tag.</p>
+<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> corresponding to the ISO 15924 tag.</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>
@@ -435,7 +424,7 @@ hb_script_from_iso15924_tag (<em class="parameter"><code><a class="link" href="h
 hb_script_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 <em class="parameter"><code>str</code></em>
- representing an ISO 15924 script tag to a
+ representing an ISO 15924 script tag to a
 corresponding <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a>. Shorthand for <a class="link" href="harfbuzz-hb-common.html#hb-tag-from-string" title="hb_tag_from_string ()"><code class="function">hb_tag_from_string()</code></a> then
 <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>
 <div class="refsect3">
@@ -450,13 +439,13 @@ corresponding <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="
 <tr>
 <td class="parameter_name"><p>str</p></td>
 <td class="parameter_description"><p>a string representing an
-ISO 15924 tag. </p></td>
+ISO 15924 tag. </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 the <em class="parameter"><code>str</code></em>
-, or -1 if it is <code class="literal">NULL</code>-terminated.</p></td>
+, 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_annotations"> </td>
 </tr>
 </tbody>
@@ -464,7 +453,7 @@ ISO 15924 tag. </p></td>
 </div>
 <div class="refsect3">
 <a name="hb-script-from-string.returns"></a><h4>Returns</h4>
-<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> corresponding to the ISO 15924 tag.</p>
+<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> corresponding to the ISO 15924 tag.</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>
@@ -491,7 +480,7 @@ hb_script_to_iso15924_tag (<em class="parameter"><code><a class="link" href="har
 </div>
 <div class="refsect3">
 <a name="hb-script-to-iso15924-tag.returns"></a><h4>Returns</h4>
-<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> representing an ISO 15924 script tag.</p>
+<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> representing an ISO 15924 script tag.</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>
@@ -509,7 +498,7 @@ hb_script_get_horizontal_direction (<em class="parameter"><code><a class="link"
 hb_language_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 <em class="parameter"><code>str</code></em>
- representing a BCP 47 language tag to the corresponding
+ representing a BCP 47 language tag to the corresponding
 <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-language-from-string.parameters"></a><h4>Parameters</h4>
@@ -523,13 +512,13 @@ hb_language_from_string (<em class="parameter"><code>const <span class="type">ch
 <tr>
 <td class="parameter_name"><p>str</p></td>
 <td class="parameter_description"><p>a string representing
-a BCP 47 language tag. </p></td>
+a BCP 47 language tag. </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 the <em class="parameter"><code>str</code></em>
-, or -1 if it is <code class="literal">NULL</code>-terminated.</p></td>
+, 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_annotations"> </td>
 </tr>
 </tbody>
@@ -537,7 +526,7 @@ a BCP 47 language tag. </p></td>
 </div>
 <div class="refsect3">
 <a name="hb-language-from-string.returns"></a><h4>Returns</h4>
-<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 the BCP 47 language tag. </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 the BCP 47 language tag. </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>
@@ -565,7 +554,7 @@ hb_language_to_string (<em class="parameter"><code><a class="link" href="harfbuz
 </div>
 <div class="refsect3">
 <a name="hb-language-to-string.returns"></a><h4>Returns</h4>
-<p>A <code class="literal">NULL</code>-terminated string representing the <em class="parameter"><code>language</code></em>
+<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>
 . 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>
@@ -597,8 +586,8 @@ HarfBuzz itself.</p>
 <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_feature_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-feature-t"><span class="type">hb_feature_t</span></a> *feature</code></em>);</pre>
-<p>Parses a string into a <a class="link" href="harfbuzz-hb-common.html#hb-feature-t"><span class="type">hb_feature_t</span></a>.</p>
+                        <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>);</pre>
+<p>Parses a string into a <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a>.</p>
 <p>The format for specifying feature strings follows. All valid CSS
 font-feature-settings values other than 'normal' and the global values are
 also accepted, though not documented below. CSS string escapes are not
@@ -753,12 +742,12 @@ 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 <code class="literal">NULL</code> terminated</p></td>
+, 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>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>feature</p></td>
-<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-common.html#hb-feature-t"><span class="type">hb_feature_t</span></a> to initialize with the parsed values. </p></td>
+<td class="parameter_description"><p>the <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_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>
@@ -775,10 +764,10 @@ is successfully parsed, <code class="literal">false</code> otherwise.</p>
 <div class="refsect2">
 <a name="hb-feature-to-string"></a><h3>hb_feature_to_string ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_feature_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *feature</code></em>,
+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"><span class="type">hb_feature_t</span></a> into a <code class="literal">NULL</code>-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 <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
 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>
@@ -793,7 +782,7 @@ allocating big enough size for <em class="parameter"><code>buf</code></em>
 <tbody>
 <tr>
 <td class="parameter_name"><p>feature</p></td>
-<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-feature-t"><span class="type">hb_feature_t</span></a> to convert</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> to convert</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -957,7 +946,7 @@ hb_variation_to_string (<em class="parameter"><code><a class="link" href="harfbu
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-feature-t-struct"></a><h3>hb_feature_t</h3>
+<a name="hb-feature-t"></a><h3>hb_feature_t</h3>
 <pre class="programlisting">typedef struct {
   hb_tag_t      tag;
   uint32_t      value;
@@ -965,7 +954,7 @@ hb_variation_to_string (<em class="parameter"><code><a class="link" href="harfbu
   unsigned int  end;
 } hb_feature_t;
 </pre>
-<p>The <a class="link" href="harfbuzz-hb-common.html#hb-feature-t"><span class="type">hb_feature_t</span></a> is the structure that holds information about requested
+<p>The <a class="link" href="harfbuzz-hb-common.html#hb-feature-t" title="hb_feature_t"><span class="type">hb_feature_t</span></a> 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 <em class="parameter"><code>start</code></em>
  (inclusive) and <em class="parameter"><code>end</code></em>
@@ -984,12 +973,12 @@ specifies that the feature always applies to the entire buffer.</p>
 </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-feature-t-struct.tag"></a>tag</code></em>;</p></td>
+<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_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-struct.value"></a>value</code></em>;</p></td>
+<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
@@ -997,12 +986,12 @@ based index into the alternates.</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-feature-t-struct.start"></a>start</code></em>;</p></td>
+<td class="struct_member_name"><p>unsigned <span class="type">int</span> <em class="structfield"><code><a name="hb-feature-t.start"></a>start</code></em>;</p></td>
 <td class="struct_member_description"><p>the cluster to start applying this feature setting (inclusive).</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-feature-t-struct.end"></a>end</code></em>;</p></td>
+<td class="struct_member_name"><p>unsigned <span class="type">int</span> <em class="structfield"><code><a name="hb-feature-t.end"></a>end</code></em>;</p></td>
 <td class="struct_member_description"><p>the cluster to end applying this feature setting (exclusive).</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
@@ -1076,6 +1065,11 @@ based index into the alternates.</p></td>
 <td> </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>
+</tr>
+<tr>
 <td class="enum_member_name"><p><a name="HB-SCRIPT-INVALID:CAPS"></a>HB_SCRIPT_INVALID</p></td>
 <td> </td>
 <td> </td>
@@ -1096,7 +1090,7 @@ based index into the alternates.</p></td>
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-user-data-key-t-struct"></a><h3>hb_user_data_key_t</h3>
+<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>
@@ -1146,6 +1140,6 @@ based index into the alternates.</p></td>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 3235a3a..5554484 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-coretext: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch14.html" title="Integration API">
-<link rel="prev" href="ch14.html" title="Integration API">
+<link rel="up" href="ch15.html" title="Integration API">
+<link rel="prev" href="ch15.html" title="Integration API">
 <link rel="next" href="harfbuzz-hb-ft.html" title="hb-ft">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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">
@@ -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="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="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="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">
 <a name="harfbuzz-hb-coretext.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<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"><span class="returnvalue">hb_face_t</span></a> *
+<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-coretext.html#hb-coretext-face-create" title="hb_coretext_face_create ()">hb_coretext_face_create</a> <span class="c_punctuation">()</span>
@@ -49,7 +49,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-font-create" title="hb_coretext_font_create ()">hb_coretext_font_create</a> <span class="c_punctuation">()</span>
@@ -78,8 +78,8 @@
 <a name="harfbuzz-hb-coretext.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 <a name="harfbuzz-hb-coretext.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="hb-coretext-face-create"></a><h3>hb_coretext_face_create ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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_coretext_face_create (<em class="parameter"><code><span class="type">CGFontRef</span> cg_font</code></em>);</pre>
+<p>Creates an <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object from the specified
+CGFontRef.</p>
+<div class="refsect3">
+<a name="hb-coretext-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>cg_font</p></td>
+<td class="parameter_description"><p>The CGFontRef to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-coretext-face-create.returns"></a><h4>Returns</h4>
+<p> the new <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object</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-coretext-font-create"></a><h3>hb_coretext_font_create ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<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_coretext_font_create (<em class="parameter"><code><span class="type">CTFontRef</span> ct_font</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
+CTFontRef.</p>
+<div class="refsect3">
+<a name="hb-coretext-font-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>ct_font</p></td>
+<td class="parameter_description"><p>The CTFontRef to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<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>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-coretext-face-get-cg-font"></a><h3>hb_coretext_face_get_cg_font ()</h3>
 <pre class="programlisting"><span class="returnvalue">CGFontRef</span>
-hb_coretext_face_get_cg_font (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+hb_coretext_face_get_cg_font (<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 CGFontRef associated with an <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a>
+face object</p>
+<div class="refsect3">
+<a name="hb-coretext-face-get-cg-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>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 upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-coretext-face-get-cg-font.returns"></a><h4>Returns</h4>
+<p> the CGFontRef 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>
 <hr>
 <div class="refsect2">
 <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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+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>
 </div>
 </div>
 <div class="refsect1">
@@ -138,22 +204,36 @@ hb_coretext_font_get_ct_font (<em class="parameter"><code><a class="link" href="
 <a name="HB-CORETEXT-TAG-KERX:CAPS"></a><h3>HB_CORETEXT_TAG_KERX</h3>
 <pre class="programlisting">#define HB_CORETEXT_TAG_KERX HB_TAG('k','e','r','x')
 </pre>
+<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 for the <code class="literal">kerx</code> (extended kerning) table, which
+holds AAT kerning information. </p>
+<p>For more information, see
+
+https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6kerx.html</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-CORETEXT-TAG-MORT:CAPS"></a><h3>HB_CORETEXT_TAG_MORT</h3>
 <pre class="programlisting">#define HB_CORETEXT_TAG_MORT HB_TAG('m','o','r','t')
 </pre>
+<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 for the <code class="literal">mort</code> (glyph metamorphosis) table,
+which holds AAT features. </p>
+<p>For more information, see
+
+https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6mort.html</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-CORETEXT-TAG-MORX:CAPS"></a><h3>HB_CORETEXT_TAG_MORX</h3>
 <pre class="programlisting">#define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x')
 </pre>
+<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 for the <code class="literal">morx</code> (extended glyph metamorphosis)
+table, which holds AAT features. </p>
+<p>For more information, see
+https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6morx.html</p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 2ad43b9..f15cda5 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-deprecated: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.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.29 (XML mode)">
+<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">
@@ -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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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>
@@ -35,8 +35,8 @@
 <a name="harfbuzz-hb-deprecated.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </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-eastasian-width-func-t" title="hb_unicode_eastasian_width_func_t ()">*hb_unicode_eastasian_width_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">
+<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">
 <span class="returnvalue">void</span>
 </td>
@@ -78,8 +92,8 @@
 <a name="harfbuzz-hb-deprecated.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -128,7 +142,7 @@ were deemed unnecessary.</p>
 <div class="refsect2">
 <a name="hb-font-get-glyph-func-t"></a><h3>hb_font_get_glyph_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_font_get_glyph_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<span class="c_punctuation">(</span>*hb_font_get_glyph_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> 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>,
@@ -140,7 +154,7 @@ were deemed unnecessary.</p>
 <div class="refsect2">
 <a name="hb-ot-layout-table-find-script"></a><h3>hb_ot_layout_table_find_script ()</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_table_find_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_table_find_script (<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><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> script_tag</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> *script_index</code></em>);</pre>
@@ -157,7 +171,7 @@ or GPOS table.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -185,10 +199,77 @@ or GPOS table.</p>
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-unicode-eastasian-width-func-t"></a><h3>hb_unicode_eastasian_width_func_t ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+<span class="c_punctuation">(</span>*hb_unicode_eastasian_width_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>
+<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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="hb-unicode-decompose-compatibility-func-t"></a><h3>hb_unicode_decompose_compatibility_func_t ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+<span class="c_punctuation">(</span>*hb_unicode_decompose_compatibility_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> 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>,
+                                <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_unicode_decompose_compatibility_func_t</code> has been deprecated since version 2.0.0 and should not be used in newly-written code.</p></div>
+<p>Fully decompose <em class="parameter"><code>u</code></em>
+ to its Unicode compatibility decomposition. The codepoints of the decomposition will be written to <em class="parameter"><code>decomposed</code></em>
+.
+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
+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>
+<div class="refsect3">
+<a name="hb-unicode-decompose-compatibility-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 function structure</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>u</p></td>
+<td class="parameter_description"><p>codepoint to decompose</p></td>
+<td class="parameter_annotations"> </td>
+</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_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_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-unicode-decompose-compatibility-func-t.returns"></a><h4>Returns</h4>
+<p> number of codepoints in the full compatibility decomposition of <em class="parameter"><code>u</code></em>
+, or 0 if no decomposition available.</p>
+</div>
+</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
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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-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> 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>
@@ -221,7 +302,7 @@ hb_font_funcs_set_glyph_v_kerning_func
 <div class="refsect2">
 <a name="hb-font-get-glyph-v-kerning"></a><h3>hb_font_get_glyph_v_kerning ()</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_font_get_glyph_v_kerning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_glyph_v_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> 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>
@@ -298,6 +379,6 @@ hb_font_get_glyph_v_kerning (<em class="parameter"><code><a class="link" href="h
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index b5ecebe..f3f615d 100644 (file)
@@ -5,21 +5,20 @@
 <title>hb-face: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.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.29 (XML mode)">
+<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-face.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-face.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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>
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-face.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -49,7 +48,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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-face.html#hb-face-create" title="hb_face_create ()">hb_face_create</a> <span class="c_punctuation">()</span>
@@ -57,7 +56,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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-face.html#hb-face-create-for-tables" title="hb_face_create_for_tables ()">hb_face_create_for_tables</a> <span class="c_punctuation">()</span>
@@ -73,7 +72,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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-face.html#hb-face-get-empty" title="hb_face_get_empty ()">hb_face_get_empty</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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-face.html#hb-face-reference" title="hb_face_reference ()">hb_face_reference</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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-face.html#hb-face-reference-blob" title="hb_face_reference_blob ()">hb_face_reference_blob</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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-face.html#hb-face-reference-table" title="hb_face_reference_table ()">hb_face_reference_table</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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-face.html#hb-face-builder-create" title="hb_face_builder_create ()">hb_face_builder_create</a> <span class="c_punctuation">()</span>
 </tbody>
 </table></div>
 </div>
-<a name="hb-face-t"></a><div class="refsect1">
+<div class="refsect1">
 <a name="harfbuzz-hb-face.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody><tr>
 <td class="typedef_keyword">typedef</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-face.html#hb-face-t">hb_face_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t">hb_face_t</a></td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-face.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
-    <span class="lineart">╰──</span> hb_face_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-face.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb.h&gt;
 </pre>
@@ -266,7 +259,7 @@ Font faces are used to create fonts.</p>
 <div class="refsect2">
 <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"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-face-count.parameters"></a><h4>Parameters</h4>
@@ -293,8 +286,8 @@ hb_face_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blo
 <hr>
 <div class="refsect2">
 <a name="hb-face-create"></a><h3>hb_face_create ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#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"><span class="type">hb_blob_t</span></a> *blob</code></em>,
+<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><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
@@ -307,7 +300,7 @@ hb_face_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-bl
 <hr>
 <div class="refsect2">
 <a name="hb-face-create-for-tables"></a><h3>hb_face_create_for_tables ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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_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>
@@ -336,7 +329,7 @@ hb_face_create_for_tables (<em class="parameter"><code><a class="link" href="har
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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><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>
@@ -358,7 +351,7 @@ hb_face_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-f
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_face_t</span></a> *
+<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>
 <div class="refsect3">
 <a name="hb-face-get-empty.returns"></a><h4>Returns</h4>
@@ -370,7 +363,7 @@ hb_face_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <div class="refsect2">
 <a name="hb-face-get-table-tags"></a><h3>hb_face_get_table_tags ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_face_get_table_tags (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_face_get_table_tags (<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>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>
@@ -418,7 +411,7 @@ array, output number of items written.</p></td>
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 <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">
@@ -440,7 +433,7 @@ hb_face_get_glyph_count (<em class="parameter"><code>const <a class="link" href=
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-face-get-index.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -462,7 +455,7 @@ hb_face_get_index (<em class="parameter"><code>const <a class="link" href="harfb
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-face-get-upem.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -484,8 +477,8 @@ hb_face_get_upem (<em class="parameter"><code>const <a class="link" href="harfbu
 <div class="refsect2">
 <a name="hb-face-get-user-data"></a><h3>hb_face_get_user_data ()</h3>
 <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"><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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+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><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>
@@ -513,7 +506,7 @@ hb_face_get_user_data (<em class="parameter"><code>const <a class="link" href="h
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-face-is-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -535,7 +528,7 @@ hb_face_is_immutable (<em class="parameter"><code>const <a class="link" href="ha
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-face-make-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -556,8 +549,8 @@ hb_face_make_immutable (<em class="parameter"><code><a class="link" href="harfbu
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<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><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>
@@ -579,8 +572,8 @@ hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<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>
 <div class="refsect3">
 <a name="hb-face-reference-blob.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -606,8 +599,8 @@ hb_face_reference_blob (<em class="parameter"><code><a class="link" href="harfbu
 <hr>
 <div class="refsect2">
 <a name="hb-face-reference-table"></a><h3>hb_face_reference_table ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#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"><span class="type">hb_face_t</span></a> *face</code></em>,
+<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>
 <div class="refsect3">
 <a name="hb-face-reference-table.parameters"></a><h4>Parameters</h4>
@@ -635,7 +628,7 @@ hb_face_reference_table (<em class="parameter"><code>const <a class="link" href=
 <div class="refsect2">
 <a name="hb-face-set-glyph-count"></a><h3>hb_face_set_glyph_count ()</h3>
 <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"><span class="type">hb_face_t</span></a> *face</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-face-set-glyph-count.parameters"></a><h4>Parameters</h4>
@@ -658,7 +651,7 @@ hb_face_set_glyph_count (<em class="parameter"><code><a class="link" href="harfb
 <div class="refsect2">
 <a name="hb-face-set-index"></a><h3>hb_face_set_index ()</h3>
 <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"><span class="type">hb_face_t</span></a> *face</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-face-set-index.parameters"></a><h4>Parameters</h4>
@@ -681,7 +674,7 @@ hb_face_set_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <div class="refsect2">
 <a name="hb-face-set-upem"></a><h3>hb_face_set_upem ()</h3>
 <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"><span class="type">hb_face_t</span></a> *face</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-face-set-upem.parameters"></a><h4>Parameters</h4>
@@ -704,8 +697,8 @@ hb_face_set_upem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-face-set-user-data"></a><h3>hb_face_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_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+hb_face_set_user_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>,
+                       <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>
@@ -731,8 +724,8 @@ hb_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <div class="refsect2">
 <a name="hb-face-collect-unicodes"></a><h3>hb_face_collect_unicodes ()</h3>
 <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"><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"><span class="type">hb_set_t</span></a> *out</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-face-collect-unicodes.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -762,8 +755,8 @@ to.</p></td>
 <div class="refsect2">
 <a name="hb-face-collect-variation-selectors"></a><h3>hb_face_collect_variation_selectors ()</h3>
 <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"><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"><span class="type">hb_set_t</span></a> *out</code></em>);</pre>
+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>
 <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">
@@ -793,9 +786,9 @@ to.</p></td>
 <div class="refsect2">
 <a name="hb-face-collect-variation-unicodes"></a><h3>hb_face_collect_variation_unicodes ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_face_collect_variation_unicodes (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+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"><span class="type">hb_set_t</span></a> *out</code></em>);</pre>
+                                    <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>
 <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">
@@ -825,9 +818,9 @@ to.</p></td>
 <hr>
 <div class="refsect2">
 <a name="hb-face-builder-create"></a><h3>hb_face_builder_create ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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_builder_create (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>Creates a <a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> that can be used with <a class="link" href="harfbuzz-hb-face.html#hb-face-builder-add-table" title="hb_face_builder_add_table ()"><code class="function">hb_face_builder_add_table()</code></a>.
+<p>Creates a <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> that can be used with <a class="link" href="harfbuzz-hb-face.html#hb-face-builder-add-table" title="hb_face_builder_add_table ()"><code class="function">hb_face_builder_add_table()</code></a>.
 After tables are added to the face, it can be compiled to a binary
 font file by calling <a class="link" href="harfbuzz-hb-face.html#hb-face-reference-blob" title="hb_face_reference_blob ()"><code class="function">hb_face_reference_blob()</code></a>.</p>
 <div class="refsect3">
@@ -841,9 +834,9 @@ font file by calling <a class="link" href="harfbuzz-hb-face.html#hb-face-referen
 <div class="refsect2">
 <a name="hb-face-builder-add-table"></a><h3>hb_face_builder_add_table ()</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_builder_add_table (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_face_builder_add_table (<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><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
+                           <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>Add table for <em class="parameter"><code>tag</code></em>
  with data provided by <em class="parameter"><code>blob</code></em>
  to the face.  <em class="parameter"><code>face</code></em>
@@ -862,6 +855,6 @@ be created using <a class="link" href="harfbuzz-hb-face.html#hb-face-builder-cre
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 4cc59b3..0ec95ad 100644 (file)
@@ -5,21 +5,20 @@
 <title>hb-font: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.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.29 (XML mode)">
+<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-font.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-font.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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>
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-font.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -50,7 +49,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-font.html#hb-font-create" title="hb_font_create ()">hb_font_create</a> <span class="c_punctuation">()</span>
@@ -58,7 +57,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
@@ -74,7 +73,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-create" title="hb_font_funcs_create ()">hb_font_funcs_create</a> <span class="c_punctuation">()</span>
@@ -90,7 +89,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-reference" title="hb_font_funcs_reference ()">hb_font_funcs_reference</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-font.html#hb-font-get-empty" title="hb_font_get_empty ()">hb_font_get_empty</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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-font.html#hb-font-get-face" title="hb_font_get_face ()">hb_font_get_face</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-font.html#hb-font-get-nominal-glyphs-func-t" title="hb_font_get_nominal_glyphs_func_t ()">*hb_font_get_nominal_glyphs_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-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-font.html#hb-font-get-parent" title="hb_font_get_parent ()">hb_font_get_parent</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
+<td class="function_type">const <span class="returnvalue">float</span> *
+</td>
+<td class="function_name">
+<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> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
 <td class="function_type">const <span class="returnvalue">int</span> *
 </td>
 <td class="function_name">
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-font.html#hb-font-reference" title="hb_font_reference ()">hb_font_reference</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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">
 <span class="c_punctuation">(</span><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><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
 </tbody>
 </table></div>
 </div>
-<a name="hb-font-funcs-t"></a><a name="hb-font-t"></a><div class="refsect1">
+<div class="refsect1">
 <a name="harfbuzz-hb-font.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 <td class="typedef_keyword">typedef</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t">hb_font_funcs_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t" title="hb_font_funcs_t">hb_font_funcs_t</a></td>
 </tr>
 <tr>
 <td class="typedef_keyword">typedef</td>
 </tr>
 <tr>
 <td class="typedef_keyword">typedef</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-t">hb_font_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t">hb_font_t</a></td>
 </tr>
 <tr>
 <td class="typedef_keyword">typedef</td>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-font.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
-    <span class="lineart">├──</span> hb_font_funcs_t
-    <span class="lineart">╰──</span> hb_font_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-font.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb.h&gt;
 </pre>
@@ -841,7 +847,7 @@ Fonts are created from font faces, and are used as input to
 <a name="hb-font-add-glyph-origin-for-direction"></a><h3>hb_font_add_glyph_origin_for_direction ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_add_glyph_origin_for_direction
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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> *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><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>,
@@ -878,8 +884,8 @@ hb_font_add_glyph_origin_for_direction
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+<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><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-font-create.parameters"></a><h4>Parameters</h4>
@@ -906,8 +912,8 @@ hb_font_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fa
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_font_t</span></a> *parent</code></em>);</pre>
+<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>
 <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">
@@ -934,7 +940,7 @@ hb_font_create_sub_font (<em class="parameter"><code><a class="link" href="harfb
 <div class="refsect2">
 <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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+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><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>
@@ -956,7 +962,7 @@ hb_font_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-f
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_font_funcs_t</span></a> *
+<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><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
@@ -970,7 +976,7 @@ hb_font_funcs_create (<em class="parameter"><code><span class="type">void</span>
 <div class="refsect2">
 <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"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+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><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>
@@ -992,7 +998,7 @@ hb_font_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuz
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_font_funcs_t</span></a> *
+<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>
 <div class="refsect3">
 <a name="hb-font-funcs-get-empty.returns"></a><h4>Returns</h4>
@@ -1005,8 +1011,8 @@ hb_font_funcs_get_empty (<em class="parameter"><code><span class="type">void</sp
 <div class="refsect2">
 <a name="hb-font-funcs-get-user-data"></a><h3>hb_font_funcs_get_user_data ()</h3>
 <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"><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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+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><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>
@@ -1034,7 +1040,7 @@ hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <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"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+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>
 <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">
@@ -1056,7 +1062,7 @@ hb_font_funcs_is_immutable (<em class="parameter"><code><a class="link" href="ha
 <div class="refsect2">
 <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"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+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>
 <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">
@@ -1077,8 +1083,8 @@ hb_font_funcs_make_immutable (<em class="parameter"><code><a class="link" href="
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
+<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><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>
@@ -1102,7 +1108,7 @@ hb_font_funcs_reference (<em class="parameter"><code><a class="link" href="harfb
 <a name="hb-font-funcs-set-glyph-contour-point-func"></a><h3>hb_font_funcs_set_glyph_contour_point_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_set_glyph_contour_point_func
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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-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>
@@ -1134,7 +1140,7 @@ hb_font_funcs_set_glyph_contour_point_func
 <div class="refsect2">
 <a name="hb-font-funcs-set-glyph-extents-func"></a><h3>hb_font_funcs_set_glyph_extents_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_funcs_set_glyph_extents_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+hb_font_funcs_set_glyph_extents_func (<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-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>
@@ -1167,7 +1173,7 @@ hb_font_funcs_set_glyph_extents_func (<em class="parameter"><code><a class="link
 <a name="hb-font-funcs-set-glyph-from-name-func"></a><h3>hb_font_funcs_set_glyph_from_name_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_set_glyph_from_name_func
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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-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>
@@ -1200,7 +1206,7 @@ hb_font_funcs_set_glyph_from_name_func
 <a name="hb-font-funcs-set-glyph-h-advance-func"></a><h3>hb_font_funcs_set_glyph_h_advance_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_set_glyph_h_advance_func
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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-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>
@@ -1233,7 +1239,7 @@ hb_font_funcs_set_glyph_h_advance_func
 <a name="hb-font-funcs-set-glyph-h-advances-func"></a><h3>hb_font_funcs_set_glyph_h_advances_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_set_glyph_h_advances_func
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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-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>
@@ -1266,7 +1272,7 @@ hb_font_funcs_set_glyph_h_advances_func
 <a name="hb-font-funcs-set-glyph-h-kerning-func"></a><h3>hb_font_funcs_set_glyph_h_kerning_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_set_glyph_h_kerning_func
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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-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>
@@ -1298,7 +1304,7 @@ hb_font_funcs_set_glyph_h_kerning_func
 <div class="refsect2">
 <a name="hb-font-funcs-set-glyph-h-origin-func"></a><h3>hb_font_funcs_set_glyph_h_origin_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_funcs_set_glyph_h_origin_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+hb_font_funcs_set_glyph_h_origin_func (<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-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>
@@ -1330,7 +1336,7 @@ hb_font_funcs_set_glyph_h_origin_func (<em class="parameter"><code><a class="lin
 <div class="refsect2">
 <a name="hb-font-funcs-set-glyph-name-func"></a><h3>hb_font_funcs_set_glyph_name_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_funcs_set_glyph_name_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+hb_font_funcs_set_glyph_name_func (<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-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>
@@ -1363,7 +1369,7 @@ hb_font_funcs_set_glyph_name_func (<em class="parameter"><code><a class="link" h
 <a name="hb-font-funcs-set-glyph-v-advance-func"></a><h3>hb_font_funcs_set_glyph_v_advance_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_set_glyph_v_advance_func
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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-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>
@@ -1396,7 +1402,7 @@ hb_font_funcs_set_glyph_v_advance_func
 <a name="hb-font-funcs-set-glyph-v-advances-func"></a><h3>hb_font_funcs_set_glyph_v_advances_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_set_glyph_v_advances_func
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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-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>
@@ -1428,7 +1434,7 @@ hb_font_funcs_set_glyph_v_advances_func
 <div class="refsect2">
 <a name="hb-font-funcs-set-glyph-v-origin-func"></a><h3>hb_font_funcs_set_glyph_v_origin_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_funcs_set_glyph_v_origin_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+hb_font_funcs_set_glyph_v_origin_func (<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-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>
@@ -1460,7 +1466,7 @@ hb_font_funcs_set_glyph_v_origin_func (<em class="parameter"><code><a class="lin
 <div class="refsect2">
 <a name="hb-font-funcs-set-nominal-glyph-func"></a><h3>hb_font_funcs_set_nominal_glyph_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_funcs_set_nominal_glyph_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+hb_font_funcs_set_nominal_glyph_func (<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-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>
@@ -1492,8 +1498,8 @@ hb_font_funcs_set_nominal_glyph_func (<em class="parameter"><code><a class="link
 <div class="refsect2">
 <a name="hb-font-funcs-set-nominal-glyphs-func"></a><h3>hb_font_funcs_set_nominal_glyphs_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_funcs_set_nominal_glyphs_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
-                                       <em class="parameter"><code><span class="type">hb_font_get_nominal_glyphs_func_t</span> func</code></em>,
+hb_font_funcs_set_nominal_glyphs_func (<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-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>
 <div class="refsect3">
@@ -1524,8 +1530,8 @@ hb_font_funcs_set_nominal_glyphs_func (<em class="parameter"><code><a class="lin
 <div class="refsect2">
 <a name="hb-font-funcs-set-user-data"></a><h3>hb_font_funcs_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_funcs_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+hb_font_funcs_set_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>,
                              <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>
@@ -1552,7 +1558,7 @@ hb_font_funcs_set_user_data (<em class="parameter"><code><a class="link" href="h
 <a name="hb-font-funcs-set-variation-glyph-func"></a><h3>hb_font_funcs_set_variation_glyph_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_set_variation_glyph_func
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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-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>
@@ -1583,7 +1589,7 @@ hb_font_funcs_set_variation_glyph_func
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_font_t</span></a> *
+<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>
 <div class="refsect3">
 <a name="hb-font-get-empty.returns"></a><h4>Returns</h4>
@@ -1594,8 +1600,8 @@ hb_font_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<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>
 <div class="refsect3">
 <a name="hb-font-get-face.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1622,7 +1628,7 @@ hb_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-font-get-glyph"></a><h3>hb_font_get_glyph ()</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_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_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> 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>
@@ -1655,7 +1661,7 @@ hb_font_get_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <a name="hb-font-get-glyph-advance-for-direction"></a><h3>hb_font_get_glyph_advance_for_direction ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_get_glyph_advance_for_direction
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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> *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><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>,
@@ -1693,7 +1699,7 @@ hb_font_get_glyph_advance_for_direction
 <div class="refsect2">
 <a name="hb-font-get-glyph-advance-func-t"></a><h3>hb_font_get_glyph_advance_func_t ()</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>
-<span class="c_punctuation">(</span>*hb_font_get_glyph_advance_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<span class="c_punctuation">(</span>*hb_font_get_glyph_advance_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">void</span> *user_data</code></em>);</pre>
@@ -1703,7 +1709,7 @@ hb_font_get_glyph_advance_for_direction
 <a name="hb-font-get-glyph-advances-for-direction"></a><h3>hb_font_get_glyph_advances_for_direction ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_get_glyph_advances_for_direction
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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> *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>unsigned <span class="type">int</span> count</code></em>,
                                 <em class="parameter"><code>const <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>,
@@ -1731,7 +1737,7 @@ hb_font_get_glyph_advances_for_direction
 <div class="refsect2">
 <a name="hb-font-get-glyph-advances-func-t"></a><h3>hb_font_get_glyph_advances_func_t ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-<span class="c_punctuation">(</span>*hb_font_get_glyph_advances_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<span class="c_punctuation">(</span>*hb_font_get_glyph_advances_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>unsigned <span class="type">int</span> count</code></em>,
                                       <em class="parameter"><code>const <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>,
@@ -1744,7 +1750,7 @@ hb_font_get_glyph_advances_for_direction
 <div class="refsect2">
 <a name="hb-font-get-glyph-contour-point"></a><h3>hb_font_get_glyph_contour_point ()</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_glyph_contour_point (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_glyph_contour_point (<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>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>,
@@ -1783,7 +1789,7 @@ hb_font_get_glyph_contour_point (<em class="parameter"><code><a class="link" hre
 <a name="hb-font-get-glyph-contour-point-for-origin"></a><h3>hb_font_get_glyph_contour_point_for_origin ()</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_glyph_contour_point_for_origin
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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> *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>unsigned <span class="type">int</span> point_index</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>,
@@ -1823,7 +1829,7 @@ hb_font_get_glyph_contour_point_for_origin
 <a name="hb-font-get-glyph-contour-point-func-t"></a><h3>hb_font_get_glyph_contour_point_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_font_get_glyph_contour_point_func_t<span class="c_punctuation">)</span>
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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> *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>unsigned <span class="type">int</span> point_index</code></em>,
@@ -1835,7 +1841,7 @@ hb_font_get_glyph_contour_point_for_origin
 <div class="refsect2">
 <a name="hb-font-get-glyph-extents"></a><h3>hb_font_get_glyph_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_glyph_extents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
@@ -1866,7 +1872,7 @@ hb_font_get_glyph_extents (<em class="parameter"><code><a class="link" href="har
 <div class="refsect2">
 <a name="hb-font-get-glyph-extents-for-origin"></a><h3>hb_font_get_glyph_extents_for_origin ()</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_glyph_extents_for_origin (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
@@ -1898,7 +1904,7 @@ hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link
 <div class="refsect2">
 <a name="hb-font-get-glyph-extents-func-t"></a><h3>hb_font_get_glyph_extents_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_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"><span class="type">hb_font_t</span></a> *font</code></em>,
+<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>,
@@ -1908,7 +1914,7 @@ hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link
 <div class="refsect2">
 <a name="hb-font-get-glyph-from-name"></a><h3>hb_font_get_glyph_from_name ()</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_glyph_from_name (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_glyph_from_name (<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> *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>
@@ -1945,16 +1951,18 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-font-get-glyph-from-name-func-t"></a><h3>hb_font_get_glyph_from_name_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_font_get_glyph_from_name_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<span class="c_punctuation">(</span>*hb_font_get_glyph_from_name_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>const <span class="type">char</span> *name</code></em>,
-                                       <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
+                                       <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>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-font-get-glyph-h-advance"></a><h3>hb_font_get_glyph_h_advance ()</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_font_get_glyph_h_advance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-font-get-glyph-h-advance.parameters"></a><h4>Parameters</h4>
@@ -1977,7 +1985,7 @@ hb_font_get_glyph_h_advance (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-font-get-glyph-h-advances"></a><h3>hb_font_get_glyph_h_advances ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_get_glyph_h_advances (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_glyph_h_advances (<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> count</code></em>,
                               <em class="parameter"><code>const <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><span class="type">unsigned </span> glyph_stride</code></em>,
@@ -2004,7 +2012,7 @@ hb_font_get_glyph_h_advances (<em class="parameter"><code><a class="link" href="
 <div class="refsect2">
 <a name="hb-font-get-glyph-h-kerning"></a><h3>hb_font_get_glyph_h_kerning ()</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_font_get_glyph_h_kerning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
@@ -2028,7 +2036,7 @@ hb_font_get_glyph_h_kerning (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-font-get-glyph-h-origin"></a><h3>hb_font_get_glyph_h_origin ()</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_glyph_h_origin (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_glyph_h_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-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>
@@ -2066,7 +2074,7 @@ hb_font_get_glyph_h_origin (<em class="parameter"><code><a class="link" href="ha
 <a name="hb-font-get-glyph-kerning-for-direction"></a><h3>hb_font_get_glyph_kerning_for_direction ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_get_glyph_kerning_for_direction
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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> *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> 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><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>,
@@ -2105,7 +2113,7 @@ hb_font_get_glyph_kerning_for_direction
 <div class="refsect2">
 <a name="hb-font-get-glyph-kerning-func-t"></a><h3>hb_font_get_glyph_kerning_func_t ()</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>
-<span class="c_punctuation">(</span>*hb_font_get_glyph_kerning_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<span class="c_punctuation">(</span>*hb_font_get_glyph_kerning_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> 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>,
@@ -2115,7 +2123,7 @@ hb_font_get_glyph_kerning_for_direction
 <div class="refsect2">
 <a name="hb-font-get-glyph-name"></a><h3>hb_font_get_glyph_name ()</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_glyph_name (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_glyph_name (<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">char</span> *name</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
@@ -2147,7 +2155,7 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
 <div class="refsect2">
 <a name="hb-font-get-glyph-name-func-t"></a><h3>hb_font_get_glyph_name_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_font_get_glyph_name_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<span class="c_punctuation">(</span>*hb_font_get_glyph_name_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">char</span> *name</code></em>,
@@ -2159,7 +2167,7 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
 <a name="hb-font-get-glyph-origin-for-direction"></a><h3>hb_font_get_glyph_origin_for_direction ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_get_glyph_origin_for_direction
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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> *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><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>,
@@ -2197,7 +2205,7 @@ hb_font_get_glyph_origin_for_direction
 <div class="refsect2">
 <a name="hb-font-get-glyph-origin-func-t"></a><h3>hb_font_get_glyph_origin_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_font_get_glyph_origin_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<span class="c_punctuation">(</span>*hb_font_get_glyph_origin_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><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>,
@@ -2208,7 +2216,7 @@ hb_font_get_glyph_origin_for_direction
 <div class="refsect2">
 <a name="hb-font-get-glyph-v-advance"></a><h3>hb_font_get_glyph_v_advance ()</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_font_get_glyph_v_advance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-font-get-glyph-v-advance.parameters"></a><h4>Parameters</h4>
@@ -2231,7 +2239,7 @@ hb_font_get_glyph_v_advance (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-font-get-glyph-v-advances"></a><h3>hb_font_get_glyph_v_advances ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_get_glyph_v_advances (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_glyph_v_advances (<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> count</code></em>,
                               <em class="parameter"><code>const <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><span class="type">unsigned </span> glyph_stride</code></em>,
@@ -2258,7 +2266,7 @@ hb_font_get_glyph_v_advances (<em class="parameter"><code><a class="link" href="
 <div class="refsect2">
 <a name="hb-font-get-glyph-v-origin"></a><h3>hb_font_get_glyph_v_origin ()</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_glyph_v_origin (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_glyph_v_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-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>
@@ -2295,7 +2303,7 @@ hb_font_get_glyph_v_origin (<em class="parameter"><code><a class="link" href="ha
 <div class="refsect2">
 <a name="hb-font-get-nominal-glyph"></a><h3>hb_font_get_nominal_glyph ()</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_nominal_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
@@ -2326,7 +2334,7 @@ hb_font_get_nominal_glyph (<em class="parameter"><code><a class="link" href="har
 <div class="refsect2">
 <a name="hb-font-get-nominal-glyph-func-t"></a><h3>hb_font_get_nominal_glyph_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_font_get_nominal_glyph_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<span class="c_punctuation">(</span>*hb_font_get_nominal_glyph_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> 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>,
@@ -2336,7 +2344,7 @@ hb_font_get_nominal_glyph (<em class="parameter"><code><a class="link" href="har
 <div class="refsect2">
 <a name="hb-font-get-nominal-glyphs"></a><h3>hb_font_get_nominal_glyphs ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_font_get_nominal_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_nominal_glyphs (<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> count</code></em>,
                             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first_unicode</code></em>,
                             <em class="parameter"><code>unsigned <span class="type">int</span> unicode_stride</code></em>,
@@ -2361,9 +2369,22 @@ hb_font_get_nominal_glyphs (<em class="parameter"><code><a class="link" href="ha
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-font-get-nominal-glyphs-func-t"></a><h3>hb_font_get_nominal_glyphs_func_t ()</h3>
+<pre class="programlisting">unsigned <span class="returnvalue">int</span>
+<span class="c_punctuation">(</span>*hb_font_get_nominal_glyphs_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>unsigned <span class="type">int</span> count</code></em>,
+                                      <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *first_unicode</code></em>,
+                                      <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>,
+                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
+</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"><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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<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>
 <div class="refsect3">
 <a name="hb-font-get-parent.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2390,7 +2411,7 @@ hb_font_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <div class="refsect2">
 <a name="hb-font-get-ppem"></a><h3>hb_font_get_ppem ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_get_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
@@ -2426,7 +2447,7 @@ hb_font_get_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-font-get-ptem.parameters"></a><h4>Parameters</h4>
@@ -2453,7 +2474,7 @@ hb_font_get_ptem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-font-get-scale"></a><h3>hb_font_get_scale ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_get_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
@@ -2489,8 +2510,8 @@ hb_font_get_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <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"><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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+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><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>
@@ -2518,7 +2539,7 @@ hb_font_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <div class="refsect2">
 <a name="hb-font-get-variation-glyph"></a><h3>hb_font_get_variation_glyph ()</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_variation_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_get_variation_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> 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>
@@ -2550,7 +2571,7 @@ hb_font_get_variation_glyph (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-font-get-variation-glyph-func-t"></a><h3>hb_font_get_variation_glyph_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_font_get_variation_glyph_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<span class="c_punctuation">(</span>*hb_font_get_variation_glyph_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> 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>,
@@ -2559,9 +2580,19 @@ hb_font_get_variation_glyph (<em class="parameter"><code><a class="link" href="h
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-font-get-var-coords-design"></a><h3>hb_font_get_var_coords_design ()</h3>
+<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>Return value is valid as long as variation coordinates of the font
+are not modified.</p>
+<p class="since">Since: EXPERIMENTAL</p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-font-get-var-coords-normalized"></a><h3>hb_font_get_var_coords_normalized ()</h3>
 <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"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>Return value is valid as long as variation coordinates of the font
 are not modified.</p>
@@ -2571,7 +2602,7 @@ are not modified.</p>
 <div class="refsect2">
 <a name="hb-font-glyph-from-string"></a><h3>hb_font_glyph_from_string ()</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_glyph_from_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_glyph_from_string (<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> *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>
@@ -2608,7 +2639,7 @@ hb_font_glyph_from_string (<em class="parameter"><code><a class="link" href="har
 <div class="refsect2">
 <a name="hb-font-glyph-to-string"></a><h3>hb_font_glyph_to_string ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_glyph_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_glyph_to_string (<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">char</span> *s</code></em>,
                          <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
@@ -2640,7 +2671,7 @@ hb_font_glyph_to_string (<em class="parameter"><code><a class="link" href="harfb
 <div class="refsect2">
 <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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-font-is-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2662,7 +2693,7 @@ hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 <div class="refsect2">
 <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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-font-make-immutable.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -2683,8 +2714,8 @@ hb_font_make_immutable (<em class="parameter"><code><a class="link" href="harfbu
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+<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><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>
@@ -2712,8 +2743,8 @@ hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <div class="refsect2">
 <a name="hb-font-set-face"></a><h3>hb_font_set_face ()</h3>
 <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"><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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 <div class="refsect3">
@@ -2744,8 +2775,8 @@ hb_font_set_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-font-set-funcs"></a><h3>hb_font_set_funcs ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-funcs-t"><span class="type">hb_font_funcs_t</span></a> *klass</code></em>,
+hb_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>,
+                   <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>
 <div class="refsect3">
@@ -2776,7 +2807,7 @@ hb_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <div class="refsect2">
 <a name="hb-font-set-funcs-data"></a><h3>hb_font_set_funcs_data ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_set_funcs_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
@@ -2807,8 +2838,8 @@ hb_font_set_funcs_data (<em class="parameter"><code><a class="link" href="harfbu
 <div class="refsect2">
 <a name="hb-font-set-parent"></a><h3>hb_font_set_parent ()</h3>
 <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"><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"><span class="type">hb_font_t</span></a> *parent</code></em>);</pre>
+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>
 <div class="refsect3">
@@ -2839,7 +2870,7 @@ hb_font_set_parent (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <div class="refsect2">
 <a name="hb-font-set-ppem"></a><h3>hb_font_set_ppem ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_set_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
@@ -2863,7 +2894,7 @@ hb_font_set_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-font-set-ptem"></a><h3>hb_font_set_ptem ()</h3>
 <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"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
@@ -2895,7 +2926,7 @@ hb_font_set_ptem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-font-set-scale"></a><h3>hb_font_set_scale ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_set_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
@@ -2919,8 +2950,8 @@ hb_font_set_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <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"><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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+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>,
+                       <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>
@@ -2946,7 +2977,7 @@ hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <div class="refsect2">
 <a name="hb-font-set-variations"></a><h3>hb_font_set_variations ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_set_variations (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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 class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
@@ -2955,7 +2986,7 @@ hb_font_set_variations (<em class="parameter"><code><a class="link" href="harfbu
 <div class="refsect2">
 <a name="hb-font-set-var-coords-design"></a><h3>hb_font_set_var_coords_design ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_set_var_coords_design (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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 class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
@@ -2964,7 +2995,7 @@ hb_font_set_var_coords_design (<em class="parameter"><code><a class="link" href=
 <div class="refsect2">
 <a name="hb-font-set-var-coords-normalized"></a><h3>hb_font_set_var_coords_normalized ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_set_var_coords_normalized (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+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 class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
@@ -2973,7 +3004,7 @@ hb_font_set_var_coords_normalized (<em class="parameter"><code><a class="link" h
 <div class="refsect2">
 <a name="hb-font-set-var-named-instance"></a><h3>hb_font_set_var_named_instance ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_set_var_named_instance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_font_set_var_named_instance (<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">unsigned </span> instance_index</code></em>);</pre>
 <p>Sets design coords of a font from a named instance index.</p>
 <div class="refsect3">
@@ -3005,7 +3036,7 @@ hb_font_set_var_named_instance (<em class="parameter"><code><a class="link" href
 <a name="hb-font-subtract-glyph-origin-for-direction"></a><h3>hb_font_subtract_glyph_origin_for_direction ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_subtract_glyph_origin_for_direction
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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> *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><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>,
@@ -3042,8 +3073,8 @@ hb_font_subtract_glyph_origin_for_direction
 <hr>
 <div class="refsect2">
 <a name="hb-reference-table-func-t"></a><h3>hb_reference_table_func_t ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
-<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"><span class="type">hb_face_t</span></a> *face</code></em>,
+<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> *
+<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>
 </div>
@@ -3051,7 +3082,7 @@ hb_font_subtract_glyph_origin_for_direction
 <div class="refsect2">
 <a name="hb-font-funcs-set-font-h-extents-func"></a><h3>hb_font_funcs_set_font_h_extents_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_funcs_set_font_h_extents_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+hb_font_funcs_set_font_h_extents_func (<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-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>
@@ -3083,7 +3114,7 @@ hb_font_funcs_set_font_h_extents_func (<em class="parameter"><code><a class="lin
 <div class="refsect2">
 <a name="hb-font-funcs-set-font-v-extents-func"></a><h3>hb_font_funcs_set_font_v_extents_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_font_funcs_set_font_v_extents_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
+hb_font_funcs_set_font_v_extents_func (<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-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>
@@ -3115,7 +3146,7 @@ hb_font_funcs_set_font_v_extents_func (<em class="parameter"><code><a class="lin
 <div class="refsect2">
 <a name="hb-font-get-extents-for-direction"></a><h3>hb_font_get_extents_for_direction ()</h3>
 <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"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
@@ -3146,7 +3177,7 @@ hb_font_get_extents_for_direction (<em class="parameter"><code><a class="link" h
 <div class="refsect2">
 <a name="hb-font-get-font-extents-func-t"></a><h3>hb_font_get_font_extents_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_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"><span class="type">hb_font_t</span></a> *font</code></em>,
+<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><span class="type">void</span> *user_data</code></em>);</pre>
@@ -3155,7 +3186,7 @@ hb_font_get_extents_for_direction (<em class="parameter"><code><a class="link" h
 <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"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-font-get-h-extents.parameters"></a><h4>Parameters</h4>
@@ -3185,7 +3216,7 @@ hb_font_get_h_extents (<em class="parameter"><code><a class="link" href="harfbuz
 <div class="refsect2">
 <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"><span class="type">hb_font_t</span></a> *font</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-font-get-v-extents.parameters"></a><h4>Parameters</h4>
@@ -3282,6 +3313,6 @@ hb_font_get_v_extents (<em class="parameter"><code><a class="link" href="harfbuz
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 06884b7..ae3cf07 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-ft: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch14.html" title="Integration API">
+<link rel="up" href="ch15.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.29 (XML mode)">
+<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">
@@ -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="ch14.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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-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>
 <a name="harfbuzz-hb-ft.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<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"><span class="returnvalue">hb_face_t</span></a> *
+<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-ft.html#hb-ft-face-create" title="hb_ft_face_create ()">hb_ft_face_create</a> <span class="c_punctuation">()</span>
@@ -49,7 +49,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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-ft.html#hb-ft-face-create-cached" title="hb_ft_face_create_cached ()">hb_ft_face_create_cached</a> <span class="c_punctuation">()</span>
@@ -57,7 +57,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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-ft.html#hb-ft-face-create-referenced" title="hb_ft_face_create_referenced ()">hb_ft_face_create_referenced</a> <span class="c_punctuation">()</span>
@@ -65,7 +65,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create" title="hb_ft_font_create ()">hb_ft_font_create</a> <span class="c_punctuation">()</span>
@@ -73,7 +73,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<a class="link" href="harfbuzz-hb-font.html#hb-font-t" title="hb_font_t"><span class="returnvalue">hb_font_t</span></a> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">FT_Face</span>
+</td>
+<td class="function_name">
+<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> <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-ft.html#hb-ft-font-unlock-face" title="hb_ft_font_unlock_face ()">hb_ft_font_unlock_face</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ft.description"></a><h2>Description</h2>
-<p>Functions for using HarfBuzz with the FreeType library to provide face and
+<p>Functions for using HarfBuzz with the FreeType library.</p>
+<p>HarfBuzz supports using FreeType to provide face and
 font data.</p>
+<div class="note">Note that FreeType is not thread-safe, therefore these
+functions are not thread-safe either.</div>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ft.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="hb-ft-face-create"></a><h3>hb_ft_face_create ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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_ft_face_create (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</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 an <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object from the specified FT_Face.</p>
+<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-face-create-referenced" title="hb_ft_face_create_referenced ()"><code class="function">hb_ft_face_create_referenced()</code></a>
+(or, perhaps, <a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create-cached" title="hb_ft_face_create_cached ()"><code class="function">hb_ft_face_create_cached()</code></a>) instead. </p>
+<p>If you know you have valid reasons not to use <a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create-referenced" title="hb_ft_face_create_referenced ()"><code class="function">hb_ft_face_create_referenced()</code></a>,
+then it is the client program's responsibility to destroy <em class="parameter"><code>ft_face</code></em>
+after the <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object has been destroyed.</p>
 <div class="refsect3">
 <a name="hb-ft-face-create.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -147,16 +174,23 @@ hb_ft_face_create (<em class="parameter"><code><span class="type">FT_Face</span>
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>ft_face</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>FT_Face to work upon. </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></tbody>
+</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>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-ft-face-create.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>the new <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> 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>
@@ -164,11 +198,38 @@ hb_ft_face_create (<em class="parameter"><code><span class="type">FT_Face</span>
 <hr>
 <div class="refsect2">
 <a name="hb-ft-face-create-cached"></a><h3>hb_ft_face_create_cached ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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_ft_face_create_cached (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>);</pre>
+<p>Creates an <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object from the specified FT_Face.</p>
+<p>This variant of the function caches the newly created <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a>
+face object, using the <em class="parameter"><code>generic</code></em>
+ pointer of <em class="parameter"><code>ft_face</code></em>
+. Subsequent function
+calls that are passed the same <em class="parameter"><code>ft_face</code></em>
+ parameter will have the same
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> returned to them, and that <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> will be correctly
+reference counted.</p>
+<p>However, client programs are still responsible for destroying
+<em class="parameter"><code>ft_face</code></em>
+ after the last <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object has been destroyed.</p>
+<div class="refsect3">
+<a name="hb-ft-face-create-cached.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>ft_face</p></td>
+<td class="parameter_description"><p>FT_Face to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 <div class="refsect3">
 <a name="hb-ft-face-create-cached.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>the new <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> 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>
@@ -176,11 +237,35 @@ hb_ft_face_create_cached (<em class="parameter"><code><span class="type">FT_Face
 <hr>
 <div class="refsect2">
 <a name="hb-ft-face-create-referenced"></a><h3>hb_ft_face_create_referenced ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
+<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_ft_face_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-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object from the specified FT_Face.</p>
+<p>This is the preferred variant of the hb_ft_face_create*
+function family, because it calls <code class="function">FT_Reference_Face()</code> on <em class="parameter"><code>ft_face</code></em>
+,
+ensuring that <em class="parameter"><code>ft_face</code></em>
+ remains alive as long as the resulting
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object remains alive. Also calls <code class="function">FT_Done_Face()</code>
+when the <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object is destroyed.</p>
+<p>Use this version unless you know you have good reasons not to.</p>
+<div class="refsect3">
+<a name="hb-ft-face-create-referenced.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>ft_face</p></td>
+<td class="parameter_description"><p>FT_Face to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 <div class="refsect3">
 <a name="hb-ft-face-create-referenced.returns"></a><h4>Returns</h4>
-<p>. </p>
+<p>the new <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> 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-38.html#api-index-0.9.38">0.9.38</a></p>
@@ -188,9 +273,29 @@ hb_ft_face_create_referenced (<em class="parameter"><code><span class="type">FT_
 <hr>
 <div class="refsect2">
 <a name="hb-ft-font-create"></a><h3>hb_ft_font_create ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<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_ft_font_create (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</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 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>
+<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>
+<p>If you know you have valid reasons not to 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>,
+then it is the client program's responsibility to destroy <em class="parameter"><code>ft_face</code></em>
+after the <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 has been destroyed.</p>
+<p>HarfBuzz will use the <em class="parameter"><code>destroy</code></em>
+ callback 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> font object 
+if it is supplied when you use this function. However, even if <em class="parameter"><code>destroy</code></em>
+
+is provided, it is the client program's responsibility to destroy <em class="parameter"><code>ft_face</code></em>
+,
+and it is the client program's responsibility to ensure that <em class="parameter"><code>ft_face</code></em>
+ is
+destroyed only after the <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 has been destroyed.</p>
 <div class="refsect3">
 <a name="hb-ft-font-create.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -199,16 +304,23 @@ hb_ft_font_create (<em class="parameter"><code><span class="type">FT_Face</span>
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="parameter_name"><p>ft_face</p></td>
-<td class="parameter_description"><p>. </p></td>
+<td class="parameter_description"><p>FT_Face to work upon. </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></tbody>
+</tr>
+<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>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect3">
 <a name="hb-ft-font-create.returns"></a><h4>Returns</h4>
-<p>. </p>
+<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>
 <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>
@@ -216,11 +328,37 @@ hb_ft_font_create (<em class="parameter"><code><span class="type">FT_Face</span>
 <hr>
 <div class="refsect2">
 <a name="hb-ft-font-create-referenced"></a><h3>hb_ft_font_create_referenced ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
+<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_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>
+<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>
+,
+ensuring that <em class="parameter"><code>ft_face</code></em>
+ remains alive as long as the resulting
+<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 remains alive.</p>
+<p>Use this version unless you know you have good reasons not to.</p>
+<div class="refsect3">
+<a name="hb-ft-font-create-referenced.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>ft_face</p></td>
+<td class="parameter_description"><p>FT_Face to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 <div class="refsect3">
 <a name="hb-ft-font-create-referenced.returns"></a><h4>Returns</h4>
-<p>. </p>
+<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>
 <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-38.html#api-index-0.9.38">0.9.38</a></p>
@@ -229,41 +367,127 @@ hb_ft_font_create_referenced (<em class="parameter"><code><span class="type">FT_
 <div class="refsect2">
 <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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+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>
 </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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+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>
+</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>
+</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>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ft-font-set-load-flags"></a><h3>hb_ft_font_set_load_flags ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_ft_font_set_load_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_ft_font_set_load_flags (<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> load_flags</code></em>);</pre>
+<p>Sets the FT_Load_Glyph load flags for 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>.</p>
+<p>For more information, see 
+https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html<span class="type">ft_load_xxx</span></p>
+<div class="refsect3">
+<a name="hb-ft-font-set-load-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>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>load_flags</p></td>
+<td class="parameter_description"><p>The FreeType load flags to set</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-load-flags"></a><h3>hb_ft_font_get_load_flags ()</h3>
 <pre class="programlisting"><span class="returnvalue">int</span>
-hb_ft_font_get_load_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+hb_ft_font_get_load_flags (<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_Load_Glyph load flags of 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>.</p>
+<p>For more information, see 
+https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html<span class="type">ft_load_xxx</span></p>
+<div class="refsect3">
+<a name="hb-ft-font-get-load-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>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-load-flags.returns"></a><h4>Returns</h4>
+<p> FT_Load_Glyph flags found</p>
+</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-set-funcs"></a><h3>hb_ft_font_set_funcs ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_ft_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+hb_ft_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>Configures the font-functions structure of 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 to use FreeType font functions.</p>
+<p>In particular, you can use this function to configure an
+existing <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object for use with FreeType font
+functions even if that <a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object was initially
+created with <a class="link" href="harfbuzz-hb-face.html#hb-face-create" title="hb_face_create ()"><code class="function">hb_face_create()</code></a>, and therefore was not
+initially configured to use FreeType font functions.</p>
+<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> face object created with <a class="link" href="harfbuzz-hb-ft.html#hb-ft-face-create" title="hb_ft_face_create ()"><code class="function">hb_ft_face_create()</code></a>
+is preconfigured for FreeType font functions and does not
+require this function to be used.</p>
+<div class="note">Note: Internally, this function creates an FT_Face.
+</div>
+<div class="refsect3">
+<a name="hb-ft-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-1-0-5.html#api-index-1.0.5">1.0.5</a></p>
 </div>
-<div class="refsect1">
-<a name="harfbuzz-hb-ft.other_details"></a><h2>Types and Values</h2>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 2cbf3bd..4cd3eda 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-glib: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch14.html" title="Integration API">
+<link rel="up" href="ch15.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.29 (XML mode)">
+<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">
@@ -18,7 +18,7 @@
                   <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="ch14.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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-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>
 </tr></table>
 <a name="harfbuzz-hb-glib.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<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-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
@@ -49,7 +49,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<span class="returnvalue">GUnicodeScript</span>
+<a href="/usr/share/gtk-doc/html/glib/glib-Unicode-Manipulation.html#GUnicodeScript"><span class="returnvalue">GUnicodeScript</span></a>
 </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>
@@ -65,7 +65,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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-glib.html#hb-glib-blob-create" title="hb_glib_blob_create ()">hb_glib_blob_create</a> <span class="c_punctuation">()</span>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-glib.description"></a><h2>Description</h2>
-<p>Functions for using HarfBuzz with the GLib library to provide Unicode data.</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>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-glib.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="hb-glib-get-unicode-funcs"></a><h3>hb_glib_get_unicode_funcs ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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_glib_get_unicode_funcs (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches a Unicode-functions structure that is populated
+with the appropriate GLib function for each method.</p>
+<div class="refsect3">
+<a name="hb-glib-get-unicode-funcs.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-38.html#api-index-0.9.38">0.9.38</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-glib-script-from-script"></a><h3>hb_glib_script_from_script ()</h3>
-<pre class="programlisting"><span class="returnvalue">GUnicodeScript</span>
+<pre class="programlisting"><a href="/usr/share/gtk-doc/html/glib/glib-Unicode-Manipulation.html#GUnicodeScript"><span class="returnvalue">GUnicodeScript</span></a>
 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>
+<div class="refsect3">
+<a name="hb-glib-script-from-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>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-glib-script-from-script.returns"></a><h4>Returns</h4>
+<p> the GUnicodeScript identifier found</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-38.html#api-index-0.9.38">0.9.38</a></p>
 </div>
 <hr>
 <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><span class="type">GUnicodeScript</span> script</code></em>);</pre>
+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>
+<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">
+<a name="hb-glib-script-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>script</p></td>
+<td class="parameter_description"><p>The GUnicodeScript identifier to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-glib-script-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> script found</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-38.html#api-index-0.9.38">0.9.38</a></p>
 </div>
 <hr>
 <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"><span class="returnvalue">hb_blob_t</span></a> *
-hb_glib_blob_create (<em class="parameter"><code><span class="type">GBytes</span> *gbytes</code></em>);</pre>
-<p class="since">Since: <a class="link" href="api-index-0-9-38.html#api-index-0.9.38">0.9.38</a></p>
+<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>
+<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">
+<a name="hb-glib-blob-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>gbytes</p></td>
+<td class="parameter_description"><p>the GBytes structure to work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
 </div>
+<div class="refsect3">
+<a name="hb-glib-blob-create.returns"></a><h4>Returns</h4>
+<p>the new <a class="link" href="harfbuzz-hb-blob.html#hb-blob-t" title="hb_blob_t"><span class="type">hb_blob_t</span></a> blob 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-38.html#api-index-0.9.38">0.9.38</a></p>
 </div>
-<div class="refsect1">
-<a name="harfbuzz-hb-glib.other_details"></a><h2>Types and Values</h2>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index a733126..031e875 100644 (file)
@@ -5,10 +5,10 @@
 <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="ch14.html" title="Integration API">
+<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.29 (XML mode)">
+<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">
@@ -18,7 +18,7 @@
                   <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="ch14.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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</p>
+<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.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table class="informaltable" width="100%" border="0">
-<colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
-</colgroup>
-<tbody>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-blob-get-type" title="hb_gobject_blob_get_type ()">hb_gobject_blob_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-content-type-get-type" title="hb_gobject_buffer_content_type_get_type ()">hb_gobject_buffer_content_type_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-diff-flags-get-type" title="hb_gobject_buffer_diff_flags_get_type ()">hb_gobject_buffer_diff_flags_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-flags-get-type" title="hb_gobject_buffer_flags_get_type ()">hb_gobject_buffer_flags_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-get-type" title="hb_gobject_buffer_get_type ()">hb_gobject_buffer_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-flags-get-type" title="hb_gobject_buffer_serialize_flags_get_type ()">hb_gobject_buffer_serialize_flags_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-format-get-type" title="hb_gobject_buffer_serialize_format_get_type ()">hb_gobject_buffer_serialize_format_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-direction-get-type" title="hb_gobject_direction_get_type ()">hb_gobject_direction_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-face-get-type" title="hb_gobject_face_get_type ()">hb_gobject_face_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-font-funcs-get-type" title="hb_gobject_font_funcs_get_type ()">hb_gobject_font_funcs_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-font-get-type" title="hb_gobject_font_get_type ()">hb_gobject_font_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-flags-get-type" title="hb_gobject_glyph_flags_get_type ()">hb_gobject_glyph_flags_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-map-get-type" title="hb_gobject_map_get_type ()">hb_gobject_map_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-memory-mode-get-type" title="hb_gobject_memory_mode_get_type ()">hb_gobject_memory_mode_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-color-palette-flags-get-type" title="hb_gobject_ot_color_palette_flags_get_type ()">hb_gobject_ot_color_palette_flags_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-layout-glyph-class-get-type" title="hb_gobject_ot_layout_glyph_class_get_type ()">hb_gobject_ot_layout_glyph_class_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-constant-get-type" title="hb_gobject_ot_math_constant_get_type ()">hb_gobject_ot_math_constant_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-get-type" title="hb_gobject_ot_math_glyph_part_get_type ()">hb_gobject_ot_math_glyph_part_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-flags-get-type" title="hb_gobject_ot_math_glyph_part_flags_get_type ()">hb_gobject_ot_math_glyph_part_flags_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-variant-get-type" title="hb_gobject_ot_math_glyph_variant_get_type ()">hb_gobject_ot_math_glyph_variant_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-ot-math-kern-get-type" title="hb_gobject_ot_math_kern_get_type ()">hb_gobject_ot_math_kern_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-script-get-type" title="hb_gobject_script_get_type ()">hb_gobject_script_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-shape-plan-get-type" title="hb_gobject_shape_plan_get_type ()">hb_gobject_shape_plan_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-combining-class-get-type" title="hb_gobject_unicode_combining_class_get_type ()">hb_gobject_unicode_combining_class_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-funcs-get-type" title="hb_gobject_unicode_funcs_get_type ()">hb_gobject_unicode_funcs_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-unicode-general-category-get-type" title="hb_gobject_unicode_general_category_get_type ()">hb_gobject_unicode_general_category_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-buffer-cluster-level-get-type" title="hb_gobject_buffer_cluster_level_get_type ()">hb_gobject_buffer_cluster_level_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-feature-get-type" title="hb_gobject_feature_get_type ()">hb_gobject_feature_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-info-get-type" title="hb_gobject_glyph_info_get_type ()">hb_gobject_glyph_info_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-glyph-position-get-type" title="hb_gobject_glyph_position_get_type ()">hb_gobject_glyph_position_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-segment-properties-get-type" title="hb_gobject_segment_properties_get_type ()">hb_gobject_segment_properties_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-set-get-type" title="hb_gobject_set_get_type ()">hb_gobject_set_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">GType</span>
-</td>
-<td class="function_name">
-<a class="link" href="harfbuzz-hb-gobject.html#hb-gobject-user-data-key-get-type" title="hb_gobject_user_data_key_get_type ()">hb_gobject_user_data_key_get_type</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect1">
-<a name="harfbuzz-hb-gobject.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table class="informaltable" width="100%" border="0">
-<colgroup>
-<col width="150px" class="name">
-<col class="description">
-</colgroup>
-<tbody>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BLOB:CAPS" title="HB_GOBJECT_TYPE_BLOB">HB_GOBJECT_TYPE_BLOB</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER:CAPS" title="HB_GOBJECT_TYPE_BUFFER">HB_GOBJECT_TYPE_BUFFER</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CONTENT-TYPE:CAPS" title="HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE">HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-DIFF-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS">HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_FLAGS">HB_GOBJECT_TYPE_BUFFER_FLAGS</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FLAGS:CAPS" title="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS">HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FORMAT:CAPS" title="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT">HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-DIRECTION:CAPS" title="HB_GOBJECT_TYPE_DIRECTION">HB_GOBJECT_TYPE_DIRECTION</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FACE:CAPS" title="HB_GOBJECT_TYPE_FACE">HB_GOBJECT_TYPE_FACE</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT:CAPS" title="HB_GOBJECT_TYPE_FONT">HB_GOBJECT_TYPE_FONT</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT-FUNCS:CAPS" title="HB_GOBJECT_TYPE_FONT_FUNCS">HB_GOBJECT_TYPE_FONT_FUNCS</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-FLAGS:CAPS" title="HB_GOBJECT_TYPE_GLYPH_FLAGS">HB_GOBJECT_TYPE_GLYPH_FLAGS</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MAP:CAPS" title="HB_GOBJECT_TYPE_MAP">HB_GOBJECT_TYPE_MAP</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MEMORY-MODE:CAPS" title="HB_GOBJECT_TYPE_MEMORY_MODE">HB_GOBJECT_TYPE_MEMORY_MODE</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-COLOR-PALETTE-FLAGS:CAPS" title="HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS">HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-LAYOUT-GLYPH-CLASS:CAPS" title="HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS">HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-CONSTANT:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_CONSTANT">HB_GOBJECT_TYPE_OT_MATH_CONSTANT</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART">HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART-FLAGS:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS">HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-VARIANT:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT">HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-KERN:CAPS" title="HB_GOBJECT_TYPE_OT_MATH_KERN">HB_GOBJECT_TYPE_OT_MATH_KERN</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SCRIPT:CAPS" title="HB_GOBJECT_TYPE_SCRIPT">HB_GOBJECT_TYPE_SCRIPT</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SHAPE-PLAN:CAPS" title="HB_GOBJECT_TYPE_SHAPE_PLAN">HB_GOBJECT_TYPE_SHAPE_PLAN</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-COMBINING-CLASS:CAPS" title="HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS">HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-FUNCS:CAPS" title="HB_GOBJECT_TYPE_UNICODE_FUNCS">HB_GOBJECT_TYPE_UNICODE_FUNCS</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-GENERAL-CATEGORY:CAPS" title="HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY">HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CLUSTER-LEVEL:CAPS" title="HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL">HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FEATURE:CAPS" title="HB_GOBJECT_TYPE_FEATURE">HB_GOBJECT_TYPE_FEATURE</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-INFO:CAPS" title="HB_GOBJECT_TYPE_GLYPH_INFO">HB_GOBJECT_TYPE_GLYPH_INFO</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-POSITION:CAPS" title="HB_GOBJECT_TYPE_GLYPH_POSITION">HB_GOBJECT_TYPE_GLYPH_POSITION</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SEGMENT-PROPERTIES:CAPS" title="HB_GOBJECT_TYPE_SEGMENT_PROPERTIES">HB_GOBJECT_TYPE_SEGMENT_PROPERTIES</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SET:CAPS" title="HB_GOBJECT_TYPE_SET">HB_GOBJECT_TYPE_SET</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-USER-DATA-KEY:CAPS" title="HB_GOBJECT_TYPE_USER_DATA_KEY">HB_GOBJECT_TYPE_USER_DATA_KEY</a></td>
-</tr>
-</tbody>
-</table></div>
-</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>Functions for using HarfBuzz with the GObject library to provide
+<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>
-<div class="refsect2">
-<a name="hb-gobject-blob-get-type"></a><h3>hb_gobject_blob_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_blob_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<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-gobject-buffer-content-type-get-type"></a><h3>hb_gobject_buffer_content_type_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_buffer_content_type_get_type
-                               ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-buffer-diff-flags-get-type"></a><h3>hb_gobject_buffer_diff_flags_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_buffer_diff_flags_get_type ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-buffer-flags-get-type"></a><h3>hb_gobject_buffer_flags_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_buffer_flags_get_type ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-buffer-get-type"></a><h3>hb_gobject_buffer_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_buffer_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<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-gobject-buffer-serialize-flags-get-type"></a><h3>hb_gobject_buffer_serialize_flags_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_buffer_serialize_flags_get_type
-                               ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-buffer-serialize-format-get-type"></a><h3>hb_gobject_buffer_serialize_format_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_buffer_serialize_format_get_type
-                               ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-direction-get-type"></a><h3>hb_gobject_direction_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_direction_get_type ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-face-get-type"></a><h3>hb_gobject_face_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_face_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<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-gobject-font-funcs-get-type"></a><h3>hb_gobject_font_funcs_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_font_funcs_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<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-gobject-font-get-type"></a><h3>hb_gobject_font_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_font_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<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-gobject-glyph-flags-get-type"></a><h3>hb_gobject_glyph_flags_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_glyph_flags_get_type ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-map-get-type"></a><h3>hb_gobject_map_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_map_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-memory-mode-get-type"></a><h3>hb_gobject_memory_mode_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_memory_mode_get_type ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-ot-color-palette-flags-get-type"></a><h3>hb_gobject_ot_color_palette_flags_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_ot_color_palette_flags_get_type
-                               ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-ot-layout-glyph-class-get-type"></a><h3>hb_gobject_ot_layout_glyph_class_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_ot_layout_glyph_class_get_type
-                               ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-ot-math-constant-get-type"></a><h3>hb_gobject_ot_math_constant_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_ot_math_constant_get_type ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-ot-math-glyph-part-get-type"></a><h3>hb_gobject_ot_math_glyph_part_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_ot_math_glyph_part_get_type
-                               (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-ot-math-glyph-part-flags-get-type"></a><h3>hb_gobject_ot_math_glyph_part_flags_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_ot_math_glyph_part_flags_get_type
-                               ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-ot-math-glyph-variant-get-type"></a><h3>hb_gobject_ot_math_glyph_variant_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_ot_math_glyph_variant_get_type
-                               (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-ot-math-kern-get-type"></a><h3>hb_gobject_ot_math_kern_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_ot_math_kern_get_type ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-script-get-type"></a><h3>hb_gobject_script_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_script_get_type ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-shape-plan-get-type"></a><h3>hb_gobject_shape_plan_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_shape_plan_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-unicode-combining-class-get-type"></a><h3>hb_gobject_unicode_combining_class_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_unicode_combining_class_get_type
-                               ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-unicode-funcs-get-type"></a><h3>hb_gobject_unicode_funcs_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_unicode_funcs_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<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-gobject-unicode-general-category-get-type"></a><h3>hb_gobject_unicode_general_category_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_unicode_general_category_get_type
-                               ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-buffer-cluster-level-get-type"></a><h3>hb_gobject_buffer_cluster_level_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_buffer_cluster_level_get_type
-                               ();</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-feature-get-type"></a><h3>hb_gobject_feature_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_feature_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-glyph-info-get-type"></a><h3>hb_gobject_glyph_info_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_glyph_info_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-glyph-position-get-type"></a><h3>hb_gobject_glyph_position_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_glyph_position_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-segment-properties-get-type"></a><h3>hb_gobject_segment_properties_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_segment_properties_get_type
-                               (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-set-get-type"></a><h3>hb_gobject_set_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_set_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="hb-gobject-user-data-key-get-type"></a><h3>hb_gobject_user_data_key_get_type ()</h3>
-<pre class="programlisting"><span class="returnvalue">GType</span>
-hb_gobject_user_data_key_get_type (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-</div>
-<div class="refsect1">
-<a name="harfbuzz-hb-gobject.other_details"></a><h2>Types and Values</h2>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-BLOB:CAPS"></a><h3>HB_GOBJECT_TYPE_BLOB</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_BLOB (hb_gobject_blob_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-BUFFER:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER (hb_gobject_buffer_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-BUFFER-CONTENT-TYPE:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE (hb_gobject_buffer_content_type_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-BUFFER-DIFF-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS (hb_gobject_buffer_diff_flags_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-BUFFER-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_FLAGS</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_FLAGS (hb_gobject_buffer_flags_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS (hb_gobject_buffer_serialize_flags_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FORMAT:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT (hb_gobject_buffer_serialize_format_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-DIRECTION:CAPS"></a><h3>HB_GOBJECT_TYPE_DIRECTION</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_DIRECTION (hb_gobject_direction_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-FACE:CAPS"></a><h3>HB_GOBJECT_TYPE_FACE</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_FACE (hb_gobject_face_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-FONT:CAPS"></a><h3>HB_GOBJECT_TYPE_FONT</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_FONT (hb_gobject_font_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-FONT-FUNCS:CAPS"></a><h3>HB_GOBJECT_TYPE_FONT_FUNCS</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_FONT_FUNCS (hb_gobject_font_funcs_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-GLYPH-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_GLYPH_FLAGS</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_GLYPH_FLAGS (hb_gobject_glyph_flags_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-MAP:CAPS"></a><h3>HB_GOBJECT_TYPE_MAP</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_MAP (hb_gobject_map_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-MEMORY-MODE:CAPS"></a><h3>HB_GOBJECT_TYPE_MEMORY_MODE</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_MEMORY_MODE (hb_gobject_memory_mode_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-OT-COLOR-PALETTE-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS (hb_gobject_ot_color_palette_flags_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-OT-LAYOUT-GLYPH-CLASS:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS (hb_gobject_ot_layout_glyph_class_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-OT-MATH-CONSTANT:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_MATH_CONSTANT</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_MATH_CONSTANT (hb_gobject_ot_math_constant_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART (hb_gobject_ot_math_glyph_part_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART-FLAGS:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS (hb_gobject_ot_math_glyph_part_flags_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-OT-MATH-GLYPH-VARIANT:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT (hb_gobject_ot_math_glyph_variant_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-OT-MATH-KERN:CAPS"></a><h3>HB_GOBJECT_TYPE_OT_MATH_KERN</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_OT_MATH_KERN (hb_gobject_ot_math_kern_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-SCRIPT:CAPS"></a><h3>HB_GOBJECT_TYPE_SCRIPT</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_SCRIPT (hb_gobject_script_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-SHAPE-PLAN:CAPS"></a><h3>HB_GOBJECT_TYPE_SHAPE_PLAN</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-UNICODE-COMBINING-CLASS:CAPS"></a><h3>HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS (hb_gobject_unicode_combining_class_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-UNICODE-FUNCS:CAPS"></a><h3>HB_GOBJECT_TYPE_UNICODE_FUNCS</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_UNICODE_FUNCS (hb_gobject_unicode_funcs_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-UNICODE-GENERAL-CATEGORY:CAPS"></a><h3>HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY (hb_gobject_unicode_general_category_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-BUFFER-CLUSTER-LEVEL:CAPS"></a><h3>HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL (hb_gobject_buffer_cluster_level_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-FEATURE:CAPS"></a><h3>HB_GOBJECT_TYPE_FEATURE</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_FEATURE (hb_gobject_feature_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-GLYPH-INFO:CAPS"></a><h3>HB_GOBJECT_TYPE_GLYPH_INFO</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_GLYPH_INFO (hb_gobject_glyph_info_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-GLYPH-POSITION:CAPS"></a><h3>HB_GOBJECT_TYPE_GLYPH_POSITION</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_GLYPH_POSITION (hb_gobject_glyph_position_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-SEGMENT-PROPERTIES:CAPS"></a><h3>HB_GOBJECT_TYPE_SEGMENT_PROPERTIES</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_SEGMENT_PROPERTIES (hb_gobject_segment_properties_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-SET:CAPS"></a><h3>HB_GOBJECT_TYPE_SET</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_SET (hb_gobject_set_get_type ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="HB-GOBJECT-TYPE-USER-DATA-KEY:CAPS"></a><h3>HB_GOBJECT_TYPE_USER_DATA_KEY</h3>
-<pre class="programlisting">#define HB_GOBJECT_TYPE_USER_DATA_KEY (hb_gobject_user_data_key_get_type ())
-</pre>
-</div>
+<p></p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 57a087d..2926fbd 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-graphite2: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch14.html" title="Integration API">
+<link rel="up" href="ch15.html" title="Integration API">
 <link rel="prev" href="harfbuzz-hb-gobject.html" title="hb-gobject">
 <link rel="next" href="harfbuzz-hb-icu.html" title="hb-icu">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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">
@@ -18,7 +18,7 @@
                   <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="ch14.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="n" href="harfbuzz-hb-icu.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -35,8 +35,8 @@
 <a name="harfbuzz-hb-graphite2.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody><tr>
 <td class="function_type">
@@ -52,8 +52,8 @@
 <a name="harfbuzz-hb-graphite2.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody><tr>
 <td class="define_keyword">#define</td>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-graphite2.description"></a><h2>Description</h2>
-<p>Functions for using HarfBuzz with the Graphite2 fonts.</p>
+<p>Functions for using HarfBuzz with fonts that include Graphite features.</p>
+<p>For Graphite features to work, you must be sure that HarfBuzz was compiled
+with the <code class="literal">graphite2</code> shaping engine enabled. Currently, the default is to
+not enable <code class="literal">graphite2</code> shaping.</p>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-graphite2.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="hb-graphite2-face-get-gr-face"></a><h3>hb_graphite2_face_get_gr_face ()</h3>
 <pre class="programlisting"><span class="returnvalue">gr_face</span> *
-hb_graphite2_face_get_gr_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+hb_graphite2_face_get_gr_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>Fetches the Graphite2 gr_face corresponding to the specified
+<a class="link" href="harfbuzz-hb-face.html#hb-face-t" title="hb_face_t"><span class="type">hb_face_t</span></a> face object.</p>
+<div class="refsect3">
+<a name="hb-graphite2-face-get-gr-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><em class="parameter"><code>hb_face_t</code></em>
+to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-graphite2-face-get-gr-face.returns"></a><h4>Returns</h4>
+<p> the gr_face 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">
@@ -84,10 +110,13 @@ hb_graphite2_face_get_gr_face (<em class="parameter"><code><a class="link" href=
 <a name="HB-GRAPHITE2-TAG-SILF:CAPS"></a><h3>HB_GRAPHITE2_TAG_SILF</h3>
 <pre class="programlisting">#define HB_GRAPHITE2_TAG_SILF HB_TAG('S','i','l','f')
 </pre>
+<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 for the <code class="literal">Silf</code> table, which holds Graphite
+features. </p>
+<p>For more information, see http://graphite.sil.org/</p>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index d89128c..08bfab2 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-icu: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch14.html" title="Integration API">
+<link rel="up" href="ch15.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.29 (XML mode)">
+<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">
@@ -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="ch14.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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-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>
 <a name="harfbuzz-hb-icu.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<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-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-icu.description"></a><h2>Description</h2>
-<p>Functions for using HarfBuzz with the ICU library to provide Unicode data.</p>
+<p>Functions for using HarfBuzz with the International Components for Unicode
+(ICU) library. HarfBuzz supports using ICU to provide Unicode data, by attaching
+ICU 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>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-icu.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="hb-icu-get-unicode-funcs"></a><h3>hb_icu_get_unicode_funcs ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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_icu_get_unicode_funcs (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>Fetches a Unicode-functions structure that is populated
+with the appropriate ICU function for each method.</p>
+<div class="refsect3">
+<a name="hb-icu-get-unicode-funcs.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-38.html#api-index-0.9.38">0.9.38</a></p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-icu-script-from-script"></a><h3>hb_icu_script_from_script ()</h3>
 <pre class="programlisting"><span class="returnvalue">UScriptCode</span>
 hb_icu_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 UScriptCode 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>
+<div class="refsect3">
+<a name="hb-icu-script-from-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>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> script to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-icu-script-from-script.returns"></a><h4>Returns</h4>
+<p> the UScriptCode identifier found</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-icu-script-to-script"></a><h3>hb_icu_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_icu_script_to_script (<em class="parameter"><code><span class="type">UScriptCode</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 UScriptCode identifier.</p>
+<div class="refsect3">
+<a name="hb-icu-script-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>script</p></td>
+<td class="parameter_description"><p>The UScriptCode identifier to query</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-icu-script-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> script found</p>
 </div>
 </div>
-<div class="refsect1">
-<a name="harfbuzz-hb-icu.other_details"></a><h2>Types and Values</h2>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index e54c629..e84e30d 100644 (file)
@@ -5,21 +5,20 @@
 <title>hb-map: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.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.29 (XML mode)">
+<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-map.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-map.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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>
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-map.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -58,7 +57,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="returnvalue">hb_map_t</span></a> *
+<a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="returnvalue">hb_map_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-map.html#hb-map-create" title="hb_map_create ()">hb_map_create</a> <span class="c_punctuation">()</span>
@@ -90,7 +89,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="returnvalue">hb_map_t</span></a> *
+<a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="returnvalue">hb_map_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-map.html#hb-map-get-empty" title="hb_map_get_empty ()">hb_map_get_empty</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="returnvalue">hb_map_t</span></a> *
+<a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t"><span class="returnvalue">hb_map_t</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-map.html#hb-map-reference" title="hb_map_reference ()">hb_map_reference</a> <span class="c_punctuation">()</span>
 </tbody>
 </table></div>
 </div>
-<a name="hb-map-t"></a><div class="refsect1">
+<div class="refsect1">
 <a name="harfbuzz-hb-map.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </tr>
 <tr>
 <td class="typedef_keyword">typedef</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-map.html#hb-map-t">hb_map_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-map.html#hb-map-t" title="hb_map_t">hb_map_t</a></td>
 </tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-map.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
-    <span class="lineart">╰──</span> hb_map_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-map.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb.h&gt;
 </pre>
@@ -195,7 +188,7 @@ use if desired.</p>
 <div class="refsect2">
 <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"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-map-allocation-successful.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -217,7 +210,7 @@ hb_map_allocation_successful (<em class="parameter"><code>const <a class="link"
 <div class="refsect2">
 <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"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-map-clear.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -238,7 +231,7 @@ hb_map_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_map_t</span></a> *
+<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><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
@@ -252,7 +245,7 @@ hb_map_create (<em class="parameter"><code><span class="type">void</span></code>
 <div class="refsect2">
 <a name="hb-map-del"></a><h3>hb_map_del ()</h3>
 <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"><span class="type">hb_map_t</span></a> *map</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-map-del.parameters"></a><h4>Parameters</h4>
@@ -275,7 +268,7 @@ hb_map_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.ht
 <div class="refsect2">
 <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"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+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><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>
@@ -298,7 +291,7 @@ hb_map_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-ma
 <div class="refsect2">
 <a name="hb-map-get"></a><h3>hb_map_get ()</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_map_get (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-map-get.parameters"></a><h4>Parameters</h4>
@@ -320,7 +313,7 @@ hb_map_get (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_map_t</span></a> *
+<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>
 <div class="refsect3">
 <a name="hb-map-get-empty.returns"></a><h4>Returns</h4>
@@ -333,7 +326,7 @@ hb_map_get_empty (<em class="parameter"><code><span class="type">void</span></co
 <div class="refsect2">
 <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"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-map-get-population.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -355,8 +348,8 @@ hb_map_get_population (<em class="parameter"><code>const <a class="link" href="h
 <div class="refsect2">
 <a name="hb-map-get-user-data"></a><h3>hb_map_get_user_data ()</h3>
 <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"><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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+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><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>
@@ -384,7 +377,7 @@ hb_map_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <div class="refsect2">
 <a name="hb-map-has"></a><h3>hb_map_has ()</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_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-map-has.parameters"></a><h4>Parameters</h4>
@@ -407,7 +400,7 @@ hb_map_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <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"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-map-is-empty.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -428,8 +421,8 @@ hb_map_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuz
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_map_t</span></a> *map</code></em>);</pre>
+<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><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>
@@ -457,7 +450,7 @@ hb_map_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-map-set"></a><h3>hb_map_set ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_map_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#hb-map-t"><span class="type">hb_map_t</span></a> *map</code></em>,
+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>
 <div class="refsect3">
@@ -481,8 +474,8 @@ hb_map_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.ht
 <div class="refsect2">
 <a name="hb-map-set-user-data"></a><h3>hb_map_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_map_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-map.html#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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+hb_map_set_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>,
                       <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>
@@ -521,6 +514,6 @@ hb_map_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index ed364e4..6e6998b 100644 (file)
@@ -5,22 +5,21 @@
 <title>hb-ot-color: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="OpenType API">
-<link rel="prev" href="ch12.html" title="OpenType API">
+<link rel="up" href="ch13.html" title="OpenType API">
+<link rel="prev" href="ch13.html" title="OpenType API">
 <link rel="next" href="harfbuzz-hb-ot-font.html" title="hb-ot-font">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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-ot-color.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-ot-color.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="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="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="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">
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-ot-color.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -87,7 +86,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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-color.html#hb-ot-color-glyph-reference-png" title="hb_ot_color_glyph_reference_png ()">hb_ot_color_glyph_reference_png</a> <span class="c_punctuation">()</span>
@@ -95,7 +94,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
+<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-color.html#hb-ot-color-glyph-reference-svg" title="hb_ot_color_glyph_reference_svg ()">hb_ot_color_glyph_reference_svg</a> <span class="c_punctuation">()</span>
 <a name="harfbuzz-hb-ot-color.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-ot-color.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
-    <span class="lineart">╰──</span> hb_ot_color_palette_flags_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-ot-color.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb-ot.h&gt;
 </pre>
@@ -264,7 +257,7 @@ hb_color_get_red (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-ot-color-glyph-get-layers"></a><h3>hb_ot_color_glyph_get_layers ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_color_glyph_get_layers (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_color_glyph_get_layers (<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>,
                               <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>,
@@ -282,7 +275,7 @@ face. The list returned will begin at the offset provided.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -318,8 +311,8 @@ Output = the actual number of layers returned (may be zero). </p></td>
 <hr>
 <div class="refsect2">
 <a name="hb-ot-color-glyph-reference-png"></a><h3>hb_ot_color_glyph_reference_png ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
-hb_ot_color_glyph_reference_png (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+<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_color_glyph_reference_png (<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 PNG image for a glyph. This function takes a font object, not a face object,
 as input. To get an optimally sized PNG blob, the UPEM value must be set on the <em class="parameter"><code>font</code></em>
@@ -336,7 +329,7 @@ object. If UPEM is unset, the blob returned will be the largest PNG available.</
 <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"><span class="type">hb_font_t</span></a> to work upon</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>
@@ -349,7 +342,7 @@ object. If UPEM is unset, the blob returned will be the largest PNG available.</
 </div>
 <div class="refsect3">
 <a name="hb-ot-color-glyph-reference-png.returns"></a><h4>Returns</h4>
-<p>An <a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> containing the PNG image for the glyph, if available. </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> containing the PNG image for the glyph, if available. </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-1-0.html#api-index-2.1.0">2.1.0</a></p>
@@ -357,8 +350,8 @@ object. If UPEM is unset, the blob returned will be the largest PNG available.</
 <hr>
 <div class="refsect2">
 <a name="hb-ot-color-glyph-reference-svg"></a><h3>hb_ot_color_glyph_reference_svg ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
-hb_ot_color_glyph_reference_svg (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+<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_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>
 <div class="refsect3">
@@ -372,7 +365,7 @@ hb_ot_color_glyph_reference_svg (<em class="parameter"><code><a class="link" hre
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -385,7 +378,7 @@ hb_ot_color_glyph_reference_svg (<em class="parameter"><code><a class="link" hre
 </div>
 <div class="refsect3">
 <a name="hb-ot-color-glyph-reference-svg.returns"></a><h4>Returns</h4>
-<p>An <a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> containing the SVG document of the glyph, if available. </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> containing the SVG document of the glyph, if available. </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-1-0.html#api-index-2.1.0">2.1.0</a></p>
@@ -394,7 +387,7 @@ hb_ot_color_glyph_reference_svg (<em class="parameter"><code><a class="link" hre
 <div class="refsect2">
 <a name="hb-ot-color-has-layers"></a><h3>hb_ot_color_has_layers ()</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_color_has_layers (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+hb_ot_color_has_layers (<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 a face includes any <code class="literal">COLR</code> color layers.</p>
 <div class="refsect3">
 <a name="hb-ot-color-has-layers.parameters"></a><h4>Parameters</h4>
@@ -406,7 +399,7 @@ hb_ot_color_has_layers (<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 class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -421,7 +414,7 @@ hb_ot_color_has_layers (<em class="parameter"><code><a class="link" href="harfbu
 <div class="refsect2">
 <a name="hb-ot-color-has-palettes"></a><h3>hb_ot_color_has_palettes ()</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_color_has_palettes (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+hb_ot_color_has_palettes (<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 a face includes a <code class="literal">CPAL</code> color-palette table.</p>
 <div class="refsect3">
 <a name="hb-ot-color-has-palettes.parameters"></a><h4>Parameters</h4>
@@ -433,7 +426,7 @@ hb_ot_color_has_palettes (<em class="parameter"><code><a class="link" href="harf
 </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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -448,7 +441,7 @@ hb_ot_color_has_palettes (<em class="parameter"><code><a class="link" href="harf
 <div class="refsect2">
 <a name="hb-ot-color-has-png"></a><h3>hb_ot_color_has_png ()</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_color_has_png (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+hb_ot_color_has_png (<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 a face has PNG glyph images (either in <code class="literal">CBDT</code> or <code class="literal">sbix</code> tables).</p>
 <div class="refsect3">
 <a name="hb-ot-color-has-png.parameters"></a><h4>Parameters</h4>
@@ -460,7 +453,7 @@ hb_ot_color_has_png (<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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -475,7 +468,7 @@ hb_ot_color_has_png (<em class="parameter"><code><a class="link" href="harfbuzz-
 <div class="refsect2">
 <a name="hb-ot-color-has-svg"></a><h3>hb_ot_color_has_svg ()</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_color_has_svg (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+hb_ot_color_has_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>);</pre>
 <p>Tests whether a face includes any <code class="literal">SVG</code> glyph images.</p>
 <div class="refsect3">
 <a name="hb-ot-color-has-svg.parameters"></a><h4>Parameters</h4>
@@ -487,7 +480,7 @@ hb_ot_color_has_svg (<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"><span class="type">hb_face_t</span></a> to work upon.</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>
@@ -502,7 +495,7 @@ hb_ot_color_has_svg (<em class="parameter"><code><a class="link" href="harfbuzz-
 <div class="refsect2">
 <a name="hb-ot-color-palette-color-get-name-id"></a><h3>hb_ot_color_palette_color_get_name_id ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
-hb_ot_color_palette_color_get_name_id (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+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>
@@ -519,7 +512,7 @@ the specificed color in a face's <code class="literal">CPAL</code> color palette
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -540,7 +533,7 @@ the specificed color in a face's <code class="literal">CPAL</code> color palette
 <div class="refsect2">
 <a name="hb-ot-color-palette-get-colors"></a><h3>hb_ot_color_palette_get_colors ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_color_palette_get_colors (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_color_palette_get_colors (<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>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> *color_count</code></em>,
@@ -564,7 +557,7 @@ for allocating a buffer of suitable size before calling
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -601,7 +594,7 @@ Output = the actual number of colors returned (may be zero). </p></td>
 <div class="refsect2">
 <a name="hb-ot-color-palette-get-count"></a><h3>hb_ot_color_palette_get_count ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_color_palette_get_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+hb_ot_color_palette_get_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 color palettes in a face.</p>
 <div class="refsect3">
 <a name="hb-ot-color-palette-get-count.parameters"></a><h4>Parameters</h4>
@@ -613,7 +606,7 @@ hb_ot_color_palette_get_count (<em class="parameter"><code><a class="link" href=
 </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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -628,7 +621,7 @@ hb_ot_color_palette_get_count (<em class="parameter"><code><a class="link" href=
 <div class="refsect2">
 <a name="hb-ot-color-palette-get-flags"></a><h3>hb_ot_color_palette_get_flags ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-color.html#hb-ot-color-palette-flags-t" title="enum hb_ot_color_palette_flags_t"><span class="returnvalue">hb_ot_color_palette_flags_t</span></a>
-hb_ot_color_palette_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_color_palette_get_flags (<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 flags defined for a color palette.</p>
 <div class="refsect3">
@@ -642,7 +635,7 @@ hb_ot_color_palette_get_flags (<em class="parameter"><code><a class="link" href=
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -663,7 +656,7 @@ hb_ot_color_palette_get_flags (<em class="parameter"><code><a class="link" href=
 <div class="refsect2">
 <a name="hb-ot-color-palette-get-name-id"></a><h3>hb_ot_color_palette_get_name_id ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
-hb_ot_color_palette_get_name_id (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+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>
@@ -680,7 +673,7 @@ specific, themed names (e.g., "Spring", "Summer", "Fall", and "Winter").</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -724,7 +717,7 @@ If the requested palette has no name the result is <span class="type">HB_OT_NAME
 <td class="enum_member_name"><p><a name="HB-OT-COLOR-PALETTE-FLAG-DEFAULT:CAPS"></a>HB_OT_COLOR_PALETTE_FLAG_DEFAULT</p></td>
 <td class="enum_member_description">
 <p>Default indicating that there is nothing special
-  to note about a color palette.</p>
+to note about a color palette.</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -732,7 +725,7 @@ If the requested palette has no name the result is <span class="type">HB_OT_NAME
 <td class="enum_member_name"><p><a name="HB-OT-COLOR-PALETTE-FLAG-USABLE-WITH-LIGHT-BACKGROUND:CAPS"></a>HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND</p></td>
 <td class="enum_member_description">
 <p>Flag indicating that the color
-  palette is appropriate to use when displaying the font on a light background such as white.</p>
+palette is appropriate to use when displaying the font on a light background such as white.</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -740,7 +733,7 @@ If the requested palette has no name the result is <span class="type">HB_OT_NAME
 <td class="enum_member_name"><p><a name="HB-OT-COLOR-PALETTE-FLAG-USABLE-WITH-DARK-BACKGROUND:CAPS"></a>HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND</p></td>
 <td class="enum_member_description">
 <p>Flag indicating that the color
-  palette is appropriate to use when displaying the font on a dark background such as black.</p>
+palette is appropriate to use when displaying the font on a dark background such as black.</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -752,6 +745,6 @@ If the requested palette has no name the result is <span class="type">HB_OT_NAME
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 635c7f3..20cea7b 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-ot-font: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="OpenType API">
+<link rel="up" href="ch13.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.29 (XML mode)">
+<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">
@@ -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="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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-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>
@@ -35,8 +35,8 @@
 <a name="harfbuzz-hb-ot-font.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody><tr>
 <td class="function_type">
@@ -64,15 +64,12 @@ never need to call these functions directly.</p>
 <div class="refsect2">
 <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"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+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 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 class="refsect1">
-<a name="harfbuzz-hb-ot-font.other_details"></a><h2>Types and Values</h2>
-</div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index ab5d19f..d61416f 100644 (file)
@@ -5,21 +5,20 @@
 <title>hb-ot-layout: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="OpenType API">
+<link rel="up" href="ch13.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.29 (XML mode)">
+<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-ot-layout.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-ot-layout.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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-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>
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-ot-layout.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
 <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 name="harfbuzz-hb-ot-layout.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-ot-layout.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
-    <span class="lineart">├──</span> hb_ot_layout_baseline_tag_t
-    <span class="lineart">╰──</span> hb_ot_layout_glyph_class_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-ot-layout.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb-ot.h&gt;
 </pre>
@@ -545,14 +553,96 @@ 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"><span class="type">hb_face_t</span></a> *face</code></em>,
+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>,
                               <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-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *scripts</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> *languages</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> *features</code></em>,
-                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *lookup_indexes</code></em>);</pre>
+                              <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>Fetches a list of all feature-lookup indexes in the specified face's GSUB
 table or GPOS table, underneath the specified scripts, languages, and
 features. If no list of scripts is provided, all scripts will be queried.
@@ -569,7 +659,7 @@ list of features is provided, all features will be queried.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -606,12 +696,12 @@ list of features is provided, all features will be queried.</p>
 <div class="refsect2">
 <a name="hb-ot-layout-collect-features"></a><h3>hb_ot_layout_collect_features ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_ot_layout_collect_features (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_collect_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-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *scripts</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> *languages</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> *features</code></em>,
-                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *feature_indexes</code></em>);</pre>
+                               <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>Fetches a list of all feature indexes in the specified face's GSUB table
 or GPOS table, underneath the specified scripts, languages, and features.
 If no list of scripts is provided, all scripts will be queried. If no list
@@ -628,7 +718,7 @@ features is provided, all features will be queried.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -665,7 +755,7 @@ features is provided, all features will be queried.</p>
 <div class="refsect2">
 <a name="hb-ot-layout-feature-get-characters"></a><h3>hb_ot_layout_feature_get_characters ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_layout_feature_get_characters (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_feature_get_characters (<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>unsigned <span class="type">int</span> feature_index</code></em>,
                                      <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
@@ -689,7 +779,7 @@ hb_ot_layout_feature_get_characters (<em class="parameter"><code><a class="link"
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -733,7 +823,7 @@ glyph variants. </p></td>
 <div class="refsect2">
 <a name="hb-ot-layout-feature-get-lookups"></a><h3>hb_ot_layout_feature_get_lookups ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_layout_feature_get_lookups (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_feature_get_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>unsigned <span class="type">int</span> feature_index</code></em>,
                                   <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
@@ -753,7 +843,7 @@ begin at the offset provided.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -791,7 +881,7 @@ Output = the actual number of lookups returned (may be zero). </p></td>
 <div class="refsect2">
 <a name="hb-ot-layout-feature-get-name-ids"></a><h3>hb_ot_layout_feature_get_name_ids ()</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_feature_get_name_ids (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_feature_get_name_ids (<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>unsigned <span class="type">int</span> feature_index</code></em>,
                                    <em class="parameter"><code><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> *label_id</code></em>,
@@ -812,7 +902,7 @@ hb_ot_layout_feature_get_name_ids (<em class="parameter"><code><a class="link" h
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -870,7 +960,7 @@ parameters. (Must be zero if numParameters is zero.). </p></td>
 <a name="hb-ot-layout-feature-with-variations-get-lookups"></a><h3>hb_ot_layout_feature_with_variations_get_lookups ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_ot_layout_feature_with_variations_get_lookups
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <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> feature_index</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> variations_index</code></em>,
@@ -891,7 +981,7 @@ variations index. The list returned will begin at the offset provided.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -933,7 +1023,7 @@ Output = the actual number of lookups returned (may be zero). </p></td>
 <div class="refsect2">
 <a name="hb-ot-layout-get-attach-points"></a><h3>hb_ot_layout_get_attach_points ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_layout_get_attach_points (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_get_attach_points (<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>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> *point_count</code></em>,
@@ -952,7 +1042,7 @@ table of the face. The list returned will begin at the offset provided.</p>
 <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"><span class="type">hb_face_t</span></a> to work on</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>
@@ -984,7 +1074,7 @@ Output = the actual number of attachment points returned (may be zero). </p></td
 <div class="refsect2">
 <a name="hb-ot-layout-get-baseline"></a><h3>hb_ot_layout_get_baseline ()</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_get_baseline (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_ot_layout_get_baseline (<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-layout.html#hb-ot-layout-baseline-tag-t" title="enum hb_ot_layout_baseline_tag_t"><span class="type">hb_ot_layout_baseline_tag_t</span></a> baseline_tag</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><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> script_tag</code></em>,
@@ -1035,7 +1125,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 the font.</p>
+<p> 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>
@@ -1043,7 +1133,7 @@ hb_ot_layout_get_baseline (<em class="parameter"><code><a class="link" href="har
 <div class="refsect2">
 <a name="hb-ot-layout-get-glyph-class"></a><h3>hb_ot_layout_get_glyph_class ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-layout.html#hb-ot-layout-glyph-class-t" title="enum hb_ot_layout_glyph_class_t"><span class="returnvalue">hb_ot_layout_glyph_class_t</span></a>
-hb_ot_layout_get_glyph_class (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_get_glyph_class (<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 GDEF class of the requested glyph in the specified face.</p>
 <div class="refsect3">
@@ -1057,7 +1147,7 @@ hb_ot_layout_get_glyph_class (<em class="parameter"><code><a class="link" href="
 <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"><span class="type">hb_face_t</span></a> to work on</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>
@@ -1079,9 +1169,9 @@ point in the GDEF table of the face.</p>
 <div class="refsect2">
 <a name="hb-ot-layout-get-glyphs-in-class"></a><h3>hb_ot_layout_get_glyphs_in_class ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_ot_layout_get_glyphs_in_class (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_get_glyphs_in_class (<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-layout.html#hb-ot-layout-glyph-class-t" title="enum hb_ot_layout_glyph_class_t"><span class="type">hb_ot_layout_glyph_class_t</span></a> klass</code></em>,
-                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs</code></em>);</pre>
+                                  <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>Retrieves the set of all glyphs from the face that belong to the requested
 glyph class in the face's GDEF table.</p>
 <div class="refsect3">
@@ -1095,7 +1185,7 @@ glyph class in the face's GDEF table.</p>
 <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"><span class="type">hb_face_t</span></a> to work on</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>
@@ -1105,7 +1195,7 @@ glyph class in the face's GDEF table.</p>
 </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"><span class="type">hb_set_t</span></a> set of all glyphs belonging to the requested
+<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 all glyphs belonging to the requested
 class. </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>
@@ -1118,7 +1208,7 @@ class. </p></td>
 <div class="refsect2">
 <a name="hb-ot-layout-get-ligature-carets"></a><h3>hb_ot_layout_get_ligature_carets ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_layout_get_ligature_carets (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_ot_layout_get_ligature_carets (<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><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>,
@@ -1137,7 +1227,7 @@ table of the font. The list returned will begin at the offset provided.</p>
 <tbody>
 <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"><span class="type">hb_font_t</span></a> to work on</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 work on</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -1174,7 +1264,7 @@ Output = the actual number of caret positions returned (may be zero). </p></td>
 <div class="refsect2">
 <a name="hb-ot-layout-get-size-params"></a><h3>hb_ot_layout_get_size_params ()</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_get_size_params (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_get_size_params (<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> *design_size</code></em>,
                               <em class="parameter"><code>unsigned <span class="type">int</span> *subfamily_id</code></em>,
                               <em class="parameter"><code><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> *subfamily_name_id</code></em>,
@@ -1185,8 +1275,7 @@ the subfamily_id and the subfamily name string (accessible via the subfamily_nam
 as used here are defined as pertaining only to fonts within a font family that differ
 specifically in their respective size ranges; other ways to differentiate fonts within
 a subfamily are not covered by the <code class="literal">size</code> feature.</p>
-<p>For more information on this distinction, see the <code class="literal">size</code> documentation at
-https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt<span class="type">tag-39size39</span></p>
+<p>For more information on this distinction, see the <a class="ulink" href="https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size" target="_top"><code class="literal">size</code> feature documentation</a>.</p>
 <div class="refsect3">
 <a name="hb-ot-layout-get-size-params.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1198,7 +1287,7 @@ https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt<span class
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1239,7 +1328,7 @@ https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt<span class
 <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"><span class="type">hb_font_t</span></a> *font</code></em>,
+<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>,
@@ -1249,7 +1338,7 @@ https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt<span class
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 <p>Tests whether a face has any glyph classes defined in its GDEF table.</p>
 <div class="refsect3">
 <a name="hb-ot-layout-has-glyph-classes.parameters"></a><h4>Parameters</h4>
@@ -1261,7 +1350,7 @@ hb_ot_layout_has_glyph_classes (<em class="parameter"><code><a class="link" href
 </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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1275,7 +1364,7 @@ hb_ot_layout_has_glyph_classes (<em class="parameter"><code><a class="link" href
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 <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">
@@ -1286,7 +1375,7 @@ hb_ot_layout_has_positioning (<em class="parameter"><code><a class="link" href="
 </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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1300,7 +1389,7 @@ hb_ot_layout_has_positioning (<em class="parameter"><code><a class="link" href="
 <div class="refsect2">
 <a name="hb-ot-layout-has-substitution"></a><h3>hb_ot_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_ot_layout_has_substitution (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+hb_ot_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 GSUB substitutions.</p>
 <div class="refsect3">
 <a name="hb-ot-layout-has-substitution.parameters"></a><h4>Parameters</h4>
@@ -1312,7 +1401,7 @@ hb_ot_layout_has_substitution (<em class="parameter"><code><a class="link" href=
 </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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1326,7 +1415,7 @@ hb_ot_layout_has_substitution (<em class="parameter"><code><a class="link" href=
 <div class="refsect2">
 <a name="hb-ot-layout-language-find-feature"></a><h3>hb_ot_layout_language_find_feature ()</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_language_find_feature (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_language_find_feature (<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>unsigned <span class="type">int</span> script_index</code></em>,
                                     <em class="parameter"><code>unsigned <span class="type">int</span> language_index</code></em>,
@@ -1345,7 +1434,7 @@ or GPOS table, underneath the specified script and language.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1386,7 +1475,7 @@ or GPOS table, underneath the specified script and language.</p>
 <a name="hb-ot-layout-language-get-feature-indexes"></a><h3>hb_ot_layout_language_get_feature_indexes ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_ot_layout_language_get_feature_indexes
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <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> script_index</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> language_index</code></em>,
@@ -1407,7 +1496,7 @@ returned will begin at the offset provided.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1450,7 +1539,7 @@ Output: the actual number of feature tags returned (may be zero). </p></td>
 <a name="hb-ot-layout-language-get-feature-tags"></a><h3>hb_ot_layout_language_get_feature_tags ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_ot_layout_language_get_feature_tags
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <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> script_index</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> language_index</code></em>,
@@ -1471,7 +1560,7 @@ returned will begin at the offset provided.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1514,7 +1603,7 @@ Output = the actual number of feature tags returned (may be zero). </p></td>
 <a name="hb-ot-layout-language-get-required-feature"></a><h3>hb_ot_layout_language_get_required_feature ()</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_language_get_required_feature
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <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> script_index</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> language_index</code></em>,
@@ -1533,7 +1622,7 @@ underneath the specified script and language.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1553,8 +1642,8 @@ underneath the specified script and language.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>feature_index</p></td>
-<td class="parameter_description"><p>The index of the requested feature</p></td>
-<td class="parameter_annotations"> </td>
+<td class="parameter_description"><p>The index of the requested feature</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>feature_tag</p></td>
@@ -1574,13 +1663,13 @@ underneath the specified script and language.</p>
 <div class="refsect2">
 <a name="hb-ot-layout-lookup-collect-glyphs"></a><h3>hb_ot_layout_lookup_collect_glyphs ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_ot_layout_lookup_collect_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_lookup_collect_glyphs (<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>unsigned <span class="type">int</span> lookup_index</code></em>,
-                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs_before</code></em>,
-                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs_input</code></em>,
-                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs_after</code></em>,
-                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs_output</code></em>);</pre>
+                                    <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_before</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_input</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_after</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_output</code></em>);</pre>
 <p>Fetches a list of all glyphs affected by the specified lookup in the
 specified face's GSUB table or GPOS table.</p>
 <div class="refsect3">
@@ -1594,7 +1683,7 @@ specified face's GSUB table or GPOS table.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1619,7 +1708,7 @@ specified face's GSUB table or GPOS table.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>glyphs_after</p></td>
-<td class="parameter_description"><p>Array of glyphs following the substition range. </p></td>
+<td class="parameter_description"><p>Array of glyphs following the substitution 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>
@@ -1637,9 +1726,9 @@ specified face's GSUB table or GPOS table.</p>
 <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
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> lookup_index</code></em>,
-                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs</code></em>);</pre>
+                                <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>Compute the transitive closure of glyphs needed for a
 specified lookup.</p>
 <div class="refsect3">
@@ -1653,7 +1742,7 @@ specified lookup.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1676,9 +1765,9 @@ specified lookup.</p>
 <a name="hb-ot-layout-lookups-substitute-closure"></a><h3>hb_ot_layout_lookups_substitute_closure ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_ot_layout_lookups_substitute_closure
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
-                                <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *lookups</code></em>,
-                                <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs</code></em>);</pre>
+                               (<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>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t"><span class="type">hb_set_t</span></a> *lookups</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>Compute the transitive closure of glyphs needed for all of the
 provided lookups.</p>
 <div class="refsect3">
@@ -1692,7 +1781,7 @@ provided lookups.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1714,7 +1803,7 @@ provided lookups.</p>
 <div class="refsect2">
 <a name="hb-ot-layout-lookup-would-substitute"></a><h3>hb_ot_layout_lookup_would_substitute ()</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_lookup_would_substitute (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_lookup_would_substitute (<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> lookup_index</code></em>,
                                       <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyphs</code></em>,
                                       <em class="parameter"><code>unsigned <span class="type">int</span> glyphs_length</code></em>,
@@ -1732,7 +1821,7 @@ trigger a substitution on the given glyph sequence.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1768,7 +1857,7 @@ trigger a substitution on the given glyph sequence.</p>
 <div class="refsect2">
 <a name="hb-ot-layout-script-get-language-tags"></a><h3>hb_ot_layout_script_get_language_tags ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_layout_script_get_language_tags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_script_get_language_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><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> script_index</code></em>,
                                        <em class="parameter"><code>unsigned <span class="type">int</span> start_offset</code></em>,
@@ -1787,7 +1876,7 @@ the specified script index. The list returned will begin at the offset provided.
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1824,7 +1913,7 @@ Output = the actual number of language tags returned (may be zero). </p></td>
 <div class="refsect2">
 <a name="hb-ot-layout-script-select-language"></a><h3>hb_ot_layout_script_select_language ()</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_script_select_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_script_select_language (<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>unsigned <span class="type">int</span> script_index</code></em>,
                                      <em class="parameter"><code>unsigned <span class="type">int</span> language_count</code></em>,
@@ -1843,7 +1932,7 @@ or GPOS table, underneath the specified script index.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1885,7 +1974,7 @@ or GPOS table, underneath the specified script index.</p>
 <a name="hb-ot-layout-table-find-feature-variations"></a><h3>hb_ot_layout_table_find_feature_variations ()</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_table_find_feature_variations
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <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 <span class="type">int</span> *coords</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> num_coords</code></em>,
@@ -1903,7 +1992,7 @@ or GPOS table, at the specified variation coordinates.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1934,7 +2023,7 @@ or GPOS table, at the specified variation coordinates.</p>
 <div class="refsect2">
 <a name="hb-ot-layout-table-get-feature-tags"></a><h3>hb_ot_layout_table_get_feature_tags ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_layout_table_get_feature_tags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_table_get_feature_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><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> start_offset</code></em>,
                                      <em class="parameter"><code>unsigned <span class="type">int</span> *feature_count</code></em>,
@@ -1951,7 +2040,7 @@ hb_ot_layout_table_get_feature_tags (<em class="parameter"><code><a class="link"
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -1983,7 +2072,7 @@ Output = the actual number of feature tags returned (may be zero). </p></td>
 <div class="refsect2">
 <a name="hb-ot-layout-table-get-script-tags"></a><h3>hb_ot_layout_table_get_script_tags ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_layout_table_get_script_tags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_table_get_script_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><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> start_offset</code></em>,
                                     <em class="parameter"><code>unsigned <span class="type">int</span> *script_count</code></em>,
@@ -2001,7 +2090,7 @@ or GPOS table. The list returned will begin at the offset provided.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -2033,7 +2122,7 @@ Output = the actual number of script tags returned (may be zero). </p></td>
 <div class="refsect2">
 <a name="hb-ot-layout-table-get-lookup-count"></a><h3>hb_ot_layout_table_get_lookup_count ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_layout_table_get_lookup_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_table_get_lookup_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><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>);</pre>
 <p>Fetches the total number of lookups enumerated in the specified
 face's GSUB table or GPOS table.</p>
@@ -2048,7 +2137,7 @@ face's GSUB table or GPOS table.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -2065,7 +2154,7 @@ face's GSUB table or GPOS table.</p>
 <div class="refsect2">
 <a name="hb-ot-layout-table-select-script"></a><h3>hb_ot_layout_table_select_script ()</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_table_select_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_layout_table_select_script (<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>unsigned <span class="type">int</span> script_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> *script_tags</code></em>,
@@ -2082,7 +2171,7 @@ hb_ot_layout_table_select_script (<em class="parameter"><code><a class="link" hr
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -2119,9 +2208,9 @@ hb_ot_layout_table_select_script (<em class="parameter"><code><a class="link" hr
 <div class="refsect2">
 <a name="hb-ot-shape-plan-collect-lookups"></a><h3>hb_ot_shape_plan_collect_lookups ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_ot_shape_plan_collect_lookups (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>,
+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"><span class="type">hb_set_t</span></a> *lookup_indexes</code></em>);</pre>
+                                  <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 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>
@@ -2129,7 +2218,7 @@ hb_ot_shape_plan_collect_lookups (<em class="parameter"><code><a class="link" hr
 <a name="hb-ot-layout-language-get-required-feature-index"></a><h3>hb_ot_layout_language_get_required_feature_index ()</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_language_get_required_feature_index
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <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> script_index</code></em>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> language_index</code></em>,
@@ -2147,7 +2236,7 @@ underneath the specified script and language.</p>
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -2397,6 +2486,6 @@ In vertical writing mode when mathematical characters rotated 90 degrees clockwi
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 45476dd..f6d4589 100644 (file)
@@ -5,21 +5,20 @@
 <title>hb-ot-math: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="OpenType API">
+<link rel="up" href="ch13.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.29 (XML mode)">
+<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-ot-math.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-ot-math.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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-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>
 </tr></table>
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-ot-math.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </tbody>
 </table></div>
 </div>
-<a name="hb-ot-math-glyph-variant-t"></a><a name="hb-ot-math-glyph-part-t"></a><div class="refsect1">
+<div class="refsect1">
 <a name="harfbuzz-hb-ot-math.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </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-struct" title="hb_ot_math_glyph_variant_t">hb_ot_math_glyph_variant_t</a></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>
 <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-glyph-part-t-struct" title="hb_ot_math_glyph_part_t">hb_ot_math_glyph_part_t</a></td>
+<td class="function_name"><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></td>
 </tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-ot-math.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
-    <span class="lineart">├──</span> hb_ot_math_glyph_part_t
-    <span class="lineart">╰──</span> hb_ot_math_glyph_variant_t
-    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
-    <span class="lineart">├──</span> hb_ot_math_constant_t
-    <span class="lineart">╰──</span> hb_ot_math_kern_t
-    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
-    <span class="lineart">╰──</span> hb_ot_math_glyph_part_flags_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-ot-math.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb-ot.h&gt;
 </pre>
@@ -181,7 +168,7 @@ the font data necessary for typesetting OpenType Math layout.</p>
 <div class="refsect2">
 <a name="hb-ot-math-has-data"></a><h3>hb_ot_math_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_math_has_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+hb_ot_math_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>Tests whether a face has a <code class="literal">MATH</code> table.</p>
 <div class="refsect3">
 <a name="hb-ot-math-has-data.parameters"></a><h4>Parameters</h4>
@@ -193,7 +180,7 @@ hb_ot_math_has_data (<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"><span class="type">hb_face_t</span></a> to test</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_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -208,7 +195,7 @@ hb_ot_math_has_data (<em class="parameter"><code><a class="link" href="harfbuzz-
 <div class="refsect2">
 <a name="hb-ot-math-get-constant"></a><h3>hb_ot_math_get_constant ()</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_math_get_constant (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_ot_math_get_constant (<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-math.html#hb-ot-math-constant-t" title="enum hb_ot_math_constant_t"><span class="type">hb_ot_math_constant_t</span></a> constant</code></em>);</pre>
 <p>Fetches the specified math constant. For most constants, the value returned
 is 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>
@@ -227,7 +214,7 @@ an integer between 0 and 100 representing that percentage.</p>
 <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"><span class="type">hb_font_t</span></a> to work upon</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>
@@ -249,7 +236,7 @@ an integer between 0 and 100 representing that percentage.</p>
 <a name="hb-ot-math-get-glyph-italics-correction"></a><h3>hb_ot_math_get_glyph_italics_correction ()</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_math_get_glyph_italics_correction
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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> *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 an italics-correction value (if one exists) for the specified
 glyph index.</p>
@@ -264,7 +251,7 @@ glyph index.</p>
 <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"><span class="type">hb_font_t</span></a> to work upon</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>
@@ -286,7 +273,7 @@ glyph index.</p>
 <a name="hb-ot-math-get-glyph-top-accent-attachment"></a><h3>hb_ot_math_get_glyph_top_accent_attachment ()</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_math_get_glyph_top_accent_attachment
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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> *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 a top-accent-attachment value (if one exists) for the specified
 glyph index.</p>
@@ -307,7 +294,7 @@ one-half the glyph's advance width.</p>
 <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"><span class="type">hb_font_t</span></a> to work upon</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>
@@ -330,7 +317,7 @@ width of <em class="parameter"><code>glyph</code></em>
 <div class="refsect2">
 <a name="hb-ot-math-get-glyph-kerning"></a><h3>hb_ot_math_get_glyph_kerning ()</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_math_get_glyph_kerning (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_ot_math_get_glyph_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> 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><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> correction_height</code></em>);</pre>
@@ -353,7 +340,7 @@ no such height value is found, the last kerning value is returned.</p>
 <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"><span class="type">hb_font_t</span></a> to work upon</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>
@@ -384,7 +371,7 @@ no such height value is found, the last kerning value is returned.</p>
 <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"><span class="type">hb_face_t</span></a> *face</code></em>,
+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>,
                                     <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>Tests whether the given glyph index is an extended shape in the face.</p>
 <div class="refsect3">
@@ -398,7 +385,7 @@ hb_ot_math_is_glyph_extended_shape (<em class="parameter"><code><a class="link"
 <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"><span class="type">hb_face_t</span></a> to work upon</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>
@@ -419,15 +406,15 @@ hb_ot_math_is_glyph_extended_shape (<em class="parameter"><code><a class="link"
 <div class="refsect2">
 <a name="hb-ot-math-get-glyph-variants"></a><h3>hb_ot_math_get_glyph_variants ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_math_get_glyph_variants (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_ot_math_get_glyph_variants (<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>unsigned <span class="type">int</span> start_offset</code></em>,
                                <em class="parameter"><code>unsigned <span class="type">int</span> *variants_count</code></em>,
-                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t"><span class="type">hb_ot_math_glyph_variant_t</span></a> *variants</code></em>);</pre>
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t" title="hb_ot_math_glyph_variant_t"><span class="type">hb_ot_math_glyph_variant_t</span></a> *variants</code></em>);</pre>
 <p>Fetches the MathGlyphConstruction for the specified font, glyph index, and
 direction. The corresponding list of size variants is returned as a list of
-<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t"><span class="type">hb_ot_math_glyph_variant_t</span></a> structs.</p>
+<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t" title="hb_ot_math_glyph_variant_t"><span class="type">hb_ot_math_glyph_variant_t</span></a> structs.</p>
 <div class="note">The <em class="parameter"><code>direction</code></em> parameter is only used to select between horizontal
 or vertical directions for the construction. Even though all <a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a>
 values are accepted, only the result of <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-IS-HORIZONTAL:CAPS" title="HB_DIRECTION_IS_HORIZONTAL()"><span class="type">HB_DIRECTION_IS_HORIZONTAL</span></a> is
@@ -443,7 +430,7 @@ considered.</div>
 <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"><span class="type">hb_font_t</span></a> to work upon</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>
@@ -485,7 +472,7 @@ Output = the actual number of variants returned. </p></td>
 <div class="refsect2">
 <a name="hb-ot-math-get-min-connector-overlap"></a><h3>hb_ot_math_get_min_connector_overlap ()</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_math_get_min_connector_overlap (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_ot_math_get_min_connector_overlap (<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>);</pre>
 <p>Fetches the MathVariants table for the specified font and returns the
 minimum overlap of connecting glyphs that are required to draw a glyph
@@ -505,7 +492,7 @@ considered.</div>
 <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"><span class="type">hb_font_t</span></a> to work upon</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>
@@ -526,15 +513,15 @@ considered.</div>
 <div class="refsect2">
 <a name="hb-ot-math-get-glyph-assembly"></a><h3>hb_ot_math_get_glyph_assembly ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_math_get_glyph_assembly (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
+hb_ot_math_get_glyph_assembly (<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>unsigned <span class="type">int</span> start_offset</code></em>,
                                <em class="parameter"><code>unsigned <span class="type">int</span> *parts_count</code></em>,
-                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t"><span class="type">hb_ot_math_glyph_part_t</span></a> *parts</code></em>,
+                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t" title="hb_ot_math_glyph_part_t"><span class="type">hb_ot_math_glyph_part_t</span></a> *parts</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> *italics_correction</code></em>);</pre>
 <p>Fetches the GlyphAssembly for the specified font, glyph index, and direction.
-Returned are a list of <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t"><span class="type">hb_ot_math_glyph_part_t</span></a> glyph parts that can be
+Returned are a list of <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t" title="hb_ot_math_glyph_part_t"><span class="type">hb_ot_math_glyph_part_t</span></a> glyph parts that can be
 used to draw the glyph and an italics-correction value (if one is defined
 in the font).</p>
 <div class="note">The <em class="parameter"><code>direction</code></em> parameter is only used to select between horizontal
@@ -552,7 +539,7 @@ considered.</div>
 <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"><span class="type">hb_font_t</span></a> to work upon</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>
@@ -949,7 +936,7 @@ of a glyph.</p>
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-ot-math-glyph-variant-t-struct"></a><h3>hb_ot_math_glyph_variant_t</h3>
+<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;
   hb_position_t advance;
@@ -966,12 +953,12 @@ of a glyph.</p>
 </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-math-glyph-variant-t-struct.glyph"></a>glyph</code></em>;</p></td>
+<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-math-glyph-variant-t.glyph"></a>glyph</code></em>;</p></td>
 <td class="struct_member_description"><p>The glyph index of the variant</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-glyph-variant-t-struct.advance"></a>advance</code></em>;</p></td>
+<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-glyph-variant-t.advance"></a>advance</code></em>;</p></td>
 <td class="struct_member_description"><p>The advance width of the variant</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
@@ -1003,7 +990,7 @@ of a glyph.</p>
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-ot-math-glyph-part-t-struct"></a><h3>hb_ot_math_glyph_part_t</h3>
+<a name="hb-ot-math-glyph-part-t"></a><h3>hb_ot_math_glyph_part_t</h3>
 <pre class="programlisting">typedef struct {
   hb_codepoint_t glyph;
   hb_position_t start_connector_length;
@@ -1025,27 +1012,27 @@ on the fly from parts.</p>
 </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-math-glyph-part-t-struct.glyph"></a>glyph</code></em>;</p></td>
+<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-math-glyph-part-t.glyph"></a>glyph</code></em>;</p></td>
 <td class="struct_member_description"><p>The glyph index of the variant part</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-glyph-part-t-struct.start-connector-length"></a>start_connector_length</code></em>;</p></td>
+<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-glyph-part-t.start-connector-length"></a>start_connector_length</code></em>;</p></td>
 <td class="struct_member_description"><p>The length of the connector on the starting side of the variant part</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-glyph-part-t-struct.end-connector-length"></a>end_connector_length</code></em>;</p></td>
+<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-glyph-part-t.end-connector-length"></a>end_connector_length</code></em>;</p></td>
 <td class="struct_member_description"><p>The length of the connector on the ending side of the variant part</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-glyph-part-t-struct.full-advance"></a>full_advance</code></em>;</p></td>
+<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-glyph-part-t.full-advance"></a>full_advance</code></em>;</p></td>
 <td class="struct_member_description"><p>The total advance of the part</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
-<td class="struct_member_name"><p><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"><span class="type">hb_ot_math_glyph_part_flags_t</span></a> <em class="structfield"><code><a name="hb-ot-math-glyph-part-t-struct.flags"></a>flags</code></em>;</p></td>
+<td class="struct_member_name"><p><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"><span class="type">hb_ot_math_glyph_part_flags_t</span></a> <em class="structfield"><code><a name="hb-ot-math-glyph-part-t.flags"></a>flags</code></em>;</p></td>
 <td class="struct_member_description"><p><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"><span class="type">hb_ot_math_glyph_part_flags_t</span></a> flags for the part</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
@@ -1057,6 +1044,6 @@ on the fly from parts.</p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 3fbf48d..0cf4ccc 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-ot-name: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="OpenType API">
+<link rel="up" href="ch13.html" title="OpenType API">
 <link rel="prev" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">
 <link rel="next" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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">
@@ -18,7 +18,7 @@
                   <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="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="n" href="harfbuzz-hb-ot-shape.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
@@ -35,8 +35,8 @@
 <a name="harfbuzz-hb-ot-name.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -74,8 +74,8 @@
 <a name="harfbuzz-hb-ot-name.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody><tr>
 <td class="typedef_keyword">typedef</td>
@@ -97,7 +97,7 @@
 <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> *
-hb_ot_name_list_names (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+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
 array is owned by the <em class="parameter"><code>face</code></em>
@@ -137,7 +137,7 @@ used as long as <em class="parameter"><code>face</code></em>
 <div class="refsect2">
 <a name="hb-ot-name-get-utf16"></a><h3>hb_ot_name_get_utf16 ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_name_get_utf16 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_name_get_utf16 (<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-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> name_id</code></em>,
                       <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>,
                       <em class="parameter"><code>unsigned <span class="type">int</span> *text_size</code></em>,
@@ -195,7 +195,7 @@ text written to buffer. </p></td>
 <div class="refsect2">
 <a name="hb-ot-name-get-utf32"></a><h3>hb_ot_name_get_utf32 ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_name_get_utf32 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_name_get_utf32 (<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-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> name_id</code></em>,
                       <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>,
                       <em class="parameter"><code>unsigned <span class="type">int</span> *text_size</code></em>,
@@ -253,7 +253,7 @@ text written to buffer. </p></td>
 <div class="refsect2">
 <a name="hb-ot-name-get-utf8"></a><h3>hb_ot_name_get_utf8 ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_name_get_utf8 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_name_get_utf8 (<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-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="type">hb_ot_name_id_t</span></a> name_id</code></em>,
                      <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>,
                      <em class="parameter"><code>unsigned <span class="type">int</span> *text_size</code></em>,
@@ -322,6 +322,6 @@ API.  These can be used to fetch name strings from a font face.</p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 56d06c9..ce75403 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-ot-shape: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="OpenType API">
+<link rel="up" href="ch13.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.29 (XML mode)">
+<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">
@@ -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="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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-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>
@@ -35,8 +35,8 @@
 <a name="harfbuzz-hb-ot-shape.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody><tr>
 <td class="function_type">
 <div class="refsect2">
 <a name="hb-ot-shape-glyphs-closure"></a><h3>hb_ot_shape_glyphs_closure ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_ot_shape_glyphs_closure (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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"><span class="type">hb_feature_t</span></a> *features</code></em>,
+hb_ot_shape_glyphs_closure (<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-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>,
-                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *glyphs</code></em>);</pre>
+                            <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 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 class="refsect1">
-<a name="harfbuzz-hb-ot-shape.other_details"></a><h2>Types and Values</h2>
-</div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 11fee9b..d8fe073 100644 (file)
@@ -5,23 +5,22 @@
 <title>hb-ot-var: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch12.html" title="OpenType API">
+<link rel="up" href="ch13.html" title="OpenType API">
 <link rel="prev" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">
-<link rel="next" href="ch13.html" title="Apple Advanced Typography API">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<link rel="next" href="ch14.html" title="Apple Advanced Typography 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">
 <a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-ot-var.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-ot-var.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch12.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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-shape.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="ch14.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>
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-ot-var.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
 <a name="harfbuzz-hb-ot-var.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-ot-var.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
-    <span class="lineart">╰──</span> hb_ot_var_axis_flags_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-ot-var.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb-ot.h&gt;
 </pre>
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-ot-var-has-data.parameters"></a><h4>Parameters</h4>
@@ -186,7 +179,7 @@ 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"><span class="type">hb_face_t</span></a> to test</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_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -201,7 +194,7 @@ hb_ot_var_has_data (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <div class="refsect2">
 <a name="hb-ot-var-find-axis-info"></a><h3>hb_ot_var_find_axis_info ()</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_find_axis_info (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+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>
 <p class="since">Since: <a class="link" href="api-index-2-2-0.html#api-index-2.2.0">2.2.0</a></p>
@@ -210,14 +203,14 @@ hb_ot_var_find_axis_info (<em class="parameter"><code><a class="link" href="harf
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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 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-get-axis-infos"></a><h3>hb_ot_var_get_axis_infos ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
-hb_ot_var_get_axis_infos (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+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>
@@ -227,14 +220,14 @@ hb_ot_var_get_axis_infos (<em class="parameter"><code><a class="link" href="harf
 <div class="refsect2">
 <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"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
+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>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ot-var-named-instance-get-subfamily-name-id"></a><h3>hb_ot_var_named_instance_get_subfamily_name_id ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
 hb_ot_var_named_instance_get_subfamily_name_id
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> instance_index</code></em>);</pre>
 </div>
 <hr>
@@ -242,7 +235,7 @@ hb_ot_var_named_instance_get_subfamily_name_id
 <a name="hb-ot-var-named-instance-get-postscript-name-id"></a><h3>hb_ot_var_named_instance_get_postscript_name_id ()</h3>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-ot-name.html#hb-ot-name-id-t" title="hb_ot_name_id_t"><span class="returnvalue">hb_ot_name_id_t</span></a>
 hb_ot_var_named_instance_get_postscript_name_id
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <em class="parameter"><code>unsigned <span class="type">int</span> instance_index</code></em>);</pre>
 </div>
 <hr>
@@ -250,7 +243,7 @@ hb_ot_var_named_instance_get_postscript_name_id
 <a name="hb-ot-var-named-instance-get-design-coords"></a><h3>hb_ot_var_named_instance_get_design_coords ()</h3>
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_ot_var_named_instance_get_design_coords
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</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>,
                                 <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>
@@ -259,7 +252,7 @@ hb_ot_var_named_instance_get_design_coords
 <div class="refsect2">
 <a name="hb-ot-var-normalize-variations"></a><h3>hb_ot_var_normalize_variations ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_ot_var_normalize_variations (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_var_normalize_variations (<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>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>,
                                 <em class="parameter"><code><span class="type">int</span> *coords</code></em>,
@@ -270,7 +263,7 @@ hb_ot_var_normalize_variations (<em class="parameter"><code><a class="link" href
 <div class="refsect2">
 <a name="hb-ot-var-normalize-coords"></a><h3>hb_ot_var_normalize_coords ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_ot_var_normalize_coords (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
+hb_ot_var_normalize_coords (<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> 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>
@@ -340,6 +333,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.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 8c2c408..6cc86d9 100644 (file)
@@ -5,21 +5,20 @@
 <title>hb-set: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.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.29 (XML mode)">
+<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-set.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-set.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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>
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-set.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -74,7 +73,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
+<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-create" title="hb_set_create ()">hb_set_create</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
+<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-get-empty" title="hb_set_get_empty ()">hb_set_get_empty</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
+<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-reference" title="hb_set_reference ()">hb_set_reference</a> <span class="c_punctuation">()</span>
 </tbody>
 </table></div>
 </div>
-<a name="hb-set-t"></a><div class="refsect1">
+<div class="refsect1">
 <a name="harfbuzz-hb-set.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </tr>
 <tr>
 <td class="typedef_keyword">typedef</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-set.html#hb-set-t">hb_set_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-set.html#hb-set-t" title="hb_set_t">hb_set_t</a></td>
 </tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-set.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
-    <span class="lineart">╰──</span> hb_set_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-set.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb.h&gt;
 </pre>
@@ -307,7 +300,7 @@ or other integer values.</p>
 <div class="refsect2">
 <a name="hb-set-add"></a><h3>hb_set_add ()</h3>
 <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"><span class="type">hb_set_t</span></a> *set</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-set-add.parameters"></a><h4>Parameters</h4>
@@ -330,7 +323,7 @@ hb_set_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
 <div class="refsect2">
 <a name="hb-set-add-range"></a><h3>hb_set_add_range ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_set_add_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+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>
 <div class="refsect3">
@@ -354,7 +347,7 @@ hb_set_add_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <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"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-allocation-successful.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -376,7 +369,7 @@ hb_set_allocation_successful (<em class="parameter"><code>const <a class="link"
 <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"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-clear.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -397,7 +390,7 @@ hb_set_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_set_t</span></a> *
+<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><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
@@ -411,7 +404,7 @@ hb_set_create (<em class="parameter"><code><span class="type">void</span></code>
 <div class="refsect2">
 <a name="hb-set-del"></a><h3>hb_set_del ()</h3>
 <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"><span class="type">hb_set_t</span></a> *set</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-set-del.parameters"></a><h4>Parameters</h4>
@@ -434,7 +427,7 @@ hb_set_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
 <div class="refsect2">
 <a name="hb-set-del-range"></a><h3>hb_set_del_range ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_set_del_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+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>
 <div class="refsect3">
@@ -458,7 +451,7 @@ hb_set_del_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <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"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+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><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>
@@ -480,7 +473,7 @@ hb_set_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-se
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_set_t</span></a> *
+<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>
 <div class="refsect3">
 <a name="hb-set-get-empty.returns"></a><h4>Returns</h4>
@@ -493,7 +486,7 @@ hb_set_get_empty (<em class="parameter"><code><span class="type">void</span></co
 <div class="refsect2">
 <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"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-get-max.parameters"></a><h4>Parameters</h4>
@@ -520,7 +513,7 @@ hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz
 <div class="refsect2">
 <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"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-get-min.parameters"></a><h4>Parameters</h4>
@@ -547,7 +540,7 @@ hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz
 <div class="refsect2">
 <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"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-get-population.parameters"></a><h4>Parameters</h4>
@@ -574,8 +567,8 @@ hb_set_get_population (<em class="parameter"><code>const <a class="link" href="h
 <div class="refsect2">
 <a name="hb-set-get-user-data"></a><h3>hb_set_get_user_data ()</h3>
 <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"><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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+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><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>
@@ -603,7 +596,7 @@ hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <div class="refsect2">
 <a name="hb-set-has"></a><h3>hb_set_has ()</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_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+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>
 <div class="refsect3">
 <a name="hb-set-has.parameters"></a><h4>Parameters</h4>
@@ -626,8 +619,8 @@ hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-set-intersect"></a><h3>hb_set_intersect ()</h3>
 <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"><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"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-intersect.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -649,7 +642,7 @@ hb_set_intersect (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <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"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-is-empty.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -671,8 +664,8 @@ hb_set_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuz
 <div class="refsect2">
 <a name="hb-set-is-equal"></a><h3>hb_set_is_equal ()</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_equal (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#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"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-is-equal.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -697,7 +690,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> <code class="literal">TRUE</code> if the two sets are equal, <code class="literal">FALSE</code> otherwise.</p>
+<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>
 </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>
@@ -705,8 +698,8 @@ hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuz
 <div class="refsect2">
 <a name="hb-set-is-subset"></a><h3>hb_set_is_subset ()</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_subset (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#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"><span class="type">hb_set_t</span></a> *larger_set</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-is-subset.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -731,9 +724,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> <code class="literal">TRUE</code> if the <em class="parameter"><code>set</code></em>
+<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>
 is a subset of (or equal to) <em class="parameter"><code>larger_set</code></em>
-, <code class="literal">FALSE</code> otherwise.</p>
+, <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> 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>
@@ -741,7 +734,7 @@ is a subset of (or equal to) <em class="parameter"><code>larger_set</code></em>
 <div class="refsect2">
 <a name="hb-set-next"></a><h3>hb_set_next ()</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_next (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+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>
  that is greater than current value of <em class="parameter"><code>codepoint</code></em>
@@ -780,7 +773,7 @@ hb_set_next (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb
 <div class="refsect2">
 <a name="hb-set-next-range"></a><h3>hb_set_next_range ()</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_next_range (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+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>
@@ -826,7 +819,7 @@ are greater than current value of <em class="parameter"><code>last</code></em>
 <div class="refsect2">
 <a name="hb-set-previous"></a><h3>hb_set_previous ()</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_previous (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+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>
  that is lower than current value of <em class="parameter"><code>codepoint</code></em>
@@ -865,7 +858,7 @@ hb_set_previous (<em class="parameter"><code>const <a class="link" href="harfbuz
 <div class="refsect2">
 <a name="hb-set-previous-range"></a><h3>hb_set_previous_range ()</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_previous_range (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
+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>
@@ -910,8 +903,8 @@ are less than current value of <em class="parameter"><code>first</code></em>
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<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><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>
@@ -939,8 +932,8 @@ hb_set_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <div class="refsect2">
 <a name="hb-set-set"></a><h3>hb_set_set ()</h3>
 <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"><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"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-set.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -962,8 +955,8 @@ hb_set_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
 <div class="refsect2">
 <a name="hb-set-set-user-data"></a><h3>hb_set_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_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+hb_set_set_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>,
                       <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>
@@ -989,8 +982,8 @@ hb_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <div class="refsect2">
 <a name="hb-set-subtract"></a><h3>hb_set_subtract ()</h3>
 <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"><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"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-subtract.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1012,8 +1005,8 @@ hb_set_subtract (<em class="parameter"><code><a class="link" href="harfbuzz-hb-s
 <div class="refsect2">
 <a name="hb-set-symmetric-difference"></a><h3>hb_set_symmetric_difference ()</h3>
 <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"><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"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-symmetric-difference.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1035,8 +1028,8 @@ hb_set_symmetric_difference (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-set-union"></a><h3>hb_set_union ()</h3>
 <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"><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"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
+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>
 <div class="refsect3">
 <a name="hb-set-union.parameters"></a><h4>Parameters</h4>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
@@ -1071,6 +1064,6 @@ hb_set_union (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 577c556..e4d2ea8 100644 (file)
@@ -5,21 +5,20 @@
 <title>hb-shape-plan: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.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.29 (XML mode)">
+<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-shape-plan.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-shape-plan.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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>
 <a name="harfbuzz-hb-shape-plan.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<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-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create" title="hb_shape_plan_create ()">hb_shape_plan_create</a> <span class="c_punctuation">()</span>
@@ -50,7 +49,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
@@ -58,7 +57,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-create2" title="hb_shape_plan_create2 ()">hb_shape_plan_create2</a> <span class="c_punctuation">()</span>
@@ -66,7 +65,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
@@ -90,7 +89,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-reference" title="hb_shape_plan_reference ()">hb_shape_plan_reference</a> <span class="c_punctuation">()</span>
 </tbody>
 </table></div>
 </div>
-<a name="hb-shape-plan-t"></a><div class="refsect1">
+<div class="refsect1">
 <a name="harfbuzz-hb-shape-plan.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody><tr>
 <td class="typedef_keyword">typedef</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t">hb_shape_plan_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t" title="hb_shape_plan_t">hb_shape_plan_t</a></td>
 </tr></tbody>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-shape-plan.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
-    <span class="lineart">╰──</span> hb_shape_plan_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-shape-plan.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb.h&gt;
 </pre>
@@ -165,10 +158,10 @@ Most client would not need to deal with shape plans directly.</p>
 <a name="harfbuzz-hb-shape-plan.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="hb-shape-plan-create"></a><h3>hb_shape_plan_create ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
-hb_shape_plan_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
-                      <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>,
-                      <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *user_features</code></em>,
+<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_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>,
+                      <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> *props</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> *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><span class="annotation">[Xconstructor]</span></p>
@@ -204,10 +197,10 @@ hb_shape_plan_create (<em class="parameter"><code><a class="link" href="harfbuzz
 <hr>
 <div class="refsect2">
 <a name="hb-shape-plan-create-cached"></a><h3>hb_shape_plan_create_cached ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
-hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
-                             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>,
-                             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *user_features</code></em>,
+<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_create_cached (<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>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> *props</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> *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>
 <div class="refsect3">
@@ -242,10 +235,10 @@ hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="h
 <hr>
 <div class="refsect2">
 <a name="hb-shape-plan-create2"></a><h3>hb_shape_plan_create2 ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
-hb_shape_plan_create2 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
-                       <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>,
-                       <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *user_features</code></em>,
+<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_create2 (<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>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> *props</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> *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">int</span> *coords</code></em>,
                        <em class="parameter"><code>unsigned <span class="type">int</span> num_coords</code></em>,
@@ -254,10 +247,10 @@ hb_shape_plan_create2 (<em class="parameter"><code><a class="link" href="harfbuz
 <hr>
 <div class="refsect2">
 <a name="hb-shape-plan-create-cached2"></a><h3>hb_shape_plan_create_cached2 ()</h3>
-<pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
-hb_shape_plan_create_cached2 (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
-                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>,
-                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-common.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *user_features</code></em>,
+<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_create_cached2 (<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>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> *props</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> *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">int</span> *coords</code></em>,
                               <em class="parameter"><code>unsigned <span class="type">int</span> num_coords</code></em>,
@@ -267,7 +260,7 @@ hb_shape_plan_create_cached2 (<em class="parameter"><code><a class="link" href="
 <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"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
+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><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>
@@ -290,10 +283,10 @@ hb_shape_plan_destroy (<em class="parameter"><code><a class="link" href="harfbuz
 <div class="refsect2">
 <a name="hb-shape-plan-execute"></a><h3>hb_shape_plan_execute ()</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_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#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-font.html#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-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"><span class="type">hb_feature_t</span></a> *features</code></em>,
+hb_shape_plan_execute (<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-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-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>
 <div class="refsect3">
 <a name="hb-shape-plan-execute.parameters"></a><h4>Parameters</h4>
@@ -332,7 +325,7 @@ hb_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuz
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_shape_plan_t</span></a> *
+<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>
 <div class="refsect3">
 <a name="hb-shape-plan-get-empty.returns"></a><h4>Returns</h4>
@@ -345,7 +338,7 @@ hb_shape_plan_get_empty (<em class="parameter"><code><span class="type">void</sp
 <div class="refsect2">
 <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"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
+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>
 <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">
@@ -372,8 +365,8 @@ hb_shape_plan_get_shaper (<em class="parameter"><code><a class="link" href="harf
 <div class="refsect2">
 <a name="hb-shape-plan-get-user-data"></a><h3>hb_shape_plan_get_user_data ()</h3>
 <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"><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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+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><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>
@@ -400,8 +393,8 @@ hb_shape_plan_get_user_data (<em class="parameter"><code><a class="link" href="h
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
+<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><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>
@@ -429,8 +422,8 @@ hb_shape_plan_reference (<em class="parameter"><code><a class="link" href="harfb
 <div class="refsect2">
 <a name="hb-shape-plan-set-user-data"></a><h3>hb_shape_plan_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_shape_plan_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+hb_shape_plan_set_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>,
                              <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>
@@ -463,6 +456,6 @@ hb_shape_plan_set_user_data (<em class="parameter"><code><a class="link" href="h
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index d61f3ea..3e980ee 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-shape: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.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.29 (XML mode)">
+<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">
@@ -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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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>
@@ -35,8 +35,8 @@
 <a name="harfbuzz-hb-shape.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -82,15 +82,15 @@ contains the output glyphs and their positions.</p>
 <div class="refsect2">
 <a name="hb-shape"></a><h3>hb_shape ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_shape (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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"><span class="type">hb_feature_t</span></a> *features</code></em>,
+hb_shape (<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-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>Shapes <em class="parameter"><code>buffer</code></em>
  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 <code class="literal">NULL</code>, it will be used to control the
+ 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
 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
@@ -106,18 +106,18 @@ precedence.</p>
 <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"><span class="type">hb_font_t</span></a> to use for shaping</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> to use for shaping</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <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"><span class="type">hb_buffer_t</span></a> to shape</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 shape</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <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"><span class="type">hb_feature_t</span></a> or <code class="literal">NULL</code>. </p></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 <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>
 </tr>
 <tr>
@@ -135,13 +135,13 @@ array</p></td>
 <div class="refsect2">
 <a name="hb-shape-full"></a><h3>hb_shape_full ()</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_shape_full (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#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-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"><span class="type">hb_feature_t</span></a> *features</code></em>,
+hb_shape_full (<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-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>,
                <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 <code class="literal">NULL</code>, the specified
+ is not <a href="/usr/share/gtk-doc/html/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, the specified
 shapers will be used in the given order, otherwise the default shapers list
 will be used.</p>
 <div class="refsect3">
@@ -155,18 +155,18 @@ will be used.</p>
 <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"><span class="type">hb_font_t</span></a> to use for shaping</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> to use for shaping</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <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"><span class="type">hb_buffer_t</span></a> to shape</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 shape</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <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"><span class="type">hb_feature_t</span></a> or <code class="literal">NULL</code>. </p></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 <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>
 </tr>
 <tr>
@@ -177,8 +177,8 @@ array</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>shaper_list</p></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_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>
 </tr>
 </tbody>
@@ -205,11 +205,8 @@ constant strings. </p>
 <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 class="refsect1">
-<a name="harfbuzz-hb-shape.other_details"></a><h2>Types and Values</h2>
-</div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 2762f3c..9da568e 100644 (file)
@@ -5,21 +5,20 @@
 <title>hb-unicode: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.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.29 (XML mode)">
+<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-unicode.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#harfbuzz-hb-unicode.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="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>
@@ -36,8 +35,8 @@
 <a name="harfbuzz-hb-unicode.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -90,7 +89,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-create" title="hb_unicode_funcs_create ()">hb_unicode_funcs_create</a> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <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> <span class="c_punctuation">()</span>
 </tr>
 <tr>
 <td class="function_type">
-<a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-reference" title="hb_unicode_funcs_reference ()">hb_unicode_funcs_reference</a> <span class="c_punctuation">()</span>
 </tbody>
 </table></div>
 </div>
-<a name="hb-unicode-funcs-t"></a><div class="refsect1">
+<div class="refsect1">
 <a name="harfbuzz-hb-unicode.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </tr>
 <tr>
 <td class="typedef_keyword">typedef</td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t">hb_unicode_funcs_t</a></td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t" title="hb_unicode_funcs_t">hb_unicode_funcs_t</a></td>
 </tr>
 <tr>
 <td class="datatype_keyword">enum</td>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="harfbuzz-hb-unicode.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="/usr/share/gtk-doc/html/gobject/gobject-Boxed-Types.html">GBoxed</a>
-    <span class="lineart">╰──</span> hb_unicode_funcs_t
-    <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
-    <span class="lineart">├──</span> hb_unicode_combining_class_t
-    <span class="lineart">╰──</span> hb_unicode_general_category_t
-</pre>
-</div>
-<div class="refsect1">
 <a name="harfbuzz-hb-unicode.includes"></a><h2>Includes</h2>
 <pre class="synopsis">#include &lt;hb.h&gt;
 </pre>
@@ -321,7 +311,7 @@ properties, such as General Category, Script, Combining Class, etc.</p>
 <div class="refsect2">
 <a name="hb-unicode-combining-class"></a><h3>hb_unicode_combining_class ()</h3>
 <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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+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 class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -329,7 +319,7 @@ hb_unicode_combining_class (<em class="parameter"><code><a class="link" href="ha
 <div class="refsect2">
 <a name="hb-unicode-combining-class-func-t"></a><h3>hb_unicode_combining_class_func_t ()</h3>
 <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>
-<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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+<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>
 </div>
@@ -337,7 +327,7 @@ hb_unicode_combining_class (<em class="parameter"><code><a class="link" href="ha
 <div class="refsect2">
 <a name="hb-unicode-compose"></a><h3>hb_unicode_compose ()</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_compose (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+hb_unicode_compose (<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> 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>
@@ -369,7 +359,7 @@ hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <div class="refsect2">
 <a name="hb-unicode-compose-func-t"></a><h3>hb_unicode_compose_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_unicode_compose_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+<span class="c_punctuation">(</span>*hb_unicode_compose_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> 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>,
@@ -379,7 +369,7 @@ hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <div class="refsect2">
 <a name="hb-unicode-decompose"></a><h3>hb_unicode_decompose ()</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_decompose (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+hb_unicode_decompose (<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> 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>
@@ -416,7 +406,7 @@ hb_unicode_decompose (<em class="parameter"><code><a class="link" href="harfbuzz
 <div class="refsect2">
 <a name="hb-unicode-decompose-func-t"></a><h3>hb_unicode_decompose_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_unicode_decompose_func_t<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+<span class="c_punctuation">(</span>*hb_unicode_decompose_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> 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>,
@@ -425,8 +415,8 @@ hb_unicode_decompose (<em class="parameter"><code><a class="link" href="harfbuzz
 <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"><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"><span class="type">hb_unicode_funcs_t</span></a> *parent</code></em>);</pre>
+<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><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-create.parameters"></a><h4>Parameters</h4>
@@ -454,7 +444,7 @@ hb_unicode_funcs_create (<em class="parameter"><code><a class="link" href="harfb
 <div class="refsect2">
 <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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+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><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>
@@ -476,13 +466,13 @@ hb_unicode_funcs_destroy (<em class="parameter"><code><a class="link" href="harf
 <hr>
 <div class="refsect2">
 <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"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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>
 </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"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
+<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>
 <div class="refsect3">
 <a name="hb-unicode-funcs-get-empty.returns"></a><h4>Returns</h4>
@@ -494,8 +484,8 @@ hb_unicode_funcs_get_empty (<em class="parameter"><code><span class="type">void<
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<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>
 <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">
@@ -517,8 +507,8 @@ hb_unicode_funcs_get_parent (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-unicode-funcs-get-user-data"></a><h3>hb_unicode_funcs_get_user_data ()</h3>
 <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"><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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
+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><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>
@@ -546,7 +536,7 @@ hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href
 <div class="refsect2">
 <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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+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>
 <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">
@@ -568,7 +558,7 @@ hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href=
 <div class="refsect2">
 <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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+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>
 <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">
@@ -589,8 +579,8 @@ hb_unicode_funcs_make_immutable (<em class="parameter"><code><a class="link" hre
 <hr>
 <div class="refsect2">
 <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"><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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
+<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><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>
@@ -619,7 +609,7 @@ hb_unicode_funcs_reference (<em class="parameter"><code><a class="link" href="ha
 <a name="hb-unicode-funcs-set-combining-class-func"></a><h3>hb_unicode_funcs_set_combining_class_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_unicode_funcs_set_combining_class_func
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#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-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-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>
@@ -651,7 +641,7 @@ hb_unicode_funcs_set_combining_class_func
 <div class="refsect2">
 <a name="hb-unicode-funcs-set-compose-func"></a><h3>hb_unicode_funcs_set_compose_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_unicode_funcs_set_compose_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+hb_unicode_funcs_set_compose_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-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>
@@ -683,7 +673,7 @@ hb_unicode_funcs_set_compose_func (<em class="parameter"><code><a class="link" h
 <div class="refsect2">
 <a name="hb-unicode-funcs-set-decompose-func"></a><h3>hb_unicode_funcs_set_decompose_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_unicode_funcs_set_decompose_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+hb_unicode_funcs_set_decompose_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-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>
@@ -716,7 +706,7 @@ hb_unicode_funcs_set_decompose_func (<em class="parameter"><code><a class="link"
 <a name="hb-unicode-funcs-set-general-category-func"></a><h3>hb_unicode_funcs_set_general_category_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_unicode_funcs_set_general_category_func
-                               (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#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-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-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>
@@ -748,7 +738,7 @@ hb_unicode_funcs_set_general_category_func
 <div class="refsect2">
 <a name="hb-unicode-funcs-set-mirroring-func"></a><h3>hb_unicode_funcs_set_mirroring_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_unicode_funcs_set_mirroring_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+hb_unicode_funcs_set_mirroring_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-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>
@@ -780,7 +770,7 @@ hb_unicode_funcs_set_mirroring_func (<em class="parameter"><code><a class="link"
 <div class="refsect2">
 <a name="hb-unicode-funcs-set-script-func"></a><h3>hb_unicode_funcs_set_script_func ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-hb_unicode_funcs_set_script_func (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+hb_unicode_funcs_set_script_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-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>
@@ -812,8 +802,8 @@ hb_unicode_funcs_set_script_func (<em class="parameter"><code><a class="link" hr
 <div class="refsect2">
 <a name="hb-unicode-funcs-set-user-data"></a><h3>hb_unicode_funcs_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_unicode_funcs_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#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"><span class="type">hb_user_data_key_t</span></a> *key</code></em>,
+hb_unicode_funcs_set_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>,
                                 <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>
@@ -839,7 +829,7 @@ hb_unicode_funcs_set_user_data (<em class="parameter"><code><a class="link" href
 <div class="refsect2">
 <a name="hb-unicode-general-category"></a><h3>hb_unicode_general_category ()</h3>
 <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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+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 class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -847,7 +837,7 @@ hb_unicode_general_category (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-unicode-general-category-func-t"></a><h3>hb_unicode_general_category_func_t ()</h3>
 <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>
-<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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+<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>
 </div>
@@ -855,7 +845,7 @@ hb_unicode_general_category (<em class="parameter"><code><a class="link" href="h
 <div class="refsect2">
 <a name="hb-unicode-mirroring"></a><h3>hb_unicode_mirroring ()</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_unicode_mirroring (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+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 class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -863,7 +853,7 @@ hb_unicode_mirroring (<em class="parameter"><code><a class="link" href="harfbuzz
 <div class="refsect2">
 <a name="hb-unicode-mirroring-func-t"></a><h3>hb_unicode_mirroring_func_t ()</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>
-<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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+<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>
 </div>
@@ -871,7 +861,7 @@ hb_unicode_mirroring (<em class="parameter"><code><a class="link" href="harfbuzz
 <div class="refsect2">
 <a name="hb-unicode-script"></a><h3>hb_unicode_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_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+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 class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 </div>
@@ -879,7 +869,7 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <div class="refsect2">
 <a name="hb-unicode-script-func-t"></a><h3>hb_unicode_script_func_t ()</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>
-<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"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
+<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>
 </div>
@@ -1368,6 +1358,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.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 7ad9a1e..84eb4c3 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-uniscribe: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch14.html" title="Integration API">
+<link rel="up" href="ch15.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.29 (XML mode)">
+<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">
@@ -18,7 +18,7 @@
                   <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="ch14.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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-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>
 </tr></table>
@@ -35,8 +35,8 @@
 <a name="harfbuzz-hb-uniscribe.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-uniscribe.description"></a><h2>Description</h2>
-<p>Functions for using HarfBuzz with the Windows fonts.</p>
+<p>Functions for using HarfBuzz with Windows fonts.</p>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-uniscribe.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="hb-uniscribe-font-get-hfont"></a><h3>hb_uniscribe_font_get_hfont ()</h3>
 <pre class="programlisting"><span class="returnvalue">HFONT</span>
-hb_uniscribe_font_get_hfont (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+hb_uniscribe_font_get_hfont (<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 HFONT handle that corresponds to 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.</p>
+<div class="refsect3">
+<a name="hb-uniscribe-font-get-hfont.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>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 work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-uniscribe-font-get-hfont.returns"></a><h4>Returns</h4>
+<p> the HFONT retreieved</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-uniscribe-font-get-logfontw"></a><h3>hb_uniscribe_font_get_logfontw ()</h3>
 <pre class="programlisting"><span class="returnvalue">LOGFONTW</span> *
-hb_uniscribe_font_get_logfontw (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
+hb_uniscribe_font_get_logfontw (<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 LOGFONTW structure that corresponds to 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.</p>
+<div class="refsect3">
+<a name="hb-uniscribe-font-get-logfontw.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>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 work upon</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-uniscribe-font-get-logfontw.returns"></a><h4>Returns</h4>
+<p> a pointer to the LOGFONTW retrieved</p>
 </div>
 </div>
-<div class="refsect1">
-<a name="harfbuzz-hb-uniscribe.other_details"></a><h2>Types and Values</h2>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 2039c3b..ac4a8b1 100644 (file)
@@ -5,10 +5,10 @@
 <title>hb-version: HarfBuzz Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch11.html" title="Core API">
+<link rel="up" href="ch12.html" title="Core API">
 <link rel="prev" href="harfbuzz-hb-unicode.html" title="hb-unicode">
-<link rel="next" href="ch12.html" title="OpenType API">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<link rel="next" href="ch13.html" title="OpenType 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">
@@ -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="ch11.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></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="harfbuzz-hb-unicode.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>
+<td><a accesskey="n" href="ch13.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>
@@ -35,8 +35,8 @@
 <a name="harfbuzz-hb-version.functions"></a><h2>Functions</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
+<col width="150px" class="functions_proto_type">
+<col class="functions_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -75,8 +75,8 @@
 <a name="harfbuzz-hb-version.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
-<col width="150px" class="name">
-<col class="description">
+<col width="150px" class="other_proto_type">
+<col class="other_proto_name">
 </colgroup>
 <tbody>
 <tr>
@@ -184,7 +184,7 @@ hb_version_string (<em class="parameter"><code><span class="type">void</span></c
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-MICRO:CAPS"></a><h3>HB_VERSION_MICRO</h3>
-<pre class="programlisting">#define HB_VERSION_MICRO 4
+<pre class="programlisting">#define HB_VERSION_MICRO 7
 </pre>
 </div>
 <hr>
@@ -196,12 +196,12 @@ hb_version_string (<em class="parameter"><code><span class="type">void</span></c
 <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.4"
+<pre class="programlisting">#define HB_VERSION_STRING "2.6.7"
 </pre>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index a577faf..333bbee 100644 (file)
         <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"/>
+        <sub name="FreeType integration" link="integration-freetype.html"/>
+        <sub name="Uniscribe integration" link="integration-uniscribe.html"/>
+        <sub name="Core Text integration" link="integration-coretext.html"/>
+        <sub name="ICU integration" link="integration-icu.html"/>
+        <sub name="Python bindings" link="integration-python.html"/>
+      </sub>
     </sub>
     <sub name="Reference manual" link="pt02.html">
-      <sub name="Core API" link="ch11.html">
+      <sub name="Core API" link="ch12.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="ch12.html">
+      <sub name="OpenType API" link="ch13.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-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="ch13.html">
+      <sub name="Apple Advanced Typography API" link="ch14.html">
         <sub name="hb-aat-layout" link="harfbuzz-hb-aat-layout.html"/>
       </sub>
-      <sub name="Integration API" link="ch14.html">
+      <sub name="Integration API" link="ch15.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"/>
     <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="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-struct"/>
+    <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="enum" name="enum hb_buffer_flags_t" link="harfbuzz-hb-buffer.html#hb-buffer-flags-t" since="0.9.20"/>
     <keyword type="enum" name="enum hb_buffer_cluster_level_t" link="harfbuzz-hb-buffer.html#hb-buffer-cluster-level-t" since="0.9.42"/>
-    <keyword type="struct" name="hb_segment_properties_t" link="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct"/>
+    <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="typedef" name="hb_codepoint_t" link="harfbuzz-hb-common.html#hb-codepoint-t"/>
     <keyword type="enum" name="enum hb_direction_t" link="harfbuzz-hb-common.html#hb-direction-t"/>
     <keyword type="typedef" name="hb_language_t" link="harfbuzz-hb-common.html#hb-language-t"/>
-    <keyword type="struct" name="hb_feature_t" link="harfbuzz-hb-common.html#hb-feature-t-struct"/>
+    <keyword type="struct" name="hb_feature_t" link="harfbuzz-hb-common.html#hb-feature-t"/>
     <keyword type="struct" name="hb_variation_t" link="harfbuzz-hb-common.html#hb-variation-t" since="1.4.2"/>
     <keyword type="typedef" name="hb_mask_t" link="harfbuzz-hb-common.html#hb-mask-t"/>
     <keyword type="typedef" name="hb_position_t" link="harfbuzz-hb-common.html#hb-position-t"/>
     <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-struct"/>
+    <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_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_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_decompose_compatibility_func_t ()" link="harfbuzz-hb-deprecated.html#hb-unicode-decompose-compatibility-func-t" deprecated="2.0.0"/>
     <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="function" name="hb_font_get_nominal_glyph ()" link="harfbuzz-hb-font.html#hb-font-get-nominal-glyph" since="1.2.3"/>
     <keyword type="function" name="hb_font_get_nominal_glyph_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-nominal-glyph-func-t"/>
     <keyword type="function" name="hb_font_get_nominal_glyphs ()" link="harfbuzz-hb-font.html#hb-font-get-nominal-glyphs" since="2.6.3"/>
+    <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_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_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_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="macro" name="HB_OT_MATH_SCRIPT" link="harfbuzz-hb-ot-math.html#HB-OT-MATH-SCRIPT:CAPS"/>
     <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_glyph_variant_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t-struct"/>
+    <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-struct"/>
+    <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_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="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="function" name="hb_coretext_face_create ()" link="harfbuzz-hb-coretext.html#hb-coretext-face-create"/>
-    <keyword type="function" name="hb_coretext_font_create ()" link="harfbuzz-hb-coretext.html#hb-coretext-font-create"/>
-    <keyword type="function" name="hb_coretext_face_get_cg_font ()" link="harfbuzz-hb-coretext.html#hb-coretext-face-get-cg-font"/>
+    <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="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="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_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_ft_font_get_load_flags ()" link="harfbuzz-hb-ft.html#hb-ft-font-get-load-flags" since="1.0.5"/>
-    <keyword type="function" name="hb_ft_font_set_funcs ()" link="harfbuzz-hb-ft.html#hb-ft-font-set-funcs"/>
-    <keyword type="function" name="hb_glib_get_unicode_funcs ()" link="harfbuzz-hb-glib.html#hb-glib-get-unicode-funcs"/>
-    <keyword type="function" name="hb_glib_script_from_script ()" link="harfbuzz-hb-glib.html#hb-glib-script-from-script"/>
-    <keyword type="function" name="hb_glib_script_to_script ()" link="harfbuzz-hb-glib.html#hb-glib-script-to-script"/>
+    <keyword type="function" name="hb_ft_font_set_funcs ()" link="harfbuzz-hb-ft.html#hb-ft-font-set-funcs" since="1.0.5"/>
+    <keyword type="function" name="hb_glib_get_unicode_funcs ()" link="harfbuzz-hb-glib.html#hb-glib-get-unicode-funcs" since="0.9.38"/>
+    <keyword type="function" name="hb_glib_script_from_script ()" link="harfbuzz-hb-glib.html#hb-glib-script-from-script" since="0.9.38"/>
+    <keyword type="function" name="hb_glib_script_to_script ()" link="harfbuzz-hb-glib.html#hb-glib-script-to-script" since="0.9.38"/>
     <keyword type="function" name="hb_glib_blob_create ()" link="harfbuzz-hb-glib.html#hb-glib-blob-create" since="0.9.38"/>
-    <keyword type="function" name="hb_gobject_blob_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-blob-get-type" since="0.9.2"/>
-    <keyword type="function" name="hb_gobject_buffer_content_type_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-content-type-get-type"/>
-    <keyword type="function" name="hb_gobject_buffer_diff_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-diff-flags-get-type"/>
-    <keyword type="function" name="hb_gobject_buffer_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-flags-get-type"/>
-    <keyword type="function" name="hb_gobject_buffer_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-get-type" since="0.9.2"/>
-    <keyword type="function" name="hb_gobject_buffer_serialize_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-flags-get-type"/>
-    <keyword type="function" name="hb_gobject_buffer_serialize_format_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-serialize-format-get-type"/>
-    <keyword type="function" name="hb_gobject_direction_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-direction-get-type"/>
-    <keyword type="function" name="hb_gobject_face_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-face-get-type" since="0.9.2"/>
-    <keyword type="function" name="hb_gobject_font_funcs_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-font-funcs-get-type" since="0.9.2"/>
-    <keyword type="function" name="hb_gobject_font_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-font-get-type" since="0.9.2"/>
-    <keyword type="function" name="hb_gobject_glyph_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-glyph-flags-get-type"/>
-    <keyword type="function" name="hb_gobject_map_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-map-get-type"/>
-    <keyword type="function" name="hb_gobject_memory_mode_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-memory-mode-get-type"/>
-    <keyword type="function" name="hb_gobject_ot_color_palette_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-color-palette-flags-get-type"/>
-    <keyword type="function" name="hb_gobject_ot_layout_glyph_class_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-layout-glyph-class-get-type"/>
-    <keyword type="function" name="hb_gobject_ot_math_constant_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-math-constant-get-type"/>
-    <keyword type="function" name="hb_gobject_ot_math_glyph_part_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-get-type"/>
-    <keyword type="function" name="hb_gobject_ot_math_glyph_part_flags_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-part-flags-get-type"/>
-    <keyword type="function" name="hb_gobject_ot_math_glyph_variant_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-math-glyph-variant-get-type"/>
-    <keyword type="function" name="hb_gobject_ot_math_kern_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-ot-math-kern-get-type"/>
-    <keyword type="function" name="hb_gobject_script_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-script-get-type"/>
-    <keyword type="function" name="hb_gobject_shape_plan_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-shape-plan-get-type"/>
-    <keyword type="function" name="hb_gobject_unicode_combining_class_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-unicode-combining-class-get-type"/>
-    <keyword type="function" name="hb_gobject_unicode_funcs_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-unicode-funcs-get-type" since="0.9.2"/>
-    <keyword type="function" name="hb_gobject_unicode_general_category_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-unicode-general-category-get-type"/>
-    <keyword type="function" name="hb_gobject_buffer_cluster_level_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-buffer-cluster-level-get-type"/>
-    <keyword type="function" name="hb_gobject_feature_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-feature-get-type"/>
-    <keyword type="function" name="hb_gobject_glyph_info_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-glyph-info-get-type"/>
-    <keyword type="function" name="hb_gobject_glyph_position_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-glyph-position-get-type"/>
-    <keyword type="function" name="hb_gobject_segment_properties_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-segment-properties-get-type"/>
-    <keyword type="function" name="hb_gobject_set_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-set-get-type"/>
-    <keyword type="function" name="hb_gobject_user_data_key_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-user-data-key-get-type"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_BLOB" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BLOB:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CONTENT-TYPE:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-DIFF-FLAGS:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-FLAGS:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FLAGS:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-SERIALIZE-FORMAT:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_DIRECTION" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-DIRECTION:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_FACE" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FACE:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_FONT" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_FONT_FUNCS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FONT-FUNCS:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_GLYPH_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-FLAGS:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_MAP" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MAP:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_MEMORY_MODE" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MEMORY-MODE:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-COLOR-PALETTE-FLAGS:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-LAYOUT-GLYPH-CLASS:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_MATH_CONSTANT" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-CONSTANT:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-PART-FLAGS:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-GLYPH-VARIANT:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_OT_MATH_KERN" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-OT-MATH-KERN:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_SCRIPT" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SCRIPT:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_SHAPE_PLAN" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SHAPE-PLAN:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_UNICODE_COMBINING_CLASS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-COMBINING-CLASS:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_UNICODE_FUNCS" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-FUNCS:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_UNICODE_GENERAL_CATEGORY" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-UNICODE-GENERAL-CATEGORY:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_BUFFER_CLUSTER_LEVEL" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-BUFFER-CLUSTER-LEVEL:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_FEATURE" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-FEATURE:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_GLYPH_INFO" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-INFO:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_GLYPH_POSITION" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-GLYPH-POSITION:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_SEGMENT_PROPERTIES" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SEGMENT-PROPERTIES:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_SET" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-SET:CAPS"/>
-    <keyword type="macro" name="HB_GOBJECT_TYPE_USER_DATA_KEY" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-USER-DATA-KEY:CAPS"/>
-    <keyword type="function" name="hb_graphite2_face_get_gr_face ()" link="harfbuzz-hb-graphite2.html#hb-graphite2-face-get-gr-face"/>
+    <keyword type="function" name="hb_graphite2_face_get_gr_face ()" link="harfbuzz-hb-graphite2.html#hb-graphite2-face-get-gr-face" since="0.9.10"/>
     <keyword type="macro" name="HB_GRAPHITE2_TAG_SILF" link="harfbuzz-hb-graphite2.html#HB-GRAPHITE2-TAG-SILF:CAPS"/>
-    <keyword type="function" name="hb_icu_get_unicode_funcs ()" link="harfbuzz-hb-icu.html#hb-icu-get-unicode-funcs"/>
+    <keyword type="function" name="hb_icu_get_unicode_funcs ()" link="harfbuzz-hb-icu.html#hb-icu-get-unicode-funcs" since="0.9.38"/>
     <keyword type="function" name="hb_icu_script_from_script ()" link="harfbuzz-hb-icu.html#hb-icu-script-from-script"/>
     <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="constant" name="HB_SCRIPT_MASARAM_GONDI" link="harfbuzz-hb-common.html#HB-SCRIPT-MASARAM-GONDI:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_DOGRA" link="harfbuzz-hb-common.html#HB-SCRIPT-DOGRA:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_ELYMAIC" link="harfbuzz-hb-common.html#HB-SCRIPT-ELYMAIC:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_CHORASMIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-CHORASMIAN: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_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="member" name="hb-glyph-position-t-struct.x-advance" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct.x-advance"/>
-    <keyword type="member" name="hb-glyph-position-t-struct.y-advance" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct.y-advance"/>
-    <keyword type="member" name="hb-glyph-position-t-struct.x-offset" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct.x-offset"/>
-    <keyword type="member" name="hb-glyph-position-t-struct.y-offset" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct.y-offset"/>
-    <keyword type="member" name="hb-segment-properties-t-struct.direction" link="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct.direction"/>
-    <keyword type="member" name="hb-segment-properties-t-struct.script" link="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct.script"/>
-    <keyword type="member" name="hb-segment-properties-t-struct.language" link="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct.language"/>
-    <keyword type="member" name="hb-feature-t-struct.tag" link="harfbuzz-hb-common.html#hb-feature-t-struct.tag"/>
-    <keyword type="member" name="hb-feature-t-struct.value" link="harfbuzz-hb-common.html#hb-feature-t-struct.value"/>
-    <keyword type="member" name="hb-feature-t-struct.start" link="harfbuzz-hb-common.html#hb-feature-t-struct.start"/>
-    <keyword type="member" name="hb-feature-t-struct.end" link="harfbuzz-hb-common.html#hb-feature-t-struct.end"/>
-    <keyword type="member" name="hb-ot-math-glyph-variant-t-struct.glyph" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t-struct.glyph"/>
-    <keyword type="member" name="hb-ot-math-glyph-variant-t-struct.advance" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t-struct.advance"/>
-    <keyword type="member" name="hb-ot-math-glyph-part-t-struct.glyph" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct.glyph"/>
-    <keyword type="member" name="hb-ot-math-glyph-part-t-struct.start-connector-length" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct.start-connector-length"/>
-    <keyword type="member" name="hb-ot-math-glyph-part-t-struct.end-connector-length" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct.end-connector-length"/>
-    <keyword type="member" name="hb-ot-math-glyph-part-t-struct.full-advance" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct.full-advance"/>
-    <keyword type="member" name="hb-ot-math-glyph-part-t-struct.flags" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct.flags"/>
+    <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-glyph-position-t.y-offset" link="harfbuzz-hb-buffer.html#hb-glyph-position-t.y-offset"/>
+    <keyword type="member" name="hb-segment-properties-t.direction" link="harfbuzz-hb-buffer.html#hb-segment-properties-t.direction"/>
+    <keyword type="member" name="hb-segment-properties-t.script" link="harfbuzz-hb-buffer.html#hb-segment-properties-t.script"/>
+    <keyword type="member" name="hb-segment-properties-t.language" link="harfbuzz-hb-buffer.html#hb-segment-properties-t.language"/>
+    <keyword type="member" name="hb-feature-t.tag" link="harfbuzz-hb-common.html#hb-feature-t.tag"/>
+    <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-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.start-connector-length" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t.start-connector-length"/>
+    <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"/>
   </functions>
 </book>
index 12cfdee..2b2504b 100644 (file)
@@ -7,7 +7,7 @@
 <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.">
 <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.29 (XML mode)">
+<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">
 <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></dd>
 <dt><span class="part"><a href="pt02.html">II. Reference manual</a></span></dt>
 <dd><dl>
-<dt><span class="chapter"><a href="ch11.html">Core API</a></span></dt>
+<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>
 <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="ch12.html">OpenType API</a></span></dt>
+<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>
 <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="ch13.html">Apple Advanced Typography API</a></span></dt>
+<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="ch14.html">Integration API</a></span></dt>
+<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>
 <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</span>
+<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>
 </dl></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 61dea5e..659fea6 100644 (file)
@@ -8,7 +8,7 @@
 <link rel="up" href="pt01.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.29 (XML mode)">
+<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">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
 <a name="download"></a>Downloading HarfBuzz</h2></div></div></div>
 <p>
-      The HarfBuzz source code is hosted at <a class="ulink" href="https://github.com/harfbuzz/harfbuzz" target="_top">github.com/harfbuzz/harfbuzz</a>. The
-      same source tree is also available at the
-      <a class="ulink" href="http://cgit.freedesktop.org/harfbuzz/" target="_top">Freedesktop.org</a>
-      site.
+      The HarfBuzz source code is hosted at <a class="ulink" href="https://github.com/harfbuzz/harfbuzz" target="_top">github.com/harfbuzz/harfbuzz</a>.
     </p>
 <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>
-      or from 
-      <a class="ulink" href="http://www.freedesktop.org/software/harfbuzz/release/" target="_top">Freedesktop.org</a>.
+      dependencies) of HarfBuzz can be downloaded from <a class="ulink" href="https://github.com/harfbuzz/harfbuzz" target="_top">github.com/harfbuzz/harfbuzz/releases</a>.
     </p>
 <p>
       Release notes are posted with each new release to provide an
@@ -65,6 +60,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/integration-coretext.html b/docs/html/integration-coretext.html
new file mode 100644 (file)
index 0000000..e687b34
--- /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>Core Text integration: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<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)">
+<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="integration.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="integration-uniscribe.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="integration-icu.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="integration-coretext"></a>Core Text integration</h2></div></div></div>
+<p>
+      If your client program is running on macOS or iOS, HarfBuzz offers
+      an additional API that can help integrate with Apple's
+      Core Text engine and the underlying Core Graphics
+      framework. HarfBuzz does not attempt to offer the same
+      drop-in-replacement functionality for Core Text that it strives
+      for with Uniscribe on Windows, but you can still use HarfBuzz
+      to perform text shaping in native macOS and iOS applications.
+    </p>
+<p>
+      Note, though, that if your interest is just in using fonts that
+      contain Apple Advanced Typography (AAT) features, then you do
+      not need to add Core Text integration. HarfBuzz natively
+      supports AAT features and will shape AAT fonts (on any platform)
+      automatically, without requiring additional work on your
+      part. This includes support for AAT-specific TrueType tables
+      such as <code class="literal">mort</code>, <code class="literal">morx</code>, and
+      <code class="literal">kerx</code>, which AAT fonts use instead of
+      <code class="literal">GSUB</code> and <code class="literal">GPOS</code>.
+    </p>
+<p>
+      On a macOS or iOS system, the primary integration points offered
+      by HarfBuzz are for face objects and font objects. 
+    </p>
+<p>
+      The Apple APIs offer a pair of data structures that map well to
+      HarfBuzz's face and font objects. The Core Graphics API, which
+      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,
+      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
+      be hooked up to a Core Text <span class="type">CTFontRef</span>, and a HarfBuzz
+      <span class="type">hb_face_t</span> face object can be hooked up to a
+      <span class="type">CGFontRef</span>.
+    </p>
+<p>
+      You can create a <span class="type">hb_face_t</span> from a
+      <span class="type">CGFontRef</span> by using the
+      <code class="function">hb_coretext_face_create()</code>. Subsequently,
+      you can retrieve the <span class="type">CGFontRef</span> from a
+      <span class="type">hb_face_t</span> with <code class="function">hb_coretext_face_get_cg_font()</code>.
+    </p>
+<p>
+      Likewise, you create a <span class="type">hb_font_t</span> from a
+      <span class="type">CTFontRef</span> by calling
+      <code class="function">hb_coretext_font_create()</code>, and you can
+      fetch the associated <span class="type">CTFontRef</span> from a
+      <span class="type">hb_font_t</span> font object with
+      <code class="function">hb_coretext_face_get_ct_font()</code>. 
+    </p>
+<p>
+      HarfBuzz also offers a <code class="function">hb_font_set_ptem()</code>
+      that you an use to set the nominal point size on any
+      <span class="type">hb_font_t</span> font object. Core Text uses this value to
+      implement optical scaling. 
+    </p>
+<p>
+      When integrating your client code with Core Text, it is
+      important to recognize that Core Text <code class="literal">points</code>
+      are not typographic points (standardized at 72 per inch) as the
+      term is used elsewhere in OpenType. Instead, Core Text points
+      are CSS points, which are standardized at 96 per inch.
+    </p>
+<p>
+      HarfBuzz's font functions take this distinction into account,
+      but it can be an easy detail to miss in cross-platform
+      code. 
+    </p>
+<p>
+      As a final note, you may notice a reference to an optional
+      <code class="literal">coretext</code> shaper back-end in the <a class="xref" href="building.html#configuration" title="Configuration options">the section called “Configuration options”</a> section of the HarfBuzz manual. This
+      option is not a Core Text-integration facility.
+    </p>
+<p>
+      Instead, it is a internal code path used in the
+      <span class="command"><strong>hb-shape</strong></span> command-line utility, which hands
+      shaping functionality over to Core Text entirely, when run on a
+      macOS system. That allows testing HarfBuzz's native output
+      against the Core Text engine, for tracking compatibility and debugging.
+    </p>
+<p>
+      Because this back-end is only used when testing HarfBuzz
+      functionality, it is disabled by default when building the
+      HarfBuzz binaries.
+    </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/integration-freetype.html b/docs/html/integration-freetype.html
new file mode 100644 (file)
index 0000000..5b6659a
--- /dev/null
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<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">
+<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)">
+<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="integration.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="integration.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="integration-uniscribe.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="integration-freetype"></a>FreeType integration</h2></div></div></div>
+<p>
+      FreeType is the free-software font-rendering engine included in
+      desktop Linux distributions, Android, ChromeOS, iOS, and multiple Unix
+      operating systems, and used by cross-platform programs like
+      Chrome, Java, and GhostScript. Used together, HarfBuzz can
+      perform shaping on Unicode text segments, outputting the glyph
+      IDs that FreeType should rasterize from the active font as well
+      as the positions at which those glyphs should be drawn.
+    </p>
+<p>
+      HarfBuzz provides integration points with FreeType at the
+      face-object and font-object level and for the font-functions
+      virtual-method structure of a font object. To use the
+      FreeType-integration API, include the
+      <code class="filename">hb-ft.h</code> header.
+    </p>
+<p>
+      In a typical client program, you will create your
+      <span class="type">hb_face_t</span> face object and <span class="type">hb_font_t</span>
+      font object from a FreeType <span class="type">FT_Face</span>. HarfBuzz
+      provides a suite of functions for doing this.
+    </p>
+<p>
+      In the most common case, you will want to use
+      <code class="function">hb_ft_font_create_referenced()</code>, which
+      creates both an <span class="type">hb_face_t</span> face object and
+      <span class="type">hb_font_t</span> font object (linked to that face object),
+      and provides lifecycle management.
+    </p>
+<p>
+      It is important to note,
+      though, that while HarfBuzz makes a distinction between its face and
+      font objects, FreeType's <span class="type">FT_Face</span> does not. After
+      you create your <span class="type">FT_Face</span>, you must set its size
+      parameter using <code class="function">FT_Set_Char_Size()</code>, because
+      an <span class="type">hb_font_t</span> is defined as an instance of an
+      <span class="type">hb_face_t</span> with size specified.
+    </p>
+<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>
+<p>
+      <code class="function">hb_ft_font_create_referenced()</code> is
+      the recommended function for creating an <span class="type">hb_face_t</span> face
+      object. This function calls <code class="function">FT_Reference_Face()</code>
+      before using the <span class="type">FT_Face</span> and calls 
+      <code class="function">FT_Done_Face()</code> when it is finished using the
+      <span class="type">FT_Face</span>. Consequently, your client program does not need
+      to worry about destroying the <span class="type">FT_Face</span> while HarfBuzz
+      is still using it.
+    </p>
+<p>
+      Although <code class="function">hb_ft_font_create_referenced()</code> is
+      the recommended function, there is another variant for client code
+      where special circumstances make it necessary. The simpler
+      version of the function is <code class="function">hb_ft_font_create()</code>,
+      which takes an <span class="type">FT_Face</span> and an optional destroy callback 
+      as its arguments. Because <code class="function">hb_ft_font_create()</code> 
+      does not offer lifecycle management, however, your client code will
+      be responsible for tracking references to the <span class="type">FT_Face</span>
+      objects and destroying them when they are no longer needed. If you
+      do not have a valid reason for doing this, use
+      <code class="function">hb_ft_font_create_referenced()</code>. 
+    </p>
+<p>
+      After you have created your font object from your
+      <span class="type">FT_Face</span>, you can set or retrieve the
+      <em class="structfield"><code>load_flags</code></em> of the
+      <span class="type">FT_Face</span> through the <span class="type">hb_font_t</span>
+      object. HarfBuzz provides
+      <code class="function">hb_ft_font_set_load_flags()</code> and
+      <code class="function">hb_ft_font_get_load_flags()</code> for this
+      purpose. The ability to set the
+      <em class="structfield"><code>load_flags</code></em> through the font object
+      could be useful for enabling or disabling hinting, for example,
+      or to activate vertical layout.
+    </p>
+<p>
+      HarfBuzz also provides a utility function called
+      <code class="function">hb_ft_font_has_changed()</code> that you should
+      call whenever you have altered the properties of your underlying
+      <span class="type">FT_Face</span>, as well as a
+      <code class="function">hb_ft_get_face()</code> that you can call on an
+      <span class="type">hb_font_t</span> font object to fetch its underlying <span class="type">FT_Face</span>.
+    </p>
+<p>
+      With an <span class="type">hb_face_t</span> and <span class="type">hb_font_t</span> both linked
+      to your <span class="type">FT_Face</span>, you will typically also want to
+      use FreeType for the <em class="structfield"><code>font_funcs</code></em>
+      vtable of your <span class="type">hb_font_t</span>. As a reminder, this
+      font-functions structure is the set of methods that HarfBuzz
+      will use to fetch important information from the font, such as
+      the advances and extents of individual glyphs. 
+    </p>
+<p>
+      All you need to do is call
+    </p>
+<pre class="programlisting">
+      hb_ft_font_set_funcs(font);
+    </pre>
+<p>
+      and HarfBuzz will use FreeType for the font-functions in
+      <code class="literal">font</code>. 
+    </p>
+<p>
+      As we noted above, an <span class="type">hb_font_t</span> is derived from an
+      <span class="type">hb_face_t</span> with size (and, perhaps, other
+      parameters, such as variation-axis coordinates)
+      specified. Consequently, you can reuse an <span class="type">hb_face_t</span>
+      with several <span class="type">hb_font_t</span> objects, and HarfBuzz
+      provides functions to simplify this.
+    </p>
+<p>
+      The <code class="function">hb_ft_face_create_referenced()</code>
+      function creates just an <span class="type">hb_face_t</span> from a FreeType
+      <span class="type">FT_Face</span> and, as with
+      <code class="function">hb_ft_font_create_referenced()</code> above,
+      provides lifecycle management for the <span class="type">FT_Face</span>.
+    </p>
+<p>
+      Similarly, there is an <code class="function">hb_ft_face_create()</code>
+      function variant that does not provide the lifecycle-management
+      feature. As with the font-object case, if you use this version
+      of the function, it will be your client code's respsonsibility
+      to track usage of the <span class="type">FT_Face</span> objects.
+    </p>
+<p>
+      A third variant of this function is
+      <code class="function">hb_ft_face_create_cached()</code>, which is the
+      same as <code class="function">hb_ft_face_create()</code> except that it
+      also uses the <em class="structfield"><code>generic</code></em> field of the
+      <span class="type">FT_Face</span> structure to save a pointer to the newly
+      created <span class="type">hb_face_t</span>. Subsequently, function calls
+      that pass the same <span class="type">FT_Face</span> will get the same
+      <span class="type">hb_face_t</span> returned — and the
+      <span class="type">hb_face_t</span> will be correctly reference
+      counted. Still, as with
+      <code class="function">hb_ft_face_create()</code>, your client code must
+      track references to the <span class="type">FT_Face</span> itself, and destroy
+      it when it is unneeded.
+    </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/integration-icu.html b/docs/html/integration-icu.html
new file mode 100644 (file)
index 0000000..7dff0b0
--- /dev/null
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<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">
+<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)">
+<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="integration.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="integration-coretext.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="integration-python.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="integration-icu"></a>ICU integration</h2></div></div></div>
+<p>
+      Although HarfBuzz includes its own Unicode-data functions, it
+      also provides integration APIs for using the International
+      Components for Unicode (ICU) library as a source of Unicode data
+      on any supported platform.
+    </p>
+<p>
+      The principal integration point with ICU is the
+      <span class="type">hb_unicode_funcs_t</span> Unicode-functions structure
+      attached to a buffer. This structure holds the virtual methods
+      used for retrieving Unicode character properties, such as
+      General Category, Script, Combining Class, decomposition
+      mappings, and mirroring information.
+    </p>
+<p>
+      To use ICU in your client program, you need to call
+      <code class="function">hb_icu_get_unicode_funcs()</code>, which creates a
+      Unicode-functions structure populated with the ICU function for
+      each included method. Subsequently, you can attach the
+      Unicode-functions structure to your buffer:
+    </p>
+<pre class="programlisting">
+      hb_unicode_funcs_t *icufunctions;
+      icufunctions = hb_icu_get_unicode_funcs();
+      hb_buffer_set_unicode_funcs(buf, icufunctions);
+    </pre>
+<p>
+      and ICU will be used for Unicode-data access.
+    </p>
+<p>
+      HarfBuzz also supplies a pair of functions
+      (<code class="function">hb_icu_script_from_script()</code> and
+      <code class="function">hb_icu_script_to_script()</code>) for converting
+      between ICU's and HarfBuzz's internal enumerations of Unicode
+      scripts. The <code class="function">hb_icu_script_from_script()</code>
+      function converts from a HarfBuzz <span class="type">hb_script_t</span> to an
+      ICU <span class="type">UScriptCode</span>. The
+      <code class="function">hb_icu_script_to_script()</code> function does the
+      reverse: converting from a <span class="type">UScriptCode</span> identifier
+      to a <span class="type">hb_script_t</span>.
+    </p>
+<p>
+      By default, HarfBuzz's ICU support is built as a separate shared
+      library (<code class="filename">libharfbuzz-icu.so</code>)
+      when compiling HarfBuzz from source. This allows client programs
+      that do not need ICU to link against HarfBuzz without unnecessarily
+      adding ICU as a dependency. You can also build HarfBuzz with ICU
+      support built directly into the main HarfBuzz shared library
+      (<code class="filename">libharfbuzz.so</code>),
+      by specifying the <code class="literal">--with-icu=builtin</code>
+      compile-time option.
+    </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/integration-python.html b/docs/html/integration-python.html
new file mode 100644 (file)
index 0000000..911890f
--- /dev/null
@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<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">
+<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="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="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>
+</tr></table>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="integration-python"></a>Python bindings</h2></div></div></div>
+<p>
+      As noted in the <a class="xref" href="integration.html#integration-glib" title="GNOME integration, GLib, and GObject">the section called “GNOME integration, GLib, and GObject”</a> section,
+      HarfBuzz uses a feature called <a class="ulink" href="https://wiki.gnome.org/Projects/GObjectIntrospection" target="_top">GObject
+      Introspection</a> (GI) to provide bindings for Python.
+    </p>
+<p>
+      At compile time, the GI scanner analyzes the HarfBuzz C source
+      and builds metadata objects connecting the language bindings to
+      the C library. Your Python code can then use the HarfBuzz binary
+      through its Python interface.
+    </p>
+<p>
+      HarfBuzz's Python bindings support Python 2 and Python 3. To use
+      them, you will need to have the <code class="literal">pygobject</code>
+      package installed. Then you should import
+      <code class="literal">HarfBuzz</code> from
+      <code class="literal">gi.repository</code>: 
+    </p>
+<pre class="programlisting">
+      from gi.repository import HarfBuzz
+    </pre>
+<p>
+      and you can call HarfBuzz functions from Python. Sample code can
+      be found in the <code class="filename">sample.py</code> script in the
+      HarfBuzz <code class="filename">src</code> directory.
+    </p>
+<p>
+      Do note, however, that the Python API is subject to change
+      without advance notice. GI allows the bindings to be
+      automatically updated, which is one of its advantages, but you
+      may need to update your Python code.
+    </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/integration-uniscribe.html b/docs/html/integration-uniscribe.html
new file mode 100644 (file)
index 0000000..c6b9ec6
--- /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>Uniscribe integration: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
+<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)">
+<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="integration.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="integration-freetype.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="integration-coretext.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="integration-uniscribe"></a>Uniscribe integration</h2></div></div></div>
+<p>
+      If your client program is running on Windows, HarfBuzz offers
+      an additional API that can help integrate with Microsoft's
+      Uniscribe engine and the Windows GDI.
+    </p>
+<p>
+      Overall, the Uniscribe API covers a broader set of typographic
+      layout functions than HarfBuzz implements, but HarfBuzz's
+      shaping API can serve as a drop-in replacement for Uniscribe's shaping
+      functionality. In fact, one of HarfBuzz's design goals is to
+      accurately reproduce the same output for shaping a given text
+      segment that Uniscribe produces — even to the point of
+      duplicating known shaping bugs or deviations from the
+      specification — so you can be confident that your users'
+      documents with their existing fonts will not be affected adversely by
+      switching to HarfBuzz.
+    </p>
+<p>
+      At a basic level, HarfBuzz's <code class="function">hb_shape()</code>
+      function replaces both the <a class="ulink" href="" target="_top"><code class="function">ScriptShape()</code></a>
+      and <a class="ulink" href="https://docs.microsoft.com/en-us/windows/desktop/api/Usp10/nf-usp10-scriptplace" target="_top"><code class="function">ScriptPlace()</code></a>
+      functions from Uniscribe. 
+    </p>
+<p>
+      However, whereas <code class="function">ScriptShape()</code> returns the
+      glyphs and clusters for a shaped sequence and
+      <code class="function">ScriptPlace()</code> returns the advances and
+      offsets for those glyphs, <code class="function">hb_shape()</code>
+      handles both. After <code class="function">hb_shape()</code> shapes a
+      buffer, the output glyph IDs and cluster IDs are returned as
+      an array of <span class="structname">hb_glyph_info_t</span> structures, and the
+      glyph advances and offsets are returned as an array of
+      <span class="structname">hb_glyph_position_t</span> structures. 
+    </p>
+<p>
+      Your client program only needs to ensure that it coverts
+      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
+      read the <a class="xref" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction"><i>Buffers, language, script and direction</i></a> 
+      chapter for a full explanation of how HarfBuzz input buffers are
+      used, and see <a class="xref" href="shaping-and-shape-plans.html#shaping-buffer-output" title="Shaping and buffer output">the section called “Shaping and buffer output”</a> for the
+      details of what <code class="function">hb_shape()</code> returns in the
+      output buffer when shaping is complete. 
+    </p>
+<p>
+      Although <code class="function">hb_shape()</code> itself is functionally
+      equivalent to Uniscribe's shaping routines, there are two
+      additional HarfBuzz functions you may want to use to integrate
+      the libraries in your code. Both are used to link HarfBuzz font
+      objects to the equivalent Windows structures.
+    </p>
+<p>
+      The <code class="function">hb_uniscribe_font_get_logfontw()</code>
+      function takes a <span class="type">hb_font_t</span> font object and returns
+      a pointer to the <a class="ulink" href="https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/ns-wingdi-logfontw" target="_top"><span class="type">LOGFONTW</span></a>
+      "logical font" that corresponds to it. A <span class="type">LOGFONTW</span>
+      structure holds font-wide attributes, including metrics, size,
+      and style information.
+    </p>
+<p>
+      The <code class="function">hb_uniscribe_font_get_hfont()</code> function
+      also takes a <span class="type">hb_font_t</span> font object, but it returns
+      an <span class="type">HFONT</span> — a handle to the underlying logical
+      font — instead.
+    </p>
+<p>
+      <span class="type">LOGFONTW</span>s and <span class="type">HFONT</span>s are both needed
+      by other Uniscribe functions.
+    </p>
+<p>
+      As a final note, you may notice a reference to an optional
+      <code class="literal">uniscribe</code> shaper back-end in the <a class="xref" href="building.html#configuration" title="Configuration options">the section called “Configuration options”</a> section of the HarfBuzz manual. This
+      option is not a Uniscribe-integration facility.
+    </p>
+<p>
+      Instead, it is a internal code path used in the
+      <span class="command"><strong>hb-shape</strong></span> command-line utility, which hands
+      shaping functionality over to Uniscribe entirely, when run on a
+      Windows system. That allows testing HarfBuzz's native output
+      against the Uniscribe engine, for tracking compatibility and
+      debugging.
+    </p>
+<p>
+      Because this back-end is only used when testing HarfBuzz
+      functionality, it is disabled by default when building the
+      HarfBuzz binaries.
+    </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/integration.html b/docs/html/integration.html
new file mode 100644 (file)
index 0000000..c3d3c63
--- /dev/null
@@ -0,0 +1,187 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<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">
+<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="next" href="integration-freetype.html" title="FreeType integration">
+<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="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="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 class="titlepage"><div><div><h2 class="title">
+<a name="integration"></a>Platform Integration Guide</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<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></div>
+<p>
+    HarfBuzz was first developed for use with the GNOME and GTK
+    software stack commonly found in desktop Linux
+    distributions. Nevertheless, it can be used on other operating
+    systems and platforms, from iOS and macOS to Windows. It can also
+    be used with other application frameworks and components, such as
+    Android, Qt, or application-specific widget libraries.
+  </p>
+<p>
+    This chapter will look at how HarfBuzz fits into a typical
+    text-rendering pipeline, and will discuss the APIs available to
+    integrate HarfBuzz with contemporary Linux, Mac, and Windows
+    software. It will also show how HarfBuzz integrates with popular
+    external libraries like FreeType and International Components for
+    Unicode (ICU) and describe the HarfBuzz language bindings for
+    Python.
+  </p>
+<p>
+    On a GNOME system, HarfBuzz is designed to tie in with several
+    other common system libraries. The most common architecture uses
+    Pango at the layer directly "above" HarfBuzz; Pango is responsible
+    for text segmentation and for ensuring that each input
+    <span class="type">hb_buffer_t</span> passed to HarfBuzz for shaping contains
+    Unicode code points that share the same segment properties
+    (namely, direction, language, and script, but also higher-level
+    properties like the active font, font style, and so on).
+  </p>
+<p>
+    The layer directly "below" HarfBuzz is typically FreeType, which
+    is used to rasterize glyph outlines at the necessary optical size,
+    hinting settings, and pixel resolution. FreeType provides APIs for
+    accessing font and face information, so HarfBuzz includes
+    functions to create <span class="type">hb_face_t</span> and
+    <span class="type">hb_font_t</span> objects directly from FreeType
+    objects. HarfBuzz can use FreeType's built-in functions for
+    <em class="structfield"><code>font_funcs</code></em> vtable in an <span class="type">hb_font_t</span>.
+  </p>
+<p>
+    FreeType's output is bitmaps of the rasterized glyphs; on a
+    typical Linux system these will then be drawn by a graphics
+    library like Cairo, but those details are beyond HarfBuzz's
+    control. On the other hand, at the top end of the stack, Pango is
+    part of the larger GNOME framework, and HarfBuzz does include APIs
+    for working with key components of GNOME's higher-level libraries
+    — most notably GLib.
+  </p>
+<p>
+    For other operating systems or application frameworks, the
+    critical integration points are where HarfBuzz gets font and face
+    information about the font used for shaping and where HarfBuzz
+    gets Unicode data about the input-buffer code points.
+  </p>
+<p>
+    The font and face information is necessary for text shaping
+    because HarfBuzz needs to retrieve the glyph indices for
+    particular code points, and to know the extents and advances of
+    glyphs. Note that, in an OpenType variable font, both of those
+    types of information can change with different variation-axis
+    settings.
+  </p>
+<p>
+    The Unicode information is necessary for shaping because the
+    properties of a code point (such as its General Category (gc),
+    Canonical Combining Class (ccc), and decomposition) can directly
+    impact the shaping moves that HarfBuzz performs.
+  </p>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="integration-glib"></a>GNOME integration, GLib, and GObject</h2></div></div></div>
+<p>
+      As mentioned in the preceding section, HarfBuzz offers
+      integration APIs to help client programs using the
+      GNOME and GTK framework commonly found in desktop Linux
+      distributions. 
+    </p>
+<p>
+      GLib is the main utility library for GNOME applications. It
+      provides basic data types and conversions, file abstractions,
+      string manipulation, and macros, as well as facilities like
+      memory allocation and the main event loop.
+    </p>
+<p>
+      Where text shaping is concerned, GLib provides several utilities
+      that HarfBuzz can take advantage of, including a set of
+      Unicode-data functions and a data type for script
+      information. Both are useful when working with HarfBuzz
+      buffers. To make use of them, you will need to include the
+      <code class="filename">hb-glib.h</code> header file.
+    </p>
+<p>
+      GLib's <a class="ulink" href="https://developer.gnome.org/glib/stable/glib-Unicode-Manipulation.html" target="_top">Unicode
+      manipulation API</a> includes all the functionality
+      necessary to retrieve Unicode data for the
+      <em class="structfield"><code>unicode_funcs</code></em> structure of a HarfBuzz
+      <span class="type">hb_buffer_t</span>. 
+    </p>
+<p>
+      The function <code class="function">hb_glib_get_unicode_funcs()</code>
+      sets up a <span class="type">hb_unicode_funcs_t</span> structure configured
+      with the GLib Unicode functions and returns a pointer to it.
+    </p>
+<p>
+      You can attach this Unicode-functions structure to your buffer,
+      and it will be ready for use with GLib:
+    </p>
+<pre class="programlisting">
+      #include &lt;hb-glib.h&gt;
+      ...
+      hb_unicode_funcs_t *glibufunctions;
+      glibufunctions = hb_glib_get_unicode_funcs();
+      hb_buffer_set_unicode_funcs(buf, glibufunctions);
+    </pre>
+<p>
+      For script information, GLib uses the
+      <span class="type">GUnicodeScript</span> type. Like HarfBuzz's own
+      <span class="type">hb_script_t</span>, this data type is an enumeration
+      of Unicode scripts, but text segments passed in from GLib code
+      will be tagged with a <span class="type">GUnicodeScript</span>. Therefore,
+      when setting the script property on a <span class="type">hb_buffer_t</span>,
+      you will need to convert between the <span class="type">GUnicodeScript</span>
+      of the input provided by GLib and HarfBuzz's
+      <span class="type">hb_script_t</span> type.
+    </p>
+<p>
+      The <code class="function">hb_glib_script_to_script()</code> function
+      takes an <span class="type">GUnicodeScript</span> script identifier as its
+      sole argument and returns the corresponding <span class="type">hb_script_t</span>.
+      The <code class="function">hb_glib_script_from_script()</code> does the
+      reverse, taking an <span class="type">hb_script_t</span> and returning the
+      <span class="type">GUnicodeScript</span> identifier for GLib.
+    </p>
+<p>
+      Finally, GLib also provides a reference-counted object type called <a class="ulink" href="https://developer.gnome.org/glib/stable/glib-Byte-Arrays.html#GBytes" target="_top"><span class="type">GBytes</span></a>
+      that is used for accessing raw memory segments with the benefits
+      of GLib's lifecycle management. HarfBuzz provides a
+      <code class="function">hb_glib_blob_create()</code> function that lets
+      you create an <span class="type">hb_blob_t</span> directly from a
+      <span class="type">GBytes</span> object. This function takes only the
+      <span class="type">GBytes</span> object as its input; HarfBuzz registers the
+      GLib <code class="function">destroy</code> callback automatically.
+    </p>
+<p>
+      The GNOME platform also features an object system called
+      GObject. For HarfBuzz, the main advantage of GObject is a
+      feature called <a class="ulink" href="https://gi.readthedocs.io/en/latest/" target="_top">GObject
+      Introspection</a>. This is a middleware facility that can be
+      used to generate language bindings for C libraries. HarfBuzz uses it
+      to build its Python bindings, which we will look at in a separate section.
+    </p>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.32.1</div>
+</body>
+</html>
\ No newline at end of file
index 25670c2..5914ec8 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index dece05f..f93a4a4 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -40,7 +40,7 @@
       <code class="function">malloc()</code>, you would create the blob using
     </p>
 <pre class="programlisting">
-      hb_blob_create (data, length, HB_MEMORY_MODE_WRITABLE, NULL, free)
+      hb_blob_create (data, length, HB_MEMORY_MODE_WRITABLE, data, free)
     </pre>
 <p>
       That way, HarfBuzz will call <code class="function">free()</code> on the
@@ -51,6 +51,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 5e9adfd..342f890 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -92,6 +92,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 330511c..5b53ff6 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -79,6 +79,6 @@
 </ul></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 9ffd864..bee5d07 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -54,6 +54,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 838d320..4338e7d 100644 (file)
@@ -8,7 +8,7 @@
 <link rel="up" href="pt01.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.29 (XML mode)">
+<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">
@@ -68,6 +68,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 01375b1..bddb4f5 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -95,6 +95,6 @@
 </ul></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 9db76e5..74097ff 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
 <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.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 11b2734..a3d753e 100644 (file)
@@ -6,9 +6,9 @@
 <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="utilities-ucdn.html" title="UCDN">
-<link rel="next" href="ch11.html" title="Core API">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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">
 <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="utilities-ucdn.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="ch11.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></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.4
+        This document is for HarfBuzz 2.6.7
 .
         
       </p></div>
@@ -32,7 +32,7 @@
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl class="toc">
-<dt><span class="chapter"><a href="ch11.html">Core API</a></span></dt>
+<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>
@@ -71,7 +71,7 @@
 <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="ch12.html">OpenType API</a></span></dt>
+<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>
 <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="ch13.html">Apple Advanced Typography API</a></span></dt>
+<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="ch14.html">Integration API</a></span></dt>
+<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>
 <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</span>
+<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>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 4546454..b1b2085 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -59,6 +59,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index aba2eac..70bfa62 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -60,7 +60,7 @@
       hb_buffer_set_language(buf, hb_language_from_string("en", -1));
     </pre>
 <p>
-      However, since these properties are often the repeated for
+      However, since these properties are often repeated for
       multiple text runs, you can also save them in a
       <code class="literal">hb_segment_properties_t</code> for reuse:
     </p>
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index a3ac1aa..1139293 100644 (file)
@@ -8,7 +8,7 @@
 <link rel="up" href="pt01.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.29 (XML mode)">
+<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">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 90014e1..3eefea3 100644 (file)
@@ -8,7 +8,7 @@
 <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="next" href="complex-scripts.html" title="Complex scripts">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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">
@@ -64,6 +64,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 2a22f12..73d8fcb 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index a18b3cd..beaf467 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -93,6 +93,6 @@
 </ul></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 7a17f0f..c477e39 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -80,6 +80,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index c6112ae..29e25d4 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -60,6 +60,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 4be4ede..b4a1493 100644 (file)
@@ -293,29 +293,11 @@ h2 .extralinks, h3 .extralinks
   font-weight: normal;
 }
 
-acronym,abbr 
+acronym,abbr
 {
   border-bottom: 1px dotted gray;
 }
 
-/* code listings */
-
-.listing_code .programlisting .normal,
-.listing_code .programlisting .normal a,
-.listing_code .programlisting .number,
-.listing_code .programlisting .cbracket,
-.listing_code .programlisting .symbol     { color: #555753; }
-.listing_code .programlisting .comment,
-.listing_code .programlisting .linenum    { color: #babdb6; } /* tango: aluminium 3 */
-.listing_code .programlisting .function,
-.listing_code .programlisting .function a,
-.listing_code .programlisting .preproc    { color: #204a87; } /* tango: sky blue 3  */
-.listing_code .programlisting .string     { color: #ad7fa8; } /* tango: plum */
-.listing_code .programlisting .keyword,
-.listing_code .programlisting .usertype,
-.listing_code .programlisting .type,
-.listing_code .programlisting .type a     { color: #4e9a06; } /* tango: chameleon 3  */
-
 .listing_frame {
   /* tango:sky blue 1 */
   border: solid 1px #729fcf;
@@ -481,3 +463,71 @@ acronym,abbr
   }
 }
 
+.hll { background-color: #ffffcc }
+.c { color: #408080; font-style: italic } /* Comment */
+.err { border: 1px solid #FF0000 } /* Error */
+.k { color: #008000; font-weight: bold } /* Keyword */
+.o { color: #666666 } /* Operator */
+.ch { color: #408080; font-style: italic } /* Comment.Hashbang */
+.cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.cp { color: #BC7A00 } /* Comment.Preproc */
+.cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
+.c1 { color: #408080; font-style: italic } /* Comment.Single */
+.cs { color: #408080; font-style: italic } /* Comment.Special */
+.gd { color: #A00000 } /* Generic.Deleted */
+.ge { font-style: italic } /* Generic.Emph */
+.gr { color: #FF0000 } /* Generic.Error */
+.gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.gi { color: #00A000 } /* Generic.Inserted */
+.go { color: #888888 } /* Generic.Output */
+.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.gs { font-weight: bold } /* Generic.Strong */
+.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.gt { color: #0044DD } /* Generic.Traceback */
+.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.kp { color: #008000 } /* Keyword.Pseudo */
+.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.kt { color: #B00040 } /* Keyword.Type */
+.m { color: #666666 } /* Literal.Number */
+.s { color: #BA2121 } /* Literal.String */
+.na { color: #7D9029 } /* Name.Attribute */
+.nb { color: #008000 } /* Name.Builtin */
+.nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.no { color: #880000 } /* Name.Constant */
+.nd { color: #AA22FF } /* Name.Decorator */
+.ni { color: #999999; font-weight: bold } /* Name.Entity */
+.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.nf { color: #0000FF } /* Name.Function */
+.nl { color: #A0A000 } /* Name.Label */
+.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.nt { color: #008000; font-weight: bold } /* Name.Tag */
+.nv { color: #19177C } /* Name.Variable */
+.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.w { color: #bbbbbb } /* Text.Whitespace */
+.mb { color: #666666 } /* Literal.Number.Bin */
+.mf { color: #666666 } /* Literal.Number.Float */
+.mh { color: #666666 } /* Literal.Number.Hex */
+.mi { color: #666666 } /* Literal.Number.Integer */
+.mo { color: #666666 } /* Literal.Number.Oct */
+.sa { color: #BA2121 } /* Literal.String.Affix */
+.sb { color: #BA2121 } /* Literal.String.Backtick */
+.sc { color: #BA2121 } /* Literal.String.Char */
+.dl { color: #BA2121 } /* Literal.String.Delimiter */
+.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.s2 { color: #BA2121 } /* Literal.String.Double */
+.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.sh { color: #BA2121 } /* Literal.String.Heredoc */
+.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.sx { color: #008000 } /* Literal.String.Other */
+.sr { color: #BB6688 } /* Literal.String.Regex */
+.s1 { color: #BA2121 } /* Literal.String.Single */
+.ss { color: #19177C } /* Literal.String.Symbol */
+.bp { color: #008000 } /* Name.Builtin.Pseudo */
+.fm { color: #0000FF } /* Name.Function.Magic */
+.vc { color: #19177C } /* Name.Variable.Class */
+.vg { color: #19177C } /* Name.Variable.Global */
+.vi { color: #19177C } /* Name.Variable.Instance */
+.vm { color: #19177C } /* Name.Variable.Magic */
+.il { color: #666666 } /* Literal.Number.Integer.Long */
\ No newline at end of file
index 62bcc5a..086d47e 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -42,6 +42,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index c22fe82..24abe64 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 9328e35..8e80757 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -74,6 +74,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index fbde14a..8ed6c3a 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -79,6 +79,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 0d932f9..c5a4fc7 100644 (file)
@@ -7,8 +7,8 @@
 <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="pt02.html" title="Part II. Reference manual">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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">
@@ -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-common-types-apis.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="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">
@@ -44,6 +44,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 05ff3ea..6ca5467 100644 (file)
@@ -8,7 +8,7 @@
 <link rel="up" href="pt01.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.29 (XML mode)">
+<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">
@@ -44,8 +44,8 @@
 <a name="utilities-command-line-tools"></a>Command-line tools</h2></div></div></div>
 <p>
       HarfBuzz include three command-line tools:
-      <span style="color: red">&lt;program&gt;hb-shape&lt;/program&gt;</span>, <span style="color: red">&lt;program&gt;hb-view&lt;/program&gt;</span>, and
-      <span style="color: red">&lt;program&gt;hb-subset&lt;/program&gt;</span>. They can be used to examine
+      <span class="command"><strong>hb-shape</strong></span>, <span class="command"><strong>hb-view</strong></span>, and
+      <span class="command"><strong>hb-subset</strong></span>. They can be used to examine
       HarfBuzz's functionality, debug font binaries, or explore the
       various shaping models and features from a terminal.
     </p>
 <div class="titlepage"><div><div><h3 class="title">
 <a name="utilities-command-line-hbshape"></a>hb-shape</h3></div></div></div>
 <p>
-       <span class="emphasis"><em><span style="color: red">&lt;program&gt;hb-shape&lt;/program&gt;</span></em></span> allows you to run HarfBuzz's
+       <span class="emphasis"><em><span class="command"><strong>hb-shape</strong></span></em></span> allows you to run HarfBuzz's
        <code class="function">hb_shape()</code> function on an input string and
        to examine the outcome, in human-readable form, as terminal
-       output. <span style="color: red">&lt;program&gt;hb-shape&lt;/program&gt;</span> does
+       output. <span class="command"><strong>hb-shape</strong></span> does
        <span class="emphasis"><em>not</em></span> render the results of the shaping call
-       into rendered text (you can use <span style="color: red">&lt;program&gt;hb-view&lt;/program&gt;</span>, below, for
+       into rendered text (you can use <span class="command"><strong>hb-view</strong></span>, below, for
        that). Instead, it prints out the final glyph indices and
        positions, taking all shaping operations into account, as if the
        input string were a HarfBuzz input buffer.
 <div class="titlepage"><div><div><h3 class="title">
 <a name="utilities-command-line-hbview"></a>hb-view</h3></div></div></div>
 <p>
-       <span class="emphasis"><em><span style="color: red">&lt;program&gt;hb-view&lt;/program&gt;</span></em></span> allows you to
+       <span class="emphasis"><em><span class="command"><strong>hb-view</strong></span></em></span> allows you to
        see the shaped output of an input string in rendered
-       form. Like <span style="color: red">&lt;program&gt;hb-shape&lt;/program&gt;</span>,
-       <span style="color: red">&lt;program&gt;hb-view&lt;/program&gt;</span> takes a font file and a text string
+       form. Like <span class="command"><strong>hb-shape</strong></span>,
+       <span class="command"><strong>hb-view</strong></span> takes a font file and a text string
        as its arguments:
       </p>
 <pre class="programlisting">
        <em class="parameter"><code>yourinputtext</code></em>
       </pre>
 <p>
-       By default, <span style="color: red">&lt;program&gt;hb-view&lt;/program&gt;</span> renders the shaped
+       By default, <span class="command"><strong>hb-view</strong></span> renders the shaped
        text in ASCII block-character images as terminal output. By
        appending the
        <span class="command"><strong>--output-file=[<span class="optional">filename</span>]</strong></span>
        (among other formats).
       </p>
 <p>
-       As with <span style="color: red">&lt;program&gt;hb-shape&lt;/program&gt;</span>, a lengthy set of options
+       As with <span class="command"><strong>hb-shape</strong></span>, a lengthy set of options
        is available, with which you can  enable or disable
        specific font features, set variation-font axis values,
        alter the language, script, direction, and clustering settings
        with 
       </p>
 <p>
-       In general, <span style="color: red">&lt;program&gt;hb-view&lt;/program&gt;</span> is a quick way to
+       In general, <span class="command"><strong>hb-view</strong></span> is a quick way to
        verify that the output of HarfBuzz's shaping operation looks
        correct for a given text-and-font combination, but you may
-       want to use <span style="color: red">&lt;program&gt;hb-shape&lt;/program&gt;</span> to figure out exactly
+       want to use <span class="command"><strong>hb-shape</strong></span> to figure out exactly
        why something does not appear as expected.
       </p>
 </div>
 <div class="titlepage"><div><div><h3 class="title">
 <a name="utilities-command-line-hbsubset"></a>hb-subset</h3></div></div></div>
 <p>
-       <span class="emphasis"><em><span style="color: red">&lt;program&gt;hb-subset&lt;/program&gt;</span></em></span> allows you
+       <span class="emphasis"><em><span class="command"><strong>hb-subset</strong></span></em></span> allows you
        to generate a subset of a given font, with a limited set of
        supported characters, features, and variation settings.
       </p>
 <p>
        By default, you provide an input font and an input text string
-       as the arguments to <span style="color: red">&lt;program&gt;hb-subset&lt;/program&gt;</span>, and it will
+       as the arguments to <span class="command"><strong>hb-subset</strong></span>, and it will
        generate a font that covers the input text exactly like the
        input font does, but includes no other characters or features.
       </p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index f460f9b..566150a 100644 (file)
@@ -8,7 +8,7 @@
 <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="next" href="why-is-it-called-harfbuzz.html" title="Why is it called HarfBuzz?">
-<meta name="generator" content="GTK-Doc V1.29 (XML mode)">
+<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">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 251f873..2bdb06c 100644 (file)
@@ -8,7 +8,7 @@
 <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="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.29 (XML mode)">
+<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">
@@ -95,6 +95,6 @@
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index fb61aed..11924af 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
       </p></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index b623b92..282772a 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
@@ -33,6 +33,6 @@
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
index 1fab4ad..12f508f 100644 (file)
@@ -8,7 +8,7 @@
 <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.29 (XML mode)">
+<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">
 </ul></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.29</div>
+<hr>Generated by GTK-Doc V1.32.1</div>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/meson.build b/docs/meson.build
new file mode 100644 (file)
index 0000000..2fc8b81
--- /dev/null
@@ -0,0 +1,69 @@
+if build_machine.system() == 'windows'
+  message('Skipping gtk-doc while building on Windows')
+  subdir_done()
+endif
+
+if not find_program('gtkdoc-scan', required: get_option('gtk_doc')).found()
+  message('Not building documentation as gtk-doc was not found')
+  subdir_done()
+endif
+
+conf.set('HAVE_GTK_DOC', 1)
+
+gnome = import('gnome')
+
+docconf = configuration_data()
+docconf.set('HB_VERSION', meson.project_version())
+
+version_xml = configure_file(input: 'version.xml.in',
+  output: 'version.xml',
+  configuration: docconf)
+
+content_files = [
+  'usermanual-what-is-harfbuzz.xml',
+  'usermanual-install-harfbuzz.xml',
+  'usermanual-getting-started.xml',
+  'usermanual-glyph-information.xml',
+  'usermanual-shaping-concepts.xml',
+  'usermanual-object-model.xml',
+  'usermanual-buffers-language-script-and-direction.xml',
+  'usermanual-fonts-and-faces.xml',
+  'usermanual-opentype-features.xml',
+  'usermanual-clusters.xml',
+  'usermanual-utilities.xml',
+  'usermanual-integration.xml',
+  version_xml,
+]
+
+html_images = [
+  'HarfBuzz.png',
+  '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
+
+gnome.gtkdoc('harfbuzz',
+  main_sgml: 'harfbuzz-docs.xml',
+  src_dir: [meson.current_source_dir() / '..',
+            meson.current_build_dir() / '..',
+           ],
+  scan_args: ['--deprecated-guards=HB_DISABLE_DEPRECATED',
+              '--ignore-decorators=HB_EXTERN',
+             ],
+  mkdb_args: ['--source-suffixes=h,cc',
+              '--xml-mode',
+              '--output-format=xml',
+             ],
+  content_files: content_files,
+  html_assets: html_images,
+  ignore_headers: ignore_headers,
+  dependencies: [libharfbuzz_dep, libharfbuzz_gobject_dep],
+  install: true)
index 2865426..d98c79b 100644 (file)
       hb_buffer_set_language(buf, hb_language_from_string("en", -1));
     </programlisting>
     <para>
-      However, since these properties are often the repeated for
+      However, since these properties are often repeated for
       multiple text runs, you can also save them in a
       <literal>hb_segment_properties_t</literal> for reuse:
     </para>
index 2b61ce8..0ec3585 100644 (file)
     <title id="download.title">Downloading HarfBuzz</title>
     <para>
       The HarfBuzz source code is hosted at <ulink
-      url="https://github.com/harfbuzz/harfbuzz">github.com/harfbuzz/harfbuzz</ulink>. The
-      same source tree is also available at the
-      <ulink
-         url="http://cgit.freedesktop.org/harfbuzz/">Freedesktop.org</ulink>
-      site.
+      url="https://github.com/harfbuzz/harfbuzz">github.com/harfbuzz/harfbuzz</ulink>.
     </para>
     <para>
       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>
-      or from 
-      <ulink url="http://www.freedesktop.org/software/harfbuzz/release/">Freedesktop.org</ulink>.
+      url="https://github.com/harfbuzz/harfbuzz">github.com/harfbuzz/harfbuzz/releases</ulink>.
     </para>
     <para>
       Release notes are posted with each new release to provide an
diff --git a/docs/usermanual-integration.xml b/docs/usermanual-integration.xml
new file mode 100644 (file)
index 0000000..78c9a0e
--- /dev/null
@@ -0,0 +1,603 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<chapter id="integration">
+  <title>Platform Integration Guide</title>
+  <para>
+    HarfBuzz was first developed for use with the GNOME and GTK
+    software stack commonly found in desktop Linux
+    distributions. Nevertheless, it can be used on other operating
+    systems and platforms, from iOS and macOS to Windows. It can also
+    be used with other application frameworks and components, such as
+    Android, Qt, or application-specific widget libraries.
+  </para>
+  <para>
+    This chapter will look at how HarfBuzz fits into a typical
+    text-rendering pipeline, and will discuss the APIs available to
+    integrate HarfBuzz with contemporary Linux, Mac, and Windows
+    software. It will also show how HarfBuzz integrates with popular
+    external libraries like FreeType and International Components for
+    Unicode (ICU) and describe the HarfBuzz language bindings for
+    Python.
+  </para>
+  <para>
+    On a GNOME system, HarfBuzz is designed to tie in with several
+    other common system libraries. The most common architecture uses
+    Pango at the layer directly "above" HarfBuzz; Pango is responsible
+    for text segmentation and for ensuring that each input
+    <type>hb_buffer_t</type> passed to HarfBuzz for shaping contains
+    Unicode code points that share the same segment properties
+    (namely, direction, language, and script, but also higher-level
+    properties like the active font, font style, and so on).
+  </para>
+  <para>
+    The layer directly "below" HarfBuzz is typically FreeType, which
+    is used to rasterize glyph outlines at the necessary optical size,
+    hinting settings, and pixel resolution. FreeType provides APIs for
+    accessing font and face information, so HarfBuzz includes
+    functions to create <type>hb_face_t</type> and
+    <type>hb_font_t</type> objects directly from FreeType
+    objects. HarfBuzz can use FreeType's built-in functions for
+    <structfield>font_funcs</structfield> vtable in an <type>hb_font_t</type>.
+  </para>
+  <para>
+    FreeType's output is bitmaps of the rasterized glyphs; on a
+    typical Linux system these will then be drawn by a graphics
+    library like Cairo, but those details are beyond HarfBuzz's
+    control. On the other hand, at the top end of the stack, Pango is
+    part of the larger GNOME framework, and HarfBuzz does include APIs
+    for working with key components of GNOME's higher-level libraries
+    &mdash; most notably GLib.
+  </para>
+  <para>
+    For other operating systems or application frameworks, the
+    critical integration points are where HarfBuzz gets font and face
+    information about the font used for shaping and where HarfBuzz
+    gets Unicode data about the input-buffer code points.
+  </para>
+  <para>
+    The font and face information is necessary for text shaping
+    because HarfBuzz needs to retrieve the glyph indices for
+    particular code points, and to know the extents and advances of
+    glyphs. Note that, in an OpenType variable font, both of those
+    types of information can change with different variation-axis
+    settings.
+  </para>
+  <para>
+    The Unicode information is necessary for shaping because the
+    properties of a code point (such as its General Category (gc),
+    Canonical Combining Class (ccc), and decomposition) can directly
+    impact the shaping moves that HarfBuzz performs.
+  </para>
+  
+  <section id="integration-glib">
+    <title>GNOME integration, GLib, and GObject</title>
+    <para>
+      As mentioned in the preceding section, HarfBuzz offers
+      integration APIs to help client programs using the
+      GNOME and GTK framework commonly found in desktop Linux
+      distributions. 
+    </para>
+    <para>
+      GLib is the main utility library for GNOME applications. It
+      provides basic data types and conversions, file abstractions,
+      string manipulation, and macros, as well as facilities like
+      memory allocation and the main event loop.
+    </para>
+    <para>
+      Where text shaping is concerned, GLib provides several utilities
+      that HarfBuzz can take advantage of, including a set of
+      Unicode-data functions and a data type for script
+      information. Both are useful when working with HarfBuzz
+      buffers. To make use of them, you will need to include the
+      <filename>hb-glib.h</filename> header file.
+    </para>
+    <para>
+      GLib's <ulink
+      url="https://developer.gnome.org/glib/stable/glib-Unicode-Manipulation.html">Unicode
+      manipulation API</ulink> includes all the functionality
+      necessary to retrieve Unicode data for the
+      <structfield>unicode_funcs</structfield> structure of a HarfBuzz
+      <type>hb_buffer_t</type>. 
+    </para>
+    <para>
+      The function <function>hb_glib_get_unicode_funcs()</function>
+      sets up a <type>hb_unicode_funcs_t</type> structure configured
+      with the GLib Unicode functions and returns a pointer to it.
+    </para>
+    <para>
+      You can attach this Unicode-functions structure to your buffer,
+      and it will be ready for use with GLib:
+    </para>
+    <programlisting language="C">
+      #include &lt;hb-glib.h&gt;
+      ...
+      hb_unicode_funcs_t *glibufunctions;
+      glibufunctions = hb_glib_get_unicode_funcs();
+      hb_buffer_set_unicode_funcs(buf, glibufunctions);
+    </programlisting>
+    <para>
+      For script information, GLib uses the
+      <type>GUnicodeScript</type> type. Like HarfBuzz's own
+      <type>hb_script_t</type>, this data type is an enumeration
+      of Unicode scripts, but text segments passed in from GLib code
+      will be tagged with a <type>GUnicodeScript</type>. Therefore,
+      when setting the script property on a <type>hb_buffer_t</type>,
+      you will need to convert between the <type>GUnicodeScript</type>
+      of the input provided by GLib and HarfBuzz's
+      <type>hb_script_t</type> type.
+    </para>
+    <para>
+      The <function>hb_glib_script_to_script()</function> function
+      takes an <type>GUnicodeScript</type> script identifier as its
+      sole argument and returns the corresponding <type>hb_script_t</type>.
+      The <function>hb_glib_script_from_script()</function> does the
+      reverse, taking an <type>hb_script_t</type> and returning the
+      <type>GUnicodeScript</type> identifier for GLib.
+    </para>
+    <para>
+      Finally, GLib also provides a reference-counted object type called <ulink
+      url="https://developer.gnome.org/glib/stable/glib-Byte-Arrays.html#GBytes"><type>GBytes</type></ulink>
+      that is used for accessing raw memory segments with the benefits
+      of GLib's lifecycle management. HarfBuzz provides a
+      <function>hb_glib_blob_create()</function> function that lets
+      you create an <type>hb_blob_t</type> directly from a
+      <type>GBytes</type> object. This function takes only the
+      <type>GBytes</type> object as its input; HarfBuzz registers the
+      GLib <function>destroy</function> callback automatically.
+    </para>
+    <para>
+      The GNOME platform also features an object system called
+      GObject. For HarfBuzz, the main advantage of GObject is a
+      feature called <ulink
+      url="https://gi.readthedocs.io/en/latest/">GObject
+      Introspection</ulink>. This is a middleware facility that can be
+      used to generate language bindings for C libraries. HarfBuzz uses it
+      to build its Python bindings, which we will look at in a separate section.
+    </para>
+  </section>
+  
+  <section id="integration-freetype">
+    <title>FreeType integration</title>
+    <para>
+      FreeType is the free-software font-rendering engine included in
+      desktop Linux distributions, Android, ChromeOS, iOS, and multiple Unix
+      operating systems, and used by cross-platform programs like
+      Chrome, Java, and GhostScript. Used together, HarfBuzz can
+      perform shaping on Unicode text segments, outputting the glyph
+      IDs that FreeType should rasterize from the active font as well
+      as the positions at which those glyphs should be drawn.
+    </para>
+    <para>
+      HarfBuzz provides integration points with FreeType at the
+      face-object and font-object level and for the font-functions
+      virtual-method structure of a font object. To use the
+      FreeType-integration API, include the
+      <filename>hb-ft.h</filename> header.
+    </para>
+    <para>
+      In a typical client program, you will create your
+      <type>hb_face_t</type> face object and <type>hb_font_t</type>
+      font object from a FreeType <type>FT_Face</type>. HarfBuzz
+      provides a suite of functions for doing this.
+    </para>
+    <para>
+      In the most common case, you will want to use
+      <function>hb_ft_font_create_referenced()</function>, which
+      creates both an <type>hb_face_t</type> face object and
+      <type>hb_font_t</type> font object (linked to that face object),
+      and provides lifecycle management.
+    </para>
+    <para>
+      It is important to note,
+      though, that while HarfBuzz makes a distinction between its face and
+      font objects, FreeType's <type>FT_Face</type> does not. After
+      you create your <type>FT_Face</type>, you must set its size
+      parameter using <function>FT_Set_Char_Size()</function>, because
+      an <type>hb_font_t</type> is defined as an instance of an
+      <type>hb_face_t</type> with size specified.
+    </para>
+    <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);
+    </programlisting>
+    <para>
+      <function>hb_ft_font_create_referenced()</function> is
+      the recommended function for creating an <type>hb_face_t</type> face
+      object. This function calls <function>FT_Reference_Face()</function>
+      before using the <type>FT_Face</type> and calls 
+      <function>FT_Done_Face()</function> when it is finished using the
+      <type>FT_Face</type>. Consequently, your client program does not need
+      to worry about destroying the <type>FT_Face</type> while HarfBuzz
+      is still using it.
+    </para>
+    <para>
+      Although <function>hb_ft_font_create_referenced()</function> is
+      the recommended function, there is another variant for client code
+      where special circumstances make it necessary. The simpler
+      version of the function is <function>hb_ft_font_create()</function>,
+      which takes an <type>FT_Face</type> and an optional destroy callback 
+      as its arguments. Because <function>hb_ft_font_create()</function> 
+      does not offer lifecycle management, however, your client code will
+      be responsible for tracking references to the <type>FT_Face</type>
+      objects and destroying them when they are no longer needed. If you
+      do not have a valid reason for doing this, use
+      <function>hb_ft_font_create_referenced()</function>. 
+    </para>
+    <para>
+      After you have created your font object from your
+      <type>FT_Face</type>, you can set or retrieve the
+      <structfield>load_flags</structfield> of the
+      <type>FT_Face</type> through the <type>hb_font_t</type>
+      object. HarfBuzz provides
+      <function>hb_ft_font_set_load_flags()</function> and
+      <function>hb_ft_font_get_load_flags()</function> for this
+      purpose. The ability to set the
+      <structfield>load_flags</structfield> through the font object
+      could be useful for enabling or disabling hinting, for example,
+      or to activate vertical layout.
+    </para>
+    <para>
+      HarfBuzz also provides a utility function called
+      <function>hb_ft_font_has_changed()</function> that you should
+      call whenever you have altered the properties of your underlying
+      <type>FT_Face</type>, as well as a
+      <function>hb_ft_get_face()</function> that you can call on an
+      <type>hb_font_t</type> font object to fetch its underlying <type>FT_Face</type>.
+    </para>
+    <para>
+      With an <type>hb_face_t</type> and <type>hb_font_t</type> both linked
+      to your <type>FT_Face</type>, you will typically also want to
+      use FreeType for the <structfield>font_funcs</structfield>
+      vtable of your <type>hb_font_t</type>. As a reminder, this
+      font-functions structure is the set of methods that HarfBuzz
+      will use to fetch important information from the font, such as
+      the advances and extents of individual glyphs. 
+    </para>
+    <para>
+      All you need to do is call
+    </para>
+    <programlisting language="C">
+      hb_ft_font_set_funcs(font);
+    </programlisting>
+    <para>
+      and HarfBuzz will use FreeType for the font-functions in
+      <literal>font</literal>. 
+    </para>
+    <para>
+      As we noted above, an <type>hb_font_t</type> is derived from an
+      <type>hb_face_t</type> with size (and, perhaps, other
+      parameters, such as variation-axis coordinates)
+      specified. Consequently, you can reuse an <type>hb_face_t</type>
+      with several <type>hb_font_t</type> objects, and HarfBuzz
+      provides functions to simplify this.
+    </para>
+    <para>
+      The <function>hb_ft_face_create_referenced()</function>
+      function creates just an <type>hb_face_t</type> from a FreeType
+      <type>FT_Face</type> and, as with
+      <function>hb_ft_font_create_referenced()</function> above,
+      provides lifecycle management for the <type>FT_Face</type>.
+    </para>
+    <para>
+      Similarly, there is an <function>hb_ft_face_create()</function>
+      function variant that does not provide the lifecycle-management
+      feature. As with the font-object case, if you use this version
+      of the function, it will be your client code's respsonsibility
+      to track usage of the <type>FT_Face</type> objects.
+    </para>
+    <para>
+      A third variant of this function is
+      <function>hb_ft_face_create_cached()</function>, which is the
+      same as <function>hb_ft_face_create()</function> except that it
+      also uses the <structfield>generic</structfield> field of the
+      <type>FT_Face</type> structure to save a pointer to the newly
+      created <type>hb_face_t</type>. Subsequently, function calls
+      that pass the same <type>FT_Face</type> will get the same
+      <type>hb_face_t</type> returned &mdash; and the
+      <type>hb_face_t</type> will be correctly reference
+      counted. Still, as with
+      <function>hb_ft_face_create()</function>, your client code must
+      track references to the <type>FT_Face</type> itself, and destroy
+      it when it is unneeded.
+    </para>
+  </section>
+  
+  <section id="integration-uniscribe">
+    <title>Uniscribe integration</title>
+    <para>
+      If your client program is running on Windows, HarfBuzz offers
+      an additional API that can help integrate with Microsoft's
+      Uniscribe engine and the Windows GDI.
+    </para>
+    <para>
+      Overall, the Uniscribe API covers a broader set of typographic
+      layout functions than HarfBuzz implements, but HarfBuzz's
+      shaping API can serve as a drop-in replacement for Uniscribe's shaping
+      functionality. In fact, one of HarfBuzz's design goals is to
+      accurately reproduce the same output for shaping a given text
+      segment that Uniscribe produces &mdash; even to the point of
+      duplicating known shaping bugs or deviations from the
+      specification &mdash; so you can be confident that your users'
+      documents with their existing fonts will not be affected adversely by
+      switching to HarfBuzz.
+    </para>
+    <para>
+      At a basic level, HarfBuzz's <function>hb_shape()</function>
+      function replaces both the <ulink url=""><function>ScriptShape()</function></ulink>
+      and <ulink
+      url="https://docs.microsoft.com/en-us/windows/desktop/api/Usp10/nf-usp10-scriptplace"><function>ScriptPlace()</function></ulink>
+      functions from Uniscribe. 
+    </para>
+    <para>
+      However, whereas <function>ScriptShape()</function> returns the
+      glyphs and clusters for a shaped sequence and
+      <function>ScriptPlace()</function> returns the advances and
+      offsets for those glyphs, <function>hb_shape()</function>
+      handles both. After <function>hb_shape()</function> shapes a
+      buffer, the output glyph IDs and cluster IDs are returned as
+      an array of <structname>hb_glyph_info_t</structname> structures, and the
+      glyph advances and offsets are returned as an array of
+      <structname>hb_glyph_position_t</structname> structures. 
+    </para>
+    <para>
+      Your client program only needs to ensure that it coverts
+      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
+      read the <xref linkend="buffers-language-script-and-direction"
+      /> 
+      chapter for a full explanation of how HarfBuzz input buffers are
+      used, and see <xref linkend="shaping-buffer-output" /> for the
+      details of what <function>hb_shape()</function> returns in the
+      output buffer when shaping is complete. 
+    </para>
+    <para>
+      Although <function>hb_shape()</function> itself is functionally
+      equivalent to Uniscribe's shaping routines, there are two
+      additional HarfBuzz functions you may want to use to integrate
+      the libraries in your code. Both are used to link HarfBuzz font
+      objects to the equivalent Windows structures.
+    </para>
+    <para>
+      The <function>hb_uniscribe_font_get_logfontw()</function>
+      function takes a <type>hb_font_t</type> font object and returns
+      a pointer to the <ulink
+      url="https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/ns-wingdi-logfontw"><type>LOGFONTW</type></ulink>
+      "logical font" that corresponds to it. A <type>LOGFONTW</type>
+      structure holds font-wide attributes, including metrics, size,
+      and style information.
+    </para>
+<!--      
+     <para>
+       In Uniscribe's model, the <type>SCRIPT_CACHE</type> holds the
+       device context, including the logical font that the shaping
+       functions apply.
+       https://docs.microsoft.com/en-us/windows/desktop/Intl/script-cache
+    </para>
+-->
+    <para>
+      The <function>hb_uniscribe_font_get_hfont()</function> function
+      also takes a <type>hb_font_t</type> font object, but it returns
+      an <type>HFONT</type> &mdash; a handle to the underlying logical
+      font &mdash; instead.
+    </para>
+    <para>
+      <type>LOGFONTW</type>s and <type>HFONT</type>s are both needed
+      by other Uniscribe functions.
+    </para>
+    <para>
+      As a final note, you may notice a reference to an optional
+      <literal>uniscribe</literal> shaper back-end in the <xref
+      linkend="configuration" /> section of the HarfBuzz manual. This
+      option is not a Uniscribe-integration facility.
+    </para>
+    <para>
+      Instead, it is a internal code path used in the
+      <command>hb-shape</command> command-line utility, which hands
+      shaping functionality over to Uniscribe entirely, when run on a
+      Windows system. That allows testing HarfBuzz's native output
+      against the Uniscribe engine, for tracking compatibility and
+      debugging.
+    </para>
+    <para>
+      Because this back-end is only used when testing HarfBuzz
+      functionality, it is disabled by default when building the
+      HarfBuzz binaries.
+    </para>
+  </section>
+   
+  <section id="integration-coretext">
+    <title>Core Text integration</title>
+    <para>
+      If your client program is running on macOS or iOS, HarfBuzz offers
+      an additional API that can help integrate with Apple's
+      Core Text engine and the underlying Core Graphics
+      framework. HarfBuzz does not attempt to offer the same
+      drop-in-replacement functionality for Core Text that it strives
+      for with Uniscribe on Windows, but you can still use HarfBuzz
+      to perform text shaping in native macOS and iOS applications.
+    </para>
+    <para>
+      Note, though, that if your interest is just in using fonts that
+      contain Apple Advanced Typography (AAT) features, then you do
+      not need to add Core Text integration. HarfBuzz natively
+      supports AAT features and will shape AAT fonts (on any platform)
+      automatically, without requiring additional work on your
+      part. This includes support for AAT-specific TrueType tables
+      such as <literal>mort</literal>, <literal>morx</literal>, and
+      <literal>kerx</literal>, which AAT fonts use instead of
+      <literal>GSUB</literal> and <literal>GPOS</literal>.
+    </para>
+    <para>
+      On a macOS or iOS system, the primary integration points offered
+      by HarfBuzz are for face objects and font objects. 
+    </para>
+    <para>
+      The Apple APIs offer a pair of data structures that map well to
+      HarfBuzz's face and font objects. The Core Graphics API, which
+      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,
+      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
+      be hooked up to a Core Text <type>CTFontRef</type>, and a HarfBuzz
+      <type>hb_face_t</type> face object can be hooked up to a
+      <type>CGFontRef</type>.
+    </para>
+    <para>
+      You can create a <type>hb_face_t</type> from a
+      <type>CGFontRef</type> by using the
+      <function>hb_coretext_face_create()</function>. Subsequently,
+      you can retrieve the <type>CGFontRef</type> from a
+      <type>hb_face_t</type> with <function>hb_coretext_face_get_cg_font()</function>.
+    </para>
+    <para>
+      Likewise, you create a <type>hb_font_t</type> from a
+      <type>CTFontRef</type> by calling
+      <function>hb_coretext_font_create()</function>, and you can
+      fetch the associated <type>CTFontRef</type> from a
+      <type>hb_font_t</type> font object with
+      <function>hb_coretext_face_get_ct_font()</function>. 
+    </para>
+    <para>
+      HarfBuzz also offers a <function>hb_font_set_ptem()</function>
+      that you an use to set the nominal point size on any
+      <type>hb_font_t</type> font object. Core Text uses this value to
+      implement optical scaling. 
+    </para>
+    <para>
+      When integrating your client code with Core Text, it is
+      important to recognize that Core Text <literal>points</literal>
+      are not typographic points (standardized at 72 per inch) as the
+      term is used elsewhere in OpenType. Instead, Core Text points
+      are CSS points, which are standardized at 96 per inch.
+    </para>
+    <para>
+      HarfBuzz's font functions take this distinction into account,
+      but it can be an easy detail to miss in cross-platform
+      code. 
+    </para>
+    <para>
+      As a final note, you may notice a reference to an optional
+      <literal>coretext</literal> shaper back-end in the <xref
+      linkend="configuration" /> section of the HarfBuzz manual. This
+      option is not a Core Text-integration facility.
+    </para>
+    <para>
+      Instead, it is a internal code path used in the
+      <command>hb-shape</command> command-line utility, which hands
+      shaping functionality over to Core Text entirely, when run on a
+      macOS system. That allows testing HarfBuzz's native output
+      against the Core Text engine, for tracking compatibility and debugging.
+    </para>
+    <para>
+      Because this back-end is only used when testing HarfBuzz
+      functionality, it is disabled by default when building the
+      HarfBuzz binaries.
+    </para>
+  </section>
+  
+  <section id="integration-icu">
+    <title>ICU integration</title>
+    <para>
+      Although HarfBuzz includes its own Unicode-data functions, it
+      also provides integration APIs for using the International
+      Components for Unicode (ICU) library as a source of Unicode data
+      on any supported platform.
+    </para>
+    <para>
+      The principal integration point with ICU is the
+      <type>hb_unicode_funcs_t</type> Unicode-functions structure
+      attached to a buffer. This structure holds the virtual methods
+      used for retrieving Unicode character properties, such as
+      General Category, Script, Combining Class, decomposition
+      mappings, and mirroring information.
+    </para>
+    <para>
+      To use ICU in your client program, you need to call
+      <function>hb_icu_get_unicode_funcs()</function>, which creates a
+      Unicode-functions structure populated with the ICU function for
+      each included method. Subsequently, you can attach the
+      Unicode-functions structure to your buffer:
+    </para>
+    <programlisting language="C">
+      hb_unicode_funcs_t *icufunctions;
+      icufunctions = hb_icu_get_unicode_funcs();
+      hb_buffer_set_unicode_funcs(buf, icufunctions);
+    </programlisting>
+    <para>
+      and ICU will be used for Unicode-data access.
+    </para>
+    <para>
+      HarfBuzz also supplies a pair of functions
+      (<function>hb_icu_script_from_script()</function> and
+      <function>hb_icu_script_to_script()</function>) for converting
+      between ICU's and HarfBuzz's internal enumerations of Unicode
+      scripts. The <function>hb_icu_script_from_script()</function>
+      function converts from a HarfBuzz <type>hb_script_t</type> to an
+      ICU <type>UScriptCode</type>. The
+      <function>hb_icu_script_to_script()</function> function does the
+      reverse: converting from a <type>UScriptCode</type> identifier
+      to a <type>hb_script_t</type>.
+    </para>
+    <para>
+      By default, HarfBuzz's ICU support is built as a separate shared
+      library (<filename class="libraryfile">libharfbuzz-icu.so</filename>)
+      when compiling HarfBuzz from source. This allows client programs
+      that do not need ICU to link against HarfBuzz without unnecessarily
+      adding ICU as a dependency. You can also build HarfBuzz with ICU
+      support built directly into the main HarfBuzz shared library
+      (<filename class="libraryfile">libharfbuzz.so</filename>),
+      by specifying the <literal>--with-icu=builtin</literal>
+      compile-time option.
+    </para>
+
+  </section>
+  
+  <section id="integration-python">
+    <title>Python bindings</title>
+    <para>
+      As noted in the <xref linkend="integration-glib" /> section,
+      HarfBuzz uses a feature called <ulink
+      url="https://wiki.gnome.org/Projects/GObjectIntrospection">GObject
+      Introspection</ulink> (GI) to provide bindings for Python.
+    </para>
+    <para>
+      At compile time, the GI scanner analyzes the HarfBuzz C source
+      and builds metadata objects connecting the language bindings to
+      the C library. Your Python code can then use the HarfBuzz binary
+      through its Python interface.
+    </para>
+    <para>
+      HarfBuzz's Python bindings support Python 2 and Python 3. To use
+      them, you will need to have the <literal>pygobject</literal>
+      package installed. Then you should import
+      <literal>HarfBuzz</literal> from
+      <literal>gi.repository</literal>: 
+    </para>
+    <programlisting language="Python">
+      from gi.repository import HarfBuzz
+    </programlisting>
+    <para>
+      and you can call HarfBuzz functions from Python. Sample code can
+      be found in the <filename>sample.py</filename> script in the
+      HarfBuzz <filename>src</filename> directory.
+    </para>
+    <para>
+      Do note, however, that the Python API is subject to change
+      without advance notice. GI allows the bindings to be
+      automatically updated, which is one of its advantages, but you
+      may need to update your Python code.
+    </para>
+  </section>
+  
+</chapter>
index f571c47..4f0fc92 100644 (file)
       <function>malloc()</function>, you would create the blob using
     </para>
     <programlisting language="C">
-      hb_blob_create (data, length, HB_MEMORY_MODE_WRITABLE, NULL, free)
+      hb_blob_create (data, length, HB_MEMORY_MODE_WRITABLE, data, free)
     </programlisting>
     <para>
       That way, HarfBuzz will call <function>free()</function> on the
index 1c5370c..6e30c46 100644 (file)
@@ -18,8 +18,8 @@
     <title>Command-line tools</title>
     <para>
       HarfBuzz include three command-line tools:
-      <program>hb-shape</program>, <program>hb-view</program>, and
-      <program>hb-subset</program>. They can be used to examine
+      <command>hb-shape</command>, <command>hb-view</command>, and
+      <command>hb-subset</command>. They can be used to examine
       HarfBuzz's functionality, debug font binaries, or explore the
       various shaping models and features from a terminal.
     </para>
     <section id="utilities-command-line-hbshape">
       <title>hb-shape</title>
       <para>
-       <emphasis><program>hb-shape</program></emphasis> allows you to run HarfBuzz's
+       <emphasis><command>hb-shape</command></emphasis> allows you to run HarfBuzz's
        <function>hb_shape()</function> function on an input string and
        to examine the outcome, in human-readable form, as terminal
-       output. <program>hb-shape</program> does
+       output. <command>hb-shape</command> does
        <emphasis>not</emphasis> render the results of the shaping call
-       into rendered text (you can use <program>hb-view</program>, below, for
+       into rendered text (you can use <command>hb-view</command>, below, for
        that). Instead, it prints out the final glyph indices and
        positions, taking all shaping operations into account, as if the
        input string were a HarfBuzz input buffer.
     <section id="utilities-command-line-hbview">
       <title>hb-view</title>
       <para>
-       <emphasis><program>hb-view</program></emphasis> allows you to
+       <emphasis><command>hb-view</command></emphasis> allows you to
        see the shaped output of an input string in rendered
-       form. Like <program>hb-shape</program>,
-       <program>hb-view</program> takes a font file and a text string
+       form. Like <command>hb-shape</command>,
+       <command>hb-view</command> takes a font file and a text string
        as its arguments:
       </para>
       <programlisting>
@@ -92,7 +92,7 @@
        <parameter>yourinputtext</parameter>
       </programlisting>
       <para>
-       By default, <program>hb-view</program> renders the shaped
+       By default, <command>hb-view</command> renders the shaped
        text in ASCII block-character images as terminal output. By
        appending the
        <command>--output-file=<optional>filename</optional></command>
        (among other formats).
       </para>
       <para>
-       As with <program>hb-shape</program>, a lengthy set of options
+       As with <command>hb-shape</command>, a lengthy set of options
        is available, with which you can  enable or disable
        specific font features, set variation-font axis values,
        alter the language, script, direction, and clustering settings
        with 
       </para>
       <para>
-       In general, <program>hb-view</program> is a quick way to
+       In general, <command>hb-view</command> is a quick way to
        verify that the output of HarfBuzz's shaping operation looks
        correct for a given text-and-font combination, but you may
-       want to use <program>hb-shape</program> to figure out exactly
+       want to use <command>hb-shape</command> to figure out exactly
        why something does not appear as expected.
       </para>
     </section>
     <section id="utilities-command-line-hbsubset">
       <title>hb-subset</title>
       <para>
-       <emphasis><program>hb-subset</program></emphasis> allows you
+       <emphasis><command>hb-subset</command></emphasis> allows you
        to generate a subset of a given font, with a limited set of
        supported characters, features, and variation settings.
       </para>
       <para>
        By default, you provide an input font and an input text string
-       as the arguments to <program>hb-subset</program>, and it will
+       as the arguments to <command>hb-subset</command>, and it will
        generate a font that covers the input text exactly like the
        input font does, but includes no other characters or features.
       </para>
index 2714f53..e261122 100644 (file)
@@ -1 +1 @@
-2.6.4
+2.6.7
index 8175c64..20d8b2e 100755 (executable)
@@ -451,7 +451,18 @@ do
     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
 
     # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+    (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") &&
 
     # and set any options; do chmod last to preserve setuid bits.
     #
index 7f3523d..48cea9b 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 v2014-01-03.01
+##               by inline-source v2018-07-24.06
 
-# libtool (GNU libtool) 2.4.6
+# libtool (GNU libtool) 2.4.6.42-b88ce-dirty
 # Provide generalized library-building support services.
 # Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
 
-# Copyright (C) 1996-2015 Free Software Foundation, Inc.
+# Copyright (C) 1996-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.
 
@@ -31,8 +31,8 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION=2.4.6
-package_revision=2.4.6
+VERSION=2.4.6.42-b88ce-dirty
+package_revision=2.4.6.42
 
 
 ## ------ ##
@@ -64,34 +64,25 @@ package_revision=2.4.6
 # libraries, which are installed to $pkgauxdir.
 
 # Set a version string for this script.
-scriptversion=2015-01-20.17; # UTC
+scriptversion=2018-07-24.06; # UTC
 
 # General shell script boiler plate, and helper functions.
 # Written by Gary V. Vaughan, 2004
 
-# 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.
-
-# 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/>.
+# 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.
 
-# Please report bugs or propose patches to gary@gnu.org.
+# Please report bugs or propose patches to:
+# <https://github.com/gnulib-modules/bootstrap/issues>
 
 
 ## ------ ##
@@ -140,9 +131,6 @@ do
        fi"
 done
 
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
 # Make sure IFS has a sensible default
 sp=' '
 nl='
@@ -159,6 +147,26 @@ 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. ##
@@ -259,7 +267,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
 }
@@ -295,7 +303,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
 }
 
@@ -580,16 +588,16 @@ if test yes = "$_G_HAVE_PLUSEQ_OP"; then
   {
     $debug_cmd
 
-    func_quote_for_eval "$2"
-    eval "$1+=\\ \$func_quote_for_eval_result"
+    func_quote_arg pretty "$2"
+    eval "$1+=\\ \$func_quote_arg_result"
   }'
 else
   func_append_quoted ()
   {
     $debug_cmd
 
-    func_quote_for_eval "$2"
-    eval "$1=\$$1\\ \$func_quote_for_eval_result"
+    func_quote_arg pretty "$2"
+    eval "$1=\$$1\\ \$func_quote_arg_result"
   }
 fi
 
@@ -1091,85 +1099,199 @@ func_relative_path ()
 }
 
 
-# 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 ()
+# 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 ()
 {
     $debug_cmd
 
-    func_quote_for_eval_unquoted_result=
-    func_quote_for_eval_result=
-    while test 0 -lt $#; do
-      case $1 in
-        *[\\\`\"\$]*)
-         _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"
+    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
 
-      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\"
+      # Quote for eval.
+      case $func_quote_portable_result in
+        *[\\\`\"\$]*)
+          case $func_quote_portable_result in
+            *[\[\*\?]*)
+              func_quote_portable_result=`$ECHO "$func_quote_portable_result" \
+                  | $SED "$sed_quote_subst"`
+              break
+              ;;
+          esac
+
+          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
           ;;
-        *)
-          _G_quoted_arg=$_G_unquoted_arg
-         ;;
+        *) ;;
       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
+      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
 }
 
 
-# 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_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
 
-    case $1 in
-      *[\\\`\"]*)
-       _G_arg=`$ECHO "$1" | $SED \
-           -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        _G_arg=$1 ;;
+
+# 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=:
+        ;;
     esac
 
-    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\"
+    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
         ;;
     esac
+}
 
-    func_quote_for_expand_result=$_G_arg
+
+# 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
 }
 
 
@@ -1215,8 +1337,8 @@ func_show_eval ()
     _G_cmd=$1
     _G_fail_exp=${2-':'}
 
-    func_quote_for_expand "$_G_cmd"
-    eval "func_notquiet $func_quote_for_expand_result"
+    func_quote_arg pretty,expand "$_G_cmd"
+    eval "func_notquiet $func_quote_arg_result"
 
     $opt_dry_run || {
       eval "$_G_cmd"
@@ -1241,8 +1363,8 @@ func_show_eval_locale ()
     _G_fail_exp=${2-':'}
 
     $opt_quiet || {
-      func_quote_for_expand "$_G_cmd"
-      eval "func_echo $func_quote_for_expand_result"
+      func_quote_arg expand,pretty "$_G_cmd"
+      eval "func_echo $func_quote_arg_result"
     }
 
     $opt_dry_run || {
@@ -1369,30 +1491,26 @@ func_lt_ver ()
 # End:
 #! /bin/sh
 
-# Set a version string for this script.
-scriptversion=2014-01-07.03; # UTC
-
 # A portable, pluggable option parser for Bourne shell.
 # Written by Gary V. Vaughan, 2010
 
-# 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.
-
-# 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.
+# 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.
 
-# 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:
+# <https://github.com/gnulib-modules/bootstrap/issues>
 
-# Please report bugs or propose patches to gary@gnu.org.
+# Set a version string for this script.
+scriptversion=2018-07-24.06; # UTC
 
 
 ## ------ ##
@@ -1415,7 +1533,7 @@ scriptversion=2014-01-07.03; # 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 '# warranty; '.
+# starting with '# Written by ' and ending with '# Copyright'.
 #
 # 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
@@ -1427,7 +1545,7 @@ scriptversion=2014-01-07.03; # UTC
 # to display verbose messages only when your user has specified
 # '--verbose'.
 #
-# After sourcing this file, you can plug processing for additional
+# After sourcing this file, you can plug in processing for additional
 # options by amending the variables from the 'Configuration' section
 # below, and following the instructions in the 'Option parsing'
 # section further down.
@@ -1476,8 +1594,8 @@ fatal_help="Try '\$progname --help' for more information."
 ## ------------------------- ##
 
 # This section contains functions for adding, removing, and running hooks
-# to the main code.  A hook is just a named list of of function, that can
-# be run in order later on.
+# in the main code.  A hook is just a list of function names that can be
+# run in order later on.
 
 # func_hookable FUNC_NAME
 # -----------------------
@@ -1510,7 +1628,8 @@ func_add_hook ()
 
 # func_remove_hook FUNC_NAME HOOK_FUNC
 # ------------------------------------
-# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+# Remove HOOK_FUNC from the list of hook functions to be called by
+# FUNC_NAME.
 func_remove_hook ()
 {
     $debug_cmd
@@ -1519,10 +1638,28 @@ 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 is assumed that the list of hook functions contains nothing more
+# It's 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.
@@ -1532,22 +1669,19 @@ func_run_hooks ()
 
     case " $hookable_fns " in
       *" $1 "*) ;;
-      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+      *) func_fatal_error "'$1' does not support hook functions." ;;
     esac
 
     eval _G_hook_fns=\$$1_hooks; shift
 
     for _G_hook in $_G_hook_fns; do
-      eval $_G_hook '"$@"'
-
-      # 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
+      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
+      fi
     done
-
-    func_quote_for_eval ${1+"$@"}
-    func_run_hooks_result=$func_quote_for_eval_result
 }
 
 
@@ -1557,10 +1691,18 @@ func_run_hooks ()
 ## --------------- ##
 
 # In order to add your own option parsing hooks, you must accept the
-# full positional parameter list in your hook function, remove any
-# options that you action, and then pass back the remaining unprocessed
-# options in '<hooked_function_name>_result', escaped suitably for
-# 'eval'.  Like this:
+# 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).
+#
+# Like this:
 #
 #    my_options_prep ()
 #    {
@@ -1570,9 +1712,8 @@ func_run_hooks ()
 #        usage_message=$usage_message'
 #      -s, --silent       don'\''t print informational messages
 #    '
-#
-#        func_quote_for_eval ${1+"$@"}
-#        my_options_prep_result=$func_quote_for_eval_result
+#        # No change in '$@' (ignored completely by this hook).  Leave
+#        # my_options_prep_result variable intact.
 #    }
 #    func_add_hook func_options_prep my_options_prep
 #
@@ -1581,25 +1722,36 @@ func_run_hooks ()
 #    {
 #        $debug_cmd
 #
-#        # Note that for efficiency, we parse as many options as we can
+#        args_changed=false
+#
+#        # 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
 #          opt=$1; shift
 #          case $opt in
-#            --silent|-s) opt_silent=: ;;
+#            --silent|-s) opt_silent=:
+#                         args_changed=:
+#                         ;;
 #            # Separate non-argument short options:
 #            -s*)         func_split_short_opt "$_G_opt"
 #                         set dummy "$func_split_short_opt_name" \
 #                             "-$func_split_short_opt_arg" ${1+"$@"}
 #                         shift
+#                         args_changed=:
 #                         ;;
-#            *)            set dummy "$_G_opt" "$*"; shift; break ;;
+#            *)           # 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'.
+#                         set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
 #          esac
 #        done
 #
-#        func_quote_for_eval ${1+"$@"}
-#        my_silent_option_result=$func_quote_for_eval_result
+#        # 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
+#        fi
 #    }
 #    func_add_hook func_parse_options my_silent_option
 #
@@ -1610,17 +1762,26 @@ func_run_hooks ()
 #
 #        $opt_silent && $opt_verbose && func_fatal_help "\
 #    '--silent' and '--verbose' options are mutually exclusive."
-#
-#        func_quote_for_eval ${1+"$@"}
-#        my_option_validation_result=$func_quote_for_eval_result
 #    }
 #    func_add_hook func_validate_options my_option_validation
 #
-# You'll alse need to manually amend $usage_message to reflect the extra
+# You'll also need to manually amend $usage_message to reflect the extra
 # options you parse.  It's preferable to append if you can, so that
 # multiple option parsing hooks can be added safely.
 
 
+# func_options_finish [ARG]...
+# ----------------------------
+# Finishing the option parse loop (call 'func_options' hooks ATM).
+func_options_finish ()
+{
+    $debug_cmd
+
+    func_run_hooks func_options ${1+"$@"}
+    func_propagate_result func_run_hooks func_options_finish
+}
+
+
 # func_options [ARG]...
 # ---------------------
 # All the functions called inside func_options are hookable. See the
@@ -1630,17 +1791,27 @@ func_options ()
 {
     $debug_cmd
 
-    func_options_prep ${1+"$@"}
-    eval func_parse_options \
-        ${func_options_prep_result+"$func_options_prep_result"}
-    eval func_validate_options \
-        ${func_parse_options_result+"$func_parse_options_result"}
+    _G_options_quoted=false
 
-    eval func_run_hooks func_options \
-        ${func_validate_options_result+"$func_validate_options_result"}
+    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=:
+      fi
+    done
 
-    # save modified positional parameters for caller
-    func_options_result=$func_run_hooks_result
+    $_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
+    }
 }
 
 
@@ -1649,9 +1820,8 @@ func_options ()
 # All initialisations required before starting the option parse loop.
 # Note that when calling hook functions, we pass through the list of
 # positional parameters.  If a hook function modifies that list, and
-# needs to propogate that back to rest of this script, then the complete
-# modified list must be put in 'func_run_hooks_result' before
-# returning.
+# 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.
 func_hookable func_options_prep
 func_options_prep ()
 {
@@ -1662,9 +1832,7 @@ func_options_prep ()
     opt_warning_types=
 
     func_run_hooks func_options_prep ${1+"$@"}
-
-    # save modified positional parameters for caller
-    func_options_prep_result=$func_run_hooks_result
+    func_propagate_result func_run_hooks func_options_prep
 }
 
 
@@ -1676,25 +1844,32 @@ func_parse_options ()
 {
     $debug_cmd
 
-    func_parse_options_result=
-
+    _G_parse_options_requote=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+"$@"}
-
-      # Adjust func_parse_options positional parameters to match
-      eval set dummy "$func_run_hooks_result"; shift
+      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
+      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"
+                      func_echo "enabling shell trace mode" >&2
                       $debug_cmd
                       ;;
 
@@ -1704,7 +1879,10 @@ func_parse_options ()
                      ;;
 
         --warnings|--warning|-W)
-                      test $# = 0 && func_missing_arg $_G_opt && break
+                      if test $# = 0 && func_missing_arg $_G_opt; then
+                        _G_parse_options_requote=:
+                        break
+                      fi
                       case " $warning_categories $1" in
                         *" $1 "*)
                           # trailing space prevents matching last $1 above
@@ -1757,15 +1935,24 @@ func_parse_options ()
                       shift
                       ;;
 
-        --)           break ;;
+        --)           _G_parse_options_requote=: ; break ;;
         -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
-        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+        *)            set dummy "$_G_opt" ${1+"$@"}; shift
+                      _G_match_parse_options=false
+                      break
+                      ;;
       esac
+
+      if $_G_match_parse_options; then
+        _G_parse_options_requote=:
+      fi
     done
 
-    # save modified positional parameters for caller
-    func_quote_for_eval ${1+"$@"}
-    func_parse_options_result=$func_quote_for_eval_result
+    if $_G_parse_options_requote; then
+      # save modified positional parameters for caller
+      func_quote eval ${1+"$@"}
+      func_parse_options_result=$func_quote_result
+    fi
 }
 
 
@@ -1782,12 +1969,10 @@ func_validate_options ()
     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
 
     # Bail if the options were screwed!
     $exit_cmd $EXIT_FAILURE
-
-    # save modified positional parameters for caller
-    func_validate_options_result=$func_run_hooks_result
 }
 
 
@@ -1843,8 +2028,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 \
@@ -1859,8 +2044,9 @@ then
 
       func_split_equals_lhs=${1%%=*}
       func_split_equals_rhs=${1#*=}
-      test "x$func_split_equals_lhs" = "x$1" \
-        && func_split_equals_rhs=
+      if test "x$func_split_equals_lhs" = "x$1"; then
+        func_split_equals_rhs=
+      fi
   }'
 else
   # ...otherwise fall back to using expr, which is often a shell builtin.
@@ -1938,31 +2124,44 @@ 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 '
-        /(C)/!b go
-        :more
-        /\./!{
-          N
-          s|\n# | |
-          b more
-        }
-        :go
-        /^# Written by /,/# warranty; / {
-          s|^# ||
-          s|^# *$||
-          s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
-          p
+        /^# Written by /!b
+        s|^# ||; p; n
+
+        :fwd2blnk
+        /./ {
+          n
+          b fwd2blnk
         }
-        /^# Written by / {
-          s|^# ||
-          p
+        p; n
+
+        :holdwrnt
+        s|^# ||
+        s|^# *$||
+        /^Copyright /!{
+          /./H
+          n
+          b holdwrnt
         }
-        /^warranty; /q' < "$progpath"
+
+        s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+        G
+        s|\(\n\)\n*|\1|g
+        p; q' < "$progpath"
 
     exit $?
 }
@@ -1972,12 +2171,12 @@ func_version ()
 # mode: shell-script
 # sh-indentation: 2
 # eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC"
 # time-stamp-time-zone: "UTC"
 # End:
 
 # Set a version string.
-scriptversion='(GNU libtool) 2.4.6'
+scriptversion='(GNU libtool) 2.4.6.42-b88ce-dirty'
 
 
 # func_echo ARG...
@@ -2068,12 +2267,12 @@ include the following information:
        compiler:       $LTCC
        compiler flags: $LTCFLAGS
        linker:         $LD (gnu? $with_gnu_ld)
-       version:        $progname (GNU libtool) 2.4.6
+       version:        $progname (GNU libtool) 2.4.6.42-b88ce-dirty
        automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
        autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
 
 Report bugs to <bug-libtool@gnu.org>.
-GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+GNU libtool home page: <http://www.gnu.org/s/libtool/>.
 General help using GNU software: <http://www.gnu.org/gethelp/>."
     exit 0
 }
@@ -2270,6 +2469,8 @@ libtool_options_prep ()
     nonopt=
     preserve_args=
 
+    _G_rc_lt_options_prep=:
+
     # Shorthand for --mode=foo, only valid as the first argument
     case $1 in
     clean|clea|cle|cl)
@@ -2293,11 +2494,16 @@ libtool_options_prep ()
     uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
       shift; set dummy --mode uninstall ${1+"$@"}; shift
       ;;
+    *)
+      _G_rc_lt_options_prep=false
+      ;;
     esac
 
-    # Pass back the list of options.
-    func_quote_for_eval ${1+"$@"}
-    libtool_options_prep_result=$func_quote_for_eval_result
+    if $_G_rc_lt_options_prep; then
+      # Pass back the list of options.
+      func_quote eval ${1+"$@"}
+      libtool_options_prep_result=$func_quote_result
+    fi
 }
 func_add_hook func_options_prep libtool_options_prep
 
@@ -2309,9 +2515,12 @@ libtool_parse_options ()
 {
     $debug_cmd
 
+    _G_rc_lt_parse_options=false
+
     # Perform our own loop to consume as many options as possible in
     # each iteration.
     while test $# -gt 0; do
+      _G_match_lt_parse_options=:
       _G_opt=$1
       shift
       case $_G_opt in
@@ -2386,15 +2595,20 @@ libtool_parse_options ()
                         func_append preserve_args " $_G_opt"
                         ;;
 
-       # An option not handled by this hook function:
-        *)             set dummy "$_G_opt" ${1+"$@"};  shift; break  ;;
+        # An option not handled by this hook function:
+        *)              set dummy "$_G_opt" ${1+"$@"} ; shift
+                        _G_match_lt_parse_options=false
+                        break
+                        ;;
       esac
+      $_G_match_lt_parse_options && _G_rc_lt_parse_options=:
     done
 
-
-    # save modified positional parameters for caller
-    func_quote_for_eval ${1+"$@"}
-    libtool_parse_options_result=$func_quote_for_eval_result
+    if $_G_rc_lt_parse_options; then
+      # save modified positional parameters for caller
+      func_quote eval ${1+"$@"}
+      libtool_parse_options_result=$func_quote_result
+    fi
 }
 func_add_hook func_parse_options libtool_parse_options
 
@@ -2451,8 +2665,8 @@ libtool_validate_options ()
     }
 
     # Pass back the unparsed argument list
-    func_quote_for_eval ${1+"$@"}
-    libtool_validate_options_result=$func_quote_for_eval_result
+    func_quote eval ${1+"$@"}
+    libtool_validate_options_result=$func_quote_result
 }
 func_add_hook func_validate_options libtool_validate_options
 
@@ -3418,8 +3632,8 @@ func_mode_compile ()
       esac
     done
 
-    func_quote_for_eval "$libobj"
-    test "X$libobj" != "X$func_quote_for_eval_result" \
+    func_quote_arg pretty "$libobj"
+    test "X$libobj" != "X$func_quote_arg_result" \
       && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'   &()|`$[]' \
       && func_warning "libobj name '$libobj' may not contain shell special characters."
     func_dirname_and_basename "$obj" "/" ""
@@ -3492,8 +3706,8 @@ compiler."
 
     func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
     srcfile=$func_to_tool_file_result
-    func_quote_for_eval "$srcfile"
-    qsrcfile=$func_quote_for_eval_result
+    func_quote_arg pretty "$srcfile"
+    qsrcfile=$func_quote_arg_result
 
     # Only build a PIC object if we are building libtool libraries.
     if test yes = "$build_libtool_libs"; then
@@ -4096,8 +4310,8 @@ func_mode_install ()
        case $nonopt in *shtool*) :;; *) false;; esac
     then
       # Aesthetically quote it.
-      func_quote_for_eval "$nonopt"
-      install_prog="$func_quote_for_eval_result "
+      func_quote_arg pretty "$nonopt"
+      install_prog="$func_quote_arg_result "
       arg=$1
       shift
     else
@@ -4107,8 +4321,8 @@ func_mode_install ()
 
     # The real first argument should be the name of the installation program.
     # Aesthetically quote it.
-    func_quote_for_eval "$arg"
-    func_append install_prog "$func_quote_for_eval_result"
+    func_quote_arg pretty "$arg"
+    func_append install_prog "$func_quote_arg_result"
     install_shared_prog=$install_prog
     case " $install_prog " in
       *[\\\ /]cp\ *) install_cp=: ;;
@@ -4165,12 +4379,12 @@ func_mode_install ()
       esac
 
       # Aesthetically quote the argument.
-      func_quote_for_eval "$arg"
-      func_append install_prog " $func_quote_for_eval_result"
+      func_quote_arg pretty "$arg"
+      func_append install_prog " $func_quote_arg_result"
       if test -n "$arg2"; then
-       func_quote_for_eval "$arg2"
+       func_quote_arg pretty "$arg2"
       fi
-      func_append install_shared_prog " $func_quote_for_eval_result"
+      func_append install_shared_prog " $func_quote_arg_result"
     done
 
     test -z "$install_prog" && \
@@ -4181,8 +4395,8 @@ func_mode_install ()
 
     if test -n "$install_override_mode" && $no_mode; then
       if $install_cp; then :; else
-       func_quote_for_eval "$install_override_mode"
-       func_append install_shared_prog " -m $func_quote_for_eval_result"
+       func_quote_arg pretty "$install_override_mode"
+       func_append install_shared_prog " -m $func_quote_arg_result"
       fi
     fi
 
@@ -4478,8 +4692,8 @@ func_mode_install ()
                relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
 
                $opt_quiet || {
-                 func_quote_for_expand "$relink_command"
-                 eval "func_echo $func_quote_for_expand_result"
+                 func_quote_arg expand,pretty "$relink_command"
+                 eval "func_echo $func_quote_arg_result"
                }
                if eval "$relink_command"; then :
                  else
@@ -5258,7 +5472,8 @@ else
   if test \"\$libtool_execute_magic\" != \"$magic\"; then
     file=\"\$0\""
 
-    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    func_quote_arg pretty "$ECHO"
+    qECHO=$func_quote_arg_result
     $ECHO "\
 
 # A function that is used when there is no print builtin or printf.
@@ -5268,7 +5483,7 @@ func_fallback_echo ()
 \$1
 _LTECHO_EOF'
 }
-    ECHO=\"$qECHO\"
+    ECHO=$qECHO
   fi
 
 # Very basic option parsing. These options are (a) specific to
@@ -6611,9 +6826,9 @@ func_mode_link ()
     while test "$#" -gt 0; do
       arg=$1
       shift
-      func_quote_for_eval "$arg"
-      qarg=$func_quote_for_eval_unquoted_result
-      func_append libtool_args " $func_quote_for_eval_result"
+      func_quote_arg pretty,unquoted "$arg"
+      qarg=$func_quote_arg_unquoted_result
+      func_append libtool_args " $func_quote_arg_result"
 
       # If the previous option needs an argument, assign it.
       if test -n "$prev"; then
@@ -7211,9 +7426,9 @@ func_mode_link ()
        save_ifs=$IFS; IFS=,
        for flag in $args; do
          IFS=$save_ifs
-          func_quote_for_eval "$flag"
-         func_append arg " $func_quote_for_eval_result"
-         func_append compiler_flags " $func_quote_for_eval_result"
+          func_quote_arg pretty "$flag"
+         func_append arg " $func_quote_arg_result"
+         func_append compiler_flags " $func_quote_arg_result"
        done
        IFS=$save_ifs
        func_stripname ' ' '' "$arg"
@@ -7227,10 +7442,10 @@ func_mode_link ()
        save_ifs=$IFS; IFS=,
        for flag in $args; do
          IFS=$save_ifs
-          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"
+          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"
        done
        IFS=$save_ifs
        func_stripname ' ' '' "$arg"
@@ -7254,8 +7469,8 @@ func_mode_link ()
 
       # -msg_* for osf cc
       -msg_*)
-       func_quote_for_eval "$arg"
-       arg=$func_quote_for_eval_result
+       func_quote_arg pretty "$arg"
+       arg=$func_quote_arg_result
        ;;
 
       # Flags to be passed through unchanged, with rationale:
@@ -7274,12 +7489,14 @@ func_mode_link ()
       # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
       # -specs=*             GCC specs files
       # -stdlib=*            select c++ std lib with clang
+      # -fsanitize=*         Clang/GCC memory and address sanitizer
+      # -fuse-ld=*           Linker select flags for GCC
       -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=*)
-        func_quote_for_eval "$arg"
-       arg=$func_quote_for_eval_result
+      -specs=*|-fsanitize=*|-fuse-ld=*)
+        func_quote_arg pretty "$arg"
+       arg=$func_quote_arg_result
         func_append compile_command " $arg"
         func_append finalize_command " $arg"
         func_append compiler_flags " $arg"
@@ -7300,15 +7517,15 @@ func_mode_link ()
          continue
         else
          # Otherwise treat like 'Some other compiler flag' below
-         func_quote_for_eval "$arg"
-         arg=$func_quote_for_eval_result
+         func_quote_arg pretty "$arg"
+         arg=$func_quote_arg_result
         fi
        ;;
 
       # Some other compiler flag.
       -* | +*)
-        func_quote_for_eval "$arg"
-       arg=$func_quote_for_eval_result
+        func_quote_arg pretty "$arg"
+       arg=$func_quote_arg_result
        ;;
 
       *.$objext)
@@ -7428,8 +7645,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_for_eval "$arg"
-       arg=$func_quote_for_eval_result
+       func_quote_arg pretty "$arg"
+       arg=$func_quote_arg_result
        ;;
       esac # arg
 
@@ -9935,8 +10152,8 @@ EOF
            for cmd in $concat_cmds; do
              IFS=$save_ifs
              $opt_quiet || {
-                 func_quote_for_expand "$cmd"
-                 eval "func_echo $func_quote_for_expand_result"
+                 func_quote_arg expand,pretty "$cmd"
+                 eval "func_echo $func_quote_arg_result"
              }
              $opt_dry_run || eval "$cmd" || {
                lt_exit=$?
@@ -10029,8 +10246,8 @@ EOF
          eval cmd=\"$cmd\"
          IFS=$save_ifs
          $opt_quiet || {
-           func_quote_for_expand "$cmd"
-           eval "func_echo $func_quote_for_expand_result"
+           func_quote_arg expand,pretty "$cmd"
+           eval "func_echo $func_quote_arg_result"
          }
          $opt_dry_run || eval "$cmd" || {
            lt_exit=$?
@@ -10504,12 +10721,13 @@ EOF
          elif eval var_value=\$$var; test -z "$var_value"; then
            relink_command="$var=; export $var; $relink_command"
          else
-           func_quote_for_eval "$var_value"
-           relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+           func_quote_arg pretty "$var_value"
+           relink_command="$var=$func_quote_arg_result; export $var; $relink_command"
          fi
        done
-       relink_command="(cd `pwd`; $relink_command)"
-       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+       func_quote eval cd "`pwd`"
+       func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)"
+       relink_command=$func_quote_arg_unquoted_result
       fi
 
       # Only actually do things if not in dry run mode.
@@ -10749,13 +10967,15 @@ EOF
        elif eval var_value=\$$var; test -z "$var_value"; then
          relink_command="$var=; export $var; $relink_command"
        else
-         func_quote_for_eval "$var_value"
-         relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+         func_quote_arg pretty,unquoted "$var_value"
+         relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command"
        fi
       done
       # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      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
       if test yes = "$hardcode_automatic"; then
        relink_command=
       fi
index 5032bba..8b6df5a 100644 (file)
@@ -422,7 +422,7 @@ namespace cxx11
 
   }
 
-  // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+  // https://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
   // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
   // because of this.
   namespace test_template_alias_sfinae
index a644432..2b73e38 100644 (file)
@@ -1,6 +1,6 @@
 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 #
-#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
+#   Copyright (C) 1996-2001, 2003-2018 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,
-# which needs '.lib').
+# All known linkers require a '.a' archive for static linking (except MSVC and
+# ICC, which need '.lib').
 libext=a
 
 with_gnu_ld=$lt_cv_prog_gnu_ld
@@ -728,7 +728,6 @@ _LT_CONFIG_SAVE_COMMANDS([
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
 # Generated automatically by $as_me ($PACKAGE) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
 
 # Provide generalized library-building support services.
@@ -1042,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 cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
-      $AR cru libconftest.a conftest.o 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 "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
       $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
       cat > conftest.c << _LT_EOF
@@ -1493,9 +1492,22 @@ need_locks=$enable_libtool_lock
 m4_defun([_LT_PROG_AR],
 [AC_CHECK_TOOLS(AR, [ar], false)
 : ${AR=ar}
-: ${AR_FLAGS=cru}
 _LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+# 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])
 
 AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
   [lt_cv_ar_at_file=no
@@ -2207,26 +2219,35 @@ m4_defun([_LT_CMD_STRIPLIB],
 striplib=
 old_striplib=
 AC_MSG_CHECKING([whether stripping libraries is possible])
-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])
+if test -z "$STRIP"; then
+  AC_MSG_RESULT([no])
 else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP"; then
+  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
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       AC_MSG_RESULT([yes])
-    else
+      ;;
+    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
+      ;;
+    *)
       AC_MSG_RESULT([no])
-    fi
-    ;;
-  *)
-    AC_MSG_RESULT([no])
-    ;;
-  esac
+      ;;
+    esac
+  fi
 fi
 _LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
 _LT_DECL([], [striplib], [1])
@@ -2565,8 +2586,8 @@ m4_if([$1], [],[
     dynamic_linker='Win32 ld.exe'
     ;;
 
-  *,cl*)
-    # Native MSVC
+  *,cl* | *,icl*)
+    # Native MSVC or ICC
     libname_spec='$name'
     soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
     library_names_spec='$libname.dll.lib'
@@ -2622,7 +2643,7 @@ m4_if([$1], [],[
     ;;
 
   *)
-    # Assume MSVC wrapper
+    # Assume MSVC and ICC wrapper
     library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
@@ -2867,9 +2888,6 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Add ABI-specific directories to the system library path.
-  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
   # Ideally, we could use ldconfig to report *all* directores which are
   # searched for libraries, however this is still not possible.  Aside from not
   # being certain /sbin/ldconfig is available, command
@@ -2878,7 +2896,7 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[  ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
   fi
 
   # We used to test for /lib/ld.so.1 and disable shared libraries on
@@ -4013,7 +4031,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++,
+    # Also find C++ and __fastcall symbols from MSVC++ or ICC,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK ['"\
 "     {last_section=section; section=\$ 3};"\
@@ -4922,7 +4940,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 == "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 == "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'
     fi
     ;;
   pw32*)
@@ -4930,7 +4948,7 @@ m4_if([$1], [CXX], [
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
-    cl*)
+    cl* | icl*)
       _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
       ;;
     *)
@@ -4987,15 +5005,15 @@ dnl Note also adjust exclude_expsyms for C++ above.
 
   case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
+    # Microsoft Visual C++ or Intel C++ Compiler.
     if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
   interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
     with_gnu_ld=yes
     ;;
   openbsd* | bitrig*)
@@ -5159,6 +5177,7 @@ _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]]*)
@@ -5376,7 +5395,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 == "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 == "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'
        fi
        aix_use_runtimelinking=no
 
@@ -5559,12 +5578,12 @@ _LT_EOF
 
     cygwin* | mingw* | pw32* | cegcc*)
       # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
+      # Microsoft Visual C++ or Intel C++ Compiler.
       # hardcode_libdir_flag_spec is actually meaningless, as there is
       # no search path for DLLs.
       case $cc_basename in
-      cl*)
-       # Native MSVC
+      cl* | icl*)
+       # Native MSVC or ICC
        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
        _LT_TAGVAR(always_export_symbols, $1)=yes
@@ -5605,7 +5624,7 @@ _LT_EOF
           fi'
        ;;
       *)
-       # Assume MSVC wrapper
+       # Assume MSVC and ICC wrapper
        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
        # Tell ltmain to make .lib files, not .a files.
@@ -5864,6 +5883,7 @@ _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*)
@@ -6634,8 +6654,8 @@ if test yes != "$_lt_caught_CXX_error"; then
 
       cygwin* | mingw* | pw32* | cegcc*)
        case $GXX,$cc_basename in
-       ,cl* | no,cl*)
-         # Native MSVC
+       ,cl* | no,cl* | ,icl* | no,icl*)
+         # Native MSVC or ICC
          # hardcode_libdir_flag_spec is actually meaningless, as there is
          # no search path for DLLs.
          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
@@ -6733,6 +6753,7 @@ 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*)
index 94b0829..07421d9 100644 (file)
@@ -1,6 +1,6 @@
 # Helper functions for option handling.                    -*- Autoconf -*-
 #
-#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2018 Free Software
 #   Foundation, Inc.
 #   Written by Gary V. Vaughan, 2004
 #
index 48bc934..3985c56 100644 (file)
@@ -1,6 +1,6 @@
 # ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
 #
-# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Copyright (C) 2004-2005, 2007-2008, 2011-2018 Free Software
 # Foundation, Inc.
 # Written by Gary V. Vaughan, 2004
 #
index fa04b52..7f9a3ad 100644 (file)
@@ -1,6 +1,6 @@
 # ltversion.m4 -- version numbers                      -*- Autoconf -*-
 #
-#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
+#   Copyright (C) 2004, 2011-2018 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 4179 ltversion.m4
+# serial 4221 ltversion.m4
 # This file is part of GNU Libtool
 
-m4_define([LT_PACKAGE_VERSION], [2.4.6])
-m4_define([LT_PACKAGE_REVISION], [2.4.6])
+m4_define([LT_PACKAGE_VERSION], [2.4.6.42-b88ce-dirty])
+m4_define([LT_PACKAGE_REVISION], [2.4.6.42])
 
 AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.6'
-macro_revision='2.4.6'
+[macro_version='2.4.6.42-b88ce-dirty'
+macro_revision='2.4.6.42'
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
index c6b26f8..54ea1c4 100644 (file)
@@ -1,6 +1,6 @@
 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
 #
-#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2018 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
new file mode 100644 (file)
index 0000000..a5c8040
--- /dev/null
@@ -0,0 +1,6 @@
+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
new file mode 100644 (file)
index 0000000..fae0acd
--- /dev/null
@@ -0,0 +1,8 @@
+#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; }
diff --git a/meson.build b/meson.build
new file mode 100644 (file)
index 0000000..65d3192
--- /dev/null
@@ -0,0 +1,377 @@
+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')
+
+hb_version_arr = meson.project_version().split('.')
+hb_version_major = hb_version_arr[0].to_int()
+hb_version_minor = hb_version_arr[1].to_int()
+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)
+
+pkgmod = import('pkgconfig')
+cpp = meson.get_compiler('cpp')
+
+if cpp.get_id() == 'msvc'
+  # Ignore several spurious warnings for things HarfBuzz does very commonly.
+  # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it
+  # 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
+  ]
+  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']
+endif
+
+add_project_arguments(cpp.get_supported_arguments([
+  '-fno-rtti',
+  '-fno-exceptions',
+  '-fno-threadsafe-statics',
+  '-fvisibility-inlines-hidden', # maybe shouldn't be applied for mingw
+]), 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')
+  endif
+endif
+
+check_headers = [
+  ['unistd.h'],
+  ['sys/mman.h'],
+  ['stdbool.h'],
+]
+
+check_funcs = [
+  ['atexit'],
+  ['mprotect'],
+  ['sysconf'],
+  ['getpagesize'],
+  ['mmap'],
+  ['isatty'],
+  ['roundf'],
+]
+
+freetype_dep = dependency('freetype2', required: false)
+
+if not freetype_dep.found() and cpp.get_id() == 'msvc'
+  if 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')
+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')
+    if get_option('buildtype') == 'debug'
+      icu_dep = cpp.find_library('icuucd', required: get_option('icu'))
+    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')
+    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')
+  endif
+endif
+
+if not cairo_dep.found() and get_option('cairo').enabled()
+  cairo_dep = dependency('cairo', fallback: ['cairo', 'libcairo_dep'])
+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_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)
+endif
+
+deps = []
+
+conf = configuration_data()
+incconfig = include_directories('.')
+
+add_project_arguments('-DHAVE_CONFIG_H', language: ['c', 'cpp'])
+
+warn_cflags = [
+  '-Wno-non-virtual-dtor',
+]
+
+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()
+  conf.set('HAVE_GRAPHITE2', 1)
+  deps += [graphite2_dep]
+endif
+
+if icu_dep.found()
+  conf.set('HAVE_ICU', 1)
+endif
+
+if get_option('icu_builtin')
+  conf.set('HAVE_ICU_BUILTIN', 1)
+endif
+
+if get_option('experimental_api')
+  conf.set('HB_EXPERIMENTAL_API', 1)
+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}],
+    ['FT_Done_MM_Var', {'deps': freetype_dep}],
+  ]
+
+  if freetype_dep.type_name() == 'internal'
+    foreach func: check_freetype_funcs
+      name = func[0]
+      conf.set('HAVE_@0@'.format(name.to_upper()), 1)
+    endforeach
+  else
+    check_funcs += check_freetype_funcs
+  endif
+endif
+
+if fontconfig_dep.found()
+  conf.set('HAVE_FONTCONFIG', 1)
+  deps += [fontconfig_dep]
+endif
+
+# 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
+    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)
+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()
+    error('DirectWrite was enabled explicitly, but required header is missing.')
+  endif
+endif
+
+# CoreText (macOS) - FIXME: untested
+if host_machine.system() == 'darwin' and not get_option('coretext').disabled()
+  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]
+    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)
+    if cpp.has_type('CTRunRef', prefix: '#include <CoreText/CoreText.h>', dependencies: [coretext_dep, coregraphics_dep, corefoundation_dep])
+      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.')
+    endif
+  endif
+endif
+
+# threads
+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())
+
+foreach check : check_headers
+  name = check[0]
+
+  if cpp.has_header(name)
+    conf.set('HAVE_@0@'.format(name.to_upper().underscorify()), 1)
+  endif
+endforeach
+
+foreach check : check_funcs
+  name = check[0]
+  opts = check.get(1, {})
+  link_withs = opts.get('link_with', [])
+  check_deps = opts.get('deps', [])
+  extra_deps = []
+  found = true
+
+  # First try without linking
+
+  found = cpp.has_function(name, dependencies: check_deps)
+
+  if not found and link_withs.length() > 0
+    found = true
+
+    foreach link_with : link_withs
+      dep = cpp.find_library(link_with, required: false)
+      if dep.found()
+        extra_deps += dep
+      else
+        found = false
+      endif
+    endforeach
+
+    if found
+      found = cpp.has_function(name, dependencies: check_deps + extra_deps)
+    endif
+  endif
+
+  if found
+    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')
+
+if not get_option('tests').disabled()
+  subdir('test')
+endif
+
+if not get_option('gtk_doc').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')
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644 (file)
index 0000000..cbd5c50
--- /dev/null
@@ -0,0 +1,38 @@
+# HarfBuzz feature options
+option('glib', type: 'feature', value: 'auto',
+  description: 'Enable GLib unicode functions')
+option('gobject', type: 'feature', value: 'disabled',
+  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('icu', type: 'feature', value: 'auto',
+  description: 'Enable ICU library unicode functions')
+option('graphite', type: 'feature', value: 'disabled',
+  description: 'Enable Graphite2 complementary shaper')
+option('freetype', type: 'feature', value: 'auto',
+  description: 'Enable freetype interop helpers')
+option('gdi', type: 'feature', value: 'disabled',
+  description: 'Enable GDI helpers and Uniscribe shaper backend (Windows only)')
+option('directwrite', type: 'feature', value: 'disabled',
+  description: 'Enable DirectWrite shaper backend on Windows (experimental)')
+option('coretext', type: 'feature', value: 'disabled',
+  description: 'Enable CoreText shaper backend on macOS')
+
+# Common feature options
+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('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')
diff --git a/mingw-configure.sh b/mingw-configure.sh
deleted file mode 100755 (executable)
index 3281ce3..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/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/mingw-ldd.py b/mingw-ldd.py
deleted file mode 100755 (executable)
index 1d659ef..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env python
-
-# Copied from https://github.com/xantares/mingw-ldd/blob/master/mingw-ldd.py
-# Modified to point to right prefix location on Fedora.
-
-# WTFPL - Do What the Fuck You Want to Public License
-from __future__ import print_function
-import pefile
-import os
-import sys
-
-
-def get_dependency(filename):
-    deps = []
-    pe = pefile.PE(filename)
-    for imp in pe.DIRECTORY_ENTRY_IMPORT:
-        deps.append(imp.dll.decode())
-    return deps
-
-
-def dep_tree(root, prefix=None):
-    if not prefix:
-        arch = get_arch(root)
-        #print('Arch =', arch)
-        prefix = '/usr/'+arch+'-w64-mingw32/sys-root/mingw/bin'
-        #print('Using default prefix', prefix)
-    dep_dlls = dict()
-
-    def dep_tree_impl(root, prefix):
-        for dll in get_dependency(root):
-            if dll in dep_dlls:
-                continue
-            full_path = os.path.join(prefix, dll)
-            if os.path.exists(full_path):
-                dep_dlls[dll] = full_path
-                dep_tree_impl(full_path, prefix=prefix)
-            else:
-                dep_dlls[dll] = 'not found'
-
-    dep_tree_impl(root, prefix)
-    return (dep_dlls)
-
-
-def get_arch(filename):
-    type2arch= {pefile.OPTIONAL_HEADER_MAGIC_PE: 'i686',
-                pefile.OPTIONAL_HEADER_MAGIC_PE_PLUS: 'x86_64'}
-    pe = pefile.PE(filename)
-    try:
-        return type2arch[pe.PE_TYPE]
-    except KeyError:
-        sys.stderr.write('Error: unknown architecture')
-        sys.exit(1)
-
-if __name__ == '__main__':
-    filename = sys.argv[1]
-    for dll, full_path in dep_tree(filename).items():
-        print(' ' * 7, dll, '=>', full_path)
-
diff --git a/mingw32.sh b/mingw32.sh
deleted file mode 100755 (executable)
index 77edffa..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-exec "$(dirname "$0")"/mingw-configure.sh i686 "$@"
diff --git a/mingw64.sh b/mingw64.sh
deleted file mode 100755 (executable)
index 28724a4..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-exec "$(dirname "$0")"/mingw-configure.sh x86_64 "$@"
diff --git a/missing b/missing
index 625aeb1..8d0eaad 100755 (executable)
--- a/missing
+++ b/missing
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 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
index a76d968..633e993 100644 (file)
@@ -13,6 +13,8 @@ TESTS =
 check_PROGRAMS =
 
 EXTRA_DIST += harfbuzz.cc
+EXTRA_DIST += meson.build
+EXTRA_DIST += fix_get_types.py
 
 # Convenience targets:
 lib: $(BUILT_SOURCES) libharfbuzz.la
@@ -50,12 +52,7 @@ endif
 if HAVE_FREETYPE
 HBCFLAGS += $(FREETYPE_CFLAGS)
 HBLIBS   += $(FREETYPE_LIBS)
-# XXX
-# The following creates a recursive dependency on FreeType if FreeType is
-# built with HarfBuzz support enabled.  Newer pkg-config handles that just
-# fine but pkg-config 0.26 as shipped in Ubuntu 14.04 crashes.  Remove
-# in a year or two, or otherwise work around it...
-#HBDEPS   += $(FREETYPE_DEPS)
+HBDEPS   += $(FREETYPE_DEPS)
 HBSOURCES += $(HB_FT_sources)
 HBHEADERS += $(HB_FT_headers)
 endif
@@ -101,12 +98,7 @@ BUILT_SOURCES += \
        hb-version.h
 
 $(srcdir)/hb-version.h: hb-version.h.in $(top_srcdir)/configure.ac
-       $(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)
+       $(AM_V_GEN) $(srcdir)/gen-hb-version.py $(HB_VERSION) hb-version.h.in hb-version.h
 
 # Put the library together
 
@@ -153,6 +145,7 @@ cmake_DATA = harfbuzz-config.cmake
 EXTRA_DIST += hb-version.h.in harfbuzz.pc.in harfbuzz-config.cmake.in
 
 lib_LTLIBRARIES += libharfbuzz-subset.la
+libharfbuzz_subset_la_LINK = $(chosen_linker) $(libharfbuzz_subset_la_LDFLAGS)
 libharfbuzz_subset_la_SOURCES = $(HB_SUBSET_sources)
 libharfbuzz_subset_la_CPPFLAGS = $(HBCFLAGS) $(CODE_COVERAGE_CFLAGS)
 libharfbuzz_subset_la_LDFLAGS = $(base_link_flags) $(export_symbols_subset) $(CODE_COVERAGE_LDFLAGS)
@@ -253,8 +246,11 @@ GENERATORS = \
        gen-arabic-table.py \
        gen-def.py \
        gen-emoji-table.py \
+       gen-harfbuzzcc.py \
+       gen-hb-version.py \
        gen-indic-table.py \
        gen-os2-unicode-ranges.py \
+       gen-ragel-artifacts.py \
        gen-tag-table.py \
        gen-ucd-table.py \
        gen-use-table.py \
@@ -262,42 +258,9 @@ GENERATORS = \
        $(NULL)
 EXTRA_DIST += $(GENERATORS)
 
-unicode-tables: \
-       arabic-table \
-       emoji-table \
-       indic-table \
-       tag-table \
-       ucd-table \
-       use-table \
-       emoji-table \
-       $(NULL)
-
-arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-arabic-table.hh \
-       || ($(RM) $(srcdir)/hb-ot-shape-complex-arabic-table.hh; false)
-emoji-table: gen-emoji-table.py emoji-data.txt
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \
-       || ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false)
-indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-indic-table.cc \
-       || ($(RM) $(srcdir)/hb-ot-shape-complex-indic-table.cc; false)
-tag-table: gen-tag-table.py languagetags language-subtag-registry
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-tag-table.hh \
-       || ($(RM) $(srcdir)/hb-ot-tag-table.hh; false)
-ucd-table: gen-ucd-table.py ucd.nounihan.grouped.zip hb-common.h
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ucd-table.hh \
-       || ($(RM) $(srcdir)/hb-ucd-table.hh; false)
-use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \
-       || ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false)
-vowel-constraints: gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc \
-       || ($(RM) $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc; false)
-
-
 built-sources: $(BUILT_SOURCES)
 
-.PHONY: unicode-tables arabic-table indic-table tag-table use-table vowel-constraints emoji-table built-sources
+.PHONY: built-sources
 
 RAGEL_GENERATED = \
        $(patsubst %,$(srcdir)/%,$(HB_BASE_RAGEL_GENERATED_sources)) \
@@ -314,7 +277,8 @@ $(srcdir)/%.hh: $(srcdir)/%.rl
 
 harfbuzz.cc: Makefile.sources
        $(AM_V_GEN) \
-       for f in \
+       $(srcdir)/gen-harfbuzzcc.py \
+               $(srcdir)/harfbuzz.cc \
                $(HB_BASE_sources) \
                $(HB_GLIB_sources) \
                $(HB_FT_sources) \
@@ -322,10 +286,7 @@ harfbuzz.cc: Makefile.sources
                $(HB_UNISCRIBE_sources) \
                $(HB_GDI_sources) \
                $(HB_DIRECTWRITE_sources) \
-               $(HB_CORETEXT_sources) \
-               ; do echo '#include "'$$f'"'; done | \
-       grep '[.]cc"' > $(srcdir)/harfbuzz.cc \
-       || ($(RM) $(srcdir)/harfbuzz.cc; false)
+               $(HB_CORETEXT_sources)
 BUILT_SOURCES += harfbuzz.cc
 
 noinst_PROGRAMS = \
@@ -334,6 +295,7 @@ noinst_PROGRAMS = \
        test-buffer-serialize \
        test-ot-meta \
        test-ot-name \
+       test-ot-glyphname \
        test-gpos-size-params \
        test-gsub-would-substitute \
        $(NULL)
@@ -359,6 +321,10 @@ test_ot_name_SOURCES = test-ot-name.cc
 test_ot_name_CPPFLAGS = $(HBCFLAGS)
 test_ot_name_LDADD = libharfbuzz.la $(HBLIBS)
 
+test_ot_glyphname_SOURCES = test-ot-glyphname.cc
+test_ot_glyphname_CPPFLAGS = $(HBCFLAGS)
+test_ot_glyphname_LDADD = libharfbuzz.la $(HBLIBS)
+
 test_gpos_size_params_SOURCES = test-gpos-size-params.cc
 test_gpos_size_params_CPPFLAGS = $(HBCFLAGS)
 test_gpos_size_params_LDADD = libharfbuzz.la $(HBLIBS)
@@ -367,31 +333,6 @@ 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)
 
-if HAVE_FREETYPE
-if HAVE_CAIRO_FT
-noinst_PROGRAMS += test-ot-color
-test_ot_color_SOURCES = test-ot-color.cc
-test_ot_color_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) $(CAIRO_FT_CFLAGS)
-test_ot_color_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) $(CAIRO_LIBS) $(CAIRO_FT_LIBS)
-endif # HAVE_CAIRO_FT
-endif # HAVE_FREETYPE
-
-dist_check_SCRIPTS = \
-       check-c-linkage-decls.sh \
-       check-externs.sh \
-       check-header-guards.sh \
-       check-includes.sh \
-       check-static-inits.sh \
-       check-symbols.sh \
-       $(NULL)
-TESTS += $(dist_check_SCRIPTS)
-
-if !WITH_LIBSTDCXX
-dist_check_SCRIPTS += \
-       check-libstdc++.sh \
-       $(NULL)
-endif
-
 check_PROGRAMS += \
        dump-indic-data \
        dump-khmer-data \
@@ -411,7 +352,7 @@ 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-iter test-meta test-number test-ot-tag test-unicode-ranges test-bimap
+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)
@@ -421,6 +362,10 @@ test_algs_SOURCES = test-algs.cc hb-static.cc
 test_algs_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_algs_LDADD = $(COMPILED_TESTS_LDADD)
 
+test_array_SOURCES = test-array.cc
+test_array_CPPFLAGS = $(HBCFLAGS)
+test_array_LDADD = libharfbuzz.la $(HBLIBS)
+
 test_iter_SOURCES = test-iter.cc hb-static.cc
 test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_iter_LDADD = $(COMPILED_TESTS_LDADD)
@@ -445,8 +390,25 @@ test_bimap_SOURCES = test-bimap.cc hb-static.cc
 test_bimap_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_bimap_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)
+TESTS += $(dist_check_SCRIPTS)
+
+if !WITH_LIBSTDCXX
+dist_check_SCRIPTS += \
+       check-libstdc++.py \
+       $(NULL)
+endif
+
 TESTS_ENVIRONMENT = \
        srcdir="$(srcdir)" \
+       builddir="$(builddir)" \
        MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
        HBSOURCES="$(HBSOURCES)" \
        HBHEADERS="$(HBHEADERS)" \
@@ -456,7 +418,16 @@ if HAVE_INTROSPECTION
 
 -include $(INTROSPECTION_MAKEFILE)
 INTROSPECTION_GIRS = HarfBuzz-0.0.gir # What does the 0 mean anyway?!
-INTROSPECTION_SCANNER_ARGS = -I$(srcdir) -n hb --identifier-prefix=hb_ --warn-all
+INTROSPECTION_SCANNER_ARGS = \
+       -I$(srcdir) \
+       --warn-all --verbose \
+       --namespace=HarfBuzz \
+       --nsversion=0.0 \
+       --symbol-prefix=hb \
+       --symbol-prefix=hb_gobject \
+       --identifier-prefix=hb_ \
+       --pkg-export=harfbuzz-gobject \
+       --c-include=hb-gobject.h
 INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
 INTROSPECTION_SCANNER_ENV = CC="$(CC)"
 
index 1e83d38..0399213 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -95,7 +95,7 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-TESTS = $(am__EXEEXT_5) $(am__EXEEXT_2)
+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)
@@ -108,66 +108,60 @@ check_PROGRAMS = dump-indic-data$(EXEEXT) dump-khmer-data$(EXEEXT) \
 @HAVE_GLIB_TRUE@am__append_7 = $(HB_GLIB_headers)
 @HAVE_FREETYPE_TRUE@am__append_8 = $(FREETYPE_CFLAGS)
 @HAVE_FREETYPE_TRUE@am__append_9 = $(FREETYPE_LIBS)
-# XXX
-# The following creates a recursive dependency on FreeType if FreeType is
-# built with HarfBuzz support enabled.  Newer pkg-config handles that just
-# fine but pkg-config 0.26 as shipped in Ubuntu 14.04 crashes.  Remove
-# in a year or two, or otherwise work around it...
-#HBDEPS   += $(FREETYPE_DEPS)
-@HAVE_FREETYPE_TRUE@am__append_10 = $(HB_FT_sources)
-@HAVE_FREETYPE_TRUE@am__append_11 = $(HB_FT_headers)
-@HAVE_GRAPHITE2_TRUE@am__append_12 = $(GRAPHITE2_CFLAGS)
-@HAVE_GRAPHITE2_TRUE@am__append_13 = $(GRAPHITE2_LIBS)
-@HAVE_GRAPHITE2_TRUE@am__append_14 = $(GRAPHITE2_DEPS)
-@HAVE_GRAPHITE2_TRUE@am__append_15 = $(HB_GRAPHITE2_sources)
-@HAVE_GRAPHITE2_TRUE@am__append_16 = $(HB_GRAPHITE2_headers)
-@HAVE_UNISCRIBE_TRUE@am__append_17 = $(UNISCRIBE_CFLAGS)
-@HAVE_UNISCRIBE_TRUE@am__append_18 = $(UNISCRIBE_LIBS)
-@HAVE_UNISCRIBE_TRUE@am__append_19 = $(HB_UNISCRIBE_sources)
-@HAVE_UNISCRIBE_TRUE@am__append_20 = $(HB_UNISCRIBE_headers)
-@HAVE_DIRECTWRITE_TRUE@am__append_21 = $(DIRECTWRITE_CXXFLAGS)
-@HAVE_DIRECTWRITE_TRUE@am__append_22 = $(DIRECTWRITE_LIBS)
-@HAVE_DIRECTWRITE_TRUE@am__append_23 = $(HB_DIRECTWRITE_sources)
-@HAVE_DIRECTWRITE_TRUE@am__append_24 = $(HB_DIRECTWRITE_headers)
-@HAVE_GDI_TRUE@am__append_25 = $(GDI_CXXFLAGS)
-@HAVE_GDI_TRUE@am__append_26 = $(GDI_LIBS)
-@HAVE_GDI_TRUE@am__append_27 = $(HB_GDI_sources)
-@HAVE_GDI_TRUE@am__append_28 = $(HB_GDI_headers)
-@HAVE_CORETEXT_TRUE@am__append_29 = $(CORETEXT_CFLAGS)
-@HAVE_CORETEXT_TRUE@am__append_30 = $(CORETEXT_LIBS)
-@HAVE_CORETEXT_TRUE@am__append_31 = $(HB_CORETEXT_sources)
-@HAVE_CORETEXT_TRUE@am__append_32 = $(HB_CORETEXT_headers)
-@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_33 = $(ICU_CFLAGS)
-@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_34 = $(ICU_LIBS)
-@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_35 = $(HB_ICU_sources)
-@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_36 = $(HB_ICU_headers)
-@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_37 = libharfbuzz-icu.la
-@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_38 = $(HB_ICU_headers)
-@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_39 = harfbuzz-icu.pc
-@HAVE_GOBJECT_TRUE@am__append_40 = libharfbuzz-gobject.la
-@HAVE_GOBJECT_TRUE@am__append_41 = $(HB_GOBJECT_DIST_headers)
-@HAVE_GOBJECT_TRUE@am__append_42 = $(HB_GOBJECT_NODIST_headers)
-@HAVE_GOBJECT_TRUE@am__append_43 = harfbuzz-gobject.pc
-@HAVE_GOBJECT_TRUE@am__append_44 = \
+@HAVE_FREETYPE_TRUE@am__append_10 = $(FREETYPE_DEPS)
+@HAVE_FREETYPE_TRUE@am__append_11 = $(HB_FT_sources)
+@HAVE_FREETYPE_TRUE@am__append_12 = $(HB_FT_headers)
+@HAVE_GRAPHITE2_TRUE@am__append_13 = $(GRAPHITE2_CFLAGS)
+@HAVE_GRAPHITE2_TRUE@am__append_14 = $(GRAPHITE2_LIBS)
+@HAVE_GRAPHITE2_TRUE@am__append_15 = $(GRAPHITE2_DEPS)
+@HAVE_GRAPHITE2_TRUE@am__append_16 = $(HB_GRAPHITE2_sources)
+@HAVE_GRAPHITE2_TRUE@am__append_17 = $(HB_GRAPHITE2_headers)
+@HAVE_UNISCRIBE_TRUE@am__append_18 = $(UNISCRIBE_CFLAGS)
+@HAVE_UNISCRIBE_TRUE@am__append_19 = $(UNISCRIBE_LIBS)
+@HAVE_UNISCRIBE_TRUE@am__append_20 = $(HB_UNISCRIBE_sources)
+@HAVE_UNISCRIBE_TRUE@am__append_21 = $(HB_UNISCRIBE_headers)
+@HAVE_DIRECTWRITE_TRUE@am__append_22 = $(DIRECTWRITE_CXXFLAGS)
+@HAVE_DIRECTWRITE_TRUE@am__append_23 = $(DIRECTWRITE_LIBS)
+@HAVE_DIRECTWRITE_TRUE@am__append_24 = $(HB_DIRECTWRITE_sources)
+@HAVE_DIRECTWRITE_TRUE@am__append_25 = $(HB_DIRECTWRITE_headers)
+@HAVE_GDI_TRUE@am__append_26 = $(GDI_CXXFLAGS)
+@HAVE_GDI_TRUE@am__append_27 = $(GDI_LIBS)
+@HAVE_GDI_TRUE@am__append_28 = $(HB_GDI_sources)
+@HAVE_GDI_TRUE@am__append_29 = $(HB_GDI_headers)
+@HAVE_CORETEXT_TRUE@am__append_30 = $(CORETEXT_CFLAGS)
+@HAVE_CORETEXT_TRUE@am__append_31 = $(CORETEXT_LIBS)
+@HAVE_CORETEXT_TRUE@am__append_32 = $(HB_CORETEXT_sources)
+@HAVE_CORETEXT_TRUE@am__append_33 = $(HB_CORETEXT_headers)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_34 = $(ICU_CFLAGS)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_35 = $(ICU_LIBS)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_36 = $(HB_ICU_sources)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_37 = $(HB_ICU_headers)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_38 = libharfbuzz-icu.la
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_39 = $(HB_ICU_headers)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_40 = harfbuzz-icu.pc
+@HAVE_GOBJECT_TRUE@am__append_41 = libharfbuzz-gobject.la
+@HAVE_GOBJECT_TRUE@am__append_42 = $(HB_GOBJECT_DIST_headers)
+@HAVE_GOBJECT_TRUE@am__append_43 = $(HB_GOBJECT_NODIST_headers)
+@HAVE_GOBJECT_TRUE@am__append_44 = harfbuzz-gobject.pc
+@HAVE_GOBJECT_TRUE@am__append_45 = \
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_sources) \
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_headers) \
 @HAVE_GOBJECT_TRUE@    $(NULL)
 
-@HAVE_GOBJECT_TRUE@am__append_45 = \
+@HAVE_GOBJECT_TRUE@am__append_46 = \
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_sources) \
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_headers) \
 @HAVE_GOBJECT_TRUE@    $(NULL)
 
-@HAVE_GOBJECT_TRUE@am__append_46 = harfbuzz-gobject.def
+@HAVE_GOBJECT_TRUE@am__append_47 = harfbuzz-gobject.def
 noinst_PROGRAMS = main$(EXEEXT) test$(EXEEXT) \
        test-buffer-serialize$(EXEEXT) test-ot-meta$(EXEEXT) \
-       test-ot-name$(EXEEXT) test-gpos-size-params$(EXEEXT) \
-       test-gsub-would-substitute$(EXEEXT) $(am__EXEEXT_1) \
-       $(am__EXEEXT_3)
+       test-ot-name$(EXEEXT) test-ot-glyphname$(EXEEXT) \
+       test-gpos-size-params$(EXEEXT) \
+       test-gsub-would-substitute$(EXEEXT) $(am__EXEEXT_1)
 bin_PROGRAMS =
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am__append_47 = test-ot-color
 @WITH_LIBSTDCXX_FALSE@am__append_48 = \
-@WITH_LIBSTDCXX_FALSE@ check-libstdc++.sh \
+@WITH_LIBSTDCXX_FALSE@ check-libstdc++.py \
 @WITH_LIBSTDCXX_FALSE@ $(NULL)
 
 @HAVE_INTROSPECTION_TRUE@am__append_49 = $(gir_DATA) $(typelib_DATA)
@@ -193,10 +187,10 @@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \
        "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibdir)" \
        "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"
 am__EXEEXT_1 =
-am__EXEEXT_2 = test-algs$(EXEEXT) test-iter$(EXEEXT) \
-       test-meta$(EXEEXT) test-number$(EXEEXT) test-ot-tag$(EXEEXT) \
-       test-unicode-ranges$(EXEEXT) test-bimap$(EXEEXT)
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am__EXEEXT_3 = test-ot-color$(EXEEXT)
+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)
 PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
@@ -272,10 +266,6 @@ am__objects_6 = libharfbuzz_subset_la-hb-number.lo \
        libharfbuzz_subset_la-hb-subset.lo $(am__objects_5)
 am_libharfbuzz_subset_la_OBJECTS = $(am__objects_6)
 libharfbuzz_subset_la_OBJECTS = $(am_libharfbuzz_subset_la_OBJECTS)
-libharfbuzz_subset_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
-       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
-       $(AM_CXXFLAGS) $(CXXFLAGS) $(libharfbuzz_subset_la_LDFLAGS) \
-       $(LDFLAGS) -o $@
 @HAVE_GLIB_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
 @HAVE_FREETYPE_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1)
 @HAVE_GRAPHITE2_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1)
@@ -305,13 +295,14 @@ am__libharfbuzz_la_SOURCES_DIST = hb-aat-fdsc-table.hh \
        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-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-cff2-table.cc hb-ot-cff2-table.hh hb-ot-cmap-table.hh \
+       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-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 \
@@ -363,20 +354,21 @@ am__libharfbuzz_la_SOURCES_DIST = hb-aat-fdsc-table.hh \
        hb-ot-shape-complex-use-machine.hh hb-glib.cc hb-ft.cc \
        hb-graphite2.cc hb-uniscribe.cc hb-directwrite.cc hb-gdi.cc \
        hb-coretext.cc hb-icu.cc hb-aat-layout.h hb-aat.h hb-blob.h \
-       hb-buffer.h hb-common.h hb-deprecated.h hb-face.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-buffer.h hb-common.h hb-deprecated.h hb-draw.h hb-face.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
 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-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-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 \
@@ -470,6 +462,9 @@ am_test_algs_OBJECTS = test_algs-test-algs.$(OBJEXT) \
 test_algs_OBJECTS = $(am_test_algs_OBJECTS)
 am__DEPENDENCIES_13 = libharfbuzz.la $(am__DEPENDENCIES_12)
 test_algs_DEPENDENCIES = $(am__DEPENDENCIES_13)
+am_test_array_OBJECTS = test_array-test-array.$(OBJEXT)
+test_array_OBJECTS = $(am_test_array_OBJECTS)
+test_array_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_12)
 am_test_bimap_OBJECTS = test_bimap-test-bimap.$(OBJEXT) \
        test_bimap-hb-static.$(OBJEXT)
 test_bimap_OBJECTS = $(am_test_bimap_OBJECTS)
@@ -501,15 +496,10 @@ am_test_number_OBJECTS = test_number-test-number.$(OBJEXT) \
        test_number-hb-number.$(OBJEXT)
 test_number_OBJECTS = $(am_test_number_OBJECTS)
 test_number_DEPENDENCIES = $(am__DEPENDENCIES_13)
-am__test_ot_color_SOURCES_DIST = test-ot-color.cc
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am_test_ot_color_OBJECTS = test_ot_color-test-ot-color.$(OBJEXT)
-test_ot_color_OBJECTS = $(am_test_ot_color_OBJECTS)
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_DEPENDENCIES =  \
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@       libharfbuzz.la \
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@       $(am__DEPENDENCIES_12) \
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@       $(am__DEPENDENCIES_1) \
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@       $(am__DEPENDENCIES_1) \
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@       $(am__DEPENDENCIES_1)
+am_test_ot_glyphname_OBJECTS =  \
+       test_ot_glyphname-test-ot-glyphname.$(OBJEXT)
+test_ot_glyphname_OBJECTS = $(am_test_ot_glyphname_OBJECTS)
+test_ot_glyphname_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_12)
 am_test_ot_meta_OBJECTS = test_ot_meta-test-ot-meta.$(OBJEXT)
 test_ot_meta_OBJECTS = $(am_test_ot_meta_OBJECTS)
 test_ot_meta_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_12)
@@ -523,9 +513,9 @@ 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__dist_check_SCRIPTS_DIST = check-c-linkage-decls.sh \
-       check-externs.sh check-header-guards.sh check-includes.sh \
-       check-static-inits.sh check-symbols.sh check-libstdc++.sh
+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
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -560,6 +550,7 @@ am__depfiles_remade = ./$(DEPDIR)/dump_indic_data-dump-indic-data.Po \
        ./$(DEPDIR)/libharfbuzz_la-hb-common.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-coretext.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-directwrite.Plo \
+       ./$(DEPDIR)/libharfbuzz_la-hb-draw.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-face.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Plo \
        ./$(DEPDIR)/libharfbuzz_la-hb-font.Plo \
@@ -619,6 +610,7 @@ am__depfiles_remade = ./$(DEPDIR)/dump_indic_data-dump-indic-data.Po \
        ./$(DEPDIR)/main-main.Po ./$(DEPDIR)/test-test.Po \
        ./$(DEPDIR)/test_algs-hb-static.Po \
        ./$(DEPDIR)/test_algs-test-algs.Po \
+       ./$(DEPDIR)/test_array-test-array.Po \
        ./$(DEPDIR)/test_bimap-hb-static.Po \
        ./$(DEPDIR)/test_bimap-test-bimap.Po \
        ./$(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Po \
@@ -630,7 +622,7 @@ am__depfiles_remade = ./$(DEPDIR)/dump_indic_data-dump-indic-data.Po \
        ./$(DEPDIR)/test_meta-test-meta.Po \
        ./$(DEPDIR)/test_number-hb-number.Po \
        ./$(DEPDIR)/test_number-test-number.Po \
-       ./$(DEPDIR)/test_ot_color-test-ot-color.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 \
@@ -678,12 +670,12 @@ SOURCES = $(libharfbuzz_gobject_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) \
-       $(test_algs_SOURCES) $(test_bimap_SOURCES) \
-       $(test_buffer_serialize_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_color_SOURCES) $(test_ot_meta_SOURCES) \
+       $(test_ot_glyphname_SOURCES) $(test_ot_meta_SOURCES) \
        $(test_ot_name_SOURCES) $(test_ot_tag_SOURCES) \
        $(test_unicode_ranges_SOURCES)
 DIST_SOURCES = $(am__libharfbuzz_gobject_la_SOURCES_DIST) \
@@ -692,12 +684,12 @@ DIST_SOURCES = $(am__libharfbuzz_gobject_la_SOURCES_DIST) \
        $(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_bimap_SOURCES) \
-       $(test_buffer_serialize_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) \
-       $(am__test_ot_color_SOURCES_DIST) $(test_ot_meta_SOURCES) \
+       $(test_ot_glyphname_SOURCES) $(test_ot_meta_SOURCES) \
        $(test_ot_name_SOURCES) $(test_ot_tag_SOURCES) \
        $(test_unicode_ranges_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
@@ -715,12 +707,12 @@ am__can_run_installinfo = \
   esac
 DATA = $(cmake_DATA) $(gir_DATA) $(pkgconfig_DATA) $(typelib_DATA)
 am__pkginclude_HEADERS_DIST = hb-aat-layout.h hb-aat.h hb-blob.h \
-       hb-buffer.h hb-common.h hb-deprecated.h hb-face.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-buffer.h hb-common.h hb-deprecated.h hb-draw.h hb-face.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
 HEADERS = $(nodist_pkginclude_HEADERS) $(pkginclude_HEADERS)
@@ -907,11 +899,11 @@ am__set_TESTS_bases = \
   bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
   bases=`echo $$bases`
 RECHECK_LOGS = $(TEST_LOGS)
-@WITH_LIBSTDCXX_FALSE@am__EXEEXT_4 = check-libstdc++.sh \
+@WITH_LIBSTDCXX_FALSE@am__EXEEXT_3 = check-libstdc++.py \
 @WITH_LIBSTDCXX_FALSE@ $(am__EXEEXT_1)
-am__EXEEXT_5 = check-c-linkage-decls.sh check-externs.sh \
-       check-header-guards.sh check-includes.sh check-static-inits.sh \
-       check-symbols.sh $(am__EXEEXT_1) $(am__EXEEXT_4)
+am__EXEEXT_4 = check-c-linkage-decls.py check-externs.py \
+       check-header-guards.py check-includes.py check-static-inits.py \
+       check-symbols.py $(am__EXEEXT_1) $(am__EXEEXT_3)
 TEST_SUITE_LOG = test-suite.log
 TEST_EXTENSIONS = @EXEEXT@ .test
 LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
@@ -1095,6 +1087,8 @@ 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@
@@ -1153,19 +1147,19 @@ top_srcdir = @top_srcdir@
 NULL = 
 SUBDIRS = 
 DIST_SUBDIRS = 
-BUILT_SOURCES = hb-version.h $(am__append_44) $(RAGEL_GENERATED) \
+BUILT_SOURCES = hb-version.h $(am__append_45) $(RAGEL_GENERATED) \
        harfbuzz.cc
-EXTRA_DIST = harfbuzz.cc hb-version.h.in harfbuzz.pc.in \
-       harfbuzz-config.cmake.in harfbuzz-subset.pc.in \
+EXTRA_DIST = harfbuzz.cc meson.build fix_get_types.py hb-version.h.in \
+       harfbuzz.pc.in harfbuzz-config.cmake.in harfbuzz-subset.pc.in \
        harfbuzz-icu.pc.in harfbuzz-gobject.pc.in \
        hb-gobject-enums.cc.tmpl hb-gobject-enums.h.tmpl $(NULL) \
        $(GENERATORS) $(HB_BASE_RAGEL_sources) $(NULL)
 CLEANFILES = $(pkgconfig_DATA) $(DEF_FILES) $(am__append_49)
-DISTCLEANFILES = $(am__append_45)
+DISTCLEANFILES = $(am__append_46)
 MAINTAINERCLEANFILES = 
 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
 lib_LTLIBRARIES = libharfbuzz.la libharfbuzz-subset.la \
-       $(am__append_37) $(am__append_40)
+       $(am__append_38) $(am__append_41)
 HB_BASE_sources = \
        hb-aat-fdsc-table.hh \
        hb-aat-layout-ankr-table.hh \
@@ -1201,6 +1195,8 @@ HB_BASE_sources = \
        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 \
@@ -1223,6 +1219,7 @@ HB_BASE_sources = \
        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 \
@@ -1359,6 +1356,7 @@ HB_BASE_headers = \
        hb-buffer.h \
        hb-common.h \
        hb-deprecated.h \
+       hb-draw.h \
        hb-face.h \
        hb-font.h \
        hb-map.h \
@@ -1440,22 +1438,22 @@ HB_GOBJECT_NODIST_headers = $(HB_GOBJECT_ENUM_headers)
 HB_GOBJECT_sources = $(HB_GOBJECT_DIST_sources) $(HB_GOBJECT_NODIST_sources)
 HB_GOBJECT_headers = $(HB_GOBJECT_DIST_headers) $(HB_GOBJECT_NODIST_headers)
 HBCFLAGS = $(am__append_1) $(am__append_3) $(am__append_8) \
-       $(am__append_12) $(am__append_17) $(am__append_21) \
-       $(am__append_25) $(am__append_29) $(am__append_33)
+       $(am__append_13) $(am__append_18) $(am__append_22) \
+       $(am__append_26) $(am__append_30) $(am__append_34)
 
 # Put the library together
-HBLIBS = $(am__append_4) $(am__append_9) $(am__append_13) \
-       $(HBNONPCLIBS) $(am__append_34)
-HBNONPCLIBS = $(am__append_2) $(am__append_18) $(am__append_22) \
-       $(am__append_26) $(am__append_30)
-HBDEPS = $(am__append_5) $(am__append_14)
+HBLIBS = $(am__append_4) $(am__append_9) $(am__append_14) \
+       $(HBNONPCLIBS) $(am__append_35)
+HBNONPCLIBS = $(am__append_2) $(am__append_19) $(am__append_23) \
+       $(am__append_27) $(am__append_31)
+HBDEPS = $(am__append_5) $(am__append_10) $(am__append_15)
 HBSOURCES = $(HB_BASE_sources) $(HB_BASE_RAGEL_GENERATED_sources) \
-       $(am__append_6) $(am__append_10) $(am__append_15) \
-       $(am__append_19) $(am__append_23) $(am__append_27) \
-       $(am__append_31) $(am__append_35)
-HBHEADERS = $(HB_BASE_headers) $(am__append_7) $(am__append_11) \
-       $(am__append_16) $(am__append_20) $(am__append_24) \
-       $(am__append_28) $(am__append_32) $(am__append_36)
+       $(am__append_6) $(am__append_11) $(am__append_16) \
+       $(am__append_20) $(am__append_24) $(am__append_28) \
+       $(am__append_32) $(am__append_36)
+HBHEADERS = $(HB_BASE_headers) $(am__append_7) $(am__append_12) \
+       $(am__append_17) $(am__append_21) $(am__append_25) \
+       $(am__append_29) $(am__append_33) $(am__append_37)
 @OS_WIN32_TRUE@export_symbols = -export-symbols harfbuzz.def
 @OS_WIN32_TRUE@harfbuzz_def_dependency = harfbuzz.def
 @OS_WIN32_TRUE@export_symbols_subset = -export-symbols harfbuzz-subset.def
@@ -1477,13 +1475,14 @@ libharfbuzz_la_LDFLAGS = $(base_link_flags) $(export_symbols) $(CODE_COVERAGE_LD
 libharfbuzz_la_LIBADD = $(HBLIBS)
 EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency)
 pkginclude_HEADERS = $(HBHEADERS) $(HB_SUBSET_headers) \
-       $(am__append_38) $(am__append_41)
-nodist_pkginclude_HEADERS = $(am__append_42)
+       $(am__append_39) $(am__append_42)
+nodist_pkginclude_HEADERS = $(am__append_43)
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = harfbuzz.pc harfbuzz-subset.pc $(am__append_39) \
-       $(am__append_43)
+pkgconfig_DATA = harfbuzz.pc harfbuzz-subset.pc $(am__append_40) \
+       $(am__append_44)
 cmakedir = $(libdir)/cmake/harfbuzz
 cmake_DATA = harfbuzz-config.cmake
+libharfbuzz_subset_la_LINK = $(chosen_linker) $(libharfbuzz_subset_la_LDFLAGS)
 libharfbuzz_subset_la_SOURCES = $(HB_SUBSET_sources)
 libharfbuzz_subset_la_CPPFLAGS = $(HBCFLAGS) $(CODE_COVERAGE_CFLAGS)
 libharfbuzz_subset_la_LDFLAGS = $(base_link_flags) $(export_symbols_subset) $(CODE_COVERAGE_LDFLAGS)
@@ -1502,13 +1501,16 @@ EXTRA_libharfbuzz_subset_la_DEPENDENCIES = $(harfbuzz_subset_def_dependency)
 @HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_LIBADD = $(GOBJECT_LIBS) libharfbuzz.la
 @HAVE_GOBJECT_TRUE@EXTRA_libharfbuzz_gobject_la_DEPENDENCIES = $(harfbuzz_gobject_def_dependency)
 DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def \
-       harfbuzz-deprecated-symbols.txt $(am__append_46)
+       harfbuzz-deprecated-symbols.txt $(am__append_47)
 GENERATORS = \
        gen-arabic-table.py \
        gen-def.py \
        gen-emoji-table.py \
+       gen-harfbuzzcc.py \
+       gen-hb-version.py \
        gen-indic-table.py \
        gen-os2-unicode-ranges.py \
+       gen-ragel-artifacts.py \
        gen-tag-table.py \
        gen-ucd-table.py \
        gen-use-table.py \
@@ -1534,18 +1536,15 @@ test_ot_meta_LDADD = libharfbuzz.la $(HBLIBS)
 test_ot_name_SOURCES = test-ot-name.cc
 test_ot_name_CPPFLAGS = $(HBCFLAGS)
 test_ot_name_LDADD = libharfbuzz.la $(HBLIBS)
+test_ot_glyphname_SOURCES = test-ot-glyphname.cc
+test_ot_glyphname_CPPFLAGS = $(HBCFLAGS)
+test_ot_glyphname_LDADD = libharfbuzz.la $(HBLIBS)
 test_gpos_size_params_SOURCES = test-gpos-size-params.cc
 test_gpos_size_params_CPPFLAGS = $(HBCFLAGS)
 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)
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_SOURCES = test-ot-color.cc
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) $(CAIRO_FT_CFLAGS)
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) $(CAIRO_LIBS) $(CAIRO_FT_LIBS)
-dist_check_SCRIPTS = check-c-linkage-decls.sh check-externs.sh \
-       check-header-guards.sh check-includes.sh check-static-inits.sh \
-       check-symbols.sh $(NULL) $(am__append_48)
 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)
@@ -1558,12 +1557,15 @@ 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-iter test-meta test-number test-ot-tag test-unicode-ranges test-bimap
+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)
 test_algs_SOURCES = test-algs.cc hb-static.cc
 test_algs_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_algs_LDADD = $(COMPILED_TESTS_LDADD)
+test_array_SOURCES = test-array.cc
+test_array_CPPFLAGS = $(HBCFLAGS)
+test_array_LDADD = libharfbuzz.la $(HBLIBS)
 test_iter_SOURCES = test-iter.cc hb-static.cc
 test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
 test_iter_LDADD = $(COMPILED_TESTS_LDADD)
@@ -1582,15 +1584,29 @@ 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)
+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)
 TESTS_ENVIRONMENT = \
        srcdir="$(srcdir)" \
+       builddir="$(builddir)" \
        MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
        HBSOURCES="$(HBSOURCES)" \
        HBHEADERS="$(HBHEADERS)" \
        $(NULL)
 
 @HAVE_INTROSPECTION_TRUE@INTROSPECTION_GIRS = HarfBuzz-0.0.gir # What does the 0 mean anyway?!
-@HAVE_INTROSPECTION_TRUE@INTROSPECTION_SCANNER_ARGS = -I$(srcdir) -n hb --identifier-prefix=hb_ --warn-all
+@HAVE_INTROSPECTION_TRUE@INTROSPECTION_SCANNER_ARGS = \
+@HAVE_INTROSPECTION_TRUE@      -I$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@      --warn-all --verbose \
+@HAVE_INTROSPECTION_TRUE@      --namespace=HarfBuzz \
+@HAVE_INTROSPECTION_TRUE@      --nsversion=0.0 \
+@HAVE_INTROSPECTION_TRUE@      --symbol-prefix=hb \
+@HAVE_INTROSPECTION_TRUE@      --symbol-prefix=hb_gobject \
+@HAVE_INTROSPECTION_TRUE@      --identifier-prefix=hb_ \
+@HAVE_INTROSPECTION_TRUE@      --pkg-export=harfbuzz-gobject \
+@HAVE_INTROSPECTION_TRUE@      --c-include=hb-gobject.h
+
 @HAVE_INTROSPECTION_TRUE@INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
 @HAVE_INTROSPECTION_TRUE@INTROSPECTION_SCANNER_ENV = CC="$(CC)"
 @HAVE_INTROSPECTION_TRUE@HarfBuzz_0_0_gir_INCLUDES = GObject-2.0
@@ -1788,7 +1804,7 @@ libharfbuzz-icu.la: $(libharfbuzz_icu_la_OBJECTS) $(libharfbuzz_icu_la_DEPENDENC
        $(AM_V_CXXLD)$(libharfbuzz_icu_la_LINK) $(am_libharfbuzz_icu_la_rpath) $(libharfbuzz_icu_la_OBJECTS) $(libharfbuzz_icu_la_LIBADD) $(LIBS)
 
 libharfbuzz-subset.la: $(libharfbuzz_subset_la_OBJECTS) $(libharfbuzz_subset_la_DEPENDENCIES) $(EXTRA_libharfbuzz_subset_la_DEPENDENCIES) 
-       $(AM_V_CXXLD)$(libharfbuzz_subset_la_LINK) -rpath $(libdir) $(libharfbuzz_subset_la_OBJECTS) $(libharfbuzz_subset_la_LIBADD) $(LIBS)
+       $(AM_V_GEN)$(libharfbuzz_subset_la_LINK) -rpath $(libdir) $(libharfbuzz_subset_la_OBJECTS) $(libharfbuzz_subset_la_LIBADD) $(LIBS)
 
 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)
@@ -1821,6 +1837,10 @@ test-algs$(EXEEXT): $(test_algs_OBJECTS) $(test_algs_DEPENDENCIES) $(EXTRA_test_
        @rm -f test-algs$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_algs_OBJECTS) $(test_algs_LDADD) $(LIBS)
 
+test-array$(EXEEXT): $(test_array_OBJECTS) $(test_array_DEPENDENCIES) $(EXTRA_test_array_DEPENDENCIES) 
+       @rm -f test-array$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_array_OBJECTS) $(test_array_LDADD) $(LIBS)
+
 test-bimap$(EXEEXT): $(test_bimap_OBJECTS) $(test_bimap_DEPENDENCIES) $(EXTRA_test_bimap_DEPENDENCIES) 
        @rm -f test-bimap$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_bimap_OBJECTS) $(test_bimap_LDADD) $(LIBS)
@@ -1849,9 +1869,9 @@ test-number$(EXEEXT): $(test_number_OBJECTS) $(test_number_DEPENDENCIES) $(EXTRA
        @rm -f test-number$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_number_OBJECTS) $(test_number_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_CXXLD)$(CXXLINK) $(test_ot_color_OBJECTS) $(test_ot_color_LDADD) $(LIBS)
+test-ot-glyphname$(EXEEXT): $(test_ot_glyphname_OBJECTS) $(test_ot_glyphname_DEPENDENCIES) $(EXTRA_test_ot_glyphname_DEPENDENCIES) 
+       @rm -f test-ot-glyphname$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_ot_glyphname_OBJECTS) $(test_ot_glyphname_LDADD) $(LIBS)
 
 test-ot-meta$(EXEEXT): $(test_ot_meta_OBJECTS) $(test_ot_meta_DEPENDENCIES) $(EXTRA_test_ot_meta_DEPENDENCIES) 
        @rm -f test-ot-meta$(EXEEXT)
@@ -1894,6 +1914,7 @@ distclean-compile:
 @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
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-directwrite.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-draw.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-face.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-font.Plo@am__quote@ # am--include-marker
@@ -1954,6 +1975,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_algs-hb-static.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_algs-test-algs.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_array-test-array.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_bimap-hb-static.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_bimap-test-bimap.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Po@am__quote@ # am--include-marker
@@ -1965,7 +1987,7 @@ distclean-compile:
 @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_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_color-test-ot-color.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
@@ -2131,6 +2153,13 @@ libharfbuzz_la-hb-common.lo: hb-common.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-common.lo `test -f 'hb-common.cc' || echo '$(srcdir)/'`hb-common.cc
 
+libharfbuzz_la-hb-draw.lo: hb-draw.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-draw.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-draw.Tpo -c -o libharfbuzz_la-hb-draw.lo `test -f 'hb-draw.cc' || echo '$(srcdir)/'`hb-draw.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-draw.Tpo $(DEPDIR)/libharfbuzz_la-hb-draw.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-draw.cc' object='libharfbuzz_la-hb-draw.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-draw.lo `test -f 'hb-draw.cc' || echo '$(srcdir)/'`hb-draw.cc
+
 libharfbuzz_la-hb-face.lo: hb-face.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-face.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-face.Tpo -c -o libharfbuzz_la-hb-face.lo `test -f 'hb-face.cc' || echo '$(srcdir)/'`hb-face.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-face.Tpo $(DEPDIR)/libharfbuzz_la-hb-face.Plo
@@ -2635,6 +2664,20 @@ test_algs-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_algs_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_algs-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi`
 
+test_array-test-array.o: test-array.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_array_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_array-test-array.o -MD -MP -MF $(DEPDIR)/test_array-test-array.Tpo -c -o test_array-test-array.o `test -f 'test-array.cc' || echo '$(srcdir)/'`test-array.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_array-test-array.Tpo $(DEPDIR)/test_array-test-array.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-array.cc' object='test_array-test-array.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_array_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_array-test-array.o `test -f 'test-array.cc' || echo '$(srcdir)/'`test-array.cc
+
+test_array-test-array.obj: test-array.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_array_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_array-test-array.obj -MD -MP -MF $(DEPDIR)/test_array-test-array.Tpo -c -o test_array-test-array.obj `if test -f 'test-array.cc'; then $(CYGPATH_W) 'test-array.cc'; else $(CYGPATH_W) '$(srcdir)/test-array.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_array-test-array.Tpo $(DEPDIR)/test_array-test-array.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-array.cc' object='test_array-test-array.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_array_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_array-test-array.obj `if test -f 'test-array.cc'; then $(CYGPATH_W) 'test-array.cc'; else $(CYGPATH_W) '$(srcdir)/test-array.cc'; fi`
+
 test_bimap-test-bimap.o: test-bimap.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_bimap_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_bimap-test-bimap.o -MD -MP -MF $(DEPDIR)/test_bimap-test-bimap.Tpo -c -o test_bimap-test-bimap.o `test -f 'test-bimap.cc' || echo '$(srcdir)/'`test-bimap.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_bimap-test-bimap.Tpo $(DEPDIR)/test_bimap-test-bimap.Po
@@ -2789,19 +2832,19 @@ test_number-hb-number.obj: hb-number.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_number_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_number-hb-number.obj `if test -f 'hb-number.cc'; then $(CYGPATH_W) 'hb-number.cc'; else $(CYGPATH_W) '$(srcdir)/hb-number.cc'; fi`
 
-test_ot_color-test-ot-color.o: test-ot-color.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_color-test-ot-color.o -MD -MP -MF $(DEPDIR)/test_ot_color-test-ot-color.Tpo -c -o test_ot_color-test-ot-color.o `test -f 'test-ot-color.cc' || echo '$(srcdir)/'`test-ot-color.cc
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_color-test-ot-color.Tpo $(DEPDIR)/test_ot_color-test-ot-color.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-ot-color.cc' object='test_ot_color-test-ot-color.o' libtool=no @AMDEPBACKSLASH@
+test_ot_glyphname-test-ot-glyphname.o: test-ot-glyphname.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_glyphname_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_glyphname-test-ot-glyphname.o -MD -MP -MF $(DEPDIR)/test_ot_glyphname-test-ot-glyphname.Tpo -c -o test_ot_glyphname-test-ot-glyphname.o `test -f 'test-ot-glyphname.cc' || echo '$(srcdir)/'`test-ot-glyphname.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_glyphname-test-ot-glyphname.Tpo $(DEPDIR)/test_ot_glyphname-test-ot-glyphname.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-ot-glyphname.cc' object='test_ot_glyphname-test-ot-glyphname.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_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_color-test-ot-color.o `test -f 'test-ot-color.cc' || echo '$(srcdir)/'`test-ot-color.cc
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_glyphname_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_glyphname-test-ot-glyphname.o `test -f 'test-ot-glyphname.cc' || echo '$(srcdir)/'`test-ot-glyphname.cc
 
-test_ot_color-test-ot-color.obj: test-ot-color.cc
-@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_color-test-ot-color.obj -MD -MP -MF $(DEPDIR)/test_ot_color-test-ot-color.Tpo -c -o test_ot_color-test-ot-color.obj `if test -f 'test-ot-color.cc'; then $(CYGPATH_W) 'test-ot-color.cc'; else $(CYGPATH_W) '$(srcdir)/test-ot-color.cc'; fi`
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_color-test-ot-color.Tpo $(DEPDIR)/test_ot_color-test-ot-color.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-ot-color.cc' object='test_ot_color-test-ot-color.obj' libtool=no @AMDEPBACKSLASH@
+test_ot_glyphname-test-ot-glyphname.obj: test-ot-glyphname.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_glyphname_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_glyphname-test-ot-glyphname.obj -MD -MP -MF $(DEPDIR)/test_ot_glyphname-test-ot-glyphname.Tpo -c -o test_ot_glyphname-test-ot-glyphname.obj `if test -f 'test-ot-glyphname.cc'; then $(CYGPATH_W) 'test-ot-glyphname.cc'; else $(CYGPATH_W) '$(srcdir)/test-ot-glyphname.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_glyphname-test-ot-glyphname.Tpo $(DEPDIR)/test_ot_glyphname-test-ot-glyphname.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test-ot-glyphname.cc' object='test_ot_glyphname-test-ot-glyphname.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_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_color-test-ot-color.obj `if test -f 'test-ot-color.cc'; then $(CYGPATH_W) 'test-ot-color.cc'; else $(CYGPATH_W) '$(srcdir)/test-ot-color.cc'; fi`
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_glyphname_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_glyphname-test-ot-glyphname.obj `if test -f 'test-ot-glyphname.cc'; then $(CYGPATH_W) 'test-ot-glyphname.cc'; else $(CYGPATH_W) '$(srcdir)/test-ot-glyphname.cc'; fi`
 
 test_ot_meta-test-ot-meta.o: test-ot-meta.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_meta_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_meta-test-ot-meta.o -MD -MP -MF $(DEPDIR)/test_ot_meta-test-ot-meta.Tpo -c -o test_ot_meta-test-ot-meta.o `test -f 'test-ot-meta.cc' || echo '$(srcdir)/'`test-ot-meta.cc
@@ -3231,100 +3274,107 @@ recheck: all $(check_PROGRAMS) $(dist_check_SCRIPTS)
                am__force_recheck=am--force-recheck \
                TEST_LOGS="$$log_list"; \
        exit $$?
-check-c-linkage-decls.sh.log: check-c-linkage-decls.sh
-       @p='check-c-linkage-decls.sh'; \
-       b='check-c-linkage-decls.sh'; \
+test-algs.log: test-algs$(EXEEXT)
+       @p='test-algs$(EXEEXT)'; \
+       b='test-algs'; \
        $(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)
-check-externs.sh.log: check-externs.sh
-       @p='check-externs.sh'; \
-       b='check-externs.sh'; \
+test-array.log: test-array$(EXEEXT)
+       @p='test-array$(EXEEXT)'; \
+       b='test-array'; \
        $(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)
-check-header-guards.sh.log: check-header-guards.sh
-       @p='check-header-guards.sh'; \
-       b='check-header-guards.sh'; \
+test-iter.log: test-iter$(EXEEXT)
+       @p='test-iter$(EXEEXT)'; \
+       b='test-iter'; \
        $(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)
-check-includes.sh.log: check-includes.sh
-       @p='check-includes.sh'; \
-       b='check-includes.sh'; \
+test-meta.log: test-meta$(EXEEXT)
+       @p='test-meta$(EXEEXT)'; \
+       b='test-meta'; \
        $(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)
-check-static-inits.sh.log: check-static-inits.sh
-       @p='check-static-inits.sh'; \
-       b='check-static-inits.sh'; \
+test-number.log: test-number$(EXEEXT)
+       @p='test-number$(EXEEXT)'; \
+       b='test-number'; \
        $(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)
-check-symbols.sh.log: check-symbols.sh
-       @p='check-symbols.sh'; \
-       b='check-symbols.sh'; \
+test-ot-tag.log: test-ot-tag$(EXEEXT)
+       @p='test-ot-tag$(EXEEXT)'; \
+       b='test-ot-tag'; \
        $(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)
-check-libstdc++.sh.log: check-libstdc++.sh
-       @p='check-libstdc++.sh'; \
-       b='check-libstdc++.sh'; \
+test-unicode-ranges.log: test-unicode-ranges$(EXEEXT)
+       @p='test-unicode-ranges$(EXEEXT)'; \
+       b='test-unicode-ranges'; \
        $(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-algs.log: test-algs$(EXEEXT)
-       @p='test-algs$(EXEEXT)'; \
-       b='test-algs'; \
+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'; \
+check-c-linkage-decls.py.log: check-c-linkage-decls.py
+       @p='check-c-linkage-decls.py'; \
+       b='check-c-linkage-decls.py'; \
        $(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-meta.log: test-meta$(EXEEXT)
-       @p='test-meta$(EXEEXT)'; \
-       b='test-meta'; \
+check-externs.py.log: check-externs.py
+       @p='check-externs.py'; \
+       b='check-externs.py'; \
        $(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-number.log: test-number$(EXEEXT)
-       @p='test-number$(EXEEXT)'; \
-       b='test-number'; \
+check-header-guards.py.log: check-header-guards.py
+       @p='check-header-guards.py'; \
+       b='check-header-guards.py'; \
        $(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-tag.log: test-ot-tag$(EXEEXT)
-       @p='test-ot-tag$(EXEEXT)'; \
-       b='test-ot-tag'; \
+check-includes.py.log: check-includes.py
+       @p='check-includes.py'; \
+       b='check-includes.py'; \
        $(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'; \
+check-static-inits.py.log: check-static-inits.py
+       @p='check-static-inits.py'; \
+       b='check-static-inits.py'; \
        $(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-bimap.log: test-bimap$(EXEEXT)
-       @p='test-bimap$(EXEEXT)'; \
-       b='test-bimap'; \
+check-symbols.py.log: check-symbols.py
+       @p='check-symbols.py'; \
+       b='check-symbols.py'; \
+       $(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)
+check-libstdc++.py.log: check-libstdc++.py
+       @p='check-libstdc++.py'; \
+       b='check-libstdc++.py'; \
        $(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) \
@@ -3480,6 +3530,7 @@ distclean: distclean-recursive
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-common.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-coretext.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-directwrite.Plo
+       -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-draw.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-face.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-font.Plo
@@ -3540,6 +3591,7 @@ distclean: distclean-recursive
        -rm -f ./$(DEPDIR)/test-test.Po
        -rm -f ./$(DEPDIR)/test_algs-hb-static.Po
        -rm -f ./$(DEPDIR)/test_algs-test-algs.Po
+       -rm -f ./$(DEPDIR)/test_array-test-array.Po
        -rm -f ./$(DEPDIR)/test_bimap-hb-static.Po
        -rm -f ./$(DEPDIR)/test_bimap-test-bimap.Po
        -rm -f ./$(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Po
@@ -3551,7 +3603,7 @@ distclean: distclean-recursive
        -rm -f ./$(DEPDIR)/test_meta-test-meta.Po
        -rm -f ./$(DEPDIR)/test_number-hb-number.Po
        -rm -f ./$(DEPDIR)/test_number-test-number.Po
-       -rm -f ./$(DEPDIR)/test_ot_color-test-ot-color.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
@@ -3622,6 +3674,7 @@ maintainer-clean: maintainer-clean-recursive
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-common.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-coretext.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-directwrite.Plo
+       -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-draw.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-face.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Plo
        -rm -f ./$(DEPDIR)/libharfbuzz_la-hb-font.Plo
@@ -3682,6 +3735,7 @@ maintainer-clean: maintainer-clean-recursive
        -rm -f ./$(DEPDIR)/test-test.Po
        -rm -f ./$(DEPDIR)/test_algs-hb-static.Po
        -rm -f ./$(DEPDIR)/test_algs-test-algs.Po
+       -rm -f ./$(DEPDIR)/test_array-test-array.Po
        -rm -f ./$(DEPDIR)/test_bimap-hb-static.Po
        -rm -f ./$(DEPDIR)/test_bimap-test-bimap.Po
        -rm -f ./$(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Po
@@ -3693,7 +3747,7 @@ maintainer-clean: maintainer-clean-recursive
        -rm -f ./$(DEPDIR)/test_meta-test-meta.Po
        -rm -f ./$(DEPDIR)/test_number-hb-number.Po
        -rm -f ./$(DEPDIR)/test_number-test-number.Po
-       -rm -f ./$(DEPDIR)/test_ot_color-test-ot-color.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
@@ -3758,12 +3812,7 @@ 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) $(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)
+       $(AM_V_GEN) $(srcdir)/gen-hb-version.py $(HB_VERSION) hb-version.h.in hb-version.h
 
 @CODE_COVERAGE_RULES@
 @HAVE_GOBJECT_TRUE@hb-gobject-enums.%: hb-gobject-enums.%.tmpl $(HBHEADERS)
@@ -3796,41 +3845,9 @@ harfbuzz-gobject.def: $(HB_GOBJECT_headers)
 harfbuzz-deprecated-symbols.txt: $(srcdir)/hb-deprecated.h
        $(AM_V_GEN) PLAIN_LIST=1 $(srcdir)/gen-def.py "$@" $^
 
-unicode-tables: \
-       arabic-table \
-       emoji-table \
-       indic-table \
-       tag-table \
-       ucd-table \
-       use-table \
-       emoji-table \
-       $(NULL)
-
-arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-arabic-table.hh \
-       || ($(RM) $(srcdir)/hb-ot-shape-complex-arabic-table.hh; false)
-emoji-table: gen-emoji-table.py emoji-data.txt
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \
-       || ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false)
-indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-indic-table.cc \
-       || ($(RM) $(srcdir)/hb-ot-shape-complex-indic-table.cc; false)
-tag-table: gen-tag-table.py languagetags language-subtag-registry
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-tag-table.hh \
-       || ($(RM) $(srcdir)/hb-ot-tag-table.hh; false)
-ucd-table: gen-ucd-table.py ucd.nounihan.grouped.zip hb-common.h
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ucd-table.hh \
-       || ($(RM) $(srcdir)/hb-ucd-table.hh; false)
-use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \
-       || ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false)
-vowel-constraints: gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt
-       $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc \
-       || ($(RM) $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc; false)
-
 built-sources: $(BUILT_SOURCES)
 
-.PHONY: unicode-tables arabic-table indic-table tag-table use-table vowel-constraints emoji-table built-sources
+.PHONY: built-sources
 # We decided to add ragel-generated files to git...
 #MAINTAINERCLEANFILES += $(RAGEL_GENERATED)
 $(srcdir)/%.hh: $(srcdir)/%.rl
@@ -3839,7 +3856,8 @@ $(srcdir)/%.hh: $(srcdir)/%.rl
 
 harfbuzz.cc: Makefile.sources
        $(AM_V_GEN) \
-       for f in \
+       $(srcdir)/gen-harfbuzzcc.py \
+               $(srcdir)/harfbuzz.cc \
                $(HB_BASE_sources) \
                $(HB_GLIB_sources) \
                $(HB_FT_sources) \
@@ -3847,10 +3865,7 @@ harfbuzz.cc: Makefile.sources
                $(HB_UNISCRIBE_sources) \
                $(HB_GDI_sources) \
                $(HB_DIRECTWRITE_sources) \
-               $(HB_CORETEXT_sources) \
-               ; do echo '#include "'$$f'"'; done | \
-       grep '[.]cc"' > $(srcdir)/harfbuzz.cc \
-       || ($(RM) $(srcdir)/harfbuzz.cc; false)
+               $(HB_CORETEXT_sources)
 
 @HAVE_INTROSPECTION_TRUE@-include $(INTROSPECTION_MAKEFILE)
 
index cbbad90..81b5cde 100644 (file)
@@ -35,6 +35,8 @@ HB_BASE_sources = \
        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 \
@@ -57,6 +59,7 @@ HB_BASE_sources = \
        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 \
@@ -192,6 +195,7 @@ HB_BASE_headers = \
        hb-buffer.h \
        hb-common.h \
        hb-deprecated.h \
+       hb-draw.h \
        hb-face.h \
        hb-font.h \
        hb-map.h \
diff --git a/src/check-c-linkage-decls.py b/src/check-c-linkage-decls.py
new file mode 100755 (executable)
index 0000000..41b9d02
--- /dev/null
@@ -0,0 +1,26 @@
+#!/usr/bin/env python3
+
+import sys, os
+
+os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
+
+HBHEADERS = os.environ.get ('HBHEADERS', '').split () or \
+       [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith ('.h')]
+HBSOURCES = os.environ.get ('HBSOURCES', '').split () or \
+       [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith (('.cc', '.hh'))]
+
+stat = 0
+
+for x in HBHEADERS:
+       with open (x, 'r', encoding='utf-8') as f: content = f.read ()
+       if ('HB_BEGIN_DECLS' not in content) or ('HB_END_DECLS' not in content):
+               print ('Ouch, file %s does not have HB_BEGIN_DECLS / HB_END_DECLS, but it should' % x)
+               stat = 1
+
+for x in HBSOURCES:
+       with open (x, 'r', encoding='utf-8') as f: content = f.read ()
+       if ('HB_BEGIN_DECLS' in content) or ('HB_END_DECLS' in content):
+               print ('Ouch, file %s has HB_BEGIN_DECLS / HB_END_DECLS, but it shouldn\'t' % x)
+               stat = 1
+
+sys.exit (stat)
diff --git a/src/check-c-linkage-decls.sh b/src/check-c-linkage-decls.sh
deleted file mode 100755 (executable)
index 8234abc..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/sh
-
-LC_ALL=C
-export LC_ALL
-
-test -z "$srcdir" && srcdir=.
-stat=0
-
-test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
-test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.cc'`
-
-for x in $HBHEADERS; do
-       test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
-       if ! grep -q HB_BEGIN_DECLS "$x" || ! grep -q HB_END_DECLS "$x"; then
-               echo "Ouch, file $x does not have HB_BEGIN_DECLS / HB_END_DECLS, but it should"
-               stat=1
-       fi
-done
-for x in $HBSOURCES; do
-       test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
-       if grep -q HB_BEGIN_DECLS "$x" || grep -q HB_END_DECLS "$x"; then
-               echo "Ouch, file $x has HB_BEGIN_DECLS / HB_END_DECLS, but it shouldn't"
-               stat=1
-       fi
-done
-
-exit $stat
diff --git a/src/check-externs.py b/src/check-externs.py
new file mode 100755 (executable)
index 0000000..13aedf8
--- /dev/null
@@ -0,0 +1,20 @@
+#!/usr/bin/env python3
+
+import sys, os, re
+
+os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
+
+HBHEADERS = os.environ.get ('HBHEADERS', '').split () or \
+       [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith ('.h')]
+
+stat = 0
+
+print ('Checking that all public symbols are exported with HB_EXTERN')
+for x in HBHEADERS:
+       with open (x, 'r', encoding='utf-8') as f: content = f.read ()
+       for s in re.findall (r'\n.+\nhb_.+\n', content):
+               if not s.startswith ('\nHB_EXTERN '):
+                       print ('failure on:', s)
+                       stat = 1
+
+sys.exit (stat)
diff --git a/src/check-externs.sh b/src/check-externs.sh
deleted file mode 100755 (executable)
index a6de375..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-
-LC_ALL=C
-export LC_ALL
-
-test -z "$srcdir" && srcdir=.
-stat=0
-
-test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
-test "x$EGREP" = x && EGREP='grep -E'
-
-
-echo 'Checking that all public symbols are exported with HB_EXTERN'
-
-for x in $HBHEADERS; do
-       test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
-       $EGREP -B1 -n '^hb_' /dev/null "$x" |
-       $EGREP -v '(^--|:hb_|-HB_EXTERN )' -A1
-done |
-grep . >&2 && stat=1
-
-exit $stat
diff --git a/src/check-header-guards.py b/src/check-header-guards.py
new file mode 100755 (executable)
index 0000000..e6c9077
--- /dev/null
@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+
+import sys, os, re
+
+os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
+
+HBHEADERS = os.environ.get ('HBHEADERS', '').split () or \
+       [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith ('.h')]
+HBSOURCES = os.environ.get ('HBSOURCES', '').split () or \
+       [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith (('.cc', '.hh'))]
+
+stat = 0
+
+for x in HBHEADERS + HBSOURCES:
+       if not x.endswith ('h') or x == 'hb-gobject-structs.h': continue
+       tag = x.upper ().replace ('.', '_').replace ('-', '_')
+       with open (x, 'r', encoding='utf-8') as f: content = f.read ()
+       if len (re.findall (tag + r'\b', content)) != 3:
+               print ('Ouch, header file %s does not have correct preprocessor guards' % x)
+               stat = 1
+
+sys.exit (stat)
diff --git a/src/check-header-guards.sh b/src/check-header-guards.sh
deleted file mode 100755 (executable)
index b67640f..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-
-LC_ALL=C
-export LC_ALL
-
-test -z "$srcdir" && srcdir=.
-stat=0
-
-test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h' ! -name 'hb-gobject-structs.h'`
-test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb-*.cc' -or -name 'hb-*.hh'`
-
-for x in $HBHEADERS $HBSOURCES; do
-       test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
-       echo "$x" | grep -q '[^h]$' && continue;
-       xx=`echo "$x" | sed 's@.*/@@'`
-       tag=`echo "$xx" | tr 'a-z.-' 'A-Z_'`
-       lines=`grep -w "$tag" "$x" | wc -l | sed 's/[   ]*//g'`
-       if test "x$lines" != x3; then
-               echo "Ouch, header file $x does not have correct preprocessor guards"
-               stat=1
-       fi
-done
-
-exit $stat
diff --git a/src/check-includes.py b/src/check-includes.py
new file mode 100755 (executable)
index 0000000..b278b3e
--- /dev/null
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+import sys, os, re
+
+os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
+
+HBHEADERS = os.environ.get ('HBHEADERS', '').split () or \
+       [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith ('.h')]
+HBSOURCES = os.environ.get ('HBSOURCES', '').split () or \
+       [x for x in os.listdir ('.') if x.startswith ('hb') and x.endswith (('.cc', '.hh'))]
+
+stat = 0
+
+print ('Checking that public header files #include "hb-common.h" or "hb.h" first (or none)')
+for x in HBHEADERS:
+       if x == 'hb.h' or x == 'hb-common.h': continue
+       with open (x, 'r', encoding='utf-8') as f: content = f.read ()
+       first = re.findall (r'#.*include.*', content)[0]
+       if first not in ['#include "hb.h"', '#include "hb-common.h"']:
+               print ('failure on %s' % x)
+               stat = 1
+
+print ('Checking that source files #include a private header first (or none)')
+for x in HBSOURCES:
+       with open (x, 'r', encoding='utf-8') as f: content = f.read ()
+       includes = re.findall (r'#.*include.*', content)
+       if includes:
+               if not len (re.findall (r'"hb.*\.hh"', includes[0])):
+                       print ('failure on %s' % x)
+                       stat = 1
+
+print ('Checking that there is no #include <hb-*.h>')
+for x in HBHEADERS + HBSOURCES:
+       with open (x, 'r', encoding='utf-8') as f: content = f.read ()
+       if re.findall ('#.*include.*<.*hb', content):
+               print ('failure on %s' % x)
+               stat = 1
+
+sys.exit (stat)
diff --git a/src/check-includes.sh b/src/check-includes.sh
deleted file mode 100755 (executable)
index f938f70..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/sh
-
-LC_ALL=C
-export LC_ALL
-
-test -z "$srcdir" && srcdir=.
-stat=0
-
-test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
-test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb-*.cc' -or -name 'hb-*.hh'`
-
-
-echo 'Checking that public header files #include "hb-common.h" or "hb.h" first (or none)'
-
-for x in $HBHEADERS; do
-       test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
-       grep '#.*\<include\>' "$x" /dev/null | head -n 1
-done |
-grep -v '"hb-common[.]h"' |
-grep -v '"hb[.]h"' |
-grep -v 'hb-common[.]h:' |
-grep -v 'hb[.]h:' |
-grep . >&2 && stat=1
-
-
-echo 'Checking that source files #include a private header first (or none)'
-
-for x in $HBSOURCES; do
-       test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
-       grep '#.*\<include\>' "$x" /dev/null | head -n 1
-done |
-grep -v '"hb-.*[.]hh"' |
-grep -v 'hb[.]hh' |
-grep . >&2 && stat=1
-
-
-echo 'Checking that there is no #include <hb-*.h>'
-for x in $HBHEADERS $HBSOURCES; do
-       test -f "$srcdir/$x" && x="$srcdir/$x"
-       grep '#.*\<include\>.*<.*hb' "$x" /dev/null >&2 && stat=1
-done
-
-
-exit $stat
diff --git a/src/check-libstdc++.py b/src/check-libstdc++.py
new file mode 100755 (executable)
index 0000000..142785c
--- /dev/null
@@ -0,0 +1,41 @@
+#!/usr/bin/env python3
+
+import sys, os, shutil, subprocess
+
+os.chdir (os.environ.get ('srcdir', os.path.dirname (__file__)))
+
+libs = os.environ.get ('libs', '.libs')
+
+ldd = shutil.which ('ldd')
+if ldd:
+       ldd = [ldd]
+else:
+       ldd = shutil.which ('otool')
+       if ldd:
+               ldd = [ldd, '-L'] # otool -L
+       else:
+               print ('check-libstdc++.py: \'ldd\' not found; skipping test')
+               sys.exit (77)
+
+stat = 0
+tested = False
+
+# harfbuzz-icu links to libstdc++ because icu does.
+for soname in ['harfbuzz', 'harfbuzz-subset', 'harfbuzz-gobject']:
+       for suffix in ['so', 'dylib']:
+               so = os.path.join (libs, 'lib%s.%s' % (soname, suffix))
+               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])
+               if (b'libstdc++' in ldd_result) or (b'libc++' in ldd_result):
+                       print ('Ouch, %s is linked to libstdc++ or libc++' % so)
+                       stat = 1
+
+               tested = True
+
+if not tested:
+       print ('check-libstdc++.py: libharfbuzz shared library not found; skipping test')
+       sys.exit (77)
+
+sys.exit (stat)
diff --git a/src/check-libstdc++.sh b/src/check-libstdc++.sh
deleted file mode 100755 (executable)
index ce0bdab..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/sh
-
-LC_ALL=C
-export LC_ALL
-
-test -z "$srcdir" && srcdir=.
-test -z "$libs" && libs=.libs
-stat=0
-
-
-if which ldd 2>/dev/null >/dev/null; then
-       LDD=ldd
-else
-       # macOS specific tool
-       if which otool 2>/dev/null >/dev/null; then
-               LDD="otool -L"
-       else
-               echo "check-libstdc++.sh: 'ldd' not found; skipping test"
-               exit 77
-       fi
-fi
-
-tested=false
-# harfbuzz-icu links to libstdc++ because icu does.
-# harfbuzz-subset uses libstdc++.
-for soname in harfbuzz harfbuzz-gobject; do
-       for suffix in so dylib; do
-               so=$libs/lib$soname.$suffix
-               if ! test -f "$so"; then continue; fi
-
-               echo "Checking that we are not linking to libstdc++ or libc++ in $so"
-               if $LDD $so | grep 'libstdc[+][+]\|libc[+][+]'; then
-                       echo "Ouch, linked to libstdc++ or libc++"
-                       stat=1
-               fi
-               tested=true
-       done
-done
-if ! $tested; then
-       echo "check-libstdc++.sh: libharfbuzz shared library not found; skipping test"
-       exit 77
-fi
-
-exit $stat
diff --git a/src/check-static-inits.py b/src/check-static-inits.py
new file mode 100755 (executable)
index 0000000..9e43b81
--- /dev/null
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+
+import sys, os, shutil, subprocess, glob, re
+
+builddir = os.environ.get ('builddir', os.path.dirname (__file__))
+libs = os.environ.get ('libs', '.libs')
+
+objdump = shutil.which ('objdump')
+if not objdump:
+       print ('check-static-inits.py: \'ldd\' not found; skipping test')
+       sys.exit (77)
+
+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)
+if not OBJS:
+       print ('check-static-inits.py: object files not found; skipping test')
+       sys.exit (77)
+
+stat = 0
+
+for obj in OBJS:
+       result = subprocess.check_output ([objdump, '-t', obj]).decode ('utf-8')
+
+       # Checking that no object file has static initializers
+       for l in re.findall (r'^.*\.[cd]tors.*$', result, re.MULTILINE):
+               if not re.match (r'.*\b0+\b', l):
+                       print ('Ouch, %s has static initializers/finalizers' % obj)
+                       stat = 1
+
+       # Checking that no object file has lazy static C++ constructors/destructors or other such stuff
+       if ('__cxa_' in result) and ('__ubsan_handle' not in result):
+               print ('Ouch, %s has lazy static C++ constructors/destructors or other such stuff' % obj)
+               stat = 1
+
+sys.exit (stat)
diff --git a/src/check-static-inits.sh b/src/check-static-inits.sh
deleted file mode 100755 (executable)
index def25c7..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/sh
-
-LC_ALL=C
-export LC_ALL
-
-test -z "$srcdir" && srcdir=.
-test -z "$libs" && libs=.libs
-stat=0
-
-if which objdump 2>/dev/null >/dev/null; then
-       :
-else
-       echo "check-static-inits.sh: 'objdump' not found; skipping test"
-       exit 77
-fi
-
-OBJS=$libs/*.o
-if test "x`echo $OBJS`" = "x$OBJS" 2>/dev/null >/dev/null; then
-       echo "check-static-inits.sh: object files not found; skipping test"
-       exit 77
-fi
-
-echo "Checking that no object file has static initializers"
-for obj in $OBJS; do
-       if objdump -t "$obj" | grep '[.][cd]tors' | grep -v '\<00*\>'; then
-               echo "Ouch, $obj has static initializers/finalizers"
-               stat=1
-       fi
-done
-
-echo "Checking that no object file has lazy static C++ constructors/destructors or other such stuff"
-for obj in $OBJS; do
-       if objdump -t "$obj" | grep -q '__cxa_' && ! objdump -t "$obj" | grep -q __ubsan_handle; then
-               objdump -t "$obj" | grep '__cxa_'
-               echo "Ouch, $obj has lazy static C++ constructors/destructors or other such stuff"
-               stat=1
-       fi
-done
-
-exit $stat
diff --git a/src/check-symbols.py b/src/check-symbols.py
new file mode 100755 (executable)
index 0000000..92f44cd
--- /dev/null
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+
+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')
+
+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'])
+
+nm = shutil.which ('nm')
+if not nm:
+       print ('check-symbols.py: \'nm\' not found; skipping test')
+       sys.exit (77)
+
+cxxflit = shutil.which ('c++filt')
+
+tested = False
+stat = 0
+
+for soname in ['harfbuzz', 'harfbuzz-subset', 'harfbuzz-icu', 'harfbuzz-gobject']:
+       for suffix in ['so', 'dylib']:
+               so = os.path.join (builddir, libs, 'lib%s.%s' % (soname, suffix))
+               if not os.path.exists (so): continue
+
+               # On macOS, C symbols are prefixed with _
+               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)]
+
+               # run again c++flit also if is available
+               if cxxflit:
+                       EXPORTED_SYMBOLS = subprocess.check_output (
+                               [cxxflit], input='\n'.join (EXPORTED_SYMBOLS).encode ()
+                       ).decode ('utf-8').splitlines ()
+
+               prefix = (symprefix + os.path.basename (so)).replace ('libharfbuzz', 'hb').replace ('-', '_').split ('.')[0]
+
+               print ('Checking that %s does not expose internal symbols' % so)
+               suspicious_symbols = [x for x in EXPORTED_SYMBOLS if not re.match (r'^%s(_|$)' % prefix, x)]
+               if suspicious_symbols:
+                       print ('Ouch, internal symbols exposed:', suspicious_symbols)
+                       stat = 1
+
+               def_path = os.path.join (builddir, soname + '.def')
+               if not os.path.exists (def_path):
+                       print ('\'%s\' not found; skipping' % def_path)
+               else:
+                       print ('Checking that %s has the same symbol list as %s' % (so, def_path))
+                       with open (def_path, 'r', encoding='utf-8') as f: def_file = f.read ()
+                       diff_result = list (difflib.context_diff (
+                               def_file.splitlines (),
+                               ['EXPORTS'] + [re.sub ('^%shb' % symprefix, 'hb', x) for x in EXPORTED_SYMBOLS] +
+                                       # cheat: copy the last line from the def file!
+                                       [def_file.splitlines ()[-1]]
+                       ))
+
+                       if diff_result:
+                               print ('\n'.join (diff_result))
+                               stat = 1
+
+                       tested = True
+
+if not tested:
+       print ('check-symbols.sh: no shared libraries found; skipping test')
+       sys.exit (77)
+
+sys.exit (stat)
diff --git a/src/check-symbols.sh b/src/check-symbols.sh
deleted file mode 100755 (executable)
index f181b63..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/bin/sh
-
-LC_ALL=C
-export LC_ALL
-
-test -z "$srcdir" && srcdir=.
-test -z "$libs" && libs=.libs
-stat=0
-
-IGNORED_SYMBOLS='_fini\|_init\|_fdata\|_ftext\|_fbss\|__bss_start\|__bss_start__\|__bss_end__\|_edata\|_end\|_bss_end__\|__end__\|__gcov_.*\|llvm_.*'
-
-if which nm 2>/dev/null >/dev/null; then
-       :
-else
-       echo "check-symbols.sh: 'nm' not found; skipping test"
-       exit 77
-fi
-
-tested=false
-for soname in harfbuzz harfbuzz-subset harfbuzz-icu harfbuzz-gobject; do
-       for suffix in so dylib; do
-               so=$libs/lib$soname.$suffix
-               if ! test -f "$so"; then continue; fi
-
-               # On macOS, C symbols are prefixed with _
-               symprefix=
-               if test $suffix = dylib; then symprefix=_; fi
-
-               EXPORTED_SYMBOLS=`nm "$so" | grep ' [BCDGINRST] .' | grep -v " $symprefix\\($IGNORED_SYMBOLS\\>\\)" | cut -d' ' -f3 | c++filt`
-
-               prefix=$symprefix`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'`
-
-               echo "Checking that $so does not expose internal symbols"
-               if echo "$EXPORTED_SYMBOLS" | grep -v "^${prefix}\(_\|$\)"; then
-                       echo "Ouch, internal symbols exposed"
-                       stat=1
-               fi
-
-               def=$soname.def
-               if ! test -f "$def"; then
-                       echo "'$def' not found; skipping"
-               else
-                       echo "Checking that $so has the same symbol list as $def"
-                       {
-                               echo EXPORTS
-                               echo "$EXPORTED_SYMBOLS" | sed -e "s/^${symprefix}hb/hb/g"
-                               # cheat: copy the last line from the def file!
-                               tail -n1 "$def"
-                       } | c++filt | diff "$def" - >&2 || stat=1
-               fi
-
-               tested=true
-       done
-done
-if ! $tested; then
-       echo "check-symbols.sh: no shared libraries found; skipping test"
-       exit 77
-fi
-
-exit $stat
diff --git a/src/fix_get_types.py b/src/fix_get_types.py
new file mode 100644 (file)
index 0000000..208b9df
--- /dev/null
@@ -0,0 +1,15 @@
+#!/usr/bin/env python3
+
+import re
+import argparse
+
+parser = argparse.ArgumentParser ()
+parser.add_argument ('input')
+parser.add_argument ('output')
+args = parser.parse_args ()
+
+with open (args.input, 'r') as inp, open (args.output, 'w') as out:
+    for l in inp.readlines ():
+        l = re.sub ('_t_get_type', '_get_type', l)
+        l = re.sub ('_T \(', ' (', l)
+        out.write (l)
index ccecb40..50501ce 100755 (executable)
@@ -1,14 +1,19 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
-from __future__ import print_function, division, absolute_import
+"""usage: ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
 
-import io, os.path, sys
+Input files:
+* https://unicode.org/Public/UCD/latest/ucd/ArabicShaping.txt
+* https://unicode.org/Public/UCD/latest/ucd/UnicodeData.txt
+* https://unicode.org/Public/UCD/latest/ucd/Blocks.txt
+"""
+
+import os.path, sys
 
 if len (sys.argv) != 4:
-       print ("usage: ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt", file=sys.stderr)
-       sys.exit (1)
+       sys.exit (__doc__)
 
-files = [io.open (x, encoding='utf-8') for x in sys.argv[1:]]
+files = [open (x, encoding='utf-8') for x in sys.argv[1:]]
 
 headers = [[files[0].readline (), files[0].readline ()], [files[2].readline (), files[2].readline ()]]
 headers.append (["UnicodeData.txt does not have a header."])
@@ -61,7 +66,7 @@ def print_joining_table(f):
                values[u] = value
 
        short_value = {}
-       for value in set([v for v in values.values()] + ['JOINING_TYPE_X']):
+       for value in sorted (set ([v for v in values.values ()] + ['JOINING_TYPE_X'])):
                short = ''.join(x[0] for x in value.split('_')[2:])
                assert short not in short_value.values()
                short_value[value] = short
@@ -122,7 +127,7 @@ def print_joining_table(f):
        print ("}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy))
        print ()
 
-       page_bits = 12;
+       page_bits = 12
        print ()
        print ("static unsigned int")
        print ("joining_type (hb_codepoint_t u)")
index 9111c69..b6b8b20 100755 (executable)
@@ -1,11 +1,11 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
-from __future__ import print_function, division, absolute_import
+"usage: gen-def.py harfbuzz.def hb.h [hb-blob.h hb-buffer.h ...]"
 
-import io, os, re, sys
+import os, re, sys
 
 if len (sys.argv) < 3:
-       sys.exit("usage: gen-def.py harfbuzz.def hb.h [hb-blob.h hb-buffer.h ...]")
+       sys.exit(__doc__)
 
 output_file = sys.argv[1]
 header_paths = sys.argv[2:]
@@ -13,12 +13,37 @@ header_paths = sys.argv[2:]
 headers_content = []
 for h in header_paths:
        if h.endswith (".h"):
-               with io.open (h, encoding='utf-8') as f: headers_content.append (f.read ())
-
-symbols = "\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M)))
+               with open (h, encoding='utf-8') as f: headers_content.append (f.read ())
+
+symbols = sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M))
+if '--experimental-api' not in sys.argv:
+       # Move these to harfbuzz-sections.txt when got stable
+       experimental_symbols = \
+"""hb_font_draw_glyph
+hb_draw_funcs_t
+hb_draw_close_path_func_t
+hb_draw_cubic_to_func_t
+hb_draw_line_to_func_t
+hb_draw_move_to_func_t
+hb_draw_quadratic_to_func_t
+hb_draw_funcs_create
+hb_draw_funcs_destroy
+hb_draw_funcs_is_immutable
+hb_draw_funcs_make_immutable
+hb_draw_funcs_reference
+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 ()
+       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
 %s
-LIBRARY lib%s-0.dll""" % (symbols, output_file.replace ('.def', ''))
+LIBRARY lib%s-0.dll""" % (symbols, output_file.replace ('src/', '').replace ('.def', ''))
 
 with open (output_file, "w") as f: f.write (result)
index 49770d4..5b78bd3 100755 (executable)
@@ -1,14 +1,18 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
+
+"""usage: ./gen-emoji-table.py emoji-data.txt
+
+Input file:
+* https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt
+"""
 
-from __future__ import print_function, division, absolute_import
 import sys
 import os.path
 from collections import OrderedDict
 import packTab
 
 if len (sys.argv) != 2:
-       print("usage: ./gen-emoji-table.py emoji-data.txt", file=sys.stderr)
-       sys.exit (1)
+       sys.exit (__doc__)
 
 f = open(sys.argv[1])
 header = [f.readline () for _ in range(10)]
diff --git a/src/gen-harfbuzzcc.py b/src/gen-harfbuzzcc.py
new file mode 100755 (executable)
index 0000000..a156c5d
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env python3
+
+"usage: gen-harfbuzzcc.py harfbuzz.cc hb-blob.cc hb-buffer.cc ..."
+
+import os, re, sys
+
+os.chdir (os.path.dirname (__file__))
+
+if len (sys.argv) < 3:
+       sys.exit (__doc__)
+
+output_file = sys.argv[1]
+source_paths = sys.argv[2:]
+
+with open (output_file, "wb") as f:
+       f.write ("".join ('#include "{}"\n'.format (x)
+                                         for x in source_paths
+                                         if x.endswith (".cc")).encode ())
diff --git a/src/gen-hb-version.py b/src/gen-hb-version.py
new file mode 100755 (executable)
index 0000000..f21e5de
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+
+"usage: gen-hb-version.py 1.0.0 hb-version.h.in hb-version.h"
+
+import os, re, sys
+
+os.chdir (os.path.dirname (__file__))
+
+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)
index 912b1d7..1746aab 100755 (executable)
@@ -1,12 +1,17 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
-from __future__ import print_function, division, absolute_import
+"""usage: ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
 
-import io, sys
+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/Blocks.txt
+"""
+
+import sys
 
 if len (sys.argv) != 4:
-       print ("usage: ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt", file=sys.stderr)
-       sys.exit (1)
+       sys.exit (__doc__)
 
 ALLOWED_SINGLES = [0x00A0, 0x25CC]
 ALLOWED_BLOCKS = [
@@ -32,7 +37,7 @@ ALLOWED_BLOCKS = [
        'Myanmar Extended-A',
 ]
 
-files = [io.open (x, encoding='utf-8') for x in sys.argv[1:]]
+files = [open (x, encoding='utf-8') for x in sys.argv[1:]]
 
 headers = [[f.readline () for i in range (2)] for f in files]
 
index 515f4ca..21aa1b9 100755 (executable)
@@ -1,22 +1,13 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 
-# -*- coding: utf-8 -*-
+"""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
+(https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ur).
+"""
 
-# 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
-# (https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ur).
-
-from __future__ import print_function, division, absolute_import
-
-import io
 import re
 import sys
 
-try:
-  reload(sys)
-  sys.setdefaultencoding('utf-8')
-except NameError:
-  pass  # Python 3
 
 print ("""static OS2Range _hb_os2_unicode_ranges[] =
 {""")
@@ -24,9 +15,9 @@ print ("""static OS2Range _hb_os2_unicode_ranges[] =
 args = sys.argv[1:]
 input_file = args[0]
 
-with io.open(input_file, mode="r", encoding="utf-8") as f:
+with open (input_file, mode="r", encoding="utf-8") as f:
 
-  all_ranges = [];
+  all_ranges = []
   current_bit = 0
   while True:
     line = f.readline().strip()
diff --git a/src/gen-ragel-artifacts.py b/src/gen-ragel-artifacts.py
new file mode 100755 (executable)
index 0000000..5833714
--- /dev/null
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+
+import os, re, sys, subprocess, shutil, tempfile
+
+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')
+
+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 ()
+
+       generated_path = os.path.join (tempdir, hh)
+       with open (generated_path, "rb") as temp_file:
+               generated = temp_file.read()
+
+       with open (hh, "rb") as current_file:
+               current = current_file.read()
+
+       # overwrite only if is changed
+       if generated != current:
+               shutil.copyfile (generated_path, hh)
+
+shutil.rmtree (tempdir)
index 49f5b30..401f4ca 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 
 """Generator of the mapping from OpenType tags to BCP 47 tags and vice
 versa.
@@ -16,37 +16,30 @@ back to BCP 47 tags. Ambiguous OpenType tags (those that correspond to
 multiple BCP 47 tags) are listed here, except when the alphabetically
 first BCP 47 tag happens to be the chosen disambiguated tag. In that
 case, the fallback behavior will choose the right tag anyway.
-"""
 
-from __future__ import absolute_import, division, print_function, unicode_literals
+usage: ./gen-tag-table.py languagetags language-subtag-registry
+
+Input files:
+* https://docs.microsoft.com/en-us/typography/opentype/spec/languagetags
+* https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
+"""
 
 import collections
-try:
-       from HTMLParser import HTMLParser
-       def write (s):
-               print (s.encode ('utf-8'), end='')
-except ImportError:
-       from html.parser import HTMLParser
-       def write (s):
-               sys.stdout.flush ()
-               sys.stdout.buffer.write (s.encode ('utf-8'))
-import io
+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
 import unicodedata
 
 if len (sys.argv) != 3:
-       print ('usage: ./gen-tag-table.py languagetags language-subtag-registry', file=sys.stderr)
-       sys.exit (1)
+       sys.exit (__doc__)
 
-try:
-       from html import unescape
-       def html_unescape (parser, entity):
-               return unescape (entity)
-except ImportError:
-       def html_unescape (parser, entity):
-               return parser.unescape (entity)
+from html import unescape
+def html_unescape (parser, entity):
+       return unescape (entity)
 
 def expect (condition, message=None):
        if not condition:
@@ -54,7 +47,7 @@ def expect (condition, message=None):
                        raise AssertionError
                raise AssertionError (message)
 
-# from http://www-01.sil.org/iso639-3/iso-639-3.tab
+# from https://www-01.sil.org/iso639-3/iso-639-3.tab
 ISO_639_3_TO_1 = {
        'aar': 'aa',
        'abk': 'ab',
@@ -399,7 +392,7 @@ class OpenTypeRegistryParser (HTMLParser):
                Args:
                        filename (str): The file name of the registry.
                """
-               with io.open (filename, encoding='utf-8') as f:
+               with open (filename, encoding='utf-8') as f:
                        self.feed (f.read ())
                expect (self.header)
                for tag, iso_codes in self.to_bcp_47.items ():
@@ -541,7 +534,7 @@ class BCP47Parser (object):
                Args:
                        filename (str): The file name of the registry.
                """
-               with io.open (filename, encoding='utf-8') as f:
+               with open (filename, encoding='utf-8') as f:
                        subtag_type = None
                        subtag = None
                        deprecated = False
@@ -754,7 +747,7 @@ ot.add_language ('und-Syre', 'SYRE')
 ot.add_language ('und-Syrj', 'SYRJ')
 ot.add_language ('und-Syrn', 'SYRN')
 
-bcp_47.names['xst'] = u"Silt'e"
+bcp_47.names['xst'] = "Silt'e"
 bcp_47.scopes['xst'] = ' (retired code)'
 bcp_47.macrolanguages['xst'] = {'stv', 'wle'}
 
@@ -814,6 +807,7 @@ disambiguation = {
        'HAL': 'cfm',
        'HND': 'hnd',
        'KIS': 'kqs',
+       'KUI': 'uki',
        'LRC': 'bqi',
        'NDB': 'nd',
        'NIS': 'njz',
@@ -861,7 +855,7 @@ def hb_tag (tag):
        Returns:
                A snippet of C++ representing ``tag``.
        """
-       return u"HB_TAG('%s','%s','%s','%s')" % tuple (('%-4s' % tag)[:4])
+       return "HB_TAG('%s','%s','%s','%s')" % tuple (('%-4s' % tag)[:4])
 
 def get_variant_set (name):
        """Return a set of variant language names from a name.
@@ -873,7 +867,7 @@ def get_variant_set (name):
        Returns:
                A set of normalized language names.
        """
-       return set (unicodedata.normalize ('NFD', n.replace ('\u2019', u"'"))
+       return set (unicodedata.normalize ('NFD', n.replace ('\u2019', "'"))
                        .encode ('ASCII', 'ignore')
                        .strip ()
                        for n in re.split ('[\n(),]', name) if n)
index 552c3c6..402de33 100755 (executable)
@@ -1,14 +1,17 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
-from __future__ import print_function, division, absolute_import
+"""usage: ./gen-ucd-table ucd.nounihan.grouped.xml [/path/to/hb-common.h]
 
-import io, os.path, sys, re
+Input file:
+* https://unicode.org/Public/UCD/latest/ucdxml/ucd.nounihan.grouped.zip
+"""
+
+import os.path, sys, re
 import logging
 logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
 
 if len (sys.argv) not in (2, 3):
-       print("usage: ./gen-ucd-table ucd.nounihan.grouped.xml [/path/to/hb-common.h]", file=sys.stderr)
-       sys.exit(1)
+       sys.exit (__doc__)
 
 # https://github.com/harfbuzz/packtab
 import packTab
index 4523fb8..19ad263 100755 (executable)
@@ -1,18 +1,23 @@
-#!/usr/bin/env python
-# flake8: noqa
+#!/usr/bin/env python3
+# flake8: noqa: F821
 
-from __future__ import print_function, division, absolute_import
+"""usage: ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt
+
+Input file:
+* 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/UnicodeData.txt
+* https://unicode.org/Public/UCD/latest/ucd/Blocks.txt
+"""
 
-import io
 import sys
 
 if len (sys.argv) != 5:
-       print ("usage: ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt", file=sys.stderr)
-       sys.exit (1)
+       sys.exit (__doc__)
 
 BLACKLISTED_BLOCKS = ["Thai", "Lao"]
 
-files = [io.open (x, encoding='utf-8') for x in sys.argv[1:]]
+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.append (["UnicodeData.txt does not have a header."])
@@ -138,6 +143,7 @@ property_names = [
        'Top',
        'Bottom',
        'Top_And_Bottom',
+       'Top_And_Bottom_And_Left',
        'Top_And_Right',
        'Top_And_Left',
        'Top_And_Left_And_Right',
@@ -147,18 +153,13 @@ property_names = [
        'Overstruck',
 ]
 
-try:
-       basestring
-except NameError:
-       basestring = str
-
 class PropertyValue(object):
        def __init__(self, name_):
                self.name = name_
        def __str__(self):
                return self.name
        def __eq__(self, other):
-               return self.name == (other if isinstance(other, basestring) else other.name)
+               return self.name == (other if isinstance(other, str) else other.name)
        def __ne__(self, other):
                return not (self == other)
        def __hash__(self):
@@ -298,9 +299,9 @@ use_positions = {
        },
        'M': {
                'Abv': [Top],
-               'Blw': [Bottom, Bottom_And_Left],
+               'Blw': [Bottom, Bottom_And_Left, Bottom_And_Right],
                'Pst': [Right],
-               'Pre': [Left],
+               'Pre': [Left, Top_And_Bottom_And_Left],
        },
        'CM': {
                'Abv': [Top],
@@ -340,11 +341,11 @@ def map_to_use(data):
 
                # Resolve Indic_Syllabic_Category
 
-               # TODO: These don't have UISC assigned in Unicode 12.0, but have UIPC
+               # TODO: These don't have UISC assigned in Unicode 13.0.0, but have UIPC
                if 0x1CE2 <= U <= 0x1CE8: UISC = Cantillation_Mark
 
                # Tibetan:
-               # TODO: These don't have UISC assigned in Unicode 12.0, but have UIPC
+               # 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
@@ -377,24 +378,21 @@ def map_to_use(data):
 
                # Resolve Indic_Positional_Category
 
-               # TODO: These should die, but have UIPC in Unicode 12.0
+               # TODO: These should die, but have UIPC in Unicode 13.0.0
                if U in [0x953, 0x954]: UIPC = Not_Applicable
 
-               # TODO: In USE's override list but not in Unicode 12.0
-               if U == 0x103C: UIPC = Left
-
                # 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 12.0
+               # 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
                #  and https://github.com/harfbuzz/harfbuzz/issues/1631
                if U in [0x11302, 0x11303, 0x114C1]: UIPC = Top
-               if U == 0x1171E: UIPC = Left
                if 0x1CF8 <= U <= 0x1CF9: UIPC = Top
 
                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)
 
                pos_mapping = use_positions.get(USE, None)
index 8ca90c8..7f23dc8 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 
 """Generator of the function to prohibit certain vowel sequences.
 
@@ -6,29 +6,25 @@ It creates ``_hb_preprocess_text_vowel_constraints``, which inserts dotted
 circles into sequences prohibited by the USE script development spec.
 This function should be used as the ``preprocess_text`` of an
 ``hb_ot_complex_shaper_t``.
-"""
 
-from __future__ import absolute_import, division, print_function, unicode_literals
+usage: ./gen-vowel-constraints.py ms-use/IndicShapingInvalidCluster.txt Scripts.txt
+
+Input file:
+* https://unicode.org/Public/UCD/latest/ucd/Scripts.txt
+"""
 
 import collections
-try:
-       from HTMLParser import HTMLParser
-       def write (s):
-               print (s.encode ('utf-8'), end='')
-except ImportError:
-       from html.parser import HTMLParser
-       def write (s):
-               sys.stdout.flush ()
-               sys.stdout.buffer.write (s.encode ('utf-8'))
+from html.parser import HTMLParser
+def write (s):
+       sys.stdout.flush ()
+       sys.stdout.buffer.write (s.encode ('utf-8'))
 import itertools
-import io
 import sys
 
 if len (sys.argv) != 3:
-       print ('usage: ./gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt', file=sys.stderr)
-       sys.exit (1)
+       sys.exit (__doc__)
 
-with io.open (sys.argv[2], encoding='utf-8') as f:
+with open (sys.argv[2], encoding='utf-8') as f:
        scripts_header = [f.readline () for i in range (2)]
        scripts = {}
        script_order = {}
@@ -84,7 +80,8 @@ class ConstraintSet (object):
                        else:
                                self._c[first] = ConstraintSet (rest)
 
-       def _indent (self, depth):
+       @staticmethod
+       def _indent (depth):
                return ('  ' * depth).replace ('        ', '\t')
 
        def __str__ (self, index=0, depth=4):
@@ -92,19 +89,22 @@ class ConstraintSet (object):
                indent = self._indent (depth)
                if isinstance (self._c, list):
                        if len (self._c) == 0:
+                               assert index == 2, 'Cannot use `matched` for this constraint; the general case has not been implemented'
                                s.append ('{}matched = true;\n'.format (indent))
                        elif len (self._c) == 1:
+                               assert index == 1, 'Cannot use `matched` for this constraint; the general case has not been implemented'
                                s.append ('{}matched = 0x{:04X}u == buffer->cur ({}).codepoint;\n'.format (indent, next (iter (self._c)), index or ''))
                        else:
-                               s.append ('{}if (0x{:04X}u == buffer->cur ({}).codepoint &&\n'.format (indent, self._c[0], index))
-                               s.append ('{}buffer->idx + {} < count &&\n'.format (self._indent (depth + 2), len (self._c)))
+                               s.append ('{}if (0x{:04X}u == buffer->cur ({}).codepoint &&\n'.format (indent, self._c[0], index or ''))
+                               if index:
+                                       s.append ('{}buffer->idx + {} < count &&\n'.format (self._indent (depth + 2), index + 1))
                                for i, cp in enumerate (self._c[1:], start=1):
                                        s.append ('{}0x{:04X}u == buffer->cur ({}).codepoint{}\n'.format (
                                                self._indent (depth + 2), cp, index + i, ')' if i == len (self._c) - 1 else ' &&'))
                                s.append ('{}{{\n'.format (indent))
-                               for i in range (len (self._c)):
+                               for i in range (index):
                                        s.append ('{}buffer->next_glyph ();\n'.format (self._indent (depth + 1)))
-                               s.append ('{}_output_dotted_circle (buffer);\n'.format (self._indent (depth + 1)))
+                               s.append ('{}matched = true;\n'.format (self._indent (depth + 1)))
                                s.append ('{}}}\n'.format (indent))
                else:
                        s.append ('{}switch (buffer->cur ({}).codepoint)\n'.format(indent, index or ''))
@@ -127,8 +127,13 @@ class ConstraintSet (object):
                return ''.join (s)
 
 constraints = {}
-with io.open (sys.argv[1], encoding='utf-8') as f:
-       constraints_header = [f.readline ().strip () for i in range (2)]
+with open (sys.argv[1], encoding='utf-8') as f:
+       constraints_header = []
+       while True:
+               line = f.readline ().strip ()
+               if line == '#':
+                       break
+               constraints_header.append(line)
        for line in f:
                j = line.find ('#')
                if j >= 0:
@@ -147,7 +152,7 @@ print ('/* == Start of generated functions == */')
 print ('/*')
 print (' * The following functions are generated by running:')
 print (' *')
-print (' *   %s use Scripts.txt' % sys.argv[0])
+print (' *   %s ms-use/IndicShapingInvalidCluster.txt Scripts.txt' % sys.argv[0])
 print (' *')
 print (' * on files with these headers:')
 print (' *')
@@ -185,7 +190,7 @@ print ('_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB
 print ('\t\t\t\t       hb_buffer_t              *buffer,')
 print ('\t\t\t\t       hb_font_t                *font HB_UNUSED)')
 print ('{')
-print ('#if defined(HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS)')
+print ('#ifdef HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS')
 print ('  return;')
 print ('#endif')
 print ('  if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)')
index 251a065..6a07a9e 100644 (file)
@@ -4,6 +4,7 @@
 #include "hb-buffer-serialize.cc"
 #include "hb-buffer.cc"
 #include "hb-common.cc"
+#include "hb-draw.cc"
 #include "hb-face.cc"
 #include "hb-fallback-shape.cc"
 #include "hb-font.cc"
index 604d5bc..4bc97b7 100644 (file)
@@ -65,7 +65,7 @@ struct FontDescriptor
   protected:
   Tag          tag;            /* The 4-byte table tag name. */
   union {
-  HBFixed              value;          /* The value for the descriptor tag. */
+  HBFixed      value;          /* The value for the descriptor tag. */
   HBUINT32     nalfType;       /* If the tag is `nalf`, see non_alphabetic_value_t */
   } u;
   public:
@@ -80,10 +80,10 @@ struct fdsc
     Weight      = HB_TAG ('w','g','h','t'),
                                /* Percent weight relative to regular weight.
                                 * (defaul value: 1.0) */
-    Width       = HB_TAG ('w','d','t','h'),
+    Width       = HB_TAG ('w','d','t','h'),
                                /* Percent width relative to regular width.
                                 * (default value: 1.0) */
-    Slant       = HB_TAG ('s','l','n','t'),
+    Slant       = HB_TAG ('s','l','n','t'),
                                /* Angle of slant in degrees, where positive
                                 * is clockwise from straight up.
                                 * (default value: 0.0) */
@@ -108,7 +108,7 @@ struct fdsc
   }
 
   protected:
-  HBFixed              version;        /* Version number of the font descriptors
+  HBFixed      version;        /* Version number of the font descriptors
                                 * table (0x00010000 for the current version). */
   LArrayOf<FontDescriptor>
                descriptors;    /* List of tagged-coordinate pairs style descriptors
index ef98884..f2785a6 100644 (file)
@@ -66,7 +66,7 @@ struct ankr
   {
     const NNOffsetTo<GlyphAnchors> *offset = (this+lookupTable).get_value (glyph_id, num_glyphs);
     if (!offset)
-      return Null(Anchor);
+      return Null (Anchor);
     const GlyphAnchors &anchors = &(this+anchorData) + *offset;
     return anchors[i];
   }
@@ -81,7 +81,7 @@ struct ankr
   }
 
   protected:
-  HBUINT16     version;        /* Version number (set to zero) */
+  HBUINT16     version;        /* Version number (set to zero) */
   HBUINT16     flags;          /* Flags (currently unused; set to zero) */
   LOffsetTo<Lookup<NNOffsetTo<GlyphAnchors>>>
                lookupTable;    /* Offset to the table's lookup table */
index 473f2cd..f186917 100644 (file)
@@ -303,7 +303,7 @@ struct LookupFormat10
   const typename T::type get_value_or_null (hb_codepoint_t glyph_id) const
   {
     if (!(firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount))
-      return Null(T);
+      return Null (T);
 
     const HBUINT8 *p = &valueArrayZ[(glyph_id - firstGlyph) * valueSize];
 
@@ -358,7 +358,7 @@ struct Lookup
       case 10: return u.format10.get_value_or_null (glyph_id);
       default:
       const T *v = get_value (glyph_id, num_glyphs);
-      return v ? *v : Null(T);
+      return v ? *v : Null (T);
     }
   }
 
@@ -825,7 +825,7 @@ struct hb_aat_apply_context_t :
   HB_INTERNAL hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_,
                                      hb_font_t *font_,
                                      hb_buffer_t *buffer_,
-                                     hb_blob_t *blob = const_cast<hb_blob_t *> (&Null(hb_blob_t)));
+                                     hb_blob_t *blob = const_cast<hb_blob_t *> (&Null (hb_blob_t)));
 
   HB_INTERNAL ~hb_aat_apply_context_t ();
 
index 788d408..359e859 100644 (file)
@@ -129,6 +129,11 @@ struct FeatureName
 
   hb_ot_name_id_t get_feature_name_id () const { return nameIndex; }
 
+  bool is_exclusive () const { return featureFlags & Exclusive; }
+
+  /* A FeatureName with no settings is meaningless */
+  bool has_data () const { return nSettings; }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -139,7 +144,7 @@ struct FeatureName
   protected:
   HBUINT16     feature;        /* Feature type. */
   HBUINT16     nSettings;      /* The number of records in the setting name array. */
-  LOffsetTo<UnsizedArrayOf<SettingName>, false>
+  LNNOffsetTo<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
@@ -172,6 +177,9 @@ struct feat
     return featureNameCount;
   }
 
+  bool exposes_feature (hb_aat_layout_feature_type_t feature_type) const
+  { return get_feature (feature_type).has_data (); }
+
   const FeatureName& get_feature (hb_aat_layout_feature_type_t feature_type) const
   { return namesZ.bsearch (featureNameCount, feature_type); }
 
index e1787d1..49506e9 100644 (file)
@@ -51,10 +51,10 @@ struct ActionSubrecordHeader
     return_trace (likely (c->check_struct (this)));
   }
 
-  HBUINT16     actionClass;    /* The JustClass value associated with this
+  HBUINT16     actionClass;    /* The JustClass value associated with this
                                 * ActionSubrecord. */
-  HBUINT16     actionType;     /* The type of postcompensation action. */
-  HBUINT16     actionLength;   /* Length of this ActionSubrecord record, which
+  HBUINT16     actionType;     /* The type of postcompensation action. */
+  HBUINT16     actionLength;   /* Length of this ActionSubrecord record, which
                                 * must be a multiple of 4. */
   public:
   DEFINE_SIZE_STATIC (6);
@@ -70,11 +70,11 @@ struct DecompositionAction
 
   ActionSubrecordHeader
                header;
-  HBFixed              lowerLimit;     /* If the distance factor is less than this value,
+  HBFixed      lowerLimit;     /* If the distance factor is less than this value,
                                 * then the ligature is decomposed. */
-  HBFixed              upperLimit;     /* If the distance factor is greater than this value,
+  HBFixed      upperLimit;     /* If the distance factor is greater than this value,
                                 * then the ligature is decomposed. */
-  HBUINT16     order;          /* Numerical order in which this ligature will
+  HBUINT16     order;          /* Numerical order in which this ligature will
                                 * be decomposed; you may want infrequent ligatures
                                 * to decompose before more frequent ones. The ligatures
                                 * on the line of text will decompose in increasing
@@ -118,14 +118,14 @@ struct ConditionalAddGlyphAction
   protected:
   ActionSubrecordHeader
                header;
-  HBFixed      substThreshold; /* Distance growth factor (in ems) at which
+  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
+  HBGlyphID    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
+  HBGlyphID    substGlyph;     /* Glyph to be substituted for this glyph if the
                                 * growth factor equals or exceeds the value of
                                 * substThreshold. */
   public:
@@ -143,16 +143,16 @@ struct DuctileGlyphAction
   protected:
   ActionSubrecordHeader
                header;
-  HBUINT32     variationAxis;  /* The 4-byte tag identifying the ductile axis.
+  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 tha
                                 * still yields an acceptable appearance. Normally
                                 * this will be 1.0. */
-  HBFixed      noStretchValue; /* This is the default value that corresponds to
+  HBFixed      noStretchValue; /* This is the default value that corresponds to
                                 * no change in appearance. Normally, this will
                                 * be 1.0. */
-  HBFixed      maximumLimit;   /* The highest value for the ductility axis that
+  HBFixed      maximumLimit;   /* The highest value for the ductility axis that
                                 * still yields an acceptable appearance. */
   public:
   DEFINE_SIZE_STATIC (22);
@@ -169,8 +169,8 @@ struct RepeatedAddGlyphAction
   protected:
   ActionSubrecordHeader
                header;
-  HBUINT16     flags;          /* Currently unused; set to 0. */
-  HBGlyphID    glyph;          /* Glyph that should be added if the distance factor
+  HBUINT16     flags;          /* Currently unused; set to 0. */
+  HBGlyphID    glyph;          /* Glyph that should be added if the distance factor
                                 * is growing. */
   public:
   DEFINE_SIZE_STATIC (10);
@@ -271,14 +271,14 @@ struct JustWidthDeltaEntry
   };
 
   protected:
-  HBFixed              beforeGrowLimit;/* The ratio by which the advance width of the
+  HBFixed      beforeGrowLimit;/* The ratio by which the advance width of the
                                 * glyph is permitted to grow on the left or top side. */
-  HBFixed              beforeShrinkLimit;
+  HBFixed      beforeShrinkLimit;
                                /* The ratio by which the advance width of the
                                 * glyph is permitted to shrink on the left or top side. */
-  HBFixed              afterGrowLimit; /* The ratio by which the advance width of the glyph
+  HBFixed      afterGrowLimit; /* The ratio by which the advance width of the glyph
                                 * is permitted to shrink on the left or top side. */
-  HBFixed              afterShrinkLimit;
+  HBFixed      afterShrinkLimit;
                                /* The ratio by which the advance width of the glyph
                                 * is at most permitted to shrink on the right or
                                 * bottom side. */
@@ -361,7 +361,7 @@ struct JustificationHeader
   OffsetTo<JustificationCategory>
                justClassTable; /* Offset to the justification category state table. */
   OffsetTo<WidthDeltaCluster>
-               wdcTable;       /* Offset from start of justification table to start
+               wdcTable;       /* Offset from start of justification table to start
                                 * of the subtable containing the width delta factors
                                 * for the glyphs in your font.
                                 *
@@ -372,7 +372,7 @@ struct JustificationHeader
                                 *
                                 * The postcompensation subtable, if present in the font. */
   Lookup<OffsetTo<WidthDeltaCluster>>
-               lookupTable;    /* Lookup table associating glyphs with width delta
+               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. */
 
@@ -397,7 +397,7 @@ struct just
   protected:
   FixedVersion<>version;       /* Version of the justification table
                                 * (0x00010000u for version 1.0). */
-  HBUINT16     format;         /* Format of the justification table (set to 0). */
+  HBUINT16     format;         /* Format of the justification table (set to 0). */
   OffsetTo<JustificationHeader>
                horizData;      /* Byte offset from the start of the justification table
                                 * to the header for tables that contain justification
index be1b339..6ad32b3 100644 (file)
@@ -281,35 +281,28 @@ struct KerxSubTableFormat1
 
          hb_glyph_position_t &o = buffer->pos[idx];
 
-         /* Testing shows that CoreText only applies kern (cross-stream or not)
-          * if none has been applied by previous subtables.  That is, it does
-          * NOT seem to accumulate as otherwise implied by specs. */
-
-         /* The following flag is undocumented in the spec, but described
-          * in the 'kern' table example. */
-         if (v == -0x8000)
-         {
-           o.attach_type() = ATTACH_TYPE_NONE;
-           o.attach_chain() = 0;
-           o.x_offset = o.y_offset = 0;
-         }
-         else if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+         if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
          {
            if (crossStream)
            {
-             if (buffer->pos[idx].attach_type() && !buffer->pos[idx].y_offset)
+             /* The following flag is undocumented in the spec, but described
+              * in the 'kern' table example. */
+             if (v == -0x8000)
              {
-               o.y_offset = c->font->em_scale_y (v);
+               o.attach_type() = ATTACH_TYPE_NONE;
+               o.attach_chain() = 0;
+               o.y_offset = 0;
+             }
+             else if (o.attach_type())
+             {
+               o.y_offset += c->font->em_scale_y (v);
                buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
              }
            }
            else if (buffer->info[idx].mask & kern_mask)
            {
-             if (!buffer->pos[idx].x_offset)
-             {
-               buffer->pos[idx].x_advance += c->font->em_scale_x (v);
-               buffer->pos[idx].x_offset += c->font->em_scale_x (v);
-             }
+             o.x_advance += c->font->em_scale_x (v);
+             o.x_offset += c->font->em_scale_x (v);
            }
          }
          else
@@ -317,19 +310,22 @@ struct KerxSubTableFormat1
            if (crossStream)
            {
              /* CoreText doesn't do crossStream kerning in vertical.  We do. */
-             if (buffer->pos[idx].attach_type() && !buffer->pos[idx].x_offset)
+             if (v == -0x8000)
+             {
+               o.attach_type() = ATTACH_TYPE_NONE;
+               o.attach_chain() = 0;
+               o.x_offset = 0;
+             }
+             else if (o.attach_type())
              {
-               o.x_offset = c->font->em_scale_x (v);
+               o.x_offset += c->font->em_scale_x (v);
                buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
              }
            }
            else if (buffer->info[idx].mask & kern_mask)
            {
-             if (!buffer->pos[idx].y_offset)
-             {
-               buffer->pos[idx].y_advance += c->font->em_scale_y (v);
-               buffer->pos[idx].y_offset += c->font->em_scale_y (v);
-             }
+             o.y_advance += c->font->em_scale_y (v);
+             o.y_offset += c->font->em_scale_y (v);
            }
          }
        }
index 7063b38..90cfd92 100644 (file)
@@ -116,6 +116,8 @@ 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,
@@ -123,6 +125,13 @@ struct lcar
                               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,
index d8df579..9d04c71 100644 (file)
@@ -948,8 +948,10 @@ struct Chain
        hb_aat_layout_feature_type_t type = (hb_aat_layout_feature_type_t) (unsigned int) feature.featureType;
        hb_aat_layout_feature_selector_t setting = (hb_aat_layout_feature_selector_t) (unsigned int) feature.featureSetting;
       retry:
-       const hb_aat_map_builder_t::feature_info_t *info = map->features.bsearch (type);
-       if (info && info->setting == setting)
+       // Check whether this type/setting pair was requested in the map, and if so, apply its flags.
+       // (The search here only looks at the type and setting fields of feature_info_t.)
+       hb_aat_map_builder_t::feature_info_t info = { type, setting, false, 0 };
+       if (map->features.bsearch (info))
        {
          flags &= feature.disableFlags;
          flags |= feature.enableFlags;
index 4e02340..8c04a64 100644 (file)
@@ -160,8 +160,8 @@ struct opbd
                                 * Format 0 indicates distance and Format 1 indicates
                                 * control point. */
   union {
-  opbdFormat0 format0;
-  opbdFormat1 format1;
+  opbdFormat0  format0;
+  opbdFormat1  format1;
   } u;
   public:
   DEFINE_SIZE_MIN (8);
index 99dddd8..baa1c72 100644 (file)
@@ -62,7 +62,7 @@ struct TrackTableEntry
   }
 
   protected:
-  HBFixed              track;          /* Track value for this record. */
+  HBFixed      track;          /* Track value for this record. */
   NameID       trackNameID;    /* The 'name' table index for this track.
                                 * (a short word or phrase like "loose"
                                 * or "very tight") */
@@ -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. */
-  LOffsetTo<UnsizedArrayOf<HBFixed>, false>
+  LNNOffsetTo<UnsizedArrayOf<HBFixed>>
                sizeTable;      /* Offset from start of the tracking table to
                                 * Array[nSizes] of size values.. */
   UnsizedArrayOf<TrackTableEntry>
@@ -210,8 +210,8 @@ struct trak
 
   protected:
   FixedVersion<>version;       /* Version of the tracking table
-                                        * (0x00010000u for version 1.0). */
-  HBUINT16     format;         /* Format of the tracking table (set to 0). */
+                                * (0x00010000u for version 1.0). */
+  HBUINT16     format;         /* Format of the tracking table (set to 0). */
   OffsetTo<TrackData>
                horizData;      /* Offset from start of tracking table to TrackData
                                 * for horizontal text (or 0 if none). */
index 4e506de..49c908f 100644 (file)
@@ -55,7 +55,7 @@ AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *p
                                                       face (font->face),
                                                       buffer (buffer_),
                                                       sanitizer (),
-                                                      ankr_table (&Null(AAT::ankr)),
+                                                      ankr_table (&Null (AAT::ankr)),
                                                       lookup_index (0),
                                                       debug_depth (0)
 {
@@ -172,11 +172,7 @@ static const hb_aat_feature_mapping_t feature_mappings[] =
 const hb_aat_feature_mapping_t *
 hb_aat_layout_find_feature_mapping (hb_tag_t tag)
 {
-  return (const hb_aat_feature_mapping_t *) hb_bsearch (&tag,
-                                                       feature_mappings,
-                                                       ARRAY_LENGTH (feature_mappings),
-                                                       sizeof (feature_mappings[0]),
-                                                       hb_aat_feature_mapping_t::cmp);
+  return hb_sorted_array (feature_mappings).bsearch (tag);
 }
 #endif
 
index 8310bfc..5e4e3bd 100644 (file)
@@ -39,14 +39,8 @@ struct hb_aat_feature_mapping_t
   hb_aat_layout_feature_selector_t selectorToEnable;
   hb_aat_layout_feature_selector_t selectorToDisable;
 
-  HB_INTERNAL static int cmp (const void *key_, const void *entry_)
-  {
-    hb_tag_t key = * (unsigned int *) key_;
-    const hb_aat_feature_mapping_t * entry = (const hb_aat_feature_mapping_t *) entry_;
-    return key < entry->otFeatureTag ? -1 :
-          key > entry->otFeatureTag ? 1 :
-          0;
-  }
+  int cmp (hb_tag_t key) const
+  { return key < otFeatureTag ? -1 : key > otFeatureTag ? 1 : 0; }
 };
 
 HB_INTERNAL const hb_aat_feature_mapping_t *
index bc87935..2c38c35 100644 (file)
 #include "hb-aat-map.hh"
 
 #include "hb-aat-layout.hh"
+#include "hb-aat-layout-feat-table.hh"
 
 
-void hb_aat_map_builder_t::add_feature (hb_tag_t tag,
-                                       unsigned int value)
+void hb_aat_map_builder_t::add_feature (hb_tag_t tag, unsigned value)
 {
+  if (!face->table.feat->has_data ()) return;
+
   if (tag == HB_TAG ('a','a','l','t'))
   {
+    if (!face->table.feat->exposes_feature (HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES))
+      return;
     feature_info_t *info = features.push();
     info->type = HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES;
     info->setting = (hb_aat_layout_feature_selector_t) value;
+    info->seq = features.length;
+    info->is_exclusive = true;
     return;
   }
 
   const hb_aat_feature_mapping_t *mapping = hb_aat_layout_find_feature_mapping (tag);
   if (!mapping) return;
 
+  const AAT::FeatureName* feature = &face->table.feat->get_feature (mapping->aatFeatureType);
+  if (!feature->has_data ())
+  {
+    /* Special case: Chain::compile_flags will fall back to the deprecated version of
+     * small-caps if necessary, so we need to check for that possibility.
+     * https://github.com/harfbuzz/harfbuzz/issues/2307 */
+    if (mapping->aatFeatureType == HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE &&
+       mapping->selectorToEnable == HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS)
+    {
+      feature = &face->table.feat->get_feature (HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE);
+      if (!feature->has_data ()) return;
+    }
+    else return;
+  }
+
   feature_info_t *info = features.push();
   info->type = mapping->aatFeatureType;
   info->setting = value ? mapping->selectorToEnable : mapping->selectorToDisable;
+  info->seq = features.length;
+  info->is_exclusive = feature->is_exclusive ();
 }
 
 void
@@ -63,7 +86,11 @@ hb_aat_map_builder_t::compile (hb_aat_map_t  &m)
     features.qsort ();
     unsigned int j = 0;
     for (unsigned int i = 1; i < features.length; i++)
-      if (features[i].type != features[j].type)
+      if (features[i].type != features[j].type ||
+         /* Nonexclusive feature selectors come in even/odd pairs to turn a setting on/off
+          * respectively, so we mask out the low-order bit when checking for "duplicates"
+          * (selectors referring to the same feature setting) here. */
+         (!features[i].is_exclusive && ((features[i].setting & ~1) != (features[j].setting & ~1))))
        features[++j] = features[i];
     features.shrink (j + 1);
   }
index 984a59c..5a0fa70 100644 (file)
@@ -64,19 +64,24 @@ struct hb_aat_map_builder_t
   {
     hb_aat_layout_feature_type_t  type;
     hb_aat_layout_feature_selector_t  setting;
+    bool is_exclusive;
     unsigned  seq; /* For stable sorting only. */
 
     HB_INTERNAL static int cmp (const void *pa, const void *pb)
     {
       const feature_info_t *a = (const feature_info_t *) pa;
       const feature_info_t *b = (const feature_info_t *) pb;
-      return (a->type != b->type) ? (a->type < b->type ? -1 : 1) :
-            (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
+      if (a->type != b->type) return (a->type < b->type ? -1 : 1);
+      if (!a->is_exclusive &&
+         (a->setting & ~1) != (b->setting & ~1)) return (a->setting < b->setting ? -1 : 1);
+           return (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
     }
 
-    int cmp (hb_aat_layout_feature_type_t ty) const
+    /* compares type & setting only, not is_exclusive flag or seq number */
+    int cmp (const feature_info_t& f) const
     {
-      return (type != ty) ? (type < ty ? -1 : 1) : 0;
+      return (f.type != type) ? (f.type < type ? -1 : 1) :
+            (f.setting != setting) ? (f.setting < setting ? -1 : 1) : 0;
     }
   };
 
index 042e1c2..30b5812 100644 (file)
@@ -360,6 +360,13 @@ struct
   (hb_forward<T> (a) >= hb_forward<T2> (b) ? hb_forward<T> (a) : hb_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_FUNCOBJ (hb_clamp);
 
 
 /*
@@ -486,7 +493,7 @@ template <typename T>
 static inline HB_CONST_FUNC unsigned int
 hb_ctz (T v)
 {
-  if (unlikely (!v)) return 0;
+  if (unlikely (!v)) return 8 * sizeof (T);
 
 #if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
   if (sizeof (T) <= sizeof (unsigned int))
@@ -570,6 +577,12 @@ static inline unsigned char TOUPPER (unsigned char c)
 { return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c; }
 static inline unsigned char TOLOWER (unsigned char c)
 { return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c; }
+static inline bool ISHEX (unsigned char c)
+{ return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); }
+static inline unsigned char TOHEX (uint8_t c)
+{ return (c & 0xF) <= 9 ? (c & 0xF) + '0' : (c & 0xF) + 'a' - 10; }
+static inline uint8_t FROMHEX (unsigned char c)
+{ return (c >= '0' && c <= '9') ? c - '0' : TOLOWER (c) - 'a' + 10; }
 
 static inline unsigned int DIV_CEIL (const unsigned int a, unsigned int b)
 { return (a + (b - 1)) / b; }
@@ -600,12 +613,6 @@ hb_memset (void *s, int c, unsigned int n)
   return memset (s, c, n);
 }
 
-static inline bool
-hb_unsigned_mul_overflows (unsigned int count, unsigned int size)
-{
-  return (size > 0) && (count >= ((unsigned int) -1) / size);
-}
-
 static inline unsigned int
 hb_ceil_to_4 (unsigned int v)
 {
@@ -634,29 +641,90 @@ hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3)
 
 
 /*
+ * Overflow checking.
+ */
+
+/* Consider __builtin_mul_overflow use here also */
+static inline bool
+hb_unsigned_mul_overflows (unsigned int count, unsigned int size)
+{
+  return (size > 0) && (count >= ((unsigned int) -1) / size);
+}
+
+
+/*
  * Sort and search.
  */
-template <typename ...Ts>
-static inline void *
-hb_bsearch (const void *key, const void *base,
-           size_t nmemb, size_t size,
-           int (*compar)(const void *_key, const void *_item, Ts... _ds),
-           Ts... ds)
+
+template <typename K, typename V, typename ...Ts>
+static int
+_hb_cmp_method (const void *pkey, const void *pval, Ts... ds)
+{
+  const K& key = * (const K*) pkey;
+  const V& val = * (const V*) pval;
+
+  return val.cmp (key, ds...);
+}
+
+template <typename V, typename K, typename ...Ts>
+static inline bool
+hb_bsearch_impl (unsigned *pos, /* Out */
+                const K& key,
+                V* base, size_t nmemb, size_t stride,
+                int (*compar)(const void *_key, const void *_item, Ts... _ds),
+                Ts... ds)
 {
+  /* This is our *only* bsearch implementation. */
+
   int min = 0, max = (int) nmemb - 1;
   while (min <= max)
   {
     int mid = ((unsigned int) min + (unsigned int) max) / 2;
-    const void *p = (const void *) (((const char *) base) + (mid * size));
-    int c = compar (key, p, ds...);
+#pragma GCC diagnostic push
+#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...);
     if (c < 0)
       max = mid - 1;
     else if (c > 0)
       min = mid + 1;
     else
-      return (void *) p;
+    {
+      *pos = mid;
+      return true;
+    }
   }
-  return nullptr;
+  *pos = min;
+  return false;
+}
+
+template <typename V, typename K>
+static inline V*
+hb_bsearch (const K& key, V* base,
+           size_t nmemb, size_t stride = sizeof (V),
+           int (*compar)(const void *_key, const void *_item) = _hb_cmp_method<K, V>)
+{
+  unsigned pos;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+  return hb_bsearch_impl (&pos, key, base, nmemb, stride, compar) ?
+        (V*) (((const char *) base) + (pos * stride)) : nullptr;
+#pragma GCC diagnostic pop
+}
+template <typename V, typename K, typename ...Ts>
+static inline V*
+hb_bsearch (const K& key, V* base,
+           size_t nmemb, size_t stride,
+           int (*compar)(const void *_key, const void *_item, Ts... _ds),
+           Ts... ds)
+{
+  unsigned pos;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wcast-align"
+  return hb_bsearch_impl (&pos, key, base, nmemb, stride, compar, ds...) ?
+        (V*) (((const char *) base) + (pos * stride)) : nullptr;
+#pragma GCC diagnostic pop
 }
 
 
index d9adf2c..172d9c1 100644 (file)
@@ -171,6 +171,24 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
 
   unsigned int get_size () const { return length * this->get_item_size (); }
 
+  /*
+   * Reverse the order of items in this array in the range [start, end).
+   */
+  void reverse (unsigned start = 0, unsigned end = -1)
+  {
+    start = hb_min (start, length);
+    end = hb_min (end, length);
+
+    if (end < start + 2)
+      return;
+
+    for (unsigned lhs = start, rhs = end - 1; lhs < rhs; lhs++, rhs--) {
+      Type temp = arrayZ[rhs];
+      arrayZ[rhs] = arrayZ[lhs];
+      arrayZ[lhs] = temp;
+    }
+  }
+
   hb_array_t sub_array (unsigned int start_offset = 0, unsigned int *seg_count = nullptr /* IN/OUT */) const
   {
     if (!start_offset && !seg_count)
@@ -199,10 +217,11 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
   template <typename T,
            unsigned P = sizeof (Type),
            hb_enable_if (P == 1)>
-  bool in_range (const T *p, unsigned int size = T::static_size) const
+  bool check_range (const T *p, unsigned int size = T::static_size) const
   {
-    return ((const char *) p) >= arrayZ
-       && ((const char *) p + size) <= arrayZ + length;
+    return arrayZ <= ((const char *) p)
+       && ((const char *) p) <= arrayZ + length
+       && (unsigned int) (arrayZ + length - (const char *) p) >= size;
   }
 
   /* Only call if you allocated the underlying array using malloc() or similar. */
@@ -300,23 +319,15 @@ struct hb_sorted_array_t :
              hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
              unsigned int to_store = (unsigned int) -1) const
   {
-    int min = 0, max = (int) this->length - 1;
-    const Type *array = this->arrayZ;
-    while (min <= max)
+    unsigned pos;
+
+    if (bsearch_impl (x, &pos))
     {
-      int mid = ((unsigned int) min + (unsigned int) max) / 2;
-      int c = array[mid].cmp (x);
-      if (c < 0)
-       max = mid - 1;
-      else if (c > 0)
-       min = mid + 1;
-      else
-      {
-       if (i)
-         *i = mid;
-       return true;
-      }
+      if (i)
+       *i = pos;
+      return true;
     }
+
     if (i)
     {
       switch (not_found)
@@ -329,14 +340,22 @@ struct hb_sorted_array_t :
          break;
 
        case HB_BFIND_NOT_FOUND_STORE_CLOSEST:
-         if (max < 0 || (max < (int) this->length && array[max].cmp (x) > 0))
-           max++;
-         *i = max;
+         *i = pos;
          break;
       }
     }
     return false;
   }
+  template <typename T>
+  bool bsearch_impl (const T &x, unsigned *pos) const
+  {
+    return hb_bsearch_impl (pos,
+                           x,
+                           this->arrayZ,
+                           this->length,
+                           sizeof (Type),
+                           _hb_cmp_method<T, Type>);
+  }
 };
 template <typename T> inline hb_sorted_array_t<T>
 hb_sorted_array (T *array, unsigned int length)
index cae0a4d..e9f3a6a 100644 (file)
@@ -151,9 +151,9 @@ struct hb_inc_bimap_t : hb_bimap_t
 
     for (hb_codepoint_t rhs = 0; rhs < count; rhs++)
       work[rhs] = back_map[rhs];
-  
+
     work.qsort (cmp_id);
-  
+
     clear ();
     for (hb_codepoint_t rhs = 0; rhs < count; rhs++)
       set (work[rhs], rhs);
index 2e72683..3ca31c5 100644 (file)
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-
-/* https://github.com/harfbuzz/harfbuzz/issues/1308
- * http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html
- * https://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html
- */
-#if !defined(_POSIX_C_SOURCE) && !defined(_MSC_VER) && !defined(__NetBSD__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-macros"
-#define _POSIX_C_SOURCE 200809L
-#pragma GCC diagnostic pop
-#endif
-
 #include "hb.hh"
 #include "hb-blob.hh"
 
@@ -201,7 +189,7 @@ hb_blob_copy_writable_or_fail (hb_blob_t *blob)
 hb_blob_t *
 hb_blob_get_empty ()
 {
-  return const_cast<hb_blob_t *> (&Null(hb_blob_t));
+  return const_cast<hb_blob_t *> (&Null (hb_blob_t));
 }
 
 /**
@@ -488,6 +476,9 @@ hb_blob_t::try_make_writable ()
 
 #ifndef HB_NO_OPEN
 #ifdef HAVE_MMAP
+# if !defined(HB_NO_RESOURCE_FORK) && defined(__APPLE__)
+#  include <sys/paths.h>
+# endif
 # include <sys/types.h>
 # include <sys/stat.h>
 # include <fcntl.h>
@@ -532,6 +523,39 @@ _hb_mapped_file_destroy (void *file_)
 }
 #endif
 
+#ifdef _PATH_RSRCFORKSPEC
+static int
+_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);
+  if (unlikely (!rsrc_name)) return -1;
+
+  strncpy (rsrc_name, file_name, name_len);
+  strncpy (rsrc_name + name_len, _PATH_RSRCFORKSPEC,
+          sizeof (_PATH_RSRCFORKSPEC) - 1);
+
+  int fd = open (rsrc_name, O_RDONLY | O_BINARY, 0);
+  free (rsrc_name);
+
+  if (fd != -1)
+  {
+    struct stat st;
+    if (fstat (fd, &st) != -1)
+      file->length = (unsigned long) st.st_size;
+    else
+    {
+      close (fd);
+      fd = -1;
+    }
+  }
+
+  return fd;
+}
+#endif
+
 /**
  * hb_blob_create_from_file:
  * @file_name: font filename.
@@ -556,6 +580,19 @@ hb_blob_create_from_file (const char *file_name)
   if (unlikely (fstat (fd, &st) == -1)) goto fail;
 
   file->length = (unsigned long) st.st_size;
+
+#ifdef _PATH_RSRCFORKSPEC
+  if (unlikely (file->length == 0))
+  {
+    int rfd = _open_resource_fork (file_name, file);
+    if (rfd != -1)
+    {
+      close (fd);
+      fd = rfd;
+    }
+  }
+#endif
+
   file->contents = (char *) mmap (nullptr, file->length, PROT_READ,
                                  MAP_PRIVATE | MAP_NORESERVE, fd, 0);
 
@@ -579,7 +616,7 @@ fail_without_close:
   HANDLE fd;
   unsigned int size = strlen (file_name) + 1;
   wchar_t * wchar_file_name = (wchar_t *) malloc (sizeof (wchar_t) * size);
-  if (unlikely (wchar_file_name == nullptr)) goto fail_without_close;
+  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)
   {
@@ -613,14 +650,14 @@ fail_without_close:
   file->length = (unsigned long) GetFileSize (fd, nullptr);
   file->mapping = CreateFileMapping (fd, nullptr, PAGE_READONLY, 0, 0, nullptr);
 #endif
-  if (unlikely (file->mapping == nullptr)) goto fail;
+  if (unlikely (!file->mapping)) goto fail;
 
 #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
   file->contents = (char *) MapViewOfFileFromApp (file->mapping, FILE_MAP_READ, 0, 0);
 #else
   file->contents = (char *) MapViewOfFile (file->mapping, FILE_MAP_READ, 0, 0, 0);
 #endif
-  if (unlikely (file->contents == nullptr)) goto fail;
+  if (unlikely (!file->contents)) goto fail;
 
   CloseHandle (fd);
   return hb_blob_create (file->contents, file->length,
@@ -638,10 +675,10 @@ fail_without_close:
      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 == nullptr)) return hb_blob_get_empty ();
+  if (unlikely (!data)) return hb_blob_get_empty ();
 
   FILE *fp = fopen (file_name, "rb");
-  if (unlikely (fp == nullptr)) goto fread_fail_without_close;
+  if (unlikely (!fp)) goto fread_fail_without_close;
 
   while (!feof (fp))
   {
@@ -652,7 +689,7 @@ fail_without_close:
         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);
-      if (unlikely (new_data == nullptr)) goto fread_fail;
+      if (unlikely (!new_data)) goto fread_fail;
       data = new_data;
     }
 
@@ -666,6 +703,7 @@ fail_without_close:
 
     len += addition;
   }
+       fclose (fp);
 
   return hb_blob_create (data, len, HB_MEMORY_MODE_WRITABLE, data,
                         (hb_destroy_func_t) free);
index 6131c86..d443edf 100644 (file)
@@ -438,13 +438,6 @@ hb_buffer_t::set_masks (hb_mask_t    value,
   if (!mask)
     return;
 
-  if (cluster_start == 0 && cluster_end == (unsigned int)-1) {
-    unsigned int count = len;
-    for (unsigned int i = 0; i < count; i++)
-      info[i].mask = (info[i].mask & not_mask) | value;
-    return;
-  }
-
   unsigned int count = len;
   for (unsigned int i = 0; i < count; i++)
     if (cluster_start <= info[i].cluster && info[i].cluster < cluster_end)
@@ -455,27 +448,13 @@ void
 hb_buffer_t::reverse_range (unsigned int start,
                            unsigned int end)
 {
-  unsigned int i, j;
-
   if (end - start < 2)
     return;
 
-  for (i = start, j = end - 1; i < j; i++, j--) {
-    hb_glyph_info_t t;
-
-    t = info[i];
-    info[i] = info[j];
-    info[j] = t;
-  }
+  hb_array_t<hb_glyph_info_t> (info, len).reverse (start, end);
 
   if (have_positions) {
-    for (i = start, j = end - 1; i < j; i++, j--) {
-      hb_glyph_position_t t;
-
-      t = pos[i];
-      pos[i] = pos[j];
-      pos[j] = t;
-    }
+    hb_array_t<hb_glyph_position_t> (pos, len).reverse (start, end);
   }
 }
 
@@ -612,7 +591,7 @@ done:
 void
 hb_buffer_t::unsafe_to_break_impl (unsigned int start, unsigned int end)
 {
-  unsigned int cluster = (unsigned int) -1;
+  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);
 }
@@ -628,7 +607,7 @@ hb_buffer_t::unsafe_to_break_from_outbuffer (unsigned int start, unsigned int en
   assert (start <= out_len);
   assert (idx <= end);
 
-  unsigned int cluster = (unsigned int) -1;
+  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);
@@ -736,7 +715,7 @@ hb_buffer_create ()
 hb_buffer_t *
 hb_buffer_get_empty ()
 {
-  return const_cast<hb_buffer_t *> (&Null(hb_buffer_t));
+  return const_cast<hb_buffer_t *> (&Null (hb_buffer_t));
 }
 
 /**
@@ -958,7 +937,7 @@ hb_buffer_get_direction (hb_buffer_t    *buffer)
  *
  * You can pass one of the predefined #hb_script_t values, or use
  * hb_script_from_string() or hb_script_from_iso15924_tag() to get the
- * corresponding script from an ISO 15924 script tag.
+ * corresponding script from an ISO 15924 script tag.
  *
  * Since: 0.9.2
  **/
@@ -1001,7 +980,7 @@ hb_buffer_get_script (hb_buffer_t *buffer)
  * are orthogonal to the scripts, and though they are related, they are
  * different concepts and should not be confused with each other.
  *
- * Use hb_language_from_string() to convert from BCP 47 language tags to
+ * Use hb_language_from_string() to convert from BCP 47 language tags to
  * #hb_language_t.
  *
  * Since: 0.9.2
@@ -1738,7 +1717,7 @@ hb_buffer_add_codepoints (hb_buffer_t          *buffer,
  * @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 (unsigned int) -1 to copy to end of buffer.
+ * @end: end index into source buffer to copy.  Use @HB_FEATURE_GLOBAL_END to copy to end of buffer.
  *
  * Append (part of) contents of another buffer to this buffer.
  *
@@ -1860,18 +1839,8 @@ hb_buffer_normalize_glyphs (hb_buffer_t *buffer)
 
   bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
 
-  unsigned int count = buffer->len;
-  if (unlikely (!count)) return;
-  hb_glyph_info_t *info = buffer->info;
-
-  unsigned int start = 0;
-  unsigned int end;
-  for (end = start + 1; end < count; end++)
-    if (info[start].cluster != info[end].cluster) {
-      normalize_glyphs_cluster (buffer, start, end, backward);
-      start = end;
-    }
-  normalize_glyphs_cluster (buffer, start, end, backward);
+  foreach_cluster (buffer, start, end)
+    normalize_glyphs_cluster (buffer, start, end, backward);
 }
 
 void
index d5cb746..2f581f3 100644 (file)
@@ -365,7 +365,7 @@ hb_buffer_clear_contents (hb_buffer_t *buffer);
 
 HB_EXTERN hb_bool_t
 hb_buffer_pre_allocate (hb_buffer_t  *buffer,
-                       unsigned int  size);
+                       unsigned int  size);
 
 
 HB_EXTERN hb_bool_t
index b5596d9..dce89fa 100644 (file)
@@ -228,10 +228,10 @@ struct hb_buffer_t
   /* 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)
   {
-    if (unlikely (!make_room_for (0, 1))) return Crap(hb_glyph_info_t);
+    if (unlikely (!make_room_for (0, 1))) return Crap (hb_glyph_info_t);
 
     if (unlikely (idx == len && !out_len))
-      return Crap(hb_glyph_info_t);
+      return Crap (hb_glyph_info_t);
 
     out_info[out_len] = idx < len ? info[idx] : out_info[out_len - 1];
     out_info[out_len].codepoint = glyph_index;
@@ -386,7 +386,7 @@ struct hb_buffer_t
     inf.cluster = cluster;
   }
 
-  int
+  unsigned int
   _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *infos,
                                     unsigned int start, unsigned int end,
                                     unsigned int cluster) const
index 780f618..91a9b7d 100644 (file)
@@ -252,30 +252,27 @@ struct number_t
 struct UnsizedByteStr : UnsizedArrayOf <HBUINT8>
 {
   // encode 2-byte int (Dict/CharString) or 4-byte int (Dict)
-  template <typename INTTYPE, int minVal, int maxVal>
-  static bool serialize_int (hb_serialize_context_t *c, op_code_t intOp, int value)
+  template <typename T, typename V>
+  static bool serialize_int (hb_serialize_context_t *c, op_code_t intOp, V value)
   {
     TRACE_SERIALIZE (this);
 
-    if (unlikely ((value < minVal || value > maxVal)))
-      return_trace (false);
-
     HBUINT8 *p = c->allocate_size<HBUINT8> (1);
-    if (unlikely (p == nullptr)) return_trace (false);
+    if (unlikely (!p)) return_trace (false);
     *p = intOp;
 
-    INTTYPE *ip = c->allocate_size<INTTYPE> (INTTYPE::static_size);
-    if (unlikely (ip == nullptr)) return_trace (false);
-    *ip = (unsigned int) value;
-
-    return_trace (true);
+    T *ip = c->allocate_size<T> (T::static_size);
+    if (unlikely (!ip)) return_trace (false);
+    return_trace (c->check_assign (*ip, value));
   }
 
-  static bool serialize_int4 (hb_serialize_context_t *c, int value)
-  { return serialize_int<HBUINT32, 0, 0x7FFFFFFF> (c, OpCode_longintdict, value); }
+  template <typename V>
+  static bool serialize_int4 (hb_serialize_context_t *c, V value)
+  { return serialize_int<HBINT32> (c, OpCode_longintdict, value); }
 
-  static bool serialize_int2 (hb_serialize_context_t *c, int value)
-  { return serialize_int<HBUINT16, 0, 0x7FFF> (c, OpCode_shortint, value); }
+  template <typename V>
+  static bool serialize_int2 (hb_serialize_context_t *c, V value)
+  { return serialize_int<HBINT16> (c, OpCode_shortint, value); }
 
   /* Defining null_size allows a Null object may be created. Should be safe because:
    * A descendent struct Dict uses a Null pointer to indicate a missing table,
@@ -408,7 +405,7 @@ struct cff_stack_t
     else
     {
       set_error ();
-      return Crap(ELEM);
+      return Crap (ELEM);
     }
   }
 
@@ -419,7 +416,7 @@ struct cff_stack_t
     else
     {
       set_error ();
-      return Crap(ELEM);
+      return Crap (ELEM);
     }
   }
   void pop (unsigned int n)
@@ -435,7 +432,7 @@ struct cff_stack_t
     if (unlikely (count < 0))
     {
       set_error ();
-      return Null(ELEM);
+      return Null (ELEM);
     }
     return elements[count - 1];
   }
@@ -542,7 +539,7 @@ struct op_serializer_t
     TRACE_SERIALIZE (this);
 
     HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length);
-    if (unlikely (d == nullptr)) return_trace (false);
+    if (unlikely (!d)) return_trace (false);
     memcpy (d, &opstr.str[0], opstr.str.length);
     return_trace (true);
   }
index d9ad4d0..52d778f 100644 (file)
@@ -76,13 +76,13 @@ struct biased_subrs_t
 
   void fini () {}
 
-  unsigned int get_count () const { return (subrs == nullptr) ? 0 : subrs->count; }
+  unsigned int get_count () const { return subrs ? subrs->count : 0; }
   unsigned int get_bias () const  { return bias; }
 
   byte_str_t operator [] (unsigned int index) const
   {
-    if (unlikely ((subrs == nullptr) || index >= subrs->count))
-      return Null(byte_str_t);
+    if (unlikely (!subrs || index >= subrs->count))
+      return Null (byte_str_t);
     else
       return (*subrs)[index];
   }
@@ -551,8 +551,13 @@ struct path_procs_t
 
   static void rcurveline (ENV &env, PARAM& param)
   {
+    unsigned int arg_count = env.argStack.get_count ();
+    if (unlikely (arg_count < 8))
+      return;
+
     unsigned int i = 0;
-    for (; i + 6 <= env.argStack.get_count (); i += 6)
+    unsigned int curve_limit = arg_count - 2;
+    for (; i + 6 <= curve_limit; i += 6)
     {
       point_t pt1 = env.get_pt ();
       pt1.move (env.eval_arg (i), env.eval_arg (i+1));
@@ -562,34 +567,34 @@ struct path_procs_t
       pt3.move (env.eval_arg (i+4), env.eval_arg (i+5));
       PATH::curve (env, param, pt1, pt2, pt3);
     }
-    for (; i + 2 <= env.argStack.get_count (); i += 2)
-    {
-      point_t pt1 = env.get_pt ();
-      pt1.move (env.eval_arg (i), env.eval_arg (i+1));
-      PATH::line (env, param, pt1);
-    }
+
+    point_t pt1 = env.get_pt ();
+    pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+    PATH::line (env, param, pt1);
   }
 
   static void rlinecurve (ENV &env, PARAM& param)
   {
+    unsigned int arg_count = env.argStack.get_count ();
+    if (unlikely (arg_count < 8))
+      return;
+
     unsigned int i = 0;
-    unsigned int line_limit = (env.argStack.get_count () % 6);
+    unsigned int line_limit = arg_count - 6;
     for (; i + 2 <= line_limit; i += 2)
     {
       point_t pt1 = env.get_pt ();
       pt1.move (env.eval_arg (i), env.eval_arg (i+1));
       PATH::line (env, param, pt1);
     }
-    for (; i + 6 <= env.argStack.get_count (); i += 6)
-    {
-      point_t pt1 = env.get_pt ();
-      pt1.move (env.eval_arg (i), env.eval_arg (i+1));
-      point_t pt2 = pt1;
-      pt2.move (env.eval_arg (i+2), env.eval_arg (i+3));
-      point_t pt3 = pt2;
-      pt3.move (env.eval_arg (i+4), env.eval_arg (i+5));
-      PATH::curve (env, param, pt1, pt2, pt3);
-    }
+
+    point_t pt1 = env.get_pt ();
+    pt1.move (env.eval_arg (i), env.eval_arg (i+1));
+    point_t pt2 = pt1;
+    pt2.move (env.eval_arg (i+2), env.eval_arg (i+3));
+    point_t pt3 = pt2;
+    pt3.move (env.eval_arg (i+4), env.eval_arg (i+5));
+    PATH::curve (env, param, pt1, pt2, pt3);
   }
 
   static void vvcurveto (ENV &env, PARAM& param)
index 1f03d82..a520ca3 100644 (file)
@@ -27,8 +27,6 @@
 #define HB_CFF_INTERP_DICT_COMMON_HH
 
 #include "hb-cff-interp-common.hh"
-#include <math.h>
-#include <float.h>
 
 namespace CFF {
 
@@ -58,19 +56,6 @@ struct top_dict_values_t : dict_values_t<OPSTR>
   }
   void fini () { dict_values_t<OPSTR>::fini (); }
 
-  unsigned int calculate_serialized_op_size (const OPSTR& opstr) const
-  {
-    switch (opstr.op)
-    {
-      case OpCode_CharStrings:
-      case OpCode_FDArray:
-       return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op);
-
-      default:
-       return opstr.str.length;
-    }
-  }
-
   unsigned int  charStringsOffset;
   unsigned int  FDArrayOffset;
 };
index a72100e..8d9bb26 100644 (file)
@@ -80,7 +80,7 @@ struct cff2_cs_interp_env_t : cs_interp_env_t<blend_arg_t, CFF2Subrs>
 {
   template <typename ACC>
   void init (const byte_str_t &str, ACC &acc, unsigned int fd,
-                   const int *coords_=nullptr, unsigned int num_coords_=0)
+            const int *coords_=nullptr, unsigned int num_coords_=0)
   {
     SUPER::init (str, acc.globalSubrs, acc.privateDicts[fd].localSubrs);
 
@@ -90,7 +90,7 @@ struct cff2_cs_interp_env_t : cs_interp_env_t<blend_arg_t, CFF2Subrs>
     seen_blend = false;
     seen_vsindex_ = false;
     scalars.init ();
-    do_blend = (coords != nullptr) && num_coords && (varStore != &Null(CFF2VariationStore));
+    do_blend = num_coords && coords && varStore->size;
     set_ivs (acc.privateDicts[fd].ivs);
   }
 
@@ -134,8 +134,7 @@ struct cff2_cs_interp_env_t : cs_interp_env_t<blend_arg_t, CFF2Subrs>
       if (do_blend)
       {
        scalars.resize (region_count);
-       varStore->varStore.get_scalars (get_ivs (),
-                                       (int *)coords, num_coords,
+       varStore->varStore.get_scalars (get_ivs (), coords, num_coords,
                                        &scalars[0], region_count);
       }
       seen_blend = true;
index 0ae0c05..5acfa78 100644 (file)
@@ -69,7 +69,6 @@ _hb_options_init ()
        if (0 == strncmp (c, name, p - c) && strlen (name) == static_cast<size_t>(p - c)) do { u.opts.symbol = true; } while (0)
 
       OPTION ("uniscribe-bug-compatible", uniscribe_bug_compatible);
-      OPTION ("aat", aat);
 
 #undef OPTION
 
@@ -333,14 +332,14 @@ retry:
 /**
  * hb_language_from_string:
  * @str: (array length=len) (element-type uint8_t): a string representing
- *       a BCP 47 language tag
+ *       a BCP 47 language tag
  * @len: length of the @str, or -1 if it is %NULL-terminated.
  *
- * Converts @str representing a BCP 47 language tag to the corresponding
+ * Converts @str representing a BCP 47 language tag to the corresponding
  * #hb_language_t.
  *
  * Return value: (transfer none):
- * The #hb_language_t corresponding to the BCP 47 language tag.
+ * The #hb_language_t corresponding to the BCP 47 language tag.
  *
  * Since: 0.9.2
  **/
@@ -422,12 +421,12 @@ hb_language_get_default ()
 
 /**
  * hb_script_from_iso15924_tag:
- * @tag: an #hb_tag_t representing an ISO 15924 tag.
+ * @tag: an #hb_tag_t representing an ISO 15924 tag.
  *
- * Converts an ISO 15924 script tag to a corresponding #hb_script_t.
+ * Converts an ISO 15924 script tag to a corresponding #hb_script_t.
  *
  * Return value:
- * An #hb_script_t corresponding to the ISO 15924 tag.
+ * An #hb_script_t corresponding to the ISO 15924 tag.
  *
  * Since: 0.9.2
  **/
@@ -468,15 +467,15 @@ hb_script_from_iso15924_tag (hb_tag_t tag)
 /**
  * hb_script_from_string:
  * @str: (array length=len) (element-type uint8_t): a string representing an
- *       ISO 15924 tag.
+ *       ISO 15924 tag.
  * @len: length of the @str, or -1 if it is %NULL-terminated.
  *
- * Converts a string @str representing an ISO 15924 script tag to a
+ * Converts a string @str representing an ISO 15924 script tag to a
  * corresponding #hb_script_t. Shorthand for hb_tag_from_string() then
  * hb_script_from_iso15924_tag().
  *
  * Return value:
- * An #hb_script_t corresponding to the ISO 15924 tag.
+ * An #hb_script_t corresponding to the ISO 15924 tag.
  *
  * Since: 0.9.2
  **/
@@ -493,7 +492,7 @@ hb_script_from_string (const char *str, int len)
  * See hb_script_from_iso15924_tag().
  *
  * Return value:
- * An #hb_tag_t representing an ISO 15924 script tag.
+ * An #hb_tag_t representing an ISO 15924 script tag.
  *
  * Since: 0.9.2
  **/
@@ -575,6 +574,13 @@ hb_script_get_horizontal_direction (hb_script_t script)
     case HB_SCRIPT_OLD_SOGDIAN:
     case HB_SCRIPT_SOGDIAN:
 
+    /* Unicode-12.0 additions */
+    case HB_SCRIPT_ELYMAIC:
+
+    /* Unicode-13.0 additions */
+    case HB_SCRIPT_CHORASMIAN:
+    case HB_SCRIPT_YEZIDI:
+
       return HB_DIRECTION_RTL;
 
 
@@ -590,38 +596,6 @@ hb_script_get_horizontal_direction (hb_script_t script)
 }
 
 
-/* hb_user_data_array_t */
-
-bool
-hb_user_data_array_t::set (hb_user_data_key_t *key,
-                          void *              data,
-                          hb_destroy_func_t   destroy,
-                          hb_bool_t           replace)
-{
-  if (!key)
-    return false;
-
-  if (replace) {
-    if (!data && !destroy) {
-      items.remove (key, lock);
-      return true;
-    }
-  }
-  hb_user_data_item_t item = {key, data, destroy};
-  bool ret = !!items.replace_or_insert (item, lock, (bool) replace);
-
-  return ret;
-}
-
-void *
-hb_user_data_array_t::get (hb_user_data_key_t *key)
-{
-  hb_user_data_item_t item = {nullptr, nullptr, nullptr};
-
-  return items.find (key, &item, lock) ? item.data : nullptr;
-}
-
-
 /* hb_version */
 
 
@@ -960,14 +934,14 @@ hb_feature_to_string (hb_feature_t *feature,
   len += 4;
   while (len && s[len - 1] == ' ')
     len--;
-  if (feature->start != 0 || feature->end != (unsigned int) -1)
+  if (feature->start != HB_FEATURE_GLOBAL_START || feature->end != HB_FEATURE_GLOBAL_END)
   {
     s[len++] = '[';
     if (feature->start)
       len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->start));
     if (feature->end != feature->start + 1) {
       s[len++] = ':';
-      if (feature->end != (unsigned int) -1)
+      if (feature->end != HB_FEATURE_GLOBAL_END)
        len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->end));
     }
     s[len++] = ']';
index 037e508..a97a5f5 100644 (file)
@@ -367,6 +367,14 @@ typedef enum
   /*12.0*/HB_SCRIPT_NYIAKENG_PUACHUE_HMONG     = HB_TAG ('H','m','n','p'),
   /*12.0*/HB_SCRIPT_WANCHO                     = HB_TAG ('W','c','h','o'),
 
+  /*
+   * 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'),
+
   /* No script set. */
   HB_SCRIPT_INVALID                            = HB_TAG_NONE,
 
index 14c5395..07659fa 100644 (file)
@@ -58,6 +58,7 @@
 #define HB_NO_BITMAP
 #define HB_NO_CFF
 #define HB_NO_COLOR
+#define HB_NO_DRAW
 #define HB_NO_ERRNO
 #define HB_NO_FACE_COLLECT_UNICODES
 #define HB_NO_GETENV
index 8885cfe..76e00fd 100644 (file)
@@ -278,13 +278,32 @@ _hb_coretext_shaper_face_data_destroy (hb_coretext_face_data_t *data)
   CFRelease ((CGFontRef) data);
 }
 
+/**
+ * hb_coretext_face_create:
+ * @cg_font: The CGFontRef to work upon
+ *
+ * Creates an #hb_face_t face object from the specified
+ * CGFontRef.
+ *
+ * Return value: the new #hb_face_t face object
+ *
+ * Since: 0.9.10
+ */
 hb_face_t *
 hb_coretext_face_create (CGFontRef cg_font)
 {
   return hb_face_create_for_tables (_hb_cg_reference_table, CGFontRetain (cg_font), _hb_cg_font_release);
 }
 
-/*
+/**
+ * hb_coretext_face_get_cg_font:
+ * @face: The #hb_face_t to work upon
+ *
+ * Fetches the CGFontRef associated with an #hb_face_t
+ * face object
+ *
+ * Return value: the CGFontRef found
+ *
  * Since: 0.9.10
  */
 CGFontRef
@@ -351,10 +370,17 @@ retry:
   return font->data.coretext;
 }
 
-
-/*
+/**
+ * hb_coretext_font_create:
+ * @ct_font: The CTFontRef to work upon
+ *
+ * Creates an #hb_font_t font object from the specified
+ * CTFontRef.
+ *
+ * Return value: the new #hb_font_t font object
+ *
  * Since: 1.7.2
- */
+ **/
 hb_font_t *
 hb_coretext_font_create (CTFontRef ct_font)
 {
@@ -375,6 +401,17 @@ hb_coretext_font_create (CTFontRef ct_font)
   return font;
 }
 
+/**
+ * hb_coretext_face_get_ct_font:
+ * @font: #hb_font_t to work upon
+ *
+ * Fetches the CTFontRef associated with the specified
+ * #hb_font_t font object.
+ *
+ * Return value: the CTFontRef found
+ *
+ * Since: 0.9.10
+ */
 CTFontRef
 hb_coretext_font_get_ct_font (hb_font_t *font)
 {
@@ -475,13 +512,19 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
     hb_vector_t<feature_event_t> feature_events;
     for (unsigned int i = 0; i < num_features; i++)
     {
+      active_feature_t feature;
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1010
       const hb_aat_feature_mapping_t * mapping = hb_aat_layout_find_feature_mapping (features[i].tag);
       if (!mapping)
        continue;
 
-      active_feature_t feature;
       feature.rec.feature = mapping->aatFeatureType;
       feature.rec.setting = features[i].value ? mapping->selectorToEnable : mapping->selectorToDisable;
+#else
+      feature.rec.feature = features[i].tag;
+      feature.rec.setting = features[i].value;
+#endif
       feature.order = i;
 
       feature_event_t *event;
@@ -530,6 +573,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
            CFStringRef keys[] = {
              kCTFontFeatureTypeIdentifierKey,
              kCTFontFeatureSelectorIdentifierKey
@@ -538,6 +582,17 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
              CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &active_features[j].rec.feature),
              CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &active_features[j].rec.setting)
            };
+#else
+           char tag[5] = {HB_UNTAG (active_features[j].rec.feature)};
+           CFTypeRef keys[] = {
+             kCTFontOpenTypeFeatureTag,
+             kCTFontOpenTypeFeatureValue
+           };
+           CFTypeRef values[] = {
+             CFStringCreateWithCString (kCFAllocatorDefault, tag, kCFStringEncodingASCII),
+             CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &active_features[j].rec.setting)
+           };
+#endif
            static_assert ((ARRAY_LENGTH_CONST (keys) == ARRAY_LENGTH_CONST (values)), "");
            CFDictionaryRef dict = CFDictionaryCreate (kCFAllocatorDefault,
                                                       (const void **) keys,
@@ -605,7 +660,7 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
     scratch_size -= _consumed; \
   } while (0)
 
-  ALLOCATE_ARRAY (UniChar, pchars, buffer->len * 2, /*nothing*/);
+  ALLOCATE_ARRAY (UniChar, pchars, buffer->len * 2, ((void)nullptr) /*nothing*/);
   unsigned int chars_len = 0;
   for (unsigned int i = 0; i < buffer->len; i++) {
     hb_codepoint_t c = buffer->info[i].codepoint;
@@ -619,7 +674,7 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
     }
   }
 
-  ALLOCATE_ARRAY (unsigned int, log_clusters, chars_len, /*nothing*/);
+  ALLOCATE_ARRAY (unsigned int, log_clusters, chars_len, ((void)nullptr) /*nothing*/);
   chars_len = 0;
   for (unsigned int i = 0; i < buffer->len; i++)
   {
index 4b0a6f0..e53dbaf 100644 (file)
 HB_BEGIN_DECLS
 
 
+/**
+ * HB_CORETEXT_TAG_MORT:
+ *
+ * The #hb_tag_t tag for the `mort` (glyph metamorphosis) table,
+ * which holds AAT features. 
+ *
+ * For more information, see 
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6mort.html
+ *
+ **/
 #define HB_CORETEXT_TAG_MORT HB_TAG('m','o','r','t')
+
+/**
+ * HB_CORETEXT_TAG_MORX:
+ *
+ * The #hb_tag_t tag for the `morx` (extended glyph metamorphosis)
+ * table, which holds AAT features. 
+ *
+ * For more information, see
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6morx.html
+ *
+ **/
 #define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x')
+
+/**
+ * HB_CORETEXT_TAG_KERX:
+ *
+ * The #hb_tag_t tag for the `kerx` (extended kerning) table, which
+ * holds AAT kerning information. 
+ *
+ * For more information, see 
+ * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6kerx.html
+ *
+ **/
 #define HB_CORETEXT_TAG_KERX HB_TAG('k','e','r','x')
 
 
index a7e52c8..5c13e5d 100644 (file)
@@ -46,7 +46,6 @@ struct hb_options_t
   bool unused : 1; /* In-case sign bit is here. */
   bool initialized : 1;
   bool uniscribe_bug_compatible : 1;
-  bool aat : 1;
 };
 
 union hb_options_union_t {
@@ -230,7 +229,7 @@ _hb_debug_msg<0> (const char *what HB_UNUSED,
                  ...) {}
 
 #define DEBUG_MSG_LEVEL(WHAT, OBJ, LEVEL, LEVEL_DIR, ...)      _hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    true, (LEVEL), (LEVEL_DIR), __VA_ARGS__)
-#define DEBUG_MSG(WHAT, OBJ, ...)                              _hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    false, 0, 0, __VA_ARGS__)
+#define DEBUG_MSG(WHAT, OBJ, ...)                              _hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    false, 0, 0, __VA_ARGS__)
 #define DEBUG_MSG_FUNC(WHAT, OBJ, ...)                         _hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
 
 
index efb2029..f2fce07 100644 (file)
@@ -635,7 +635,7 @@ _hb_directwrite_shape_full (hb_shape_plan_t    *shape_plan,
   bool isRightToLeft = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
 
   const wchar_t localeName[20] = {0};
-  if (buffer->props.language != nullptr)
+  if (buffer->props.language)
     mbstowcs ((wchar_t*) localeName,
              hb_language_to_string (buffer->props.language), 20);
 
diff --git a/src/hb-draw.cc b/src/hb-draw.cc
new file mode 100644 (file)
index 0000000..1a5f9c8
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+ * Copyright © 2019-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.hh"
+
+#ifndef HB_NO_DRAW
+#ifdef HB_EXPERIMENTAL_API
+
+#include "hb-draw.hh"
+#include "hb-ot.h"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-cff1-table.hh"
+#include "hb-ot-cff2-table.hh"
+
+/**
+ * hb_draw_funcs_set_move_to_func:
+ * @funcs: draw functions object
+ * @move_to: move-to callback
+ *
+ * Sets move-to callback to the draw functions object.
+ *
+ * Since: EXPERIMENTAL
+ **/
+void
+hb_draw_funcs_set_move_to_func (hb_draw_funcs_t        *funcs,
+                               hb_draw_move_to_func_t  move_to)
+{
+  if (unlikely (hb_object_is_immutable (funcs))) return;
+  funcs->move_to = move_to;
+}
+
+/**
+ * hb_draw_funcs_set_line_to_func:
+ * @funcs: draw functions object
+ * @line_to: line-to callback
+ *
+ * Sets line-to callback to the draw functions object.
+ *
+ * Since: EXPERIMENTAL
+ **/
+void
+hb_draw_funcs_set_line_to_func (hb_draw_funcs_t        *funcs,
+                               hb_draw_line_to_func_t  line_to)
+{
+  if (unlikely (hb_object_is_immutable (funcs))) return;
+  funcs->line_to = line_to;
+}
+
+/**
+ * hb_draw_funcs_set_quadratic_to_func:
+ * @funcs: draw functions object
+ * @move_to: quadratic-to callback
+ *
+ * Sets quadratic-to callback to the draw functions object.
+ *
+ * Since: EXPERIMENTAL
+ **/
+void
+hb_draw_funcs_set_quadratic_to_func (hb_draw_funcs_t             *funcs,
+                                    hb_draw_quadratic_to_func_t  quadratic_to)
+{
+  if (unlikely (hb_object_is_immutable (funcs))) return;
+  funcs->quadratic_to = quadratic_to;
+  funcs->is_quadratic_to_set = true;
+}
+
+/**
+ * hb_draw_funcs_set_cubic_to_func:
+ * @funcs: draw functions
+ * @cubic_to: cubic-to callback
+ *
+ * Sets cubic-to callback to the draw functions object.
+ *
+ * Since: EXPERIMENTAL
+ **/
+void
+hb_draw_funcs_set_cubic_to_func (hb_draw_funcs_t         *funcs,
+                                hb_draw_cubic_to_func_t  cubic_to)
+{
+  if (unlikely (hb_object_is_immutable (funcs))) return;
+  funcs->cubic_to = cubic_to;
+}
+
+/**
+ * hb_draw_funcs_set_close_path_func:
+ * @funcs: draw functions object
+ * @close_path: close-path callback
+ *
+ * Sets close-path callback to the draw functions object.
+ *
+ * Since: EXPERIMENTAL
+ **/
+void
+hb_draw_funcs_set_close_path_func (hb_draw_funcs_t           *funcs,
+                                  hb_draw_close_path_func_t  close_path)
+{
+  if (unlikely (hb_object_is_immutable (funcs))) return;
+  funcs->close_path = close_path;
+}
+
+static void
+_move_to_nil (hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED, void *user_data HB_UNUSED) {}
+
+static void
+_line_to_nil (hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED, void *user_data HB_UNUSED) {}
+
+static void
+_quadratic_to_nil (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
+_cubic_to_nil (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
+_close_path_nil (void *user_data HB_UNUSED) {}
+
+/**
+ * hb_draw_funcs_create:
+ *
+ * Creates a new draw callbacks object.
+ *
+ * Since: EXPERIMENTAL
+ **/
+hb_draw_funcs_t *
+hb_draw_funcs_create ()
+{
+  hb_draw_funcs_t *funcs;
+  if (unlikely (!(funcs = hb_object_create<hb_draw_funcs_t> ())))
+    return const_cast<hb_draw_funcs_t *> (&Null (hb_draw_funcs_t));
+
+  funcs->move_to = (hb_draw_move_to_func_t) _move_to_nil;
+  funcs->line_to = (hb_draw_line_to_func_t) _line_to_nil;
+  funcs->quadratic_to = (hb_draw_quadratic_to_func_t) _quadratic_to_nil;
+  funcs->is_quadratic_to_set = false;
+  funcs->cubic_to = (hb_draw_cubic_to_func_t) _cubic_to_nil;
+  funcs->close_path = (hb_draw_close_path_func_t) _close_path_nil;
+  return funcs;
+}
+
+/**
+ * hb_draw_funcs_reference:
+ * @funcs: draw functions
+ *
+ * Add to callbacks object refcount.
+ *
+ * Returns: The same object.
+ * Since: EXPERIMENTAL
+ **/
+hb_draw_funcs_t *
+hb_draw_funcs_reference (hb_draw_funcs_t *funcs)
+{
+  return hb_object_reference (funcs);
+}
+
+/**
+ * hb_draw_funcs_destroy:
+ * @funcs: draw functions
+ *
+ * Decreases refcount of callbacks object and deletes the object if it reaches
+ * to zero.
+ *
+ * Since: EXPERIMENTAL
+ **/
+void
+hb_draw_funcs_destroy (hb_draw_funcs_t *funcs)
+{
+  if (!hb_object_destroy (funcs)) return;
+
+  free (funcs);
+}
+
+/**
+ * hb_draw_funcs_make_immutable:
+ * @funcs: draw functions
+ *
+ * Makes funcs object immutable.
+ *
+ * Since: EXPERIMENTAL
+ **/
+void
+hb_draw_funcs_make_immutable (hb_draw_funcs_t *funcs)
+{
+  if (hb_object_is_immutable (funcs))
+    return;
+
+  hb_object_make_immutable (funcs);
+}
+
+/**
+ * hb_draw_funcs_is_immutable:
+ * @funcs: draw functions
+ *
+ * Checks whether funcs is immutable.
+ *
+ * Returns: If is immutable.
+ * Since: EXPERIMENTAL
+ **/
+hb_bool_t
+hb_draw_funcs_is_immutable (hb_draw_funcs_t *funcs)
+{
+  return hb_object_is_immutable (funcs);
+}
+
+/**
+ * hb_font_draw_glyph:
+ * @font: a font object
+ * @glyph: a glyph id
+ * @funcs: draw callbacks object
+ * @user_data: parameter you like be passed to the callbacks when are called
+ *
+ * Draw a glyph.
+ *
+ * Returns: Whether the font had the glyph and the operation completed successfully.
+ * Since: EXPERIMENTAL
+ **/
+hb_bool_t
+hb_font_draw_glyph (hb_font_t *font, hb_codepoint_t glyph,
+                   const hb_draw_funcs_t *funcs,
+                   void *user_data)
+{
+  if (unlikely (funcs == &Null (hb_draw_funcs_t) ||
+               glyph >= font->face->get_num_glyphs ()))
+    return false;
+
+  draw_helper_t draw_helper (funcs, user_data);
+  if (font->face->table.glyf->get_path (font, glyph, draw_helper)) return true;
+#ifndef HB_NO_CFF
+  if (font->face->table.cff1->get_path (font, glyph, draw_helper)) return true;
+  if (font->face->table.cff2->get_path (font, glyph, draw_helper)) return true;
+#endif
+
+  return false;
+}
+
+#endif
+#endif
diff --git a/src/hb-draw.h b/src/hb-draw.h
new file mode 100644 (file)
index 0000000..98eccf4
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright © 2019-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.
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_DRAW_H
+#define HB_DRAW_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+#ifdef HB_EXPERIMENTAL_API
+typedef void (*hb_draw_move_to_func_t) (hb_position_t to_x, hb_position_t to_y, void *user_data);
+typedef void (*hb_draw_line_to_func_t) (hb_position_t to_x, hb_position_t to_y, void *user_data);
+typedef void (*hb_draw_quadratic_to_func_t) (hb_position_t control_x, hb_position_t control_y,
+                                            hb_position_t to_x, hb_position_t to_y,
+                                            void *user_data);
+typedef void (*hb_draw_cubic_to_func_t) (hb_position_t control1_x, hb_position_t control1_y,
+                                        hb_position_t control2_x, hb_position_t control2_y,
+                                        hb_position_t to_x, hb_position_t to_y,
+                                        void *user_data);
+typedef void (*hb_draw_close_path_func_t) (void *user_data);
+
+/**
+ * hb_draw_funcs_t:
+ *
+ * Glyph draw callbacks.
+ *
+ * _move_to, _line_to and _cubic_to calls are nessecary to be defined but we
+ * translate _quadratic_to calls to _cubic_to if the callback isn't defined.
+ *
+ * Since: EXPERIMENTAL
+ **/
+typedef struct hb_draw_funcs_t hb_draw_funcs_t;
+
+HB_EXTERN void
+hb_draw_funcs_set_move_to_func (hb_draw_funcs_t        *funcs,
+                               hb_draw_move_to_func_t  move_to);
+
+HB_EXTERN void
+hb_draw_funcs_set_line_to_func (hb_draw_funcs_t        *funcs,
+                               hb_draw_line_to_func_t  line_to);
+
+HB_EXTERN void
+hb_draw_funcs_set_quadratic_to_func (hb_draw_funcs_t             *funcs,
+                                    hb_draw_quadratic_to_func_t  quadratic_to);
+
+HB_EXTERN void
+hb_draw_funcs_set_cubic_to_func (hb_draw_funcs_t         *funcs,
+                                hb_draw_cubic_to_func_t  cubic_to);
+
+HB_EXTERN void
+hb_draw_funcs_set_close_path_func (hb_draw_funcs_t           *funcs,
+                                  hb_draw_close_path_func_t  close_path);
+
+HB_EXTERN hb_draw_funcs_t *
+hb_draw_funcs_create (void);
+
+HB_EXTERN hb_draw_funcs_t *
+hb_draw_funcs_reference (hb_draw_funcs_t *funcs);
+
+HB_EXTERN void
+hb_draw_funcs_destroy (hb_draw_funcs_t *funcs);
+
+HB_EXTERN void
+hb_draw_funcs_make_immutable (hb_draw_funcs_t *funcs);
+
+HB_EXTERN hb_bool_t
+hb_draw_funcs_is_immutable (hb_draw_funcs_t *funcs);
+#endif
+
+HB_END_DECLS
+
+#endif /* HB_DRAW_H */
diff --git a/src/hb-draw.hh b/src/hb-draw.hh
new file mode 100644 (file)
index 0000000..2aa0a5b
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * 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.
+ */
+
+#ifndef HB_DRAW_HH
+#define HB_DRAW_HH
+
+#include "hb.hh"
+
+#ifdef HB_EXPERIMENTAL_API
+struct hb_draw_funcs_t
+{
+  hb_object_header_t header;
+
+  hb_draw_move_to_func_t move_to;
+  hb_draw_line_to_func_t line_to;
+  hb_draw_quadratic_to_func_t quadratic_to;
+  bool is_quadratic_to_set;
+  hb_draw_cubic_to_func_t cubic_to;
+  hb_draw_close_path_func_t close_path;
+};
+
+struct draw_helper_t
+{
+  draw_helper_t (const hb_draw_funcs_t *funcs_, void *user_data_)
+  {
+    funcs = funcs_;
+    user_data = user_data_;
+    path_open = false;
+    path_start_x = current_x = path_start_y = current_y = 0;
+  }
+  ~draw_helper_t () { end_path (); }
+
+  void move_to (hb_position_t x, hb_position_t y)
+  {
+    if (path_open) end_path ();
+    current_x = path_start_x = x;
+    current_y = path_start_y = y;
+  }
+
+  void line_to (hb_position_t x, hb_position_t y)
+  {
+    if (equal_to_current (x, y)) return;
+    if (!path_open) start_path ();
+    funcs->line_to (x, y, user_data);
+    current_x = x;
+    current_y = y;
+  }
+
+  void
+  quadratic_to (hb_position_t control_x, hb_position_t control_y,
+               hb_position_t to_x, hb_position_t to_y)
+  {
+    if (equal_to_current (control_x, control_y) && equal_to_current (to_x, to_y))
+      return;
+    if (!path_open) start_path ();
+    if (funcs->is_quadratic_to_set)
+      funcs->quadratic_to (control_x, control_y, to_x, to_y, user_data);
+    else
+      funcs->cubic_to (roundf ((current_x + 2.f * control_x) / 3.f),
+                      roundf ((current_y + 2.f * control_y) / 3.f),
+                      roundf ((to_x + 2.f * control_x) / 3.f),
+                      roundf ((to_y + 2.f * control_y) / 3.f),
+                      to_x, to_y, user_data);
+    current_x = to_x;
+    current_y = to_y;
+  }
+
+  void
+  cubic_to (hb_position_t control1_x, hb_position_t control1_y,
+           hb_position_t control2_x, hb_position_t control2_y,
+           hb_position_t to_x, hb_position_t to_y)
+  {
+    if (equal_to_current (control1_x, control1_y) &&
+       equal_to_current (control2_x, control2_y) &&
+       equal_to_current (to_x, to_y))
+      return;
+    if (!path_open) start_path ();
+    funcs->cubic_to (control1_x, control1_y, control2_x, control2_y, to_x, to_y, user_data);
+    current_x = to_x;
+    current_y = to_y;
+  }
+
+  void end_path ()
+  {
+    if (path_open)
+    {
+      if ((path_start_x != current_x) || (path_start_y != current_y))
+       funcs->line_to (path_start_x, path_start_y, user_data);
+      funcs->close_path (user_data);
+    }
+    path_open = false;
+    path_start_x = current_x = path_start_y = current_y = 0;
+  }
+
+  protected:
+  bool equal_to_current (hb_position_t x, hb_position_t y)
+  { return current_x == x && current_y == y; }
+
+  void start_path ()
+  {
+    if (path_open) end_path ();
+    path_open = true;
+    funcs->move_to (path_start_x, path_start_y, user_data);
+  }
+
+  hb_position_t path_start_x;
+  hb_position_t path_start_y;
+
+  hb_position_t current_x;
+  hb_position_t current_y;
+
+  bool path_open;
+  const hb_draw_funcs_t *funcs;
+  void *user_data;
+};
+#endif
+
+#endif /* HB_DRAW_HH */
index 0c9949f..e4d8a3f 100644 (file)
@@ -226,7 +226,7 @@ hb_face_create (hb_blob_t    *blob,
 hb_face_t *
 hb_face_get_empty ()
 {
-  return const_cast<hb_face_t *> (&Null(hb_face_t));
+  return const_cast<hb_face_t *> (&Null (hb_face_t));
 }
 
 
@@ -546,7 +546,7 @@ void
 hb_face_collect_unicodes (hb_face_t *face,
                          hb_set_t  *out)
 {
-  face->table.cmap->collect_unicodes (out);
+  face->table.cmap->collect_unicodes (out, face->get_num_glyphs ());
 }
 /**
  * hb_face_collect_variation_selectors:
index 68834ba..f1b472c 100644 (file)
@@ -94,7 +94,7 @@ struct hb_face_t
   unsigned int get_num_glyphs () const
   {
     unsigned int ret = num_glyphs.get_relaxed ();
-    if (unlikely (ret == (unsigned int) -1))
+    if (unlikely (ret == UINT_MAX))
       return load_num_glyphs ();
     return ret;
   }
index e89ad69..2795948 100644 (file)
@@ -33,6 +33,9 @@
 
 #include "hb-ot.h"
 
+#include "hb-ot-var-avar-table.hh"
+#include "hb-ot-var-fvar-table.hh"
+
 
 /**
  * SECTION:hb-font
@@ -674,7 +677,8 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t             *ffuncs,    \
                                 void                        *user_data, \
                                 hb_destroy_func_t            destroy)   \
 {                                                                        \
-  if (hb_object_is_immutable (ffuncs)) {                                 \
+  if (hb_object_is_immutable (ffuncs))                                   \
+  {                                                                      \
     if (destroy)                                                         \
       destroy (user_data);                                               \
     return;                                                              \
@@ -1332,6 +1336,7 @@ DEFINE_NULL_INSTANCE (hb_font_t) =
 
   0, /* num_coords */
   nullptr, /* coords */
+  nullptr, /* design_coords */
 
   const_cast<hb_font_funcs_t *> (&_hb_Null_hb_font_funcs_t),
 
@@ -1383,6 +1388,20 @@ hb_font_create (hb_face_t *face)
   return font;
 }
 
+static void
+_hb_font_adopt_var_coords (hb_font_t *font,
+                          int *coords, /* 2.14 normalized */
+                          float *design_coords,
+                          unsigned int coords_length)
+{
+  free (font->coords);
+  free (font->design_coords);
+
+  font->coords = coords;
+  font->design_coords = design_coords;
+  font->num_coords = coords_length;
+}
+
 /**
  * hb_font_create_sub_font:
  * @parent: parent font.
@@ -1413,15 +1432,22 @@ hb_font_create_sub_font (hb_font_t *parent)
   font->y_ppem = parent->y_ppem;
   font->ptem = parent->ptem;
 
-  font->num_coords = parent->num_coords;
-  if (font->num_coords)
+  unsigned int num_coords = parent->num_coords;
+  if (num_coords)
   {
-    unsigned int size = parent->num_coords * sizeof (parent->coords[0]);
-    font->coords = (int *) malloc (size);
-    if (unlikely (!font->coords))
-      font->num_coords = 0;
+    int *coords = (int *) calloc (num_coords, sizeof (parent->coords[0]));
+    float *design_coords = (float *) calloc (num_coords, sizeof (parent->design_coords[0]));
+    if (likely (coords && design_coords))
+    {
+      memcpy (coords, parent->coords, num_coords * sizeof (parent->coords[0]));
+      memcpy (design_coords, parent->design_coords, num_coords * sizeof (parent->design_coords[0]));
+      _hb_font_adopt_var_coords (font, coords, design_coords, num_coords);
+    }
     else
-      memcpy (font->coords, parent->coords, size);
+    {
+      free (coords);
+      free (design_coords);
+    }
   }
 
   return font;
@@ -1439,7 +1465,7 @@ hb_font_create_sub_font (hb_font_t *parent)
 hb_font_t *
 hb_font_get_empty ()
 {
-  return const_cast<hb_font_t *> (&Null(hb_font_t));
+  return const_cast<hb_font_t *> (&Null (hb_font_t));
 }
 
 /**
@@ -1481,6 +1507,7 @@ hb_font_destroy (hb_font_t *font)
   hb_font_funcs_destroy (font->klass);
 
   free (font->coords);
+  free (font->design_coords);
 
   free (font);
 }
@@ -1842,17 +1869,6 @@ hb_font_get_ptem (hb_font_t *font)
  * Variations
  */
 
-static void
-_hb_font_adopt_var_coords_normalized (hb_font_t *font,
-                                     int *coords, /* 2.14 normalized */
-                                     unsigned int coords_length)
-{
-  free (font->coords);
-
-  font->coords = coords;
-  font->num_coords = coords_length;
-}
-
 /**
  * hb_font_set_variations:
  *
@@ -1875,13 +1891,30 @@ hb_font_set_variations (hb_font_t *font,
   unsigned int coords_length = hb_ot_var_get_axis_count (font->face);
 
   int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr;
-  if (unlikely (coords_length && !normalized))
+  float *design_coords = coords_length ? (float *) calloc (coords_length, sizeof (float)) : nullptr;
+
+  if (unlikely (coords_length && !(normalized && design_coords)))
+  {
+    free (normalized);
+    free (design_coords);
     return;
+  }
 
-  hb_ot_var_normalize_variations (font->face,
-                                 variations, variations_length,
-                                 normalized, coords_length);
-  _hb_font_adopt_var_coords_normalized (font, normalized, coords_length);
+  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);
+    }
+  }
+  font->face->table.avar->map_coords (normalized, coords_length);
+
+  _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
 }
 
 /**
@@ -1898,11 +1931,20 @@ hb_font_set_var_coords_design (hb_font_t *font,
     return;
 
   int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr;
-  if (unlikely (coords_length && !normalized))
+  float *design_coords = coords_length ? (float *) calloc (coords_length, sizeof (float)) : nullptr;
+
+  if (unlikely (coords_length && !(normalized && design_coords)))
+  {
+    free (normalized);
+    free (design_coords);
     return;
+  }
+
+  if (coords_length)
+    memcpy (design_coords, coords, coords_length * sizeof (font->design_coords[0]));
 
   hb_ot_var_normalize_coords (font->face, coords_length, coords, normalized);
-  _hb_font_adopt_var_coords_normalized (font, normalized, coords_length);
+  _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
 }
 
 /**
@@ -1946,13 +1988,30 @@ hb_font_set_var_coords_normalized (hb_font_t *font,
     return;
 
   int *copy = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : nullptr;
-  if (unlikely (coords_length && !copy))
+  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;
+
+  if (unlikely (coords_length && !(copy && unmapped && design_coords)))
+  {
+    free (copy);
+    free (unmapped);
+    free (design_coords);
     return;
+  }
 
   if (coords_length)
+  {
     memcpy (copy, coords, coords_length * sizeof (coords[0]));
+    memcpy (unmapped, coords, coords_length * sizeof (coords[0]));
+  }
+
+  /* Best effort design coords simulation */
+  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_font_adopt_var_coords_normalized (font, copy, coords_length);
+  _hb_font_adopt_var_coords (font, copy, design_coords, coords_length);
 }
 
 /**
@@ -1972,6 +2031,26 @@ hb_font_get_var_coords_normalized (hb_font_t *font,
 
   return font->coords;
 }
+
+#ifdef HB_EXPERIMENTAL_API
+/**
+ * hb_font_get_var_coords_design:
+ *
+ * Return value is valid as long as variation coordinates of the font
+ * are not modified.
+ *
+ * Since: EXPERIMENTAL
+ */
+const float *
+hb_font_get_var_coords_design (hb_font_t *font,
+                              unsigned int *length)
+{
+  if (length)
+    *length = font->num_coords;
+
+  return font->design_coords;
+}
+#endif
 #endif
 
 #ifndef HB_DISABLE_DEPRECATED
@@ -2076,6 +2155,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)
 {
+  if (hb_object_is_immutable (ffuncs))
+  {
+    if (destroy)
+      destroy (user_data);
+    return;
+  }
+
   hb_font_get_glyph_trampoline_t *trampoline;
 
   trampoline = trampoline_create (func, user_data, destroy);
index 01ff201..e1a5719 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "hb-common.h"
 #include "hb-face.h"
+#include "hb-draw.h"
 
 HB_BEGIN_DECLS
 
@@ -704,6 +705,12 @@ 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,
                                   const int *coords, /* 2.14 normalized */
@@ -717,6 +724,12 @@ HB_EXTERN void
 hb_font_set_var_named_instance (hb_font_t *font,
                                unsigned instance_index);
 
+#ifdef HB_EXPERIMENTAL_API
+HB_EXTERN hb_bool_t
+hb_font_draw_glyph (hb_font_t *font, hb_codepoint_t glyph,
+                   const hb_draw_funcs_t *funcs, void *user_data);
+#endif
+
 HB_END_DECLS
 
 #endif /* HB_FONT_H */
index b1e8e64..12982fc 100644 (file)
@@ -120,6 +120,7 @@ struct hb_font_t
   /* Font variation coordinates. */
   unsigned int num_coords;
   int *coords;
+  float *design_coords;
 
   hb_font_funcs_t   *klass;
   void              *user_data;
@@ -286,7 +287,7 @@ struct hb_font_t
   }
 
   hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph,
-                               hb_position_t *x, hb_position_t *y)
+                               hb_position_t *x, hb_position_t *y)
   {
     *x = *y = 0;
     return klass->get.f.glyph_h_origin (this, user_data,
index e526bf4..b18b990 100644 (file)
  * @short_description: FreeType integration
  * @include: hb-ft.h
  *
- * Functions for using HarfBuzz with the FreeType library to provide face and
+ * Functions for using HarfBuzz with the FreeType library.
+ *
+ * HarfBuzz supports using FreeType to provide face and
  * font data.
+ *
+ * <note>Note that FreeType is not thread-safe, therefore these
+ * functions are not thread-safe either.</note>
  **/
 
 
@@ -127,10 +132,13 @@ _hb_ft_font_destroy (void *data)
 
 /**
  * hb_ft_font_set_load_flags:
- * @font:
- * @load_flags:
+ * @font: #hb_font_t to work upon
+ * @load_flags: The FreeType load flags to set
  *
+ * Sets the FT_Load_Glyph load flags for the specified #hb_font_t.
  *
+ * For more information, see 
+ * https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#ft_load_xxx
  *
  * Since: 1.0.5
  **/
@@ -140,7 +148,7 @@ hb_ft_font_set_load_flags (hb_font_t *font, int load_flags)
   if (hb_object_is_immutable (font))
     return;
 
-  if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+  if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy))
     return;
 
   hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data;
@@ -150,17 +158,21 @@ hb_ft_font_set_load_flags (hb_font_t *font, int load_flags)
 
 /**
  * hb_ft_font_get_load_flags:
- * @font:
+ * @font: #hb_font_t to work upon
  *
+ * Fetches the FT_Load_Glyph load flags of the specified #hb_font_t.
  *
+ * For more information, see 
+ * https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#ft_load_xxx
+ *
+ * Return value: FT_Load_Glyph flags found
  *
- * Return value:
  * Since: 1.0.5
  **/
 int
 hb_ft_font_get_load_flags (hb_font_t *font)
 {
-  if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+  if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy))
     return 0;
 
   const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
@@ -168,10 +180,21 @@ hb_ft_font_get_load_flags (hb_font_t *font)
   return ft_font->load_flags;
 }
 
+/**
+ * hb_ft_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
+ *
+ * Since: 0.9.2
+ **/
 FT_Face
 hb_ft_font_get_face (hb_font_t *font)
 {
-  if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+  if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy))
     return nullptr;
 
   const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
@@ -179,6 +202,47 @@ hb_ft_font_get_face (hb_font_t *font)
   return ft_font->ft_face;
 }
 
+/**
+ * hb_ft_font_lock_face:
+ * @font:
+ *
+ *
+ *
+ * Return value:
+ * Since: 2.6.5
+ **/
+FT_Face
+hb_ft_font_lock_face (hb_font_t *font)
+{
+  if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy))
+    return nullptr;
+
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
+
+  ft_font->lock.lock ();
+
+  return ft_font->ft_face;
+}
+
+/**
+ * hb_ft_font_unlock_face:
+ * @font:
+ *
+ *
+ *
+ * Return value:
+ * Since: 2.6.5
+ **/
+void
+hb_ft_font_unlock_face (hb_font_t *font)
+{
+  if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy))
+    return;
+
+  const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
+
+  ft_font->lock.unlock ();
+}
 
 
 static hb_bool_t
@@ -595,12 +659,22 @@ _hb_ft_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data
 
 /**
  * hb_ft_face_create:
- * @ft_face: (destroy destroy) (scope notified):
- * @destroy:
+ * @ft_face: (destroy destroy) (scope notified): FT_Face to work upon
+ * @destroy: A callback to call when the face object is not needed anymore
+ *
+ * Creates an #hb_face_t face object from the specified FT_Face.
+ *
+ * This variant of the function does not provide any life-cycle management.
  *
+ * Most client programs should use hb_ft_face_create_referenced()
+ * (or, perhaps, hb_ft_face_create_cached()) instead. 
  *
+ * If you know you have valid reasons not to use hb_ft_face_create_referenced(),
+ * then it is the client program's responsibility to destroy @ft_face 
+ * after the #hb_face_t face object has been destroyed.
+ *
+ * Return value: (transfer full): the new #hb_face_t face object
  *
- * Return value: (transfer full):
  * Since: 0.9.2
  **/
 hb_face_t *
@@ -630,11 +704,20 @@ hb_ft_face_create (FT_Face           ft_face,
 
 /**
  * hb_ft_face_create_referenced:
- * @ft_face:
+ * @ft_face: FT_Face to work upon
+ *
+ * Creates an #hb_face_t face object from the specified FT_Face.
+ *
+ * This is the preferred variant of the hb_ft_face_create*
+ * function family, because it calls FT_Reference_Face() on @ft_face,
+ * ensuring that @ft_face remains alive as long as the resulting
+ * #hb_face_t face object remains alive. Also calls FT_Done_Face()
+ * when the #hb_face_t face object is destroyed.
  *
+ * Use this version unless you know you have good reasons not to.
  *
+ * Return value: (transfer full): the new #hb_face_t face object
  *
- * Return value: (transfer full):
  * Since: 0.9.38
  **/
 hb_face_t *
@@ -652,11 +735,21 @@ hb_ft_face_finalize (FT_Face ft_face)
 
 /**
  * hb_ft_face_create_cached:
- * @ft_face:
+ * @ft_face: FT_Face to work upon
+ *
+ * Creates an #hb_face_t face object from the specified FT_Face.
+ *
+ * This variant of the function caches the newly created #hb_face_t
+ * face object, using the @generic pointer of @ft_face. Subsequent function
+ * calls that are passed the same @ft_face parameter will have the same
+ * #hb_face_t returned to them, and that #hb_face_t will be correctly
+ * reference counted.
  *
+ * However, client programs are still responsible for destroying
+ * @ft_face after the last #hb_face_t face object has been destroyed.
  *
+ * Return value: (transfer full): the new #hb_face_t face object
  *
- * Return value: (transfer full):
  * Since: 0.9.2
  **/
 hb_face_t *
@@ -674,15 +767,34 @@ hb_ft_face_create_cached (FT_Face ft_face)
   return hb_face_reference ((hb_face_t *) ft_face->generic.data);
 }
 
-
 /**
  * hb_ft_font_create:
- * @ft_face: (destroy destroy) (scope notified):
- * @destroy:
+ * @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
+ *
+ * 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>
+ *
+ * This variant of the function does not provide any life-cycle management.
  *
+ * Most client programs should use hb_ft_font_create_referenced()
+ * instead. 
  *
+ * If you know you have valid reasons not to use hb_ft_font_create_referenced(),
+ * then it is the client program's responsibility to destroy @ft_face 
+ * after the #hb_font_t font object has been destroyed.
+ *
+ * HarfBuzz will use the @destroy callback on the #hb_font_t font object 
+ * if it is supplied when you use this function. However, even if @destroy
+ * is provided, it is the client program's responsibility to destroy @ft_face,
+ * and it is the client program's responsibility to ensure that @ft_face is
+ * destroyed only after the #hb_font_t font object has been destroyed.
+ *
+ * Return value: (transfer full): the new #hb_font_t font object
  *
- * Return value: (transfer full):
  * Since: 0.9.2
  **/
 hb_font_t *
@@ -700,6 +812,16 @@ hb_ft_font_create (FT_Face           ft_face,
   return font;
 }
 
+/**
+ * hb_ft_font_has_changed:
+ * @font: #hb_font_t to work upon
+ *
+ * Refreshes the state of @font when the underlying FT_Face has changed.
+ * This function should be called after changing the size or
+ * variation-axis settings on the FT_Face.
+ *
+ * Since: 1.0.5
+ **/
 void
 hb_ft_font_changed (hb_font_t *font)
 {
@@ -718,7 +840,7 @@ hb_ft_font_changed (hb_font_t *font)
                    ft_face->size->metrics.y_ppem);
 #endif
 
-#ifdef HAVE_FT_GET_VAR_BLEND_COORDINATES
+#if defined(HAVE_FT_GET_VAR_BLEND_COORDINATES) && !defined(HB_NO_VAR)
   FT_MM_Var *mm_var = nullptr;
   if (!FT_Get_MM_Var (ft_face, &mm_var))
   {
@@ -755,11 +877,23 @@ hb_ft_font_changed (hb_font_t *font)
 
 /**
  * hb_ft_font_create_referenced:
- * @ft_face:
+ * @ft_face: FT_Face to work upon
+ *
+ * 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>
  *
+ * This is the preferred variant of the hb_ft_font_create*
+ * function family, because it calls FT_Reference_Face() on @ft_face,
+ * ensuring that @ft_face remains alive as long as the resulting
+ * #hb_font_t font object remains alive.
  *
+ * Use this version unless you know you have good reasons not to.
+ *
+ * Return value: (transfer full): the new #hb_font_t font object
  *
- * Return value: (transfer full):
  * Since: 0.9.38
  **/
 hb_font_t *
@@ -818,6 +952,28 @@ _release_blob (FT_Face ft_face)
   hb_blob_destroy ((hb_blob_t *) ft_face->generic.data);
 }
 
+/**
+ * hb_ft_font_set_funcs:
+ * @font: #hb_font_t to work upon
+ *
+ * Configures the font-functions structure of the specified
+ * #hb_font_t font object to use FreeType font functions.
+ *
+ * In particular, you can use this function to configure an
+ * existing #hb_face_t face object for use with FreeType font
+ * functions even if that #hb_face_t face object was initially
+ * created with hb_face_create(), and therefore was not
+ * initially configured to use FreeType font functions.
+ *
+ * An #hb_face_t face object created with hb_ft_face_create()
+ * is preconfigured for FreeType font functions and does not
+ * require this function to be used.
+ *
+ * <note>Note: Internally, this function creates an FT_Face.
+* </note>
+ *
+ * Since: 1.0.5
+ **/
 void
 hb_ft_font_set_funcs (hb_font_t *font)
 {
@@ -857,7 +1013,7 @@ hb_ft_font_set_funcs (hb_font_t *font)
     FT_Set_Transform (ft_face, &matrix, nullptr);
   }
 
-#ifdef HAVE_FT_SET_VAR_BLEND_COORDINATES
+#if defined(HAVE_FT_GET_VAR_BLEND_COORDINATES) && !defined(HB_NO_VAR)
   unsigned int num_coords;
   const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
   if (num_coords)
index 94013ee..bf07115 100644 (file)
@@ -110,6 +110,12 @@ hb_ft_font_create_referenced (FT_Face ft_face);
 HB_EXTERN FT_Face
 hb_ft_font_get_face (hb_font_t *font);
 
+HB_EXTERN FT_Face
+hb_ft_font_lock_face (hb_font_t *font);
+
+HB_EXTERN void
+hb_ft_font_unlock_face (hb_font_t *font);
+
 HB_EXTERN void
 hb_ft_font_set_load_flags (hb_font_t *font, int load_flags);
 
index db02b67..058f65a 100644 (file)
  * @short_description: GLib integration
  * @include: hb-glib.h
  *
- * Functions for using HarfBuzz with the GLib library to provide Unicode data.
+ * 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
+ * structure.
  **/
 
 
@@ -169,6 +173,17 @@ glib_script_to_script[] =
 };
 #endif
 
+/**
+ * hb_glib_script_to_script:
+ * @script: The GUnicodeScript identifier to query
+ *
+ * Fetches the #hb_script_t script that corresponds to the
+ * specified GUnicodeScript identifier.
+ *
+ * Return value: the #hb_script_t script found
+ *
+ * Since: 0.9.38
+ **/
 hb_script_t
 hb_glib_script_to_script (GUnicodeScript script)
 {
@@ -185,6 +200,17 @@ hb_glib_script_to_script (GUnicodeScript script)
 #endif
 }
 
+/**
+ * hb_glib_script_from_script:
+ * @script: The #hb_script_t to query
+ *
+ * Fetches the GUnicodeScript identifier that corresponds to the
+ * specified #hb_script_t script.
+ *
+ * Return value: the GUnicodeScript identifier found
+ *
+ * Since: 0.9.38
+ **/
 GUnicodeScript
 hb_glib_script_from_script (hb_script_t script)
 {
@@ -373,6 +399,16 @@ void free_static_glib_funcs ()
 }
 #endif
 
+/**
+ * hb_glib_get_unicode_funcs:
+ *
+ * Fetches a Unicode-functions structure that is populated
+ * with the appropriate GLib function for each method.
+ *
+ * Return value: (transfer none): a pointer to the #hb_unicode_funcs_t Unicode-functions structure
+ *
+ * Since: 0.9.38
+ **/
 hb_unicode_funcs_t *
 hb_glib_get_unicode_funcs ()
 {
@@ -391,6 +427,12 @@ _hb_g_bytes_unref (void *data)
 
 /**
  * hb_glib_blob_create:
+ * @gbytes: the GBytes structure to work upon
+ *
+ * Creates an #hb_blob_t blob from the specified
+ * GBytes data structure.
+ *
+ * Return value: (transfer full): the new #hb_blob_t blob object
  *
  * Since: 0.9.38
  **/
index 17f1ade..2ffd1c9 100644 (file)
@@ -1,6 +1,6 @@
 /*** BEGIN file-header ***/
 /*
- * Copyright © 2011  Google, Inc.
+ * Copyright (C) 2011  Google, Inc.
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
index 7ef9dfc..f8bd29e 100644 (file)
@@ -1,6 +1,6 @@
 /*** BEGIN file-header ***/
 /*
- * Copyright © 2013  Google, Inc.
+ * Copyright (C) 2013  Google, Inc.
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
index 7f4922e..7c46e26 100644 (file)
 /**
  * SECTION:hb-gobject
  * @title: hb-gobject
- * @short_description: GObject integration
+ * @short_description: GObject integration support
  * @include: hb-gobject.h
  *
- * Functions for using HarfBuzz with the GObject library to provide
+ * Support for using HarfBuzz with the GObject library to provide
  * type data.
+ *
+ * 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.
+ *
+ * For client programs using the GNOME and GTK software stack, please see the
+ * GLib and FreeType integration pages.
  **/
 
 
index 800beed..6fad8d7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2011  Google, Inc.
+ * Copyright (C) 2011  Google, Inc.
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
index ea1bd25..8891aa0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2011  Google, Inc.
+ * Copyright (C) 2011  Google, Inc.
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
index f0f2f8c..d8a72dc 100644 (file)
  * @short_description: Graphite2 integration
  * @include: hb-graphite2.h
  *
- * Functions for using HarfBuzz with the Graphite2 fonts.
+ * Functions for using HarfBuzz with fonts that include Graphite features.
+ * 
+ * For Graphite features to work, you must be sure that HarfBuzz was compiled
+ * with the `graphite2` shaping engine enabled. Currently, the default is to
+ * not enable `graphite2` shaping.
  **/
 
 
@@ -152,7 +156,15 @@ _hb_graphite2_shaper_face_data_destroy (hb_graphite2_face_data_t *data)
   free (data);
 }
 
-/*
+/**
+ * hb_graphite2_face_get_gr_face:
+ * @face: @hb_face_t to query
+ *
+ * Fetches the Graphite2 gr_face corresponding to the specified
+ * #hb_face_t face object.
+ *
+ * Return value: the gr_face found
+ *
  * Since: 0.9.10
  */
 gr_face *
@@ -376,7 +388,7 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
   buffer->len = glyph_count;
 
   /* Positioning. */
-  unsigned int currclus = (unsigned int) -1;
+  unsigned int currclus = UINT_MAX;
   const hb_glyph_info_t *info = buffer->info;
   hb_glyph_position_t *pPos = hb_buffer_get_glyph_positions (buffer, nullptr);
   if (!HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
index 1720191..f299da9 100644 (file)
 
 HB_BEGIN_DECLS
 
-
+/**
+ * HB_GRAPHITE2_TAG_SILF:
+ *
+ * The #hb_tag_t tag for the `Silf` table, which holds Graphite
+ * features. 
+ *
+ * For more information, see http://graphite.sil.org/
+ *
+ **/
 #define HB_GRAPHITE2_TAG_SILF HB_TAG('S','i','l','f')
 
 
index 985ff02..c1dcc24 100644 (file)
  * @short_description: ICU integration
  * @include: hb-icu.h
  *
- * Functions for using HarfBuzz with the ICU library to provide Unicode data.
+ * Functions for using HarfBuzz with the International Components for Unicode
+ * (ICU) library. HarfBuzz supports using ICU to provide Unicode data, by attaching
+ * ICU functions to the virtual methods in a #hb_unicode_funcs_t function
+ * structure.
+ **/
+
+/**
+ * hb_icu_script_to_script:
+ * @script: The UScriptCode identifier to query
+ *
+ * Fetches the #hb_script_t script that corresponds to the
+ * specified UScriptCode identifier.
+ *
+ * Return value: the #hb_script_t script found
+ *
  **/
 
 hb_script_t
@@ -66,6 +80,16 @@ hb_icu_script_to_script (UScriptCode script)
   return hb_script_from_string (uscript_getShortName (script), -1);
 }
 
+/**
+ * hb_icu_script_from_script:
+ * @script: The #hb_script_t script to query
+ *
+ * Fetches the UScriptCode identifier that corresponds to the
+ * specified #hb_script_t script.
+ *
+ * Return value: the UScriptCode identifier found
+ *
+ **/
 UScriptCode
 hb_icu_script_from_script (hb_script_t script)
 {
@@ -350,6 +374,16 @@ void free_static_icu_funcs ()
 }
 #endif
 
+/**
+ * hb_icu_get_unicode_funcs:
+ *
+ * Fetches a Unicode-functions structure that is populated
+ * with the appropriate ICU function for each method.
+ *
+ * Return value: (transfer none): a pointer to the #hb_unicode_funcs_t Unicode-functions structure
+ *
+ * Since: 0.9.38
+ **/
 hb_unicode_funcs_t *
 hb_icu_get_unicode_funcs ()
 {
index 99d533c..3f952fe 100644 (file)
@@ -52,8 +52,7 @@ struct hb_kern_machine_t
     OT::hb_ot_apply_context_t c (1, font, buffer);
     c.set_lookup_mask (kern_mask);
     c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
-    OT::hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input;
-    skippy_iter.init (&c);
+    auto &skippy_iter = c.iter_input;
 
     bool horizontal = HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction);
     unsigned int count = buffer->len;
index 15535d7..54bc60d 100644 (file)
  * Casts
  */
 
-/* Cast to struct T, reference to reference */
-template<typename Type, typename TObject>
-static inline const Type& CastR(const TObject &X)
-{ return reinterpret_cast<const Type&> (X); }
-template<typename Type, typename TObject>
-static inline Type& CastR(TObject &X)
-{ return reinterpret_cast<Type&> (X); }
-
-/* Cast to struct T, pointer to pointer */
-template<typename Type, typename TObject>
-static inline const Type* CastP(const TObject *X)
-{ return reinterpret_cast<const Type*> (X); }
-template<typename Type, typename TObject>
-static inline Type* CastP(TObject *X)
-{ return reinterpret_cast<Type*> (X); }
-
 /* StructAtOffset<T>(P,Ofs) returns the struct T& that is placed at memory
  * location pointed to by P plus Ofs bytes. */
 template<typename Type>
@@ -70,7 +54,7 @@ static inline const Type& StructAtOffsetUnaligned(const void *P, unsigned int of
 {
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wcast-align"
-  return * reinterpret_cast<Type*> ((char *) P + offset);
+  return * reinterpret_cast<const Type*> ((const char *) P + offset);
 #pragma GCC diagnostic pop
 }
 template<typename Type>
@@ -135,7 +119,7 @@ static inline Type& StructAfter(TObject &X)
 
 #define DEFINE_SIZE_ARRAY(size, array) \
   DEFINE_COMPILES_ASSERTION ((void) (array)[0].static_size) \
-  DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + HB_VAR_ARRAY * sizeof ((array)[0])) \
+  DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + (HB_VAR_ARRAY+0) * sizeof ((array)[0])) \
   static constexpr unsigned null_size = (size); \
   static constexpr unsigned min_size = (size)
 
@@ -250,7 +234,7 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
   static Returned* convert (Stored *p) { return p; }
 
   /* By default null/init/fini the object. */
-  static const Stored* get_null () { return &Null(Stored); }
+  static const Stored* get_null () { return &Null (Stored); }
   static Stored *create (Data *data)
   {
     Stored *p = (Stored *) calloc (1, sizeof (Stored));
index a2c770c..191be14 100644 (file)
@@ -69,7 +69,7 @@ hb_map_create ()
 hb_map_t *
 hb_map_get_empty ()
 {
-  return const_cast<hb_map_t *> (&Null(hb_map_t));
+  return const_cast<hb_map_t *> (&Null (hb_map_t));
 }
 
 /**
index 8c8db4d..b7bf7fe 100644 (file)
@@ -135,8 +135,8 @@ struct hb_hashmap_t
       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);
+                        old_items[i].hash,
+                        old_items[i].value);
 
     free (old_items);
 
@@ -211,7 +211,7 @@ struct hb_hashmap_t
   )
 
   /* Sink interface. */
-  hb_hashmap_t<K, V, kINVALID, vINVALID>& operator << (const hb_pair_t<K, V>& v)
+  hb_hashmap_t& operator << (const hb_pair_t<K, V>& v)
   { set (v.first, v.second); return *this; }
 
   protected:
index 2dfaeb7..c08b191 100644 (file)
@@ -396,5 +396,16 @@ using hb_is_trivial= hb_bool_constant<
 >;
 #define hb_is_trivial(T) hb_is_trivial<T>::value
 
+/* hb_unwrap_type (T)
+ * If T has no T::type, returns T. Otherwise calls itself on T::type recursively.
+ */
+
+template <typename T, typename>
+struct _hb_unwrap_type : hb_type_identity_t<T> {};
+template <typename T>
+struct _hb_unwrap_type<T, hb_void_t<typename T::type>> : _hb_unwrap_type<typename T::type, void> {};
+template <typename T>
+using hb_unwrap_type = _hb_unwrap_type<T, void>;
+#define hb_unwrap_type(T) typename hb_unwrap_type<T>::type
 
 #endif /* HB_META_HH */
index d457820..9853939 100644 (file)
@@ -104,7 +104,7 @@ struct NullHelper
          } \
        }; \
        namespace Namespace { \
-       static_assert (true, "Just so we take semicolon after.")
+       static_assert (true, "") /* Require semicolon after. */
 #define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \
        const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]
 
@@ -117,7 +117,7 @@ struct NullHelper
            return _hb_Null_##Type; \
          } \
        }; \
-       static_assert (true, "Just so we take semicolon after.")
+       static_assert (true, "") /* Require semicolon after. */
 #define DEFINE_NULL_INSTANCE(Type) \
        const Type _hb_Null_##Type
 
@@ -135,7 +135,7 @@ template <typename Type>
 static inline Type& Crap () {
   static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
   Type *obj = reinterpret_cast<Type *> (_hb_CrapPool);
-  memcpy (obj, &Null(Type), sizeof (*obj));
+  memcpy (obj, &Null (Type), sizeof (*obj));
   return *obj;
 }
 template <typename QType>
@@ -148,11 +148,11 @@ struct CrapHelper
 
 template <typename Type>
 struct CrapOrNullHelper {
-  static Type & get () { return Crap(Type); }
+  static Type & get () { return Crap (Type); }
 };
 template <typename Type>
 struct CrapOrNullHelper<const Type> {
-  static const Type & get () { return Null(Type); }
+  static const Type & get () { return Null (Type); }
 };
 #define CrapOrNull(Type) CrapOrNullHelper<Type>::get ()
 
@@ -174,7 +174,7 @@ struct hb_nonnull_ptr_t
   /* Only auto-cast to const types. */
   template <typename C> operator const C * () const { return get (); }
   operator const char * () const { return (const char *) get (); }
-  T * get () const { return v ? v : const_cast<T *> (&Null(T)); }
+  T * get () const { return v ? v : const_cast<T *> (&Null (T)); }
   T * get_raw () const { return v; }
 
   T *v;
index c78c850..1a9dbba 100644 (file)
 
 #include "hb.hh"
 
-#include <float.h>
 
-
-#line 37 "hb-number-parser.hh"
+#line 35 "hb-number-parser.hh"
 static const unsigned char _double_parser_trans_keys[] = {
        0u, 0u, 43u, 57u, 46u, 57u, 48u, 57u, 43u, 57u, 48u, 57u, 48u, 101u, 48u, 57u, 
        46u, 101u, 0
@@ -93,12 +91,12 @@ static const int double_parser_error = 0;
 static const int double_parser_en_main = 1;
 
 
-#line 70 "hb-number-parser.rl"
+#line 68 "hb-number-parser.rl"
 
 
 /* Works only for n < 512 */
 static inline double
-_pow10 (unsigned int exponent)
+_pow10 (unsigned exponent)
 {
   static const double _powers_of_10[] =
   {
@@ -112,38 +110,37 @@ _pow10 (unsigned int exponent)
     100.,
     10.
   };
-  unsigned int mask = 1 << (ARRAY_LENGTH (_powers_of_10) - 1);
+  unsigned mask = 1 << (ARRAY_LENGTH (_powers_of_10) - 1);
   double result = 1;
   for (const double *power = _powers_of_10; mask; ++power, mask >>= 1)
     if (exponent & mask) result *= *power;
   return result;
 }
 
+/* a variant of strtod that also gets end of buffer in its second argument */
 static inline double
-strtod_rl (const char *buf, char **end_ptr)
+strtod_rl (const char *p, const char **end_ptr /* IN/OUT */)
 {
-  const char *p, *pe;
   double value = 0;
   double frac = 0;
   double frac_count = 0;
-  unsigned int exp = 0;
+  unsigned exp = 0;
   bool neg = false, exp_neg = false, exp_overflow = false;
-  const unsigned long long MAX_FRACT = 0xFFFFFFFFFFFFFull; /* 1^52-1 */
-  const unsigned int MAX_EXP = 0x7FFu; /* 1^11-1 */
-  p = buf;
-  pe = p + strlen (p);
+  const unsigned long long MAX_FRACT = 0xFFFFFFFFFFFFFull; /* 2^52-1 */
+  const unsigned MAX_EXP = 0x7FFu; /* 2^11-1 */
 
+  const char *pe = *end_ptr;
   while (p < pe && ISSPACE (*p))
     p++;
 
   int cs;
   
-#line 142 "hb-number-parser.hh"
+#line 139 "hb-number-parser.hh"
        {
        cs = double_parser_start;
        }
 
-#line 147 "hb-number-parser.hh"
+#line 144 "hb-number-parser.hh"
        {
        int _slen;
        int _trans;
@@ -169,21 +166,21 @@ _resume:
 
        switch ( _double_parser_trans_actions[_trans] ) {
        case 1:
-#line 39 "hb-number-parser.rl"
+#line 37 "hb-number-parser.rl"
        { neg = true; }
        break;
        case 4:
-#line 40 "hb-number-parser.rl"
+#line 38 "hb-number-parser.rl"
        { exp_neg = true; }
        break;
        case 2:
-#line 42 "hb-number-parser.rl"
+#line 40 "hb-number-parser.rl"
        {
        value = value * 10. + ((*p) - '0');
 }
        break;
        case 3:
-#line 45 "hb-number-parser.rl"
+#line 43 "hb-number-parser.rl"
        {
        if (likely (frac <= MAX_FRACT / 10))
        {
@@ -193,7 +190,7 @@ _resume:
 }
        break;
        case 5:
-#line 52 "hb-number-parser.rl"
+#line 50 "hb-number-parser.rl"
        {
        if (likely (exp * 10 + ((*p) - '0') <= MAX_EXP))
          exp = exp * 10 + ((*p) - '0');
@@ -201,7 +198,7 @@ _resume:
          exp_overflow = true;
 }
        break;
-#line 205 "hb-number-parser.hh"
+#line 202 "hb-number-parser.hh"
        }
 
 _again:
@@ -213,10 +210,10 @@ _again:
        _out: {}
        }
 
-#line 116 "hb-number-parser.rl"
+#line 113 "hb-number-parser.rl"
 
 
-  *end_ptr = (char *) p;
+  *end_ptr = p;
 
   if (frac_count) value += frac / _pow10 (frac_count);
   if (neg) value *= -1.;
index 8445fa2..c6c4a3b 100644 (file)
@@ -28,8 +28,6 @@
 
 #include "hb.hh"
 
-#include <float.h>
-
 %%{
 
 machine double_parser;
@@ -71,7 +69,7 @@ main := (
 
 /* Works only for n < 512 */
 static inline double
-_pow10 (unsigned int exponent)
+_pow10 (unsigned exponent)
 {
   static const double _powers_of_10[] =
   {
@@ -85,27 +83,26 @@ _pow10 (unsigned int exponent)
     100.,
     10.
   };
-  unsigned int mask = 1 << (ARRAY_LENGTH (_powers_of_10) - 1);
+  unsigned mask = 1 << (ARRAY_LENGTH (_powers_of_10) - 1);
   double result = 1;
   for (const double *power = _powers_of_10; mask; ++power, mask >>= 1)
     if (exponent & mask) result *= *power;
   return result;
 }
 
+/* a variant of strtod that also gets end of buffer in its second argument */
 static inline double
-strtod_rl (const char *buf, char **end_ptr)
+strtod_rl (const char *p, const char **end_ptr /* IN/OUT */)
 {
-  const char *p, *pe;
   double value = 0;
   double frac = 0;
   double frac_count = 0;
-  unsigned int exp = 0;
+  unsigned exp = 0;
   bool neg = false, exp_neg = false, exp_overflow = false;
-  const unsigned long long MAX_FRACT = 0xFFFFFFFFFFFFFull; /* 1^52-1 */
-  const unsigned int MAX_EXP = 0x7FFu; /* 1^11-1 */
-  p = buf;
-  pe = p + strlen (p);
+  const unsigned long long MAX_FRACT = 0xFFFFFFFFFFFFFull; /* 2^52-1 */
+  const unsigned MAX_EXP = 0x7FFu; /* 2^11-1 */
 
+  const char *pe = *end_ptr;
   while (p < pe && ISSPACE (*p))
     p++;
 
@@ -115,7 +112,7 @@ strtod_rl (const char *buf, char **end_ptr)
     write exec;
   }%%
 
-  *end_ptr = (char *) p;
+  *end_ptr = p;
 
   if (frac_count) value += frac / _pow10 (frac_count);
   if (neg) value *= -1.;
index 4f84d4a..6e4f3f7 100644 (file)
 
 #include "hb.hh"
 #include "hb-machinery.hh"
+#include "hb-number.hh"
 #include "hb-number-parser.hh"
 
-#include <locale.h>
-#ifdef HAVE_XLOCALE_H
-#include <xlocale.h>
-#endif
-
 template<typename T, typename Func>
 static bool
 _parse_number (const char **pp, const char *end, T *pv,
               bool whole_buffer, Func f)
 {
   char buf[32];
-  unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1,
-                            (unsigned int) (end - *pp));
+  unsigned len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned) (end - *pp));
   strncpy (buf, *pp, len);
   buf[len] = '\0';
 
@@ -50,7 +45,8 @@ _parse_number (const char **pp, const char *end, T *pv,
   *pv = f (p, &pend);
   if (unlikely (errno || p == pend ||
                /* Check if consumed whole buffer if is requested */
-               (whole_buffer && pend - p != end - *pp))) return false;
+               (whole_buffer && pend - p != end - *pp)))
+    return false;
 
   *pp += pend - p;
   return true;
@@ -65,83 +61,20 @@ hb_parse_int (const char **pp, const char *end, int *pv, bool whole_buffer)
 }
 
 bool
-hb_parse_uint (const char **pp, const char *end, unsigned int *pv,
+hb_parse_uint (const char **pp, const char *end, unsigned *pv,
               bool whole_buffer, int base)
 {
-  return _parse_number<unsigned int> (pp, end, pv, whole_buffer,
-                                     [base] (const char *p, char **end)
-                                     { return strtoul (p, end, base); });
-}
-
-
-#if defined (HAVE_NEWLOCALE) && defined (HAVE_STRTOD_L)
-#define USE_XLOCALE 1
-#define HB_LOCALE_T locale_t
-#define HB_CREATE_LOCALE(locName) newlocale (LC_ALL_MASK, locName, nullptr)
-#define HB_FREE_LOCALE(loc) freelocale (loc)
-#elif defined(_MSC_VER)
-#define USE_XLOCALE 1
-#define HB_LOCALE_T _locale_t
-#define HB_CREATE_LOCALE(locName) _create_locale (LC_ALL, locName)
-#define HB_FREE_LOCALE(loc) _free_locale (loc)
-#define strtod_l(a, b, c) _strtod_l ((a), (b), (c))
-#endif
-
-#ifdef USE_XLOCALE
-
-#if HB_USE_ATEXIT
-static void free_static_C_locale ();
-#endif
-
-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 C_locale = HB_CREATE_LOCALE ("C");
-
-#if HB_USE_ATEXIT
-    atexit (free_static_C_locale);
-#endif
-
-    return C_locale;
-  }
-  static void destroy (HB_LOCALE_T p)
-  {
-    HB_FREE_LOCALE (p);
-  }
-  static HB_LOCALE_T get_null ()
-  {
-    return nullptr;
-  }
-} static_C_locale;
-
-#if HB_USE_ATEXIT
-static
-void free_static_C_locale ()
-{
-  static_C_locale.free_instance ();
-}
-#endif
-
-static HB_LOCALE_T
-get_C_locale ()
-{
-  return static_C_locale.get_unconst ();
+  return _parse_number<unsigned> (pp, end, pv, whole_buffer,
+                                 [base] (const char *p, char **end)
+                                 { return strtoul (p, end, base); });
 }
-#endif /* USE_XLOCALE */
 
 bool
-hb_parse_double (const char **pp, const char *end, double *pv,
-                bool whole_buffer)
+hb_parse_double (const char **pp, const char *end, double *pv, bool whole_buffer)
 {
-  return _parse_number<double> (pp, end, pv, whole_buffer,
-                               [] (const char *p, char **end)
-                               {
-#ifdef USE_XLOCALE
-                                 return strtod_l (p, end, get_C_locale ());
-#else
-                                 return strtod_rl (p, end);
-#endif
-                               });
+  const char *pend = end;
+  *pv = strtod_rl (*pp, &pend);
+  if (unlikely (*pp == pend)) return false;
+  *pp = pend;
+  return !whole_buffer || end == pend;
 }
index cb1fdf1..2f01ce9 100644 (file)
@@ -249,7 +249,7 @@ struct TTCHeader
     switch (u.header.version.major) {
     case 2: /* version 2 is compatible with version 1 */
     case 1: return u.version1.get_face (i);
-    default:return Null(OpenTypeFontFace);
+    default:return Null (OpenTypeFontFace);
     }
   }
 
@@ -284,7 +284,7 @@ struct TTCHeader
 struct ResourceRecord
 {
   const OpenTypeFontFace & get_face (const void *data_base) const
-  { return CastR<OpenTypeFontFace> ((data_base+offset).arrayZ); }
+  { return * reinterpret_cast<const OpenTypeFontFace *> ((data_base+offset).arrayZ); }
 
   bool sanitize (hb_sanitize_context_t *c,
                 const void *data_base) const
@@ -478,7 +478,7 @@ struct OpenTypeFontFile
     case TrueTypeTag:  return u.fontFace;
     case TTCTag:       return u.ttcHeader.get_face (i);
     case DFontTag:     return u.rfHeader.get_face (i, base_offset);
-    default:           return Null(OpenTypeFontFace);
+    default:           return Null (OpenTypeFontFace);
     }
   }
 
index af242ec..fee71df 100644 (file)
@@ -73,6 +73,13 @@ struct IntType
 
   HB_INTERNAL static int cmp (const IntType *a, const IntType *b)
   { return b->cmp (*a); }
+  HB_INTERNAL static int cmp (const void *a, const void *b)
+  {
+    IntType *pa = (IntType *) a;
+    IntType *pb = (IntType *) b;
+
+    return pb->cmp (*pa);
+  }
   template <typename Type2>
   int cmp (Type2 a) const
   {
@@ -306,11 +313,8 @@ struct OffsetTo : Offset<OffsetType, has_null>
   }
 
   template <typename ...Ts>
-  bool serialize_subset (hb_subset_context_t *c,
-                        const OffsetTo& src,
-                        const void *src_base,
-                        const void *dst_base,
-                        Ts&&... ds)
+  bool serialize_subset (hb_subset_context_t *c, const OffsetTo& src,
+                        const void *src_base, Ts&&... ds)
   {
     *this = 0;
     if (src.is_null ())
@@ -323,7 +327,7 @@ struct OffsetTo : Offset<OffsetType, has_null>
     bool ret = c->dispatch (src_base+src, hb_forward<Ts> (ds)...);
 
     if (ret || !has_null)
-      s->add_link (*this, s->pop_pack (), dst_base);
+      s->add_link (*this, s->pop_pack ());
     else
       s->pop_discard ();
 
@@ -331,11 +335,13 @@ struct OffsetTo : Offset<OffsetType, has_null>
   }
 
   /* 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&&...
+   */
   template <typename ...Ts>
-  bool serialize_copy (hb_serialize_context_t *c,
-                      const OffsetTo& src,
-                      const void *src_base,
-                      const void *dst_base,
+  bool serialize_copy (hb_serialize_context_t *c, const OffsetTo& src,
+                      const void *src_base, unsigned dst_bias,
+                      hb_serialize_context_t::whence_t whence,
                       Ts&&... ds)
   {
     *this = 0;
@@ -346,11 +352,15 @@ struct OffsetTo : Offset<OffsetType, has_null>
 
     bool ret = c->copy (src_base+src, hb_forward<Ts> (ds)...);
 
-    c->add_link (*this, c->pop_pack (), dst_base);
+    c->add_link (*this, c->pop_pack (), whence, dst_bias);
 
     return ret;
   }
 
+  bool serialize_copy (hb_serialize_context_t *c, const OffsetTo& src,
+                      const void *src_base, unsigned dst_bias = 0)
+  { return serialize_copy (c, src, src_base, dst_bias, hb_serialize_context_t::Head); }
+
   bool sanitize_shallow (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -594,7 +604,7 @@ 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); }
 
-  bool serialize (hb_serialize_context_t *c, unsigned int items_len)
+  hb_success_t serialize (hb_serialize_context_t *c, unsigned items_len)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (*this))) return_trace (false);
@@ -604,7 +614,7 @@ struct ArrayOf
   }
   template <typename Iterator,
            hb_requires (hb_is_source_of (Iterator, Type))>
-  bool serialize (hb_serialize_context_t *c, Iterator items)
+  hb_success_t serialize (hb_serialize_context_t *c, Iterator items)
   {
     TRACE_SERIALIZE (this);
     unsigned count = items.len ();
@@ -1026,18 +1036,15 @@ struct VarSizedBinSearchArrayOf
   template <typename T>
   const Type *bsearch (const T &key) const
   {
-    unsigned int size = header.unitSize;
-    int min = 0, max = (int) get_length () - 1;
-    while (min <= max)
-    {
-      int mid = ((unsigned int) min + (unsigned int) max) / 2;
-      const Type *p = (const Type *) (((const char *) &bytesZ) + (mid * size));
-      int c = p->cmp (key);
-      if (c < 0) max = mid - 1;
-      else if (c > 0) min = mid + 1;
-      else return p;
-    }
-    return nullptr;
+    unsigned pos;
+    return hb_bsearch_impl (&pos,
+                           key,
+                           (const void *) bytesZ,
+                           get_length (),
+                           header.unitSize,
+                           _hb_cmp_method<T, Type>)
+          ? (const Type *) (((const char *) &bytesZ) + (pos * header.unitSize))
+          : nullptr;
   }
 
   private:
index 6735c74..e5286cd 100644 (file)
@@ -38,6 +38,9 @@ using namespace OT;
 
 #define CFF_UNDEF_CODE  0xFFFFFFFF
 
+using objidx_t = hb_serialize_context_t::objidx_t;
+using whence_t = hb_serialize_context_t::whence_t;
+
 /* utility macro */
 template<typename Type>
 static inline const Type& StructAtOffsetOrNull (const void *P, unsigned int offset)
@@ -89,11 +92,14 @@ struct CFFIndex
   unsigned int offset_array_size () const
   { return calculate_offset_array_size (offSize, count); }
 
-  static unsigned int calculate_serialized_size (unsigned int offSize_, unsigned int count,
-                                                unsigned int dataSize)
+  CFFIndex *copy (hb_serialize_context_t *c) const
   {
-    if (count == 0) return COUNT::static_size;
-    return min_size + calculate_offset_array_size (offSize_, count) + dataSize;
+    TRACE_SERIALIZE (this);
+    unsigned int size = get_size ();
+    CFFIndex *out = c->allocate_size<CFFIndex> (size);
+    if (likely (out))
+      memcpy (out, this, size);
+    return_trace (out);
   }
 
   bool serialize (hb_serialize_context_t *c, const CFFIndex &src)
@@ -101,7 +107,7 @@ struct CFFIndex
     TRACE_SERIALIZE (this);
     unsigned int size = src.get_size ();
     CFFIndex *dest = c->allocate_size<CFFIndex> (size);
-    if (unlikely (dest == nullptr)) return_trace (false);
+    if (unlikely (!dest)) return_trace (false);
     memcpy (dest, &src, size);
     return_trace (true);
   }
@@ -114,7 +120,7 @@ struct CFFIndex
     if (byteArray.length == 0)
     {
       COUNT *dest = c->allocate_min<COUNT> ();
-      if (unlikely (dest == nullptr)) return_trace (false);
+      if (unlikely (!dest)) return_trace (false);
       *dest = 0;
     }
     else
@@ -139,10 +145,9 @@ struct CFFIndex
       /* serialize data */
       for (unsigned int i = 0; i < byteArray.length; i++)
       {
-       const byte_str_t &bs = byteArray[i];
-       unsigned char  *dest = c->allocate_size<unsigned char> (bs.length);
-       if (unlikely (dest == nullptr))
-         return_trace (false);
+       const byte_str_t &bs = byteArray[i];
+       unsigned char *dest = c->allocate_size<unsigned char> (bs.length);
+       if (unlikely (!dest)) return_trace (false);
        memcpy (dest, &bs[0], bs.length);
       }
     }
@@ -163,6 +168,71 @@ struct CFFIndex
     return result;
   }
 
+  template <typename Iterator,
+           hb_requires (hb_is_iterator (Iterator))>
+  bool serialize (hb_serialize_context_t *c,
+                 Iterator it)
+  {
+    TRACE_SERIALIZE (this);
+    if (it.len () == 0)
+    {
+      COUNT *dest = c->allocate_min<COUNT> ();
+      if (unlikely (!dest)) return_trace (false);
+      *dest = 0;
+    }
+    else
+    {
+      serialize_header(c, + it | hb_map ([] (const byte_str_t &_) { return _.length; }));
+      for (const byte_str_t &_ : +it)
+       _.copy (c);
+    }
+    return_trace (true);
+  }
+
+  bool serialize (hb_serialize_context_t *c,
+                 const byte_str_array_t &byteArray)
+  { return serialize (c, + hb_iter (byteArray)); }
+
+  bool serialize (hb_serialize_context_t *c,
+                 const str_buff_vec_t &buffArray)
+  {
+    auto it =
+    + hb_iter (buffArray)
+    | hb_map ([] (const str_buff_t &_) { return byte_str_t (_.arrayZ, _.length); })
+    ;
+    return serialize (c, it);
+  }
+
+  template <typename Iterator,
+           hb_requires (hb_is_iterator (Iterator))>
+  bool serialize_header (hb_serialize_context_t *c,
+                       Iterator it)
+  {
+    TRACE_SERIALIZE (this);
+
+    unsigned total = + it | hb_reduce (hb_add, 0);
+    unsigned off_size = calcOffSize (total);
+
+    /* serialize CFFIndex header */
+    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))))
+      return_trace (false);
+
+    /* serialize indices */
+    unsigned int offset = 1;
+    unsigned int i = 0;
+    for (unsigned _ : +it)
+    {
+      CFFIndex<COUNT>::set_offset_at (i++, offset);
+      offset += _;
+    }
+    CFFIndex<COUNT>::set_offset_at (i, offset);
+
+    return_trace (true);
+  }
+
   void set_offset_at (unsigned int index, unsigned int offset)
   {
     HBUINT8 *p = offsets + offSize * index + offSize;
@@ -189,7 +259,7 @@ struct CFFIndex
   unsigned int length_at (unsigned int index) const
   {
     if (unlikely ((offset_at (index + 1) < offset_at (index)) ||
-                 (offset_at (index + 1) > offset_at (count))))
+                 (offset_at (index + 1) > offset_at (count))))
       return 0;
     return offset_at (index + 1) - offset_at (index);
   }
@@ -237,7 +307,8 @@ struct CFFIndex
   public:
   COUNT                count;          /* Number of object data. Note there are (count+1) offsets */
   HBUINT8      offSize;        /* The byte size of each offset in the offsets array. */
-  HBUINT8      offsets[HB_VAR_ARRAY];  /* The array of (count + 1) offsets into objects array (1-base). */
+  HBUINT8      offsets[HB_VAR_ARRAY];
+                               /* The array of (count + 1) offsets into objects array (1-base). */
   /* HBUINT8 data[HB_VAR_ARRAY];       Object data */
   public:
   DEFINE_SIZE_ARRAY (COUNT::static_size + HBUINT8::static_size, offsets);
@@ -250,7 +321,7 @@ struct CFFIndexOf : CFFIndex<COUNT>
   {
     if (likely (index < CFFIndex<COUNT>::count))
       return byte_str_t (CFFIndex<COUNT>::data_base () + CFFIndex<COUNT>::offset_at (index) - 1, CFFIndex<COUNT>::length_at (index));
-    return Null(byte_str_t);
+    return Null (byte_str_t);
   }
 
   template <typename DATA, typename PARAM1, typename PARAM2>
@@ -284,85 +355,41 @@ struct CFFIndexOf : CFFIndex<COUNT>
     for (unsigned int i = 0; i < dataArrayLen; i++)
     {
       TYPE *dest = c->start_embed<TYPE> ();
-      if (unlikely (dest == nullptr ||
-                   !dest->serialize (c, dataArray[i], param1, param2)))
+      if (unlikely (!dest || !dest->serialize (c, dataArray[i], param1, param2)))
        return_trace (false);
     }
     return_trace (true);
   }
-
-  /* in parallel to above */
-  template <typename DATA, typename PARAM>
-  static unsigned int calculate_serialized_size (unsigned int &offSize_ /* OUT */,
-                                                const DATA *dataArray,
-                                                unsigned int dataArrayLen,
-                                                hb_vector_t<unsigned int> &dataSizeArray, /* OUT */
-                                                const PARAM &param)
-  {
-    /* determine offset size */
-    unsigned int totalDataSize = 0;
-    for (unsigned int i = 0; i < dataArrayLen; i++)
-    {
-      unsigned int dataSize = TYPE::calculate_serialized_size (dataArray[i], param);
-      dataSizeArray[i] = dataSize;
-      totalDataSize += dataSize;
-    }
-    offSize_ = calcOffSize (totalDataSize);
-
-    return CFFIndex<COUNT>::calculate_serialized_size (offSize_, dataArrayLen, totalDataSize);
-  }
 };
 
 /* Top Dict, Font Dict, Private Dict */
 struct Dict : UnsizedByteStr
 {
-  template <typename DICTVAL, typename OP_SERIALIZER, typename PARAM>
+  template <typename DICTVAL, typename OP_SERIALIZER, typename ...Ts>
   bool serialize (hb_serialize_context_t *c,
                  const DICTVAL &dictval,
                  OP_SERIALIZER& opszr,
-                 PARAM& param)
+                 Ts&&... ds)
   {
     TRACE_SERIALIZE (this);
     for (unsigned int i = 0; i < dictval.get_count (); i++)
-      if (unlikely (!opszr.serialize (c, dictval[i], param)))
+      if (unlikely (!opszr.serialize (c, dictval[i], hb_forward<Ts> (ds)...)))
        return_trace (false);
 
     return_trace (true);
   }
 
-  /* in parallel to above */
-  template <typename DICTVAL, typename OP_SERIALIZER, typename PARAM>
-  static unsigned int calculate_serialized_size (const DICTVAL &dictval,
-                                                OP_SERIALIZER& opszr,
-                                                PARAM& param)
-  {
-    unsigned int size = 0;
-    for (unsigned int i = 0; i < dictval.get_count (); i++)
-      size += opszr.calculate_serialized_size (dictval[i], param);
-    return size;
-  }
-
-  template <typename DICTVAL, typename OP_SERIALIZER>
-  static unsigned int calculate_serialized_size (const DICTVAL &dictval,
-                                                OP_SERIALIZER& opszr)
-  {
-    unsigned int size = 0;
-    for (unsigned int i = 0; i < dictval.get_count (); i++)
-      size += opszr.calculate_serialized_size (dictval[i]);
-    return size;
-  }
-
-  template <typename INTTYPE, int minVal, int maxVal>
-  static bool serialize_int_op (hb_serialize_context_t *c, op_code_t op, int value, op_code_t intOp)
+  template <typename T, typename V>
+  static bool serialize_int_op (hb_serialize_context_t *c, op_code_t op, V value, op_code_t intOp)
   {
     // XXX: not sure why but LLVM fails to compile the following 'unlikely' macro invocation
-    if (/*unlikely*/ (!serialize_int<INTTYPE, minVal, maxVal> (c, intOp, value)))
+    if (/*unlikely*/ (!serialize_int<T, V> (c, intOp, value)))
       return false;
 
     TRACE_SERIALIZE (this);
     /* serialize the opcode */
     HBUINT8 *p = c->allocate_size<HBUINT8> (OpCode_Size (op));
-    if (unlikely (p == nullptr)) return_trace (false);
+    if (unlikely (!p)) return_trace (false);
     if (Is_OpCode_ESC (op))
     {
       *p = OpCode_escape;
@@ -373,17 +400,28 @@ struct Dict : UnsizedByteStr
     return_trace (true);
   }
 
-  static bool serialize_uint4_op (hb_serialize_context_t *c, op_code_t op, int value)
-  { return serialize_int_op<HBUINT32, 0, 0x7FFFFFFF> (c, op, value, OpCode_longintdict); }
+  template <typename V>
+  static bool serialize_int4_op (hb_serialize_context_t *c, op_code_t op, V value)
+  { return serialize_int_op<HBINT32> (c, op, value, OpCode_longintdict); }
+
+  template <typename V>
+  static bool serialize_int2_op (hb_serialize_context_t *c, op_code_t op, V value)
+  { return serialize_int_op<HBINT16> (c, op, value, OpCode_shortint); }
 
-  static bool serialize_uint2_op (hb_serialize_context_t *c, op_code_t op, int value)
-  { return serialize_int_op<HBUINT16, 0, 0x7FFF> (c, op, value, OpCode_shortint); }
+  template <typename T, int int_op>
+  static bool serialize_link_op (hb_serialize_context_t *c, op_code_t op, objidx_t link, whence_t whence)
+  {
+    T &ofs = *(T *) (c->head + OpCode_Size (int_op));
+    if (unlikely (!serialize_int_op<T> (c, op, 0, int_op))) return false;
+    c->add_link (ofs, link, whence);
+    return true;
+  }
 
-  static bool serialize_offset4_op (hb_serialize_context_t *c, op_code_t op, int value)
-  { return serialize_uint4_op (c, op, value); }
+  static bool serialize_link4_op (hb_serialize_context_t *c, op_code_t op, objidx_t link, whence_t whence = whence_t::Head)
+  { return serialize_link_op<HBINT32, OpCode_longintdict> (c, op, link, whence); }
 
-  static bool serialize_offset2_op (hb_serialize_context_t *c, op_code_t op, int value)
-  { return serialize_uint2_op (c, op, value); }
+  static bool serialize_link2_op (hb_serialize_context_t *c, op_code_t op, objidx_t link, whence_t whence = whence_t::Head)
+  { return serialize_link_op<HBINT16, OpCode_shortint> (c, op, link, whence); }
 };
 
 struct TopDict : Dict {};
@@ -392,105 +430,39 @@ struct PrivateDict : Dict {};
 
 struct table_info_t
 {
-  void init () { offSize = offset = size = 0; }
+  void init () { offset = size = 0; link = 0; }
 
   unsigned int    offset;
   unsigned int    size;
-  unsigned int    offSize;
+  objidx_t       link;
 };
 
 template <typename COUNT>
 struct FDArray : CFFIndexOf<COUNT, FontDict>
 {
-  /* used by CFF1 */
-  template <typename DICTVAL, typename OP_SERIALIZER>
+  template <typename DICTVAL, typename INFO, typename Iterator, typename OP_SERIALIZER>
   bool serialize (hb_serialize_context_t *c,
-                 unsigned int offSize_,
-                 const hb_vector_t<DICTVAL> &fontDicts,
+                 Iterator it,
                  OP_SERIALIZER& opszr)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
-    this->count = fontDicts.length;
-    this->offSize = offSize_;
-    if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (fontDicts.length + 1))))
-      return_trace (false);
 
-    /* serialize font dict offsets */
-    unsigned int offset = 1;
-    unsigned int fid = 0;
-    for (; fid < fontDicts.length; fid++)
-    {
-      CFFIndexOf<COUNT, FontDict>::set_offset_at (fid, offset);
-      offset += FontDict::calculate_serialized_size (fontDicts[fid], opszr);
-    }
-    CFFIndexOf<COUNT, FontDict>::set_offset_at (fid, offset);
-
-    /* serialize font dicts */
-    for (unsigned int i = 0; i < fontDicts.length; i++)
+    /* serialize INDEX data */
+    hb_vector_t<unsigned> sizes;
+    c->push ();
+    + it
+    | hb_map ([&] (const hb_pair_t<const DICTVAL&, const INFO&> &_)
     {
       FontDict *dict = c->start_embed<FontDict> ();
-      if (unlikely (!dict->serialize (c, fontDicts[i], opszr, fontDicts[i])))
-       return_trace (false);
-    }
-    return_trace (true);
-  }
-
-  /* used by CFF2 */
-  template <typename DICTVAL, typename OP_SERIALIZER>
-  bool serialize (hb_serialize_context_t *c,
-                 unsigned int offSize_,
-                 const hb_vector_t<DICTVAL> &fontDicts,
-                 unsigned int fdCount,
-                 const hb_inc_bimap_t &fdmap,
-                 OP_SERIALIZER& opszr,
-                 const hb_vector_t<table_info_t> &privateInfos)
-  {
-    TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (*this))) return_trace (false);
-    this->count = fdCount;
-    this->offSize = offSize_;
-    if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (fdCount + 1))))
-      return_trace (false);
-
-    /* serialize font dict offsets */
-    unsigned int  offset = 1;
-    unsigned int  fid = 0;
-    for (unsigned i = 0; i < fontDicts.length; i++)
-      if (fdmap.has (i))
-      {
-       if (unlikely (fid >= fdCount)) return_trace (false);
-       CFFIndexOf<COUNT, FontDict>::set_offset_at (fid++, offset);
-       offset += FontDict::calculate_serialized_size (fontDicts[i], opszr);
-      }
-    CFFIndexOf<COUNT, FontDict>::set_offset_at (fid, offset);
-
-    /* serialize font dicts */
-    for (unsigned int i = 0; i < fontDicts.length; i++)
-      if (fdmap.has (i))
-      {
-       FontDict *dict = c->start_embed<FontDict> ();
-       if (unlikely (!dict->serialize (c, fontDicts[i], opszr, privateInfos[fdmap[i]])))
-         return_trace (false);
-      }
-    return_trace (true);
-  }
-
-  /* in parallel to above */
-  template <typename OP_SERIALIZER, typename DICTVAL>
-  static unsigned int calculate_serialized_size (unsigned int &offSize_ /* OUT */,
-                                                const hb_vector_t<DICTVAL> &fontDicts,
-                                                unsigned int fdCount,
-                                                const hb_inc_bimap_t &fdmap,
-                                                OP_SERIALIZER& opszr)
-  {
-    unsigned int dictsSize = 0;
-    for (unsigned int i = 0; i < fontDicts.len; i++)
-      if (fdmap.has (i))
-       dictsSize += FontDict::calculate_serialized_size (fontDicts[i], opszr);
-
-    offSize_ = calcOffSize (dictsSize);
-    return CFFIndex<COUNT>::calculate_serialized_size (offSize_, fdCount, dictsSize);
+               dict->serialize (c, _.first, opszr, _.second);
+               return c->head - (const char*)dict;
+             })
+    | hb_sink (sizes)
+    ;
+    c->pop_pack (false);
+
+    /* serialize INDEX header */
+    return_trace (CFFIndex<COUNT>::serialize_header (c, hb_iter (sizes)));
   }
 };
 
@@ -544,7 +516,7 @@ struct FDSelect3_4
   {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this) || !ranges.sanitize (c, nullptr, fdcount) ||
-                 (nRanges () == 0) || ranges[0].first != 0))
+                 (nRanges () == 0) || ranges[0].first != 0))
       return_trace (false);
 
     for (unsigned int i = 1; i < nRanges (); i++)
@@ -588,14 +560,11 @@ struct FDSelect
     TRACE_SERIALIZE (this);
     unsigned int size = src.get_size (num_glyphs);
     FDSelect *dest = c->allocate_size<FDSelect> (size);
-    if (unlikely (dest == nullptr)) return_trace (false);
+    if (unlikely (!dest)) return_trace (false);
     memcpy (dest, &src, size);
     return_trace (true);
   }
 
-  unsigned int calculate_serialized_size (unsigned int num_glyphs) const
-  { return get_size (num_glyphs); }
-
   unsigned int get_size (unsigned int num_glyphs) const
   {
     switch (format)
diff --git a/src/hb-ot-cff1-std-str.hh b/src/hb-ot-cff1-std-str.hh
new file mode 100644 (file)
index 0000000..65d56ae
--- /dev/null
@@ -0,0 +1,425 @@
+/*
+ * Copyright © 2019  Adobe, 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_OT_CFF1_STD_STR_HH
+#if 0 /* Make checks happy. */
+#define HB_OT_CFF1_STD_STR_HH
+#include "hb.hh"
+#endif
+
+_S(".notdef")
+_S("space")
+_S("exclam")
+_S("quotedbl")
+_S("numbersign")
+_S("dollar")
+_S("percent")
+_S("ampersand")
+_S("quoteright")
+_S("parenleft")
+_S("parenright")
+_S("asterisk")
+_S("plus")
+_S("comma")
+_S("hyphen")
+_S("period")
+_S("slash")
+_S("zero")
+_S("one")
+_S("two")
+_S("three")
+_S("four")
+_S("five")
+_S("six")
+_S("seven")
+_S("eight")
+_S("nine")
+_S("colon")
+_S("semicolon")
+_S("less")
+_S("equal")
+_S("greater")
+_S("question")
+_S("at")
+_S("A")
+_S("B")
+_S("C")
+_S("D")
+_S("E")
+_S("F")
+_S("G")
+_S("H")
+_S("I")
+_S("J")
+_S("K")
+_S("L")
+_S("M")
+_S("N")
+_S("O")
+_S("P")
+_S("Q")
+_S("R")
+_S("S")
+_S("T")
+_S("U")
+_S("V")
+_S("W")
+_S("X")
+_S("Y")
+_S("Z")
+_S("bracketleft")
+_S("backslash")
+_S("bracketright")
+_S("asciicircum")
+_S("underscore")
+_S("quoteleft")
+_S("a")
+_S("b")
+_S("c")
+_S("d")
+_S("e")
+_S("f")
+_S("g")
+_S("h")
+_S("i")
+_S("j")
+_S("k")
+_S("l")
+_S("m")
+_S("n")
+_S("o")
+_S("p")
+_S("q")
+_S("r")
+_S("s")
+_S("t")
+_S("u")
+_S("v")
+_S("w")
+_S("x")
+_S("y")
+_S("z")
+_S("braceleft")
+_S("bar")
+_S("braceright")
+_S("asciitilde")
+_S("exclamdown")
+_S("cent")
+_S("sterling")
+_S("fraction")
+_S("yen")
+_S("florin")
+_S("section")
+_S("currency")
+_S("quotesingle")
+_S("quotedblleft")
+_S("guillemotleft")
+_S("guilsinglleft")
+_S("guilsinglright")
+_S("fi")
+_S("fl")
+_S("endash")
+_S("dagger")
+_S("daggerdbl")
+_S("periodcentered")
+_S("paragraph")
+_S("bullet")
+_S("quotesinglbase")
+_S("quotedblbase")
+_S("quotedblright")
+_S("guillemotright")
+_S("ellipsis")
+_S("perthousand")
+_S("questiondown")
+_S("grave")
+_S("acute")
+_S("circumflex")
+_S("tilde")
+_S("macron")
+_S("breve")
+_S("dotaccent")
+_S("dieresis")
+_S("ring")
+_S("cedilla")
+_S("hungarumlaut")
+_S("ogonek")
+_S("caron")
+_S("emdash")
+_S("AE")
+_S("ordfeminine")
+_S("Lslash")
+_S("Oslash")
+_S("OE")
+_S("ordmasculine")
+_S("ae")
+_S("dotlessi")
+_S("lslash")
+_S("oslash")
+_S("oe")
+_S("germandbls")
+_S("onesuperior")
+_S("logicalnot")
+_S("mu")
+_S("trademark")
+_S("Eth")
+_S("onehalf")
+_S("plusminus")
+_S("Thorn")
+_S("onequarter")
+_S("divide")
+_S("brokenbar")
+_S("degree")
+_S("thorn")
+_S("threequarters")
+_S("twosuperior")
+_S("registered")
+_S("minus")
+_S("eth")
+_S("multiply")
+_S("threesuperior")
+_S("copyright")
+_S("Aacute")
+_S("Acircumflex")
+_S("Adieresis")
+_S("Agrave")
+_S("Aring")
+_S("Atilde")
+_S("Ccedilla")
+_S("Eacute")
+_S("Ecircumflex")
+_S("Edieresis")
+_S("Egrave")
+_S("Iacute")
+_S("Icircumflex")
+_S("Idieresis")
+_S("Igrave")
+_S("Ntilde")
+_S("Oacute")
+_S("Ocircumflex")
+_S("Odieresis")
+_S("Ograve")
+_S("Otilde")
+_S("Scaron")
+_S("Uacute")
+_S("Ucircumflex")
+_S("Udieresis")
+_S("Ugrave")
+_S("Yacute")
+_S("Ydieresis")
+_S("Zcaron")
+_S("aacute")
+_S("acircumflex")
+_S("adieresis")
+_S("agrave")
+_S("aring")
+_S("atilde")
+_S("ccedilla")
+_S("eacute")
+_S("ecircumflex")
+_S("edieresis")
+_S("egrave")
+_S("iacute")
+_S("icircumflex")
+_S("idieresis")
+_S("igrave")
+_S("ntilde")
+_S("oacute")
+_S("ocircumflex")
+_S("odieresis")
+_S("ograve")
+_S("otilde")
+_S("scaron")
+_S("uacute")
+_S("ucircumflex")
+_S("udieresis")
+_S("ugrave")
+_S("yacute")
+_S("ydieresis")
+_S("zcaron")
+_S("exclamsmall")
+_S("Hungarumlautsmall")
+_S("dollaroldstyle")
+_S("dollarsuperior")
+_S("ampersandsmall")
+_S("Acutesmall")
+_S("parenleftsuperior")
+_S("parenrightsuperior")
+_S("twodotenleader")
+_S("onedotenleader")
+_S("zerooldstyle")
+_S("oneoldstyle")
+_S("twooldstyle")
+_S("threeoldstyle")
+_S("fouroldstyle")
+_S("fiveoldstyle")
+_S("sixoldstyle")
+_S("sevenoldstyle")
+_S("eightoldstyle")
+_S("nineoldstyle")
+_S("commasuperior")
+_S("threequartersemdash")
+_S("periodsuperior")
+_S("questionsmall")
+_S("asuperior")
+_S("bsuperior")
+_S("centsuperior")
+_S("dsuperior")
+_S("esuperior")
+_S("isuperior")
+_S("lsuperior")
+_S("msuperior")
+_S("nsuperior")
+_S("osuperior")
+_S("rsuperior")
+_S("ssuperior")
+_S("tsuperior")
+_S("ff")
+_S("ffi")
+_S("ffl")
+_S("parenleftinferior")
+_S("parenrightinferior")
+_S("Circumflexsmall")
+_S("hyphensuperior")
+_S("Gravesmall")
+_S("Asmall")
+_S("Bsmall")
+_S("Csmall")
+_S("Dsmall")
+_S("Esmall")
+_S("Fsmall")
+_S("Gsmall")
+_S("Hsmall")
+_S("Ismall")
+_S("Jsmall")
+_S("Ksmall")
+_S("Lsmall")
+_S("Msmall")
+_S("Nsmall")
+_S("Osmall")
+_S("Psmall")
+_S("Qsmall")
+_S("Rsmall")
+_S("Ssmall")
+_S("Tsmall")
+_S("Usmall")
+_S("Vsmall")
+_S("Wsmall")
+_S("Xsmall")
+_S("Ysmall")
+_S("Zsmall")
+_S("colonmonetary")
+_S("onefitted")
+_S("rupiah")
+_S("Tildesmall")
+_S("exclamdownsmall")
+_S("centoldstyle")
+_S("Lslashsmall")
+_S("Scaronsmall")
+_S("Zcaronsmall")
+_S("Dieresissmall")
+_S("Brevesmall")
+_S("Caronsmall")
+_S("Dotaccentsmall")
+_S("Macronsmall")
+_S("figuredash")
+_S("hypheninferior")
+_S("Ogoneksmall")
+_S("Ringsmall")
+_S("Cedillasmall")
+_S("questiondownsmall")
+_S("oneeighth")
+_S("threeeighths")
+_S("fiveeighths")
+_S("seveneighths")
+_S("onethird")
+_S("twothirds")
+_S("zerosuperior")
+_S("foursuperior")
+_S("fivesuperior")
+_S("sixsuperior")
+_S("sevensuperior")
+_S("eightsuperior")
+_S("ninesuperior")
+_S("zeroinferior")
+_S("oneinferior")
+_S("twoinferior")
+_S("threeinferior")
+_S("fourinferior")
+_S("fiveinferior")
+_S("sixinferior")
+_S("seveninferior")
+_S("eightinferior")
+_S("nineinferior")
+_S("centinferior")
+_S("dollarinferior")
+_S("periodinferior")
+_S("commainferior")
+_S("Agravesmall")
+_S("Aacutesmall")
+_S("Acircumflexsmall")
+_S("Atildesmall")
+_S("Adieresissmall")
+_S("Aringsmall")
+_S("AEsmall")
+_S("Ccedillasmall")
+_S("Egravesmall")
+_S("Eacutesmall")
+_S("Ecircumflexsmall")
+_S("Edieresissmall")
+_S("Igravesmall")
+_S("Iacutesmall")
+_S("Icircumflexsmall")
+_S("Idieresissmall")
+_S("Ethsmall")
+_S("Ntildesmall")
+_S("Ogravesmall")
+_S("Oacutesmall")
+_S("Ocircumflexsmall")
+_S("Otildesmall")
+_S("Odieresissmall")
+_S("OEsmall")
+_S("Oslashsmall")
+_S("Ugravesmall")
+_S("Uacutesmall")
+_S("Ucircumflexsmall")
+_S("Udieresissmall")
+_S("Yacutesmall")
+_S("Thornsmall")
+_S("Ydieresissmall")
+_S("001.000")
+_S("001.001")
+_S("001.002")
+_S("001.003")
+_S("Black")
+_S("Bold")
+_S("Book")
+_S("Light")
+_S("Medium")
+_S("Regular")
+_S("Roman")
+_S("Semibold")
+
+#endif /* HB_OT_CFF1_STD_STR_HH */
index 55abd11..66b9c8c 100644 (file)
 
 #ifndef HB_NO_CFF
 
+#include "hb-draw.hh"
+#include "hb-algs.hh"
 #include "hb-ot-cff1-table.hh"
 #include "hb-cff1-interp-cs.hh"
 
 using namespace CFF;
 
+struct sid_to_gid_t
+{
+  uint16_t  sid;
+  uint8_t   gid;
+
+  int cmp (uint16_t a) const
+  {
+    if (a == sid) return 0;
+    return (a < sid) ? -1 : 1;
+  }
+};
+
 /* SID to code */
 static const uint8_t standard_encoding_to_code [] =
 {
@@ -104,6 +118,80 @@ static const uint16_t expert_subset_charset_to_sid [] =
   340,  341,  342,  343,  344,  345,  346
 };
 
+/* SID to glyph ID */
+static const sid_to_gid_t expert_charset_sid_to_gid [] =
+{
+    { 1, 1 },     { 13, 12 },   { 14, 13 },   { 15, 14 },
+    { 27, 26 },   { 28, 27 },   { 99, 15 },   { 109, 46 },
+    { 110, 47 },  { 150, 111 }, { 155, 101 }, { 158, 100 },
+    { 163, 102 }, { 164, 112 }, { 169, 113 }, { 229, 2 },
+    { 230, 3 },   { 231, 4 },   { 232, 5 },   { 233, 6 },
+    { 234, 7 },   { 235, 8 },   { 236, 9 },   { 237, 10 },
+    { 238, 11 },  { 239, 16 },  { 240, 17 },  { 241, 18 },
+    { 242, 19 },  { 243, 20 },  { 244, 21 },  { 245, 22 },
+    { 246, 23 },  { 247, 24 },  { 248, 25 },  { 249, 28 },
+    { 250, 29 },  { 251, 30 },  { 252, 31 },  { 253, 32 },
+    { 254, 33 },  { 255, 34 },  { 256, 35 },  { 257, 36 },
+    { 258, 37 },  { 259, 38 },  { 260, 39 },  { 261, 40 },
+    { 262, 41 },  { 263, 42 },  { 264, 43 },  { 265, 44 },
+    { 266, 45 },  { 267, 48 },  { 268, 49 },  { 269, 50 },
+    { 270, 51 },  { 271, 52 },  { 272, 53 },  { 273, 54 },
+    { 274, 55 },  { 275, 56 },  { 276, 57 },  { 277, 58 },
+    { 278, 59 },  { 279, 60 },  { 280, 61 },  { 281, 62 },
+    { 282, 63 },  { 283, 64 },  { 284, 65 },  { 285, 66 },
+    { 286, 67 },  { 287, 68 },  { 288, 69 },  { 289, 70 },
+    { 290, 71 },  { 291, 72 },  { 292, 73 },  { 293, 74 },
+    { 294, 75 },  { 295, 76 },  { 296, 77 },  { 297, 78 },
+    { 298, 79 },  { 299, 80 },  { 300, 81 },  { 301, 82 },
+    { 302, 83 },  { 303, 84 },  { 304, 85 },  { 305, 86 },
+    { 306, 87 },  { 307, 88 },  { 308, 89 },  { 309, 90 },
+    { 310, 91 },  { 311, 92 },  { 312, 93 },  { 313, 94 },
+    { 314, 95 },  { 315, 96 },  { 316, 97 },  { 317, 98 },
+    { 318, 99 },  { 319, 103 }, { 320, 104 }, { 321, 105 },
+    { 322, 106 }, { 323, 107 }, { 324, 108 }, { 325, 109 },
+    { 326, 110 }, { 327, 114 }, { 328, 115 }, { 329, 116 },
+    { 330, 117 }, { 331, 118 }, { 332, 119 }, { 333, 120 },
+    { 334, 121 }, { 335, 122 }, { 336, 123 }, { 337, 124 },
+    { 338, 125 }, { 339, 126 }, { 340, 127 }, { 341, 128 },
+    { 342, 129 }, { 343, 130 }, { 344, 131 }, { 345, 132 },
+    { 346, 133 }, { 347, 134 }, { 348, 135 }, { 349, 136 },
+    { 350, 137 }, { 351, 138 }, { 352, 139 }, { 353, 140 },
+    { 354, 141 }, { 355, 142 }, { 356, 143 }, { 357, 144 },
+    { 358, 145 }, { 359, 146 }, { 360, 147 }, { 361, 148 },
+    { 362, 149 }, { 363, 150 }, { 364, 151 }, { 365, 152 },
+    { 366, 153 }, { 367, 154 }, { 368, 155 }, { 369, 156 },
+    { 370, 157 }, { 371, 158 }, { 372, 159 }, { 373, 160 },
+    { 374, 161 }, { 375, 162 }, { 376, 163 }, { 377, 164 },
+    { 378, 165 }
+};
+
+/* SID to glyph ID */
+static const sid_to_gid_t expert_subset_charset_sid_to_gid [] =
+{
+  { 1, 1 },       { 13, 8 },      { 14, 9 },      { 15, 10 },
+  { 27, 22 },     { 28, 23 },     { 99, 11 },     { 109, 41 },
+  { 110, 42 },    { 150, 64 },    { 155, 55 },    { 158, 54 },
+  { 163, 56 },    { 164, 65 },    { 169, 66 },    { 231, 2 },
+  { 232, 3 },     { 235, 4 },     { 236, 5 },     { 237, 6 },
+  { 238, 7 },     { 239, 12 },    { 240, 13 },    { 241, 14 },
+  { 242, 15 },    { 243, 16 },    { 244, 17 },    { 245, 18 },
+  { 246, 19 },    { 247, 20 },    { 248, 21 },    { 249, 24 },
+  { 250, 25 },    { 251, 26 },    { 253, 27 },    { 254, 28 },
+  { 255, 29 },    { 256, 30 },    { 257, 31 },    { 258, 32 },
+  { 259, 33 },    { 260, 34 },    { 261, 35 },    { 262, 36 },
+  { 263, 37 },    { 264, 38 },    { 265, 39 },    { 266, 40 },
+  { 267, 43 },    { 268, 44 },    { 269, 45 },    { 270, 46 },
+  { 272, 47 },    { 300, 48 },    { 301, 49 },    { 302, 50 },
+  { 305, 51 },    { 314, 52 },    { 315, 53 },    { 320, 57 },
+  { 321, 58 },    { 322, 59 },    { 323, 60 },    { 324, 61 },
+  { 325, 62 },    { 326, 63 },    { 327, 67 },    { 328, 68 },
+  { 329, 69 },    { 330, 70 },    { 331, 71 },    { 332, 72 },
+  { 333, 73 },    { 334, 74 },    { 335, 75 },    { 336, 76 },
+  { 337, 77 },    { 338, 78 },    { 339, 79 },    { 340, 80 },
+  { 341, 81 },    { 342, 82 },    { 343, 83 },    { 344, 84 },
+  { 345, 85 },    { 346, 86 }
+};
+
 /* code to SID */
 static const uint8_t standard_encoding_to_sid [] =
 {
@@ -157,6 +245,18 @@ hb_codepoint_t OT::cff1::lookup_expert_subset_charset_for_sid (hb_codepoint_t gl
     return 0;
 }
 
+hb_codepoint_t OT::cff1::lookup_expert_charset_for_glyph (hb_codepoint_t sid)
+{
+  const auto *pair = hb_sorted_array (expert_charset_sid_to_gid).bsearch (sid);
+  return pair ? pair->gid : 0;
+}
+
+hb_codepoint_t OT::cff1::lookup_expert_subset_charset_for_glyph (hb_codepoint_t sid)
+{
+  const auto *pair = hb_sorted_array (expert_subset_charset_sid_to_gid).bsearch (sid);
+  return pair ? pair->gid : 0;
+}
+
 hb_codepoint_t OT::cff1::lookup_standard_encoding_for_sid (hb_codepoint_t code)
 {
   if (code < ARRAY_LENGTH (standard_encoding_to_sid))
@@ -342,6 +442,130 @@ bool OT::cff1::accelerator_t::get_extents (hb_font_t *font, hb_codepoint_t glyph
   return true;
 }
 
+#ifdef HB_EXPERIMENTAL_API
+struct cff1_path_param_t
+{
+  cff1_path_param_t (const OT::cff1::accelerator_t *cff_, hb_font_t *font_,
+                    draw_helper_t &draw_helper_, point_t *delta_)
+  {
+    draw_helper = &draw_helper_;
+    cff = cff_;
+    font = font_;
+    delta = delta_;
+  }
+
+  void move_to (const point_t &p)
+  {
+    point_t point = p;
+    if (delta) point.move (*delta);
+    draw_helper->move_to (font->em_scalef_x (point.x.to_real ()), font->em_scalef_y (point.y.to_real ()));
+  }
+
+  void line_to (const point_t &p)
+  {
+    point_t point = p;
+    if (delta) point.move (*delta);
+    draw_helper->line_to (font->em_scalef_x (point.x.to_real ()), font->em_scalef_y (point.y.to_real ()));
+  }
+
+  void cubic_to (const point_t &p1, const point_t &p2, const point_t &p3)
+  {
+    point_t point1 = p1, point2 = p2, point3 = p3;
+    if (delta)
+    {
+      point1.move (*delta);
+      point2.move (*delta);
+      point3.move (*delta);
+    }
+    draw_helper->cubic_to (font->em_scalef_x (point1.x.to_real ()), font->em_scalef_y (point1.y.to_real ()),
+                          font->em_scalef_x (point2.x.to_real ()), font->em_scalef_y (point2.y.to_real ()),
+                          font->em_scalef_x (point3.x.to_real ()), font->em_scalef_y (point3.y.to_real ()));
+  }
+
+  void end_path () { draw_helper->end_path (); }
+
+  hb_font_t *font;
+  draw_helper_t *draw_helper;
+  point_t *delta;
+
+  const OT::cff1::accelerator_t *cff;
+};
+
+struct cff1_path_procs_path_t : path_procs_t<cff1_path_procs_path_t, cff1_cs_interp_env_t, cff1_path_param_t>
+{
+  static void moveto (cff1_cs_interp_env_t &env, cff1_path_param_t& param, const point_t &pt)
+  {
+    param.move_to (pt);
+    env.moveto (pt);
+  }
+
+  static void line (cff1_cs_interp_env_t &env, cff1_path_param_t &param, const point_t &pt1)
+  {
+    param.line_to (pt1);
+    env.moveto (pt1);
+  }
+
+  static void curve (cff1_cs_interp_env_t &env, cff1_path_param_t &param, const point_t &pt1, const point_t &pt2, const point_t &pt3)
+  {
+    param.cubic_to (pt1, pt2, pt3);
+    env.moveto (pt3);
+  }
+};
+
+static bool _get_path (const OT::cff1::accelerator_t *cff, hb_font_t *font, hb_codepoint_t glyph,
+                      draw_helper_t &draw_helper, bool in_seac = false, point_t *delta = nullptr);
+
+struct cff1_cs_opset_path_t : cff1_cs_opset_t<cff1_cs_opset_path_t, cff1_path_param_t, cff1_path_procs_path_t>
+{
+  static void process_seac (cff1_cs_interp_env_t &env, cff1_path_param_t& param)
+  {
+    /* End previous path */
+    param.end_path ();
+
+    unsigned int n = env.argStack.get_count ();
+    point_t delta;
+    delta.x = env.argStack[n-4];
+    delta.y = env.argStack[n-3];
+    hb_codepoint_t base = param.cff->std_code_to_glyph (env.argStack[n-2].to_int ());
+    hb_codepoint_t accent = param.cff->std_code_to_glyph (env.argStack[n-1].to_int ());
+
+    if (unlikely (!(!env.in_seac && base && accent
+                   && _get_path (param.cff, param.font, base, *param.draw_helper, true)
+                   && _get_path (param.cff, param.font, accent, *param.draw_helper, true, &delta))))
+      env.set_error ();
+  }
+};
+
+bool _get_path (const OT::cff1::accelerator_t *cff, hb_font_t *font, hb_codepoint_t glyph,
+               draw_helper_t &draw_helper, bool in_seac, point_t *delta)
+{
+  if (unlikely (!cff->is_valid () || (glyph >= cff->num_glyphs))) return false;
+
+  unsigned int fd = cff->fdSelect->get_fd (glyph);
+  cff1_cs_interpreter_t<cff1_cs_opset_path_t, cff1_path_param_t> interp;
+  const byte_str_t str = (*cff->charStrings)[glyph];
+  interp.env.init (str, *cff, fd);
+  interp.env.set_in_seac (in_seac);
+  cff1_path_param_t param (cff, font, draw_helper, delta);
+  if (unlikely (!interp.interpret (param))) return false;
+
+  /* Let's end the path specially since it is called inside seac also */
+  param.end_path ();
+
+  return true;
+}
+
+bool OT::cff1::accelerator_t::get_path (hb_font_t *font, hb_codepoint_t glyph, draw_helper_t &draw_helper) const
+{
+#ifdef HB_NO_OT_FONT_CFF
+  /* XXX Remove check when this code moves to .hh file. */
+  return true;
+#endif
+
+  return _get_path (this, font, glyph, draw_helper);
+}
+#endif
+
 struct get_seac_param_t
 {
   void init (const OT::cff1::accelerator_t *_cff)
index ad20651..e1296c3 100644 (file)
 #ifndef HB_OT_CFF1_TABLE_HH
 #define HB_OT_CFF1_TABLE_HH
 
-#include "hb-ot-head-table.hh"
 #include "hb-ot-cff-common.hh"
 #include "hb-subset-cff1.hh"
+#include "hb-draw.hh"
+
+#define HB_STRING_ARRAY_NAME cff1_std_strings
+#define HB_STRING_ARRAY_LIST "hb-ot-cff1-std-str.hh"
+#include "hb-string-array.hh"
+#undef HB_STRING_ARRAY_LIST
+#undef HB_STRING_ARRAY_NAME
 
 namespace CFF {
 
 /*
  * CFF -- Compact Font Format (CFF)
- * http://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5176.CFF.pdf
+ * https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5176.CFF.pdf
  */
 #define HB_OT_TAG_cff1 HB_TAG('C','F','F',' ')
 
@@ -49,7 +55,6 @@ template <typename Type> struct CFF1IndexOf : CFFIndexOf<HBUINT16, Type> {};
 
 typedef CFFIndex<HBUINT16> CFF1Index;
 typedef CFF1Index          CFF1CharStrings;
-typedef FDArray<HBUINT16>  CFF1FDArray;
 typedef Subrs<HBUINT16>    CFF1Subrs;
 
 struct CFF1FDSelect : FDSelect {};
@@ -169,7 +174,7 @@ struct Encoding
     TRACE_SERIALIZE (this);
     unsigned int size = src.get_size ();
     Encoding *dest = c->allocate_size<Encoding> (size);
-    if (unlikely (dest == nullptr)) return_trace (false);
+    if (unlikely (!dest)) return_trace (false);
     memcpy (dest, &src, size);
     return_trace (true);
   }
@@ -183,13 +188,13 @@ struct Encoding
   {
     TRACE_SERIALIZE (this);
     Encoding *dest = c->extend_min (*this);
-    if (unlikely (dest == nullptr)) return_trace (false);
+    if (unlikely (!dest)) return_trace (false);
     dest->format = format | ((supp_codes.length > 0) ? 0x80 : 0);
     switch (format) {
     case 0:
     {
       Encoding0 *fmt0 = c->allocate_size<Encoding0> (Encoding0::min_size + HBUINT8::static_size * enc_count);
-      if (unlikely (fmt0 == nullptr)) return_trace (false);
+      if (unlikely (!fmt0)) return_trace (false);
       fmt0->nCodes () = enc_count;
       unsigned int glyph = 0;
       for (unsigned int i = 0; i < code_ranges.length; i++)
@@ -206,7 +211,7 @@ struct Encoding
     case 1:
     {
       Encoding1 *fmt1 = c->allocate_size<Encoding1> (Encoding1::min_size + Encoding1_Range::static_size * code_ranges.length);
-      if (unlikely (fmt1 == nullptr)) return_trace (false);
+      if (unlikely (!fmt1)) return_trace (false);
       fmt1->nRanges () = code_ranges.length;
       for (unsigned int i = 0; i < code_ranges.length; i++)
       {
@@ -223,7 +228,7 @@ struct Encoding
     if (supp_codes.length)
     {
       CFF1SuppEncData *suppData = c->allocate_size<CFF1SuppEncData> (CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_codes.length);
-      if (unlikely (suppData == nullptr)) return_trace (false);
+      if (unlikely (!suppData)) return_trace (false);
       suppData->nSups () = supp_codes.length;
       for (unsigned int i = 0; i < supp_codes.length; i++)
       {
@@ -235,23 +240,6 @@ struct Encoding
     return_trace (true);
   }
 
-  /* parallel to above: calculate the size of a subset Encoding */
-  static unsigned int calculate_serialized_size (uint8_t format,
-                                                unsigned int enc_count,
-                                                unsigned int supp_count)
-  {
-    unsigned int size = min_size;
-    switch (format)
-    {
-    case 0: size += Encoding0::min_size + HBUINT8::static_size * enc_count; break;
-    case 1: size += Encoding1::min_size + Encoding1_Range::static_size * enc_count; break;
-    default:return 0;
-    }
-    if (supp_count > 0)
-      size += CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_count;
-    return size;
-  }
-
   unsigned int get_size () const
   {
     unsigned int size = min_size;
@@ -414,7 +402,7 @@ struct Charset1_2 {
     for (unsigned int i = 0;; i++)
     {
       if (glyph >= num_glyphs)
-       return 0;
+       return 0;
       if ((ranges[i].first <= sid) && (sid <= ranges[i].first + ranges[i].nLeft))
        return glyph + (sid - ranges[i].first);
       glyph += (ranges[i].nLeft + 1);
@@ -457,7 +445,7 @@ struct Charset
     TRACE_SERIALIZE (this);
     unsigned int size = src.get_size (num_glyphs);
     Charset *dest = c->allocate_size<Charset> (size);
-    if (unlikely (dest == nullptr)) return_trace (false);
+    if (unlikely (!dest)) return_trace (false);
     memcpy (dest, &src, size);
     return_trace (true);
   }
@@ -470,14 +458,14 @@ struct Charset
   {
     TRACE_SERIALIZE (this);
     Charset *dest = c->extend_min (*this);
-    if (unlikely (dest == nullptr)) return_trace (false);
+    if (unlikely (!dest)) return_trace (false);
     dest->format = format;
     switch (format)
     {
     case 0:
     {
       Charset0 *fmt0 = c->allocate_size<Charset0> (Charset0::min_size + HBUINT16::static_size * (num_glyphs - 1));
-      if (unlikely (fmt0 == nullptr)) return_trace (false);
+      if (unlikely (!fmt0)) return_trace (false);
       unsigned int glyph = 0;
       for (unsigned int i = 0; i < sid_ranges.length; i++)
       {
@@ -491,10 +479,10 @@ struct Charset
     case 1:
     {
       Charset1 *fmt1 = c->allocate_size<Charset1> (Charset1::min_size + Charset1_Range::static_size * sid_ranges.length);
-      if (unlikely (fmt1 == nullptr)) return_trace (false);
+      if (unlikely (!fmt1)) return_trace (false);
       for (unsigned int i = 0; i < sid_ranges.length; i++)
       {
-       if (unlikely (!(sid_ranges[i].glyph <= 0xFF)))
+       if (unlikely (!(sid_ranges[i].glyph <= 0xFF)))
          return_trace (false);
        fmt1->ranges[i].first = sid_ranges[i].code;
        fmt1->ranges[i].nLeft = sid_ranges[i].glyph;
@@ -505,10 +493,10 @@ struct Charset
     case 2:
     {
       Charset2 *fmt2 = c->allocate_size<Charset2> (Charset2::min_size + Charset2_Range::static_size * sid_ranges.length);
-      if (unlikely (fmt2 == nullptr)) return_trace (false);
+      if (unlikely (!fmt2)) return_trace (false);
       for (unsigned int i = 0; i < sid_ranges.length; i++)
       {
-       if (unlikely (!(sid_ranges[i].glyph <= 0xFFFF)))
+       if (unlikely (!(sid_ranges[i].glyph <= 0xFFFF)))
          return_trace (false);
        fmt2->ranges[i].first = sid_ranges[i].code;
        fmt2->ranges[i].nLeft = sid_ranges[i].glyph;
@@ -520,19 +508,6 @@ struct Charset
     return_trace (true);
   }
 
-  /* parallel to above: calculate the size of a subset Charset */
-  static unsigned int calculate_serialized_size (uint8_t format,
-                                                unsigned int count)
-  {
-    switch (format)
-    {
-    case 0: return min_size + Charset0::min_size + HBUINT16::static_size * (count - 1);
-    case 1: return min_size + Charset1::min_size + Charset1_Range::static_size * count;
-    case 2: return min_size + Charset2::min_size + Charset2_Range::static_size * count;
-    default:return 0;
-    }
-  }
-
   unsigned int get_size (unsigned int num_glyphs) const
   {
     switch (format)
@@ -544,8 +519,9 @@ struct Charset
     }
   }
 
-  hb_codepoint_t get_sid (hb_codepoint_t glyph) const
+  hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned int num_glyphs) const
   {
+    if (unlikely (glyph >= num_glyphs)) return 0;
     switch (format)
     {
     case 0: return u.format0.get_sid (glyph);
@@ -594,7 +570,7 @@ struct Charset
 struct CFF1StringIndex : CFF1Index
 {
   bool serialize (hb_serialize_context_t *c, const CFF1StringIndex &strings,
-                 unsigned int offSize_, const hb_inc_bimap_t &sidmap)
+                 const hb_inc_bimap_t &sidmap)
   {
     TRACE_SERIALIZE (this);
     if (unlikely ((strings.count == 0) || (sidmap.get_population () == 0)))
@@ -612,30 +588,14 @@ struct CFF1StringIndex : CFF1Index
     for (unsigned int i = 0; i < strings.count; i++)
     {
       hb_codepoint_t  j = sidmap[i];
-      if (j != CFF_UNDEF_CODE)
+      if (j != HB_MAP_VALUE_INVALID)
        bytesArray[j] = strings[i];
     }
 
-    bool result = CFF1Index::serialize (c, offSize_, bytesArray);
+    bool result = CFF1Index::serialize (c, bytesArray);
     bytesArray.fini ();
     return_trace (result);
   }
-
-  /* in parallel to above */
-  unsigned int calculate_serialized_size (unsigned int &offSize_ /*OUT*/, const hb_inc_bimap_t &sidmap) const
-  {
-    offSize_ = 0;
-    if ((count == 0) || (sidmap.get_population () == 0))
-      return count.static_size;
-
-    unsigned int dataSize = 0;
-    for (unsigned int i = 0; i < count; i++)
-      if (sidmap[i] != CFF_UNDEF_CODE)
-       dataSize += length_at (i);
-
-    offSize_ = calcOffSize(dataSize);
-    return CFF1Index::calculate_serialized_size (offSize_, sidmap.get_population (), dataSize);
-  }
 };
 
 struct cff1_top_dict_interp_env_t : num_interp_env_t
@@ -738,7 +698,7 @@ struct cff1_top_dict_values_t : top_dict_values_t<cff1_top_dict_val_t>
   unsigned int    EncodingOffset;
   unsigned int    CharsetOffset;
   unsigned int    FDSelectOffset;
-  table_info_t       privateDictInfo;
+  table_info_t    privateDictInfo;
 };
 
 struct cff1_top_dict_opset_t : top_dict_opset_t<cff1_top_dict_val_t>
@@ -880,21 +840,10 @@ struct cff1_private_dict_values_base_t : dict_values_t<VAL>
   {
     dict_values_t<VAL>::init ();
     subrsOffset = 0;
-    localSubrs = &Null(CFF1Subrs);
+    localSubrs = &Null (CFF1Subrs);
   }
   void fini () { dict_values_t<VAL>::fini (); }
 
-  unsigned int calculate_serialized_size () const
-  {
-    unsigned int size = 0;
-    for (unsigned int i = 0; i < dict_values_t<VAL>::get_count; i++)
-      if (dict_values_t<VAL>::get_value (i).op == OpCode_Subrs)
-       size += OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Subrs);
-      else
-       size += dict_values_t<VAL>::get_value (i).str.length;
-    return size;
-  }
-
   unsigned int      subrsOffset;
   const CFF1Subrs    *localSubrs;
 };
@@ -997,6 +946,37 @@ typedef dict_interpreter_t<cff1_font_dict_opset_t, cff1_font_dict_values_t> cff1
 typedef CFF1Index CFF1NameIndex;
 typedef CFF1IndexOf<TopDict> CFF1TopDictIndex;
 
+struct cff1_font_dict_values_mod_t
+{
+  cff1_font_dict_values_mod_t() { init (); }
+
+  void init () { init ( &Null (cff1_font_dict_values_t), CFF_UNDEF_SID ); }
+
+  void init (const cff1_font_dict_values_t *base_,
+            unsigned int fontName_)
+  {
+    base = base_;
+    fontName = fontName_;
+    privateDictInfo.init ();
+  }
+
+  unsigned get_count () const { return base->get_count (); }
+
+  const op_str_t &operator [] (unsigned int i) const { return (*base)[i]; }
+
+  const cff1_font_dict_values_t    *base;
+  table_info_t            privateDictInfo;
+  unsigned int         fontName;
+};
+
+struct CFF1FDArray : FDArray<HBUINT16>
+{
+  /* FDArray::serialize() requires this partial specialization to compile */
+  template <typename ITER, typename OP_SERIALIZER>
+  bool serialize (hb_serialize_context_t *c, ITER it, OP_SERIALIZER& opszr)
+  { return FDArray<HBUINT16>::serialize<cff1_font_dict_values_mod_t, cff1_font_dict_values_mod_t> (c, it, opszr); }
+};
+
 } /* namespace CFF */
 
 namespace OT {
@@ -1031,7 +1011,7 @@ struct cff1
 
       const OT::cff1 *cff = this->blob->template as<OT::cff1> ();
 
-      if (cff == &Null(OT::cff1))
+      if (cff == &Null (OT::cff1))
       { fini (); return; }
 
       nameIndex = &cff->nameIndex (cff);
@@ -1052,7 +1032,7 @@ struct cff1
       }
 
       if (is_predef_charset ())
-       charset = &Null(Charset);
+       charset = &Null (Charset);
       else
       {
        charset = &StructAtOffsetOrNull<Charset> (cff, topDict.CharsetOffset);
@@ -1064,16 +1044,30 @@ struct cff1
       {
        fdArray = &StructAtOffsetOrNull<CFF1FDArray> (cff, topDict.FDArrayOffset);
        fdSelect = &StructAtOffsetOrNull<CFF1FDSelect> (cff, topDict.FDSelectOffset);
-       if (unlikely ((fdArray == &Null(CFF1FDArray)) || !fdArray->sanitize (&sc) ||
-           (fdSelect == &Null(CFF1FDSelect)) || !fdSelect->sanitize (&sc, fdArray->count)))
+       if (unlikely ((fdArray == &Null (CFF1FDArray)) || !fdArray->sanitize (&sc) ||
+           (fdSelect == &Null (CFF1FDSelect)) || !fdSelect->sanitize (&sc, fdArray->count)))
        { fini (); return; }
 
        fdCount = fdArray->count;
       }
       else
       {
-       fdArray = &Null(CFF1FDArray);
-       fdSelect = &Null(CFF1FDSelect);
+       fdArray = &Null (CFF1FDArray);
+       fdSelect = &Null (CFF1FDSelect);
+      }
+
+      encoding = &Null (Encoding);
+      if (is_CID ())
+      {
+       if (unlikely (charset == &Null (Charset))) { fini (); return; }
+      }
+      else
+      {
+       if (!is_predef_encoding ())
+       {
+         encoding = &StructAtOffsetOrNull<Encoding> (cff, topDict.EncodingOffset);
+         if (unlikely ((encoding == &Null (Encoding)) || !encoding->sanitize (&sc))) { fini (); return; }
+       }
       }
 
       stringIndex = &StructAtOffset<CFF1StringIndex> (topDictIndex, topDictIndex->get_size ());
@@ -1086,7 +1080,7 @@ struct cff1
 
       charStrings = &StructAtOffsetOrNull<CFF1CharStrings> (cff, topDict.charStringsOffset);
 
-      if ((charStrings == &Null(CFF1CharStrings)) || unlikely (!charStrings->sanitize (&sc)))
+      if ((charStrings == &Null (CFF1CharStrings)) || unlikely (!charStrings->sanitize (&sc)))
       { fini (); return; }
 
       num_glyphs = charStrings->count;
@@ -1104,14 +1098,14 @@ struct cff1
        {
          byte_str_t fontDictStr = (*fdArray)[i];
          if (unlikely (!fontDictStr.sanitize (&sc))) { fini (); return; }
-         cff1_font_dict_values_t  *font;
+         cff1_font_dict_values_t *font;
          cff1_font_dict_interpreter_t font_interp;
          font_interp.env.init (fontDictStr);
          font = fontDicts.push ();
-         if (unlikely (font == &Crap(cff1_font_dict_values_t))) { fini (); return; }
+         if (unlikely (font == &Crap (cff1_font_dict_values_t))) { fini (); return; }
          font->init ();
          if (unlikely (!font_interp.interpret (*font))) { fini (); return; }
-         PRIVDICTVAL  *priv = &privateDicts[i];
+         PRIVDICTVAL *priv = &privateDicts[i];
          const byte_str_t privDictStr (StructAtOffset<UnsizedByteStr> (cff, font->privateDictInfo.offset), font->privateDictInfo.size);
          if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
          dict_interpreter_t<PRIVOPSET, PRIVDICTVAL> priv_interp;
@@ -1120,15 +1114,15 @@ struct cff1
          if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; }
 
          priv->localSubrs = &StructAtOffsetOrNull<CFF1Subrs> (&privDictStr, priv->subrsOffset);
-         if (priv->localSubrs != &Null(CFF1Subrs) &&
+         if (priv->localSubrs != &Null (CFF1Subrs) &&
              unlikely (!priv->localSubrs->sanitize (&sc)))
          { fini (); return; }
        }
       }
       else  /* non-CID */
       {
-       cff1_top_dict_values_t  *font = &topDict;
-       PRIVDICTVAL  *priv = &privateDicts[0];
+       cff1_top_dict_values_t *font = &topDict;
+       PRIVDICTVAL *priv = &privateDicts[0];
 
        const byte_str_t privDictStr (StructAtOffset<UnsizedByteStr> (cff, font->privateDictInfo.offset), font->privateDictInfo.size);
        if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; }
@@ -1138,7 +1132,7 @@ struct cff1
        if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; }
 
        priv->localSubrs = &StructAtOffsetOrNull<CFF1Subrs> (&privDictStr, priv->subrsOffset);
-       if (priv->localSubrs != &Null(CFF1Subrs) &&
+       if (priv->localSubrs != &Null (CFF1Subrs) &&
            unlikely (!priv->localSubrs->sanitize (&sc)))
        { fini (); return; }
       }
@@ -1154,7 +1148,7 @@ struct cff1
       blob = nullptr;
     }
 
-    bool is_valid () const { return blob != nullptr; }
+    bool is_valid () const { return blob; }
     bool   is_CID () const { return topDict.is_CID (); }
 
     bool is_predef_charset () const { return topDict.CharsetOffset <= ExpertSubsetCharset; }
@@ -1165,69 +1159,18 @@ struct cff1
       if (unlikely (sid == CFF_UNDEF_SID))
        return 0;
 
-      if (charset != &Null(Charset))
+      if (charset != &Null (Charset))
        return charset->get_glyph (sid, num_glyphs);
       else if ((topDict.CharsetOffset == ISOAdobeCharset)
              && (code <= 228 /*zcaron*/)) return sid;
       return 0;
     }
 
-    protected:
-    hb_blob_t         *blob;
-    hb_sanitize_context_t   sc;
-
-    public:
-    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;
-
-    cff1_top_dict_values_t       topDict;
-    hb_vector_t<cff1_font_dict_values_t>   fontDicts;
-    hb_vector_t<PRIVDICTVAL>     privateDicts;
-
-    unsigned int           num_glyphs;
-  };
-
-  struct accelerator_t : accelerator_templ_t<cff1_private_dict_opset_t, cff1_private_dict_values_t>
-  {
-    HB_INTERNAL bool get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const;
-    HB_INTERNAL bool get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const;
-  };
-
-  struct accelerator_subset_t : accelerator_templ_t<cff1_private_dict_opset_subset, cff1_private_dict_values_subset_t>
-  {
-    void init (hb_face_t *face)
-    {
-      SUPER::init (face);
-      if (blob == nullptr) return;
-
-      const OT::cff1 *cff = this->blob->as<OT::cff1> ();
-      encoding = &Null(Encoding);
-      if (is_CID ())
-      {
-       if (unlikely (charset == &Null(Charset))) { fini (); return; }
-      }
-      else
-      {
-       if (!is_predef_encoding ())
-       {
-         encoding = &StructAtOffsetOrNull<Encoding> (cff, topDict.EncodingOffset);
-         if (unlikely ((encoding == &Null (Encoding)) || !encoding->sanitize (&sc))) { fini (); return; }
-       }
-      }
-    }
-
     bool is_predef_encoding () const { return topDict.EncodingOffset <= ExpertEncoding; }
 
     hb_codepoint_t glyph_to_code (hb_codepoint_t glyph) const
     {
-      if (encoding != &Null(Encoding))
+      if (encoding != &Null (Encoding))
        return encoding->get_code (glyph);
       else
       {
@@ -1251,20 +1194,20 @@ struct cff1
 
     hb_codepoint_t glyph_to_sid (hb_codepoint_t glyph) const
     {
-      if (charset != &Null(Charset))
-       return charset->get_sid (glyph);
+      if (charset != &Null (Charset))
+       return charset->get_sid (glyph, num_glyphs);
       else
       {
        hb_codepoint_t sid = 0;
        switch (topDict.CharsetOffset)
        {
-         case  ISOAdobeCharset:
+         case ISOAdobeCharset:
            if (glyph <= 228 /*zcaron*/) sid = glyph;
            break;
-         case  ExpertCharset:
+         case ExpertCharset:
            sid = lookup_expert_charset_for_sid (glyph);
            break;
-         case  ExpertSubsetCharset:
+         case ExpertSubsetCharset:
              sid = lookup_expert_subset_charset_for_sid (glyph);
            break;
          default:
@@ -1274,35 +1217,174 @@ struct cff1
       }
     }
 
-    const Encoding       *encoding;
+    hb_codepoint_t sid_to_glyph (hb_codepoint_t sid) const
+    {
+      if (charset != &Null (Charset))
+       return charset->get_glyph (sid, num_glyphs);
+      else
+      {
+       hb_codepoint_t glyph = 0;
+       switch (topDict.CharsetOffset)
+       {
+         case ISOAdobeCharset:
+           if (sid <= 228 /*zcaron*/) glyph = sid;
+           break;
+         case ExpertCharset:
+           glyph = lookup_expert_charset_for_glyph (sid);
+           break;
+         case ExpertSubsetCharset:
+           glyph = lookup_expert_subset_charset_for_glyph (sid);
+           break;
+         default:
+           break;
+       }
+       return glyph;
+      }
+    }
 
-    private:
-    typedef accelerator_templ_t<cff1_private_dict_opset_subset, cff1_private_dict_values_subset_t> SUPER;
+    protected:
+    hb_blob_t             *blob;
+    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;
+
+    cff1_top_dict_values_t   topDict;
+    hb_vector_t<cff1_font_dict_values_t>
+                            fontDicts;
+    hb_vector_t<PRIVDICTVAL> privateDicts;
+
+    unsigned int            num_glyphs;
   };
 
-  bool subset (hb_subset_plan_t *plan) const
+  struct accelerator_t : accelerator_templ_t<cff1_private_dict_opset_t, cff1_private_dict_values_t>
   {
-    hb_blob_t *cff_prime = nullptr;
-
-    bool success = true;
-    if (hb_subset_cff1 (plan, &cff_prime)) {
-      success = success && plan->add_table (HB_OT_TAG_cff1, cff_prime);
-      hb_blob_t *head_blob = hb_sanitize_context_t().reference_table<head> (plan->source);
-      success = success && head_blob && plan->add_table (HB_OT_TAG_head, head_blob);
-      hb_blob_destroy (head_blob);
-    } else {
-      success = false;
+    void init (hb_face_t *face)
+    {
+      SUPER::init (face);
+
+      if (!is_valid ()) return;
+      if (is_CID ()) return;
+
+      /* fill glyph_names */
+      for (hb_codepoint_t gid = 0; gid < num_glyphs; gid++)
+      {
+       hb_codepoint_t  sid = glyph_to_sid (gid);
+       gname_t gname;
+       gname.sid = sid;
+       if (sid < cff1_std_strings_length)
+         gname.name = cff1_std_strings (sid);
+       else
+       {
+         byte_str_t    ustr = (*stringIndex)[sid - cff1_std_strings_length];
+         gname.name = hb_bytes_t ((const char*)ustr.arrayZ, ustr.length);
+       }
+       if (unlikely (!gname.name.arrayZ)) { fini (); return; }
+       glyph_names.push (gname);
+      }
+      glyph_names.qsort ();
     }
-    hb_blob_destroy (cff_prime);
 
-    return success;
-  }
+    void fini ()
+    {
+      glyph_names.fini ();
+
+      SUPER::fini ();
+    }
+
+    bool get_glyph_name (hb_codepoint_t glyph,
+                        char *buf, unsigned int buf_len) const
+    {
+      if (!buf) return true;
+      if (unlikely (!is_valid ())) return false;
+      if (is_CID()) return false;
+      hb_codepoint_t sid = glyph_to_sid (glyph);
+      const char *str;
+      size_t str_len;
+      if (sid < cff1_std_strings_length)
+      {
+       hb_bytes_t byte_str = cff1_std_strings (sid);
+       str = byte_str.arrayZ;
+       str_len = byte_str.length;
+      }
+      else
+      {
+       byte_str_t ubyte_str = (*stringIndex)[sid - cff1_std_strings_length];
+       str = (const char *)ubyte_str.arrayZ;
+       str_len = ubyte_str.length;
+      }
+      if (!str_len) return false;
+      unsigned int len = hb_min (buf_len - 1, str_len);
+      strncpy (buf, (const char*)str, len);
+      buf[len] = '\0';
+      return true;
+    }
+
+    bool get_glyph_from_name (const char *name, int len,
+                             hb_codepoint_t *glyph) const
+    {
+      if (len < 0) len = strlen (name);
+      if (unlikely (!len)) return false;
+
+      gname_t key = { hb_bytes_t (name, len), 0 };
+      const gname_t *gname = glyph_names.bsearch (key);
+      if (!gname) return false;
+      hb_codepoint_t gid = sid_to_glyph (gname->sid);
+      if (!gid && gname->sid) return false;
+      *glyph = gid;
+      return true;
+    }
+
+    HB_INTERNAL bool get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const;
+    HB_INTERNAL bool get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const;
+#ifdef HB_EXPERIMENTAL_API
+    HB_INTERNAL bool get_path (hb_font_t *font, hb_codepoint_t glyph, draw_helper_t &draw_helper) const;
+#endif
+
+    private:
+    struct gname_t
+    {
+      hb_bytes_t       name;
+      uint16_t         sid;
+
+      static int cmp (const void *a_, const void *b_)
+      {
+       const gname_t *a = (const gname_t *)a_;
+       const gname_t *b = (const gname_t *)b_;
+       int minlen = hb_min (a->name.length, b->name.length);
+       int ret = strncmp (a->name.arrayZ, b->name.arrayZ, minlen);
+       if (ret) return ret;
+       return a->name.length - b->name.length;
+      }
+
+      int cmp (const gname_t &a) const { return cmp (&a, this); }
+    };
+
+    hb_sorted_vector_t<gname_t>        glyph_names;
+
+    typedef accelerator_templ_t<cff1_private_dict_opset_t, cff1_private_dict_values_t> SUPER;
+  };
+
+  struct accelerator_subset_t : accelerator_templ_t<cff1_private_dict_opset_subset, cff1_private_dict_values_subset_t> {};
+
+  bool subset (hb_subset_context_t *c) const { return hb_subset_cff1 (c); }
 
   protected:
   HB_INTERNAL static hb_codepoint_t lookup_standard_encoding_for_code (hb_codepoint_t sid);
   HB_INTERNAL static hb_codepoint_t lookup_expert_encoding_for_code (hb_codepoint_t sid);
   HB_INTERNAL static hb_codepoint_t lookup_expert_charset_for_sid (hb_codepoint_t glyph);
   HB_INTERNAL static hb_codepoint_t lookup_expert_subset_charset_for_sid (hb_codepoint_t glyph);
+  HB_INTERNAL static hb_codepoint_t lookup_expert_charset_for_glyph (hb_codepoint_t sid);
+  HB_INTERNAL static hb_codepoint_t lookup_expert_subset_charset_for_glyph (hb_codepoint_t sid);
   HB_INTERNAL static hb_codepoint_t lookup_standard_encoding_for_sid (hb_codepoint_t code);
 
   public:
index a2242b7..ac0feee 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "hb-ot-cff2-table.hh"
 #include "hb-cff2-interp-cs.hh"
+#include "hb-draw.hh"
 
 using namespace CFF;
 
@@ -142,5 +143,73 @@ bool OT::cff2::accelerator_t::get_extents (hb_font_t *font,
   return true;
 }
 
+#ifdef HB_EXPERIMENTAL_API
+struct cff2_path_param_t
+{
+  cff2_path_param_t (hb_font_t *font_, draw_helper_t &draw_helper_)
+  {
+    draw_helper = &draw_helper_;
+    font = font_;
+  }
+
+  void move_to (const point_t &p)
+  { draw_helper->move_to (font->em_scalef_x (p.x.to_real ()), font->em_scalef_y (p.y.to_real ())); }
+
+  void line_to (const point_t &p)
+  { draw_helper->line_to (font->em_scalef_x (p.x.to_real ()), font->em_scalef_y (p.y.to_real ())); }
+
+  void cubic_to (const point_t &p1, const point_t &p2, const point_t &p3)
+  {
+    draw_helper->cubic_to (font->em_scalef_x (p1.x.to_real ()), font->em_scalef_y (p1.y.to_real ()),
+                          font->em_scalef_x (p2.x.to_real ()), font->em_scalef_y (p2.y.to_real ()),
+                          font->em_scalef_x (p3.x.to_real ()), font->em_scalef_y (p3.y.to_real ()));
+  }
+
+  protected:
+  draw_helper_t *draw_helper;
+  hb_font_t *font;
+};
+
+struct cff2_path_procs_path_t : path_procs_t<cff2_path_procs_path_t, cff2_cs_interp_env_t, cff2_path_param_t>
+{
+  static void moveto (cff2_cs_interp_env_t &env, cff2_path_param_t& param, const point_t &pt)
+  {
+    param.move_to (pt);
+    env.moveto (pt);
+  }
+
+  static void line (cff2_cs_interp_env_t &env, cff2_path_param_t& param, const point_t &pt1)
+  {
+    param.line_to (pt1);
+    env.moveto (pt1);
+  }
+
+  static void curve (cff2_cs_interp_env_t &env, cff2_path_param_t& param, const point_t &pt1, const point_t &pt2, const point_t &pt3)
+  {
+    param.cubic_to (pt1, pt2, pt3);
+    env.moveto (pt3);
+  }
+};
+
+struct cff2_cs_opset_path_t : cff2_cs_opset_t<cff2_cs_opset_path_t, cff2_path_param_t, cff2_path_procs_path_t> {};
+
+bool OT::cff2::accelerator_t::get_path (hb_font_t *font, hb_codepoint_t glyph, draw_helper_t &draw_helper) const
+{
+#ifdef HB_NO_OT_FONT_CFF
+  /* XXX Remove check when this code moves to .hh file. */
+  return true;
+#endif
+
+  if (unlikely (!is_valid () || (glyph >= num_glyphs))) return false;
+
+  unsigned int fd = fdSelect->get_fd (glyph);
+  cff2_cs_interpreter_t<cff2_cs_opset_path_t, cff2_path_param_t> interp;
+  const byte_str_t str = (*charStrings)[glyph];
+  interp.env.init (str, *this, fd, font->coords, font->num_coords);
+  cff2_path_param_t param (font, draw_helper);
+  if (unlikely (!interp.interpret (param))) return false;
+  return true;
+}
+#endif
 
 #endif
index 8646cde..075a0d4 100644 (file)
@@ -27,9 +27,9 @@
 #ifndef HB_OT_CFF2_TABLE_HH
 #define HB_OT_CFF2_TABLE_HH
 
-#include "hb-ot-head-table.hh"
 #include "hb-ot-cff-common.hh"
 #include "hb-subset-cff2.hh"
+#include "hb-draw.hh"
 
 namespace CFF {
 
@@ -43,7 +43,6 @@ typedef CFFIndex<HBUINT32>  CFF2Index;
 template <typename Type> struct CFF2IndexOf : CFFIndexOf<HBUINT32, Type> {};
 
 typedef CFF2Index         CFF2CharStrings;
-typedef FDArray<HBUINT32> CFF2FDArray;
 typedef Subrs<HBUINT32>   CFF2Subrs;
 
 typedef FDSelect3_4<HBUINT32, HBUINT16> FDSelect4;
@@ -56,14 +55,11 @@ struct CFF2FDSelect
     TRACE_SERIALIZE (this);
     unsigned int size = src.get_size (num_glyphs);
     CFF2FDSelect *dest = c->allocate_size<CFF2FDSelect> (size);
-    if (unlikely (dest == nullptr)) return_trace (false);
+    if (unlikely (!dest)) return_trace (false);
     memcpy (dest, &src, size);
     return_trace (true);
   }
 
-  unsigned int calculate_serialized_size (unsigned int num_glyphs) const
-  { return get_size (num_glyphs); }
-
   unsigned int get_size (unsigned int num_glyphs) const
   {
     switch (format)
@@ -127,7 +123,7 @@ struct CFF2VariationStore
     TRACE_SERIALIZE (this);
     unsigned int size_ = varStore->get_size ();
     CFF2VariationStore *dest = c->allocate_size<CFF2VariationStore> (size_);
-    if (unlikely (dest == nullptr)) return_trace (false);
+    if (unlikely (!dest)) return_trace (false);
     memcpy (dest, varStore, size_);
     return_trace (true);
   }
@@ -150,26 +146,6 @@ struct cff2_top_dict_values_t : top_dict_values_t<>
   }
   void fini () { top_dict_values_t<>::fini (); }
 
-  unsigned int calculate_serialized_size () const
-  {
-    unsigned int size = 0;
-    for (unsigned int i = 0; i < get_count (); i++)
-    {
-      op_code_t op = get_value (i).op;
-      switch (op)
-      {
-       case OpCode_vstore:
-       case OpCode_FDSelect:
-         size += OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (op);
-         break;
-       default:
-         size += top_dict_values_t<>::calculate_serialized_op_size (get_value (i));
-         break;
-      }
-    }
-    return size;
-  }
-
   unsigned int  vstoreOffset;
   unsigned int  FDSelectOffset;
 };
@@ -256,22 +232,11 @@ struct cff2_private_dict_values_base_t : dict_values_t<VAL>
   {
     dict_values_t<VAL>::init ();
     subrsOffset = 0;
-    localSubrs = &Null(CFF2Subrs);
+    localSubrs = &Null (CFF2Subrs);
     ivs = 0;
   }
   void fini () { dict_values_t<VAL>::fini (); }
 
-  unsigned int calculate_serialized_size () const
-  {
-    unsigned int size = 0;
-    for (unsigned int i = 0; i < dict_values_t<VAL>::get_count; i++)
-      if (dict_values_t<VAL>::get_value (i).op == OpCode_Subrs)
-       size += OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Subrs);
-      else
-       size += dict_values_t<VAL>::get_value (i).str.length;
-    return size;
-  }
-
   unsigned int      subrsOffset;
   const CFF2Subrs   *localSubrs;
   unsigned int      ivs;
@@ -404,6 +369,14 @@ struct cff2_private_dict_opset_subset_t : dict_opset_t
 typedef dict_interpreter_t<cff2_top_dict_opset_t, cff2_top_dict_values_t> cff2_top_dict_interpreter_t;
 typedef dict_interpreter_t<cff2_font_dict_opset_t, cff2_font_dict_values_t> cff2_font_dict_interpreter_t;
 
+struct CFF2FDArray : FDArray<HBUINT32>
+{
+  /* FDArray::serialize does not compile without this partial specialization */
+  template <typename ITER, typename OP_SERIALIZER>
+  bool serialize (hb_serialize_context_t *c, ITER it, OP_SERIALIZER& opszr)
+  { return FDArray<HBUINT32>::serialize<cff2_font_dict_values_t, table_info_t> (c, it, opszr); }
+};
+
 } /* namespace CFF */
 
 namespace OT {
@@ -438,7 +411,7 @@ struct cff2
 
       const OT::cff2 *cff2 = this->blob->template as<OT::cff2> ();
 
-      if (cff2 == &Null(OT::cff2))
+      if (cff2 == &Null (OT::cff2))
       { fini (); return; }
 
       { /* parse top dict */
@@ -456,11 +429,11 @@ struct cff2
       fdArray = &StructAtOffsetOrNull<CFF2FDArray> (cff2, topDict.FDArrayOffset);
       fdSelect = &StructAtOffsetOrNull<CFF2FDSelect> (cff2, topDict.FDSelectOffset);
 
-      if (((varStore != &Null(CFF2VariationStore)) && unlikely (!varStore->sanitize (&sc))) ||
-         (charStrings == &Null(CFF2CharStrings)) || unlikely (!charStrings->sanitize (&sc)) ||
-         (globalSubrs == &Null(CFF2Subrs)) || unlikely (!globalSubrs->sanitize (&sc)) ||
-         (fdArray == &Null(CFF2FDArray)) || unlikely (!fdArray->sanitize (&sc)) ||
-         (((fdSelect != &Null(CFF2FDSelect)) && unlikely (!fdSelect->sanitize (&sc, fdArray->count)))))
+      if (((varStore != &Null (CFF2VariationStore)) && unlikely (!varStore->sanitize (&sc))) ||
+         (charStrings == &Null (CFF2CharStrings)) || unlikely (!charStrings->sanitize (&sc)) ||
+         (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; }
 
       num_glyphs = charStrings->count;
@@ -479,7 +452,7 @@ struct cff2
        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))) { fini (); return; }
        font->init ();
        if (unlikely (!font_interp.interpret (*font))) { fini (); return; }
 
@@ -491,7 +464,7 @@ struct cff2
        if (unlikely (!priv_interp.interpret (privateDicts[i]))) { fini (); return; }
 
        privateDicts[i].localSubrs = &StructAtOffsetOrNull<CFF2Subrs> (&privDictStr[0], privateDicts[i].subrsOffset);
-       if (privateDicts[i].localSubrs != &Null(CFF2Subrs) &&
+       if (privateDicts[i].localSubrs != &Null (CFF2Subrs) &&
          unlikely (!privateDicts[i].localSubrs->sanitize (&sc)))
        { fini (); return; }
       }
@@ -507,7 +480,7 @@ struct cff2
       blob = nullptr;
     }
 
-    bool is_valid () const { return blob != nullptr; }
+    bool is_valid () const { return blob; }
 
     protected:
     hb_blob_t                  *blob;
@@ -533,27 +506,14 @@ struct cff2
     HB_INTERNAL bool get_extents (hb_font_t *font,
                                  hb_codepoint_t glyph,
                                  hb_glyph_extents_t *extents) const;
+#ifdef HB_EXPERIMENTAL_API
+    HB_INTERNAL bool get_path (hb_font_t *font, hb_codepoint_t glyph, draw_helper_t &draw_helper) const;
+#endif
   };
 
   typedef accelerator_templ_t<cff2_private_dict_opset_subset_t, cff2_private_dict_values_subset_t> accelerator_subset_t;
 
-  bool subset (hb_subset_plan_t *plan) const
-  {
-    hb_blob_t *cff2_prime = nullptr;
-
-    bool success = true;
-    if (hb_subset_cff2 (plan, &cff2_prime)) {
-      success = success && plan->add_table (HB_OT_TAG_cff2, cff2_prime);
-      hb_blob_t *head_blob = hb_sanitize_context_t().reference_table<head> (plan->source);
-      success = success && head_blob && plan->add_table (HB_OT_TAG_head, head_blob);
-      hb_blob_destroy (head_blob);
-    } else {
-      success = false;
-    }
-    hb_blob_destroy (cff2_prime);
-
-    return success;
-  }
+  bool subset (hb_subset_context_t *c) const { return hb_subset_cff2 (c); }
 
   public:
   FixedVersion<HBUINT8>                version;        /* Version of CFF2 table. set to 0x0200u */
index 9ebd8e4..c42f3fd 100644 (file)
@@ -56,6 +56,18 @@ struct CmapSubtableFormat0
        out->add (i);
   }
 
+  void collect_mapping (hb_set_t *unicodes, /* OUT */
+                        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);
+      }
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -83,18 +95,16 @@ struct CmapSubtableFormat4
     HBUINT16 *endCode = c->start_embed<HBUINT16> ();
     hb_codepoint_t prev_endcp = 0xFFFF;
 
-    + it
-    | hb_apply ([&] (const hb_item_type<Iterator> _)
-               {
-                 if (prev_endcp != 0xFFFF && prev_endcp + 1u != _.first)
-                 {
-                   HBUINT16 end_code;
-                   end_code = prev_endcp;
-                   c->copy<HBUINT16> (end_code);
-                 }
-                 prev_endcp = _.first;
-               })
-    ;
+    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;
+    }
 
     {
       // last endCode
@@ -121,19 +131,17 @@ struct CmapSubtableFormat4
     HBUINT16 *startCode = c->start_embed<HBUINT16> ();
     hb_codepoint_t prev_cp = 0xFFFF;
 
-    + it
-    | hb_apply ([&] (const hb_item_type<Iterator> _)
-               {
-                 if (prev_cp == 0xFFFF || prev_cp + 1u != _.first)
-                 {
-                   HBUINT16 start_code;
-                   start_code = _.first;
-                   c->copy<HBUINT16> (start_code);
-                 }
-
-                 prev_cp = _.first;
-               })
-    ;
+    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);
+      }
+
+      prev_cp = _.first;
+    }
 
     // There must be a final entry with end_code == 0xFFFF.
     if (it.len () == 0 || prev_cp != 0xFFFF)
@@ -162,30 +170,28 @@ struct CmapSubtableFormat4
     if ((char *)idDelta - (char *)startCode != (int) segcount * (int) HBINT16::static_size)
       return nullptr;
 
-    + it
-    | hb_apply ([&] (const hb_item_type<Iterator> _)
-               {
-                 if (_.first == startCode[i])
-                 {
-                   use_delta = true;
-                   start_gid = _.second;
-                 }
-                 else if (_.second != last_gid + 1) use_delta = false;
-
-                 if (_.first == endCode[i])
-                 {
-                   HBINT16 delta;
-                   if (use_delta) delta = (int)start_gid - (int)startCode[i];
-                   else delta = 0;
-                   c->copy<HBINT16> (delta);
-
-                   i++;
-                 }
-
-                 last_gid = _.second;
-                 last_cp = _.first;
-               })
-    ;
+    for (const hb_item_type<Iterator> _ : +it)
+    {
+      if (_.first == startCode[i])
+      {
+       use_delta = true;
+       start_gid = _.second;
+      }
+      else if (_.second != last_gid + 1) use_delta = false;
+
+      if (_.first == endCode[i])
+      {
+       HBINT16 delta;
+       if (use_delta) delta = (int)start_gid - (int)startCode[i];
+       else delta = 0;
+       c->copy<HBINT16> (delta);
+
+       i++;
+      }
+
+      last_gid = _.second;
+      last_cp = _.first;
+    }
 
     if (it.len () == 0 || last_cp != 0xFFFF)
     {
@@ -238,12 +244,20 @@ struct CmapSubtableFormat4
   void serialize (hb_serialize_context_t *c,
                  Iterator it)
   {
+    auto format4_iter =
+    + it
+    | hb_filter ([&] (const hb_pair_t<hb_codepoint_t, hb_codepoint_t> _)
+                { return _.first <= 0xFFFF; })
+    ;
+
+    if (format4_iter.len () == 0) return;
+
     unsigned table_initpos = c->length ();
     if (unlikely (!c->extend_min (*this))) return;
     this->format = 4;
 
     //serialize endCode[]
-    HBUINT16 *endCode = serialize_endcode_array (c, it);
+    HBUINT16 *endCode = serialize_endcode_array (c, format4_iter);
     if (unlikely (!endCode)) return;
 
     unsigned segcount = (c->length () - min_size) / HBUINT16::static_size;
@@ -252,14 +266,14 @@ struct CmapSubtableFormat4
     if (unlikely (!c->allocate_size<HBUINT16> (HBUINT16::static_size))) return; // 2 bytes of padding.
 
    // serialize startCode[]
-    HBUINT16 *startCode = serialize_startcode_array (c, it);
+    HBUINT16 *startCode = serialize_startcode_array (c, format4_iter);
     if (unlikely (!startCode)) return;
 
     //serialize idDelta[]
-    HBINT16 *idDelta = serialize_idDelta_array (c, it, endCode, startCode, segcount);
+    HBINT16 *idDelta = serialize_idDelta_array (c, format4_iter, endCode, startCode, segcount);
     if (unlikely (!idDelta)) return;
 
-    HBUINT16 *idRangeOffset = serialize_rangeoffset_glyid (c, it, endCode, startCode, idDelta, 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;
@@ -291,27 +305,28 @@ struct CmapSubtableFormat4
 
     bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
     {
-      /* Custom two-array bsearch. */
-      int min = 0, max = (int) this->segCount - 1;
-      const HBUINT16 *startCount = this->startCount;
-      const HBUINT16 *endCount = this->endCount;
-      unsigned int i;
-      while (min <= max)
+      struct CustomRange
       {
-       int mid = ((unsigned int) min + (unsigned int) max) / 2;
-       if (codepoint < startCount[mid])
-         max = mid - 1;
-       else if (codepoint > endCount[mid])
-         min = mid + 1;
-       else
+       int cmp (hb_codepoint_t k,
+                unsigned distance) const
        {
-         i = mid;
-         goto found;
+         if (k > last) return +1;
+         if (k < (&last)[distance]) return -1;
+         return 0;
        }
-      }
-      return false;
+       HBUINT16 last;
+      };
+
+      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;
 
-    found:
       hb_codepoint_t gid;
       unsigned int rangeOffset = this->idRangeOffset[i];
       if (rangeOffset == 0)
@@ -333,8 +348,10 @@ struct CmapSubtableFormat4
       *glyph = gid;
       return true;
     }
+
     HB_INTERNAL static bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph)
     { return ((const accelerator_t *) obj)->get_glyph (codepoint, glyph); }
+
     void collect_unicodes (hb_set_t *out) const
     {
       unsigned int count = this->segCount;
@@ -371,6 +388,45 @@ struct CmapSubtableFormat4
       }
     }
 
+    void collect_mapping (hb_set_t *unicodes, /* OUT */
+                          hb_map_t *mapping /* OUT */) const
+    {
+      unsigned count = this->segCount;
+      if (count && this->startCount[count - 1] == 0xFFFFu)
+        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);
+          }
+        }
+      }
+    }
+
     const HBUINT16 *endCount;
     const HBUINT16 *startCount;
     const HBUINT16 *idDelta;
@@ -391,6 +447,13 @@ struct CmapSubtableFormat4
     accel.collect_unicodes (out);
   }
 
+  void collect_mapping (hb_set_t *unicodes, /* OUT */
+                        hb_map_t *mapping /* OUT */) const
+  {
+    accelerator_t accel (this);
+    accel.collect_mapping (unicodes, mapping);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -493,6 +556,21 @@ struct CmapSubtableTrimmed
        out->add (start + i);
   }
 
+  void collect_mapping (hb_set_t *unicodes, /* OUT */
+                        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);
+      }
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -528,19 +606,55 @@ struct CmapSubtableLongSegmented
     return true;
   }
 
-  void collect_unicodes (hb_set_t *out) const
+  void collect_unicodes (hb_set_t *out, unsigned int num_glyphs) const
   {
     for (unsigned int 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);
-      for (hb_codepoint_t codepoint = start; codepoint <= end; codepoint++)
+      hb_codepoint_t gid = this->groups[i].glyphID;
+      if (!gid)
       {
-       hb_codepoint_t gid = T::group_get_glyph (this->groups[i], codepoint);
-       if (unlikely (!gid))
-         continue;
-       out->add (codepoint);
+       /* 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;
+
+      out->add_range (start, end);
+    }
+  }
+
+  void collect_mapping (hb_set_t *unicodes, /* OUT */
+                        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 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++;
+      }
+      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;
+
+      for (unsigned cp = start; cp <= end; cp++)
+      {
+        unicodes->add (cp);
+        mapping->set (cp, gid);
+        gid++;
       }
     }
   }
@@ -582,33 +696,29 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented<CmapSubtableFormat12>
     hb_codepoint_t startCharCode = 0xFFFF, endCharCode = 0xFFFF;
     hb_codepoint_t glyphID = 0;
 
-    + it
-    | hb_apply ([&] (const hb_item_type<Iterator> _)
-             {
-               if (startCharCode == 0xFFFF)
-               {
-                 startCharCode = _.first;
-                 endCharCode = _.first;
-                 glyphID = _.second;
-               }
-               else if (!_is_gid_consecutive (endCharCode, startCharCode, glyphID, _.first, _.second))
-               {
-                 CmapSubtableLongGroup  grouprecord;
-                 grouprecord.startCharCode = startCharCode;
-                 grouprecord.endCharCode = endCharCode;
-                 grouprecord.glyphID = glyphID;
-                 c->copy<CmapSubtableLongGroup> (grouprecord);
-
-                 startCharCode = _.first;
-                 endCharCode = _.first;
-                 glyphID = _.second;
-               }
-               else
-               {
-                 endCharCode = _.first;
-               }
-             })
-    ;
+    for (const hb_item_type<Iterator> _ : +it)
+    {
+      if (startCharCode == 0xFFFF)
+      {
+       startCharCode = _.first;
+       endCharCode = _.first;
+       glyphID = _.second;
+      }
+      else if (!_is_gid_consecutive (endCharCode, startCharCode, glyphID, _.first, _.second))
+      {
+       CmapSubtableLongGroup  grouprecord;
+       grouprecord.startCharCode = startCharCode;
+       grouprecord.endCharCode = endCharCode;
+       grouprecord.glyphID = glyphID;
+       c->copy<CmapSubtableLongGroup> (grouprecord);
+
+       startCharCode = _.first;
+       endCharCode = _.first;
+       glyphID = _.second;
+      }
+      else
+       endCharCode = _.first;
+    }
 
     CmapSubtableLongGroup record;
     record.startCharCode = startCharCode;
@@ -772,7 +882,20 @@ struct NonDefaultUVS : SortedArrayOf<UVSMapping, HBUINT32>
   {
     unsigned int count = len;
     for (unsigned int i = 0; i < count; i++)
-      out->add (arrayZ[i].glyphID);
+      out->add (arrayZ[i].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++)
+    {
+      hb_codepoint_t unicode = arrayZ[i].unicodeValue;
+      hb_codepoint_t glyphid = arrayZ[i].glyphID;
+      unicodes->add (unicode);
+      mapping->set (unicode, glyphid);
+    }
   }
 
   void closure_glyphs (const hb_set_t      *unicodes,
@@ -787,7 +910,7 @@ struct NonDefaultUVS : SortedArrayOf<UVSMapping, HBUINT32>
 
   NonDefaultUVS* copy (hb_serialize_context_t *c,
                       const hb_set_t *unicodes,
-                      const hb_set_t *glyphs,
+                      const hb_set_t *glyphs_requested,
                       const hb_map_t *glyph_map) const
   {
     NonDefaultUVS *out = c->start_embed<NonDefaultUVS> ();
@@ -797,7 +920,7 @@ struct NonDefaultUVS : SortedArrayOf<UVSMapping, HBUINT32>
     + as_array ()
     | hb_filter ([&] (const UVSMapping& _)
                 {
-                  return unicodes->has (_.unicodeValue) || glyphs->has (_.glyphID);
+                  return unicodes->has (_.unicodeValue) || glyphs_requested->has (_.glyphID);
                 })
     ;
 
@@ -839,12 +962,34 @@ struct VariationSelectorRecord
     return GLYPH_VARIANT_NOT_FOUND;
   }
 
+  VariationSelectorRecord(const VariationSelectorRecord& other)
+  {
+    *this = other;
+  }
+
+  void operator= (const VariationSelectorRecord& other)
+  {
+    varSelector = other.varSelector;
+    HBUINT32 offset = other.defaultUVS;
+    defaultUVS = offset;
+    offset = other.nonDefaultUVS;
+    nonDefaultUVS = offset;
+  }
+
   void collect_unicodes (hb_set_t *out, const void *base) const
   {
     (base+defaultUVS).collect_unicodes (out);
     (base+nonDefaultUVS).collect_unicodes (out);
   }
 
+  void collect_mapping (const void *base,
+                       hb_set_t *unicodes, /* OUT */
+                       hb_map_t *mapping /* OUT */) const
+  {
+    (base+defaultUVS).collect_unicodes (unicodes);
+    (base+nonDefaultUVS).collect_mapping (unicodes, mapping);
+  }
+
   int cmp (const hb_codepoint_t &variation_selector) const
   { return varSelector.cmp (variation_selector); }
 
@@ -856,50 +1001,43 @@ struct VariationSelectorRecord
                  nonDefaultUVS.sanitize (c, base));
   }
 
-  VariationSelectorRecord* copy (hb_serialize_context_t *c,
-                                const hb_set_t *unicodes,
-                                const hb_set_t *glyphs,
-                                const hb_map_t *glyph_map,
-                                const void *src_base,
-                                const void *dst_base) const
+  hb_pair_t<unsigned, unsigned>
+  copy (hb_serialize_context_t *c,
+       const hb_set_t *unicodes,
+       const hb_set_t *glyphs_requested,
+       const hb_map_t *glyph_map,
+       const void *base) const
   {
     auto snap = c->snapshot ();
     auto *out = c->embed<VariationSelectorRecord> (*this);
-    if (unlikely (!out)) return nullptr;
+    if (unlikely (!out)) return hb_pair (0, 0);
 
     out->defaultUVS = 0;
     out->nonDefaultUVS = 0;
 
-    bool drop = true;
-
-    if (defaultUVS != 0)
+    unsigned non_default_uvs_objidx = 0;
+    if (nonDefaultUVS != 0)
     {
       c->push ();
-      if (c->copy (src_base+defaultUVS, unicodes))
-      {
-       c->add_link (out->defaultUVS, c->pop_pack (), dst_base);
-       drop = false;
-      }
+      if (c->copy (base+nonDefaultUVS, unicodes, glyphs_requested, glyph_map))
+       non_default_uvs_objidx = c->pop_pack ();
       else c->pop_discard ();
     }
 
-    if (nonDefaultUVS != 0)
+    unsigned default_uvs_objidx = 0;
+    if (defaultUVS != 0)
     {
       c->push ();
-      if (c->copy (src_base+nonDefaultUVS, unicodes, glyphs, glyph_map))
-      {
-       c->add_link (out->nonDefaultUVS, c->pop_pack (), dst_base);
-       drop = false;
-      }
+      if (c->copy (base+defaultUVS, unicodes))
+       default_uvs_objidx = c->pop_pack ();
       else c->pop_discard ();
     }
 
-    if (drop)
-    {
+
+    if (!default_uvs_objidx && !non_default_uvs_objidx)
       c->revert (snap);
-      return nullptr;
-    }
-    else return out;
+
+    return hb_pair (default_uvs_objidx, non_default_uvs_objidx);
   }
 
   HBUINT24     varSelector;    /* Variation selector. */
@@ -930,9 +1068,9 @@ struct CmapSubtableFormat14
 
   void serialize (hb_serialize_context_t *c,
                  const hb_set_t *unicodes,
-                 const hb_set_t *glyphs,
+                 const hb_set_t *glyphs_requested,
                  const hb_map_t *glyph_map,
-                 const void *src_base)
+                 const void *base)
   {
     auto snap = c->snapshot ();
     unsigned table_initpos = c->length ();
@@ -941,17 +1079,67 @@ struct CmapSubtableFormat14
     if (unlikely (!c->extend_min (*this))) return;
     this->format = 14;
 
-    const CmapSubtableFormat14 *src_tbl = reinterpret_cast<const CmapSubtableFormat14*> (src_base);
-    for (const VariationSelectorRecord& _ : src_tbl->record)
-      c->copy (_, unicodes, glyphs, glyph_map, src_base, this);
+    auto src_tbl = reinterpret_cast<const CmapSubtableFormat14*> (base);
+
+    /*
+     * Some versions of OTS require that offsets are in order. Due to the use
+     * of push()/pop_pack() serializing the variation records in order results
+     * in the offsets being in reverse order (first record has the largest
+     * offset). While this is perfectly valid, it will cause some versions of
+     * OTS to consider this table bad.
+     *
+     * So to prevent this issue we serialize the variation records in reverse
+     * order, so that the offsets are ordered from small to large. Since
+     * variation records are supposed to be in increasing order of varSelector
+     * we then have to reverse the order of the written variation selector
+     * records after everything is finalized.
+     */
+    hb_vector_t<hb_pair_t<unsigned, unsigned>> obj_indices;
+    for (int i = src_tbl->record.len - 1; i >= 0; i--)
+    {
+      hb_pair_t<unsigned, unsigned> result = src_tbl->record[i].copy (c, unicodes, glyphs_requested, glyph_map, base);
+      if (result.first || result.second)
+       obj_indices.push (result);
+    }
 
     if (c->length () - table_initpos == CmapSubtableFormat14::min_size)
+    {
       c->revert (snap);
-    else
+      return;
+    }
+
+    int tail_len = init_tail - c->tail;
+    c->check_assign (this->length, c->length () - table_initpos + tail_len);
+    c->check_assign (this->record.len,
+                    (c->length () - table_initpos - CmapSubtableFormat14::min_size) /
+                    VariationSelectorRecord::static_size);
+
+    /* Correct the incorrect write order by reversing the order of the variation
+       records array. */
+    _reverse_variation_records ();
+
+    /* Now that records are in the right order, we can set up the offsets. */
+    _add_links_to_variation_records (c, obj_indices);
+  }
+
+  void _reverse_variation_records ()
+  {
+    record.as_array ().reverse ();
+  }
+
+  void _add_links_to_variation_records (hb_serialize_context_t *c,
+                                       const hb_vector_t<hb_pair_t<unsigned, unsigned>>& obj_indices)
+  {
+    for (unsigned i = 0; i < obj_indices.length; i++)
     {
-      int tail_len = init_tail - c->tail;
-      c->check_assign (this->length, c->length () - table_initpos + tail_len);
-      c->check_assign (this->record.len, (c->length () - table_initpos - CmapSubtableFormat14::min_size) / VariationSelectorRecord::static_size);
+      /*
+       * Since the record array has been reversed (see comments in copy())
+       * but obj_indices has not been, the indices at obj_indices[i]
+       * are for the variation record at record[j].
+       */
+      int j = obj_indices.length - 1 - i;
+      c->add_link (record[j].defaultUVS, obj_indices[i].first);
+      c->add_link (record[j].nonDefaultUVS, obj_indices[i].second);
     }
   }
 
@@ -966,6 +1154,19 @@ struct CmapSubtableFormat14
     ;
   }
 
+  void collect_unicodes (hb_set_t *out) const
+  {
+    for (const VariationSelectorRecord& _ : record)
+      _.collect_unicodes (out, this);
+  }
+
+  void collect_mapping (hb_set_t *unicodes, /* OUT */
+                       hb_map_t *mapping /* OUT */) const
+  {
+    for (const VariationSelectorRecord& _ : record)
+      _.collect_mapping (this, unicodes, mapping);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -1001,15 +1202,31 @@ struct CmapSubtable
     default: return false;
     }
   }
-  void collect_unicodes (hb_set_t *out) const
+  void collect_unicodes (hb_set_t *out, unsigned int num_glyphs = UINT_MAX) const
   {
     switch (u.format) {
     case  0: u.format0 .collect_unicodes (out); return;
     case  4: u.format4 .collect_unicodes (out); return;
     case  6: u.format6 .collect_unicodes (out); return;
     case 10: u.format10.collect_unicodes (out); return;
-    case 12: u.format12.collect_unicodes (out); return;
-    case 13: u.format13.collect_unicodes (out); return;
+    case 12: u.format12.collect_unicodes (out, num_glyphs); return;
+    case 13: u.format13.collect_unicodes (out, num_glyphs); return;
+    case 14:
+    default: return;
+    }
+  }
+
+  void collect_mapping (hb_set_t *unicodes, /* OUT */
+                       hb_map_t *mapping, /* OUT */
+                       unsigned num_glyphs = UINT_MAX) const
+  {
+    switch (u.format) {
+    case  0: u.format0 .collect_mapping (unicodes, mapping); return;
+    case  4: u.format4 .collect_mapping (unicodes, mapping); return;
+    case  6: u.format6 .collect_mapping (unicodes, mapping); return;
+    case 10: u.format10.collect_mapping (unicodes, mapping); return;
+    case 12: u.format12.collect_mapping (unicodes, mapping, num_glyphs); return;
+    case 13: u.format13.collect_mapping (unicodes, mapping, num_glyphs); return;
     case 14:
     default: return;
     }
@@ -1021,12 +1238,12 @@ struct CmapSubtable
                  Iterator it,
                  unsigned format,
                  const hb_subset_plan_t *plan,
-                 const void *src_base)
+                 const void *base)
   {
     switch (format) {
-    case  4: u.format4.serialize (c, it);  return;
-    case 12: u.format12.serialize (c, it); return;
-    case 14: u.format14.serialize (c, plan->unicodes, plan->_glyphset, plan->glyph_map, src_base); return;
+    case  4: return u.format4.serialize (c, it);
+    case 12: return u.format12.serialize (c, it);
+    case 14: return u.format14.serialize (c, plan->unicodes, plan->glyphs_requested, plan->glyph_map, base);
     default: return;
     }
   }
@@ -1087,8 +1304,7 @@ struct EncodingRecord
   EncodingRecord* copy (hb_serialize_context_t *c,
                        Iterator it,
                        unsigned format,
-                       const void *src_base,
-                       const void *dst_base,
+                       const void *base,
                        const hb_subset_plan_t *plan,
                        /* INOUT */ unsigned *objidx) const
   {
@@ -1102,7 +1318,7 @@ struct EncodingRecord
     {
       CmapSubtable *cmapsubtable = c->push<CmapSubtable> ();
       unsigned origin_length = c->length ();
-      cmapsubtable->serialize (c, it, format, plan, &(src_base+subtable));
+      cmapsubtable->serialize (c, it, format, plan, &(base+subtable));
       if (c->length () - origin_length > 0) *objidx = c->pop_pack ();
       else c->pop_discard ();
     }
@@ -1113,7 +1329,7 @@ struct EncodingRecord
       return_trace (nullptr);
     }
 
-    c->add_link (out->subtable, *objidx, dst_base);
+    c->add_link (out->subtable, *objidx);
     return_trace (out);
   }
 
@@ -1130,11 +1346,11 @@ struct cmap
   static constexpr hb_tag_t tableTag = HB_OT_TAG_cmap;
 
   template<typename Iterator, typename EncodingRecIter,
-          hb_requires (hb_is_iterator (Iterator))>
+          hb_requires (hb_is_iterator (EncodingRecIter))>
   void serialize (hb_serialize_context_t *c,
                  Iterator it,
                  EncodingRecIter encodingrec_iter,
-                 const void *src_base,
+                 const void *base,
                  const hb_subset_plan_t *plan)
   {
     if (unlikely (!c->extend_min ((*this))))  return;
@@ -1144,11 +1360,39 @@ struct cmap
 
     for (const EncodingRecord& _ : encodingrec_iter)
     {
-      unsigned format = (src_base+_.subtable).u.format;
+      hb_set_t unicodes_set;
+      hb_map_t cp_glyphid_map;
+      (base+_.subtable).collect_mapping (&unicodes_set, &cp_glyphid_map);
 
-      if (format == 4) c->copy (_, it, 4u, src_base, this, plan, &format4objidx);
-      else if (format == 12) c->copy (_, it, 12u, src_base, this, plan, &format12objidx);
-      else if (format == 14) c->copy (_, it, 14u, src_base, this, plan, &format14objidx);
+      unsigned format = (base+_.subtable).u.format;
+      if (!plan->glyphs_requested->is_empty ())
+      {
+        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);
+      }
+      /* when --gids option is not used, we iterate input unicodes instead of
+       * all codepoints in each subtable, which is more efficient */
+      else
+      {
+        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);
+      }
     }
 
     c->check_assign(this->encodingRecord.len, (c->length () - cmap::min_size)/EncodingRecord::static_size);
@@ -1187,7 +1431,6 @@ struct cmap
                })
     ;
 
-
     if (unlikely (!encodingrec_iter.len ())) return_trace (false);
 
     const EncodingRecord *unicode_bmp= nullptr, *unicode_ucs4 = nullptr, *ms_bmp = nullptr, *ms_ucs4 = nullptr;
@@ -1205,7 +1448,7 @@ struct cmap
       else if (_.platformID == 3 && _.encodingID == 10) ms_ucs4 = table;
     }
 
-    if (unlikely (!unicode_bmp && !ms_bmp)) return_trace (false);
+    if (unlikely (!has_format12 && !unicode_bmp && !ms_bmp)) return_trace (false);
     if (unlikely (has_format12 && (!unicode_ucs4 && !ms_ucs4))) return_trace (false);
 
     auto it =
@@ -1219,7 +1462,6 @@ 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);
   }
@@ -1339,8 +1581,11 @@ struct cmap
       return get_nominal_glyph (unicode, glyph);
     }
 
-    void collect_unicodes (hb_set_t *out) const
-    { subtable->collect_unicodes (out); }
+    void collect_unicodes (hb_set_t *out, unsigned int num_glyphs) const
+    { subtable->collect_unicodes (out, num_glyphs); }
+    void collect_mapping (hb_set_t *unicodes, hb_map_t *mapping,
+                         unsigned num_glyphs = UINT_MAX) const
+    { subtable->collect_mapping (unicodes, mapping, num_glyphs); }
     void collect_variation_selectors (hb_set_t *out) const
     { subtable_uvs->collect_variation_selectors (out); }
     void collect_variation_unicodes (hb_codepoint_t variation_selector,
@@ -1413,7 +1658,7 @@ struct cmap
   }
 
   const EncodingRecord *find_encodingrec (unsigned int platform_id,
-                                   unsigned int encoding_id) const
+                                         unsigned int encoding_id) const
   {
     EncodingRecord key;
     key.platformID = platform_id;
@@ -1445,9 +1690,9 @@ struct cmap
   }
 
   protected:
-  HBUINT16             version;        /* Table version number (0). */
+  HBUINT16     version;        /* Table version number (0). */
   SortedArrayOf<EncodingRecord>
-                       encodingRecord; /* Encoding tables. */
+               encodingRecord; /* Encoding tables. */
   public:
   DEFINE_SIZE_ARRAY (4, encodingRecord);
 };
index 3498d3b..2500fbe 100644 (file)
@@ -21,7 +21,7 @@
  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
- * Google Author(s): Seigo Nonaka
+ * Google Author(s): Seigo Nonaka, Calder Kitagawa
  */
 
 #ifndef HB_OT_COLOR_CBDT_TABLE_HH
 
 namespace OT {
 
+struct cblc_bitmap_size_subset_context_t
+{
+  const char *cbdt;
+  unsigned int cbdt_length;
+  hb_vector_t<char> *cbdt_prime;
+  unsigned int size;           /* INOUT
+                                *  Input: old size of IndexSubtable
+                                *  Output: new size of IndexSubtable
+                                */
+  unsigned int num_tables;     /* INOUT
+                                *  Input: old number of subtables.
+                                *  Output: new number of subtables.
+                                */
+  hb_codepoint_t start_glyph;  /* OUT */
+  hb_codepoint_t end_glyph;    /* OUT */
+};
+
+static inline bool
+_copy_data_to_cbdt (hb_vector_t<char> *cbdt_prime,
+                   const void        *data,
+                   unsigned           length)
+{
+  unsigned int new_len = cbdt_prime->length + length;
+  if (unlikely (!cbdt_prime->alloc (new_len))) return false;
+  memcpy (cbdt_prime->arrayZ + cbdt_prime->length, data, length);
+  cbdt_prime->length = new_len;
+  return true;
+}
+
 struct SmallGlyphMetrics
 {
   bool sanitize (hb_sanitize_context_t *c) const
@@ -56,7 +85,7 @@ struct SmallGlyphMetrics
     extents->x_bearing = font->em_scale_x (bearingX);
     extents->y_bearing = font->em_scale_y (bearingY);
     extents->width = font->em_scale_x (width);
-    extents->height = font->em_scale_y (-height);
+    extents->height = font->em_scale_y (-static_cast<int>(height));
   }
 
   HBUINT8      height;
@@ -65,7 +94,7 @@ struct SmallGlyphMetrics
   HBINT8       bearingY;
   HBUINT8      advance;
   public:
-  DEFINE_SIZE_STATIC(5);
+  DEFINE_SIZE_STATIC (5);
 };
 
 struct BigGlyphMetrics : SmallGlyphMetrics
@@ -74,7 +103,7 @@ struct BigGlyphMetrics : SmallGlyphMetrics
   HBINT8       vertBearingY;
   HBUINT8      vertAdvance;
   public:
-  DEFINE_SIZE_STATIC(8);
+  DEFINE_SIZE_STATIC (8);
 };
 
 struct SBitLineMetrics
@@ -98,7 +127,7 @@ struct SBitLineMetrics
   HBINT8       padding1;
   HBINT8       padding2;
   public:
-  DEFINE_SIZE_STATIC(12);
+  DEFINE_SIZE_STATIC (12);
 };
 
 
@@ -118,7 +147,7 @@ struct IndexSubtableHeader
   HBUINT16     imageFormat;
   HBUINT32     imageDataOffset;
   public:
-  DEFINE_SIZE_STATIC(8);
+  DEFINE_SIZE_STATIC (8);
 };
 
 template <typename OffsetType>
@@ -143,11 +172,23 @@ struct IndexSubtableFormat1Or3
     return true;
   }
 
+  bool add_offset (hb_serialize_context_t *c,
+                  unsigned int offset,
+                  unsigned int *size /* OUT (accumulated) */)
+  {
+    TRACE_SERIALIZE (this);
+    Offset<OffsetType> embedded_offset;
+    embedded_offset = offset;
+    *size += sizeof (OffsetType);
+    auto *o = c->embed (embedded_offset);
+    return_trace ((bool) o);
+  }
+
   IndexSubtableHeader  header;
   UnsizedArrayOf<Offset<OffsetType>>
-                       offsetArrayZ;
+                       offsetArrayZ;
   public:
-  DEFINE_SIZE_ARRAY(8, offsetArrayZ);
+  DEFINE_SIZE_ARRAY (8, offsetArrayZ);
 };
 
 struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<HBUINT32> {};
@@ -159,35 +200,153 @@ struct IndexSubtable
   {
     TRACE_SANITIZE (this);
     if (!u.header.sanitize (c)) return_trace (false);
-    switch (u.header.indexFormat) {
+    switch (u.header.indexFormat)
+    {
     case 1: return_trace (u.format1.sanitize (c, glyph_count));
     case 3: return_trace (u.format3.sanitize (c, glyph_count));
     default:return_trace (true);
     }
   }
 
+  bool
+  finish_subtable (hb_serialize_context_t *c,
+                  unsigned int cbdt_prime_len,
+                  unsigned int num_glyphs,
+                  unsigned int *size /* OUT (accumulated) */)
+  {
+    TRACE_SERIALIZE (this);
+
+    unsigned int local_offset = cbdt_prime_len - u.header.imageDataOffset;
+    switch (u.header.indexFormat)
+    {
+    case 1: return_trace (u.format1.add_offset (c, local_offset, size));
+    case 3: {
+      if (!u.format3.add_offset (c, local_offset, size))
+       return_trace (false);
+      if (!(num_glyphs & 0x01))  // Pad to 32-bit alignment if needed.
+       return_trace (u.format3.add_offset (c, 0, size));
+      return_trace (true);
+    }
+    // TODO: implement 2, 4, 5.
+    case 2: case 4:  // No-op.
+    case 5:  // Pad to 32-bit aligned.
+    default: return_trace (false);
+    }
+  }
+
+  bool
+  fill_missing_glyphs (hb_serialize_context_t *c,
+                      unsigned int cbdt_prime_len,
+                      unsigned int num_missing,
+                      unsigned int *size /* OUT (accumulated) */,
+                      unsigned int *num_glyphs /* OUT (accumulated) */)
+  {
+    TRACE_SERIALIZE (this);
+
+    unsigned int local_offset = cbdt_prime_len - u.header.imageDataOffset;
+    switch (u.header.indexFormat)
+    {
+    case 1: {
+      for (unsigned int i = 0; i < num_missing; i++)
+      {
+       if (unlikely (!u.format1.add_offset (c, local_offset, size)))
+         return_trace (false);
+       *num_glyphs += 1;
+      }
+      return_trace (true);
+    }
+    case 3: {
+      for (unsigned int i = 0; i < num_missing; i++)
+      {
+       if (unlikely (!u.format3.add_offset (c, local_offset, size)))
+         return_trace (false);
+       *num_glyphs += 1;
+      }
+      return_trace (true);
+    }
+    // TODO: implement 2, 4, 5.
+    case 2:  // Add empty space in cbdt_prime?.
+    case 4: case 5:  // No-op as sparse is supported.
+    default: return_trace (false);
+    }
+  }
+
+  bool
+  copy_glyph_at_idx (hb_serialize_context_t *c, unsigned int idx,
+                    const char *cbdt, unsigned int cbdt_length,
+                    hb_vector_t<char> *cbdt_prime /* INOUT */,
+                    IndexSubtable *subtable_prime /* INOUT */,
+                    unsigned int *size /* OUT (accumulated) */) const
+  {
+    TRACE_SERIALIZE (this);
+
+    unsigned int offset, length, format;
+    if (unlikely (!get_image_data (idx, &offset, &length, &format))) return_trace (false);
+    if (unlikely (offset > cbdt_length || cbdt_length - offset < length)) return_trace (false);
+
+    auto *header_prime = subtable_prime->get_header ();
+    unsigned int new_local_offset = cbdt_prime->length - (unsigned int) header_prime->imageDataOffset;
+    if (unlikely (!_copy_data_to_cbdt (cbdt_prime, cbdt + offset, length))) return_trace (false);
+
+    return_trace (subtable_prime->add_offset (c, new_local_offset, size));
+  }
+
+  bool
+  add_offset (hb_serialize_context_t *c, unsigned int local_offset,
+             unsigned int *size /* OUT (accumulated) */)
+  {
+    TRACE_SERIALIZE (this);
+    switch (u.header.indexFormat)
+    {
+    case 1: return_trace (u.format1.add_offset (c, local_offset, size));
+    case 3: return_trace (u.format3.add_offset (c, local_offset, size));
+    // TODO: Implement tables 2, 4, 5
+    case 2:  // Should be a no-op.
+    case 4: case 5:  // Handle sparse cases.
+    default: return_trace (false);
+    }
+  }
+
   bool get_extents (hb_glyph_extents_t *extents HB_UNUSED) const
   {
-    switch (u.header.indexFormat) {
+    switch (u.header.indexFormat)
+    {
     case 2: case 5: /* TODO */
     case 1: case 3: case 4: /* Variable-metrics formats do not have metrics here. */
     default:return (false);
     }
   }
 
-  bool get_image_data (unsigned int idx,
-                      unsigned int *offset,
-                      unsigned int *length,
-                      unsigned int *format) const
+  bool
+  get_image_data (unsigned int idx, unsigned int *offset,
+                 unsigned int *length, unsigned int *format) const
   {
     *format = u.header.imageFormat;
-    switch (u.header.indexFormat) {
+    switch (u.header.indexFormat)
+    {
     case 1: return u.format1.get_image_data (idx, offset, length);
     case 3: return u.format3.get_image_data (idx, offset, length);
     default: return false;
     }
   }
 
+  const IndexSubtableHeader* get_header () const { return &u.header; }
+
+  void populate_header (unsigned index_format,
+                       unsigned image_format,
+                       unsigned int image_data_offset,
+                       unsigned int *size)
+  {
+    u.header.indexFormat = index_format;
+    u.header.imageFormat = image_format;
+    u.header.imageDataOffset = image_data_offset;
+    switch (u.header.indexFormat)
+    {
+    case 1: *size += IndexSubtableFormat1::min_size; break;
+    case 3: *size += IndexSubtableFormat3::min_size; break;
+    }
+  }
+
   protected:
   union {
   IndexSubtableHeader  header;
@@ -209,12 +368,133 @@ struct IndexSubtableRecord
                  offsetToSubtable.sanitize (c, base, lastGlyphIndex - firstGlyphIndex + 1));
   }
 
-  bool get_extents (hb_glyph_extents_t *extents,
-                   const void *base) const
+  const IndexSubtable* get_subtable (const void *base) const
+  {
+    return &(base+offsetToSubtable);
+  }
+
+  bool add_new_subtable (hb_subset_context_t* c,
+                        cblc_bitmap_size_subset_context_t *bitmap_size_context,
+                        IndexSubtableRecord *record,
+                        const hb_vector_t<hb_pair_t<hb_codepoint_t, const IndexSubtableRecord*>> *lookup, /* IN */
+                        const void *base,
+                        unsigned int *start /* INOUT */) const
+  {
+    TRACE_SERIALIZE (this);
+
+    auto *subtable = c->serializer->start_embed<IndexSubtable> ();
+    if (unlikely (!subtable)) return_trace (false);
+    if (unlikely (!c->serializer->extend_min (subtable))) return_trace (false);
+
+    auto *old_subtable = get_subtable (base);
+    auto *old_header = old_subtable->get_header ();
+
+    subtable->populate_header (old_header->indexFormat,
+                              old_header->imageFormat,
+                              bitmap_size_context->cbdt_prime->length,
+                              &bitmap_size_context->size);
+
+    unsigned int num_glyphs = 0;
+    bool early_exit = false;
+    for (unsigned int i = *start; i < lookup->length; i++)
+    {
+      hb_codepoint_t new_gid = (*lookup)[i].first;
+      const IndexSubtableRecord *next_record = (*lookup)[i].second;
+      const IndexSubtable *next_subtable = next_record->get_subtable (base);
+      auto *next_header = next_subtable->get_header ();
+      if (next_header != old_header)
+      {
+       *start = i;
+       early_exit = true;
+       break;
+      }
+      unsigned int num_missing = record->add_glyph_for_subset (new_gid);
+      if (unlikely (!subtable->fill_missing_glyphs (c->serializer,
+                                                   bitmap_size_context->cbdt_prime->length,
+                                                   num_missing,
+                                                   &bitmap_size_context->size,
+                                                   &num_glyphs)))
+       return_trace (false);
+
+      hb_codepoint_t old_gid = 0;
+      c->plan->old_gid_for_new_gid (new_gid, &old_gid);
+      if (old_gid < next_record->firstGlyphIndex)
+       return_trace (false);
+
+      unsigned int old_idx = (unsigned int) old_gid - next_record->firstGlyphIndex;
+      if (unlikely (!next_subtable->copy_glyph_at_idx (c->serializer,
+                                                      old_idx,
+                                                      bitmap_size_context->cbdt,
+                                                      bitmap_size_context->cbdt_length,
+                                                      bitmap_size_context->cbdt_prime,
+                                                      subtable,
+                                                      &bitmap_size_context->size)))
+       return_trace (false);
+      num_glyphs += 1;
+    }
+    if (!early_exit)
+      *start = lookup->length;
+    if (unlikely (!subtable->finish_subtable (c->serializer,
+                                             bitmap_size_context->cbdt_prime->length,
+                                             num_glyphs,
+                                             &bitmap_size_context->size)))
+      return_trace (false);
+    return_trace (true);
+  }
+
+  bool add_new_record (hb_subset_context_t *c,
+                      cblc_bitmap_size_subset_context_t *bitmap_size_context,
+                      const hb_vector_t<hb_pair_t<hb_codepoint_t, const IndexSubtableRecord*>> *lookup, /* IN */
+                      const void *base,
+                      unsigned int *start, /* INOUT */
+                      hb_vector_t<IndexSubtableRecord>* records /* INOUT */) const
   {
-    return (base+offsetToSubtable).get_extents (extents);
+    TRACE_SERIALIZE (this);
+    auto snap = c->serializer->snapshot ();
+    unsigned int old_size = bitmap_size_context->size;
+    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);
+    (*records)[records->length - 1].firstGlyphIndex = 1;
+    (*records)[records->length - 1].lastGlyphIndex = 0;
+    bitmap_size_context->size += IndexSubtableRecord::min_size;
+
+    c->serializer->push ();
+
+    if (unlikely (!add_new_subtable (c, bitmap_size_context, &((*records)[records->length - 1]), lookup, base, start)))
+    {
+      c->serializer->pop_discard ();
+      c->serializer->revert (snap);
+      bitmap_size_context->cbdt_prime->shrink (old_cbdt_prime_length);
+      bitmap_size_context->size = old_size;
+      records->resize (records->length - 1);
+      return_trace (false);
+    }
+
+    bitmap_size_context->num_tables += 1;
+    return_trace (true);
   }
 
+  unsigned int add_glyph_for_subset (hb_codepoint_t gid)
+  {
+    if (firstGlyphIndex > lastGlyphIndex)
+    {
+      firstGlyphIndex = gid;
+      lastGlyphIndex = gid;
+      return 0;
+    }
+    // TODO maybe assert? this shouldn't occur.
+    if (lastGlyphIndex > gid)
+      return 0;
+    unsigned int num_missing = (unsigned int) (gid - lastGlyphIndex - 1);
+    lastGlyphIndex = gid;
+    return num_missing;
+  }
+
+  bool get_extents (hb_glyph_extents_t *extents, const void *base) const
+  { return (base+offsetToSubtable).get_extents (extents); }
+
   bool get_image_data (unsigned int  gid,
                       const void   *base,
                       unsigned int *offset,
@@ -230,7 +510,7 @@ struct IndexSubtableRecord
   HBGlyphID                    lastGlyphIndex;
   LOffsetTo<IndexSubtable>     offsetToSubtable;
   public:
-  DEFINE_SIZE_STATIC(8);
+  DEFINE_SIZE_STATIC (8);
 };
 
 struct IndexSubtableArray
@@ -243,6 +523,77 @@ struct IndexSubtableArray
     return_trace (indexSubtablesZ.sanitize (c, count, this));
   }
 
+  void
+  build_lookup (hb_subset_context_t *c, cblc_bitmap_size_subset_context_t *bitmap_size_context,
+               hb_vector_t<hb_pair_t<hb_codepoint_t,
+               const IndexSubtableRecord*>> *lookup /* OUT */) const
+  {
+    bool start_glyph_is_set = false;
+    for (hb_codepoint_t new_gid = 0; new_gid < c->plan->num_output_glyphs (); new_gid++)
+    {
+      hb_codepoint_t old_gid;
+      if (unlikely (!c->plan->old_gid_for_new_gid (new_gid, &old_gid))) continue;
+
+      const IndexSubtableRecord* record = find_table (old_gid, bitmap_size_context->num_tables);
+      if (unlikely (!record)) continue;
+
+      // Don't add gaps to the lookup. The best way to determine if a glyph is a
+      // gap is that it has no image data.
+      unsigned int offset, length, format;
+      if (unlikely (!record->get_image_data (old_gid, this, &offset, &length, &format))) continue;
+
+      lookup->push (hb_pair_t<hb_codepoint_t, const IndexSubtableRecord*> (new_gid, record));
+
+      if (!start_glyph_is_set)
+      {
+       bitmap_size_context->start_glyph = new_gid;
+       start_glyph_is_set = true;
+      }
+
+      bitmap_size_context->end_glyph = new_gid;
+    }
+  }
+
+  bool
+  subset (hb_subset_context_t *c,
+         cblc_bitmap_size_subset_context_t *bitmap_size_context) const
+  {
+    TRACE_SUBSET (this);
+
+    auto *dst = c->serializer->start_embed<IndexSubtableArray> ();
+    if (unlikely (!dst)) return_trace (false);
+
+    hb_vector_t<hb_pair_t<hb_codepoint_t, const IndexSubtableRecord*>> lookup;
+    build_lookup (c, bitmap_size_context, &lookup);
+
+    bitmap_size_context->size = 0;
+    bitmap_size_context->num_tables = 0;
+    hb_vector_t<IndexSubtableRecord> records;
+    for (unsigned int start = 0; start < lookup.length;)
+    {
+      if (unlikely (!lookup[start].second->add_new_record (c, bitmap_size_context, &lookup, this, &start, &records)))
+      {
+       // Discard any leftover pushes to the serializer from successful records.
+       for (unsigned int i = 0; i < records.length; i++)
+         c->serializer->pop_discard ();
+       return_trace (false);
+      }
+    }
+
+    /* Workaround to ensure offset ordering is from least to greatest when
+     * resolving links. */
+    hb_vector_t<hb_serialize_context_t::objidx_t> objidxs;
+    for (unsigned int i = 0; i < records.length; i++)
+      objidxs.push (c->serializer->pop_pack ());
+    for (unsigned int i = 0; i < records.length; i++)
+    {
+      IndexSubtableRecord* record = c->serializer->embed (records[i]);
+      if (unlikely (!record)) return_trace (false);
+      c->serializer->add_link (record->offsetToSubtable, objidxs[records.length - 1 - i]);
+    }
+    return_trace (true);
+  }
+
   public:
   const IndexSubtableRecord* find_table (hb_codepoint_t glyph, unsigned int numTables) const
   {
@@ -274,14 +625,48 @@ struct BitmapSizeTable
                  vertical.sanitize (c));
   }
 
-  const IndexSubtableRecord *find_table (hb_codepoint_t glyph,
-                                        const void *base,
-                                        const void **out_base) const
+  const IndexSubtableRecord *
+  find_table (hb_codepoint_t glyph, const void *base, const void **out_base) const
   {
     *out_base = &(base+indexSubtableArrayOffset);
     return (base+indexSubtableArrayOffset).find_table (glyph, numberOfIndexSubtables);
   }
 
+  bool
+  subset (hb_subset_context_t *c, const void *base,
+         const char *cbdt, unsigned int cbdt_length,
+         hb_vector_t<char> *cbdt_prime /* INOUT */) const
+  {
+    TRACE_SUBSET (this);
+    auto *out_table = c->serializer->embed (this);
+    if (unlikely (!out_table)) return_trace (false);
+
+    cblc_bitmap_size_subset_context_t bitmap_size_context;
+    bitmap_size_context.cbdt = cbdt;
+    bitmap_size_context.cbdt_length = cbdt_length;
+    bitmap_size_context.cbdt_prime = cbdt_prime;
+    bitmap_size_context.size = indexTablesSize;
+    bitmap_size_context.num_tables = numberOfIndexSubtables;
+    bitmap_size_context.start_glyph = 1;
+    bitmap_size_context.end_glyph = 0;
+
+    if (!out_table->indexSubtableArrayOffset.serialize_subset (c,
+                                                              indexSubtableArrayOffset,
+                                                              base,
+                                                              &bitmap_size_context))
+      return_trace (false);
+    if (!bitmap_size_context.size ||
+       !bitmap_size_context.num_tables ||
+       bitmap_size_context.start_glyph > bitmap_size_context.end_glyph)
+      return_trace (false);
+
+    out_table->indexTablesSize = bitmap_size_context.size;
+    out_table->numberOfIndexSubtables = bitmap_size_context.num_tables;
+    out_table->startGlyphIndex = bitmap_size_context.start_glyph;
+    out_table->endGlyphIndex = bitmap_size_context.end_glyph;
+    return_trace (true);
+  }
+
   protected:
   LNNOffsetTo<IndexSubtableArray>
                        indexSubtableArrayOffset;
@@ -297,7 +682,7 @@ struct BitmapSizeTable
   HBUINT8              bitDepth;
   HBINT8               flags;
   public:
-  DEFINE_SIZE_STATIC(48);
+  DEFINE_SIZE_STATIC (48);
 };
 
 
@@ -310,7 +695,7 @@ struct GlyphBitmapDataFormat17
   SmallGlyphMetrics    glyphMetrics;
   LArrayOf<HBUINT8>    data;
   public:
-  DEFINE_SIZE_ARRAY(9, data);
+  DEFINE_SIZE_ARRAY (9, data);
 };
 
 struct GlyphBitmapDataFormat18
@@ -318,14 +703,14 @@ struct GlyphBitmapDataFormat18
   BigGlyphMetrics      glyphMetrics;
   LArrayOf<HBUINT8>    data;
   public:
-  DEFINE_SIZE_ARRAY(12, data);
+  DEFINE_SIZE_ARRAY (12, data);
 };
 
 struct GlyphBitmapDataFormat19
 {
   LArrayOf<HBUINT8>    data;
   public:
-  DEFINE_SIZE_ARRAY(4, data);
+  DEFINE_SIZE_ARRAY (4, data);
 };
 
 struct CBLC
@@ -342,12 +727,50 @@ struct CBLC
                  sizeTables.sanitize (c, this));
   }
 
+  static bool
+  sink_cbdt (hb_subset_context_t *c, hb_vector_t<char>* cbdt_prime)
+  {
+    hb_blob_t *cbdt_prime_blob = hb_blob_create (cbdt_prime->arrayZ,
+                                                cbdt_prime->length,
+                                                HB_MEMORY_MODE_WRITABLE,
+                                                cbdt_prime->arrayZ,
+                                                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);
+    return ret;
+  }
+
+  bool
+  subset_size_table (hb_subset_context_t *c, const BitmapSizeTable& table,
+                    const char *cbdt /* IN */, unsigned int cbdt_length,
+                    CBLC *cblc_prime /* INOUT */, hb_vector_t<char> *cbdt_prime /* INOUT */) const
+  {
+    TRACE_SUBSET (this);
+    cblc_prime->sizeTables.len++;
+
+    auto snap = c->serializer->snapshot ();
+    auto cbdt_prime_len = cbdt_prime->length;
+
+    if (!table.subset (c, this, cbdt, cbdt_length, cbdt_prime))
+    {
+      cblc_prime->sizeTables.len--;
+      c->serializer->revert (snap);
+      cbdt_prime->shrink (cbdt_prime_len);
+      return_trace (false);
+    }
+    return_trace (true);
+  }
+
+  // Implemented in cc file as it depends on definition of CBDT.
+  HB_INTERNAL bool subset (hb_subset_context_t *c) const;
+
   protected:
   const BitmapSizeTable &choose_strike (hb_font_t *font) const
   {
     unsigned count = sizeTables.len;
     if (unlikely (!count))
-      return Null(BitmapSizeTable);
+      return Null (BitmapSizeTable);
 
     unsigned int requested_ppem = hb_max (font->x_ppem, font->y_ppem);
     if (!requested_ppem)
@@ -373,7 +796,7 @@ struct CBLC
   FixedVersion<>               version;
   LArrayOf<BitmapSizeTable>    sizeTables;
   public:
-  DEFINE_SIZE_ARRAY(8, sizeTables);
+  DEFINE_SIZE_ARRAY (8, sizeTables);
 };
 
 struct CBDT
@@ -384,8 +807,8 @@ struct CBDT
   {
     void init (hb_face_t *face)
     {
-      cblc = hb_sanitize_context_t().reference_table<CBLC> (face);
-      cbdt = hb_sanitize_context_t().reference_table<CBDT> (face);
+      cblc = hb_sanitize_context_t ().reference_table<CBLC> (face);
+      cbdt = hb_sanitize_context_t ().reference_table<CBDT> (face);
 
       upem = hb_face_get_upem (face);
     }
@@ -396,8 +819,8 @@ struct CBDT
       this->cbdt.destroy ();
     }
 
-    bool get_extents (hb_font_t *font, hb_codepoint_t glyph,
-                     hb_glyph_extents_t *extents) const
+    bool
+    get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
     {
       const void *base;
       const BitmapSizeTable &strike = this->cblc->choose_strike (font);
@@ -412,33 +835,27 @@ struct CBDT
       if (!subtable_record->get_image_data (glyph, base, &image_offset, &image_length, &image_format))
        return false;
 
+      unsigned int cbdt_len = cbdt.get_length ();
+      if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+       return false;
+
+      switch (image_format)
       {
-       unsigned int cbdt_len = cbdt.get_length ();
-       if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+      case 17: {
+       if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
          return false;
-
-       switch (image_format)
-       {
-         case 17: {
-           if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
-             return false;
-           const GlyphBitmapDataFormat17& glyphFormat17 =
-               StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
-           glyphFormat17.glyphMetrics.get_extents (font, extents);
-           break;
-         }
-         case 18: {
-           if (unlikely (image_length < GlyphBitmapDataFormat18::min_size))
-             return false;
-           const GlyphBitmapDataFormat18& glyphFormat18 =
-               StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
-           glyphFormat18.glyphMetrics.get_extents (font, extents);
-           break;
-         }
-         default:
-           // TODO: Support other image formats.
-           return false;
-       }
+       auto &glyphFormat17 = StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
+       glyphFormat17.glyphMetrics.get_extents (font, extents);
+       break;
+      }
+      case 18: {
+       if (unlikely (image_length < GlyphBitmapDataFormat18::min_size))
+         return false;
+       auto &glyphFormat18 = StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
+       glyphFormat18.glyphMetrics.get_extents (font, extents);
+       break;
+      }
+      default: return false; /* TODO: Support other image formats. */
       }
 
       /* Convert to font units. */
@@ -452,8 +869,8 @@ struct CBDT
       return true;
     }
 
-    hb_blob_t* reference_png (hb_font_t      *font,
-                             hb_codepoint_t  glyph) const
+    hb_blob_t*
+    reference_png (hb_font_t *font, hb_codepoint_t glyph) const
     {
       const void *base;
       const BitmapSizeTable &strike = this->cblc->choose_strike (font);
@@ -465,44 +882,41 @@ struct CBDT
       if (!subtable_record->get_image_data (glyph, base, &image_offset, &image_length, &image_format))
        return hb_blob_get_empty ();
 
+      unsigned int cbdt_len = cbdt.get_length ();
+      if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+       return hb_blob_get_empty ();
+
+      switch (image_format)
+      {
+      case 17:
       {
-       unsigned int cbdt_len = cbdt.get_length ();
-       if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+       if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
          return hb_blob_get_empty ();
-
-       switch (image_format)
-       {
-         case 17: {
-           if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
-             return hb_blob_get_empty ();
-           const GlyphBitmapDataFormat17& glyphFormat17 =
-             StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
-           return hb_blob_create_sub_blob (cbdt.get_blob (),
-                                           image_offset + GlyphBitmapDataFormat17::min_size,
-                                           glyphFormat17.data.len);
-         }
-         case 18: {
-           if (unlikely (image_length < GlyphBitmapDataFormat18::min_size))
-             return hb_blob_get_empty ();
-           const GlyphBitmapDataFormat18& glyphFormat18 =
-             StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
-           return hb_blob_create_sub_blob (cbdt.get_blob (),
-                                           image_offset + GlyphBitmapDataFormat18::min_size,
-                                           glyphFormat18.data.len);
-         }
-         case 19: {
-           if (unlikely (image_length < GlyphBitmapDataFormat19::min_size))
-             return hb_blob_get_empty ();
-           const GlyphBitmapDataFormat19& glyphFormat19 =
-             StructAtOffset<GlyphBitmapDataFormat19> (this->cbdt, image_offset);
-           return hb_blob_create_sub_blob (cbdt.get_blob (),
-                                           image_offset + GlyphBitmapDataFormat19::min_size,
-                                           glyphFormat19.data.len);
-         }
-       }
+       auto &glyphFormat17 = StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
+       return hb_blob_create_sub_blob (cbdt.get_blob (),
+                                       image_offset + GlyphBitmapDataFormat17::min_size,
+                                       glyphFormat17.data.len);
+      }
+      case 18:
+      {
+       if (unlikely (image_length < GlyphBitmapDataFormat18::min_size))
+         return hb_blob_get_empty ();
+       auto &glyphFormat18 = StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
+       return hb_blob_create_sub_blob (cbdt.get_blob (),
+                                       image_offset + GlyphBitmapDataFormat18::min_size,
+                                       glyphFormat18.data.len);
+      }
+      case 19:
+      {
+       if (unlikely (image_length < GlyphBitmapDataFormat19::min_size))
+         return hb_blob_get_empty ();
+       auto &glyphFormat19 = StructAtOffset<GlyphBitmapDataFormat19> (this->cbdt, image_offset);
+       return hb_blob_create_sub_blob (cbdt.get_blob (),
+                                       image_offset + GlyphBitmapDataFormat19::min_size,
+                                       glyphFormat19.data.len);
+      }
+      default: return hb_blob_get_empty (); /* TODO: Support other image formats. */
       }
-
-      return hb_blob_get_empty ();
     }
 
     bool has_data () const { return cbdt.get_length (); }
@@ -525,9 +939,41 @@ struct CBDT
   FixedVersion<>               version;
   UnsizedArrayOf<HBUINT8>      dataZ;
   public:
-  DEFINE_SIZE_ARRAY(4, dataZ);
+  DEFINE_SIZE_ARRAY (4, dataZ);
 };
 
+inline bool
+CBLC::subset (hb_subset_context_t *c) const
+{
+  TRACE_SUBSET (this);
+
+  auto *cblc_prime = c->serializer->start_embed<CBLC> ();
+
+  // Use a vector as a secondary buffer as the tables need to be built in parallel.
+  hb_vector_t<char> cbdt_prime;
+
+  if (unlikely (!cblc_prime)) return_trace (false);
+  if (unlikely (!c->serializer->extend_min (cblc_prime))) return_trace (false);
+  cblc_prime->version = version;
+
+  hb_blob_t* cbdt_blob = hb_sanitize_context_t ().reference_table<CBDT> (c->plan->source);
+  unsigned int cbdt_length;
+  CBDT* cbdt = (CBDT *) hb_blob_get_data (cbdt_blob, &cbdt_length);
+  if (unlikely (cbdt_length < CBDT::min_size))
+  {
+    hb_blob_destroy (cbdt_blob);
+    return_trace (false);
+  }
+  _copy_data_to_cbdt (&cbdt_prime, cbdt, CBDT::min_size);
+
+  for (const BitmapSizeTable& table : + sizeTables.iter ())
+    subset_size_table (c, table, (const char *) cbdt, cbdt_length, cblc_prime, &cbdt_prime);
+
+  hb_blob_destroy (cbdt_blob);
+
+  return_trace (CBLC::sink_cbdt (c, &cbdt_prime));
+}
+
 struct CBDT_accelerator_t : CBDT::accelerator_t {};
 
 } /* namespace OT */
index e2ed7c6..82eab96 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright © 2018  Ebrahim Byagowi
+ * Copyright © 2020  Google, Inc.
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
@@ -20,6 +21,8 @@
  * 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): Calder Kitagawa
  */
 
 #ifndef HB_OT_COLOR_COLR_TABLE_HH
@@ -47,7 +50,7 @@ struct LayerRecord
     return_trace (c->check_struct (this));
   }
 
-  protected:
+  public:
   HBGlyphID    glyphId;        /* Glyph ID of layer glyph */
   Index                colorIdx;       /* Index value to use with a
                                 * selected color palette.
@@ -112,6 +115,38 @@ struct COLR
     return glyph_layers.length;
   }
 
+  struct accelerator_t
+  {
+    accelerator_t () {}
+    ~accelerator_t () { fini (); }
+
+    void init (hb_face_t *face)
+    { colr = hb_sanitize_context_t ().reference_table<COLR> (face); }
+
+    void fini () { this->colr.destroy (); }
+
+    bool is_valid () { return colr.get_blob ()->length; }
+
+    void closure_glyphs (hb_codepoint_t glyph,
+                        hb_set_t *related_ids /* OUT */) const
+    { colr->closure_glyphs (glyph, related_ids); }
+
+    private:
+    hb_blob_ptr_t<COLR> colr;
+  };
+
+  void closure_glyphs (hb_codepoint_t glyph,
+                      hb_set_t *related_ids /* OUT */) const
+  {
+    const BaseGlyphRecord *record = get_base_glyph_record (glyph);
+    if (!record) return;
+
+    auto glyph_layers = (this+layersZ).as_array (numLayers).sub_array (record->firstLayerIdx,
+                                                                      record->numLayers);
+    if (!glyph_layers.length) return;
+    related_ids->add_array (&glyph_layers[0].glyphId, glyph_layers.length, LayerRecord::min_size);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -120,6 +155,111 @@ struct COLR
                          (this+layersZ).sanitize (c, numLayers)));
   }
 
+  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)
+  {
+    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;
+
+    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;
+    }
+
+    for (const hb_item_type<LayerIterator>& _ : + layer_it.iter ())
+      _.as_array ().copy (c);
+
+    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 && (hb_codepoint_t) record->glyphId != gid))
+      record = nullptr;
+    return record;
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+
+    const hb_map_t &reverse_glyph_map = *c->plan->reverse_glyph_map;
+
+    auto base_it =
+    + hb_range (c->plan->num_output_glyphs ())
+    | hb_map_retains_sorting ([&](hb_codepoint_t new_gid)
+                             {
+                               hb_codepoint_t old_gid = reverse_glyph_map.get (new_gid);
+
+                               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;
+                               new_record.glyphId = new_gid;
+                               new_record.numLayers = old_record->numLayers;
+                               return hb_pair_t<bool, BaseGlyphRecord> (true, new_record);
+                             })
+    | hb_filter (hb_first)
+    | hb_map_retains_sorting (hb_second)
+    ;
+
+    auto layer_it =
+    + hb_range (c->plan->num_output_glyphs ())
+    | hb_map (reverse_glyph_map)
+    | hb_map_retains_sorting ([&](hb_codepoint_t old_gid)
+                             {
+                               const BaseGlyphRecord* old_record = get_base_glyph_record (old_gid);
+                               hb_vector_t<LayerRecord> out_layers;
+
+                               if (unlikely (!old_record ||
+                                             old_record->firstLayerIdx >= numLayers ||
+                                             old_record->firstLayerIdx + old_record->numLayers > numLayers))
+                                 return hb_pair_t<bool, hb_vector_t<LayerRecord>> (false, out_layers);
+
+                               auto layers = (this+layersZ).as_array (numLayers).sub_array (old_record->firstLayerIdx,
+                                                                                            old_record->numLayers);
+                               out_layers.resize (layers.length);
+                               for (unsigned int i = 0; i < layers.length; i++) {
+                                 out_layers[i] = layers[i];
+                                 hb_codepoint_t new_gid = 0;
+                                 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;
+                               }
+
+                               return hb_pair_t<bool, hb_vector_t<LayerRecord>> (true, out_layers);
+                             })
+    | hb_filter (hb_first)
+    | hb_map_retains_sorting (hb_second)
+    ;
+
+    if (unlikely (!base_it || !layer_it || base_it.len () != layer_it.len ()))
+      return_trace (false);
+
+    COLR *colr_prime = c->serializer->start_embed<COLR> ();
+    return_trace (colr_prime->serialize (c->serializer, version, base_it, layer_it));
+  }
+
   protected:
   HBUINT16     version;        /* Table version number (starts at 0). */
   HBUINT16     numBaseGlyphs;  /* Number of Base Glyph Records. */
index 1b3c7fc..ce9f76e 100644 (file)
@@ -155,7 +155,7 @@ struct CPAL
   private:
   const CPALV1Tail& v1 () const
   {
-    if (version == 0) return Null(CPALV1Tail);
+    if (version == 0) return Null (CPALV1Tail);
     return StructAfter<CPALV1Tail> (*this);
   }
 
index 35d3fd5..09da115 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright © 2018  Ebrahim Byagowi
+ * Copyright © 2020  Google, Inc.
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
  * 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): Calder Kitagawa
  */
 
 #ifndef HB_OT_COLOR_SBIX_TABLE_HH
 #define HB_OT_COLOR_SBIX_TABLE_HH
 
 #include "hb-open-type.hh"
+#include "hb-ot-layout-common.hh"
 
 /*
  * sbix -- Standard Bitmap Graphics
@@ -40,6 +44,20 @@ namespace OT {
 
 struct SBIXGlyph
 {
+  SBIXGlyph* copy (hb_serialize_context_t *c, unsigned int data_length) const
+  {
+    TRACE_SERIALIZE (this);
+    SBIXGlyph* new_glyph = c->start_embed<SBIXGlyph> ();
+    if (unlikely (!new_glyph)) return_trace (nullptr);
+    if (unlikely (!c->extend_min (new_glyph))) return_trace (nullptr);
+
+    new_glyph->xOffset = xOffset;
+    new_glyph->yOffset = yOffset;
+    new_glyph->graphicType = graphicType;
+    data.copy (c, data_length);
+    return_trace (new_glyph);
+  }
+
   HBINT16      xOffset;        /* The horizontal (x-axis) offset from the left
                                 * edge of the graphic to the glyph’s origin.
                                 * That is, the x-coordinate of the point on the
@@ -62,6 +80,9 @@ struct SBIXGlyph
 
 struct SBIXStrike
 {
+  static unsigned int get_size (unsigned num_glyphs)
+  { return min_size + num_glyphs * HBUINT32::static_size; }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -116,6 +137,49 @@ struct SBIXStrike
     return hb_blob_create_sub_blob (sbix_blob, glyph_offset, glyph_length);
   }
 
+  bool subset (hb_subset_context_t *c, unsigned int available_len) const
+  {
+    TRACE_SUBSET (this);
+    unsigned int num_output_glyphs = c->plan->num_output_glyphs ();
+
+    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);
+    out->ppem = ppem;
+    out->resolution = resolution;
+    HBUINT32 head;
+    head = get_size (num_output_glyphs + 1);
+
+    bool has_glyphs = false;
+    for (unsigned new_gid = 0; new_gid < num_output_glyphs; new_gid++)
+    {
+      hb_codepoint_t old_gid;
+      if (!c->plan->old_gid_for_new_gid (new_gid, &old_gid) ||
+         unlikely (imageOffsetsZ[old_gid].is_null () ||
+                   imageOffsetsZ[old_gid + 1].is_null () ||
+                   imageOffsetsZ[old_gid + 1] <= imageOffsetsZ[old_gid] ||
+                   imageOffsetsZ[old_gid + 1] - imageOffsetsZ[old_gid] <= SBIXGlyph::min_size) ||
+                   (unsigned int) imageOffsetsZ[old_gid + 1] > available_len)
+      {
+       out->imageOffsetsZ[new_gid] = head;
+       continue;
+      }
+      has_glyphs = true;
+      unsigned int delta = imageOffsetsZ[old_gid + 1] - imageOffsetsZ[old_gid];
+      unsigned int glyph_data_length = delta - SBIXGlyph::min_size;
+      if (!(this+imageOffsetsZ[old_gid]).copy (c->serializer, glyph_data_length))
+       return_trace (false);
+      out->imageOffsetsZ[new_gid] = head;
+      head += delta;
+    }
+    if (has_glyphs)
+      out->imageOffsetsZ[num_output_glyphs] = head;
+    else
+      c->serializer->revert (snap);
+    return_trace (has_glyphs);
+  }
+
   public:
   HBUINT16     ppem;           /* The PPEM size for which this strike was designed. */
   HBUINT16     resolution;     /* The device pixel density (in PPI) for which this
@@ -140,7 +204,7 @@ struct sbix
   {
     void init (hb_face_t *face)
     {
-      table = hb_sanitize_context_t().reference_table<sbix> (face);
+      table = hb_sanitize_context_t ().reference_table<sbix> (face);
       num_glyphs = face->get_num_glyphs ();
     }
     void fini () { table.destroy (); }
@@ -173,7 +237,7 @@ struct sbix
     {
       unsigned count = table->strikes.len;
       if (unlikely (!count))
-       return Null(SBIXStrike);
+       return Null (SBIXStrike);
 
       unsigned int requested_ppem = hb_max (font->x_ppem, font->y_ppem);
       if (!requested_ppem)
@@ -237,7 +301,7 @@ struct sbix
       extents->x_bearing = x_offset;
       extents->y_bearing = png.IHDR.height + y_offset;
       extents->width     = png.IHDR.width;
-      extents->height    = -png.IHDR.height;
+      extents->height    = -1 * png.IHDR.height;
 
       /* Convert to font units. */
       if (strike_ppem)
@@ -275,6 +339,63 @@ struct sbix
                          strikes.sanitize (c, this)));
   }
 
+  bool
+  add_strike (hb_subset_context_t *c, unsigned i) const
+  {
+    if (strikes[i].is_null () || c->source_blob->length < (unsigned) strikes[i])
+      return false;
+
+    return (this+strikes[i]).subset (c, c->source_blob->length - (unsigned) strikes[i]);
+  }
+
+  bool serialize_strike_offsets (hb_subset_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+
+    auto *out = c->serializer->start_embed<LOffsetLArrayOf<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<hb_serialize_context_t::objidx_t> objidxs;
+    for (int i = strikes.len - 1; i >= 0; --i)
+    {
+      auto* o = out->serialize_append (c->serializer);
+      if (unlikely (!o)) return_trace (false);
+      *o = 0;
+      auto snap = c->serializer->snapshot ();
+      c->serializer->push ();
+      bool ret = add_strike (c, i);
+      if (!ret)
+      {
+       c->serializer->pop_discard ();
+       out->pop ();
+       c->serializer->revert (snap);
+      }
+      else
+      {
+       objidxs.push (c->serializer->pop_pack ());
+       new_strikes.push (o);
+      }
+    }
+    for (unsigned int i = 0; i < new_strikes.length; ++i)
+      c->serializer->add_link (*new_strikes[i], objidxs[new_strikes.length - 1 - i]);
+
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t* c) const
+  {
+    TRACE_SUBSET (this);
+
+    sbix *sbix_prime = c->serializer->start_embed<sbix> ();
+    if (unlikely (!sbix_prime)) return_trace (false);
+    if (unlikely (!c->serializer->embed (this->version))) return_trace (false);
+    if (unlikely (!c->serializer->embed (this->flags))) return_trace (false);
+
+    return_trace (serialize_strike_offsets (c));
+  }
+
   protected:
   HBUINT16     version;        /* Table version number — set to 1 */
   HBUINT16     flags;          /* Bit 0: Set to 1. Bit 1: Draw outlines.
index 926d61e..1cc40ae 100644 (file)
@@ -80,7 +80,7 @@ struct SVG
   struct accelerator_t
   {
     void init (hb_face_t *face)
-    { table = hb_sanitize_context_t().reference_table<SVG> (face); }
+    { table = hb_sanitize_context_t ().reference_table<SVG> (face); }
     void fini () { table.destroy (); }
 
     hb_blob_t *reference_blob_for_glyph (hb_codepoint_t glyph_id) const
index 96f94e4..a1dc886 100644 (file)
@@ -183,22 +183,21 @@ hb_ot_get_glyph_extents (hb_font_t *font,
                         void *user_data HB_UNUSED)
 {
   const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
-  bool ret = false;
 
 #if !defined(HB_NO_OT_FONT_BITMAP) && !defined(HB_NO_COLOR)
-  if (!ret) ret = ot_face->sbix->get_extents (font, glyph, extents);
+  if (ot_face->sbix->get_extents (font, glyph, extents)) return true;
 #endif
-  if (!ret) ret = ot_face->glyf->get_extents (font, glyph, extents);
+  if (ot_face->glyf->get_extents (font, glyph, extents)) return true;
 #ifndef HB_NO_OT_FONT_CFF
-  if (!ret) ret = ot_face->cff1->get_extents (font, glyph, extents);
-  if (!ret) ret = ot_face->cff2->get_extents (font, glyph, extents);
+  if (ot_face->cff1->get_extents (font, glyph, extents)) return true;
+  if (ot_face->cff2->get_extents (font, glyph, extents)) return true;
 #endif
 #if !defined(HB_NO_OT_FONT_BITMAP) && !defined(HB_NO_COLOR)
-  if (!ret) ret = ot_face->CBDT->get_extents (font, glyph, extents);
+  if (ot_face->CBDT->get_extents (font, glyph, extents)) return true;
 #endif
 
   // TODO Hook up side-bearings variations.
-  return ret;
+  return false;
 }
 
 #ifndef HB_NO_OT_FONT_GLYPH_NAMES
@@ -210,7 +209,11 @@ hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED,
                      void *user_data HB_UNUSED)
 {
   const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
-  return ot_face->post->get_glyph_name (glyph, name, size);
+  if (ot_face->post->get_glyph_name (glyph, name, size)) return true;
+#ifndef HB_NO_OT_FONT_CFF
+  if (ot_face->cff1->get_glyph_name (glyph, name, size)) return true;
+#endif
+  return false;
 }
 static hb_bool_t
 hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED,
@@ -220,7 +223,11 @@ hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED,
                           void *user_data HB_UNUSED)
 {
   const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data;
-  return ot_face->post->get_glyph_from_name (name, len, glyph);
+  if (ot_face->post->get_glyph_from_name (name, len, glyph)) return true;
+#ifndef HB_NO_OT_FONT_CFF
+    if (ot_face->cff1->get_glyph_from_name (name, len, glyph)) return true;
+#endif
+  return false;
 }
 #endif
 
index 94fff58..4f29192 100644 (file)
@@ -48,8 +48,8 @@ struct GaspRange
   }
 
   public:
-  HBUINT16     rangeMaxPPEM;   /* Upper limit of range, in PPEM */
-  HBUINT16     rangeGaspBehavior;
+  HBUINT16     rangeMaxPPEM;   /* Upper limit of range, in PPEM */
+  HBUINT16     rangeGaspBehavior;
                                /* Flags describing desired rasterizer behavior. */
   public:
   DEFINE_SIZE_STATIC (4);
index 571e50e..ce7ffa9 100644 (file)
@@ -34,8 +34,7 @@
 #include "hb-ot-head-table.hh"
 #include "hb-ot-hmtx-table.hh"
 #include "hb-ot-var-gvar-table.hh"
-
-#include <float.h>
+#include "hb-draw.hh"
 
 namespace OT {
 
@@ -148,7 +147,19 @@ struct glyf
                  const hb_subset_plan_t *plan)
   {
     TRACE_SERIALIZE (this);
+    unsigned init_len = c->length ();
     for (const auto &_ : it) _.serialize (c, 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
+     * on Windows as well.
+     * See https://github.com/khaledhosny/ots/issues/52 */
+    if (init_len == c->length ())
+    {
+      HBUINT8 empty_byte;
+      empty_byte = 0;
+      c->copy (empty_byte);
+    }
     return_trace (true);
   }
 
@@ -229,18 +240,18 @@ struct glyf
   {
     enum composite_glyph_flag_t
     {
-      ARG_1_AND_2_ARE_WORDS =      0x0001,
-      ARGS_ARE_XY_VALUES =         0x0002,
-      ROUND_XY_TO_GRID =           0x0004,
-      WE_HAVE_A_SCALE =            0x0008,
-      MORE_COMPONENTS =            0x0020,
-      WE_HAVE_AN_X_AND_Y_SCALE =   0x0040,
-      WE_HAVE_A_TWO_BY_TWO =       0x0080,
-      WE_HAVE_INSTRUCTIONS =       0x0100,
-      USE_MY_METRICS =             0x0200,
-      OVERLAP_COMPOUND =           0x0400,
-      SCALED_COMPONENT_OFFSET =    0x0800,
-      UNSCALED_COMPONENT_OFFSET =  0x1000
+      ARG_1_AND_2_ARE_WORDS    = 0x0001,
+      ARGS_ARE_XY_VALUES       = 0x0002,
+      ROUND_XY_TO_GRID         = 0x0004,
+      WE_HAVE_A_SCALE          = 0x0008,
+      MORE_COMPONENTS          = 0x0020,
+      WE_HAVE_AN_X_AND_Y_SCALE = 0x0040,
+      WE_HAVE_A_TWO_BY_TWO     = 0x0080,
+      WE_HAVE_INSTRUCTIONS     = 0x0100,
+      USE_MY_METRICS           = 0x0200,
+      OVERLAP_COMPOUND         = 0x0400,
+      SCALED_COMPONENT_OFFSET  = 0x0800,
+      UNSCALED_COMPONENT_OFFSET = 0x1000
     };
 
     unsigned int get_size () const
@@ -361,7 +372,7 @@ struct glyf
     typedef const CompositeGlyphChain *__item_t__;
     composite_iter_t (hb_bytes_t glyph_, __item_t__ current_) :
       glyph (glyph_), current (current_)
-    { if (!in_range (current)) current = nullptr; }
+    { if (!check_range (current)) current = nullptr; }
     composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr) {}
 
     const CompositeGlyphChain &__item__ () const { return *current; }
@@ -372,16 +383,16 @@ struct glyf
 
       const CompositeGlyphChain *possible = &StructAfter<CompositeGlyphChain,
                                                         CompositeGlyphChain> (*current);
-      if (!in_range (possible)) { current = nullptr; return; }
+      if (!check_range (possible)) { current = nullptr; return; }
       current = possible;
     }
     bool operator != (const composite_iter_t& o) const
     { return glyph != o.glyph || current != o.current; }
 
-    bool in_range (const CompositeGlyphChain *composite) const
+    bool check_range (const CompositeGlyphChain *composite) const
     {
-      return glyph.in_range (composite, CompositeGlyphChain::min_size)
-         && glyph.in_range (composite, composite->get_size ());
+      return glyph.check_range (composite, CompositeGlyphChain::min_size)
+         && glyph.check_range (composite, composite->get_size ());
     }
 
     private:
@@ -389,8 +400,29 @@ struct glyf
     __item_t__ current;
   };
 
+  enum phantom_point_index_t
+  {
+    PHANTOM_LEFT   = 0,
+    PHANTOM_RIGHT  = 1,
+    PHANTOM_TOP    = 2,
+    PHANTOM_BOTTOM = 3,
+    PHANTOM_COUNT  = 4
+  };
+
   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
+    };
+
     private:
     struct GlyphHeader
     {
@@ -445,18 +477,6 @@ struct glyf
        return instructionLength;
       }
 
-      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
-      };
-
       const Glyph trim_padding () const
       {
        /* based on FontTools _g_l_y_f.py::trim */
@@ -470,7 +490,6 @@ struct glyf
        unsigned int num_instructions = StructAtOffset<HBUINT16> (glyph, 0);
 
        glyph += 2 + num_instructions;
-       if (unlikely (glyph + 2 >= glyph_end)) return Glyph ();
 
        unsigned int coord_bytes = 0;
        unsigned int coords_with_flags = 0;
@@ -519,70 +538,53 @@ struct glyf
        dest_end = bytes.sub_array (glyph_length, bytes.length - glyph_length);
       }
 
-      struct x_setter_t
-      {
-       void set (contour_point_t &point, float v) const { point.x = v; }
-       bool is_short (uint8_t flag) const { return flag & FLAG_X_SHORT; }
-       bool is_same  (uint8_t flag) const { return flag & FLAG_X_SAME; }
-      };
-
-      struct y_setter_t
-      {
-       void set (contour_point_t &point, float v) const { point.y = v; }
-       bool is_short (uint8_t flag) const { return flag & FLAG_Y_SHORT; }
-       bool is_same  (uint8_t flag) const { return flag & FLAG_Y_SAME; }
-      };
-
-      template <typename T>
       static bool read_points (const HBUINT8 *&p /* IN/OUT */,
                               contour_point_vector_t &points_ /* IN/OUT */,
-                              const hb_bytes_t &bytes)
+                              const hb_bytes_t &bytes,
+                              void (* setter) (contour_point_t &_, float v),
+                              const simple_glyph_flag_t short_flag,
+                              const simple_glyph_flag_t same_flag)
       {
-       T coord_setter;
        float v = 0;
-       for (unsigned int i = 0; i < points_.length - PHANTOM_COUNT; i++)
+       for (unsigned i = 0; i < points_.length; i++)
        {
          uint8_t flag = points_[i].flag;
-         if (coord_setter.is_short (flag))
+         if (flag & short_flag)
          {
-           if (unlikely (!bytes.in_range (p))) return false;
-           if (coord_setter.is_same (flag))
+           if (unlikely (!bytes.check_range (p))) return false;
+           if (flag & same_flag)
              v += *p++;
            else
              v -= *p++;
          }
          else
          {
-           if (!coord_setter.is_same (flag))
+           if (!(flag & same_flag))
            {
-             if (unlikely (!bytes.in_range ((const HBUINT16 *) p))) return false;
+             if (unlikely (!bytes.check_range ((const HBUINT16 *) p))) return false;
              v += *(const HBINT16 *) p;
              p += HBINT16::static_size;
            }
          }
-         coord_setter.set (points_[i], v);
+         setter (points_[i], v);
        }
        return true;
       }
 
       bool get_contour_points (contour_point_vector_t &points_ /* OUT */,
-                              hb_vector_t<unsigned int> &end_points_ /* OUT */,
-                              const bool phantom_only=false) const
+                              bool phantom_only = false) const
       {
        const HBUINT16 *endPtsOfContours = &StructAfter<HBUINT16> (header);
        int num_contours = header.numberOfContours;
-       if (unlikely (!bytes.in_range (&endPtsOfContours[num_contours + 1]))) return false;
+       if (unlikely (!bytes.check_range (&endPtsOfContours[num_contours + 1]))) return false;
        unsigned int num_points = endPtsOfContours[num_contours - 1] + 1;
 
-       points_.resize (num_points + PHANTOM_COUNT);
+       points_.resize (num_points);
        for (unsigned int i = 0; i < points_.length; i++) points_[i].init ();
        if (phantom_only) return true;
 
-       /* Read simple glyph points if !phantom_only */
-       end_points_.resize (num_contours);
-
        for (int i = 0; i < num_contours; i++)
-         end_points_[i] = endPtsOfContours[i];
+         points_[endPtsOfContours[i]].is_end_point = true;
 
        /* Skip instructions */
        const HBUINT8 *p = &StructAtOffset<HBUINT8> (&endPtsOfContours[num_contours + 1],
@@ -591,12 +593,12 @@ struct glyf
        /* Read flags */
        for (unsigned int i = 0; i < num_points; i++)
        {
-         if (unlikely (!bytes.in_range (p))) return false;
+         if (unlikely (!bytes.check_range (p))) return false;
          uint8_t flag = *p++;
          points_[i].flag = flag;
          if (flag & FLAG_REPEAT)
          {
-           if (unlikely (!bytes.in_range (p))) return false;
+           if (unlikely (!bytes.check_range (p))) return false;
            unsigned int repeat_count = *p++;
            while ((repeat_count-- > 0) && (++i < num_points))
              points_[i].flag = flag;
@@ -604,8 +606,10 @@ struct glyf
        }
 
        /* Read x & y coordinates */
-       return (read_points<x_setter_t> (p, points_, bytes) &&
-               read_points<y_setter_t> (p, points_, bytes));
+       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));
       }
     };
 
@@ -648,30 +652,10 @@ struct glyf
       /* 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)); }
-
-      bool get_contour_points (contour_point_vector_t &points_ /* OUT */,
-                              hb_vector_t<unsigned int> &end_points_ /* OUT */,
-                              const bool phantom_only=false) const
-      {
-       /* add one pseudo point for each component in composite glyph */
-       unsigned int num_points = hb_len (get_iterator ());
-       points_.resize (num_points + PHANTOM_COUNT);
-       for (unsigned int i = 0; i < points_.length; i++) points_[i].init ();
-       return true;
-      }
     };
 
     enum glyph_type_t { EMPTY, SIMPLE, COMPOSITE };
 
-    enum phantom_point_index_t
-    {
-      PHANTOM_LEFT   = 0,
-      PHANTOM_RIGHT  = 1,
-      PHANTOM_TOP    = 2,
-      PHANTOM_BOTTOM = 3,
-      PHANTOM_COUNT  = 4
-    };
-
     public:
     composite_iter_t get_composite_iterator () const
     {
@@ -706,39 +690,130 @@ struct glyf
       }
     }
 
-    /* for a simple glyph, return contour end points, flags, along with coordinate points
-     * for a composite glyph, return pseudo component points
-     * in both cases points trailed with four phantom points
+    /* Note: Recursively calls itself.
+     * all_points includes phantom points
      */
-    bool get_contour_points (contour_point_vector_t &points_ /* OUT */,
-                            hb_vector_t<unsigned int> &end_points_ /* OUT */,
-                            const bool phantom_only=false) const
+    template<typename T>
+    bool get_points (T glyph_for_gid, hb_font_t *font,
+                    contour_point_vector_t &all_points /* OUT */,
+                    bool phantom_only = false,
+                    unsigned int depth = 0) const
     {
+      if (unlikely (depth > HB_MAX_NESTING_LEVEL)) return false;
+      contour_point_vector_t points;
+
       switch (type) {
-      case COMPOSITE: return CompositeGlyph (*header, bytes).get_contour_points (points_, end_points_, phantom_only);
-      case SIMPLE:    return SimpleGlyph (*header, bytes).get_contour_points (points_, end_points_, phantom_only);
-      default:
-       /* empty glyph */
-       points_.resize (PHANTOM_COUNT);
-       for (unsigned int i = 0; i < points_.length; i++) points_[i].init ();
-       return true;
+      case COMPOSITE:
+      {
+       /* pseudo component points for each component in composite glyph */
+       unsigned num_points = hb_len (CompositeGlyph (*header, bytes).get_iterator ());
+       if (unlikely (!points.resize (num_points))) return false;
+       for (unsigned i = 0; i < points.length; i++)
+         points[i].init ();
+       break;
+      }
+      case SIMPLE:
+       if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points, phantom_only)))
+         return false;
+       break;
+      default: return false; /* empty glyph */
       }
-    }
 
-    bool is_simple_glyph ()    const { return type == SIMPLE; }
-    bool is_composite_glyph () const { return type == COMPOSITE; }
+      hb_face_t *face = font->face;
 
-    bool get_extents (hb_font_t *font, hb_codepoint_t gid, hb_glyph_extents_t *extents) const
+      /* 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);
+       phantoms[PHANTOM_LEFT].x = h_delta;
+       phantoms[PHANTOM_RIGHT].x = h_adv + h_delta;
+       phantoms[PHANTOM_TOP].y = v_orig;
+       phantoms[PHANTOM_BOTTOM].y = v_orig - (int) v_adv;
+      }
+
+#ifndef HB_NO_VAR
+      if (unlikely (!face->table.gvar->apply_deltas_to_points (gid, font, points.as_array ())))
+       return false;
+#endif
+
+      switch (type) {
+      case SIMPLE:
+       all_points.extend (points.as_array ());
+       break;
+      case COMPOSITE:
+      {
+       unsigned int comp_index = 0;
+       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)
+           return false;
+
+         /* Copy phantom points from component if USE_MY_METRICS flag set */
+         if (item.is_use_my_metrics ())
+           for (unsigned int i = 0; i < PHANTOM_COUNT; i++)
+             phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i];
+
+         /* Apply component transformation & translation */
+         item.transform_points (comp_points);
+
+         /* Apply translation from gvar */
+         comp_points.translate (points[comp_index]);
+
+         if (item.is_anchored ())
+         {
+           unsigned int p1, p2;
+           item.get_anchor_points (p1, p2);
+           if (likely (p1 < all_points.length && p2 < comp_points.length))
+           {
+             contour_point_t delta;
+             delta.init (all_points[p1].x - comp_points[p2].x,
+                         all_points[p1].y - comp_points[p2].y);
+
+             comp_points.translate (delta);
+           }
+         }
+
+         all_points.extend (comp_points.sub_array (0, comp_points.length - PHANTOM_COUNT));
+
+         comp_index++;
+       }
+
+       all_points.extend (phantoms);
+      } break;
+      default: return false;
+      }
+
+      if (depth == 0) /* Apply at top level */
+      {
+       /* Undocumented rasterizer behavior:
+        * Shift points horizontally by the updated left side bearing
+        */
+       contour_point_t delta;
+       delta.init (-phantoms[PHANTOM_LEFT].x, 0.f);
+       if (delta.x) all_points.translate (delta);
+      }
+
+      return true;
+    }
+
+    bool get_extents (hb_font_t *font, hb_glyph_extents_t *extents) const
     {
       if (type == EMPTY) return true; /* Empty glyph; zero extents. */
       return header->get_extents (font, gid, extents);
     }
 
-    hb_bytes_t get_bytes ()          const { return bytes; }
-    const GlyphHeader &get_header () const { return *header; }
+    hb_bytes_t get_bytes () const { return bytes; }
 
-    Glyph (hb_bytes_t bytes_ = hb_bytes_t ()) :
-      bytes (bytes_), header (bytes.as<GlyphHeader> ())
+    Glyph (hb_bytes_t bytes_ = hb_bytes_t (),
+          hb_codepoint_t gid_ = (hb_codepoint_t) -1) : bytes (bytes_), gid (gid_),
+                                                       header (bytes.as<GlyphHeader> ())
     {
       int num_contours = header->numberOfContours;
       if (unlikely (num_contours == 0)) type = EMPTY;
@@ -748,6 +823,7 @@ struct glyf
 
     protected:
     hb_bytes_t bytes;
+    hb_codepoint_t gid;
     const GlyphHeader *header;
     unsigned type;
   };
@@ -771,6 +847,7 @@ struct glyf
       glyf_table = hb_sanitize_context_t ().reference_table<glyf> (face);
 
       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 ()
@@ -779,223 +856,137 @@ struct glyf
       glyf_table.destroy ();
     }
 
-    enum phantom_point_index_t
-    {
-      PHANTOM_LEFT   = 0,
-      PHANTOM_RIGHT  = 1,
-      PHANTOM_TOP    = 2,
-      PHANTOM_BOTTOM = 3,
-      PHANTOM_COUNT  = 4
-    };
-
     protected:
-
-    void init_phantom_points (hb_codepoint_t gid, hb_array_t<contour_point_t> &phantoms /* IN/OUT */) const
+    template<typename T>
+    bool get_points (hb_font_t *font, hb_codepoint_t gid, T consumer) const
     {
-      const Glyph &glyph = glyph_for_gid (gid);
-      int h_delta = (int) glyph.get_header ().xMin - face->table.hmtx->get_side_bearing (gid);
-      int v_orig  = (int) glyph.get_header ().yMax + face->table.vmtx->get_side_bearing (gid);
-      unsigned int h_adv = face->table.hmtx->get_advance (gid);
-      unsigned int v_adv = face->table.vmtx->get_advance (gid);
-
-      phantoms[PHANTOM_LEFT].x = h_delta;
-      phantoms[PHANTOM_RIGHT].x = h_adv + h_delta;
-      phantoms[PHANTOM_TOP].y = v_orig;
-      phantoms[PHANTOM_BOTTOM].y = v_orig - (int) v_adv;
-    }
+      /* Making this alloc free 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;
 
-    struct contour_bounds_t
-    {
-      contour_bounds_t () { min_x = min_y = FLT_MAX; max_x = max_y = -FLT_MAX; }
+      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)))
+       return false;
 
-      void add (const contour_point_t &p)
+      if (consumer.is_consuming_contour_points ())
       {
-       min_x = hb_min (min_x, p.x);
-       min_y = hb_min (min_y, p.y);
-       max_x = hb_max (max_x, p.x);
-       max_y = hb_max (max_y, p.y);
+       for (unsigned point_index = 0; point_index + 4 < all_points.length; ++point_index)
+         consumer.consume_point (all_points[point_index]);
+       consumer.points_end ();
       }
 
-      bool empty () const { return (min_x >= max_x) || (min_y >= max_y); }
-
-      void get_extents (hb_font_t *font, hb_glyph_extents_t *extents)
-      {
-       if (unlikely (empty ()))
-       {
-         extents->width = 0;
-         extents->x_bearing = 0;
-         extents->height = 0;
-         extents->y_bearing = 0;
-         return;
-       }
-       extents->x_bearing = font->em_scalef_x (min_x);
-       extents->width = font->em_scalef_x (max_x - min_x);
-       extents->y_bearing = font->em_scalef_y (max_y);
-       extents->height = font->em_scalef_y (min_y - max_y);
-      }
+      /* Where to write phantoms, nullptr if not requested */
+      contour_point_t *phantoms = consumer.get_phantoms_sink ();
+      if (phantoms)
+       for (unsigned i = 0; i < PHANTOM_COUNT; ++i)
+         phantoms[i] = all_points[all_points.length - PHANTOM_COUNT + i];
 
-      protected:
-      float min_x, min_y, max_x, max_y;
-    };
+      return true;
+    }
 
+    public:
 #ifndef HB_NO_VAR
-    /* Note: Recursively calls itself.
-     * all_points includes phantom points
-     */
-    bool get_points_var (hb_codepoint_t gid,
-                        const int *coords, unsigned int coord_count,
-                        contour_point_vector_t &all_points /* OUT */,
-                        unsigned int depth = 0) const
+    struct points_aggregator_t
     {
-      if (unlikely (depth++ > HB_MAX_NESTING_LEVEL)) return false;
-      contour_point_vector_t points;
-      hb_vector_t<unsigned int> end_points;
-      const Glyph &glyph = glyph_for_gid (gid);
-      if (unlikely (!glyph.get_contour_points (points, end_points))) return false;
-      hb_array_t<contour_point_t> phantoms = points.sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT);
-      init_phantom_points (gid, phantoms);
-      if (unlikely (!face->table.gvar->apply_deltas_to_points (gid, coords, coord_count, points.as_array (), end_points.as_array ()))) return false;
+      hb_font_t *font;
+      hb_glyph_extents_t *extents;
+      contour_point_t *phantoms;
 
-      unsigned int comp_index = 0;
-      if (glyph.is_simple_glyph ())
-       all_points.extend (points.as_array ());
-      else if (glyph.is_composite_glyph ())
+      struct contour_bounds_t
       {
-       for (auto &item : glyph.get_composite_iterator ())
-       {
-         contour_point_vector_t comp_points;
-         if (unlikely (!get_points_var (item.glyphIndex, coords, coord_count,
-                                        comp_points, depth))
-                       || comp_points.length < PHANTOM_COUNT)
-           return false;
-
-         /* Copy phantom points from component if USE_MY_METRICS flag set */
-         if (item.is_use_my_metrics ())
-           for (unsigned int i = 0; i < PHANTOM_COUNT; i++)
-             phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i];
+       contour_bounds_t () { min_x = min_y = FLT_MAX; max_x = max_y = -FLT_MAX; }
 
-         /* Apply component transformation & translation */
-         item.transform_points (comp_points);
+       void add (const contour_point_t &p)
+       {
+         min_x = hb_min (min_x, p.x);
+         min_y = hb_min (min_y, p.y);
+         max_x = hb_max (max_x, p.x);
+         max_y = hb_max (max_y, p.y);
+       }
 
-         /* Apply translatation from gvar */
-         comp_points.translate (points[comp_index]);
+       bool empty () const { return (min_x >= max_x) || (min_y >= max_y); }
 
-         if (item.is_anchored ())
+       void get_extents (hb_font_t *font, hb_glyph_extents_t *extents)
+       {
+         if (unlikely (empty ()))
          {
-           unsigned int p1, p2;
-           item.get_anchor_points (p1, p2);
-           if (likely (p1 < all_points.length && p2 < comp_points.length))
-           {
-             contour_point_t delta;
-             delta.init (all_points[p1].x - comp_points[p2].x,
-                         all_points[p1].y - comp_points[p2].y);
-
-             comp_points.translate (delta);
-           }
+           extents->width = 0;
+           extents->x_bearing = 0;
+           extents->height = 0;
+           extents->y_bearing = 0;
+           return;
          }
-
-         all_points.extend (comp_points.sub_array (0, comp_points.length - PHANTOM_COUNT));
-
-         comp_index++;
+         extents->x_bearing = font->em_scalef_x (min_x);
+         extents->width = font->em_scalef_x (max_x - min_x);
+         extents->y_bearing = font->em_scalef_y (max_y);
+         extents->height = font->em_scalef_y (min_y - max_y);
        }
 
-       all_points.extend (phantoms);
-      }
-      else return false;
+       protected:
+       float min_x, min_y, max_x, max_y;
+      } bounds;
 
-      return true;
-    }
-
-    bool get_points_bearing_applied (hb_font_t *font, hb_codepoint_t gid, contour_point_vector_t &all_points) const
-    {
-      if (unlikely (!get_points_var (gid, font->coords, font->num_coords, all_points) ||
-                   all_points.length < PHANTOM_COUNT)) return false;
-
-      /* Undocumented rasterizer behavior:
-       * Shift points horizontally by the updated left side bearing
-       */
-      contour_point_t delta;
-      delta.init (-all_points[all_points.length - PHANTOM_COUNT + PHANTOM_LEFT].x, 0.f);
-      if (delta.x) all_points.translate (delta);
-      return true;
-    }
-
-    protected:
-
-    bool get_var_extents_and_phantoms (hb_font_t *font, hb_codepoint_t gid,
-                                      hb_glyph_extents_t *extents=nullptr /* OUT */,
-                                      contour_point_vector_t *phantoms=nullptr /* OUT */) const
-    {
-      contour_point_vector_t all_points;
-      if (!unlikely (get_points_bearing_applied (font, gid, all_points))) return false;
-      if (extents)
+      points_aggregator_t (hb_font_t *font_, hb_glyph_extents_t *extents_, contour_point_t *phantoms_)
       {
-       contour_bounds_t bounds;
-       for (unsigned int i = 0; i + PHANTOM_COUNT < all_points.length; i++)
-         bounds.add (all_points[i]);
-       bounds.get_extents (font, extents);
+       font = font_;
+       extents = extents_;
+       phantoms = phantoms_;
+       if (extents) bounds = contour_bounds_t ();
       }
-      if (phantoms)
-       for (unsigned int i = 0; i < PHANTOM_COUNT; i++)
-         (*phantoms)[i] = all_points[all_points.length - PHANTOM_COUNT + i];
-      return true;
-    }
 
-    bool get_var_metrics (hb_font_t *font, hb_codepoint_t gid,
-                         contour_point_vector_t &phantoms) const
-    { return get_var_extents_and_phantoms (font, gid, nullptr, &phantoms); }
+      void consume_point (const contour_point_t &point) { bounds.add (point); }
+      void points_end () { bounds.get_extents (font, extents); }
 
-    bool get_extents_var (hb_font_t *font, hb_codepoint_t gid,
-                         hb_glyph_extents_t *extents) const
-    { return get_var_extents_and_phantoms (font, gid, extents); }
-#endif
+      bool is_consuming_contour_points () { return extents; }
+      contour_point_t *get_phantoms_sink () { return phantoms; }
+    };
 
-    public:
-#ifndef HB_NO_VAR
-    unsigned int get_advance_var (hb_font_t *font, hb_codepoint_t gid,
-                                 bool is_vertical) const
+    unsigned int
+    get_advance_var (hb_font_t *font, hb_codepoint_t gid, bool is_vertical) const
     {
       bool success = false;
-      contour_point_vector_t phantoms;
-      phantoms.resize (PHANTOM_COUNT);
 
+      contour_point_t phantoms[PHANTOM_COUNT];
       if (likely (font->num_coords == face->table.gvar->get_axis_count ()))
-       success = get_var_metrics (font, gid, phantoms);
+       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 is_vertical
+            ? face->table.vmtx->get_advance (gid)
+            : face->table.hmtx->get_advance (gid);
 
-      if (is_vertical)
-       return roundf (phantoms[PHANTOM_TOP].y - phantoms[PHANTOM_BOTTOM].y);
-      else
-       return roundf (phantoms[PHANTOM_RIGHT].x - phantoms[PHANTOM_LEFT].x);
+      return is_vertical
+          ? roundf (phantoms[PHANTOM_TOP].y - phantoms[PHANTOM_BOTTOM].y)
+          : roundf (phantoms[PHANTOM_RIGHT].x - phantoms[PHANTOM_LEFT].x);
     }
 
     int get_side_bearing_var (hb_font_t *font, hb_codepoint_t gid, bool is_vertical) const
     {
       hb_glyph_extents_t extents;
-      contour_point_vector_t phantoms;
-      phantoms.resize (PHANTOM_COUNT);
 
-      if (unlikely (!get_var_extents_and_phantoms (font, gid, &extents, &phantoms)))
-       return is_vertical ? face->table.vmtx->get_side_bearing (gid) : face->table.hmtx->get_side_bearing (gid);
+      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 is_vertical ? ceil (phantoms[PHANTOM_TOP].y) - extents.y_bearing : floor (phantoms[PHANTOM_LEFT].x);
+      return is_vertical
+          ? ceilf (phantoms[PHANTOM_TOP].y) - extents.y_bearing
+          : floorf (phantoms[PHANTOM_LEFT].x);
     }
 #endif
 
     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
-      unsigned int coord_count;
-      const int *coords = hb_font_get_var_coords_normalized (font, &coord_count);
-      if (coords && coord_count > 0 && coord_count == face->table.gvar->get_axis_count ())
-       return get_extents_var (font, gid, extents);
+      if (font->num_coords && font->num_coords == face->table.gvar->get_axis_count ())
+       return get_points (font, gid, points_aggregator_t (font, extents, nullptr));
 #endif
-
-      if (unlikely (gid >= num_glyphs)) return false;
-
-      return glyph_for_gid (gid).get_extents (font, gid, extents);
+      return glyph_for_gid (gid).get_extents (font, extents);
     }
 
     const Glyph
@@ -1021,7 +1012,7 @@ struct glyf
        return Glyph ();
 
       Glyph glyph (hb_bytes_t ((const char *) this->glyf_table + start_offset,
-                              end_offset - start_offset));
+                              end_offset - start_offset), gid);
       return needs_padding_removal ? glyph.trim_padding () : glyph;
     }
 
@@ -1036,9 +1027,130 @@ struct glyf
       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);
+       add_gid_and_children (item.glyphIndex, gids_to_retain, depth);
     }
 
+#ifdef HB_EXPERIMENTAL_API
+    struct path_builder_t
+    {
+      hb_font_t *font;
+      draw_helper_t *draw_helper;
+
+      struct optional_point_t
+      {
+       optional_point_t () { has_data = false; }
+       optional_point_t (float x_, float y_) { x = x_; y = y_; has_data = true; }
+
+       bool has_data;
+       float x;
+       float y;
+
+       optional_point_t lerp (optional_point_t p, float t)
+       { return optional_point_t (x + t * (p.x - x), y + t * (p.y - y)); }
+      } first_oncurve, first_offcurve, last_offcurve;
+
+      path_builder_t (hb_font_t *font_, draw_helper_t &draw_helper_)
+      {
+       font = font_;
+       draw_helper = &draw_helper_;
+       first_oncurve = first_offcurve = last_offcurve = optional_point_t ();
+      }
+
+      /* based on https://github.com/RazrFalcon/ttf-parser/blob/4f32821/src/glyf.rs#L287
+        See also:
+        * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM01/Chap1.html
+        * https://stackoverflow.com/a/20772557 */
+      void consume_point (const contour_point_t &point)
+      {
+       /* Skip empty contours */
+       if (unlikely (point.is_end_point && !first_oncurve.has_data && !first_offcurve.has_data))
+         return;
+
+       bool is_on_curve = point.flag & Glyph::FLAG_ON_CURVE;
+       optional_point_t p (point.x, point.y);
+       if (!first_oncurve.has_data)
+       {
+         if (is_on_curve)
+         {
+           first_oncurve = p;
+           draw_helper->move_to (font->em_scalef_x (p.x), font->em_scalef_y (p.y));
+         }
+         else
+         {
+           if (first_offcurve.has_data)
+           {
+             optional_point_t mid = first_offcurve.lerp (p, .5f);
+             first_oncurve = mid;
+             last_offcurve = p;
+             draw_helper->move_to (font->em_scalef_x (mid.x), font->em_scalef_y (mid.y));
+           }
+           else
+             first_offcurve = p;
+         }
+       }
+       else
+       {
+         if (last_offcurve.has_data)
+         {
+           if (is_on_curve)
+           {
+             draw_helper->quadratic_to (font->em_scalef_x (last_offcurve.x), font->em_scalef_y (last_offcurve.y),
+                                        font->em_scalef_x (p.x), font->em_scalef_y (p.y));
+             last_offcurve = optional_point_t ();
+           }
+           else
+           {
+             optional_point_t mid = last_offcurve.lerp (p, .5f);
+             draw_helper->quadratic_to (font->em_scalef_x (last_offcurve.x), font->em_scalef_y (last_offcurve.y),
+                                        font->em_scalef_x (mid.x), font->em_scalef_y (mid.y));
+             last_offcurve = p;
+           }
+         }
+         else
+         {
+           if (is_on_curve)
+             draw_helper->line_to (font->em_scalef_x (p.x), font->em_scalef_y (p.y));
+           else
+             last_offcurve = p;
+         }
+       }
+
+       if (point.is_end_point)
+       {
+         if (first_offcurve.has_data && last_offcurve.has_data)
+         {
+           optional_point_t mid = last_offcurve.lerp (first_offcurve, .5f);
+           draw_helper->quadratic_to (font->em_scalef_x (last_offcurve.x), font->em_scalef_y (last_offcurve.y),
+                                      font->em_scalef_x (mid.x), font->em_scalef_y (mid.y));
+           last_offcurve = optional_point_t ();
+           /* now check the rest */
+         }
+
+         if (first_offcurve.has_data && first_oncurve.has_data)
+           draw_helper->quadratic_to (font->em_scalef_x (first_offcurve.x), font->em_scalef_y (first_offcurve.y),
+                                      font->em_scalef_x (first_oncurve.x), font->em_scalef_y (first_oncurve.y));
+         else if (last_offcurve.has_data && first_oncurve.has_data)
+           draw_helper->quadratic_to (font->em_scalef_x (last_offcurve.x), font->em_scalef_y (last_offcurve.y),
+                                      font->em_scalef_x (first_oncurve.x), font->em_scalef_y (first_oncurve.y));
+         else if (first_oncurve.has_data)
+           draw_helper->line_to (font->em_scalef_x (first_oncurve.x), font->em_scalef_y (first_oncurve.y));
+
+         /* Getting ready for the next contour */
+         first_oncurve = first_offcurve = last_offcurve = optional_point_t ();
+         draw_helper->end_path ();
+       }
+      }
+      void points_end () {}
+
+      bool is_consuming_contour_points () { return true; }
+      contour_point_t *get_phantoms_sink () { return nullptr; }
+    };
+
+    bool
+    get_path (hb_font_t *font, hb_codepoint_t gid, draw_helper_t &draw_helper) const
+    { return get_points (font, gid, path_builder_t (font, draw_helper)); }
+#endif
+
     private:
     bool short_offset;
     unsigned int num_glyphs;
@@ -1073,7 +1185,7 @@ struct glyf
        pad_length--;
       }
 
-      if (!unlikely (dest_glyph.length)) return_trace (true);
+      if (unlikely (!dest_glyph.length)) return_trace (true);
 
       /* update components gids */
       for (auto &_ : Glyph (dest_glyph).get_composite_iterator ())
index 96c1d1f..c9c391b 100644 (file)
@@ -107,11 +107,8 @@ struct hdmx
     this->numRecords = it.len ();
     this->sizeDeviceRecord = DeviceRecord::get_size (it ? (*it).second.len () : 0);
 
-    + it
-    | hb_apply ([c] (const hb_item_type<Iterator>& _) {
-                 c->start_embed<DeviceRecord> ()->serialize (c, _.first, _.second);
-               })
-    ;
+    for (const hb_item_type<Iterator>& _ : +it)
+      c->start_embed<DeviceRecord> ()->serialize (c, _.first, _.second);
 
     return_trace (c->successful);
   }
@@ -134,10 +131,10 @@ struct hdmx
          auto row =
            + hb_range (c->plan->num_output_glyphs ())
            | hb_map (c->plan->reverse_glyph_map)
-           | hb_map ([=] (hb_codepoint_t _)
+           | hb_map ([this, c, device_record] (hb_codepoint_t _)
                      {
                        if (c->plan->is_empty_glyph (_))
-                         return Null(HBUINT8);
+                         return Null (HBUINT8);
                        return device_record->widthsZ.as_array (get_num_glyphs ()) [_];
                      })
            ;
@@ -164,10 +161,12 @@ struct hdmx
   }
 
   protected:
-  HBUINT16             version;                /* Table version number (0) */
-  HBUINT16             numRecords;             /* Number of device records. */
-  HBUINT32             sizeDeviceRecord;       /* Size of a device record, 32-bit aligned. */
-  DeviceRecord         firstDeviceRecord;      /* Array of device records. */
+  HBUINT16     version;        /* Table version number (0) */
+  HBUINT16     numRecords;     /* Number of device records. */
+  HBUINT32     sizeDeviceRecord;
+                               /* Size of a device record, 32-bit aligned. */
+  DeviceRecord firstDeviceRecord;
+                               /* Array of device records. */
   public:
   DEFINE_SIZE_MIN (8);
 };
index 3c0bb3d..5613a96 100644 (file)
@@ -54,6 +54,18 @@ struct head
     return 16 <= upem && upem <= 16384 ? upem : 1000;
   }
 
+  bool serialize (hb_serialize_context_t *c) const
+  {
+    TRACE_SERIALIZE (this);
+    return_trace ((bool) c->embed (this));
+  }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    return_trace (serialize (c->serializer));
+  }
+
   enum mac_style_flag_t {
     BOLD       = 1u<<0,
     ITALIC     = 1u<<1,
index 778b6c5..d9c9bd3 100644 (file)
@@ -54,35 +54,38 @@ struct _hea
   }
 
   public:
-  FixedVersion<>version;               /* 0x00010000u for version 1.0. */
-  FWORD                ascender;               /* Typographic ascent. */
-  FWORD                descender;              /* Typographic descent. */
-  FWORD                lineGap;                /* Typographic line gap. */
-  UFWORD       advanceMax;             /* Maximum advance width/height value in
-                                        * metrics table. */
-  FWORD                minLeadingBearing;      /* Minimum left/top sidebearing value in
-                                        * metrics table. */
-  FWORD                minTrailingBearing;     /* Minimum right/bottom sidebearing value;
-                                        * calculated as Min(aw - lsb -
-                                        * (xMax - xMin)) for horizontal. */
-  FWORD                maxExtent;              /* horizontal: Max(lsb + (xMax - xMin)),
-                                        * vertical: minLeadingBearing+(yMax-yMin). */
-  HBINT16              caretSlopeRise;         /* Used to calculate the slope of the
-                                        * cursor (rise/run); 1 for vertical caret,
-                                        * 0 for horizontal.*/
-  HBINT16              caretSlopeRun;          /* 0 for vertical caret, 1 for horizontal. */
-  HBINT16              caretOffset;            /* The amount by which a slanted
-                                        * highlight on a glyph needs
-                                        * to be shifted to produce the
-                                        * best appearance. Set to 0 for
-                                        * non-slanted fonts. */
-  HBINT16              reserved1;              /* Set to 0. */
-  HBINT16              reserved2;              /* Set to 0. */
-  HBINT16              reserved3;              /* Set to 0. */
-  HBINT16              reserved4;              /* Set to 0. */
-  HBINT16              metricDataFormat;       /* 0 for current format. */
-  HBUINT16     numberOfLongMetrics;    /* Number of LongMetric entries in metric
-                                        * table. */
+  FixedVersion<>version;       /* 0x00010000u for version 1.0. */
+  FWORD                ascender;       /* Typographic ascent. */
+  FWORD                descender;      /* Typographic descent. */
+  FWORD                lineGap;        /* Typographic line gap. */
+  UFWORD       advanceMax;     /* Maximum advance width/height value in
+                                * metrics table. */
+  FWORD                minLeadingBearing;
+                               /* Minimum left/top sidebearing value in
+                                * metrics table. */
+  FWORD                minTrailingBearing;
+                               /* Minimum right/bottom sidebearing value;
+                                * calculated as Min(aw - lsb -
+                                * (xMax - xMin)) for horizontal. */
+  FWORD                maxExtent;      /* horizontal: Max(lsb + (xMax - xMin)),
+                                * vertical: minLeadingBearing+(yMax-yMin). */
+  HBINT16      caretSlopeRise; /* Used to calculate the slope of the
+                                * cursor (rise/run); 1 for vertical caret,
+                                * 0 for horizontal.*/
+  HBINT16      caretSlopeRun;  /* 0 for vertical caret, 1 for horizontal. */
+  HBINT16      caretOffset;    /* The amount by which a slanted
+                                * highlight on a glyph needs
+                                * to be shifted to produce the
+                                * best appearance. Set to 0 for
+                                * non-slanted fonts. */
+  HBINT16      reserved1;      /* Set to 0. */
+  HBINT16      reserved2;      /* Set to 0. */
+  HBINT16      reserved3;      /* Set to 0. */
+  HBINT16      reserved4;      /* Set to 0. */
+  HBINT16      metricDataFormat;/* 0 for current format. */
+  HBUINT16     numberOfLongMetrics;
+                               /* Number of LongMetric entries in metric
+                                * table. */
   public:
   DEFINE_SIZE_STATIC (36);
 };
index e20b372..4137742 100644 (file)
@@ -169,7 +169,7 @@ struct hmtxvmtx
 
       num_advances = T::is_horizontal ? face->table.hhea->numberOfLongMetrics : face->table.vhea->numberOfLongMetrics;
 
-      table = hb_sanitize_context_t().reference_table<hmtxvmtx> (face, T::tableTag);
+      table = hb_sanitize_context_t ().reference_table<hmtxvmtx> (face, T::tableTag);
 
       /* Cap num_metrics() and num_advances() based on table length. */
       unsigned int len = table.get_length ();
@@ -186,7 +186,7 @@ struct hmtxvmtx
        table = hb_blob_get_empty ();
       }
 
-      var_table = hb_sanitize_context_t().reference_table<HVARVVAR> (face, T::variationsTag);
+      var_table = hb_sanitize_context_t ().reference_table<HVARVVAR> (face, T::variationsTag);
     }
 
     void fini ()
@@ -216,7 +216,7 @@ struct hmtxvmtx
        return side_bearing;
 
       if (var_table.get_length ())
-        return side_bearing + var_table->get_side_bearing_var (glyph, font->coords, font->num_coords); // TODO Optimize?!
+       return side_bearing + var_table->get_side_bearing_var (glyph, font->coords, font->num_coords); // TODO Optimize?!
 
       return _glyf_get_side_bearing_var (font, glyph, T::tableTag == HB_OT_TAG_vmtx);
 #else
@@ -250,7 +250,7 @@ struct hmtxvmtx
        return advance;
 
       if (var_table.get_length ())
-       return advance + roundf (var_table->get_advance_var (font, glyph)); // TODO Optimize?!
+       return advance + roundf (var_table->get_advance_var (glyph, font)); // TODO Optimize?!
 
       return _glyf_get_advance_var (font, glyph, T::tableTag == HB_OT_TAG_vmtx);
 #else
@@ -295,27 +295,29 @@ struct hmtxvmtx
   };
 
   protected:
-  UnsizedArrayOf<LongMetric>longMetricZ;/* Paired advance width and leading
-                                        * bearing values for each glyph. The
-                                        * value numOfHMetrics comes from
-                                        * the 'hhea' table. If the font is
-                                        * monospaced, only one entry need
-                                        * be in the array, but that entry is
-                                        * required. The last entry applies to
-                                        * all subsequent glyphs. */
-/*UnsizedArrayOf<FWORD>        leadingBearingX;*//* Here the advance is assumed
-                                        * to be the same as the advance
-                                        * for the last entry above. The
-                                        * number of entries in this array is
-                                        * derived from numGlyphs (from 'maxp'
-                                        * table) minus numberOfLongMetrics.
-                                        * This generally is used with a run
-                                        * of monospaced glyphs (e.g., Kanji
-                                        * fonts or Courier fonts). Only one
-                                        * run is allowed and it must be at
-                                        * the end. This allows a monospaced
-                                        * font to vary the side bearing
-                                        * values for each glyph. */
+  UnsizedArrayOf<LongMetric>
+               longMetricZ;    /* Paired advance width and leading
+                                * bearing values for each glyph. The
+                                * value numOfHMetrics comes from
+                                * the 'hhea' table. If the font is
+                                * monospaced, only one entry need
+                                * be in the array, but that entry is
+                                * required. The last entry applies to
+                                * all subsequent glyphs. */
+/*UnsizedArrayOf<FWORD>        leadingBearingX;*/
+                               /* Here the advance is assumed
+                                * to be the same as the advance
+                                * for the last entry above. The
+                                * number of entries in this array is
+                                * derived from numGlyphs (from 'maxp'
+                                * table) minus numberOfLongMetrics.
+                                * This generally is used with a run
+                                * of monospaced glyphs (e.g., Kanji
+                                * fonts or Courier fonts). Only one
+                                * run is allowed and it must be at
+                                * the end. This allows a monospaced
+                                * font to vary the side bearing
+                                * values for each glyph. */
   public:
   DEFINE_SIZE_ARRAY (0, longMetricZ);
 };
index 36e5a35..3563cab 100644 (file)
@@ -86,21 +86,26 @@ struct KernSubTableFormat3
   }
 
   protected:
-  KernSubTableHeader   header;
-  HBUINT16             glyphCount;     /* The number of glyphs in this font. */
-  HBUINT8              kernValueCount; /* The number of kerning values. */
-  HBUINT8              leftClassCount; /* The number of left-hand classes. */
-  HBUINT8              rightClassCount;/* The number of right-hand classes. */
-  HBUINT8              flags;          /* Set to zero (reserved for future use). */
-  UnsizedArrayOf<FWORD>        kernValueZ;     /* The kerning values.
-                                        * Length kernValueCount. */
+  KernSubTableHeader
+               header;
+  HBUINT16     glyphCount;     /* The number of glyphs in this font. */
+  HBUINT8      kernValueCount; /* The number of kerning values. */
+  HBUINT8      leftClassCount; /* The number of left-hand classes. */
+  HBUINT8      rightClassCount;/* The number of right-hand classes. */
+  HBUINT8      flags;          /* Set to zero (reserved for future use). */
+  UnsizedArrayOf<FWORD>
+               kernValueZ;     /* The kerning values.
+                                * Length kernValueCount. */
 #if 0
-  UnsizedArrayOf<HBUINT8>leftClass;    /* The left-hand classes.
-                                        * Length glyphCount. */
-  UnsizedArrayOf<HBUINT8>rightClass;   /* The right-hand classes.
-                                        * Length glyphCount. */
-  UnsizedArrayOf<HBUINT8>kernIndex;    /* The indices into the kernValue array.
-                                        * Length leftClassCount * rightClassCount */
+  UnsizedArrayOf<HBUINT8>
+               leftClass;      /* The left-hand classes.
+                                * Length glyphCount. */
+  UnsizedArrayOf<HBUINT8>
+               rightClass;     /* The right-hand classes.
+                                * Length glyphCount. */
+  UnsizedArrayOf<HBUINT8>kernIndex;
+                               /* The indices into the kernValue array.
+                                * Length leftClassCount * rightClassCount */
 #endif
   public:
   DEFINE_SIZE_ARRAY (KernSubTableHeader::static_size + 6, kernValueZ);
@@ -246,8 +251,8 @@ struct KernAATSubTableHeader
   HBUINT8      coverage;       /* Coverage bits. */
   HBUINT8      format;         /* Subtable format. */
   HBUINT16     tupleIndex;     /* The tuple index (used for variations fonts).
-                              * This value specifies which tuple this subtable covers.
-                              * Note: We don't implement. */
+                                * This value specifies which tuple this subtable covers.
+                                * Note: We don't implement. */
   public:
   DEFINE_SIZE_STATIC (8);
 };
index fa08140..fdd1f31 100644 (file)
 #define HB_MAX_LANGSYS 2000
 #endif
 
+#ifndef HB_MAX_FEATURES
+#define HB_MAX_FEATURES 750
+#endif
+
+#ifndef HB_MAX_FEATURE_INDICES
+#define HB_MAX_FEATURE_INDICES 1500
+#endif
+
+#ifndef HB_MAX_LOOKUP_INDICES
+#define HB_MAX_LOOKUP_INDICES  20000
+#endif
+
 
 namespace OT {
 
@@ -73,48 +85,152 @@ static inline void Coverage_serialize (hb_serialize_context_t *c,
 
 template<typename Iterator>
 static inline void ClassDef_serialize (hb_serialize_context_t *c,
-                                       Iterator it);
+                                      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<unsigned> klasses,
-                                          hb_map_t *klass_map /*INOUT*/);
+                                         const hb_set_t &glyphset,
+                                         const hb_map_t &gid_klass_map,
+                                         hb_sorted_vector_t<HBGlyphID> &glyphs,
+                                         const hb_set_t &klasses,
+                                         hb_map_t *klass_map /*INOUT*/);
+
+struct hb_subset_layout_context_t :
+  hb_dispatch_context_t<hb_subset_layout_context_t, hb_empty_t, HB_DEBUG_SUBSET>
+{
+  const char *get_name () { return "SUBSET_LAYOUT"; }
+  static return_t default_return_value () { return hb_empty_t (); }
 
+  bool visitScript ()
+  {
+    return script_count++ < HB_MAX_SCRIPTS;
+  }
+
+  bool visitLangSys ()
+  {
+    return langsys_count++ < HB_MAX_LANGSYS;
+  }
+
+  bool visitFeatureIndex (int count)
+  {
+    feature_index_count += count;
+    return feature_index_count < HB_MAX_FEATURE_INDICES;
+  }
+
+  bool visitLookupIndex()
+  {
+    lookup_index_count++;
+    return lookup_index_count < HB_MAX_LOOKUP_INDICES;
+  }
+
+  hb_subset_context_t *subset_context;
+  const hb_tag_t table_tag;
+  const hb_map_t *lookup_index_map;
+  const hb_map_t *feature_index_map;
+  unsigned debug_depth;
+
+  hb_subset_layout_context_t (hb_subset_context_t *c_,
+                             hb_tag_t tag_,
+                             hb_map_t *lookup_map_,
+                             hb_map_t *feature_map_) :
+                               subset_context (c_),
+                               table_tag (tag_),
+                               lookup_index_map (lookup_map_),
+                               feature_index_map (feature_map_),
+                               debug_depth (0),
+                               script_count (0),
+                               langsys_count (0),
+                               feature_index_count (0),
+                               lookup_index_count (0)
+  {}
+
+  private:
+  unsigned script_count;
+  unsigned langsys_count;
+  unsigned feature_index_count;
+  unsigned lookup_index_count;
+};
+
+struct hb_collect_variation_indices_context_t :
+       hb_dispatch_context_t<hb_collect_variation_indices_context_t, hb_empty_t, 0>
+{
+  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 (); }
+
+  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) {}
+};
 
 template<typename OutputArray>
 struct subset_offset_array_t
 {
-  subset_offset_array_t
-  (hb_subset_context_t *subset_context,
-   OutputArray& out,
-   const void *src_base,
-   const void *dest_base)
-      : _subset_context(subset_context), _out (out), _src_base (src_base), _dest_base (dest_base) {}
+  subset_offset_array_t (hb_subset_context_t *subset_context_,
+                        OutputArray& out_,
+                        const void *base_) : subset_context (subset_context_),
+                                             out (out_), base (base_) {}
+
+  template <typename T>
+  bool operator () (T&& offset)
+  {
+    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)
+    {
+      out.pop ();
+      subset_context->serializer->revert (snap);
+    }
+    return ret;
+  }
+
+  private:
+  hb_subset_context_t *subset_context;
+  OutputArray &out;
+  const void *base;
+};
+
+
+template<typename OutputArray, typename Arg>
+struct subset_offset_array_arg_t
+{
+  subset_offset_array_arg_t (hb_subset_context_t *subset_context_,
+                            OutputArray& out_,
+                            const void *base_,
+                            Arg &&arg_) : subset_context (subset_context_), out (out_),
+                                         base (base_), arg (arg_) {}
 
   template <typename T>
-  bool
-  operator ()
-  (T&& offset)
+  bool operator () (T&& offset)
   {
-    auto *o = _out.serialize_append (_subset_context->serializer);
+    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, _src_base, _dest_base);
+    auto snap = subset_context->serializer->snapshot ();
+    bool ret = o->serialize_subset (subset_context, offset, base, arg);
     if (!ret)
     {
-      _out.pop ();
-      _subset_context->serializer->revert (snap);
+      out.pop ();
+      subset_context->serializer->revert (snap);
     }
     return ret;
   }
 
   private:
-  hb_subset_context_t *_subset_context;
-  OutputArray &_out;
-  const void *_src_base;
-  const void *_dest_base;
+  hb_subset_context_t *subset_context;
+  OutputArray &out;
+  const void *base;
+  Arg &&arg;
 };
 
 /*
@@ -126,16 +242,55 @@ struct
 {
   template<typename OutputArray>
   subset_offset_array_t<OutputArray>
-  operator ()
-  (hb_subset_context_t *subset_context,
-   OutputArray& out,
-   const void *src_base,
-   const void *dest_base) const
+  operator () (hb_subset_context_t *subset_context, OutputArray& out,
+              const void *base) const
+  { return subset_offset_array_t<OutputArray> (subset_context, out, base); }
+
+  /* Variant with one extra argument passed to serialize_subset */
+  template<typename OutputArray, typename Arg>
+  subset_offset_array_arg_t<OutputArray, Arg>
+  operator () (hb_subset_context_t *subset_context, OutputArray& out,
+              const void *base, Arg &&arg) const
+  { return subset_offset_array_arg_t<OutputArray, Arg> (subset_context, out, base, arg); }
+}
+HB_FUNCOBJ (subset_offset_array);
+
+template<typename OutputArray>
+struct subset_record_array_t
+{
+  subset_record_array_t (hb_subset_layout_context_t *c_, OutputArray* out_,
+                        const void *base_) : subset_layout_context (c_),
+                                             out (out_), base (base_) {}
+
+  template <typename T>
+  void
+  operator () (T&& record)
   {
-    return subset_offset_array_t<OutputArray> (subset_context, out, src_base, dest_base);
+    auto snap = subset_layout_context->subset_context->serializer->snapshot ();
+    bool ret = record.subset (subset_layout_context, base);
+    if (!ret) subset_layout_context->subset_context->serializer->revert (snap);
+    else out->len++;
   }
+
+  private:
+  hb_subset_layout_context_t *subset_layout_context;
+  OutputArray *out;
+  const void *base;
+};
+
+/*
+ * Helper to subset a RecordList/record array. Subsets each Record in the array and
+ * discards the record if the subset operation returns false.
+ */
+struct
+{
+  template<typename OutputArray>
+  subset_record_array_t<OutputArray>
+  operator () (hb_subset_layout_context_t *c, OutputArray* out,
+              const void *base) const
+  { return subset_record_array_t<OutputArray> (c, out, base); }
 }
-HB_FUNCOBJ (subset_offset_array);
+HB_FUNCOBJ (subset_record_array);
 
 /*
  *
@@ -153,31 +308,20 @@ struct Record_sanitize_closure_t {
   const void *list_base;
 };
 
-struct RecordList_subset_context_t {
-
-  RecordList_subset_context_t() : script_count (0), langsys_count (0)
-  {}
-
-  bool visitScript ()
-  {
-    return script_count++ < HB_MAX_SCRIPTS;
-  }
-
-  bool visitLangSys ()
-  {
-    return langsys_count++ < HB_MAX_LANGSYS;
-  }
-
-  private:
-  unsigned int script_count;
-  unsigned int langsys_count;
-};
-
 template <typename Type>
 struct Record
 {
   int cmp (hb_tag_t a) const { return tag.cmp (a); }
 
+  bool subset (hb_subset_layout_context_t *c, const void *base) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->subset_context->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+    bool ret = out->offset.serialize_subset (c->subset_context, offset, base, c, &tag);
+    return_trace (ret);
+  }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -226,29 +370,16 @@ struct RecordListOf : RecordArrayOf<Type>
   const Type& operator [] (unsigned int i) const
   { return this+this->get_offset (i); }
 
-  bool subset (hb_subset_context_t *c) const
+  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 (!c->serializer->extend_min (out))) return_trace (false);
 
-    RecordList_subset_context_t record_list_context;
-
-    unsigned int count = this->len;
-    for (unsigned int i = 0; i < count; i++)
-    {
-      auto *record = out->serialize_append (c->serializer);
-      if (unlikely (!record)) return false;
-      auto snap = c->serializer->snapshot ();
-      if (record->offset.serialize_subset (c, this->get_offset (i), this, out, &record_list_context))
-      {
-        record->tag = this->get_tag(i);
-        continue;
-      }
-      out->pop ();
-      c->serializer->revert (snap);
-    }
-
+    + this->iter ()
+    | hb_apply (subset_record_array (l, out, this))
+    ;
     return_trace (true);
   }
 
@@ -259,11 +390,31 @@ struct RecordListOf : RecordArrayOf<Type>
   }
 };
 
+struct Feature;
+
+struct RecordListOfFeature : RecordListOf<Feature>
+{
+  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;
+    + hb_zip (*this, hb_range (count))
+    | hb_filter (l->feature_index_map, hb_second)
+    | hb_map (hb_first)
+    | hb_apply (subset_record_array (l, out, this))
+    ;
+    return_trace (true);
+  }
+};
 
 struct RangeRecord
 {
   int cmp (hb_codepoint_t g) const
-  { return g < start ? -1 : g <= end ? 0 : +1; }
+  { return g < first ? -1 : g <= last ? 0 : +1; }
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -272,14 +423,14 @@ struct RangeRecord
   }
 
   bool intersects (const hb_set_t *glyphs) const
-  { return glyphs->intersects (start, end); }
+  { return glyphs->intersects (first, last); }
 
   template <typename set_t>
-  bool add_coverage (set_t *glyphs) const
-  { return glyphs->add_range (start, end); }
+  bool collect_coverage (set_t *glyphs) const
+  { return glyphs->add_range (first, last); }
 
-  HBGlyphID    start;          /* First GlyphID in the range */
-  HBGlyphID    end;            /* Last GlyphID in the range */
+  HBGlyphID    first;          /* First GlyphID in the range */
+  HBGlyphID    last;           /* Last GlyphID in the range */
   HBUINT16     value;          /* Value */
   public:
   DEFINE_SIZE_STATIC (6);
@@ -289,6 +440,29 @@ DECLARE_NULL_NAMESPACE_BYTES (OT, RangeRecord);
 
 struct IndexArray : ArrayOf<Index>
 {
+  bool intersects (const hb_map_t *indexes) const
+  { return hb_any (*this, indexes); }
+
+  template <typename Iterator,
+           hb_requires (hb_is_iterator (Iterator))>
+  void serialize (hb_serialize_context_t *c,
+                 hb_subset_layout_context_t *l,
+                 Iterator it)
+  {
+    if (!it) return;
+    if (unlikely (!c->extend_min ((*this)))) return;
+
+    for (const auto _ : it)
+    {
+      if (!l->visitLookupIndex()) break;
+
+      Index i;
+      i = _;
+      c->copy (i);
+      this->len++;
+    }
+  }
+
   unsigned int get_indexes (unsigned int start_offset,
                            unsigned int *_count /* IN/OUT */,
                            unsigned int *_indexes /* OUT */) const
@@ -309,10 +483,6 @@ struct IndexArray : ArrayOf<Index>
 };
 
 
-struct Script;
-struct LangSys;
-struct Feature;
-
 struct LangSys
 {
   unsigned int get_feature_count () const
@@ -340,6 +510,42 @@ struct LangSys
     return_trace (c->embed (*this));
   }
 
+  bool operator == (const LangSys& o) const
+  {
+    if (featureIndex.len != o.featureIndex.len ||
+       reqFeatureIndex != o.reqFeatureIndex)
+      return false;
+
+    for (const auto _ : + hb_zip (featureIndex, o.featureIndex))
+      if (_.first != _.second) return false;
+
+    return true;
+  }
+
+  bool subset (hb_subset_context_t        *c,
+              hb_subset_layout_context_t *l,
+              const Tag                  *tag = nullptr) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+
+    out->reqFeatureIndex = l->feature_index_map->has (reqFeatureIndex) ? l->feature_index_map->get (reqFeatureIndex) : 0xFFFFu;
+
+    if (!l->visitFeatureIndex (featureIndex.len))
+      return_trace (false);
+
+    auto it =
+    + hb_iter (featureIndex)
+    | hb_filter (l->feature_index_map)
+    | hb_map (l->feature_index_map)
+    ;
+
+    bool ret = bool (it);
+    out->featureIndex.serialize (c->serializer, l, it);
+    return_trace (ret);
+  }
+
   bool sanitize (hb_sanitize_context_t *c,
                 const Record_sanitize_closure_t * = nullptr) const
   {
@@ -379,34 +585,46 @@ struct Script
   bool has_default_lang_sys () const           { return defaultLangSys != 0; }
   const LangSys& get_default_lang_sys () const { return this+defaultLangSys; }
 
-  bool subset (hb_subset_context_t *c, RecordList_subset_context_t *record_list_context) const
+  bool subset (hb_subset_context_t         *c,
+              hb_subset_layout_context_t  *l,
+              const Tag                   *tag) const
   {
     TRACE_SUBSET (this);
-    if (!record_list_context->visitScript ()) return_trace (false);
+    if (!l->visitScript ()) return_trace (false);
 
     auto *out = c->serializer->start_embed (*this);
-    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
-
-    out->defaultLangSys.serialize_copy (c->serializer, defaultLangSys, this, out);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
 
-    for (const auto &src: langSys)
+    bool defaultLang = false;
+    if (has_default_lang_sys ())
     {
-      if (!record_list_context->visitLangSys ()) {
-        continue;
+      c->serializer->push ();
+      const LangSys& ls = this+defaultLangSys;
+      bool ret = ls.subset (c, l);
+      if (!ret && tag && *tag != HB_TAG ('D', 'F', 'L', 'T'))
+      {
+       c->serializer->pop_discard ();
+       out->defaultLangSys = 0;
       }
-
-      auto snap = c->serializer->snapshot ();
-      auto *lang_sys = c->serializer->embed (src);
-
-      if (likely(lang_sys)
-          && lang_sys->offset.serialize_copy (c->serializer, src.offset, this, out))
+      else
       {
-        out->langSys.len++;
-        continue;
+       c->serializer->add_link (out->defaultLangSys, c->serializer->pop_pack ());
+       defaultLang = true;
       }
-      c->serializer->revert (snap);
     }
-    return_trace (true);
+
+    + 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))
+    ;
+
+    return_trace (bool (out->langSys.len) || defaultLang || l->table_tag == HB_OT_TAG_GSUB);
   }
 
   bool sanitize (hb_sanitize_context_t *c,
@@ -503,6 +721,12 @@ struct FeatureParamsSize
       return_trace (true);
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    return_trace ((bool) c->serializer->embed (*this));
+  }
+
   HBUINT16     designSize;     /* Represents the design size in 720/inch
                                 * units (decipoints).  The design size entry
                                 * must be non-zero.  When there is a design
@@ -553,6 +777,12 @@ struct FeatureParamsStylisticSet
     return_trace (c->check_struct (this));
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    return_trace ((bool) c->serializer->embed (*this));
+  }
+
   HBUINT16     version;        /* (set to 0): This corresponds to a “minor”
                                 * version number. Additional data may be
                                 * added to the end of this Feature Parameters
@@ -586,6 +816,15 @@ struct FeatureParamsCharacterVariants
                  characters.sanitize (c));
   }
 
+  unsigned get_size () const
+  { return min_size + characters.len * HBUINT24::static_size; }
+
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    return_trace ((bool) c->serializer->embed (*this));
+  }
+
   HBUINT16     format;                 /* Format number is set to 0. */
   NameID       featUILableNameID;      /* The ‘name’ table name ID that
                                         * specifies a string (or strings,
@@ -635,6 +874,19 @@ struct FeatureParams
     return_trace (true);
   }
 
+  bool subset (hb_subset_context_t *c, const Tag* tag) const
+  {
+    TRACE_SUBSET (this);
+    if (!tag) return_trace (false);
+    if (*tag == HB_TAG ('s','i','z','e'))
+      return_trace (u.size.subset (c));
+    if ((*tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
+      return_trace (u.stylisticSet.subset (c));
+    if ((*tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
+      return_trace (u.characterVariants.subset (c));
+    return_trace (false);
+  }
+
 #ifndef HB_NO_LAYOUT_FEATURE_PARAMS
   const FeatureParamsSize& get_size_params (hb_tag_t tag) const
   {
@@ -682,13 +934,28 @@ struct Feature
   const FeatureParams &get_feature_params () const
   { return this+featureParams; }
 
-  bool subset (hb_subset_context_t *c, RecordList_subset_context_t *r) const
+  bool intersects_lookup_indexes (const hb_map_t *lookup_indexes) const
+  { return lookupIndex.intersects (lookup_indexes); }
+
+  bool subset (hb_subset_context_t         *c,
+              hb_subset_layout_context_t  *l,
+              const Tag                   *tag = nullptr) const
   {
     TRACE_SUBSET (this);
-    auto *out = c->serializer->embed (*this);
-    if (unlikely (!out)) return_trace (false);
-    out->featureParams = 0; /* TODO(subset) FeatureParams. */
-    return_trace (true);
+    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);
+
+    auto it =
+    + hb_iter (lookupIndex)
+    | hb_filter (l->lookup_index_map)
+    | hb_map (l->lookup_index_map)
+    ;
+
+    out->lookupIndex.serialize (c->serializer, l, it);
+    return_trace (bool (it) || subset_featureParams
+                  || (tag && *tag == HB_TAG ('p', 'r', 'e', 'f')));
   }
 
   bool sanitize (hb_sanitize_context_t *c,
@@ -775,10 +1042,10 @@ struct Lookup
 
   template <typename TSubTable>
   const OffsetArrayOf<TSubTable>& get_subtables () const
-  { return CastR<OffsetArrayOf<TSubTable>> (subTable); }
+  { return reinterpret_cast<const OffsetArrayOf<TSubTable> &> (subTable); }
   template <typename TSubTable>
   OffsetArrayOf<TSubTable>& get_subtables ()
-  { return CastR<OffsetArrayOf<TSubTable>> (subTable); }
+  { return reinterpret_cast<OffsetArrayOf<TSubTable> &> (subTable); }
 
   template <typename TSubTable>
   const TSubTable& get_subtable (unsigned int i) const
@@ -848,17 +1115,17 @@ struct Lookup
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    auto *out = c->serializer->embed (*this);
-    if (unlikely (!out)) return_trace (false);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+    out->lookupType = lookupType;
+    out->lookupFlag = lookupFlag;
 
-    /* Subset the actual subtables. */
-    /* TODO Drop empty ones, either by calling intersects() beforehand,
-     * or just dropping null offsets after. */
-    const OffsetArrayOf<TSubTable>& subtables = get_subtables<TSubTable> ();
-    OffsetArrayOf<TSubTable>& out_subtables = out->get_subtables<TSubTable> ();
-    unsigned int count = subTable.len;
-    for (unsigned int i = 0; i < count; i++)
-      out_subtables[i].serialize_subset (c, subtables[i], this, out, get_type ());
+    const hb_set_t *glyphset = c->plan->glyphset ();
+    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_apply (subset_offset_array (c, out->get_subtables<TSubTable> (), this, lookup_type))
+    ;
 
     return_trace (true);
   }
@@ -868,6 +1135,10 @@ struct Lookup
   {
     TRACE_SANITIZE (this);
     if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
+
+    unsigned subtables = get_subtable_count ();
+    if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
+
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
       const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
@@ -890,8 +1161,7 @@ struct Lookup
        * https://bugs.chromium.org/p/chromium/issues/detail?id=960331
        */
       unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
-      unsigned int count = get_subtable_count ();
-      for (unsigned int i = 1; i < count; i++)
+      for (unsigned int i = 1; i < subtables; i++)
        if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
          return_trace (false);
     }
@@ -912,6 +1182,32 @@ struct Lookup
 
 typedef OffsetListOf<Lookup> LookupList;
 
+template <typename TLookup>
+struct LookupOffsetList : OffsetListOf<TLookup>
+{
+  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;
+    + hb_zip (*this, hb_range (count))
+    | hb_filter (l->lookup_index_map, hb_second)
+    | hb_map (hb_first)
+    | hb_apply (subset_offset_array (c, *out, this))
+    ;
+    return_trace (true);
+  }
+
+  bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (OffsetListOf<TLookup>::sanitize (c, this));
+  }
+};
+
 
 /*
  * Coverage Table
@@ -956,7 +1252,7 @@ struct CoverageFormat1
   { return glyphs->has (glyphArray[index]); }
 
   template <typename set_t>
-  bool add_coverage (set_t *glyphs) const
+  bool collect_coverage (set_t *glyphs) const
   { return glyphs->add_sorted_array (glyphArray.arrayZ, glyphArray.len); }
 
   public:
@@ -993,8 +1289,8 @@ struct CoverageFormat2
   unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
     const RangeRecord &range = rangeRecord.bsearch (glyph_id);
-    return likely (range.start <= range.end) ?
-          (unsigned int) range.value + (glyph_id - range.start) :
+    return likely (range.first <= range.last) ?
+          (unsigned int) range.value + (glyph_id - range.first) :
           NOT_COVERED;
   }
 
@@ -1032,10 +1328,10 @@ struct CoverageFormat2
       if (last + 1 != g)
       {
        range++;
-       rangeRecord[range].start = g;
+       rangeRecord[range].first = g;
        rangeRecord[range].value = count;
       }
-      rangeRecord[range].end = g;
+      rangeRecord[range].last = g;
       last = g;
       count++;
     }
@@ -1065,7 +1361,7 @@ struct CoverageFormat2
     for (i = 0; i < count; i++) {
       const RangeRecord &range = rangeRecord[i];
       if (range.value <= index &&
-         index < (unsigned int) range.value + (range.end - range.start) &&
+         index < (unsigned int) range.value + (range.last - range.first) &&
          range.intersects (glyphs))
        return true;
       else if (index < range.value)
@@ -1075,11 +1371,11 @@ struct CoverageFormat2
   }
 
   template <typename set_t>
-  bool add_coverage (set_t *glyphs) const
+  bool collect_coverage (set_t *glyphs) const
   {
     unsigned int count = rangeRecord.len;
     for (unsigned int i = 0; i < count; i++)
-      if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+      if (unlikely (!rangeRecord[i].collect_coverage (glyphs)))
        return false;
     return true;
   }
@@ -1093,8 +1389,8 @@ struct CoverageFormat2
       c = &c_;
       coverage = 0;
       i = 0;
-      j = c->rangeRecord.len ? c->rangeRecord[0].start : 0;
-      if (unlikely (c->rangeRecord[0].start > c->rangeRecord[0].end))
+      j = c->rangeRecord.len ? c->rangeRecord[0].first : 0;
+      if (unlikely (c->rangeRecord[0].first > c->rangeRecord[0].last))
       {
        /* Broken table. Skip. */
        i = c->rangeRecord.len;
@@ -1104,13 +1400,13 @@ struct CoverageFormat2
     bool more () const { return i < c->rangeRecord.len; }
     void next ()
     {
-      if (j >= c->rangeRecord[i].end)
+      if (j >= c->rangeRecord[i].last)
       {
        i++;
        if (more ())
        {
          unsigned int old = coverage;
-         j = c->rangeRecord[i].start;
+         j = c->rangeRecord[i].first;
          coverage = c->rangeRecord[i].value;
          if (unlikely (coverage != old + 1))
          {
@@ -1246,12 +1542,12 @@ struct Coverage
   /* Might return false if array looks unsorted.
    * Used for faster rejection of corrupt data. */
   template <typename set_t>
-  bool add_coverage (set_t *glyphs) const
+  bool collect_coverage (set_t *glyphs) const
   {
     switch (u.format)
     {
-    case 1: return u.format1.add_coverage (glyphs);
-    case 2: return u.format2.add_coverage (glyphs);
+    case 1: return u.format1.collect_coverage (glyphs);
+    case 2: return u.format2.collect_coverage (glyphs);
     default:return false;
     }
   }
@@ -1259,7 +1555,7 @@ struct Coverage
   struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
   {
     static constexpr bool is_sorted_iterator = true;
-    iter_t (const Coverage &c_ = Null(Coverage))
+    iter_t (const Coverage &c_ = Null (Coverage))
     {
       memset (this, 0, sizeof (*this));
       format = c_.u.format;
@@ -1333,22 +1629,28 @@ struct Coverage
 template<typename Iterator>
 static inline void
 Coverage_serialize (hb_serialize_context_t *c,
-                    Iterator it)
+                   Iterator it)
 { 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<unsigned> klasses,
-                                          hb_map_t *klass_map /*INOUT*/)
+                                         const hb_set_t &glyphset,
+                                         const hb_map_t &gid_klass_map,
+                                         hb_sorted_vector_t<HBGlyphID> &glyphs,
+                                         const hb_set_t &klasses,
+                                         hb_map_t *klass_map /*INOUT*/)
 {
-  bool has_no_match = glyphset.get_population () > gid_klass_map.get_population ();
-  
-  hb_map_t m;
-  if (!klass_map) klass_map = &m;
+  if (!klass_map)
+  {
+    ClassDef_serialize (c, hb_zip (glyphs.iter (), + glyphs.iter ()
+                                                  | hb_map (gid_klass_map)));
+    return;
+  }
+
+  /* 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 ())
+    klass_map->set (0, 0);
 
-  if (has_no_match) klass_map->set (0, 0);
   unsigned idx = klass_map->has (0) ? 1 : 0;
   for (const unsigned k: klasses.iter ())
   {
@@ -1356,17 +1658,16 @@ static void ClassDef_remap_and_serialize (hb_serialize_context_t *c,
     klass_map->set (k, idx);
     idx++;
   }
-  
+
   auto it =
   + glyphs.iter ()
-  | hb_map_retains_sorting ([&] (const HBGlyphID& gid) -> hb_pair_t<hb_codepoint_t, HBUINT16>
-                            {
-                              HBUINT16 new_klass;
-                              new_klass = klass_map->get (gid_klass_map[gid]);
-                              return hb_pair ((hb_codepoint_t)gid, new_klass);
-                            })
+  | hb_map_retains_sorting ([&] (const HBGlyphID& 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);
+                           })
   ;
-  
+
   c->propagate_error (glyphs, klasses);
   ClassDef_serialize (c, it);
 }
@@ -1388,7 +1689,7 @@ struct ClassDefFormat1
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator))>
   bool serialize (hb_serialize_context_t *c,
-                  Iterator it)
+                 Iterator it)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (*this))) return_trace (false);
@@ -1400,21 +1701,31 @@ struct ClassDefFormat1
       return_trace (true);
     }
 
-    startGlyph = (*it).first;
-    classValue.serialize (c, + it
-                             | hb_map (hb_second));
+    hb_codepoint_t glyph_min = (*it).first;
+    hb_codepoint_t glyph_max = + it
+                              | hb_map (hb_first)
+                              | hb_reduce (hb_max, 0u);
+    unsigned glyph_count = glyph_max - glyph_min + 1;
+
+    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)
+    {
+      unsigned idx = gid_klass_pair.first - glyph_min;
+      classValue[idx] = gid_klass_pair.second;
+    }
     return_trace (true);
   }
 
   bool subset (hb_subset_context_t *c,
-               hb_map_t *klass_map = nullptr /*OUT*/) const
+              hb_map_t *klass_map = nullptr /*OUT*/) 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;
-   
+
     hb_sorted_vector_t<HBGlyphID> glyphs;
-    hb_sorted_vector_t<unsigned> orig_klasses;
+    hb_set_t orig_klasses;
     hb_map_t gid_org_klass_map;
 
     hb_codepoint_t start = startGlyph;
@@ -1427,11 +1738,11 @@ struct ClassDefFormat1
 
       glyphs.push (glyph_map[gid]);
       gid_org_klass_map.set (glyph_map[gid], klass);
-      orig_klasses.push (klass);
+      orig_klasses.add (klass);
     }
 
     ClassDef_remap_and_serialize (c->serializer, glyphset, gid_org_klass_map,
-                                  glyphs, orig_klasses, klass_map);
+                                 glyphs, orig_klasses, klass_map);
     return_trace ((bool) glyphs);
   }
 
@@ -1442,7 +1753,7 @@ struct ClassDefFormat1
   }
 
   template <typename set_t>
-  bool add_coverage (set_t *glyphs) const
+  bool collect_coverage (set_t *glyphs) const
   {
     unsigned int start = 0;
     unsigned int count = classValue.len;
@@ -1465,7 +1776,7 @@ struct ClassDefFormat1
   }
 
   template <typename set_t>
-  bool add_class (set_t *glyphs, unsigned int klass) const
+  bool collect_class (set_t *glyphs, unsigned int klass) const
   {
     unsigned int count = classValue.len;
     for (unsigned int i = 0; i < count; i++)
@@ -1524,7 +1835,7 @@ struct ClassDefFormat2
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator))>
   bool serialize (hb_serialize_context_t *c,
-                  Iterator it)
+                 Iterator it)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (*this))) return_trace (false);
@@ -1540,8 +1851,8 @@ struct ClassDefFormat2
     unsigned prev_klass = (*it).second;
 
     RangeRecord range_rec;
-    range_rec.start = prev_gid;
-    range_rec.end = prev_gid;
+    range_rec.first = prev_gid;
+    range_rec.last = prev_gid;
     range_rec.value = prev_klass;
 
     RangeRecord *record = c->copy (range_rec);
@@ -1553,37 +1864,37 @@ struct ClassDefFormat2
       unsigned cur_klass = gid_klass_pair.second;
 
       if (cur_gid != prev_gid + 1 ||
-          cur_klass != prev_klass)
+         cur_klass != prev_klass)
       {
-        if (unlikely (!record)) break;
-        record->end = prev_gid;
-        num_ranges++;
+       if (unlikely (!record)) break;
+       record->last = prev_gid;
+       num_ranges++;
 
-        range_rec.start = cur_gid;
-        range_rec.end = cur_gid;
-        range_rec.value = cur_klass;
+       range_rec.first = cur_gid;
+       range_rec.last = cur_gid;
+       range_rec.value = cur_klass;
 
-        record = c->copy (range_rec);
+       record = c->copy (range_rec);
       }
 
       prev_klass = cur_klass;
       prev_gid = cur_gid;
     }
 
-    if (likely (record)) record->end = prev_gid;
+    if (likely (record)) record->last = prev_gid;
     rangeRecord.len = num_ranges;
     return_trace (true);
   }
 
   bool subset (hb_subset_context_t *c,
-               hb_map_t *klass_map = nullptr /*OUT*/) const
+              hb_map_t *klass_map = nullptr /*OUT*/) 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;
 
     hb_sorted_vector_t<HBGlyphID> glyphs;
-    hb_sorted_vector_t<unsigned> orig_klasses;
+    hb_set_t orig_klasses;
     hb_map_t gid_org_klass_map;
 
     unsigned count = rangeRecord.len;
@@ -1591,19 +1902,19 @@ struct ClassDefFormat2
     {
       unsigned klass = rangeRecord[i].value;
       if (!klass) continue;
-      hb_codepoint_t start = rangeRecord[i].start;
-      hb_codepoint_t end   = rangeRecord[i].end + 1;
+      hb_codepoint_t start = rangeRecord[i].first;
+      hb_codepoint_t end   = rangeRecord[i].last + 1;
       for (hb_codepoint_t g = start; g < end; g++)
       {
        if (!glyphset.has (g)) continue;
        glyphs.push (glyph_map[g]);
-        gid_org_klass_map.set (glyph_map[g], klass);
-        orig_klasses.push (klass);
+       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);
+                                 glyphs, orig_klasses, klass_map);
     return_trace ((bool) glyphs);
   }
 
@@ -1614,24 +1925,24 @@ struct ClassDefFormat2
   }
 
   template <typename set_t>
-  bool add_coverage (set_t *glyphs) const
+  bool collect_coverage (set_t *glyphs) const
   {
     unsigned int count = rangeRecord.len;
     for (unsigned int i = 0; i < count; i++)
       if (rangeRecord[i].value)
-       if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+       if (unlikely (!rangeRecord[i].collect_coverage (glyphs)))
          return false;
     return true;
   }
 
   template <typename set_t>
-  bool add_class (set_t *glyphs, unsigned int klass) const
+  bool collect_class (set_t *glyphs, unsigned int klass) const
   {
     unsigned int count = rangeRecord.len;
     for (unsigned int i = 0; i < count; i++)
     {
       if (rangeRecord[i].value == klass)
-       if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+       if (unlikely (!rangeRecord[i].collect_coverage (glyphs)))
          return false;
     }
     return true;
@@ -1657,9 +1968,9 @@ struct ClassDefFormat2
       {
        if (!hb_set_next (glyphs, &g))
          break;
-       if (g < rangeRecord[i].start)
+       if (g < rangeRecord[i].first)
          return true;
-       g = rangeRecord[i].end;
+       g = rangeRecord[i].last;
       }
       if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g))
        return true;
@@ -1713,7 +2024,7 @@ struct ClassDef
       hb_codepoint_t glyph_min = (*it).first;
       hb_codepoint_t glyph_max = + it
                                 | hb_map (hb_first)
-                                 | hb_reduce (hb_max, 0u);
+                                | hb_reduce (hb_max, 0u);
 
       unsigned num_ranges = 1;
       hb_codepoint_t prev_gid = glyph_min;
@@ -1721,17 +2032,18 @@ struct ClassDef
 
       for (const auto gid_klass_pair : it)
       {
-        hb_codepoint_t cur_gid = gid_klass_pair.first;
-        unsigned cur_klass = gid_klass_pair.second;
-        if (cur_gid != prev_gid + 1 ||
-            cur_klass != prev_klass)
-          num_ranges++;
-
-        prev_gid = cur_gid;
-        prev_klass = cur_klass;
+       hb_codepoint_t cur_gid = gid_klass_pair.first;
+       unsigned cur_klass = gid_klass_pair.second;
+       if (cur_gid == glyph_min || !cur_klass) continue;
+       if (cur_gid != prev_gid + 1 ||
+           cur_klass != prev_klass)
+         num_ranges++;
+
+       prev_gid = cur_gid;
+       prev_klass = cur_klass;
       }
 
-      if (1 + (glyph_max - glyph_min + 1) < num_ranges * 3)
+      if (1 + (glyph_max - glyph_min + 1) <= num_ranges * 3)
        format = 1;
     }
     u.format = format;
@@ -1745,7 +2057,7 @@ struct ClassDef
   }
 
   bool subset (hb_subset_context_t *c,
-               hb_map_t *klass_map = nullptr /*OUT*/) const
+              hb_map_t *klass_map = nullptr /*OUT*/) const
   {
     TRACE_SUBSET (this);
     switch (u.format) {
@@ -1769,11 +2081,11 @@ struct ClassDef
   /* Might return false if array looks unsorted.
    * Used for faster rejection of corrupt data. */
   template <typename set_t>
-  bool add_coverage (set_t *glyphs) const
+  bool collect_coverage (set_t *glyphs) const
   {
     switch (u.format) {
-    case 1: return u.format1.add_coverage (glyphs);
-    case 2: return u.format2.add_coverage (glyphs);
+    case 1: return u.format1.collect_coverage (glyphs);
+    case 2: return u.format2.collect_coverage (glyphs);
     default:return false;
     }
   }
@@ -1781,11 +2093,11 @@ struct ClassDef
   /* Might return false if array looks unsorted.
    * Used for faster rejection of corrupt data. */
   template <typename set_t>
-  bool add_class (set_t *glyphs, unsigned int klass) const
+  bool collect_class (set_t *glyphs, unsigned int klass) const
   {
     switch (u.format) {
-    case 1: return u.format1.add_class (glyphs, klass);
-    case 2: return u.format2.add_class (glyphs, klass);
+    case 1: return u.format1.collect_class (glyphs, klass);
+    case 2: return u.format2.collect_class (glyphs, klass);
     default:return false;
     }
   }
@@ -1819,7 +2131,7 @@ struct ClassDef
 
 template<typename Iterator>
 static inline void ClassDef_serialize (hb_serialize_context_t *c,
-                                       Iterator it)
+                                      Iterator it)
 { c->start_embed<ClassDef> ()->serialize (c, it); }
 
 
@@ -1906,8 +2218,13 @@ struct VarRegionList
     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 ();
     for (unsigned int r = 0; r < regionCount; r++)
-      memcpy (&axesZ[axisCount * r], &src->axesZ[axisCount * region_map.backward (r)], VarRegionAxis::static_size * axisCount);
+    {
+      unsigned int backward = region_map.backward (r);
+      if (backward >= region_count) return_trace (false);
+      memcpy (&axesZ[axisCount * r], &src->axesZ[axisCount * backward], VarRegionAxis::static_size * axisCount);
+    }
 
     return_trace (true);
   }
@@ -1967,7 +2284,7 @@ struct VarData
    return delta;
   }
 
-  void get_scalars (int *coords, unsigned int coord_count,
+  void get_scalars (const int *coords, unsigned int coord_count,
                    const VarRegionList &regions,
                    float *scalars /*OUT */,
                    unsigned int num_scalars) const
@@ -2031,8 +2348,8 @@ struct VarData
     for (r = 0; r < ri_count; r++)
       if (delta_sz[r])
       {
-       ri_map[r] = (delta_sz[r] == kShort)? short_index++ : byte_index++;
-       new_ri_count++;
+       ri_map[r] = (delta_sz[r] == kShort)? short_index++ : byte_index++;
+       new_ri_count++;
       }
 
     shortCount = new_short_count;
@@ -2145,7 +2462,7 @@ struct VariationStore
 
   bool serialize (hb_serialize_context_t *c,
                  const VariationStore *src,
-                 const hb_array_t <hb_inc_bimap_t> &inner_maps)
+                 const hb_array_t <hb_inc_bimap_t> &inner_maps)
   {
     TRACE_SERIALIZE (this);
     unsigned int set_count = 0;
@@ -2180,11 +2497,46 @@ struct VariationStore
     return_trace (true);
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+
+    VariationStore *varstore_prime = c->serializer->start_embed<VariationStore> ();
+    if (unlikely (!varstore_prime)) return_trace (false);
+
+    const hb_set_t *variation_indices = c->plan->layout_variation_indices;
+    if (variation_indices->is_empty ()) return_trace (false);
+
+    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 ())
+    {
+      uint16_t major = idx >> 16;
+      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);
+      }
+      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));
+  }
+
   unsigned int get_region_index_count (unsigned int ivs) const
   { return (this+dataSets[ivs]).get_region_index_count (); }
 
   void get_scalars (unsigned int ivs,
-                   int *coords, unsigned int coord_count,
+                   const int *coords, unsigned int coord_count,
                    float *scalars /*OUT*/,
                    unsigned int num_scalars) const
   {
@@ -2216,6 +2568,14 @@ struct ConditionFormat1
 {
   friend struct Condition;
 
+  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 (true);
+  }
+
   private:
   bool evaluate (const int *coords, unsigned int coord_len) const
   {
@@ -2248,6 +2608,17 @@ struct Condition
     }
   }
 
+  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, hb_forward<Ts> (ds)...));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -2278,6 +2649,18 @@ struct ConditionSet
     return true;
   }
 
+  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);
+
+    + conditions.iter ()
+    | hb_apply (subset_offset_array (c, out->conditions, this))
+    ;
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -2294,6 +2677,30 @@ struct FeatureTableSubstitutionRecord
 {
   friend struct FeatureTableSubstitution;
 
+  void collect_lookups (const void *base, hb_set_t *lookup_indexes /* OUT */) const
+  {
+    return (base+feature).add_lookup_indexes_to (lookup_indexes);
+  }
+
+  void closure_features (const void *base,
+                        const hb_map_t *lookup_indexes,
+                        hb_set_t       *feature_indexes /* OUT */) const
+  {
+    if ((base+feature).intersects_lookup_indexes (lookup_indexes))
+      feature_indexes->add (featureIndex);
+  }
+
+  bool subset (hb_subset_layout_context_t *c, const void *base) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->subset_context->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    out->featureIndex = c->feature_index_map->get (featureIndex);
+    bool ret = out->feature.serialize_subset (c->subset_context, feature, base, c);
+    return_trace (ret);
+  }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -2321,6 +2728,39 @@ struct FeatureTableSubstitution
     return nullptr;
   }
 
+  void collect_lookups (const hb_set_t *feature_indexes,
+                       hb_set_t       *lookup_indexes /* OUT */) const
+  {
+    + hb_iter (substitutions)
+    | hb_filter (feature_indexes, &FeatureTableSubstitutionRecord::featureIndex)
+    | hb_apply ([this, lookup_indexes] (const FeatureTableSubstitutionRecord& r)
+               { r.collect_lookups (this, lookup_indexes); })
+    ;
+  }
+
+  void closure_features (const hb_map_t *lookup_indexes,
+                        hb_set_t       *feature_indexes /* OUT */) const
+  {
+    for (const FeatureTableSubstitutionRecord& record : substitutions)
+      record.closure_features (this, lookup_indexes, feature_indexes);
+  }
+
+  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);
+
+    out->version.major = version.major;
+    out->version.minor = version.minor;
+
+    + substitutions.iter ()
+    | hb_apply (subset_record_array (l, &(out->substitutions), this))
+    ;
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -2341,6 +2781,32 @@ struct FeatureVariationRecord
 {
   friend struct FeatureVariations;
 
+  void collect_lookups (const void     *base,
+                       const hb_set_t *feature_indexes,
+                       hb_set_t       *lookup_indexes /* OUT */) const
+  {
+    return (base+substitutions).collect_lookups (feature_indexes, lookup_indexes);
+  }
+
+  void closure_features (const void     *base,
+                        const hb_map_t *lookup_indexes,
+                        hb_set_t       *feature_indexes /* OUT */) const
+  {
+    (base+substitutions).closure_features (lookup_indexes, feature_indexes);
+  }
+
+  bool subset (hb_subset_layout_context_t *c, const void *base) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->subset_context->serializer->embed (this);
+    if (unlikely (!out)) return_trace (false);
+
+    out->conditions.serialize_subset (c->subset_context, conditions, base);
+    out->substitutions.serialize_subset (c->subset_context, substitutions, base, c);
+
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -2391,6 +2857,36 @@ struct FeatureVariations
     return_trace (c->embed (*this));
   }
 
+  void collect_lookups (const hb_set_t *feature_indexes,
+                       hb_set_t       *lookup_indexes /* OUT */) const
+  {
+    for (const FeatureVariationRecord& r : varRecords)
+      r.collect_lookups (this, feature_indexes, lookup_indexes);
+  }
+
+  void closure_features (const hb_map_t *lookup_indexes,
+                        hb_set_t       *feature_indexes /* OUT */) const
+  {
+    for (const FeatureVariationRecord& record : varRecords)
+      record.closure_features (this, lookup_indexes, feature_indexes);
+  }
+
+  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);
+
+    out->version.major = version.major;
+    out->version.minor = version.minor;
+
+    + varRecords.iter ()
+    | hb_apply (subset_record_array (l, &(out->varRecords), this))
+    ;
+    return_trace (bool (out->varRecords));
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -2506,10 +3002,30 @@ struct VariationDevice
   hb_position_t get_y_delta (hb_font_t *font, const VariationStore &store) const
   { return font->em_scalef_y (get_delta (font, store)); }
 
-  VariationDevice* copy (hb_serialize_context_t *c) const
+  VariationDevice* copy (hb_serialize_context_t *c, const hb_map_t *layout_variation_idx_map) const
   {
     TRACE_SERIALIZE (this);
-    return_trace (c->embed<VariationDevice> (this));
+    auto snap = c->snapshot ();
+    auto *out = c->embed (this);
+    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))
+    {
+      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;
+    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);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -2597,7 +3113,7 @@ struct Device
     }
   }
 
-  Device* copy (hb_serialize_context_t *c) const
+  Device* copy (hb_serialize_context_t *c, const hb_map_t *layout_variation_idx_map=nullptr) const
   {
     TRACE_SERIALIZE (this);
     switch (u.b.format) {
@@ -2609,13 +3125,32 @@ struct Device
 #endif
 #ifndef HB_NO_VAR
     case 0x8000:
-      return_trace (reinterpret_cast<Device *> (u.variation.copy (c)));
+      return_trace (reinterpret_cast<Device *> (u.variation.copy (c, layout_variation_idx_map)));
 #endif
     default:
       return_trace (nullptr);
     }
   }
 
+  void collect_variation_indices (hb_set_t *layout_variation_indices) const
+  {
+    switch (u.b.format) {
+#ifndef HB_NO_HINTING
+    case 1:
+    case 2:
+    case 3:
+      return;
+#endif
+#ifndef HB_NO_VAR
+    case 0x8000:
+      u.variation.record_variation_index (layout_variation_indices);
+      return;
+#endif
+    default:
+      return;
+    }
+  }
+
   protected:
   union {
   DeviceHeader         b;
index dc751d8..02f4ab0 100644 (file)
@@ -41,8 +41,18 @@ namespace OT {
  * Attachment List Table
  */
 
-typedef ArrayOf<HBUINT16> AttachPoint; /* Array of contour point indices--in
-                                        * increasing numerical order */
+/* Array of contour point indices--in increasing numerical order */
+struct AttachPoint : ArrayOf<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 ()));
+  }
+};
 
 struct AttachList
 {
@@ -72,6 +82,28 @@ struct AttachList
     return points.len;
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->glyphset ();
+    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, attachPoint)
+    | hb_filter (glyphset, hb_first)
+    | hb_filter (subset_offset_array (c, out->attachPoint, this), hb_second)
+    | hb_map (hb_first)
+    | hb_map (glyph_map)
+    | hb_sink (new_coverage)
+    ;
+    out->coverage.serialize (c->serializer, out)
+                .serialize (c->serializer, new_coverage.iter ());
+    return_trace (bool (new_coverage));
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -96,6 +128,13 @@ struct AttachList
 struct CaretValueFormat1
 {
   friend struct CaretValue;
+  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 (true);
+  }
 
   private:
   hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction) const
@@ -119,6 +158,13 @@ struct CaretValueFormat1
 struct CaretValueFormat2
 {
   friend struct CaretValue;
+  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 (true);
+  }
 
   private:
   hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id) const
@@ -153,6 +199,19 @@ struct CaretValueFormat3
           font->em_scale_y (coordinate) + (this+deviceTable).get_y_delta (font, var_store);
   }
 
+  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->deviceTable.serialize_copy (c->serializer, deviceTable, this, c->serializer->to_bias (out),
+                                                   hb_serialize_context_t::Head, c->plan->layout_variation_idx_map));
+  }
+
+  void collect_variation_indices (hb_set_t *layout_variation_indices) const
+  { (this+deviceTable).collect_variation_indices (layout_variation_indices); }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -185,6 +244,32 @@ struct CaretValue
     }
   }
 
+  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, 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)...));
+    default:return_trace (c->default_return_value ());
+    }
+  }
+
+  void collect_variation_indices (hb_set_t *layout_variation_indices) const
+  {
+    switch (u.format) {
+    case 1:
+    case 2:
+      return;
+    case 3:
+      u.format3.collect_variation_indices (layout_variation_indices);
+      return;
+    default: return;
+    }
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -210,25 +295,45 @@ struct CaretValue
 
 struct LigGlyph
 {
-  unsigned int get_lig_carets (hb_font_t *font,
-                              hb_direction_t direction,
-                              hb_codepoint_t glyph_id,
-                              const VariationStore &var_store,
-                              unsigned int start_offset,
-                              unsigned int *caret_count /* IN/OUT */,
-                              hb_position_t *caret_array /* OUT */) const
+  unsigned get_lig_carets (hb_font_t            *font,
+                          hb_direction_t        direction,
+                          hb_codepoint_t        glyph_id,
+                          const VariationStore &var_store,
+                          unsigned              start_offset,
+                          unsigned             *caret_count /* IN/OUT */,
+                          hb_position_t        *caret_array /* OUT */) const
   {
     if (caret_count)
     {
-      hb_array_t <const OffsetTo<CaretValue>> array = carets.sub_array (start_offset, caret_count);
-      unsigned int count = array.length;
-      for (unsigned int i = 0; i < count; i++)
-       caret_array[i] = (this+array[i]).get_caret_value (font, direction, glyph_id, var_store);
+      + carets.sub_array (start_offset, caret_count)
+      | hb_map (hb_add (this))
+      | hb_map ([&] (const CaretValue &value) { return value.get_caret_value (font, direction, glyph_id, var_store); })
+      | hb_sink (hb_array (caret_array, *caret_count))
+      ;
     }
 
     return carets.len;
   }
 
+  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);
+
+    + hb_iter (carets)
+    | hb_apply (subset_offset_array (c, out->carets, this))
+    ;
+
+    return_trace (bool (out->carets));
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    for (const OffsetTo<CaretValue>& offset : carets.iter ())
+      (this+offset).collect_variation_indices (c->layout_variation_indices);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -265,6 +370,38 @@ struct LigCaretList
     return lig_glyph.get_lig_carets (font, direction, glyph_id, var_store, start_offset, caret_count, caret_array);
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->glyphset ();
+    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, ligGlyph)
+    | hb_filter (glyphset, hb_first)
+    | hb_filter (subset_offset_array (c, out->ligGlyph, this), hb_second)
+    | hb_map (hb_first)
+    | hb_map (glyph_map)
+    | hb_sink (new_coverage)
+    ;
+    out->coverage.serialize (c->serializer, out)
+                .serialize (c->serializer, new_coverage.iter ());
+    return_trace (bool (new_coverage));
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    + hb_zip (this+coverage, ligGlyph)
+    | hb_filter (c->glyph_set, hb_first)
+    | hb_map (hb_second)
+    | hb_map (hb_add (this))
+    | hb_apply ([c] (const LigGlyph& _) { _.collect_variation_indices (c); })
+    ;
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -288,6 +425,34 @@ struct MarkGlyphSetsFormat1
   bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
   { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; }
 
+  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->format = format;
+
+    bool ret = true;
+    for (const LOffsetTo<Coverage>& offset : coverage.iter ())
+    {
+      auto *o = out->coverage.serialize_append (c->serializer);
+      if (unlikely (!o))
+      {
+       ret = false;
+       break;
+      }
+
+      //not using o->serialize_subset (c, offset, this, out) here because
+      //OTS doesn't allow null offset.
+      //See issue: https://github.com/khaledhosny/ots/issues/172
+      c->serializer->push ();
+      c->dispatch (this+offset);
+      c->serializer->add_link (*o, c->serializer->pop_pack ());
+    }
+
+    return_trace (ret && out->coverage.len);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -313,6 +478,15 @@ struct MarkGlyphSets
     }
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    switch (u.format) {
+    case 1: return_trace (u.format1.subset (c));
+    default:return_trace (false);
+    }
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -356,7 +530,7 @@ struct GDEF
   unsigned int get_glyph_class (hb_codepoint_t glyph) const
   { return (this+glyphClassDef).get_class (glyph); }
   void get_glyphs_in_class (unsigned int klass, hb_set_t *glyphs) const
-  { (this+glyphClassDef).add_class (glyphs, klass); }
+  { (this+glyphClassDef).collect_class (glyphs, klass); }
 
   bool has_mark_attachment_types () const { return markAttachClassDef != 0; }
   unsigned int get_mark_attachment_type (hb_codepoint_t glyph) const
@@ -386,7 +560,7 @@ struct GDEF
 
   bool has_var_store () const { return version.to_int () >= 0x00010003u && varStore != 0; }
   const VariationStore &get_var_store () const
-  { return version.to_int () >= 0x00010003u ? this+varStore : Null(VariationStore); }
+  { return version.to_int () >= 0x00010003u ? this+varStore : Null (VariationStore); }
 
   /* glyph_props is a 16-bit integer where the lower 8-bit have bits representing
    * glyph class and other bits, and high 8-bit the mark attachment type (if any).
@@ -416,7 +590,7 @@ struct GDEF
   {
     void init (hb_face_t *face)
     {
-      this->table = hb_sanitize_context_t().reference_table<GDEF> (face);
+      this->table = hb_sanitize_context_t ().reference_table<GDEF> (face);
       if (unlikely (this->table->is_blacklisted (this->table.get_blob (), face)))
       {
        hb_blob_destroy (this->table.get_blob ());
@@ -436,24 +610,66 @@ struct GDEF
           (version.to_int () >= 0x00010003u ? varStore.static_size : 0);
   }
 
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  { (this+ligCaretList).collect_variation_indices (c); }
+
+  void remap_layout_variation_indices (const hb_set_t *layout_variation_indices,
+                                      hb_map_t *layout_variation_idx_map /* OUT */) const
+  {
+    if (version.to_int () < 0x00010003u || !varStore) return;
+    if (layout_variation_indices->is_empty ()) return;
+
+    unsigned new_major = 0, new_minor = 0;
+    unsigned last_major = (layout_variation_indices->get_min ()) >> 16;
+    for (unsigned idx : layout_variation_indices->iter ())
+    {
+      uint16_t major = idx >> 16;
+      if (major >= (this+varStore).get_sub_table_count ()) break;
+      if (major != last_major)
+      {
+        new_minor = 0;
+        ++new_major;
+      }
+
+      unsigned new_idx = (new_major << 16) + new_minor;
+      layout_variation_idx_map->set (idx, new_idx);
+      ++new_minor;
+      last_major = major;
+    }
+  }
+
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
     auto *out = c->serializer->embed (*this);
     if (unlikely (!out)) return_trace (false);
 
-    out->glyphClassDef.serialize_subset (c, glyphClassDef, this, out);
-    out->attachList = 0;//TODO(subset) serialize_subset (c, attachList, this, out);
-    out->ligCaretList = 0;//TODO(subset) serialize_subset (c, ligCaretList, this, out);
-    out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this, out);
+    bool subset_glyphclassdef = out->glyphClassDef.serialize_subset (c, glyphClassDef, this);
+    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_markglyphsetsdef = true;
     if (version.to_int () >= 0x00010002u)
-      out->markGlyphSetsDef = 0;// TODO(subset) serialize_subset (c, markGlyphSetsDef, this, out);
+    {
+      subset_markglyphsetsdef = out->markGlyphSetsDef.serialize_subset (c, markGlyphSetsDef, this);
+      if (!subset_markglyphsetsdef &&
+          version.to_int () == 0x00010002u)
+        out->version.minor = 0;
+    }
 
+    bool subset_varstore = true;
     if (version.to_int () >= 0x00010003u)
-      out->varStore = 0;// TODO(subset) serialize_subset (c, varStore, this, out);
+    {
+      subset_varstore = out->varStore.serialize_subset (c, varStore, this);
+      if (!subset_varstore && version.to_int () == 0x00010003u)
+        out->version.minor = 2;
+    }
 
-    return_trace (true);
+    return_trace (subset_glyphclassdef || subset_attachlist ||
+                  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
index 024312d..fef88af 100644 (file)
 
 namespace OT {
 
+struct MarkArray;
+static void Markclass_closure_and_remap_indexes (const Coverage  &mark_coverage,
+                                                const MarkArray &mark_array,
+                                                const hb_set_t  &glyphset,
+                                                hb_map_t*        klass_mapping /* INOUT */);
 
 /* buffer **position** var allocations */
 #define attach_chain() var.i16[0] /* glyph to which this attaches to, relative to current glyphs; negative for going back, positive for forward. */
@@ -155,6 +160,60 @@ 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 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 & xPlaDevice) copy_device (c, base, values++, layout_variation_idx_map);
+    if (format & yPlaDevice) copy_device (c, base, values++, layout_variation_idx_map);
+    if (format & xAdvDevice) copy_device (c, base, values++, layout_variation_idx_map);
+    if (format & yAdvDevice) copy_device (c, base, values++, layout_variation_idx_map);
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c,
+                                  const void *base,
+                                  const hb_array_t<const Value>& values) const
+  {
+    unsigned format = *this;
+    unsigned i = 0;
+    if (format & xPlacement) i++;
+    if (format & yPlacement) i++;
+    if (format & xAdvance) i++;
+    if (format & yAdvance) i++;
+    if (format & xPlaDevice)
+    {
+      (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices);
+      i++;
+    }
+
+    if (format & ValueFormat::yPlaDevice)
+    {
+      (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices);
+      i++;
+    }
+
+    if (format & ValueFormat::xAdvDevice)
+    {
+
+      (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices);
+      i++;
+    }
+
+    if (format & ValueFormat::yAdvDevice)
+    {
+
+      (base + get_device (&(values[i]))).collect_variation_indices (c->layout_variation_indices);
+      i++;
+    }
+  }
+
   private:
   bool sanitize_value_devices (hb_sanitize_context_t *c, const void *base, const Value *values) const
   {
@@ -173,18 +232,42 @@ struct ValueFormat : HBUINT16
     return true;
   }
 
-  HB_INTERNAL static OffsetTo<Device>& get_device (Value* value)
-  { return *CastP<OffsetTo<Device>> (value); }
-  HB_INTERNAL static const OffsetTo<Device>& get_device (const Value* value, bool *worked=nullptr)
+  static inline OffsetTo<Device>& get_device (Value* value)
+  {
+    return *static_cast<OffsetTo<Device> *> (value);
+  }
+  static inline const OffsetTo<Device>& get_device (const Value* value, bool *worked=nullptr)
   {
     if (worked) *worked |= bool (*value);
-    return *CastP<OffsetTo<Device>> (value);
+    return *static_cast<const OffsetTo<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
+  {
+    Value      *dst_value = c->copy (*src_value);
+
+    if (!dst_value) return false;
+    if (*dst_value == 0) return true;
+
+    *dst_value = 0;
+    c->push ();
+    if ((base + get_device (src_value)).copy (c, layout_variation_idx_map))
+    {
+      c->add_link (*dst_value, c->pop_pack ());
+      return true;
+    }
+    else
+    {
+      c->pop_discard ();
+      return false;
+    }
   }
 
-  HB_INTERNAL static const HBINT16& get_short (const Value* value, bool *worked=nullptr)
+  static inline const HBINT16& get_short (const Value* value, bool *worked=nullptr)
   {
     if (worked) *worked |= bool (*value);
-    return *CastP<HBINT16> (value);
+    return *reinterpret_cast<const HBINT16 *> (value);
   }
 
   public:
@@ -237,9 +320,11 @@ struct ValueFormat : HBUINT16
 };
 
 template<typename Iterator>
-static inline void SinglePos_serialize (hb_serialize_context_t *c,
-                                       Iterator it,
-                                       ValueFormat valFormat);
+static void SinglePos_serialize (hb_serialize_context_t *c,
+                                const void *src,
+                                Iterator it,
+                                ValueFormat valFormat,
+                                 const hb_map_t *layout_variation_idx_map);
 
 
 struct AnchorFormat1
@@ -338,17 +423,26 @@ struct AnchorFormat3
     return_trace (c->check_struct (this) && xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this));
   }
 
-  AnchorFormat3* copy (hb_serialize_context_t *c) const
+  AnchorFormat3* copy (hb_serialize_context_t *c,
+                      const hb_map_t *layout_variation_idx_map) const
   {
     TRACE_SERIALIZE (this);
+    if (!layout_variation_idx_map) return_trace (nullptr);
+
     auto *out = c->embed<AnchorFormat3> (this);
     if (unlikely (!out)) return_trace (nullptr);
 
-    out->xDeviceTable.serialize_copy (c, xDeviceTable, this, out);
-    out->yDeviceTable.serialize_copy (c, yDeviceTable, this, out);
+    out->xDeviceTable.serialize_copy (c, xDeviceTable, this, 0, hb_serialize_context_t::Head, layout_variation_idx_map);
+    out->yDeviceTable.serialize_copy (c, yDeviceTable, this, 0, hb_serialize_context_t::Head, layout_variation_idx_map);
     return_trace (out);
   }
 
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    (this+xDeviceTable).collect_variation_indices (c->layout_variation_indices);
+    (this+yDeviceTable).collect_variation_indices (c->layout_variation_indices);
+  }
+
   protected:
   HBUINT16     format;                 /* Format identifier--format = 3 */
   FWORD                xCoordinate;            /* Horizontal value--in design units */
@@ -391,17 +485,29 @@ struct Anchor
     }
   }
 
-  Anchor* copy (hb_serialize_context_t *c) const
+  Anchor* copy (hb_serialize_context_t *c, const hb_map_t *layout_variation_idx_map) const
   {
     TRACE_SERIALIZE (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)));
+    case 3: return_trace (reinterpret_cast<Anchor *> (u.format3.copy (c, layout_variation_idx_map)));
     default:return_trace (nullptr);
     }
   }
 
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    switch (u.format) {
+    case 1: case 2:
+      return;
+    case 3:
+      u.format3.collect_variation_indices (c);
+      return;
+    default: return;
+    }
+  }
+
   protected:
   union {
   HBUINT16             format;         /* Format identifier */
@@ -420,11 +526,46 @@ struct AnchorMatrix
                            unsigned int cols, bool *found) const
   {
     *found = false;
-    if (unlikely (row >= rows || col >= cols)) return Null(Anchor);
+    if (unlikely (row >= rows || col >= cols)) return Null (Anchor);
     *found = !matrixZ[row * cols + col].is_null ();
     return this+matrixZ[row * cols + col];
   }
 
+  template <typename Iterator,
+           hb_requires (hb_is_iterator (Iterator))>
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c,
+                                 Iterator index_iter) const
+  {
+    for (unsigned i : index_iter)
+      (this+matrixZ[i]).collect_variation_indices (c);
+  }
+
+  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)
+  {
+    TRACE_SERIALIZE (this);
+    if (!index_iter.len ()) return_trace (false);
+    if (unlikely (!c->extend_min ((*this))))  return_trace (false);
+
+    this->rows = num_rows;
+    for (const unsigned i : index_iter)
+    {
+      auto *offset = c->embed (offset_matrix->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);
+    }
+
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c, unsigned int cols) const
   {
     TRACE_SANITIZE (this);
@@ -438,7 +579,6 @@ struct AnchorMatrix
   }
 
   HBUINT16     rows;                   /* Number of rows */
-  protected:
   UnsizedArrayOf<OffsetTo<Anchor>>
                matrixZ;                /* Matrix of offsets to Anchor tables--
                                         * from beginning of AnchorMatrix table */
@@ -451,12 +591,34 @@ struct MarkRecord
 {
   friend struct MarkArray;
 
+  unsigned get_class () const { return (unsigned) klass; }
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
     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
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->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);
+    return_trace (out);
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c,
+                                 const void *src_base) const
+  {
+    (src_base+markAnchor).collect_variation_indices (c);
+  }
+
   protected:
   HBUINT16     klass;                  /* Class defined for this mark */
   OffsetTo<Anchor>
@@ -502,6 +664,21 @@ 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)
+  {
+    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);
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -517,8 +694,22 @@ struct SinglePosFormat1
   bool intersects (const hb_set_t *glyphs) const
   { return (this+coverage).intersects (glyphs); }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+  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)
+    ;
+
+    if (!it) return;
+    valueFormat.collect_variation_indices (c, this, values.as_array (valueFormat.get_len ()));
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
-  { if (unlikely (!(this+coverage).add_coverage (c->input))) return; }
+  { if (unlikely (!(this+coverage).collect_coverage (c->input))) return; }
 
   const Coverage &get_coverage () const { return this+coverage; }
 
@@ -538,14 +729,20 @@ struct SinglePosFormat1
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator))>
   void serialize (hb_serialize_context_t *c,
+                 const void *src,
                  Iterator it,
-                 ValueFormat valFormat)
+                 ValueFormat valFormat,
+                  const hb_map_t *layout_variation_idx_map)
   {
-    if (unlikely (!c->extend_min (*this))) return;
+    auto out = c->extend_min (*this);
+    if (unlikely (!out)) return;
     if (unlikely (!c->check_assign (valueFormat, valFormat))) return;
 
-    for (const auto &_ : hb_second (*it))
-      c->copy (_);
+    + it
+    | hb_map (hb_second)
+    | hb_apply ([&] (hb_array_t<const Value> _)
+               { valFormat.serialize_copy (c, src, &_, layout_variation_idx_map); })
+    ;
 
     auto glyphs =
     + it
@@ -569,7 +766,7 @@ struct SinglePosFormat1
     ;
 
     bool ret = bool (it);
-    SinglePos_serialize (c->serializer, it, valueFormat);
+    SinglePos_serialize (c->serializer, this, it, valueFormat, c->plan->layout_variation_idx_map);
     return_trace (ret);
   }
 
@@ -600,8 +797,29 @@ struct SinglePosFormat2
   bool intersects (const hb_set_t *glyphs) const
   { return (this+coverage).intersects (glyphs); }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+  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)
+    ;
+
+    if (!it) return;
+
+    unsigned sub_length = valueFormat.get_len ();
+    const hb_array_t<const Value> values_array = values.as_array (valueCount * sub_length);
+
+    for (unsigned i : + it
+                      | hb_map (hb_second))
+      valueFormat.collect_variation_indices (c, this, values_array.sub_array (i * sub_length, sub_length));
+
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
-  { if (unlikely (!(this+coverage).add_coverage (c->input))) return; }
+  { if (unlikely (!(this+coverage).collect_coverage (c->input))) return; }
 
   const Coverage &get_coverage () const { return this+coverage; }
 
@@ -625,16 +843,21 @@ struct SinglePosFormat2
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator))>
   void serialize (hb_serialize_context_t *c,
+                 const void *src,
                  Iterator it,
-                 ValueFormat valFormat)
+                 ValueFormat valFormat,
+                  const hb_map_t *layout_variation_idx_map)
   {
-    if (unlikely (!c->extend_min (*this))) return;
+    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;
 
-    for (const auto iter : it)
-      for (const auto &_ : iter.second)
-       c->copy (_);
+    + it
+    | hb_map (hb_second)
+    | hb_apply ([&] (hb_array_t<const Value> _)
+               { valFormat.serialize_copy (c, src, &_, layout_variation_idx_map); })
+    ;
 
     auto glyphs =
     + it
@@ -665,7 +888,7 @@ struct SinglePosFormat2
     ;
 
     bool ret = bool (it);
-    SinglePos_serialize (c->serializer, it, valueFormat);
+    SinglePos_serialize (c->serializer, this, it, valueFormat, c->plan->layout_variation_idx_map);
     return_trace (ret);
   }
 
@@ -711,8 +934,10 @@ struct SinglePos
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator))>
   void serialize (hb_serialize_context_t *c,
+                 const void *src,
                  Iterator glyph_val_iter_pairs,
-                 ValueFormat valFormat)
+                 ValueFormat valFormat,
+                  const hb_map_t *layout_variation_idx_map)
   {
     if (unlikely (!c->extend_min (u.format))) return;
     unsigned format = 2;
@@ -721,9 +946,9 @@ struct SinglePos
 
     u.format = format;
     switch (u.format) {
-    case 1: u.format1.serialize (c, glyph_val_iter_pairs, valFormat);
+    case 1: u.format1.serialize (c, src, glyph_val_iter_pairs, valFormat, layout_variation_idx_map);
            return;
-    case 2: u.format2.serialize (c, glyph_val_iter_pairs, valFormat);
+    case 2: u.format2.serialize (c, src, glyph_val_iter_pairs, valFormat, layout_variation_idx_map);
            return;
     default:return;
     }
@@ -750,27 +975,59 @@ struct SinglePos
 };
 
 template<typename Iterator>
-static inline void
+static void
 SinglePos_serialize (hb_serialize_context_t *c,
+                    const void *src,
                     Iterator it,
-                    ValueFormat valFormat)
-{ c->start_embed<SinglePos> ()->serialize (c, it, valFormat); }
+                    ValueFormat valFormat,
+                     const hb_map_t *layout_variation_idx_map)
+{ c->start_embed<SinglePos> ()->serialize (c, src, it, valFormat, layout_variation_idx_map); }
 
 
 struct PairValueRecord
 {
   friend struct PairSet;
 
+  int cmp (hb_codepoint_t k) const
+  { return secondGlyph.cmp (k); }
+
+  struct serialize_closure_t
+  {
+    const void                 *base;
+    const ValueFormat  *valueFormats;
+    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,
-                  unsigned length,
-                  const hb_map_t &glyph_map) const
+                 serialize_closure_t *closure) const
   {
     TRACE_SERIALIZE (this);
     auto *out = c->start_embed (*this);
     if (unlikely (!c->extend_min (out))) return_trace (false);
-    
-    out->secondGlyph = glyph_map[secondGlyph];
-    return_trace (c->copy (values, length));
+
+    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);
+
+    return_trace (true);
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c,
+                                  const ValueFormat *valueFormats,
+                                  const void *base) const
+  {
+    unsigned record1_len = valueFormats[0].get_len ();
+    unsigned record2_len = valueFormats[1].get_len ();
+    const hb_array_t<const Value> values_array = values.as_array (record1_len + record2_len);
+
+    if (valueFormats[0].has_device ())
+      valueFormats[0].collect_variation_indices (c, base, values_array.sub_array (0, record1_len));
+
+    if (valueFormats[1].has_device ())
+      valueFormats[1].collect_variation_indices (c, base, values_array.sub_array (record1_len, record2_len));
   }
 
   protected:
@@ -816,9 +1073,27 @@ struct PairSet
     c->input->add_array (&record->secondGlyph, len, record_size);
   }
 
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c,
+                                  const ValueFormat *valueFormats) const
+  {
+    unsigned len1 = valueFormats[0].get_len ();
+    unsigned len2 = valueFormats[1].get_len ();
+    unsigned record_size = HBUINT16::static_size * (1 + len1 + len2);
+
+    const PairValueRecord *record = &firstPairValueRecord;
+    unsigned count = len;
+    for (unsigned i = 0; i < count; i++)
+    {
+      if (c->glyph_set->has (record->secondGlyph))
+      { record->collect_variation_indices (c, valueFormats, this); }
+
+      record = &StructAtOffset<const PairValueRecord> (record, record_size);
+    }
+  }
+
   bool apply (hb_ot_apply_context_t *c,
-                    const ValueFormat *valueFormats,
-                    unsigned int pos) const
+             const ValueFormat *valueFormats,
+             unsigned int pos) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -826,40 +1101,26 @@ struct PairSet
     unsigned int len2 = valueFormats[1].get_len ();
     unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
 
-    unsigned int count = len;
-
-    /* Hand-coded bsearch. */
-    if (unlikely (!count))
-      return_trace (false);
-    hb_codepoint_t x = buffer->info[pos].codepoint;
-    int min = 0, max = (int) count - 1;
-    while (min <= max)
+    const PairValueRecord *record = hb_bsearch (buffer->info[pos].codepoint,
+                                               &firstPairValueRecord,
+                                               len,
+                                               record_size);
+    if (record)
     {
-      int mid = ((unsigned int) min + (unsigned int) max) / 2;
-      const PairValueRecord *record = &StructAtOffset<PairValueRecord> (&firstPairValueRecord, record_size * mid);
-      hb_codepoint_t mid_x = record->secondGlyph;
-      if (x < mid_x)
-       max = mid - 1;
-      else if (x > mid_x)
-       min = mid + 1;
-      else
-      {
-       /* 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]))
-         buffer->unsafe_to_break (buffer->idx, pos + 1);
-       if (len2)
-         pos++;
-       buffer->idx = pos;
-       return_trace (true);
-      }
+      /* 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]))
+       buffer->unsafe_to_break (buffer->idx, pos + 1);
+      if (len2)
+       pos++;
+      buffer->idx = pos;
+      return_trace (true);
     }
-
     return_trace (false);
   }
 
   bool subset (hb_subset_context_t *c,
-               const ValueFormat valueFormats[2]) const
+              const ValueFormat valueFormats[2]) const
   {
     TRACE_SUBSET (this);
     auto snap = c->serializer->snapshot ();
@@ -875,12 +1136,21 @@ struct PairSet
     unsigned len2 = valueFormats[1].get_len ();
     unsigned record_size = HBUINT16::static_size + Value::static_size * (len1 + len2);
 
+    PairValueRecord::serialize_closure_t closure =
+    {
+      this,
+      valueFormats,
+      len1,
+      &glyph_map,
+      c->plan->layout_variation_idx_map
+    };
+
     const PairValueRecord *record = &firstPairValueRecord;
     unsigned count = len, num = 0;
     for (unsigned i = 0; i < count; i++)
     {
-      if (!glyphset.has (record->secondGlyph)) continue;
-      if (record->serialize (c->serializer, len1 + len2, glyph_map)) num++;
+      if (glyphset.has (record->secondGlyph)
+        && record->serialize (c->serializer, &closure)) num++;
       record = &StructAtOffset<const PairValueRecord> (record, record_size);
     }
 
@@ -891,7 +1161,6 @@ struct PairSet
 
   struct sanitize_closure_t
   {
-    const void *base;
     const ValueFormat *valueFormats;
     unsigned int len1; /* valueFormats[0].get_len() */
     unsigned int stride; /* 1 + len1 + len2 */
@@ -908,8 +1177,8 @@ struct PairSet
 
     unsigned int count = len;
     const PairValueRecord *record = &firstPairValueRecord;
-    return_trace (closure->valueFormats[0].sanitize_values_stride_unsafe (c, closure->base, &record->values[0], count, closure->stride) &&
-                 closure->valueFormats[1].sanitize_values_stride_unsafe (c, closure->base, &record->values[closure->len1], count, closure->stride));
+    return_trace (closure->valueFormats[0].sanitize_values_stride_unsafe (c, this, &record->values[0], count, closure->stride) &&
+                 closure->valueFormats[1].sanitize_values_stride_unsafe (c, this, &record->values[closure->len1], count, closure->stride));
   }
 
   protected:
@@ -935,9 +1204,27 @@ struct PairPosFormat1
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    if ((!valueFormat[0].has_device ()) && (!valueFormat[1].has_device ())) return;
+
+    auto it =
+    + hb_zip (this+coverage, pairSet)
+    | hb_filter (c->glyph_set, hb_first)
+    | hb_map (hb_second)
+    ;
+
+    if (!it) return;
+    + it
+    | hb_map (hb_add (this))
+    | hb_apply ([&] (const PairSet& _) { _.collect_variation_indices (c, valueFormat); })
+    ;
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+coverage).collect_coverage (c->input))) return;
     unsigned int count = pairSet.len;
     for (unsigned int i = 0; i < count; i++)
       (this+pairSet[i]).collect_glyphs (c, valueFormat);
@@ -981,7 +1268,7 @@ struct PairPosFormat1
                   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, out, valueFormat);
+                  bool ret = o->serialize_subset (c, _, this, valueFormat);
                   if (!ret)
                   {
                     out->pairSet.pop ();
@@ -1011,7 +1298,6 @@ struct PairPosFormat1
     unsigned int len2 = valueFormat[1].get_len ();
     PairSet::sanitize_closure_t closure =
     {
-      this,
       valueFormat,
       len1,
       1 + len1 + len2
@@ -1046,10 +1332,43 @@ struct PairPosFormat2
           (this+classDef2).intersects (glyphs);
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    if ((!valueFormat1.has_device ()) && (!valueFormat2.has_device ())) return;
+
+    hb_set_t class1_set, class2_set;
+    for (const unsigned cp : c->glyph_set->iter ())
+    {
+      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;
+    
+    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));
+    for (const unsigned class1_idx : class1_set.iter ())
+    {
+      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));
+      }
+    }
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
-    if (unlikely (!(this+classDef2).add_coverage (c->input))) return;
+    if (unlikely (!(this+coverage).collect_coverage (c->input))) return;
+    if (unlikely (!(this+classDef2).collect_coverage (c->input))) return;
   }
 
   const Coverage &get_coverage () const { return this+coverage; }
@@ -1096,14 +1415,15 @@ struct PairPosFormat2
     out->valueFormat2 = valueFormat2;
 
     hb_map_t klass1_map;
-    out->classDef1.serialize_subset (c, classDef1, this, out, &klass1_map);
+    out->classDef1.serialize_subset (c, classDef1, this, &klass1_map);
     out->class1Count = klass1_map.get_population ();
 
     hb_map_t klass2_map;
-    out->classDef2.serialize_subset (c, classDef2, this, out, &klass2_map);
+    out->classDef2.serialize_subset (c, classDef2, this, &klass2_map);
     out->class2Count = klass2_map.get_population ();
 
-    unsigned record_len = valueFormat1.get_len () + valueFormat2.get_len ();
+    unsigned len1 = valueFormat1.get_len ();
+    unsigned len2 = valueFormat2.get_len ();
 
     + hb_range ((unsigned) class1Count)
     | hb_filter (klass1_map)
@@ -1113,15 +1433,15 @@ struct PairPosFormat2
                   | hb_filter (klass2_map)
                   | hb_apply ([&] (const unsigned class2_idx)
                               {
-                                unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * record_len;
-                                for (unsigned i = 0; i < record_len; i++)
-                                  c->serializer->copy (values[idx+i]);
+                                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);
                               })
                   ;
                 })
     ;
 
-    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 =
@@ -1217,16 +1537,24 @@ struct EntryExitRecord
     return_trace (entryAnchor.sanitize (c, base) && exitAnchor.sanitize (c, base));
   }
 
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c,
+                                 const void *src_base) const
+  {
+    (src_base+entryAnchor).collect_variation_indices (c);
+    (src_base+exitAnchor).collect_variation_indices (c);
+  }
+
   EntryExitRecord* copy (hb_serialize_context_t *c,
                         const void *src_base,
-                        const void *dst_base) const
+                        const void *dst_base,
+                         const hb_map_t *layout_variation_idx_map) const
   {
     TRACE_SERIALIZE (this);
     auto *out = c->embed (this);
     if (unlikely (!out)) return_trace (nullptr);
 
-    out->entryAnchor.serialize_copy (c, entryAnchor, src_base, dst_base);
-    out->exitAnchor.serialize_copy (c, exitAnchor, src_base, dst_base);
+    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);
     return_trace (out);
   }
 
@@ -1251,8 +1579,19 @@ struct CursivePosFormat1
   bool intersects (const hb_set_t *glyphs) const
   { return (this+coverage).intersects (glyphs); }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    + hb_zip (this+coverage, entryExitRecord)
+    | hb_filter (c->glyph_set, hb_first)
+    | hb_map (hb_second)
+    | hb_apply ([&] (const EntryExitRecord& record) { record.collect_variation_indices (c, this); })
+    ;
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
-  { if (unlikely (!(this+coverage).add_coverage (c->input))) return; }
+  { if (unlikely (!(this+coverage).collect_coverage (c->input))) return; }
 
   const Coverage &get_coverage () const { return this+coverage; }
 
@@ -1361,7 +1700,8 @@ struct CursivePosFormat1
            hb_requires (hb_is_iterator (Iterator))>
   void serialize (hb_serialize_context_t *c,
                  Iterator it,
-                 const void *src_base)
+                 const void *src_base,
+                  const hb_map_t *layout_variation_idx_map)
   {
     if (unlikely (!c->extend_min ((*this)))) return;
     this->format = 1;
@@ -1369,7 +1709,7 @@ struct CursivePosFormat1
 
     for (const EntryExitRecord& entry_record : + it
                                               | hb_map (hb_second))
-      c->copy (entry_record, src_base, this);
+      c->copy (entry_record, src_base, this, layout_variation_idx_map);
 
     auto glyphs =
     + it
@@ -1396,7 +1736,7 @@ struct CursivePosFormat1
     ;
 
     bool ret = bool (it);
-    out->serialize (c->serializer, it, this);
+    out->serialize (c->serializer, it, this, c->plan->layout_variation_idx_map);
     return_trace (ret);
   }
 
@@ -1444,16 +1784,71 @@ typedef AnchorMatrix BaseArray;         /* base-major--
                                         * mark-minor--
                                         * ordered by class--zero-based. */
 
+static void Markclass_closure_and_remap_indexes (const Coverage  &mark_coverage,
+                                                const MarkArray &mark_array,
+                                                const hb_set_t  &glyphset,
+                                                hb_map_t*        klass_mapping /* INOUT */)
+{
+  hb_set_t orig_classes;
+
+  + hb_zip (mark_coverage, mark_array)
+  | hb_filter (glyphset, hb_first)
+  | hb_map (hb_second)
+  | hb_map (&MarkRecord::get_class)
+  | hb_sink (orig_classes)
+  ;
+
+  unsigned idx = 0;
+  for (auto klass : orig_classes.iter ())
+  {
+    if (klass_mapping->has (klass)) continue;
+    klass_mapping->set (klass, idx);
+    idx++;
+  }
+}
+
 struct MarkBasePosFormat1
 {
   bool intersects (const hb_set_t *glyphs) const
   { return (this+markCoverage).intersects (glyphs) &&
           (this+baseCoverage).intersects (glyphs); }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    + hb_zip (this+markCoverage, this+markArray)
+    | hb_filter (c->glyph_set, hb_first)
+    | hb_map (hb_second)
+    | hb_apply ([&] (const MarkRecord& record) { record.collect_variation_indices (c, &(this+markArray)); })
+    ;
+
+    hb_map_t klass_mapping;
+    Markclass_closure_and_remap_indexes (this+markCoverage, this+markArray, *c->glyph_set, &klass_mapping);
+
+    unsigned basecount = (this+baseArray).rows;
+    auto base_iter =
+    + hb_zip (this+baseCoverage, hb_range (basecount))
+    | hb_filter (c->glyph_set, hb_first)
+    | hb_map (hb_second)
+    ;
+
+    hb_sorted_vector_t<unsigned> base_indexes;
+    for (const unsigned row : base_iter)
+    {
+      + hb_range ((unsigned) classCount)
+      | hb_filter (klass_mapping)
+      | hb_map ([&] (const unsigned col) { return row * (unsigned) classCount + col; })
+      | hb_sink (base_indexes)
+      ;
+    }
+    (this+baseArray).collect_variation_indices (c, base_indexes.iter ());
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+markCoverage).add_coverage (c->input))) return;
-    if (unlikely (!(this+baseCoverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+markCoverage).collect_coverage (c->input))) return;
+    if (unlikely (!(this+baseCoverage).collect_coverage (c->input))) return;
   }
 
   const Coverage &get_coverage () const { return this+markCoverage; }
@@ -1501,8 +1896,70 @@ struct MarkBasePosFormat1
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    // TODO(subset)
-    return_trace (false);
+    const hb_set_t &glyphset = *c->plan->glyphset ();
+    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)
+    ;
+
+    hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+    + mark_iter
+    | hb_map (hb_first)
+    | hb_map (glyph_map)
+    | hb_sink (new_coverage)
+    ;
+
+    if (!out->markCoverage.serialize (c->serializer, out)
+                         .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));
+
+    unsigned basecount = (this+baseArray).rows;
+    auto base_iter =
+    + hb_zip (this+baseCoverage, hb_range (basecount))
+    | hb_filter (glyphset, hb_first)
+    ;
+
+    new_coverage.reset ();
+    + base_iter
+    | hb_map (hb_first)
+    | hb_map (glyph_map)
+    | hb_sink (new_coverage)
+    ;
+
+    if (!out->baseCoverage.serialize (c->serializer, out)
+                         .serialize (c->serializer, new_coverage.iter ()))
+      return_trace (false);
+
+    hb_sorted_vector_t<unsigned> base_indexes;
+    for (const unsigned row : + base_iter
+                             | hb_map (hb_second))
+    {
+      + hb_range ((unsigned) classCount)
+      | hb_filter (klass_mapping)
+      | hb_map ([&] (const unsigned col) { return row * (unsigned) classCount + col; })
+      | 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 ());
+
+    return_trace (true);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1571,10 +2028,48 @@ struct MarkLigPosFormat1
   { return (this+markCoverage).intersects (glyphs) &&
           (this+ligatureCoverage).intersects (glyphs); }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    + hb_zip (this+markCoverage, this+markArray)
+    | hb_filter (c->glyph_set, hb_first)
+    | hb_map (hb_second)
+    | hb_apply ([&] (const MarkRecord& record) { record.collect_variation_indices (c, &(this+markArray)); })
+    ;
+
+    hb_map_t klass_mapping;
+    Markclass_closure_and_remap_indexes (this+markCoverage, this+markArray, *c->glyph_set, &klass_mapping);
+
+    unsigned ligcount = (this+ligatureArray).len;
+    auto lig_iter =
+    + hb_zip (this+ligatureCoverage, hb_range (ligcount))
+    | hb_filter (c->glyph_set, hb_first)
+    | hb_map (hb_second)
+    ;
+
+    const LigatureArray& lig_array = this+ligatureArray;
+    for (const unsigned i : lig_iter)
+    {
+      hb_sorted_vector_t<unsigned> lig_indexes;
+      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)
+        ;
+      }
+
+      lig_array[i].collect_variation_indices (c, lig_indexes.iter ());
+    }
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+markCoverage).add_coverage (c->input))) return;
-    if (unlikely (!(this+ligatureCoverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+markCoverage).collect_coverage (c->input))) return;
+    if (unlikely (!(this+ligatureCoverage).collect_coverage (c->input))) return;
   }
 
   const Coverage &get_coverage () const { return this+markCoverage; }
@@ -1691,10 +2186,42 @@ struct MarkMarkPosFormat1
   { return (this+mark1Coverage).intersects (glyphs) &&
           (this+mark2Coverage).intersects (glyphs); }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    + hb_zip (this+mark1Coverage, this+mark1Array)
+    | hb_filter (c->glyph_set, hb_first)
+    | hb_map (hb_second)
+    | hb_apply ([&] (const MarkRecord& record) { record.collect_variation_indices (c, &(this+mark1Array)); })
+    ;
+
+    hb_map_t klass_mapping;
+    Markclass_closure_and_remap_indexes (this+mark1Coverage, this+mark1Array, *c->glyph_set, &klass_mapping);
+
+    unsigned mark2_count = (this+mark2Array).rows;
+    auto mark2_iter =
+    + hb_zip (this+mark2Coverage, hb_range (mark2_count))
+    | hb_filter (c->glyph_set, hb_first)
+    | hb_map (hb_second)
+    ;
+
+    hb_sorted_vector_t<unsigned> mark2_indexes;
+    for (const unsigned row : mark2_iter)
+    {
+      + hb_range ((unsigned) classCount)
+      | hb_filter (klass_mapping)
+      | hb_map ([&] (const unsigned col) { return row * (unsigned) classCount + col; })
+      | hb_sink (mark2_indexes)
+      ;
+    }
+    (this+mark2Array).collect_variation_indices (c, mark2_indexes.iter ());
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+mark1Coverage).add_coverage (c->input))) return;
-    if (unlikely (!(this+mark2Coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+mark1Coverage).collect_coverage (c->input))) return;
+    if (unlikely (!(this+mark2Coverage).collect_coverage (c->input))) return;
   }
 
   const Coverage &get_coverage () const { return this+mark1Coverage; }
@@ -1746,8 +2273,70 @@ struct MarkMarkPosFormat1
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    // TODO(subset)
-    return_trace (false);
+    const hb_set_t &glyphset = *c->plan->glyphset ();
+    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+mark1Coverage, this+mark1Array, glyphset, &klass_mapping);
+
+    if (!klass_mapping.get_population ()) return_trace (false);
+    out->classCount = klass_mapping.get_population ();
+
+    auto mark1_iter =
+    + hb_zip (this+mark1Coverage, this+mark1Array)
+    | hb_filter (glyphset, hb_first)
+    ;
+
+    hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+    + mark1_iter
+    | hb_map (hb_first)
+    | hb_map (glyph_map)
+    | hb_sink (new_coverage)
+    ;
+
+    if (!out->mark1Coverage.serialize (c->serializer, out)
+                          .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));
+    
+    unsigned mark2count = (this+mark2Array).rows;
+    auto mark2_iter =
+    + hb_zip (this+mark2Coverage, hb_range (mark2count))
+    | hb_filter (glyphset, hb_first)
+    ;
+
+    new_coverage.reset ();
+    + mark2_iter
+    | hb_map (hb_first)
+    | hb_map (glyph_map)
+    | hb_sink (new_coverage)
+    ;
+
+    if (!out->mark2Coverage.serialize (c->serializer, out)
+                          .serialize (c->serializer, new_coverage.iter ()))
+      return_trace (false);
+
+    hb_sorted_vector_t<unsigned> mark2_indexes;
+    for (const unsigned row : + mark2_iter
+                             | hb_map (hb_second))
+    {
+      + hb_range ((unsigned) classCount)
+      | hb_filter (klass_mapping)
+      | hb_map ([&] (const unsigned col) { return row * (unsigned) classCount + col; })
+      | 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 ());
+
+    return_trace (true);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1853,6 +2442,12 @@ struct PosLookupSubTable
     }
   }
 
+  bool intersects (const hb_set_t *glyphs, unsigned int lookup_type) const
+  {
+    hb_intersects_context_t c (glyphs);
+    return dispatch (&c, lookup_type);
+  }
+
   protected:
   union {
   SinglePos            single;
@@ -1897,18 +2492,37 @@ struct PosLookup : Lookup
   hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const
   { return dispatch (c); }
 
+  hb_closure_lookups_context_t::return_t closure_lookups (hb_closure_lookups_context_t *c, unsigned this_index) const
+  {
+    if (c->is_lookup_visited (this_index))
+      return hb_closure_lookups_context_t::default_return_value ();
+
+    c->set_lookup_visited (this_index);
+    if (!intersects (c->glyphs))
+    {
+      c->set_lookup_inactive (this_index);
+      return hb_closure_lookups_context_t::default_return_value ();
+    }
+    c->set_recurse_func (dispatch_closure_lookups_recurse_func);
+
+    hb_closure_lookups_context_t::return_t ret = dispatch (c);
+    return ret;
+  }
+
   template <typename set_t>
-  void add_coverage (set_t *glyphs) const
+  void collect_coverage (set_t *glyphs) const
   {
-    hb_add_coverage_context_t<set_t> c (glyphs);
+    hb_collect_coverage_context_t<set_t> c (glyphs);
     dispatch (&c);
   }
 
-  HB_INTERNAL static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
+  static inline bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
 
   template <typename context_t>
   static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
 
+  HB_INTERNAL static hb_closure_lookups_context_t::return_t dispatch_closure_lookups_recurse_func (hb_closure_lookups_context_t *c, unsigned this_index);
+
   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)...); }
@@ -1930,14 +2544,17 @@ struct GPOS : GSUBGPOS
   static constexpr hb_tag_t tableTag = HB_OT_TAG_GPOS;
 
   const PosLookup& get_lookup (unsigned int i) const
-  { return CastR<PosLookup> (GSUBGPOS::get_lookup (i)); }
+  { return static_cast<const PosLookup &> (GSUBGPOS::get_lookup (i)); }
 
   static inline void position_start (hb_font_t *font, hb_buffer_t *buffer);
   static inline void position_finish_advances (hb_font_t *font, hb_buffer_t *buffer);
   static inline void position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer);
 
   bool subset (hb_subset_context_t *c) const
-  { return GSUBGPOS::subset<PosLookup> (c); }
+  {
+    hb_subset_layout_context_t l (c, tableTag, c->plan->gpos_lookups, c->plan->gpos_features);
+    return GSUBGPOS::subset<PosLookup> (&l);
+  }
 
   bool sanitize (hb_sanitize_context_t *c) const
   { return GSUBGPOS::sanitize<PosLookup> (c); }
@@ -1945,6 +2562,16 @@ struct GPOS : GSUBGPOS
   HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
                                   hb_face_t *face) const;
 
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  {
+    for (unsigned i = 0; i < GSUBGPOS::get_lookup_count (); i++)
+    {
+      if (!c->gpos_lookups->has (i)) continue;
+      const PosLookup &l = get_lookup (i);
+      l.dispatch (c);
+    }
+  }
+
   typedef GSUBGPOS::accelerator_t<GPOS> accelerator_t;
 };
 
@@ -2060,12 +2687,19 @@ struct GPOS_accelerator_t : GPOS::accelerator_t {};
 
 #ifndef HB_NO_OT_LAYOUT
 template <typename context_t>
-/*static*/ inline typename context_t::return_t PosLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
+/*static*/ typename context_t::return_t PosLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
 {
   const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index);
   return l.dispatch (c);
 }
-/*static*/ inline bool PosLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
+
+/*static*/ inline hb_closure_lookups_context_t::return_t PosLookup::dispatch_closure_lookups_recurse_func (hb_closure_lookups_context_t *c, unsigned this_index)
+{
+  const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (this_index);
+  return l.closure_lookups (c, this_index);
+}
+
+/*static*/ bool PosLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
 {
   const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index);
   unsigned int saved_lookup_props = c->lookup_props;
index fc21cb0..01a5af1 100644 (file)
@@ -37,8 +37,8 @@ namespace OT {
 typedef hb_pair_t<hb_codepoint_t, hb_codepoint_t> hb_codepoint_pair_t;
 
 template<typename Iterator>
-static inline void SingleSubst_serialize (hb_serialize_context_t *c,
-                                         Iterator it);
+static void SingleSubst_serialize (hb_serialize_context_t *c,
+                                  Iterator it);
 
 
 struct SingleSubstFormat1
@@ -56,9 +56,11 @@ struct SingleSubstFormat1
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+coverage).collect_coverage (c->input))) return;
     unsigned d = deltaGlyphID;
     + hb_iter (this+coverage)
     | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; })
@@ -154,9 +156,11 @@ struct SingleSubstFormat2
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+coverage).collect_coverage (c->input))) return;
     + hb_zip (this+coverage, substitute)
     | hb_map (hb_second)
     | hb_sink (c->output)
@@ -255,9 +259,8 @@ struct SingleSubst
     if (glyphs)
     {
       format = 1;
-      auto get_delta = [=] (hb_codepoint_pair_t _) {
-                        return (unsigned) (_.second - _.first) & 0xFFFF;
-                      };
+      auto get_delta = [=] (hb_codepoint_pair_t _)
+                      { return (unsigned) (_.second - _.first) & 0xFFFF; };
       delta = get_delta (*glyphs);
       if (!hb_all (++(+glyphs), delta, get_delta)) format = 2;
     }
@@ -293,7 +296,7 @@ struct SingleSubst
 };
 
 template<typename Iterator>
-static inline void
+static void
 SingleSubst_serialize (hb_serialize_context_t *c,
                       Iterator it)
 { c->start_embed<SingleSubst> ()->serialize (c, it); }
@@ -359,9 +362,9 @@ struct Sequence
     if (!intersects (&glyphset)) return_trace (false);
 
     auto it =
-      + hb_iter (substitute)
-      | hb_map (glyph_map)
-      ;
+    + hb_iter (substitute)
+    | hb_map (glyph_map)
+    ;
 
     auto *out = c->serializer->start_embed (*this);
     return_trace (out->serialize (c->serializer, it));
@@ -395,9 +398,11 @@ struct MultipleSubstFormat1
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+coverage).collect_coverage (c->input))) return;
     + hb_zip (this+coverage, sequence)
     | hb_map (hb_second)
     | hb_map (hb_add (this))
@@ -452,7 +457,7 @@ struct MultipleSubstFormat1
     hb_sorted_vector_t<hb_codepoint_t> new_coverage;
     + hb_zip (this+coverage, sequence)
     | hb_filter (glyphset, hb_first)
-    | hb_filter (subset_offset_array (c, out->sequence, this, out), hb_second)
+    | hb_filter (subset_offset_array (c, out->sequence, this), hb_second)
     | hb_map (hb_first)
     | hb_map (glyph_map)
     | hb_sink (new_coverage)
@@ -599,15 +604,18 @@ struct AlternateSubstFormat1
   void closure (hb_closure_context_t *c) const
   {
     + hb_zip (this+coverage, alternateSet)
+    | hb_filter (c->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 {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+coverage).collect_coverage (c->input))) return;
     + hb_zip (this+coverage, alternateSet)
     | hb_map (hb_second)
     | hb_map (hb_add (this))
@@ -662,7 +670,7 @@ struct AlternateSubstFormat1
     hb_sorted_vector_t<hb_codepoint_t> new_coverage;
     + hb_zip (this+coverage, alternateSet)
     | hb_filter (glyphset, hb_first)
-    | hb_filter (subset_offset_array (c, out->alternateSet, this, out), hb_second)
+    | hb_filter (subset_offset_array (c, out->alternateSet, this), hb_second)
     | hb_map (hb_first)
     | hb_map (glyph_map)
     | hb_sink (new_coverage)
@@ -922,7 +930,7 @@ struct LigatureSet
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     + hb_iter (ligature)
-    | hb_filter (subset_offset_array (c, out->ligature, this, out))
+    | hb_filter (subset_offset_array (c, out->ligature, this))
     | hb_drain
     ;
     return_trace (bool (out->ligature));
@@ -966,9 +974,11 @@ struct LigatureSubstFormat1
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+coverage).collect_coverage (c->input))) return;
 
     + hb_zip (this+coverage, ligatureSet)
     | hb_map (hb_second)
@@ -992,7 +1002,7 @@ struct LigatureSubstFormat1
   {
     TRACE_APPLY (this);
 
-    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    unsigned int index = (this+coverage).get_coverage (c->buffer->cur ().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
     const LigatureSet &lig_set = this+ligatureSet[index];
@@ -1036,7 +1046,7 @@ struct LigatureSubstFormat1
     hb_sorted_vector_t<hb_codepoint_t> new_coverage;
     + hb_zip (this+coverage, ligatureSet)
     | hb_filter (glyphset, hb_first)
-    | hb_filter (subset_offset_array (c, out->ligatureSet, this, out), hb_second)
+    | hb_filter (subset_offset_array (c, out->ligatureSet, this), hb_second)
     | hb_map (hb_first)
     | hb_map (glyph_map)
     | hb_sink (new_coverage)
@@ -1114,7 +1124,6 @@ struct ChainContextSubst : ChainContext {};
 struct ExtensionSubst : Extension<ExtensionSubst>
 {
   typedef struct SubstLookupSubTable SubTable;
-
   bool is_reverse () const;
 };
 
@@ -1157,20 +1166,22 @@ struct ReverseChainSingleSubstFormat1
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+coverage).collect_coverage (c->input))) return;
 
     unsigned int count;
 
     count = backtrack.len;
     for (unsigned int i = 0; i < count; i++)
-      if (unlikely (!(this+backtrack[i]).add_coverage (c->before))) return;
+      if (unlikely (!(this+backtrack[i]).collect_coverage (c->before))) return;
 
     const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
     count = lookahead.len;
     for (unsigned int i = 0; i < count; i++)
-      if (unlikely (!(this+lookahead[i]).add_coverage (c->after))) return;
+      if (unlikely (!(this+lookahead[i]).collect_coverage (c->after))) return;
 
     const ArrayOf<HBGlyphID> &substitute = StructAfter<ArrayOf<HBGlyphID>> (lookahead);
     count = substitute.len;
@@ -1188,7 +1199,7 @@ struct ReverseChainSingleSubstFormat1
     if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
       return_trace (false); /* No chaining to this type */
 
-    unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+    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);
@@ -1313,6 +1324,12 @@ struct SubstLookupSubTable
     }
   }
 
+  bool intersects (const hb_set_t *glyphs, unsigned int lookup_type) const
+  {
+    hb_intersects_context_t c (glyphs);
+    return dispatch (&c, lookup_type);
+  }
+
   protected:
   union {
   SingleSubst                  single;
@@ -1336,14 +1353,14 @@ struct SubstLookup : Lookup
   const SubTable& get_subtable (unsigned int i) const
   { return Lookup::get_subtable<SubTable> (i); }
 
-  HB_INTERNAL static bool lookup_type_is_reverse (unsigned int lookup_type)
+  static inline bool lookup_type_is_reverse (unsigned int lookup_type)
   { return lookup_type == SubTable::ReverseChainSingle; }
 
   bool is_reverse () const
   {
     unsigned int type = get_type ();
     if (unlikely (type == SubTable::Extension))
-      return CastR<ExtensionSubst> (get_subtable(0)).is_reverse ();
+      return reinterpret_cast<const ExtensionSubst &> (get_subtable (0)).is_reverse ();
     return lookup_type_is_reverse (type);
   }
 
@@ -1373,6 +1390,24 @@ struct SubstLookup : Lookup
     return ret;
   }
 
+  hb_closure_lookups_context_t::return_t closure_lookups (hb_closure_lookups_context_t *c, unsigned this_index) const
+  {
+    if (c->is_lookup_visited (this_index))
+      return hb_closure_lookups_context_t::default_return_value ();
+
+    c->set_lookup_visited (this_index);
+    if (!intersects (c->glyphs))
+    {
+      c->set_lookup_inactive (this_index);
+      return hb_closure_lookups_context_t::default_return_value ();
+    }
+
+    c->set_recurse_func (dispatch_closure_lookups_recurse_func);
+
+    hb_closure_lookups_context_t::return_t ret = dispatch (c);
+    return ret;
+  }
+
   hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     c->set_recurse_func (dispatch_recurse_func<hb_collect_glyphs_context_t>);
@@ -1380,9 +1415,9 @@ struct SubstLookup : Lookup
   }
 
   template <typename set_t>
-  void add_coverage (set_t *glyphs) const
+  void collect_coverage (set_t *glyphs) const
   {
-    hb_add_coverage_context_t<set_t> c (glyphs);
+    hb_collect_coverage_context_t<set_t> c (glyphs);
     dispatch (&c);
   }
 
@@ -1394,7 +1429,7 @@ struct SubstLookup : Lookup
       return dispatch (c);
   }
 
-  HB_INTERNAL static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
+  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)
@@ -1461,9 +1496,9 @@ struct SubstLookup : Lookup
   }
 
   template <typename context_t>
-  HB_INTERNAL static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
+  static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
 
-  HB_INTERNAL static hb_closure_context_t::return_t dispatch_closure_recurse_func (hb_closure_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)
   {
     if (!c->should_visit_lookup (lookup_index))
       return hb_empty_t ();
@@ -1478,6 +1513,8 @@ struct SubstLookup : Lookup
     return ret;
   }
 
+  HB_INTERNAL static hb_closure_lookups_context_t::return_t dispatch_closure_lookups_recurse_func (hb_closure_lookups_context_t *c, unsigned lookup_index);
+
   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)...); }
@@ -1499,10 +1536,13 @@ struct GSUB : GSUBGPOS
   static constexpr hb_tag_t tableTag = HB_OT_TAG_GSUB;
 
   const SubstLookup& get_lookup (unsigned int i) const
-  { return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); }
+  { return static_cast<const SubstLookup &> (GSUBGPOS::get_lookup (i)); }
 
   bool subset (hb_subset_context_t *c) const
-  { return GSUBGPOS::subset<SubstLookup> (c); }
+  {
+    hb_subset_layout_context_t l (c, tableTag, c->plan->gsub_lookups, c->plan->gsub_features);
+    return GSUBGPOS::subset<SubstLookup> (&l);
+  }
 
   bool sanitize (hb_sanitize_context_t *c) const
   { return GSUBGPOS::sanitize<SubstLookup> (c); }
@@ -1522,18 +1562,22 @@ struct GSUB_accelerator_t : GSUB::accelerator_t {};
 #ifndef HB_NO_OT_LAYOUT
 /*static*/ inline bool ExtensionSubst::is_reverse () const
 {
-  unsigned int type = get_type ();
-  if (unlikely (type == SubTable::Extension))
-    return CastR<ExtensionSubst> (get_subtable<SubTable>()).is_reverse ();
-  return SubstLookup::lookup_type_is_reverse (type);
+  return SubstLookup::lookup_type_is_reverse (get_type ());
 }
 template <typename context_t>
-/*static*/ inline typename context_t::return_t SubstLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
+/*static*/ typename context_t::return_t SubstLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
 {
   const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index);
   return l.dispatch (c);
 }
-/*static*/ inline bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
+
+/*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);
+  return l.closure_lookups (c, this_index);
+}
+
+/*static*/ bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
 {
   const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index);
   unsigned int saved_lookup_props = c->lookup_props;
index 579d178..2c06312 100644 (file)
@@ -76,10 +76,17 @@ struct hb_closure_context_t :
     nesting_level_left++;
   }
 
+  bool lookup_limit_exceeded ()
+  { return lookup_count > HB_MAX_LOOKUP_INDICES; }
+
   bool should_visit_lookup (unsigned int lookup_index)
   {
+    if (lookup_count++ > HB_MAX_LOOKUP_INDICES)
+      return false;
+
     if (is_lookup_done (lookup_index))
       return false;
+
     done_lookups->set (lookup_index, glyphs->get_population ());
     return true;
   }
@@ -106,7 +113,9 @@ struct hb_closure_context_t :
                          recurse_func (nullptr),
                          nesting_level_left (nesting_level_left_),
                          debug_depth (0),
-                         done_lookups (done_lookups_) {}
+                         done_lookups (done_lookups_),
+                         lookup_count (0)
+  {}
 
   ~hb_closure_context_t () { flush (); }
 
@@ -114,14 +123,83 @@ 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);
   }
 
   private:
   hb_map_t *done_lookups;
+  unsigned int lookup_count;
 };
 
+struct hb_closure_lookups_context_t :
+       hb_dispatch_context_t<hb_closure_lookups_context_t, hb_empty_t, 0>
+{
+  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 (); }
+  static return_t default_return_value () { return hb_empty_t (); }
+  void recurse (unsigned lookup_index)
+  {
+    if (unlikely (nesting_level_left == 0 || !recurse_func))
+      return;
+
+    /* Return if new lookup was recursed to before. */
+    if (is_lookup_visited (lookup_index))
+      return;
+
+    set_lookup_visited (lookup_index);
+    nesting_level_left--;
+    recurse_func (this, lookup_index);
+    nesting_level_left++;
+  }
+
+  void set_lookup_visited (unsigned lookup_index)
+  { visited_lookups->add (lookup_index); }
+
+  void set_lookup_inactive (unsigned lookup_index)
+  { inactive_lookups->add (lookup_index); }
+
+  bool lookup_limit_exceeded ()
+  { return lookup_count > HB_MAX_LOOKUP_INDICES; }
+
+  bool is_lookup_visited (unsigned lookup_index)
+  {
+    if (lookup_count++ > HB_MAX_LOOKUP_INDICES)
+      return true;
+
+    return visited_lookups->has (lookup_index);
+  }
+
+  hb_face_t *face;
+  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_,
+                               hb_set_t *visited_lookups_,
+                               hb_set_t *inactive_lookups_,
+                               unsigned nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
+                               face (face_),
+                               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) {}
+
+  void set_recurse_func (recurse_func_t func) { recurse_func = func; }
+
+  private:
+  hb_set_t *visited_lookups;
+  hb_set_t *inactive_lookups;
+  unsigned int lookup_count;
+};
 
 struct hb_would_apply_context_t :
        hb_dispatch_context_t<hb_would_apply_context_t, bool, 0>
@@ -229,23 +307,23 @@ struct hb_collect_glyphs_context_t :
 
 
 template <typename set_t>
-struct hb_add_coverage_context_t :
-       hb_dispatch_context_t<hb_add_coverage_context_t<set_t>, const Coverage &, HB_DEBUG_GET_COVERAGE>
+struct hb_collect_coverage_context_t :
+       hb_dispatch_context_t<hb_collect_coverage_context_t<set_t>, const Coverage &, HB_DEBUG_GET_COVERAGE>
 {
   const char *get_name () { return "GET_COVERAGE"; }
   typedef const Coverage &return_t;
   template <typename T>
   return_t dispatch (const T &obj) { return obj.get_coverage (); }
-  static return_t default_return_value () { return Null(Coverage); }
+  static return_t default_return_value () { return Null (Coverage); }
   bool stop_sublookup_iteration (return_t r) const
   {
-    r.add_coverage (set);
+    r.collect_coverage (set);
     return false;
   }
 
-  hb_add_coverage_context_t (set_t *set_) :
-                           set (set_),
-                           debug_depth (0) {}
+  hb_collect_coverage_context_t (set_t *set_) :
+                                  set (set_),
+                                  debug_depth (0) {}
 
   set_t *set;
   unsigned int debug_depth;
@@ -355,7 +433,7 @@ struct hb_ot_apply_context_t :
     }
 
     void reset (unsigned int start_index_,
-                      unsigned int num_items_)
+               unsigned int num_items_)
     {
       idx = start_index_;
       num_items = num_items_;
@@ -363,7 +441,11 @@ struct hb_ot_apply_context_t :
       matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0);
     }
 
-    void reject () { num_items++; match_glyph_data--; }
+    void reject ()
+    {
+      num_items++;
+      if (match_glyph_data) match_glyph_data--;
+    }
 
     matcher_t::may_skip_t
     may_skip (const hb_glyph_info_t &info) const
@@ -487,7 +569,7 @@ struct hb_ot_apply_context_t :
 #ifndef HB_NO_OT_LAYOUT
                              *face->table.GDEF->table
 #else
-                             Null(GDEF)
+                             Null (GDEF)
 #endif
                             ),
                        var_store (gdef.get_var_store ()),
@@ -563,53 +645,56 @@ struct hb_ot_apply_context_t :
     return true;
   }
 
-  void _set_glyph_props (hb_codepoint_t glyph_index,
-                         unsigned int class_guess = 0,
-                         bool ligature = false,
-                         bool component = false) const
+  void _set_glyph_class (hb_codepoint_t glyph_index,
+                        unsigned int class_guess = 0,
+                        bool ligature = false,
+                        bool component = false) const
   {
-    unsigned int add_in = _hb_glyph_info_get_glyph_props (&buffer->cur()) &
-                         HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE;
-    add_in |= HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED;
+    unsigned int props = _hb_glyph_info_get_glyph_props (&buffer->cur());
+
+    props |= HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED;
     if (ligature)
     {
-      add_in |= HB_OT_LAYOUT_GLYPH_PROPS_LIGATED;
+      props |= HB_OT_LAYOUT_GLYPH_PROPS_LIGATED;
       /* In the only place that the MULTIPLIED bit is used, Uniscribe
        * seems to only care about the "last" transformation between
        * Ligature and Multiple substitutions.  Ie. if you ligate, expand,
        * and ligate again, it forgives the multiplication and acts as
        * if only ligation happened.  As such, clear MULTIPLIED bit.
        */
-      add_in &= ~HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
+      props &= ~HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
     }
     if (component)
-      add_in |= HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
+      props |= HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
+
     if (likely (has_glyph_classes))
-      _hb_glyph_info_set_glyph_props (&buffer->cur(), add_in | gdef.get_glyph_props (glyph_index));
+      props = (props & ~HB_OT_LAYOUT_GLYPH_PROPS_CLASS_MASK) | gdef.get_glyph_props (glyph_index);
     else if (class_guess)
-      _hb_glyph_info_set_glyph_props (&buffer->cur(), add_in | class_guess);
+      props = (props & ~HB_OT_LAYOUT_GLYPH_PROPS_CLASS_MASK) | class_guess;
+
+    _hb_glyph_info_set_glyph_props (&buffer->cur(), props);
   }
 
   void replace_glyph (hb_codepoint_t glyph_index) const
   {
-    _set_glyph_props (glyph_index);
+    _set_glyph_class (glyph_index);
     buffer->replace_glyph (glyph_index);
   }
   void replace_glyph_inplace (hb_codepoint_t glyph_index) const
   {
-    _set_glyph_props (glyph_index);
+    _set_glyph_class (glyph_index);
     buffer->cur().codepoint = glyph_index;
   }
   void replace_glyph_with_ligature (hb_codepoint_t glyph_index,
-                                          unsigned int class_guess) const
+                                   unsigned int class_guess) const
   {
-    _set_glyph_props (glyph_index, class_guess, true);
+    _set_glyph_class (glyph_index, class_guess, true);
     buffer->replace_glyph (glyph_index);
   }
   void output_glyph_for_component (hb_codepoint_t glyph_index,
-                                         unsigned int class_guess) const
+                                  unsigned int class_guess) const
   {
-    _set_glyph_props (glyph_index, class_guess, false, true);
+    _set_glyph_class (glyph_index, class_guess, false, true);
     buffer->output_glyph (glyph_index);
   }
 };
@@ -619,7 +704,7 @@ struct hb_get_subtables_context_t :
        hb_dispatch_context_t<hb_get_subtables_context_t, hb_empty_t, HB_DEBUG_APPLY>
 {
   template <typename Type>
-  HB_INTERNAL static bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c)
+  static inline bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c)
   {
     const Type *typed_obj = (const Type *) obj;
     return typed_obj->apply (c);
@@ -635,7 +720,7 @@ struct hb_get_subtables_context_t :
       obj = &obj_;
       apply_func = apply_func_;
       digest.init ();
-      obj_.get_coverage ().add_coverage (&digest);
+      obj_.get_coverage ().collect_coverage (&digest);
     }
 
     bool apply (OT::hb_ot_apply_context_t *c) const
@@ -706,15 +791,15 @@ static inline bool intersects_coverage (const hb_set_t *glyphs, const HBUINT16 &
   return (data+coverage).intersects (glyphs);
 }
 
-static inline bool intersects_array (const hb_set_t *glyphs,
-                                    unsigned int count,
-                                    const HBUINT16 values[],
-                                    intersects_func_t intersects_func,
-                                    const void *intersects_data)
+static inline bool array_is_subset_of (const hb_set_t *glyphs,
+                                      unsigned int count,
+                                      const HBUINT16 values[],
+                                      intersects_func_t intersects_func,
+                                      const void *intersects_data)
 {
   for (const HBUINT16 &_ : + hb_iter (values, count))
-    if (intersects_func (glyphs, _, intersects_data)) return true;
-  return false;
+    if (!intersects_func (glyphs, _, intersects_data)) return false;
+  return true;
 }
 
 
@@ -725,12 +810,12 @@ static inline void collect_glyph (hb_set_t *glyphs, const HBUINT16 &value, const
 static inline void collect_class (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
 {
   const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
-  class_def.add_class (glyphs, value);
+  class_def.collect_class (glyphs, value);
 }
 static inline void collect_coverage (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
 {
   const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
-  (data+coverage).add_coverage (glyphs);
+  (data+coverage).collect_coverage (glyphs);
 }
 static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
                                  hb_set_t *glyphs,
@@ -991,18 +1076,19 @@ static inline bool ligate_input (hb_ot_apply_context_t *c,
     buffer->idx++;
   }
 
-  if (!is_mark_ligature && last_lig_id) {
+  if (!is_mark_ligature && last_lig_id)
+  {
     /* Re-adjust components for any marks following. */
-    for (unsigned int i = buffer->idx; i < buffer->len; i++) {
-      if (last_lig_id == _hb_glyph_info_get_lig_id (&buffer->info[i])) {
-       unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->info[i]);
-       if (!this_comp)
-         break;
-       unsigned int new_lig_comp = components_so_far - last_num_components +
-                                   hb_min (this_comp, last_num_components);
-       _hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp);
-      } else
-       break;
+    for (unsigned i = buffer->idx; i < buffer->len; ++i)
+    {
+      if (last_lig_id != _hb_glyph_info_get_lig_id (&buffer->info[i])) break;
+
+      unsigned this_comp = _hb_glyph_info_get_lig_comp (&buffer->info[i]);
+      if (!this_comp) break;
+
+      unsigned new_lig_comp = components_so_far - last_num_components +
+                             hb_min (this_comp, last_num_components);
+      _hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp);
     }
   }
   return_trace (true);
@@ -1057,6 +1143,17 @@ 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
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->embed (*this);
+    if (unlikely (!out)) return_trace (nullptr);
+
+    out->lookupListIndex = hb_map_get (lookup_map, lookupListIndex);
+    return_trace (out);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -1228,9 +1325,9 @@ static inline bool context_intersects (const hb_set_t *glyphs,
                                       const HBUINT16 input[], /* Array of input values--start with second glyph */
                                       ContextClosureLookupContext &lookup_context)
 {
-  return intersects_array (glyphs,
-                          inputCount ? inputCount - 1 : 0, input,
-                          lookup_context.funcs.intersects, lookup_context.intersects_data);
+  return array_is_subset_of (glyphs,
+                            inputCount ? inputCount - 1 : 0, input,
+                            lookup_context.funcs.intersects, lookup_context.intersects_data);
 }
 
 static inline void context_closure_lookup (hb_closure_context_t *c,
@@ -1303,6 +1400,8 @@ struct Rule
 
   void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
   {
+    if (unlikely (c->lookup_limit_exceeded ())) return;
+
     const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
                                                       (inputZ.as_array ((inputCount ? inputCount - 1 : 0)));
     context_closure_lookup (c,
@@ -1311,6 +1410,15 @@ struct Rule
                            lookup_context);
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const
+  {
+    if (unlikely (c->lookup_limit_exceeded ())) return;
+
+    const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
+                                                      (inputZ.as_array (inputCount ? inputCount - 1 : 0));
+    recurse_lookups (c, lookupCount, lookupRecord.arrayZ);
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c,
                       ContextCollectGlyphsLookupContext &lookup_context) const
   {
@@ -1342,6 +1450,47 @@ struct Rule
     return_trace (context_apply_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, lookup_context));
   }
 
+  bool serialize (hb_serialize_context_t *c,
+                 const hb_map_t *input_mapping, /* old->new glyphid or class mapping */
+                 const hb_map_t *lookup_map) const
+  {
+    TRACE_SERIALIZE (this);
+    auto *out = c->start_embed (this);
+    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)
+    {
+      HBUINT16 d;
+      d = input_mapping->get (org);
+      c->copy (d);
+    }
+
+    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);
+
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c,
+              const hb_map_t *lookup_map,
+              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);
+
+    const hb_map_t *mapping = klass_map == nullptr ? c->plan->glyph_map : klass_map;
+    if (!hb_all (input, mapping)) return_trace (false);
+    return_trace (serialize (c->serializer, mapping, lookup_map));
+  }
+
   public:
   bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -1359,7 +1508,7 @@ struct Rule
                                         * glyph */
   HBUINT16     lookupCount;            /* Number of LookupRecords */
   UnsizedArrayOf<HBUINT16>
-               inputZ;                 /* Array of match inputs--start with
+               inputZ;                 /* Array of match inputs--start with
                                         * second glyph */
 /*UnsizedArrayOf<LookupRecord>
                lookupRecordX;*/        /* Array of LookupRecords--in
@@ -1384,6 +1533,8 @@ struct RuleSet
   void closure (hb_closure_context_t *c,
                ContextClosureLookupContext &lookup_context) const
   {
+    if (unlikely (c->lookup_limit_exceeded ())) return;
+
     return
     + hb_iter (rule)
     | hb_map (hb_add (this))
@@ -1391,6 +1542,17 @@ struct RuleSet
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const
+  {
+    if (unlikely (c->lookup_limit_exceeded ())) return;
+
+    return
+    + hb_iter (rule)
+    | hb_map (hb_add (this))
+    | hb_apply ([&] (const Rule &_) { _.closure_lookups (c); })
+    ;
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c,
                       ContextCollectGlyphsLookupContext &lookup_context) const
   {
@@ -1425,6 +1587,36 @@ struct RuleSet
     ;
   }
 
+  bool subset (hb_subset_context_t *c,
+              const hb_map_t *lookup_map,
+              const hb_map_t *klass_map = nullptr) const
+  {
+    TRACE_SUBSET (this);
+
+    auto snap = c->serializer->snapshot ();
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+    for (const OffsetTo<Rule>& _ : rule)
+    {
+      if (!_) continue;
+      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);
+      }
+    }
+
+    bool ret = bool (out->rule);
+    if (!ret) c->serializer->revert (snap);
+
+    return_trace (ret);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -1474,9 +1666,19 @@ struct ContextFormat1
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const
+  {
+    + hb_iter (ruleSet)
+    | hb_map (hb_add (this))
+    | hb_apply ([&] (const RuleSet &_) { _.closure_lookups (c); })
+    ;
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    (this+coverage).add_coverage (c->input);
+    (this+coverage).collect_coverage (c->input);
 
     struct ContextCollectGlyphsLookupContext lookup_context = {
       {collect_glyph},
@@ -1519,8 +1721,26 @@ struct ContextFormat1
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    // TODO(subset)
-    return_trace (false);
+    const hb_set_t &glyphset = *c->plan->glyphset ();
+    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;
+
+    const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
+    hb_sorted_vector_t<hb_codepoint_t> new_coverage;
+    + hb_zip (this+coverage, ruleSet)
+    | hb_filter (glyphset, hb_first)
+    | hb_filter (subset_offset_array (c, out->ruleSet, this, lookup_map), hb_second)
+    | hb_map (hb_first)
+    | hb_map (glyph_map)
+    | hb_sink (new_coverage)
+    ;
+
+    out->coverage.serialize (c->serializer, out)
+                 .serialize (c->serializer, new_coverage.iter ());
+    return_trace (bool (new_coverage));
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1588,9 +1808,19 @@ struct ContextFormat2
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const
+  {
+    + hb_iter (ruleSet)
+    | hb_map (hb_add (this))
+    | hb_apply ([&] (const RuleSet &_) { _.closure_lookups (c); })
+    ;
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    (this+coverage).add_coverage (c->input);
+    (this+coverage).collect_coverage (c->input);
 
     const ClassDef &class_def = this+classDef;
     struct ContextCollectGlyphsLookupContext lookup_context = {
@@ -1637,8 +1867,45 @@ struct ContextFormat2
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    // TODO(subset)
-    return_trace (false);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+    out->format = format;
+    if (unlikely (!out->coverage.serialize_subset (c, coverage, this)))
+      return_trace (false);
+
+    hb_map_t klass_map;
+    out->classDef.serialize_subset (c, classDef, this, &klass_map);
+
+    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))
+    {
+      auto *o = out->ruleSet.serialize_append (c->serializer);
+      if (unlikely (!o))
+      {
+        ret = false;
+        break;
+      }
+
+      if (o->serialize_subset (c, _.second, this, lookup_map, &klass_map))
+        non_zero_index = index;
+
+      index++;
+    }
+
+    if (!ret) return_trace (ret);
+
+    //prune empty trailing ruleSets
+    --index;
+    while (index > non_zero_index)
+    {
+      out->ruleSet.pop ();
+      index--;
+    }
+
+    return_trace (bool (out->ruleSet));
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1695,9 +1962,17 @@ struct ContextFormat3
                            lookup_context);
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const
+  {
+    const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
+    recurse_lookups (c, lookupCount, lookupRecord);
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    (this+coverageZ[0]).add_coverage (c->input);
+    (this+coverageZ[0]).collect_coverage (c->input);
 
     const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
     struct ContextCollectGlyphsLookupContext lookup_context = {
@@ -1743,8 +2018,28 @@ struct ContextFormat3
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    // TODO(subset)
-    return_trace (false);
+    auto *out = c->serializer->start_embed (this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+
+    out->format = format;
+    out->glyphCount = glyphCount;
+    out->lookupCount = lookupCount;
+
+    const hb_array_t<const OffsetTo<Coverage>> coverages = coverageZ.as_array (glyphCount);
+
+    for (const OffsetTo<Coverage>& offset : coverages)
+    {
+      auto *o = c->serializer->allocate_size<OffsetTo<Coverage>> (OffsetTo<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 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);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1829,15 +2124,15 @@ static inline bool chain_context_intersects (const hb_set_t *glyphs,
                                             const HBUINT16 lookahead[],
                                             ChainContextClosureLookupContext &lookup_context)
 {
-  return intersects_array (glyphs,
-                          backtrackCount, backtrack,
-                          lookup_context.funcs.intersects, lookup_context.intersects_data[0])
-      && intersects_array (glyphs,
-                          inputCount ? inputCount - 1 : 0, input,
-                          lookup_context.funcs.intersects, lookup_context.intersects_data[1])
-      && intersects_array (glyphs,
-                         lookaheadCount, lookahead,
-                         lookup_context.funcs.intersects, lookup_context.intersects_data[2]);
+  return array_is_subset_of (glyphs,
+                            backtrackCount, backtrack,
+                            lookup_context.funcs.intersects, lookup_context.intersects_data[0])
+      && array_is_subset_of (glyphs,
+                            inputCount ? inputCount - 1 : 0, input,
+                            lookup_context.funcs.intersects, lookup_context.intersects_data[1])
+      && array_is_subset_of (glyphs,
+                            lookaheadCount, lookahead,
+                            lookup_context.funcs.intersects, lookup_context.intersects_data[2]);
 }
 
 static inline void chain_context_closure_lookup (hb_closure_context_t *c,
@@ -1949,6 +2244,8 @@ struct ChainRule
   void closure (hb_closure_context_t *c,
                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);
@@ -1960,6 +2257,16 @@ struct ChainRule
                                  lookup_context);
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) 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);
+    recurse_lookups (c, lookup.len, lookup.arrayZ);
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c,
                       ChainContextCollectGlyphsLookupContext &lookup_context) const
   {
@@ -2003,8 +2310,8 @@ struct ChainRule
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator))>
   void serialize_array (hb_serialize_context_t *c,
-                        HBUINT16 len,
-                        Iterator it) const
+                       HBUINT16 len,
+                       Iterator it) const
   {
     c->copy (len);
     for (const auto g : it)
@@ -2016,6 +2323,7 @@ struct ChainRule
   }
 
   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
@@ -2038,16 +2346,22 @@ struct ChainRule
     serialize_array (c, lookahead.len, + lookahead.iter ()
                                       | hb_map (mapping));
 
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
-    c->copy (lookup);
+    const ArrayOf<LookupRecord> &lookupRecord = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    HBUINT16 lookupCount;
+    lookupCount = lookupRecord.len;
+    if (!c->copy (lookupCount)) return_trace (nullptr);
+
+    for (unsigned i = 0; i < (unsigned) lookupCount; i++)
+      if (!c->copy (lookupRecord[i], lookup_map)) return_trace (nullptr);
 
     return_trace (out);
   }
 
   bool subset (hb_subset_context_t *c,
-               const hb_map_t *backtrack_map = nullptr,
-               const hb_map_t *input_map = nullptr,
-               const hb_map_t *lookahead_map = nullptr) const
+              const hb_map_t *lookup_map,
+              const hb_map_t *backtrack_map = nullptr,
+              const hb_map_t *input_map = nullptr,
+              const hb_map_t *lookahead_map = nullptr) const
   {
     TRACE_SUBSET (this);
 
@@ -2058,20 +2372,20 @@ struct ChainRule
     {
       const hb_set_t &glyphset = *c->plan->glyphset ();
       if (!hb_all (backtrack, glyphset) ||
-          !hb_all (input, glyphset) ||
-          !hb_all (lookahead, glyphset))
-        return_trace (false);
+         !hb_all (input, glyphset) ||
+         !hb_all (lookahead, glyphset))
+       return_trace (false);
 
-      copy (c->serializer, c->plan->glyph_map);
+      copy (c->serializer, lookup_map, c->plan->glyph_map);
     }
     else
     {
       if (!hb_all (backtrack, backtrack_map) ||
-          !hb_all (input, input_map) ||
-          !hb_all (lookahead, lookahead_map))
-        return_trace (false);
+         !hb_all (input, input_map) ||
+         !hb_all (lookahead, lookahead_map))
+       return_trace (false);
 
-      copy (c->serializer, backtrack_map, input_map, lookahead_map);
+      copy (c->serializer, lookup_map, backtrack_map, input_map, lookahead_map);
     }
 
     return_trace (true);
@@ -2120,6 +2434,8 @@ struct ChainRuleSet
   }
   void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
   {
+    if (unlikely (c->lookup_limit_exceeded ())) return;
+
     return
     + hb_iter (rule)
     | hb_map (hb_add (this))
@@ -2127,6 +2443,17 @@ struct ChainRuleSet
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const
+  {
+    if (unlikely (c->lookup_limit_exceeded ())) return;
+
+    return
+    + hb_iter (rule)
+    | hb_map (hb_add (this))
+    | hb_apply ([&] (const ChainRule &_) { _.closure_lookups (c); })
+    ;
+  }
+
   void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
   {
     return
@@ -2159,9 +2486,10 @@ struct ChainRuleSet
   }
 
   bool subset (hb_subset_context_t *c,
-               const hb_map_t *backtrack_klass_map = nullptr,
-               const hb_map_t *input_klass_map = nullptr,
-               const hb_map_t *lookahead_klass_map = nullptr) const
+              const hb_map_t *lookup_map,
+              const hb_map_t *backtrack_klass_map = nullptr,
+              const hb_map_t *input_klass_map = nullptr,
+              const hb_map_t *lookahead_klass_map = nullptr) const
   {
     TRACE_SUBSET (this);
 
@@ -2176,13 +2504,14 @@ struct ChainRuleSet
       if (unlikely (!o)) continue;
 
       auto o_snap = c->serializer->snapshot ();
-      if (!o->serialize_subset (c, _, this, out,
-                                backtrack_klass_map,
-                                input_klass_map,
-                                lookahead_klass_map))
+      if (!o->serialize_subset (c, _, this,
+                               lookup_map,
+                               backtrack_klass_map,
+                               input_klass_map,
+                               lookahead_klass_map))
       {
-        out->rule.pop ();
-        c->serializer->revert (o_snap);
+       out->rule.pop ();
+       c->serializer->revert (o_snap);
       }
     }
 
@@ -2240,9 +2569,19 @@ struct ChainContextFormat1
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const
+  {
+    + hb_iter (ruleSet)
+    | hb_map (hb_add (this))
+    | hb_apply ([&] (const ChainRuleSet &_) { _.closure_lookups (c); })
+    ;
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    (this+coverage).add_coverage (c->input);
+    (this+coverage).collect_coverage (c->input);
 
     struct ChainContextCollectGlyphsLookupContext lookup_context = {
       {collect_glyph},
@@ -2291,10 +2630,11 @@ struct ChainContextFormat1
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
     out->format = format;
 
+    const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
     hb_sorted_vector_t<hb_codepoint_t> new_coverage;
     + hb_zip (this+coverage, ruleSet)
     | hb_filter (glyphset, hb_first)
-    | hb_filter (subset_offset_array (c, out->ruleSet, this, out), hb_second)
+    | hb_filter (subset_offset_array (c, out->ruleSet, this, lookup_map), hb_second)
     | hb_map (hb_first)
     | hb_map (glyph_map)
     | hb_sink (new_coverage)
@@ -2376,9 +2716,19 @@ struct ChainContextFormat2
     ;
   }
 
+  void closure_lookups (hb_closure_lookups_context_t *c) const
+  {
+    + hb_iter (ruleSet)
+    | hb_map (hb_add (this))
+    | hb_apply ([&] (const ChainRuleSet &_) { _.closure_lookups (c); })
+    ;
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
-    (this+coverage).add_coverage (c->input);
+    (this+coverage).collect_coverage (c->input);
 
     const ClassDef &backtrack_class_def = this+backtrackClassDef;
     const ClassDef &input_class_def = this+inputClassDef;
@@ -2443,20 +2793,21 @@ struct ChainContextFormat2
     auto *out = c->serializer->start_embed (*this);
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
     out->format = format;
-    out->coverage.serialize_subset (c, coverage, this, out);
+    out->coverage.serialize_subset (c, coverage, this);
 
     hb_map_t backtrack_klass_map;
-    out->backtrackClassDef.serialize_subset (c, backtrackClassDef, this, out, &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, out, &input_klass_map);
+    out->inputClassDef.serialize_subset (c, inputClassDef, this, &input_klass_map);
 
     hb_map_t lookahead_klass_map;
-    out->lookaheadClassDef.serialize_subset (c, lookaheadClassDef, this, out, &lookahead_klass_map);
+    out->lookaheadClassDef.serialize_subset (c, lookaheadClassDef, this, &lookahead_klass_map);
 
-    hb_vector_t<unsigned> rulesets;
+    unsigned non_zero_index = 0, 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))
@@ -2464,27 +2815,27 @@ struct ChainContextFormat2
       auto *o = out->ruleSet.serialize_append (c->serializer);
       if (unlikely (!o))
       {
-        ret = false;
-        break;
-      }
-      if (!o->serialize_subset (c, _, this, out,
-                                &backtrack_klass_map,
-                                &input_klass_map,
-                                &lookahead_klass_map))
-      {
-        rulesets.push (0);
+       ret = false;
+       break;
       }
-      else rulesets.push (1);
+      if (o->serialize_subset (c, _, this,
+                              lookup_map,
+                              &backtrack_klass_map,
+                              &input_klass_map,
+                              &lookahead_klass_map))
+        non_zero_index = index;
+
+      index++;
     }
 
     if (!ret) return_trace (ret);
 
     //prune empty trailing ruleSets
-    unsigned count = rulesets.length;
-    while (count > 0 && rulesets[count-1] == 0)
+    --index;
+    while (index > non_zero_index)
     {
       out->ruleSet.pop ();
-      count--;
+      index--;
     }
 
     return_trace (bool (out->ruleSet));
@@ -2566,11 +2917,21 @@ struct ChainContextFormat3
                                  lookup_context);
   }
 
+  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);
+    recurse_lookups (c, lookup.len, lookup.arrayZ);
+  }
+
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const {}
+
   void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
 
-    (this+input[0]).add_coverage (c->input);
+    (this+input[0]).collect_coverage (c->input);
 
     const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
@@ -2631,10 +2992,7 @@ struct ChainContextFormat3
 
   template<typename Iterator,
           hb_requires (hb_is_iterator (Iterator))>
-  bool serialize_coverage_offsets (hb_subset_context_t *c,
-                                   Iterator it,
-                                  const void* src_base,
-                                  const void* dst_base) const
+  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>> ();
@@ -2642,7 +3000,7 @@ struct ChainContextFormat3
     if (unlikely (!c->serializer->allocate_size<HBUINT16> (HBUINT16::static_size))) return_trace (false);
 
     + it
-    | hb_apply (subset_offset_array (c, *out, src_base, dst_base))
+    | hb_apply (subset_offset_array (c, *out, base))
     ;
 
     return_trace (out->len);
@@ -2656,19 +3014,27 @@ struct ChainContextFormat3
     if (unlikely (!out)) return_trace (false);
     if (unlikely (!c->serializer->embed (this->format))) return_trace (false);
 
-    if (!serialize_coverage_offsets (c, backtrack.iter (), this, out))
+    if (!serialize_coverage_offsets (c, backtrack.iter (), this))
       return_trace (false);
 
     const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
-    if (!serialize_coverage_offsets (c, input.iter (), this, out))
+    if (!serialize_coverage_offsets (c, input.iter (), this))
       return_trace (false);
 
     const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
-    if (!serialize_coverage_offsets (c, lookahead.iter (), this, out))
+    if (!serialize_coverage_offsets (c, lookahead.iter (), this))
       return_trace (false);
 
-    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
-    return_trace (c->serializer->copy (lookup));
+    const ArrayOf<LookupRecord> &lookupRecord = StructAfter<ArrayOf<LookupRecord>> (lookahead);
+    HBUINT16 lookupCount;
+    lookupCount = lookupRecord.len;
+    if (!c->serializer->copy (lookupCount)) return_trace (false);
+
+    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);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -2737,7 +3103,7 @@ struct ExtensionFormat1
 
   template <typename X>
   const X& get_subtable () const
-  { return this + CastR<LOffsetTo<typename T::SubTable>> (extensionOffset); }
+  { return this + reinterpret_cast<const LOffsetTo<typename T::SubTable> &> (extensionOffset); }
 
   template <typename context_t, typename ...Ts>
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
@@ -2747,6 +3113,9 @@ struct ExtensionFormat1
     return_trace (get_subtable<typename T::SubTable> ().dispatch (c, get_type (), hb_forward<Ts> (ds)...));
   }
 
+  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
+  { dispatch (c); }
+
   /* This is called from may_dispatch() above with hb_sanitize_context_t. */
   bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -2781,7 +3150,7 @@ struct Extension
   {
     switch (u.format) {
     case 1: return u.format1.template get_subtable<typename T::SubTable> ();
-    default:return Null(typename T::SubTable);
+    default:return Null (typename T::SubTable);
     }
   }
 
@@ -2814,7 +3183,7 @@ struct hb_ot_layout_lookup_accelerator_t
   void init (const TLookup &lookup)
   {
     digest.init ();
-    lookup.add_coverage (&digest);
+    lookup.collect_coverage (&digest);
 
     subtables.init ();
     OT::hb_get_subtables_context_t c_get_subtables (subtables);
@@ -2875,10 +3244,11 @@ struct GSUBGPOS
   bool find_variations_index (const int *coords, unsigned int num_coords,
                              unsigned int *index) const
   {
-#ifdef HB_NOVAR
+#ifdef HB_NO_VAR
+    *index = FeatureVariations::NOT_FOUND_INDEX;
     return false;
 #endif
-    return (version.to_int () >= 0x00010001u ? this+featureVars : Null(FeatureVariations))
+    return (version.to_int () >= 0x00010001u ? this+featureVars : Null (FeatureVariations))
            .find_index (coords, num_coords, index);
   }
   const Feature& get_feature_variation (unsigned int feature_index,
@@ -2897,32 +3267,71 @@ struct GSUBGPOS
     return get_feature (feature_index);
   }
 
+  void feature_variation_collect_lookups (const hb_set_t *feature_indexes,
+                                         hb_set_t       *lookup_indexes /* OUT */) const
+  {
+#ifndef HB_NO_VAR
+    if (version.to_int () >= 0x00010001u)
+      (this+featureVars).collect_lookups (feature_indexes, lookup_indexes);
+#endif
+  }
+
   template <typename TLookup>
-  bool subset (hb_subset_context_t *c) const
+  bool subset (hb_subset_layout_context_t *c) const
   {
     TRACE_SUBSET (this);
-    auto *out = c->serializer->embed (*this);
+    auto *out = c->subset_context->serializer->embed (*this);
     if (unlikely (!out)) return_trace (false);
 
-    out->scriptList.serialize_subset (c, scriptList, this, out);
-    out->featureList.serialize_subset (c, featureList, this, out);
+    typedef LookupOffsetList<TLookup> TLookupList;
+    reinterpret_cast<OffsetTo<TLookupList> &> (out->lookupList)
+       .serialize_subset (c->subset_context,
+                          reinterpret_cast<const OffsetTo<TLookupList> &> (lookupList),
+                          this,
+                          c);
 
-    typedef OffsetListOf<TLookup> TLookupList;
-    /* TODO Use intersects() to count how many subtables survive? */
-    CastR<OffsetTo<TLookupList>> (out->lookupList)
-      .serialize_subset (c,
-                        CastR<OffsetTo<TLookupList>> (lookupList),
-                        this,
-                        out);
+    reinterpret_cast<OffsetTo<RecordListOfFeature> &> (out->featureList)
+       .serialize_subset (c->subset_context,
+                          reinterpret_cast<const OffsetTo<RecordListOfFeature> &> (featureList),
+                          this,
+                          c);
+
+    out->scriptList.serialize_subset (c->subset_context,
+                                     scriptList,
+                                     this,
+                                     c);
 
 #ifndef HB_NO_VAR
     if (version.to_int () >= 0x00010001u)
-     out->featureVars.serialize_copy (c->serializer, featureVars, this, out);
+    {
+      bool ret = out->featureVars.serialize_subset (c->subset_context, featureVars, this, c);
+      if (!ret)
+      {
+       out->version.major = 1;
+       out->version.minor = 0;
+      }
+    }
 #endif
 
     return_trace (true);
   }
 
+  void closure_features (const hb_map_t *lookup_indexes, /* IN */
+                        hb_set_t       *feature_indexes /* OUT */) const
+  {
+    unsigned int feature_count = hb_min (get_feature_count (), (unsigned) HB_MAX_FEATURES);
+    for (unsigned i = 0; i < feature_count; i++)
+    {
+      const Feature& f = get_feature (i);
+      if ((!f.featureParams.is_null ()) || f.intersects_lookup_indexes (lookup_indexes))
+        feature_indexes->add (i);
+    }
+#ifndef HB_NO_VAR
+    if (version.to_int () >= 0x00010001u)
+      (this+featureVars).closure_features (lookup_indexes, feature_indexes);
+#endif
+  }
+
   unsigned int get_size () const
   {
     return min_size +
@@ -2938,7 +3347,7 @@ struct GSUBGPOS
                    likely (version.major == 1) &&
                    scriptList.sanitize (c, this) &&
                    featureList.sanitize (c, this) &&
-                   CastR<OffsetTo<TLookupList>> (lookupList).sanitize (c, this))))
+                   reinterpret_cast<const OffsetTo<TLookupList> &> (lookupList).sanitize (c, this))))
       return_trace (false);
 
 #ifndef HB_NO_VAR
@@ -2954,7 +3363,7 @@ struct GSUBGPOS
   {
     void init (hb_face_t *face)
     {
-      this->table = hb_sanitize_context_t().reference_table<T> (face);
+      this->table = hb_sanitize_context_t ().reference_table<T> (face);
       if (unlikely (this->table->is_blacklisted (this->table.get_blob (), face)))
       {
        hb_blob_destroy (this->table.get_blob ());
@@ -2988,11 +3397,11 @@ struct GSUBGPOS
   FixedVersion<>version;       /* Version of the GSUB/GPOS table--initially set
                                 * to 0x00010000u */
   OffsetTo<ScriptList>
-               scriptList;     /* ScriptList table */
+               scriptList;     /* ScriptList table */
   OffsetTo<FeatureList>
-               featureList;    /* FeatureList table */
+               featureList;    /* FeatureList table */
   OffsetTo<LookupList>
-               lookupList;     /* LookupList table */
+               lookupList;     /* LookupList table */
   LOffsetTo<FeatureVariations>
                featureVars;    /* Offset to Feature Variations
                                   table--from beginning of table
index 53eb623..ffd2bf4 100644 (file)
@@ -222,7 +222,7 @@ struct JSTF
   FixedVersion<>version;       /* Version of the JSTF table--initially set
                                 * to 0x00010000u */
   RecordArrayOf<JstfScript>
-               scriptList;     /* Array of JstfScripts--listed
+               scriptList;     /* Array of JstfScripts--listed
                                 * alphabetically by ScriptTag */
   public:
   DEFINE_SIZE_ARRAY (6, scriptList);
index fba3ad1..bf736fe 100644 (file)
@@ -318,7 +318,6 @@ hb_ot_layout_get_glyphs_in_class (hb_face_t                  *face,
   return face->table.GDEF->table->get_glyphs_in_class (klass, glyphs);
 }
 
-
 #ifndef HB_NO_LAYOUT_UNUSED
 /**
  * hb_ot_layout_get_attach_points:
@@ -369,7 +368,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 = 0;
+  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)
   {
@@ -399,27 +398,6 @@ OT::GSUB::is_blacklisted (hb_blob_t *blob HB_UNUSED,
 #ifdef HB_NO_OT_LAYOUT_BLACKLIST
   return false;
 #endif
-
-#ifndef HB_NO_AAT_SHAPE
-  /* Mac OS X prefers morx over GSUB.  It also ships with various Indic fonts,
-   * all by 'MUTF' foundry (Tamil MN, Tamil Sangam MN, etc.), that have broken
-   * GSUB/GPOS tables.  Some have GSUB with zero scripts, those are ignored by
-   * our morx/GSUB preference code.  But if GSUB has non-zero scripts, we tend
-   * to prefer it over morx because we want to be consistent with other OpenType
-   * shapers.
-   *
-   * To work around broken Indic Mac system fonts, we ignore GSUB table if
-   * OS/2 VendorId is 'MUTF' and font has morx table as well.
-   *
-   * https://github.com/harfbuzz/harfbuzz/issues/1410
-   * https://github.com/harfbuzz/harfbuzz/issues/1348
-   * https://github.com/harfbuzz/harfbuzz/issues/1391
-   */
-  if (unlikely (face->table.OS2->achVendID == HB_TAG ('M','U','T','F') &&
-               face->table.morx->has_data ()))
-    return true;
-#endif
-
   return false;
 }
 
@@ -440,7 +418,7 @@ get_gsubgpos_table (hb_face_t *face,
   switch (table_tag) {
     case HB_OT_TAG_GSUB: return *face->table.GSUB->table;
     case HB_OT_TAG_GPOS: return *face->table.GPOS->table;
-    default:             return Null(OT::GSUBGPOS);
+    default:             return Null (OT::GSUBGPOS);
   }
 }
 
@@ -785,7 +763,7 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
                                                  hb_tag_t      table_tag,
                                                  unsigned int  script_index,
                                                  unsigned int  language_index,
-                                                 unsigned int *feature_index)
+                                                 unsigned int *feature_index /* OUT */)
 {
   return hb_ot_layout_language_get_required_feature (face,
                                                     table_tag,
@@ -802,7 +780,7 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
  * @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: The index of the requested feature
+ * @feature_index: (out): The index of the requested feature
  * @feature_tag: (out): The #hb_tag_t of the requested feature
  *
  * Fetches the tag of a requested feature index in the given face's GSUB or GPOS table,
@@ -817,8 +795,8 @@ hb_ot_layout_language_get_required_feature (hb_face_t    *face,
                                            hb_tag_t      table_tag,
                                            unsigned int  script_index,
                                            unsigned int  language_index,
-                                           unsigned int *feature_index,
-                                           hb_tag_t     *feature_tag)
+                                           unsigned int *feature_index /* OUT */,
+                                           hb_tag_t     *feature_tag   /* OUT */)
 {
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
   const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
@@ -1004,7 +982,7 @@ struct hb_collect_features_context_t
                                 hb_set_t  *feature_indexes_)
     : g (get_gsubgpos_table (face, table_tag)),
       feature_indexes (feature_indexes_),
-      script_count(0),langsys_count(0) {}
+      script_count (0),langsys_count (0), feature_index_count (0) {}
 
   bool visited (const OT::Script &s)
   {
@@ -1033,6 +1011,12 @@ struct hb_collect_features_context_t
     return visited (l, visited_langsys);
   }
 
+  bool visited_feature_indices (unsigned count)
+  {
+    feature_index_count += count;
+    return feature_index_count > HB_MAX_FEATURE_INDICES;
+  }
+
   private:
   template <typename T>
   bool visited (const T &p, hb_set_t &visited_set)
@@ -1054,6 +1038,7 @@ struct hb_collect_features_context_t
   hb_set_t visited_langsys;
   unsigned int script_count;
   unsigned int langsys_count;
+  unsigned int feature_index_count;
 };
 
 static void
@@ -1066,10 +1051,11 @@ langsys_collect_features (hb_collect_features_context_t *c,
   if (!features)
   {
     /* All features. */
-    if (l.has_required_feature ())
+    if (l.has_required_feature () && !c->visited_feature_indices (1))
       c->feature_indexes->add (l.get_required_feature_index ());
 
-    l.add_feature_indexes_to (c->feature_indexes);
+    if (!c->visited_feature_indices (l.featureIndex.len))
+      l.add_feature_indexes_to (c->feature_indexes);
   }
   else
   {
@@ -1212,8 +1198,76 @@ hb_ot_layout_collect_lookups (hb_face_t      *face,
   for (hb_codepoint_t feature_index = HB_SET_VALUE_INVALID;
        hb_set_next (&feature_indexes, &feature_index);)
     g.get_feature (feature_index).add_lookup_indexes_to (lookup_indexes);
+
+  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
 /**
@@ -1223,7 +1277,7 @@ hb_ot_layout_collect_lookups (hb_face_t      *face,
  * @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 substition range
+ * @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
  *
  * Fetches a list of all glyphs affected by the specified lookup in the
@@ -1458,8 +1512,8 @@ hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer,
  **/
 void
 hb_ot_layout_lookup_substitute_closure (hb_face_t    *face,
-                                       unsigned int  lookup_index,
-                                       hb_set_t     *glyphs /* OUT */)
+                                       unsigned int  lookup_index,
+                                       hb_set_t     *glyphs /* OUT */)
 {
   hb_map_t done_lookups;
   OT::hb_closure_context_t c (face, glyphs, &done_lookups);
@@ -1494,7 +1548,7 @@ hb_ot_layout_lookups_substitute_closure (hb_face_t      *face,
   do
   {
     glyphs_length = glyphs->get_population ();
-    if (lookups != nullptr)
+    if (lookups)
     {
       for (hb_codepoint_t lookup_index = HB_SET_VALUE_INVALID; hb_set_next (lookups, &lookup_index);)
        gsub.get_lookup (lookup_index).closure (&c, lookup_index);
@@ -1587,8 +1641,8 @@ hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer)
  * specifically in their respective size ranges; other ways to differentiate fonts within
  * a subfamily are not covered by the `size` feature.
  *
- * For more information on this distinction, see the `size` documentation at
- * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-39size39
+ * 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
  *
@@ -1957,7 +2011,7 @@ hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
  *
  * Fetches a baseline value from the face.
  *
- * Return value: if found baseline value in the the font.
+ * Return value: if found baseline value in the font.
  *
  * Since: 2.6.0
  **/
index 7e8a897..6255a91 100644 (file)
@@ -121,7 +121,6 @@ hb_ot_layout_get_glyphs_in_class (hb_face_t                  *face,
                                  hb_ot_layout_glyph_class_t  klass,
                                  hb_set_t                   *glyphs /* OUT */);
 
-
 /* Not that useful.  Provides list of attach points for a glyph that a
  * client may want to cache */
 HB_EXTERN unsigned int
@@ -161,7 +160,7 @@ HB_EXTERN hb_bool_t
 hb_ot_layout_table_find_script (hb_face_t    *face,
                                hb_tag_t      table_tag,
                                hb_tag_t      script_tag,
-                               unsigned int *script_index);
+                               unsigned int *script_index /* OUT */);
 
 HB_EXTERN hb_bool_t
 hb_ot_layout_table_select_script (hb_face_t      *face,
@@ -199,15 +198,15 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
                                                  hb_tag_t      table_tag,
                                                  unsigned int  script_index,
                                                  unsigned int  language_index,
-                                                 unsigned int *feature_index);
+                                                 unsigned int *feature_index /* OUT */);
 
 HB_EXTERN hb_bool_t
 hb_ot_layout_language_get_required_feature (hb_face_t    *face,
                                            hb_tag_t      table_tag,
                                            unsigned int  script_index,
                                            unsigned int  language_index,
-                                           unsigned int *feature_index,
-                                           hb_tag_t     *feature_tag);
+                                           unsigned int *feature_index /* OUT */,
+                                           hb_tag_t     *feature_tag /* OUT */);
 
 HB_EXTERN unsigned int
 hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
@@ -233,7 +232,7 @@ hb_ot_layout_language_find_feature (hb_face_t    *face,
                                    unsigned int  script_index,
                                    unsigned int  language_index,
                                    hb_tag_t      feature_tag,
-                                   unsigned int *feature_index);
+                                   unsigned int *feature_index /* OUT */);
 
 HB_EXTERN unsigned int
 hb_ot_layout_feature_get_lookups (hb_face_t    *face,
@@ -263,6 +262,20 @@ 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,
index f3bb155..4e052b0 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);
 
index 0a4827d..b4f2fb9 100644 (file)
@@ -134,13 +134,13 @@ struct hb_ot_map_t
   unsigned int get_feature_stage (unsigned int table_index, hb_tag_t feature_tag) const
   {
     const feature_map_t *map = features.bsearch (feature_tag);
-    return map ? map->stage[table_index] : (unsigned int) -1;
+    return map ? map->stage[table_index] : UINT_MAX;
   }
 
   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 == (unsigned int) -1)) {
+    if (unlikely (stage == UINT_MAX)) {
       *plookups = nullptr;
       *lookup_count = 0;
       return;
index 7529e0c..0033f4c 100644 (file)
@@ -48,7 +48,7 @@ struct MathValueRecord
   }
 
   protected:
-  HBINT16                      value;          /* The X or Y value in design units */
+  HBINT16              value;          /* The X or Y value in design units */
   OffsetTo<Device>     deviceTable;    /* Offset to the device table - from the
                                         * beginning of parent table.  May be NULL.
                                         * Suggested format for device table is 1. */
@@ -279,14 +279,15 @@ struct MathKern
   protected:
   HBUINT16     heightCount;
   UnsizedArrayOf<MathValueRecord>
-               mathValueRecordsZ;      /* Array of correction heights at
-                                        * which the kern value changes.
-                                        * Sorted by the height value in
-                                        * design units (heightCount entries),
-                                        * Followed by:
-                                        * Array of kern values corresponding
-                                        * to heights. (heightCount+1 entries).
-                                        */
+               mathValueRecordsZ;
+                               /* Array of correction heights at
+                                * which the kern value changes.
+                                * Sorted by the height value in
+                                * design units (heightCount entries),
+                                * Followed by:
+                                * Array of kern values corresponding
+                                * to heights. (heightCount+1 entries).
+                                */
 
   public:
   DEFINE_SIZE_ARRAY (2, mathValueRecordsZ);
@@ -345,15 +346,18 @@ struct MathKernInfo
   }
 
   protected:
-  OffsetTo<Coverage>           mathKernCoverage;    /* Offset to Coverage table -
-                                                     * from the beginning of the
-                                                     * MathKernInfo table. */
-  ArrayOf<MathKernInfoRecord>  mathKernInfoRecords; /* Array of
-                                                     * MathKernInfoRecords,
-                                                     * per-glyph information for
-                                                     * mathematical positioning
-                                                     * of subscripts and
-                                                     * superscripts. */
+  OffsetTo<Coverage>
+               mathKernCoverage;
+                               /* Offset to Coverage table -
+                                * from the beginning of the
+                                * MathKernInfo table. */
+  ArrayOf<MathKernInfoRecord>
+               mathKernInfoRecords;
+                               /* Array of MathKernInfoRecords,
+                                * per-glyph information for
+                                * mathematical positioning
+                                * of subscripts and
+                                * superscripts. */
 
   public:
   DEFINE_SIZE_ARRAY (4, mathKernInfoRecords);
@@ -471,19 +475,21 @@ struct MathGlyphPartRecord
   }
 
   protected:
-  HBGlyphID   glyph;             /* Glyph ID for the part. */
-  HBUINT16    startConnectorLength; /* Advance width/ height of the straight bar
-                                  * connector material, in design units, is at
-                                  * the beginning of the glyph, in the
-                                  * direction of the extension. */
-  HBUINT16    endConnectorLength;   /* Advance width/ height of the straight bar
-                                  * connector material, in design units, is at
-                                  * the end of the glyph, in the direction of
-                                  * the extension. */
-  HBUINT16    fullAdvance;       /* Full advance width/height for this part,
-                                  * in the direction of the extension.
-                                  * In design units. */
-  PartFlags partFlags;           /* Part qualifiers. */
+  HBGlyphID    glyph;          /* Glyph ID for the part. */
+  HBUINT16     startConnectorLength;
+                               /* Advance width/ height of the straight bar
+                                * connector material, in design units, is at
+                                * the beginning of the glyph, in the
+                                * direction of the extension. */
+  HBUINT16     endConnectorLength;
+                               /* Advance width/ height of the straight bar
+                                * connector material, in design units, is at
+                                * the end of the glyph, in the direction of
+                                * the extension. */
+  HBUINT16     fullAdvance;    /* Full advance width/height for this part,
+                                * in the direction of the extension.
+                                * In design units. */
+  PartFlags    partFlags;      /* Part qualifiers. */
 
   public:
   DEFINE_SIZE_STATIC (10);
@@ -522,12 +528,15 @@ struct MathGlyphAssembly
   }
 
   protected:
-  MathValueRecord         italicsCorrection; /* Italics correction of this
-                                              * MathGlyphAssembly. Should not
-                                              * depend on the assembly size. */
-  ArrayOf<MathGlyphPartRecord> partRecords;   /* Array of part records, from
-                                              * left to right and bottom to
-                                              * top. */
+  MathValueRecord
+               italicsCorrection;
+                               /* Italics correction of this
+                                * MathGlyphAssembly. Should not
+                                * depend on the assembly size. */
+  ArrayOf<MathGlyphPartRecord>
+               partRecords;    /* Array of part records, from
+                                * left to right and bottom to
+                                * top. */
 
   public:
   DEFINE_SIZE_ARRAY (6, partRecords);
@@ -645,27 +654,30 @@ struct MathVariants
   }
 
   protected:
-  HBUINT16          minConnectorOverlap; /* Minimum overlap of connecting
-                                          * glyphs during glyph construction,
-                                          * in design units. */
-  OffsetTo<Coverage> vertGlyphCoverage;   /* Offset to Coverage table -
-                                          * from the beginning of MathVariants
-                                          * table. */
-  OffsetTo<Coverage> horizGlyphCoverage;  /* Offset to Coverage table -
-                                          * from the beginning of MathVariants
-                                          * table. */
-  HBUINT16          vertGlyphCount;      /* Number of glyphs for which
-                                          * information is provided for
-                                          * vertically growing variants. */
-  HBUINT16          horizGlyphCount;     /* Number of glyphs for which
-                                          * information is provided for
-                                          * horizontally growing variants. */
+  HBUINT16     minConnectorOverlap;
+                               /* Minimum overlap of connecting
+                                * glyphs during glyph construction,
+                                * in design units. */
+  OffsetTo<Coverage> vertGlyphCoverage;
+                               /* Offset to Coverage table -
+                                * from the beginning of MathVariants
+                                * table. */
+  OffsetTo<Coverage> horizGlyphCoverage;
+                               /* Offset to Coverage table -
+                                * from the beginning of MathVariants
+                                * table. */
+  HBUINT16     vertGlyphCount; /* Number of glyphs for which
+                                * information is provided for
+                                * vertically growing variants. */
+  HBUINT16     horizGlyphCount;/* Number of glyphs for which
+                                * information is provided for
+                                * horizontally growing variants. */
 
   /* Array of offsets to MathGlyphConstruction tables - from the beginning of
      the MathVariants table, for shapes growing in vertical/horizontal
      direction. */
   UnsizedArrayOf<OffsetTo<MathGlyphConstruction>>
-                       glyphConstruction;
+                       glyphConstruction;
 
   public:
   DEFINE_SIZE_ARRAY (10, glyphConstruction);
@@ -702,11 +714,14 @@ struct MATH
   const MathVariants &get_variants () const    { return this+mathVariants; }
 
   protected:
-  FixedVersion<>version;               /* Version of the MATH table
-                                        * initially set to 0x00010000u */
-  OffsetTo<MathConstants> mathConstants;/* MathConstants table */
-  OffsetTo<MathGlyphInfo> mathGlyphInfo;/* MathGlyphInfo table */
-  OffsetTo<MathVariants>  mathVariants;        /* MathVariants table */
+  FixedVersion<>version;       /* Version of the MATH table
+                                * initially set to 0x00010000u */
+  OffsetTo<MathConstants>
+               mathConstants;  /* MathConstants table */
+  OffsetTo<MathGlyphInfo>
+               mathGlyphInfo;  /* MathGlyphInfo table */
+  OffsetTo<MathVariants>
+               mathVariants;   /* MathVariants table */
 
   public:
   DEFINE_SIZE_STATIC (10);
index 1c25eda..929956d 100644 (file)
@@ -126,9 +126,10 @@ struct maxp
   }
 
   protected:
-  FixedVersion<>version;               /* Version of the maxp table (0.5 or 1.0),
-                                        * 0x00005000u or 0x00010000u. */
-  HBUINT16     numGlyphs;              /* The number of glyphs in the font. */
+  FixedVersion<>version;/* Version of the maxp table (0.5 or 1.0),
+                        * 0x00005000u or 0x00010000u. */
+  HBUINT16     numGlyphs;
+                       /* The number of glyphs in the font. */
 /*maxpV1Tail   v1Tail[HB_VAR_ARRAY]; */
   public:
   DEFINE_SIZE_STATIC (6);
index 43a02d6..1225e26 100644 (file)
@@ -56,7 +56,7 @@ struct DataMap
 
   protected:
   Tag          tag;            /* A tag indicating the type of metadata. */
-  LOffsetTo<UnsizedArrayOf<HBUINT8>>
+  LNNOffsetTo<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
@@ -108,12 +108,13 @@ struct meta
   protected:
   HBUINT32     version;        /* Version number of the metadata table — set to 1. */
   HBUINT32     flags;          /* Flags — currently unused; set to 0. */
-  HBUINT32     dataOffset;     /* Per Apple specification:
+  HBUINT32     dataOffset;
+                               /* Per Apple specification:
                                 * Offset from the beginning of the table to the data.
                                 * Per OT specification:
                                 * Reserved. Not used; should be set to 0. */
   LArrayOf<DataMap>
-               dataMaps;       /* Array of data map records. */
+               dataMaps;/* Array of data map records. */
   public:
   DEFINE_SIZE_ARRAY (16, dataMaps);
 };
index 580e763..c496dc2 100644 (file)
 
 struct hb_ot_language_map_t
 {
-  static int cmp (const void *key, const void *item)
-  {
-    unsigned int a = * (unsigned int *) key;
-    unsigned int b = ((const hb_ot_language_map_t *) item)->code;
-    return a < b ? -1 : a > b ? +1 : 0;
-  }
+  int cmp (unsigned int key) const
+  { return key < code ? -1 : key > code ? +1 : 0; }
 
   uint16_t     code;
   char         lang[6];
@@ -433,12 +429,7 @@ _hb_ot_name_language_for (unsigned int code,
 #ifdef HB_NO_OT_NAME_LANGUAGE
   return HB_LANGUAGE_INVALID;
 #endif
-  const hb_ot_language_map_t *entry = (const hb_ot_language_map_t *)
-                                     hb_bsearch (&code,
-                                                 array,
-                                                 len,
-                                                 sizeof (array[0]),
-                                                 hb_ot_language_map_t::cmp);
+  auto *entry = hb_bsearch (code, array, len);
 
   if (entry)
     return hb_language_from_string (entry->lang, -1);
index 84be04c..b46976d 100644 (file)
@@ -97,17 +97,47 @@ struct NameRecord
     return UNSUPPORTED;
   }
 
-  NameRecord* copy (hb_serialize_context_t *c,
-                   const void *src_base,
-                   const void *dst_base) const
+  NameRecord* 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->offset.serialize_copy (c, offset, src_base, dst_base, length);
+    out->offset.serialize_copy (c, offset, base, 0, hb_serialize_context_t::Tail, length);
     return_trace (out);
   }
 
+  bool isUnicode () const
+  {
+    unsigned int p = platformID;
+    unsigned int e = encodingID;
+
+    return (p == 0 ||
+           (p == 3 && (e == 0 || e == 1 || e == 10)));
+  }
+
+  static int cmp (const void *pa, const void *pb)
+  {
+    const NameRecord *a = (const NameRecord *)pa;
+    const NameRecord *b = (const NameRecord *)pb;
+
+    if (a->platformID != b->platformID)
+      return a->platformID - b->platformID;
+
+    if (a->encodingID != b->encodingID)
+      return a->encodingID - b->encodingID;
+
+    if (a->languageID != b->languageID)
+      return a->languageID - b->languageID;
+
+    if (a->nameID != b->nameID)
+      return a->nameID - b->nameID;
+
+    if (a->length != b->length)
+      return a->length - b->length;
+
+    return 0;
+  }
+
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -134,7 +164,7 @@ _hb_ot_name_entry_cmp_key (const void *pa, const void *pb)
   /* Compare by name_id, then language. */
 
   if (a->name_id != b->name_id)
-    return a->name_id < b->name_id ? -1 : +1;
+    return a->name_id - b->name_id;
 
   if (a->language == b->language) return 0;
   if (!a->language) return -1;
@@ -156,10 +186,10 @@ _hb_ot_name_entry_cmp (const void *pa, const void *pb)
   const hb_ot_name_entry_t *b = (const hb_ot_name_entry_t *) pb;
 
   if (a->entry_score != b->entry_score)
-    return a->entry_score < b->entry_score ? -1 : +1;
+    return a->entry_score - b->entry_score;
 
   if (a->entry_index != b->entry_index)
-    return a->entry_index < b->entry_index ? -1 : +1;
+    return a->entry_index - b->entry_index;
 
   return 0;
 }
@@ -184,18 +214,23 @@ struct name
     this->format = 0;
     this->count = it.len ();
 
-    auto snap = c->snapshot ();
-    this->nameRecordZ.serialize (c, this->count);
-    if (unlikely (!c->check_assign (this->stringOffset, c->length ()))) return_trace (false);
-    c->revert (snap);
+    NameRecord *name_records = (NameRecord *) calloc (it.len (), NameRecord::static_size);
+    hb_array_t<NameRecord> records (name_records, it.len ());
+
+    for (const NameRecord& record : it)
+    {
+      memcpy (name_records, &record, NameRecord::static_size);
+      name_records++;
+    }
 
-    const void *dst_string_pool = &(this + this->stringOffset);
+    records.qsort ();
 
-    for (const auto &_ : it) c->copy (_, src_string_pool, dst_string_pool);
+    c->copy_all (records, src_string_pool);
+    free (records.arrayZ);
 
     if (unlikely (c->ran_out_of_room)) return_trace (false);
 
-    assert (this->stringOffset == c->length ());
+    this->stringOffset = c->length ();
 
     return_trace (true);
   }
@@ -210,6 +245,8 @@ struct name
     auto it =
     + 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 (); })
     ;
 
     name_prime->serialize (c->serializer, it, hb_addressof (this + stringOffset));
@@ -237,7 +274,7 @@ struct name
   {
     void init (hb_face_t *face)
     {
-      this->table = hb_sanitize_context_t().reference_table<name> (face);
+      this->table = hb_sanitize_context_t ().reference_table<name> (face);
       assert (this->table.get_length () >= this->table->stringOffset);
       this->pool = (const char *) (const void *) (this->table+this->table->stringOffset);
       this->pool_len = this->table.get_length () - this->table->stringOffset;
@@ -281,16 +318,14 @@ struct name
       this->table.destroy ();
     }
 
-    int get_index (hb_ot_name_id_t   name_id,
-                         hb_language_t     language,
-                         unsigned int     *width=nullptr) const
+    int get_index (hb_ot_name_id_t  name_id,
+                  hb_language_t    language,
+                  unsigned int    *width=nullptr) const
     {
       const hb_ot_name_entry_t key = {name_id, {0}, language};
-      const hb_ot_name_entry_t *entry = (const hb_ot_name_entry_t *)
-                                       hb_bsearch (&key,
-                                                   (const hb_ot_name_entry_t *) this->names,
+      const hb_ot_name_entry_t *entry = hb_bsearch (key, (const hb_ot_name_entry_t *) this->names,
                                                    this->names.length,
-                                                   sizeof (key),
+                                                   sizeof (hb_ot_name_entry_t),
                                                    _hb_ot_name_entry_cmp_key);
       if (!entry)
        return -1;
@@ -318,12 +353,12 @@ struct name
   };
 
   /* We only implement format 0 for now. */
-  HBUINT16     format;                 /* Format selector (=0/1). */
-  HBUINT16     count;                  /* Number of name records. */
+  HBUINT16     format;         /* Format selector (=0/1). */
+  HBUINT16     count;          /* Number of name records. */
   NNOffsetTo<UnsizedArrayOf<HBUINT8>>
-               stringOffset;           /* Offset to start of string storage (from start of table). */
+               stringOffset;   /* Offset to start of string storage (from start of table). */
   UnsizedArrayOf<NameRecord>
-               nameRecordZ;            /* The name records where count is the number of records. */
+               nameRecordZ;    /* The name records where count is the number of records. */
   public:
   DEFINE_SIZE_ARRAY (6, nameRecordZ);
 };
index f6b1503..f538fd4 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "hb-open-type.hh"
 #include "hb-ot-os2-unicode-ranges.hh"
+#include "hb-ot-cmap-table.hh"
 
 #include "hb-set.hh"
 
@@ -172,12 +173,28 @@ struct OS2
     OS2 *os2_prime = c->serializer->embed (this);
     if (unlikely (!os2_prime)) return_trace (false);
 
+    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)
+    ;
     uint16_t min_cp, max_cp;
-    find_min_and_max_codepoint (c->plan->unicodes, &min_cp, &max_cp);
+    find_min_and_max_codepoint (&unicodes, &min_cp, &max_cp);
     os2_prime->usFirstCharIndex = min_cp;
     os2_prime->usLastCharIndex = max_cp;
 
-    _update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange);
+    _update_unicode_ranges (&unicodes, os2_prime->ulUnicodeRange);
 
     return_trace (true);
   }
@@ -216,19 +233,20 @@ struct OS2
                                          uint16_t *min_cp, /* OUT */
                                          uint16_t *max_cp  /* OUT */)
   {
-    *min_cp = codepoints->get_min ();
-    *max_cp = codepoints->get_max ();
+    *min_cp = hb_min (0xFFFFu, codepoints->get_min ());
+    *max_cp = hb_min (0xFFFFu, codepoints->get_max ());
   }
 
   /* https://github.com/Microsoft/Font-Validator/blob/520aaae/OTFontFileVal/val_OS2.cs#L644-L681 */
-  enum font_page_t {
-    HEBREW_FONT_PAGE           = 0xB100, // Hebrew Windows 3.1 font page
-    SIMP_ARABIC_FONT_PAGE      = 0xB200, // Simplified Arabic Windows 3.1 font page
-    TRAD_ARABIC_FONT_PAGE      = 0xB300, // Traditional Arabic Windows 3.1 font page
-    OEM_ARABIC_FONT_PAGE       = 0xB400, // OEM Arabic Windows 3.1 font page
-    SIMP_FARSI_FONT_PAGE       = 0xBA00, // Simplified Farsi Windows 3.1 font page
-    TRAD_FARSI_FONT_PAGE       = 0xBB00, // Traditional Farsi Windows 3.1 font page
-    THAI_FONT_PAGE             = 0xDE00  // Thai Windows 3.1 font page
+  enum font_page_t
+  {
+    FONT_PAGE_HEBREW           = 0xB100, /* Hebrew Windows 3.1 font page */
+    FONT_PAGE_SIMP_ARABIC      = 0xB200, /* Simplified Arabic Windows 3.1 font page */
+    FONT_PAGE_TRAD_ARABIC      = 0xB300, /* Traditional Arabic Windows 3.1 font page */
+    FONT_PAGE_OEM_ARABIC       = 0xB400, /* OEM Arabic Windows 3.1 font page */
+    FONT_PAGE_SIMP_FARSI       = 0xBA00, /* Simplified Farsi Windows 3.1 font page */
+    FONT_PAGE_TRAD_FARSI       = 0xBB00, /* Traditional Farsi Windows 3.1 font page */
+    FONT_PAGE_THAI             = 0xDE00  /* Thai Windows 3.1 font page */
   };
   font_page_t get_font_page () const
   { return (font_page_t) (version == 0 ? fsSelection & 0xFF00 : 0); }
index b0ccd00..9613d2d 100644 (file)
@@ -33,19 +33,8 @@ namespace OT {
 
 struct OS2Range
 {
-  static int
-  cmp (const void *_key, const void *_item)
-  {
-    hb_codepoint_t cp = *((hb_codepoint_t *) _key);
-    const OS2Range *range = (OS2Range *) _item;
-
-    if (cp < range->start)
-      return -1;
-    else if (cp <= range->end)
-      return 0;
-    else
-      return +1;
-  }
+  int cmp (hb_codepoint_t key) const
+  { return (key < start) ? -1 : key <= end ? 0 : +1; }
 
   hb_codepoint_t start;
   hb_codepoint_t end;
@@ -233,13 +222,8 @@ static const OS2Range _hb_os2_unicode_ranges[] =
 static unsigned int
 _hb_ot_os2_get_unicode_range_bit (hb_codepoint_t cp)
 {
-  OS2Range *range = (OS2Range*) hb_bsearch (&cp, _hb_os2_unicode_ranges,
-                                           ARRAY_LENGTH (_hb_os2_unicode_ranges),
-                                           sizeof (OS2Range),
-                                           OS2Range::cmp);
-  if (range != nullptr)
-    return range->bit;
-  return -1;
+  auto *range = hb_sorted_array (_hb_os2_unicode_ranges).bsearch (cp);
+  return range ? range->bit : -1;
 }
 
 } /* namespace OT */
index 38302f5..8586331 100644 (file)
@@ -35,8 +35,6 @@
 #undef HB_STRING_ARRAY_LIST
 #undef HB_STRING_ARRAY_NAME
 
-#define NUM_FORMAT1_NAMES 258
-
 /*
  * post -- PostScript
  * https://docs.microsoft.com/en-us/typography/opentype/spec/post
@@ -167,8 +165,7 @@ struct post
       }
 
       hb_bytes_t st (name, len);
-      const uint16_t *gid = (const uint16_t *) hb_bsearch (hb_addressof (st), gids, count,
-                                                          sizeof (gids[0]), cmp_key, (void *) this);
+      auto* gid = hb_bsearch (st, gids, count, sizeof (gids[0]), cmp_key, (void *) this);
       if (gid)
       {
        *glyph = *gid;
@@ -185,7 +182,7 @@ struct post
     unsigned int get_glyph_count () const
     {
       if (version == 0x00010000)
-       return NUM_FORMAT1_NAMES;
+       return format1_names_length;
 
       if (version == 0x00020000)
        return glyphNameIndex->len;
@@ -213,7 +210,7 @@ struct post
     {
       if (version == 0x00010000)
       {
-       if (glyph >= NUM_FORMAT1_NAMES)
+       if (glyph >= format1_names_length)
          return hb_bytes_t ();
 
        return format1_names (glyph);
@@ -223,9 +220,9 @@ struct post
        return hb_bytes_t ();
 
       unsigned int index = glyphNameIndex->arrayZ[glyph];
-      if (index < NUM_FORMAT1_NAMES)
+      if (index < format1_names_length)
        return format1_names (index);
-      index -= NUM_FORMAT1_NAMES;
+      index -= format1_names_length;
 
       if (index >= index_to_offset.length)
        return hb_bytes_t ();
@@ -262,7 +259,7 @@ struct post
                                         * 0x00020000 for version 2.0
                                         * 0x00025000 for version 2.5 (deprecated)
                                         * 0x00030000 for version 3.0 */
-  HBFixed              italicAngle;            /* Italic angle in counter-clockwise degrees
+  HBFixed      italicAngle;            /* Italic angle in counter-clockwise degrees
                                         * from the vertical. Zero for upright text,
                                         * negative for text that leans to the right
                                         * (forward). */
index 2a7a8eb..262ab8a 100644 (file)
@@ -292,7 +292,7 @@ arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
 {
   arabic_fallback_plan_t *fallback_plan = (arabic_fallback_plan_t *) calloc (1, sizeof (arabic_fallback_plan_t));
   if (unlikely (!fallback_plan))
-    return const_cast<arabic_fallback_plan_t *> (&Null(arabic_fallback_plan_t));
+    return const_cast<arabic_fallback_plan_t *> (&Null (arabic_fallback_plan_t));
 
   fallback_plan->num_lookups = 0;
   fallback_plan->free_lookups = false;
@@ -309,7 +309,7 @@ arabic_fallback_plan_create (const hb_ot_shape_plan_t *plan,
 
   assert (fallback_plan->num_lookups == 0);
   free (fallback_plan);
-  return const_cast<arabic_fallback_plan_t *> (&Null(arabic_fallback_plan_t));
+  return const_cast<arabic_fallback_plan_t *> (&Null (arabic_fallback_plan_t));
 }
 
 static void
index 719fabd..70ffe62 100644 (file)
@@ -6,10 +6,10 @@
  *
  * on files with these headers:
  *
- * # ArabicShaping-12.0.0.txt
- * # Date: 2018-09-22, 23:54:00 GMT [KW, RP]
- * # Blocks-12.0.0.txt
- * # Date: 2018-07-30, 19:40:00 GMT [KW]
+ * # 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]
  * UnicodeData.txt does not have a header.
  */
 
 #define HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH
 
 
-#define X      JOINING_TYPE_X
-#define R      JOINING_TYPE_R
-#define T      JOINING_TYPE_T
-#define U      JOINING_TYPE_U
 #define A      JOINING_GROUP_ALAPH
 #define DR     JOINING_GROUP_DALATH_RISH
-#define L      JOINING_TYPE_L
 #define C      JOINING_TYPE_C
 #define D      JOINING_TYPE_D
+#define L      JOINING_TYPE_L
+#define R      JOINING_TYPE_R
+#define T      JOINING_TYPE_T
+#define U      JOINING_TYPE_U
+#define X      JOINING_TYPE_X
 
 static const uint8_t joining_table[] =
 {
@@ -71,7 +71,7 @@ static const uint8_t joining_table[] =
 
   /* Mandaic */
 
-  /* 0840 */ R,D,D,D,D,D,R,R,D,R,D,D,D,D,D,D,D,D,D,D,R,D,U,U,U,X,X,X,X,X,X,X,
+  /* 0840 */ R,D,D,D,D,D,R,R,D,R,D,D,D,D,D,D,D,D,D,D,R,D,R,R,R,X,X,X,X,X,X,X,
 
   /* Syriac Supplement */
 
@@ -80,8 +80,8 @@ static const uint8_t joining_table[] =
 
   /* 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,X,X,
-  /* 08C0 */ 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,
+  /* 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,
   /* 08E0 */ X,X,U,
 
 #define joining_offset_0x1806u 739
@@ -139,14 +139,21 @@ static const uint8_t joining_table[] =
   /* 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,
 
-#define joining_offset_0x110bdu 1219
+#define joining_offset_0x10fb0u 1219
+
+  /* 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
 
   /* Kaithi */
 
   /* 110A0 */                                                           U,X,X,
   /* 110C0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,U,
 
-#define joining_offset_0x1e900u 1236
+#define joining_offset_0x1e900u 1264
 
   /* Adlam */
 
@@ -154,7 +161,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: 1312; occupancy: 56% */
+}; /* Table items: 1340; occupancy: 57% */
 
 
 static unsigned int
@@ -183,6 +190,7 @@ joining_type (hb_codepoint_t u)
       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];
       break;
 
     case 0x11u:
@@ -199,15 +207,15 @@ joining_type (hb_codepoint_t u)
   return X;
 }
 
-#undef X
-#undef R
-#undef T
-#undef U
 #undef A
 #undef DR
-#undef L
 #undef C
 #undef D
+#undef L
+#undef R
+#undef T
+#undef U
+#undef X
 
 
 static const uint16_t shaping_table[][4] =
@@ -406,16 +414,16 @@ static const struct ligature_set_t {
 } ligature_table[] =
 {
   { 0xFEDFu, {
-    { 0xFE88u, 0xFEF9u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM */
     { 0xFE82u, 0xFEF5u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM */
-    { 0xFE8Eu, 0xFEFBu }, /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM */
     { 0xFE84u, 0xFEF7u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM */
+    { 0xFE88u, 0xFEF9u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM */
+    { 0xFE8Eu, 0xFEFBu }, /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM */
   }},
   { 0xFEE0u, {
-    { 0xFE88u, 0xFEFAu }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM */
     { 0xFE82u, 0xFEF6u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM */
-    { 0xFE8Eu, 0xFEFCu }, /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM */
     { 0xFE84u, 0xFEF8u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM */
+    { 0xFE88u, 0xFEFAu }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM */
+    { 0xFE8Eu, 0xFEFCu }, /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM */
   }},
 };
 
index f92e637..0c1863b 100644 (file)
@@ -271,7 +271,7 @@ data_create_arabic (const hb_ot_shape_plan_t *plan)
     arabic_plan->mask_array[i] = plan->map.get_1_mask (arabic_features[i]);
     arabic_plan->do_fallback = arabic_plan->do_fallback &&
                               (FEATURE_IS_SYRIAC (arabic_features[i]) ||
-                               plan->map.needs_fallback (arabic_features[i]));
+                               plan->map.needs_fallback (arabic_features[i]));
   }
 
   return arabic_plan;
@@ -292,7 +292,7 @@ arabic_joining (hb_buffer_t *buffer)
 {
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
-  unsigned int prev = (unsigned int) -1, state = 0;
+  unsigned int prev = UINT_MAX, state = 0;
 
   /* Check pre-context */
   for (unsigned int i = 0; i < buffer->context_len[0]; i++)
@@ -318,7 +318,7 @@ arabic_joining (hb_buffer_t *buffer)
 
     const arabic_state_table_entry *entry = &arabic_state_table[state][this_type];
 
-    if (entry->prev_action != NONE && prev != (unsigned int) -1)
+    if (entry->prev_action != NONE && prev != UINT_MAX)
     {
       info[prev].arabic_shaping_action() = entry->prev_action;
       buffer->unsafe_to_break (prev, i + 1);
@@ -338,7 +338,7 @@ arabic_joining (hb_buffer_t *buffer)
       continue;
 
     const arabic_state_table_entry *entry = &arabic_state_table[state][this_type];
-    if (entry->prev_action != NONE && prev != (unsigned int) -1)
+    if (entry->prev_action != NONE && prev != UINT_MAX)
       info[prev].arabic_shaping_action() = entry->prev_action;
     break;
   }
@@ -604,7 +604,7 @@ postprocess_glyphs_arabic (const hb_ot_shape_plan_t *plan,
   HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
 }
 
-/* http://www.unicode.org/reports/tr53/ */
+/* https://www.unicode.org/reports/tr53/ */
 
 static hb_codepoint_t
 modifier_combining_marks[] =
index a921f16..a755aea 100644 (file)
@@ -49,5 +49,25 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
   true, /* fallback_position */
 };
 
+/* Same as default but no mark advance zeroing / fallback positioning.
+ * Dumbest shaper ever, basically. */
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_dumber =
+{
+  nullptr, /* collect_features */
+  nullptr, /* override_features */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  nullptr, /* setup_masks */
+  HB_TAG_NONE, /* gpos_tag */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+  false, /* fallback_position */
+};
+
 
 #endif
index 5f819bd..1613548 100644 (file)
@@ -76,7 +76,7 @@ complex_syllable_tail = (halant_group.cn)* medial_group halant_or_matra_group sy
 consonant_syllable =   (Repha|CS)? cn complex_syllable_tail;
 vowel_syllable =       reph? V.n? (ZWJ | complex_syllable_tail);
 standalone_cluster =   ((Repha|CS)? PLACEHOLDER | reph? DOTTEDCIRCLE).n? complex_syllable_tail;
-symbol_cluster =       symbol syllable_tail;
+symbol_cluster =       symbol syllable_tail;
 broken_cluster =       reph? n? complex_syllable_tail;
 other =                        any;
 
index cc91f17..a150fd2 100644 (file)
@@ -6,12 +6,12 @@
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-12.0.0.txt
- * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
- * # IndicPositionalCategory-12.0.0.txt
- * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
- * # Blocks-12.0.0.txt
- * # Date: 2018-07-30, 19:40:00 GMT [KW]
+ * # 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]
  */
 
 #include "hb.hh"
 #pragma GCC diagnostic ignored "-Wunused-macros"
 
 #define ISC_A    INDIC_SYLLABIC_CATEGORY_AVAGRAHA                    /*   17 chars; Avagraha */
-#define ISC_Bi   INDIC_SYLLABIC_CATEGORY_BINDU                       /*   86 chars; Bindu */
+#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                   /* 2160 chars; Consonant */
+#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_CHL  INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER       /*    5 chars; Consonant_Head_Letter */
 #define ISC_CIP  INDIC_SYLLABIC_CATEGORY_CONSONANT_INITIAL_POSTFIXED /*    1 chars; Consonant_Initial_Postfixed */
 #define ISC_CK   INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER            /*    2 chars; Consonant_Killer */
-#define ISC_CM   INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL            /*   29 chars; Consonant_Medial */
+#define ISC_CM   INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL            /*   31 chars; Consonant_Medial */
 #define ISC_CP   INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER       /*   22 chars; Consonant_Placeholder */
-#define ISC_CPR  INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA   /*    2 chars; Consonant_Preceding_Repha */
-#define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED          /*    9 chars; Consonant_Prefixed */
+#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_CWS  INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER      /*    6 chars; Consonant_With_Stacker */
+#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           /*   11 chars; Invisible_Stacker */
+#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                       /*   30 chars; Nukta */
-#define ISC_Nd   INDIC_SYLLABIC_CATEGORY_NUMBER                      /*  481 chars; Number */
+#define ISC_N    INDIC_SYLLABIC_CATEGORY_NUKTA                       /*   31 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                 /*   21 chars; Pure_Killer */
+#define ISC_PK   INDIC_SYLLABIC_CATEGORY_PURE_KILLER                 /*   23 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             /*  673 chars; Vowel_Dependent */
-#define ISC_VI   INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT           /*  476 chars; Vowel_Independent */
+#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 IMC_B    INDIC_MATRA_CATEGORY_BOTTOM                         /*  349 chars; Bottom */
+#define IMC_B    INDIC_MATRA_CATEGORY_BOTTOM                         /*  351 chars; Bottom */
 #define IMC_BL   INDIC_MATRA_CATEGORY_BOTTOM_AND_LEFT                /*    1 chars; Bottom_And_Left */
-#define IMC_BR   INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT               /*    2 chars; Bottom_And_Right */
-#define IMC_L    INDIC_MATRA_CATEGORY_LEFT                           /*   61 chars; Left */
-#define IMC_LR   INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT                 /*   21 chars; Left_And_Right */
+#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                          /*  281 chars; Right */
-#define IMC_T    INDIC_MATRA_CATEGORY_TOP                            /*  398 chars; Top */
+#define IMC_R    INDIC_MATRA_CATEGORY_RIGHT                          /*  288 chars; Right */
+#define IMC_T    INDIC_MATRA_CATEGORY_TOP                            /*  415 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 */
 #define IMC_TL   INDIC_MATRA_CATEGORY_TOP_AND_LEFT                   /*    6 chars; Top_And_Left */
 #define IMC_TLR  INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT         /*    4 chars; Top_And_Left_And_Right */
@@ -195,7 +196,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0B38 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(N,B),  _(A,x),  _(M,R),  _(M,T),
   /* 0B40 */  _(M,R),  _(M,B),  _(M,B),  _(M,B),  _(M,B),  _(x,x),  _(x,x),  _(M,L),
   /* 0B48 */ _(M,TL),  _(x,x),  _(x,x), _(M,LR),_(M,TLR),  _(V,B),  _(x,x),  _(x,x),
-  /* 0B50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,T), _(M,TR),
+  /* 0B50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(M,T),  _(M,T), _(M,TR),
   /* 0B58 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(x,x),  _(C,x),
   /* 0B60 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0B68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
@@ -261,7 +262,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 
   /* Malayalam */
 
-  /* 0D00 */ _(Bi,T), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0D00 */ _(Bi,T), _(Bi,T), _(Bi,R), _(Vs,R), _(Bi,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0D08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x), _(VI,x), _(VI,x),
   /* 0D10 */ _(VI,x),  _(x,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D18 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -270,7 +271,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0D30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D38 */  _(C,x),  _(C,x),  _(C,x), _(PK,T), _(PK,T),  _(A,x),  _(M,R),  _(M,R),
   /* 0D40 */  _(M,R),  _(M,R),  _(M,R),  _(M,B),  _(M,B),  _(x,x),  _(M,L),  _(M,L),
-  /* 0D48 */  _(M,L),  _(x,x), _(M,LR), _(M,LR), _(M,LR),  _(V,T),_(CPR,x),  _(x,x),
+  /* 0D48 */  _(M,L),  _(x,x), _(M,LR), _(M,LR), _(M,LR),  _(V,T),_(CPR,T),  _(x,x),
   /* 0D50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(CD,x), _(CD,x), _(CD,x),  _(M,R),
   /* 0D58 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(VI,x),
   /* 0D60 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
@@ -280,7 +281,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 
   /* Sinhala */
 
-  /* 0D80 */  _(x,x),  _(x,x), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0D80 */  _(x,x), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0D88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 0D90 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(x,x),
   /* 0D98 */  _(x,x),  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
@@ -308,7 +309,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1020 */  _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
   /* 1028 */ _(VI,x), _(VI,x), _(VI,x),  _(M,R),  _(M,R),  _(M,T),  _(M,T),  _(M,B),
   /* 1030 */  _(M,B),  _(M,L),  _(M,T),  _(M,T),  _(M,T),  _(M,T), _(Bi,T), _(TM,B),
-  /* 1038 */ _(Vs,R), _(IS,x), _(PK,T), _(CM,R), _(CM,x), _(CM,B), _(CM,B),  _(C,x),
+  /* 1038 */ _(Vs,R), _(IS,x), _(PK,T), _(CM,R),_(CM,TBL), _(CM,B), _(CM,B),  _(C,x),
   /* 1040 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 1048 */ _(Nd,x), _(Nd,x),  _(x,x), _(CP,x),  _(x,x),  _(x,x), _(CP,x),  _(x,x),
   /* 1050 */  _(C,x),  _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),  _(M,R),  _(M,R),
@@ -488,6 +489,7 @@ hb_indic_get_categories (hb_codepoint_t u)
 #undef IMC_R
 #undef IMC_T
 #undef IMC_TB
+#undef IMC_TBL
 #undef IMC_TBR
 #undef IMC_TL
 #undef IMC_TLR
index 26dc60d..3dab3aa 100644 (file)
@@ -248,6 +248,7 @@ struct indic_shape_plan_t
   hb_indic_would_substitute_feature_t pref;
   hb_indic_would_substitute_feature_t blwf;
   hb_indic_would_substitute_feature_t pstf;
+  hb_indic_would_substitute_feature_t vatu;
 
   hb_mask_t mask_array[INDIC_NUM_FEATURES];
 };
@@ -286,6 +287,7 @@ data_create_indic (const hb_ot_shape_plan_t *plan)
   indic_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), zero_context);
   indic_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'), zero_context);
   indic_plan->pstf.init (&plan->map, HB_TAG('p','s','t','f'), zero_context);
+  indic_plan->vatu.init (&plan->map, HB_TAG('v','a','t','u'), zero_context);
 
   for (unsigned int i = 0; i < ARRAY_LENGTH (indic_plan->mask_array); i++)
     indic_plan->mask_array[i] = (indic_features[i].flags & F_GLOBAL) ?
@@ -315,10 +317,16 @@ consonant_position_from_face (const indic_shape_plan_t *indic_plan,
    * base at 0.  The font however, only has lookups matching
    * 930,94D in 'blwf', not the expected 94D,930 (with new-spec
    * table).  As such, we simply match both sequences.  Seems
-   * to work. */
+   * to work.
+   *
+   * Vatu is done as well, for:
+   * https://github.com/harfbuzz/harfbuzz/issues/1587
+   */
   hb_codepoint_t glyphs[3] = {virama, consonant, virama};
   if (indic_plan->blwf.would_substitute (glyphs  , 2, face) ||
-      indic_plan->blwf.would_substitute (glyphs+1, 2, face))
+      indic_plan->blwf.would_substitute (glyphs+1, 2, face) ||
+      indic_plan->vatu.would_substitute (glyphs  , 2, face) ||
+      indic_plan->vatu.would_substitute (glyphs+1, 2, face))
     return POS_BELOW_C;
   if (indic_plan->pstf.would_substitute (glyphs  , 2, face) ||
       indic_plan->pstf.would_substitute (glyphs+1, 2, face))
index 1eeed68..41bd8bd 100644 (file)
@@ -165,6 +165,7 @@ enum indic_matra_category_t {
   INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT                        = INDIC_MATRA_CATEGORY_RIGHT,
   INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT                  = INDIC_MATRA_CATEGORY_RIGHT,
   INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM                  = INDIC_MATRA_CATEGORY_BOTTOM,
+  INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_LEFT         = INDIC_MATRA_CATEGORY_BOTTOM,
   INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT                = INDIC_MATRA_CATEGORY_RIGHT,
   INDIC_MATRA_CATEGORY_TOP_AND_LEFT                    = INDIC_MATRA_CATEGORY_TOP,
   INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT          = INDIC_MATRA_CATEGORY_RIGHT,
index 67133cd..098a63e 100644 (file)
@@ -78,7 +78,7 @@ complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_
 syllable_tail = (H (c|IV).VS?)* (H | complex_syllable_tail);
 
 consonant_syllable =   (k|CS)? (c|IV|D|GB).VS? syllable_tail;
-punctuation_cluster =  P V;
+punctuation_cluster =  P V;
 broken_cluster =       k? VS? syllable_tail;
 other =                        any;
 
index e3889b3..aa9c350 100644 (file)
@@ -6,12 +6,12 @@
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-12.0.0.txt
- * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
- * # IndicPositionalCategory-12.0.0.txt
- * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
- * # Blocks-12.0.0.txt
- * # Date: 2018-07-30, 19:40:00 GMT [KW]
+ * # 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.
  */
 
 #define WJ     USE_WJ  /* Word_Joiner */
 #define ZWJ    USE_ZWJ /* ZWJ */
 #define ZWNJ   USE_ZWNJ        /* ZWNJ */
-#define CMBlw  USE_CMBlw
 #define CMAbv  USE_CMAbv
+#define CMBlw  USE_CMBlw
+#define FAbv   USE_FAbv
 #define FBlw   USE_FBlw
 #define FPst   USE_FPst
-#define FAbv   USE_FAbv
+#define FMAbv  USE_FMAbv
 #define FMBlw  USE_FMBlw
 #define FMPst  USE_FMPst
-#define FMAbv  USE_FMAbv
-#define MPre   USE_MPre
+#define MAbv   USE_MAbv
 #define MBlw   USE_MBlw
 #define MPst   USE_MPst
-#define MAbv   USE_MAbv
-#define SMBlw  USE_SMBlw
+#define MPre   USE_MPre
 #define SMAbv  USE_SMAbv
-#define VPre   USE_VPre
+#define SMBlw  USE_SMBlw
+#define VAbv   USE_VAbv
 #define VBlw   USE_VBlw
 #define VPst   USE_VPst
-#define VAbv   USE_VAbv
-#define VMPre  USE_VMPre
+#define VPre   USE_VPre
+#define VMAbv  USE_VMAbv
 #define VMBlw  USE_VMBlw
 #define VMPst  USE_VMPst
-#define VMAbv  USE_VMAbv
+#define VMPre  USE_VMPre
 #pragma GCC diagnostic pop
 
 static const USE_TABLE_ELEMENT_TYPE use_table[] = {
@@ -146,7 +146,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 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,     O,  VAbv,  VAbv,     O,     O,     O,     O,     B,     B,     O,     B,
+  /* 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,
 
@@ -185,7 +185,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Malayalam */
 
-  /* 0D00 */ VMAbv, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 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,
@@ -196,7 +196,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* Sinhala */
 
-  /* 0D80 */     O,     O, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 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,
@@ -402,7 +402,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* A800 */     B,     B,  VAbv,     B,     B,     B,     H,     B,     B,     B,     B, VMAbv,     B,     B,     B,     B,
   /* A810 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A820 */     B,     B,     B,  VPst,  VPst,  VBlw,  VAbv,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 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 */
@@ -445,7 +445,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* A980 */ VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A9A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A9B0 */     B,     B,     B, CMAbv,  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VPre,  VAbv,  MBlw,  MPst,  MBlw,
+  /* 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,
 
@@ -540,7 +540,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 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,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11140 */     O,     O,     O,     O,     B,  VPst,  VPst,     B,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Mahajani */
 
@@ -554,7 +554,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 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,     O,     O,
+  /* 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 */
@@ -608,7 +608,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 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 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 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 */
@@ -673,7 +673,19 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11820 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,
   /* 11830 */  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMPst,     H, CMBlw,     O,     O,     O,     O,     O,
 
-#define use_offset_0x119a0u 5232
+#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 */
@@ -701,7 +713,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 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 5488
+#define use_offset_0x11c00u 5584
 
 
   /* Bhaiksuki */
@@ -722,7 +734,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11CA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
   /* 11CB0 */  VBlw,  VPre,  VBlw,  VAbv,  VPst, VMAbv, VMAbv,     O,
 
-#define use_offset_0x11d00u 5672
+#define use_offset_0x11d00u 5768
 
 
   /* Masaram Gondi */
@@ -742,7 +754,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11D90 */  VAbv,  VAbv,     O,  VPst,  VPst, VMAbv, VMPst,     H,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x11ee0u 5848
+#define use_offset_0x11ee0u 5944
 
 
   /* Makasar */
@@ -750,7 +762,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11EE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11EF0 */     B,     B,    GB,  VAbv,  VBlw,  VPre,  VPst,     O,
 
-}; /* Table items: 5872; occupancy: 74% */
+}; /* Table items: 5968; occupancy: 74% */
 
 USE_TABLE_ELEMENT_TYPE
 hb_use_get_category (hb_codepoint_t u)
@@ -801,6 +813,7 @@ hb_use_get_category (hb_codepoint_t u)
       if (hb_in_range<hb_codepoint_t> (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u];
       if (hb_in_range<hb_codepoint_t> (u, 0x11800u, 0x1183Fu)) return use_table[u - 0x11800u + use_offset_0x11800u];
+      if (hb_in_range<hb_codepoint_t> (u, 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];
@@ -832,28 +845,28 @@ hb_use_get_category (hb_codepoint_t u)
 #undef WJ
 #undef ZWJ
 #undef ZWNJ
-#undef CMBlw
 #undef CMAbv
+#undef CMBlw
+#undef FAbv
 #undef FBlw
 #undef FPst
-#undef FAbv
+#undef FMAbv
 #undef FMBlw
 #undef FMPst
-#undef FMAbv
-#undef MPre
+#undef MAbv
 #undef MBlw
 #undef MPst
-#undef MAbv
-#undef SMBlw
+#undef MPre
 #undef SMAbv
-#undef VPre
+#undef SMBlw
+#undef VAbv
 #undef VBlw
 #undef VPst
-#undef VAbv
-#undef VMPre
+#undef VPre
+#undef VMAbv
 #undef VMBlw
 #undef VMPst
-#undef VMAbv
+#undef VMPre
 
 
 #endif
index 2f80413..c3368c6 100644 (file)
@@ -2,15 +2,16 @@
 /*
  * The following functions are generated by running:
  *
- *   ./gen-vowel-constraints.py use Scripts.txt
+ *   ./gen-vowel-constraints.py ms-use/IndicShapingInvalidCluster.txt Scripts.txt
  *
  * on files with these headers:
  *
- * # Copied from https://docs.microsoft.com/en-us/typography/script-development/use
- * # On October 23, 2018; with documentd dated 02/07/2018.
+ * # IndicShapingInvalidCluster.txt
+ * # Date: 2015-03-12, 21:17:00 GMT [AG]
+ * # Date: 2019-11-08, 23:22:00 GMT [AG]
  *
- * # Scripts-12.0.0.txt
- * # Date: 2019-01-28, 22:16:47 GMT
+ * # Scripts-13.0.0.txt
+ * # Date: 2020-01-22, 00:07:43 GMT
  */
 
 #include "hb.hh"
@@ -97,8 +98,7 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
                0x0907u == buffer->cur (2).codepoint)
            {
              buffer->next_glyph ();
-             buffer->next_glyph ();
-             _output_dotted_circle (buffer);
+             matched = true;
            }
            break;
        }
@@ -211,6 +211,21 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
       processed = true;
       break;
 
+    case HB_SCRIPT_TAMIL:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+       bool matched = false;
+       if (0x0B85u == buffer->cur ().codepoint &&
+           0x0BC2u == buffer->cur (1).codepoint)
+       {
+         matched = true;
+       }
+       buffer->next_glyph ();
+       if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
     case HB_SCRIPT_TELUGU:
       for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
       {
index 2691622..61f4c0e 100644 (file)
@@ -50,8 +50,9 @@ enum hb_ot_shape_zero_width_marks_type_t {
 
 /* Master OT shaper list */
 #define HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS \
-  HB_COMPLEX_SHAPER_IMPLEMENT (default) /* should be first */ \
   HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (default) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (dumber) \
   HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \
   HB_COMPLEX_SHAPER_IMPLEMENT (hebrew) \
   HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
@@ -60,7 +61,7 @@ enum hb_ot_shape_zero_width_marks_type_t {
   HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_zawgyi) \
   HB_COMPLEX_SHAPER_IMPLEMENT (thai) \
   HB_COMPLEX_SHAPER_IMPLEMENT (use) \
-  /* ^--- Add new shapers here */
+  /* ^--- Add new shapers here; keep sorted. */
 
 
 struct hb_ot_complex_shaper_t
@@ -380,6 +381,10 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     /* Unicode-12.0 additions */
     case HB_SCRIPT_NANDINAGARI:
 
+    /* Unicode-13.0 additions */
+    case HB_SCRIPT_CHORASMIAN:
+    case HB_SCRIPT_DIVES_AKURU:
+
       /* If the designer designed the font for the 'DFLT' script,
        * (or we ended up arbitrarily pick 'latn'), use the default shaper.
        * Otherwise, use the specific shaper.
index 024bcfe..42bf524 100644 (file)
@@ -422,12 +422,12 @@ position_cluster (const hb_ot_shape_plan_t *plan,
   /* Find the base glyph */
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = start; i < end; i++)
-    if (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])))
+    if (!_hb_glyph_info_is_unicode_mark (&info[i]))
     {
       /* Find mark glyphs */
       unsigned int j;
       for (j = i + 1; j < end; j++)
-       if (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[j])))
+       if (!_hb_glyph_info_is_unicode_mark (&info[j]))
          break;
 
       position_around_base (plan, font, buffer, i, j, adjust_offsets_when_zeroing);
@@ -452,7 +452,7 @@ _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan,
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 1; i < count; i++)
-    if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])))) {
+    if (likely (!_hb_glyph_info_is_unicode_mark (&info[i]))) {
       position_cluster (plan, font, buffer, start, i, adjust_offsets_when_zeroing);
       start = i;
     }
index 553d532..50b5829 100644 (file)
@@ -334,7 +334,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
     {
       unsigned int end;
       for (end = buffer->idx + 1; end < count; end++)
-       if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->info[end]))))
+       if (unlikely (_hb_glyph_info_is_unicode_mark (&buffer->info[end])))
          break;
 
       if (end < count)
@@ -360,7 +360,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
 
       /* Find all the marks now. */
       for (end = buffer->idx + 1; end < count; end++)
-       if (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->info[end])))
+       if (!_hb_glyph_info_is_unicode_mark(&buffer->info[end]))
          break;
 
       /* idx to end is one non-simple cluster. */
@@ -435,7 +435,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
           * This is both an optimization to avoid trying to compose every two neighboring
           * glyphs in most scripts AND a desired feature for Hangul.  Apparently Hangul
           * fonts are not designed to mix-and-match pre-composed syllables and Jamo. */
-         HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->cur())))
+         _hb_glyph_info_is_unicode_mark(&buffer->cur()))
       {
        if (/* If there's anything between the starter and this char, they should have CCC
             * smaller than this character's. */
index 5d9a70c..00ecdfa 100644 (file)
 #include "hb-aat-layout.hh"
 
 
+#ifndef HB_NO_AAT_SHAPE
+static inline bool
+_hb_apply_morx (hb_face_t *face, const hb_segment_properties_t *props)
+{
+  /* https://github.com/harfbuzz/harfbuzz/issues/2124 */
+  return hb_aat_layout_has_substitution (face) &&
+        (HB_DIRECTION_IS_HORIZONTAL (props->direction) || !hb_ot_layout_has_substitution (face));
+}
+#endif
+
 /**
  * SECTION:hb-ot-shape
  * @title: hb-ot-shape
@@ -63,23 +73,6 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t          *planner,
                              const hb_feature_t             *user_features,
                              unsigned int                    num_user_features);
 
-#ifndef HB_NO_AAT_SHAPE
-static inline bool
-_hb_apply_morx (hb_face_t *face)
-{
-  if (hb_options ().aat &&
-      hb_aat_layout_has_substitution (face))
-    return true;
-
-  /* Ignore empty GSUB tables. */
-  return (!hb_ot_layout_has_substitution (face) ||
-         !hb_ot_layout_table_get_script_tags (face,
-                                              HB_OT_TAG_GSUB,
-                                              0, nullptr, nullptr)) &&
-        hb_aat_layout_has_substitution (face);
-}
-#endif
-
 hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t                     *face,
                                              const hb_segment_properties_t *props) :
                                                face (face),
@@ -87,7 +80,7 @@ hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t                     *fac
                                                map (face, props),
                                                aat_map (face, props)
 #ifndef HB_NO_AAT_SHAPE
-                                               , apply_morx (_hb_apply_morx (face))
+                                               , apply_morx (_hb_apply_morx (face, props))
 #endif
 {
   shaper = hb_ot_shape_complex_categorize (this);
@@ -95,8 +88,9 @@ hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t                     *fac
   script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE;
   script_fallback_mark_positioning = shaper->fallback_position;
 
-  if (apply_morx)
-    shaper = &_hb_ot_complex_shaper_default;
+  /* https://github.com/harfbuzz/harfbuzz/issues/1528 */
+  if (apply_morx && shaper != &_hb_ot_complex_shaper_default)
+    shaper = &_hb_ot_complex_shaper_dumber;
 }
 
 void
@@ -119,6 +113,8 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t           &plan,
 #endif
 
   plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m'));
+  plan.has_vert = !!plan.map.get_1_mask (HB_TAG ('v','e','r','t'));
+
   hb_tag_t kern_tag = HB_DIRECTION_IS_HORIZONTAL (props.direction) ?
                      HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n');
 #ifndef HB_NO_OT_KERN
@@ -156,17 +152,13 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t           &plan,
   if (0)
     ;
 #ifndef HB_NO_AAT_SHAPE
-  else if (hb_options ().aat && hb_aat_layout_has_positioning (face))
+  else if (hb_aat_layout_has_positioning (face))
     plan.apply_kerx = true;
 #endif
   else if (!apply_morx && !disable_gpos && hb_ot_layout_has_positioning (face))
     plan.apply_gpos = true;
-#ifndef HB_NO_AAT_SHAPE
-  else if (hb_aat_layout_has_positioning (face))
-    plan.apply_kerx = true;
-#endif
 
-  if (!plan.apply_kerx && !has_gpos_kern)
+  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
@@ -594,24 +586,85 @@ hb_ensure_native_direction (hb_buffer_t *buffer)
  * Substitute
  */
 
-static inline void
-hb_ot_mirror_chars (const hb_ot_shape_context_t *c)
+static hb_codepoint_t
+hb_vert_char_for (hb_codepoint_t u)
 {
-  if (HB_DIRECTION_IS_FORWARD (c->target_direction))
-    return;
+  switch (u >> 8)
+  {
+    case 0x20: switch (u) {
+      case 0x2013u: return 0xfe32u; // EN DASH
+      case 0x2014u: return 0xfe31u; // EM DASH
+      case 0x2025u: return 0xfe30u; // TWO DOT LEADER
+      case 0x2026u: return 0xfe19u; // HORIZONTAL ELLIPSIS
+    } break;
+    case 0x30: switch (u) {
+      case 0x3001u: return 0xfe11u; // IDEOGRAPHIC COMMA
+      case 0x3002u: return 0xfe12u; // IDEOGRAPHIC FULL STOP
+      case 0x3008u: return 0xfe3fu; // LEFT ANGLE BRACKET
+      case 0x3009u: return 0xfe40u; // RIGHT ANGLE BRACKET
+      case 0x300au: return 0xfe3du; // LEFT DOUBLE ANGLE BRACKET
+      case 0x300bu: return 0xfe3eu; // RIGHT DOUBLE ANGLE BRACKET
+      case 0x300cu: return 0xfe41u; // LEFT CORNER BRACKET
+      case 0x300du: return 0xfe42u; // RIGHT CORNER BRACKET
+      case 0x300eu: return 0xfe43u; // LEFT WHITE CORNER BRACKET
+      case 0x300fu: return 0xfe44u; // RIGHT WHITE CORNER BRACKET
+      case 0x3010u: return 0xfe3bu; // LEFT BLACK LENTICULAR BRACKET
+      case 0x3011u: return 0xfe3cu; // RIGHT BLACK LENTICULAR BRACKET
+      case 0x3014u: return 0xfe39u; // LEFT TORTOISE SHELL BRACKET
+      case 0x3015u: return 0xfe3au; // RIGHT TORTOISE SHELL BRACKET
+      case 0x3016u: return 0xfe17u; // LEFT WHITE LENTICULAR BRACKET
+      case 0x3017u: return 0xfe18u; // RIGHT WHITE LENTICULAR BRACKET
+    } break;
+    case 0xfe: switch (u) {
+      case 0xfe4fu: return 0xfe34u; // WAVY LOW LINE
+    } break;
+    case 0xff: switch (u) {
+      case 0xff01u: return 0xfe15u; // FULLWIDTH EXCLAMATION MARK
+      case 0xff08u: return 0xfe35u; // FULLWIDTH LEFT PARENTHESIS
+      case 0xff09u: return 0xfe36u; // FULLWIDTH RIGHT PARENTHESIS
+      case 0xff0cu: return 0xfe10u; // FULLWIDTH COMMA
+      case 0xff1au: return 0xfe13u; // FULLWIDTH COLON
+      case 0xff1bu: return 0xfe14u; // FULLWIDTH SEMICOLON
+      case 0xff1fu: return 0xfe16u; // FULLWIDTH QUESTION MARK
+      case 0xff3bu: return 0xfe47u; // FULLWIDTH LEFT SQUARE BRACKET
+      case 0xff3du: return 0xfe48u; // FULLWIDTH RIGHT SQUARE BRACKET
+      case 0xff3fu: return 0xfe33u; // FULLWIDTH LOW LINE
+      case 0xff5bu: return 0xfe37u; // FULLWIDTH LEFT CURLY BRACKET
+      case 0xff5du: return 0xfe38u; // FULLWIDTH RIGHT CURLY BRACKET
+    } break;
+  }
 
-  hb_buffer_t *buffer = c->buffer;
-  hb_unicode_funcs_t *unicode = buffer->unicode;
-  hb_mask_t rtlm_mask = c->plan->rtlm_mask;
+  return u;
+}
 
+static inline void
+hb_ot_rotate_chars (const hb_ot_shape_context_t *c)
+{
+  hb_buffer_t *buffer = c->buffer;
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < count; i++) {
-    hb_codepoint_t codepoint = unicode->mirroring (info[i].codepoint);
-    if (likely (codepoint == info[i].codepoint || !c->font->has_glyph (codepoint)))
-      info[i].mask |= rtlm_mask;
-    else
-      info[i].codepoint = codepoint;
+
+  if (HB_DIRECTION_IS_BACKWARD (c->target_direction))
+  {
+    hb_unicode_funcs_t *unicode = buffer->unicode;
+    hb_mask_t rtlm_mask = c->plan->rtlm_mask;
+
+    for (unsigned int i = 0; i < count; i++) {
+      hb_codepoint_t codepoint = unicode->mirroring (info[i].codepoint);
+      if (unlikely (codepoint != info[i].codepoint && c->font->has_glyph (codepoint)))
+       info[i].codepoint = codepoint;
+      else
+       info[i].mask |= rtlm_mask;
+    }
+  }
+
+  if (HB_DIRECTION_IS_VERTICAL (c->target_direction) && !c->plan->has_vert)
+  {
+    for (unsigned int i = 0; i < count; i++) {
+      hb_codepoint_t codepoint = hb_vert_char_for (info[i].codepoint);
+      if (unlikely (codepoint != info[i].codepoint && c->font->has_glyph (codepoint)))
+       info[i].codepoint = codepoint;
+    }
   }
 }
 
@@ -693,7 +746,7 @@ hb_ot_shape_setup_masks (const hb_ot_shape_context_t *c)
   for (unsigned int i = 0; i < c->num_user_features; i++)
   {
     const hb_feature_t *feature = &c->user_features[i];
-    if (!(feature->start == 0 && feature->end == (unsigned int)-1)) {
+    if (!(feature->start == HB_FEATURE_GLOBAL_START && feature->end == HB_FEATURE_GLOBAL_END)) {
       unsigned int shift;
       hb_mask_t mask = map->get_mask (feature->tag, &shift);
       buffer->set_masks (feature->value << shift, mask, feature->start, feature->end);
@@ -788,7 +841,7 @@ hb_ot_substitute_default (const hb_ot_shape_context_t *c)
 {
   hb_buffer_t *buffer = c->buffer;
 
-  hb_ot_mirror_chars (c);
+  hb_ot_rotate_chars (c);
 
   HB_BUFFER_ALLOCATE_VAR (buffer, glyph_index);
 
index 2cde73d..acc9877 100644 (file)
@@ -37,9 +37,9 @@ struct hb_ot_shape_plan_key_t
 {
   unsigned int variations_index[2];
 
-  void init (hb_face_t   *face,
-                   const int   *coords,
-                   unsigned int num_coords)
+  void init (hb_face_t *face,
+            const int *coords,
+            unsigned   num_coords)
   {
     for (unsigned int table_index = 0; table_index < 2; table_index++)
       hb_ot_layout_table_find_feature_variations (face,
@@ -99,6 +99,7 @@ struct hb_ot_shape_plan_t
 #else
   static constexpr bool has_frac = false;
 #endif
+  bool has_vert : 1;
   bool has_gpos_mark : 1;
   bool zero_marks : 1;
   bool fallback_glyph_classes : 1;
index 2cdd3a4..8813523 100644 (file)
@@ -77,7 +77,7 @@ struct AxisValueFormat1
   NameID       valueNameID;    /* The name ID for entries in the 'name' table
                                 * that provide a display string for this
                                 * attribute value. */
-  HBFixed              value;          /* A numeric value for this attribute value. */
+  HBFixed      value;          /* A numeric value for this attribute value. */
   public:
   DEFINE_SIZE_STATIC (12);
 };
@@ -102,10 +102,10 @@ struct AxisValueFormat2
   NameID       valueNameID;    /* The name ID for entries in the 'name' table
                                 * that provide a display string for this
                                 * attribute value. */
-  HBFixed              nominalValue;   /* A numeric value for this attribute value. */
-  HBFixed              rangeMinValue;  /* The minimum value for a range associated
+  HBFixed      nominalValue;   /* A numeric value for this attribute value. */
+  HBFixed      rangeMinValue;  /* The minimum value for a range associated
                                 * with the specified name ID. */
-  HBFixed              rangeMaxValue;  /* The maximum value for a range associated
+  HBFixed      rangeMaxValue;  /* The maximum value for a range associated
                                 * with the specified name ID. */
   public:
   DEFINE_SIZE_STATIC (20);
@@ -131,8 +131,8 @@ struct AxisValueFormat3
   NameID       valueNameID;    /* The name ID for entries in the 'name' table
                                 * that provide a display string for this
                                 * attribute value. */
-  HBFixed              value;          /* A numeric value for this attribute value. */
-  HBFixed              linkedValue;    /* The numeric value for a style-linked mapping
+  HBFixed      value;          /* A numeric value for this attribute value. */
+  HBFixed      linkedValue;    /* The numeric value for a style-linked mapping
                                 * from this value. */
   public:
   DEFINE_SIZE_STATIC (16);
@@ -150,7 +150,7 @@ struct AxisValueRecord
   HBUINT16     axisIndex;      /* Zero-base index into the axis record array
                                 * identifying the axis to which this value
                                 * applies. Must be less than designAxisCount. */
-  HBFixed              value;          /* A numeric value for this attribute value. */
+  HBFixed      value;          /* A numeric value for this attribute value. */
   public:
   DEFINE_SIZE_STATIC (6);
 };
index d8fcd2f..99937d9 100644 (file)
@@ -6,8 +6,8 @@
  *
  * on files with these headers:
  *
- * <meta name="updated_at" content="2018-11-18 05:25 AM" />
- * File-Date: 2019-04-03
+ * <meta name="updated_at" content="2019-05-22 06:05 PM" />
+ * File-Date: 2020-05-12
  */
 
 #ifndef HB_OT_TAG_TABLE_HH
@@ -95,7 +95,7 @@ static const LangTag ot_languages[] = {
 /*{"ban",      HB_TAG('B','A','N',' ')},*/     /* Balinese */
 /*{"bar",      HB_TAG('B','A','R',' ')},*/     /* Bavarian */
 /*{"bbc",      HB_TAG('B','B','C',' ')},*/     /* Batak Toba */
-  {"bbz",      HB_TAG('A','R','A',' ')},       /* Babalia Creole Arabic -> Arabic */
+  {"bbz",      HB_TAG('A','R','A',' ')},       /* Babalia Creole Arabic (retired code) -> Arabic */
   {"bcc",      HB_TAG('B','L','I',' ')},       /* Southern Balochi -> Baluchi */
   {"bci",      HB_TAG('B','A','U',' ')},       /* Baoulé -> Baulé */
   {"bcl",      HB_TAG('B','I','K',' ')},       /* Central Bikol -> Bikol */
@@ -199,6 +199,7 @@ static const LangTag ot_languages[] = {
   {"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 */
   {"cnt",      HB_TAG('C','C','H','N')},       /* Tepetotutla Chinantec -> Chinantec */
   {"cnw",      HB_TAG('Q','I','N',' ')},       /* Ngawn Chin -> Chin */
   {"co",       HB_TAG('C','O','S',' ')},       /* Corsican */
@@ -228,6 +229,7 @@ static const LangTag ot_languages[] = {
 /*{"csb",      HB_TAG('C','S','B',' ')},*/     /* Kashubian */
   {"csh",      HB_TAG('Q','I','N',' ')},       /* Asho Chin -> Chin */
   {"cso",      HB_TAG('C','C','H','N')},       /* Sochiapam Chinantec -> Chinantec */
+  {"csp",      HB_TAG('Z','H','S',' ')},       /* Southern Ping Chinese -> Chinese Simplified */
   {"csw",      HB_TAG('N','C','R',' ')},       /* Swampy Cree -> N-Cree */
   {"csw",      HB_TAG('N','H','C',' ')},       /* Swampy Cree -> Norway House Cree */
   {"csy",      HB_TAG('Q','I','N',' ')},       /* Siyin Chin -> Chin */
@@ -280,6 +282,7 @@ static const LangTag ot_languages[] = {
   {"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) */
+  {"dwk",      HB_TAG('K','U','I',' ')},       /* Dawik Kui -> Kui */
   {"dwu",      HB_TAG('D','U','J',' ')},       /* Dhuwal */
   {"dwy",      HB_TAG('D','U','J',' ')},       /* Dhuwaya -> Dhuwal */
   {"dyu",      HB_TAG('J','U','L',' ')},       /* Dyula -> Jula */
@@ -458,7 +461,7 @@ static const LangTag ot_languages[] = {
   {"jv",       HB_TAG('J','A','V',' ')},       /* Javanese */
   {"jw",       HB_TAG('J','A','V',' ')},       /* Javanese (retired code) */
   {"ka",       HB_TAG('K','A','T',' ')},       /* Georgian */
-  {"kaa",      HB_TAG('K','R','K',' ')},       /* Kara-Kalpak -> Karakalpak */
+  {"kaa",      HB_TAG('K','R','K',' ')},       /* Karakalpak */
   {"kab",      HB_TAG('K','A','B','0')},       /* Kabyle */
   {"kam",      HB_TAG('K','M','B',' ')},       /* Kamba (Kenya) */
   {"kar",      HB_TAG('K','R','N',' ')},       /* Karen [family] */
@@ -538,7 +541,8 @@ static const LangTag ot_languages[] = {
   {"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 */
-  {"kxu",      HB_TAG('K','U','I',' ')},       /* Kui (India) */
+  {"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 */
   {"la",       HB_TAG('L','A','T',' ')},       /* Latin */
@@ -736,7 +740,7 @@ static const LangTag ot_languages[] = {
   {"pko",      HB_TAG('K','A','L',' ')},       /* Pökoot -> Kalenjin */
   {"pl",       HB_TAG('P','L','K',' ')},       /* Polish */
   {"pll",      HB_TAG('P','L','G',' ')},       /* Shwe Palaung -> Palaung */
-  {"plp",      HB_TAG('P','A','P',' ')},       /* Palpa */
+  {"plp",      HB_TAG('P','A','P',' ')},       /* Palpa (retired code) */
   {"plt",      HB_TAG('M','L','G',' ')},       /* Plateau Malagasy -> Malagasy */
 /*{"pms",      HB_TAG('P','M','S',' ')},*/     /* Piemontese */
 /*{"pnb",      HB_TAG('P','N','B',' ')},*/     /* Western Panjabi */
@@ -803,7 +807,7 @@ static const LangTag ot_languages[] = {
 /*{"rej",      HB_TAG('R','E','J',' ')},*/     /* Rejang */
 /*{"ria",      HB_TAG('R','I','A',' ')},*/     /* Riang (India) */
 /*{"rif",      HB_TAG('R','I','F',' ')},*/     /* Tarifit */
-/*{"rit",      HB_TAG('R','I','T',' ')},*/     /* Ritarungo */
+/*{"rit",      HB_TAG('R','I','T',' ')},*/     /* Ritharrngu -> Ritarungo */
   {"rki",      HB_TAG('A','R','K',' ')},       /* Rakhine */
 /*{"rkw",      HB_TAG('R','K','W',' ')},*/     /* Arakwal */
   {"rm",       HB_TAG('R','M','S',' ')},       /* Romansh */
@@ -965,6 +969,7 @@ static const LangTag ot_languages[] = {
 /*{"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) */
 /*{"umb",      HB_TAG('U','M','B',' ')},*/     /* Umbundu */
   {"unr",      HB_TAG('M','U','N',' ')},       /* Mundari */
   {"ur",       HB_TAG('U','R','D',' ')},       /* Urdu */
@@ -1183,6 +1188,20 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
       *count = 1;
       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 */
+      *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;
+      return true;
+    }
     if (lang_matches (&lang_str[1], "px-hant-hk"))
     {
       /* Pu-Xian Chinese */
@@ -1197,6 +1216,20 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
       *count = 1;
       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 */
+      *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;
+      return true;
+    }
     if (lang_matches (&lang_str[1], "zh-hant-hk"))
     {
       /* Huizhou Chinese */
@@ -1267,6 +1300,20 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
       *count = 1;
       return true;
     }
+    if (lang_matches (&lang_str[1], "np-hans"))
+    {
+      /* Northern Ping Chinese */
+      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 */
+      *count = 1;
+      return true;
+    }
     if (lang_matches (&lang_str[1], "px-hans"))
     {
       /* Pu-Xian Chinese */
@@ -1281,6 +1328,20 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
       *count = 1;
       return true;
     }
+    if (lang_matches (&lang_str[1], "sp-hans"))
+    {
+      /* Southern Ping Chinese */
+      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 */
+      *count = 1;
+      return true;
+    }
     if (lang_matches (&lang_str[1], "zh-hans"))
     {
       /* Huizhou Chinese */
@@ -1381,6 +1442,30 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
       *count = 1;
       return true;
     }
+    if (0 == strncmp (&lang_str[1], "np-", 3)
+       && subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Northern Ping Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "np-", 3)
+       && subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Northern Ping Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      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 */
+      *count = 1;
+      return true;
+    }
     if (0 == strncmp (&lang_str[1], "px-", 3)
        && subtag_matches (lang_str, limit, "-hk"))
     {
@@ -1405,6 +1490,30 @@ hb_ot_tags_from_complex_language (const char   *lang_str,
       *count = 1;
       return true;
     }
+    if (0 == strncmp (&lang_str[1], "sp-", 3)
+       && subtag_matches (lang_str, limit, "-hk"))
+    {
+      /* Southern Ping Chinese; Hong Kong */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      return true;
+    }
+    if (0 == strncmp (&lang_str[1], "sp-", 3)
+       && subtag_matches (lang_str, limit, "-mo"))
+    {
+      /* Southern Ping Chinese; Macao */
+      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Hong Kong SAR */
+      *count = 1;
+      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 */
+      *count = 1;
+      return true;
+    }
     if (0 == strncmp (&lang_str[1], "zh-", 3)
        && subtag_matches (lang_str, limit, "-hk"))
     {
@@ -1993,6 +2102,8 @@ hb_ot_ambiguous_tag_to_language (hb_tag_t tag)
     return hb_language_from_string ("kr", -1);  /* Kanuri */
   case HB_TAG('K','O','K',' '):  /* Konkani */
     return hb_language_from_string ("kok", -1);  /* Konkani */
+  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 */
   case HB_TAG('L','U','H',' '):  /* Luyia */
index 8ad917a..7ec91c5 100644 (file)
@@ -319,12 +319,26 @@ parse_private_use_subtag (const char     *private_use_subtag,
   char tag[4];
   int i;
   s += strlen (prefix);
-  for (i = 0; i < 4 && ISALNUM (s[i]); i++)
-    tag[i] = normalize (s[i]);
-  if (!i) return false;
-
-  for (; i < 4; i++)
-    tag[i] = ' ';
+  if (s[0] == '-') {
+    s += 1;
+    char c;
+    for (i = 0; i < 8 && ISHEX (s[i]); i++)
+    {
+      c = FROMHEX (s[i]);
+      if (i % 2 == 0)
+       tag[i / 2] = c << 4;
+      else
+       tag[i / 2] += c;
+    }
+    if (i != 8) return false;
+  } else {
+    for (i = 0; i < 4 && ISALNUM (s[i]); i++)
+      tag[i] = normalize (s[i]);
+    if (!i) return false;
+
+    for (; i < 4; i++)
+      tag[i] = ' ';
+  }
   tags[0] = HB_TAG (tag[0], tag[1], tag[2], tag[3]);
   if ((tags[0] & 0xDFDFDFDF) == HB_OT_TAG_DEFAULT_SCRIPT)
     tags[0] ^= ~0xDFDFDFDF;
@@ -434,30 +448,28 @@ hb_ot_tag_to_language (hb_tag_t tag)
     if (ot_languages[i].tag == tag)
       return hb_language_from_string (ot_languages[i].language, -1);
 
-  /* If it's three letters long, assume it's ISO 639-3 and lower-case and use it
-   * (if it's not a registered tag, calling hb_ot_tag_from_language on the
-   * result might not return the same tag as the original tag).
-   * Else return a custom language in the form of "x-hbotABCD". */
+  /* Return a custom language in the form of "x-hbot-AABBCCDD".
+   * If it's three letters long, also guess it's ISO 639-3 and lower-case and
+   * prepend it (if it's not a registered tag, the private use subtags will
+   * ensure that calling hb_ot_tag_from_language on the result will still return
+   * the same tag as the original tag).
+   */
   {
-    char buf[11] = "x-hbot";
+    char buf[20];
     char *str = buf;
-    buf[6] = tag >> 24;
-    buf[7] = (tag >> 16) & 0xFF;
-    buf[8] = (tag >> 8) & 0xFF;
-    buf[9] = tag & 0xFF;
-    if (buf[9] == 0x20)
+    if (ISALPHA (tag >> 24)
+       && ISALPHA ((tag >> 16) & 0xFF)
+       && ISALPHA ((tag >> 8) & 0xFF)
+       && (tag & 0xFF) == ' ')
     {
-      buf[9] = '\0';
-      if (ISALPHA (buf[6]) && ISALPHA (buf[7]) && ISALPHA (buf[8]))
-      {
-       buf[6] = TOLOWER (buf[6]);
-       buf[7] = TOLOWER (buf[7]);
-       buf[8] = TOLOWER (buf[8]);
-       str += 6;
-      }
+      buf[0] = TOLOWER (tag >> 24);
+      buf[1] = TOLOWER ((tag >> 16) & 0xFF);
+      buf[2] = TOLOWER ((tag >> 8) & 0xFF);
+      buf[3] = '-';
+      str += 4;
     }
-    buf[10] = '\0';
-    return hb_language_from_string (str, -1);
+    snprintf (str, 16, "x-hbot-%08x", tag);
+    return hb_language_from_string (&*buf, -1);
   }
 }
 
@@ -498,13 +510,14 @@ 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 + 11);
+      buf = (unsigned char *) malloc (len + 16);
       if (unlikely (!buf))
       {
        *language = nullptr;
       }
       else
       {
+       int shift;
        memcpy (buf, lang_str, len);
        if (lang_str[0] != 'x' || lang_str[1] != '-') {
          buf[len++] = '-';
@@ -515,10 +528,9 @@ hb_ot_tags_to_script_and_language (hb_tag_t       script_tag,
        buf[len++] = 'b';
        buf[len++] = 's';
        buf[len++] = 'c';
-       buf[len++] = script_tag >> 24;
-       buf[len++] = (script_tag >> 16) & 0xFF;
-       buf[len++] = (script_tag >> 8) & 0xFF;
-       buf[len++] = script_tag & 0xFF;
+       buf[len++] = '-';
+       for (shift = 28; shift >= 0; shift -= 4)
+         buf[len++] = TOHEX (script_tag >> shift);
        *language = hb_language_from_string ((char *) buf, len);
        free (buf);
       }
index ef8ba3f..29219ad 100644 (file)
@@ -51,7 +51,7 @@ struct AxisValueMap
   public:
   F2DOT14      coords[2];
 //   F2DOT14   fromCoord;      /* A normalized coordinate value obtained using
-//                              * default normalization. */
+//                              * default normalization. */
 //   F2DOT14   toCoord;        /* The modified, normalized coordinate value. */
 
   public:
@@ -79,7 +79,7 @@ struct SegmentMaps : ArrayOf<AxisValueMap>
       return value - arrayZ[0].fromCoord + arrayZ[0].toCoord;
 
     unsigned int i;
-    unsigned int count = len;
+    unsigned int count = len - 1;
     for (i = 1; i < count && value > arrayZ[i].fromCoord; i++)
       ;
 
@@ -90,9 +90,8 @@ struct SegmentMaps : ArrayOf<AxisValueMap>
       return arrayZ[i-1].toCoord;
 
     int denom = arrayZ[i].fromCoord - arrayZ[i-1].fromCoord;
-    return arrayZ[i-1].toCoord +
-          ((arrayZ[i].toCoord - arrayZ[i-1].toCoord) *
-           (value - arrayZ[i-1].fromCoord) + denom/2) / denom;
+    return roundf (arrayZ[i-1].toCoord + ((float) (arrayZ[i].toCoord - arrayZ[i-1].toCoord) *
+                                         (value - arrayZ[i-1].fromCoord)) / denom);
 #undef toCoord
 #undef fromCoord
   }
index 7ce3123..af22f70 100644 (file)
@@ -83,9 +83,9 @@ struct AxisRecord
 
   public:
   Tag          axisTag;        /* Tag identifying the design variation for the axis. */
-  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. */
+  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. */
   HBUINT16     flags;          /* Axis flags. */
   NameID       axisNameID;     /* The name ID for entries in the 'name' table that
                                 * provide a display name for this axis. */
@@ -150,17 +150,8 @@ struct fvar
   {
     if (axes_count)
     {
-      /* TODO Rewrite as hb_array_t<>::sub-array() */
-      unsigned int count = axisCount;
-      start_offset = hb_min (start_offset, count);
-
-      count -= start_offset;
-      axes_array += start_offset;
-
-      count = hb_min (count, *axes_count);
-      *axes_count = count;
-
-      for (unsigned int i = 0; i < count; i++)
+      hb_array_t<const AxisRecord> arr = hb_array (&(this+firstAxis), axisCount).sub_array (start_offset, axes_count);
+      for (unsigned i = 0; i < arr.length; ++i)
        get_axis_deprecated (start_offset + i, axes_array + i);
     }
     return axisCount;
@@ -173,17 +164,8 @@ struct fvar
   {
     if (axes_count)
     {
-      /* TODO Rewrite as hb_array_t<>::sub-array() */
-      unsigned int count = axisCount;
-      start_offset = hb_min (start_offset, count);
-
-      count -= start_offset;
-      axes_array += start_offset;
-
-      count = hb_min (count, *axes_count);
-      *axes_count = count;
-
-      for (unsigned int i = 0; i < count; i++)
+      hb_array_t<const AxisRecord> arr = hb_array (&(this+firstAxis), axisCount).sub_array (start_offset, axes_count);
+      for (unsigned i = 0; i < arr.length; ++i)
        get_axis_info (start_offset + i, axes_array + i);
     }
     return axisCount;
@@ -229,7 +211,7 @@ struct fvar
     hb_ot_var_axis_info_t axis;
     get_axis_info (axis_index, &axis);
 
-    v = hb_max (hb_min (v, axis.max_value), axis.min_value); /* Clamp. */
+    v = hb_clamp (v, axis.min_value, axis.max_value);
 
     if (v == axis.default_value)
       return 0;
index a76121d..db944f6 100644 (file)
@@ -29,8 +29,6 @@
 #define HB_OT_VAR_GVAR_TABLE_HH
 
 #include "hb-open-type.hh"
-#include "hb-ot-glyf-table.hh"
-#include "hb-ot-var-fvar-table.hh"
 
 /*
  * gvar -- Glyph Variation Table
@@ -42,12 +40,14 @@ namespace OT {
 
 struct contour_point_t
 {
-  void init (float x_=0.f, float y_=0.f) { flag = 0; x = x_; y = y_; }
+  void init (float x_ = 0.f, float y_ = 0.f, bool is_end_point_ = false)
+  { flag = 0; x = x_; y = y_; is_end_point = is_end_point_; }
 
   void translate (const contour_point_t &p) { x += p.x; y += p.y; }
 
   uint8_t flag;
   float x, y;
+  bool is_end_point;
 };
 
 struct contour_point_vector_t : hb_vector_t<contour_point_t>
@@ -78,50 +78,34 @@ struct contour_point_vector_t : hb_vector_t<contour_point_t>
   }
 };
 
-struct Tuple : UnsizedArrayOf<F2DOT14> {};
-
-struct TuppleIndex : HBUINT16
+/* https://docs.microsoft.com/en-us/typography/opentype/spec/otvarcommonformats#tuplevariationheader */
+struct TupleVariationHeader
 {
-  enum Flags {
-    EmbeddedPeakTuple   = 0x8000u,
-    IntermediateRegion  = 0x4000u,
-    PrivatePointNumbers = 0x2000u,
-    TupleIndexMask      = 0x0FFFu
-  };
-
-  DEFINE_SIZE_STATIC (2);
-};
+  unsigned get_size (unsigned axis_count) const
+  { return min_size + get_all_tuples (axis_count).get_size (); }
 
-struct TupleVarHeader
-{
-  unsigned int get_size (unsigned int axis_count) const
-  {
-    return min_size +
-          (has_peak () ? get_peak_tuple ().get_size (axis_count) : 0) +
-          (has_intermediate () ? (get_start_tuple (axis_count).get_size (axis_count) +
-                                  get_end_tuple (axis_count).get_size (axis_count)) : 0);
-  }
+  unsigned get_data_size () const { return varDataSize; }
 
-  const TupleVarHeader &get_next (unsigned int axis_count) const
-  { return StructAtOffset<TupleVarHeader> (this, get_size (axis_count)); }
+  const TupleVariationHeader &get_next (unsigned axis_count) const
+  { return StructAtOffset<TupleVariationHeader> (this, get_size (axis_count)); }
 
   float calculate_scalar (const int *coords, unsigned int coord_count,
-                         const hb_array_t<const F2DOT14> shared_tuples) const
+                         const hb_array_t<const F2DOT14> shared_tuples) const
   {
-    const F2DOT14 *peak_tuple;
+    hb_array_t<const F2DOT14> peak_tuple;
 
     if (has_peak ())
-      peak_tuple = &(get_peak_tuple ()[0]);
+      peak_tuple = get_peak_tuple (coord_count);
     else
     {
       unsigned int index = get_index ();
       if (unlikely (index * coord_count >= shared_tuples.length))
        return 0.f;
-      peak_tuple = &shared_tuples[coord_count * index];
+      peak_tuple = shared_tuples.sub_array (coord_count * index, coord_count);
     }
 
-    const F2DOT14 *start_tuple = nullptr;
-    const F2DOT14 *end_tuple = nullptr;
+    hb_array_t<const F2DOT14> start_tuple;
+    hb_array_t<const F2DOT14> end_tuple;
     if (has_intermediate ())
     {
       start_tuple = get_start_tuple (coord_count);
@@ -154,58 +138,64 @@ struct TupleVarHeader
     return scalar;
   }
 
-  unsigned int get_data_size () const { return varDataSize; }
-
   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); }
 
   protected:
-  const Tuple &get_peak_tuple () const
-  { return StructAfter<Tuple> (tupleIndex); }
-  const Tuple &get_start_tuple (unsigned int axis_count) const
-  { return *(const Tuple *) &get_peak_tuple ()[has_peak () ? axis_count : 0]; }
-  const Tuple &get_end_tuple (unsigned int axis_count) const
-  { return *(const Tuple *) &get_peak_tuple ()[has_peak () ? (axis_count * 2) : axis_count]; }
-
-  HBUINT16             varDataSize;
-  TuppleIndex          tupleIndex;
+  struct TuppleIndex : HBUINT16
+  {
+    enum Flags {
+      EmbeddedPeakTuple   = 0x8000u,
+      IntermediateRegion  = 0x4000u,
+      PrivatePointNumbers = 0x2000u,
+      TupleIndexMask      = 0x0FFFu
+    };
+
+    DEFINE_SIZE_STATIC (2);
+  };
+
+  hb_array_t<const F2DOT14> get_all_tuples (unsigned axis_count) const
+  { return StructAfter<UnsizedArrayOf<F2DOT14>> (tupleIndex).as_array ((has_peak () + has_intermediate () * 2) * axis_count); }
+  hb_array_t<const F2DOT14> get_peak_tuple (unsigned axis_count) const
+  { return get_all_tuples (axis_count).sub_array (0, axis_count); }
+  hb_array_t<const F2DOT14> get_start_tuple (unsigned axis_count) const
+  { return get_all_tuples (axis_count).sub_array (has_peak () * axis_count, axis_count); }
+  hb_array_t<const F2DOT14> get_end_tuple (unsigned axis_count) const
+  { return get_all_tuples (axis_count).sub_array (has_peak () * axis_count + axis_count, axis_count); }
+
+  HBUINT16     varDataSize;    /* The size in bytes of the serialized
+                                * data for this tuple variation table. */
+  TuppleIndex  tupleIndex;     /* A packed field. The high 4 bits are flags (see below).
+                                  The low 12 bits are an index into a shared tuple
+                                  records array. */
   /* UnsizedArrayOf<F2DOT14> peakTuple - optional */
+                               /* Peak tuple record for this tuple variation table — optional,
+                                * determined by flags in the tupleIndex value.
+                                *
+                                * Note that this must always be included in the 'cvar' table. */
   /* UnsizedArrayOf<F2DOT14> intermediateStartTuple - optional */
+                               /* Intermediate start tuple record for this tuple variation table — optional,
+                                  determined by flags in the tupleIndex value. */
   /* UnsizedArrayOf<F2DOT14> intermediateEndTuple - optional */
-
+                               /* Intermediate end tuple record for this tuple variation table — optional,
+                                * determined by flags in the tupleIndex value. */
   public:
   DEFINE_SIZE_MIN (4);
 };
 
-struct TupleVarCount : HBUINT16
-{
-  bool has_shared_point_numbers () const { return ((*this) & SharedPointNumbers); }
-  unsigned int get_count () const { return (*this) & CountMask; }
-
-  protected:
-  enum Flags
-  {
-    SharedPointNumbers = 0x8000u,
-    CountMask          = 0x0FFFu
-  };
-
-  public:
-  DEFINE_SIZE_STATIC (2);
-};
-
-struct GlyphVarData
+struct GlyphVariationData
 {
-  const TupleVarHeader &get_tuple_var_header (void) const
-  { return StructAfter<TupleVarHeader> (data); }
+  const TupleVariationHeader &get_tuple_var_header (void) const
+  { return StructAfter<TupleVariationHeader> (data); }
 
   struct tuple_iterator_t
   {
-    void init (const GlyphVarData *var_data_, unsigned int length_, unsigned int axis_count_)
+    void init (hb_bytes_t var_data_bytes_, unsigned int axis_count_)
     {
-      var_data = var_data_;
-      length = length_;
+      var_data_bytes = var_data_bytes_;
+      var_data = var_data_bytes_.as<GlyphVariationData> ();
       index = 0;
       axis_count = axis_count_;
       current_tuple = &var_data->get_tuple_var_header ();
@@ -216,10 +206,9 @@ struct GlyphVarData
     {
       if (var_data->has_shared_point_numbers ())
       {
-       hb_bytes_t bytes ((const char *) var_data, length);
        const HBUINT8 *base = &(var_data+var_data->data);
        const HBUINT8 *p = base;
-       if (!unpack_points (p, shared_indices, bytes)) return false;
+       if (!unpack_points (p, shared_indices, var_data_bytes)) return false;
        data_offset = p - base;
       }
       return true;
@@ -228,7 +217,8 @@ struct GlyphVarData
     bool is_valid () const
     {
       return (index < var_data->tupleVarCount.get_count ()) &&
-            in_range (current_tuple) &&
+            var_data_bytes.check_range (current_tuple, TupleVariationHeader::min_size) &&
+            var_data_bytes.check_range (current_tuple, hb_max (current_tuple->get_data_size (), current_tuple->get_size (axis_count))) &&
             current_tuple->get_size (axis_count);
     }
 
@@ -240,32 +230,25 @@ struct GlyphVarData
       return is_valid ();
     }
 
-    bool in_range (const void *p, unsigned int l) const
-    { return (const char*) p >= (const char*) var_data && (const char*) p+l <= (const char*) var_data + length; }
-
-    template <typename T> bool in_range (const T *p) const { return in_range (p, sizeof (*p)); }
-
     const HBUINT8 *get_serialized_data () const
     { return &(var_data+var_data->data) + data_offset; }
 
     private:
-    const GlyphVarData *var_data;
-    unsigned int length;
+    const GlyphVariationData *var_data;
     unsigned int index;
     unsigned int axis_count;
     unsigned int data_offset;
 
     public:
-    const TupleVarHeader *current_tuple;
+    hb_bytes_t var_data_bytes;
+    const TupleVariationHeader *current_tuple;
   };
 
-  static bool get_tuple_iterator (const GlyphVarData *var_data,
-                                 unsigned int length,
-                                 unsigned int axis_count,
-                                 hb_vector_t<unsigned int> &shared_indices /* OUT */,
-                                 tuple_iterator_t *iterator /* OUT */)
+  static bool get_tuple_iterator (hb_bytes_t var_data_bytes, unsigned axis_count,
+                                 hb_vector_t<unsigned int> &shared_indices /* OUT */,
+                                 tuple_iterator_t *iterator /* OUT */)
   {
-    iterator->init (var_data, length, axis_count);
+    iterator->init (var_data_bytes, axis_count);
     if (!iterator->get_shared_indices (shared_indices))
       return false;
     return iterator->is_valid ();
@@ -283,12 +266,12 @@ struct GlyphVarData
       POINT_RUN_COUNT_MASK = 0x7F
     };
 
-    if (unlikely (!bytes.in_range (p))) return false;
+    if (unlikely (!bytes.check_range (p))) return false;
 
     uint16_t count = *p++;
     if (count & POINTS_ARE_WORDS)
     {
-      if (unlikely (!bytes.in_range (p))) return false;
+      if (unlikely (!bytes.check_range (p))) return false;
       count = ((count & POINT_RUN_COUNT_MASK) << 8) | *p++;
     }
     points.resize (count);
@@ -297,7 +280,7 @@ struct GlyphVarData
     uint16_t i = 0;
     while (i < count)
     {
-      if (unlikely (!bytes.in_range (p))) return false;
+      if (unlikely (!bytes.check_range (p))) return false;
       uint16_t j;
       uint8_t control = *p++;
       uint16_t run_count = (control & POINT_RUN_COUNT_MASK) + 1;
@@ -305,7 +288,7 @@ struct GlyphVarData
       {
        for (j = 0; j < run_count && i < count; j++, i++)
        {
-         if (unlikely (!bytes.in_range ((const HBUINT16 *) p)))
+         if (unlikely (!bytes.check_range ((const HBUINT16 *) p)))
            return false;
          n += *(const HBUINT16 *)p;
          points[i] = n;
@@ -316,7 +299,7 @@ struct GlyphVarData
       {
        for (j = 0; j < run_count && i < count; j++, i++)
        {
-         if (unlikely (!bytes.in_range (p))) return false;
+         if (unlikely (!bytes.check_range (p))) return false;
          n += *p++;
          points[i] = n;
        }
@@ -341,7 +324,7 @@ struct GlyphVarData
     unsigned int count = deltas.length;
     while (i < count)
     {
-      if (unlikely (!bytes.in_range (p))) return false;
+      if (unlikely (!bytes.check_range (p))) return false;
       uint8_t control = *p++;
       unsigned int run_count = (control & DELTA_RUN_COUNT_MASK) + 1;
       unsigned int j;
@@ -351,7 +334,7 @@ struct GlyphVarData
       else if (control & DELTAS_ARE_WORDS)
        for (j = 0; j < run_count && i < count; j++, i++)
        {
-         if (unlikely (!bytes.in_range ((const HBUINT16 *) p)))
+         if (unlikely (!bytes.check_range ((const HBUINT16 *) p)))
            return false;
          deltas[i] = *(const HBINT16 *) p;
          p += HBUINT16::static_size;
@@ -359,7 +342,7 @@ struct GlyphVarData
       else
        for (j = 0; j < run_count && i < count; j++, i++)
        {
-         if (unlikely (!bytes.in_range (p)))
+         if (unlikely (!bytes.check_range (p)))
            return false;
          deltas[i] = *(const HBINT8 *) p++;
        }
@@ -369,10 +352,32 @@ struct GlyphVarData
     return true;
   }
 
+  bool has_data () const { return tupleVarCount; }
+
   protected:
-  TupleVarCount                tupleVarCount;
-  OffsetTo<HBUINT8>    data;
-  /* TupleVarHeader tupleVarHeaders[] */
+  struct TupleVarCount : HBUINT16
+  {
+    bool has_shared_point_numbers () const { return ((*this) & SharedPointNumbers); }
+    unsigned int get_count () const { return (*this) & CountMask; }
+
+    protected:
+    enum Flags
+    {
+      SharedPointNumbers= 0x8000u,
+      CountMask                = 0x0FFFu
+    };
+    public:
+    DEFINE_SIZE_STATIC (2);
+  };
+
+  TupleVarCount        tupleVarCount;  /* A packed field. The high 4 bits are flags, and the
+                                * 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>
+               data;           /* Offset from the start of the GlyphVariationData table
+                                * to the serialized data. */
+  /* TupleVariationHeader tupleVariationHeaders[] *//* Array of tuple variation headers. */
   public:
   DEFINE_SIZE_MIN (4);
 };
@@ -386,7 +391,7 @@ struct gvar
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) && (version.major == 1) &&
                  (glyphCount == c->get_num_glyphs ()) &&
-                 c->check_array (&(this+sharedTuples), axisCount * sharedTupleCount) &&
+                 sharedTuples.sanitize (c, this, axisCount * sharedTupleCount) &&
                  (is_long_offset () ?
                     c->check_array (get_long_offset_array (), glyphCount+1) :
                     c->check_array (get_short_offset_array (), glyphCount+1)) &&
@@ -394,7 +399,7 @@ struct gvar
                                  get_offset (glyphCount) - get_offset (0)));
   }
 
-  /* GlyphVarData not sanitized here; must be checked while accessing each glyph varation data */
+  /* GlyphVariationData not sanitized here; must be checked while accessing each glyph varation data */
   bool sanitize (hb_sanitize_context_t *c) const
   { return sanitize_shallow (c); }
 
@@ -418,7 +423,7 @@ struct gvar
     {
       hb_codepoint_t old_gid;
       if (!c->plan->old_gid_for_new_gid (gid, &old_gid)) continue;
-      subset_data_size += get_glyph_var_data_length (old_gid);
+      subset_data_size += get_glyph_var_data_bytes (c->source_blob, old_gid).length;
     }
 
     bool long_offset = subset_data_size & ~0xFFFFu;
@@ -436,27 +441,30 @@ struct gvar
       F2DOT14 *tuples = c->serializer->allocate_size<F2DOT14> (shared_tuple_size);
       if (!tuples) return_trace (false);
       out->sharedTuples = (char *) tuples - (char *) out;
-      memcpy (tuples, &(this+sharedTuples), shared_tuple_size);
+      memcpy (tuples, this+sharedTuples, shared_tuple_size);
     }
 
     char *subset_data = c->serializer->allocate_size<char> (subset_data_size);
     if (!subset_data) return_trace (false);
-    out->dataZ = subset_data - (char *)out;
+    out->dataZ = subset_data - (char *) out;
 
     unsigned int glyph_offset = 0;
     for (hb_codepoint_t gid = 0; gid < num_glyphs; gid++)
     {
       hb_codepoint_t old_gid;
-      unsigned int length = c->plan->old_gid_for_new_gid (gid, &old_gid) ? get_glyph_var_data_length (old_gid) : 0;
+      hb_bytes_t var_data_bytes = c->plan->old_gid_for_new_gid (gid, &old_gid)
+                               ? get_glyph_var_data_bytes (c->source_blob, old_gid)
+                               : hb_bytes_t ();
 
       if (long_offset)
        ((HBUINT32 *) subset_offsets)[gid] = glyph_offset;
       else
        ((HBUINT16 *) subset_offsets)[gid] = glyph_offset / 2;
 
-      if (length > 0) memcpy (subset_data, get_glyph_var_data (old_gid), length);
-      subset_data += length;
-      glyph_offset += length;
+      if (var_data_bytes.length > 0)
+       memcpy (subset_data, var_data_bytes.arrayZ, var_data_bytes.length);
+      subset_data += var_data_bytes.length;
+      glyph_offset += var_data_bytes.length;
     }
     if (long_offset)
       ((HBUINT32 *) subset_offsets)[num_glyphs] = glyph_offset;
@@ -467,16 +475,12 @@ struct gvar
   }
 
   protected:
-  const GlyphVarData *get_glyph_var_data (hb_codepoint_t glyph) const
+  const hb_bytes_t get_glyph_var_data_bytes (hb_blob_t *blob, hb_codepoint_t glyph) const
   {
-    unsigned int start_offset = get_offset (glyph);
-    unsigned int end_offset = get_offset (glyph+1);
-
-    if ((start_offset == end_offset) ||
-       unlikely ((start_offset > get_offset (glyphCount)) ||
-                 (start_offset + GlyphVarData::min_size > end_offset)))
-      return &Null (GlyphVarData);
-    return &(((unsigned char *) this + start_offset) + dataZ);
+    unsigned start_offset = get_offset (glyph);
+    unsigned length = get_offset (glyph+1) - start_offset;
+    hb_bytes_t var_data = blob->as_bytes ().sub_array (((unsigned) dataZ) + start_offset, length);
+    return likely (var_data.length >= GlyphVariationData::min_size) ? var_data : hb_bytes_t ();
   }
 
   bool is_long_offset () const { return (flags & 1) != 0; }
@@ -489,15 +493,6 @@ struct gvar
       return get_short_offset_array ()[i] * 2;
   }
 
-  unsigned int get_glyph_var_data_length (unsigned int glyph) const
-  {
-    unsigned int end_offset = get_offset (glyph + 1);
-    unsigned int start_offset = get_offset (glyph);
-    if (unlikely (start_offset > end_offset || end_offset > get_offset (glyphCount)))
-      return 0;
-    return end_offset - start_offset;
-  }
-
   const HBUINT32 * get_long_offset_array () const { return (const HBUINT32 *) &offsetZ; }
   const HBUINT16 *get_short_offset_array () const { return (const HBUINT16 *) &offsetZ; }
 
@@ -505,27 +500,8 @@ struct gvar
   struct accelerator_t
   {
     void init (hb_face_t *face)
-    {
-      gvar_table = hb_sanitize_context_t ().reference_table<gvar> (face);
-      hb_blob_ptr_t<fvar> fvar_table = hb_sanitize_context_t ().reference_table<fvar> (face);
-      unsigned int axis_count = fvar_table->get_axis_count ();
-      fvar_table.destroy ();
-
-      if (unlikely ((gvar_table->glyphCount != face->get_num_glyphs ()) ||
-                   (gvar_table->axisCount != axis_count)))
-       fini ();
-
-      unsigned int num_shared_coord = gvar_table->sharedTupleCount * gvar_table->axisCount;
-      shared_tuples.resize (num_shared_coord);
-      for (unsigned int i = 0; i < num_shared_coord; i++)
-       shared_tuples[i] = (&(gvar_table + gvar_table->sharedTuples))[i];
-    }
-
-    void fini ()
-    {
-      gvar_table.destroy ();
-      shared_tuples.fini ();
-    }
+    { table = hb_sanitize_context_t ().reference_table<gvar> (face); }
+    void fini () { table.destroy (); }
 
     private:
     struct x_getter { static float get (const contour_point_t &p) { return p.x; } };
@@ -543,11 +519,11 @@ struct gvar
       float next_delta = T::get (deltas[next]);
 
       if (prev_val == next_val)
-       return (prev_delta == next_delta) ? prev_delta : 0.f;
+       return (prev_delta == next_delta) ? prev_delta : 0.f;
       else if (target_val <= hb_min (prev_val, next_val))
-       return (prev_val < next_val) ? prev_delta : next_delta;
+       return (prev_val < next_val) ? prev_delta : next_delta;
       else if (target_val >= hb_max (prev_val, next_val))
-       return (prev_val > next_val) ? prev_delta : next_delta;
+       return (prev_val > next_val) ? prev_delta : next_delta;
 
       /* linear interpolation */
       float r = (target_val - prev_val) / (next_val - prev_val);
@@ -558,23 +534,19 @@ struct gvar
     { return (i >= end) ? start : (i + 1); }
 
     public:
-    bool apply_deltas_to_points (hb_codepoint_t glyph,
-                                const int *coords, unsigned int coord_count,
-                                const hb_array_t<contour_point_t> points,
-                                const hb_array_t<unsigned int> end_points) const
+    bool apply_deltas_to_points (hb_codepoint_t glyph, hb_font_t *font,
+                                const hb_array_t<contour_point_t> points) const
     {
-      if (unlikely (coord_count != gvar_table->axisCount)) return false;
+      /* 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;
 
-      const GlyphVarData *var_data = gvar_table->get_glyph_var_data (glyph);
-      if (var_data == &Null (GlyphVarData)) 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;
-      GlyphVarData::tuple_iterator_t iterator;
-      if (!GlyphVarData::get_tuple_iterator (var_data,
-                                            gvar_table->get_glyph_var_data_length (glyph),
-                                            gvar_table->axisCount,
-                                            shared_indices,
-                                            &iterator))
-       return false;
+      GlyphVariationData::tuple_iterator_t iterator;
+      if (!GlyphVariationData::get_tuple_iterator (var_data_bytes, table->axisCount,
+                                            shared_indices, &iterator))
+       return true; /* so isn't applied at all */
 
       /* Save original points for inferred delta calculation */
       contour_point_vector_t orig_points;
@@ -585,19 +557,27 @@ struct gvar
       contour_point_vector_t deltas; /* flag is used to indicate referenced point */
       deltas.resize (points.length);
 
+      hb_vector_t<unsigned> end_points;
+      for (unsigned i = 0; i < points.length; ++i)
+       if (points[i].is_end_point)
+         end_points.push (i);
+
+      int *coords = font->coords;
+      unsigned num_coords = font->num_coords;
+      hb_array_t<const F2DOT14> shared_tuples = (table+table->sharedTuples).as_array (table->sharedTupleCount * table->axisCount);
       do
       {
-       float scalar = iterator.current_tuple->calculate_scalar (coords, coord_count, shared_tuples.as_array ());
+       float scalar = iterator.current_tuple->calculate_scalar (coords, num_coords, shared_tuples);
        if (scalar == 0.f) continue;
        const HBUINT8 *p = iterator.get_serialized_data ();
        unsigned int length = iterator.current_tuple->get_data_size ();
-       if (unlikely (!iterator.in_range (p, length)))
+       if (unlikely (!iterator.var_data_bytes.check_range (p, length)))
          return false;
 
        hb_bytes_t bytes ((const char *) p, length);
        hb_vector_t<unsigned int> private_indices;
        if (iterator.current_tuple->has_private_points () &&
-           !GlyphVarData::unpack_points (p, private_indices, bytes))
+           !GlyphVariationData::unpack_points (p, private_indices, bytes))
          return false;
        const hb_array_t<unsigned int> &indices = private_indices.length ? private_indices : shared_indices;
 
@@ -605,11 +585,11 @@ struct gvar
        unsigned int num_deltas = apply_to_all ? points.length : indices.length;
        hb_vector_t<int> x_deltas;
        x_deltas.resize (num_deltas);
-       if (!GlyphVarData::unpack_deltas (p, x_deltas, bytes))
+       if (!GlyphVariationData::unpack_deltas (p, x_deltas, bytes))
          return false;
        hb_vector_t<int> y_deltas;
        y_deltas.resize (num_deltas);
-       if (!GlyphVarData::unpack_deltas (p, y_deltas, bytes))
+       if (!GlyphVariationData::unpack_deltas (p, y_deltas, bytes))
          return false;
 
        for (unsigned int i = 0; i < deltas.length; i++)
@@ -623,26 +603,26 @@ struct gvar
        }
 
        /* infer deltas for unreferenced points */
-       unsigned int start_point = 0;
-       for (unsigned int c = 0; c < end_points.length; c++)
+       unsigned start_point = 0;
+       for (unsigned c = 0; c < end_points.length; c++)
        {
-         unsigned int end_point = end_points[c];
-         unsigned int i, j;
+         unsigned end_point = end_points[c];
 
          /* Check the number of unreferenced points in a contour. If no unref points or no ref points, nothing to do. */
-         unsigned int unref_count = 0;
-         for (i = start_point; i <= end_point; i++)
+         unsigned unref_count = 0;
+         for (unsigned i = start_point; i <= end_point; i++)
            if (!deltas[i].flag) unref_count++;
+
+         unsigned j = start_point;
          if (unref_count == 0 || unref_count > end_point - start_point)
            goto no_more_gaps;
 
-         j = start_point;
          for (;;)
          {
            /* Locate the next gap of unreferenced points between two referenced points prev and next.
             * Note that a gap may wrap around at left (start_point) and/or at right (end_point).
             */
-           unsigned int prev, next;
+           unsigned int prev, next, i;
            for (;;)
            {
              i = j;
@@ -683,29 +663,36 @@ no_more_gaps:
       return true;
     }
 
-    unsigned int get_axis_count () const { return gvar_table->axisCount; }
-
-    protected:
-    const GlyphVarData *get_glyph_var_data (hb_codepoint_t glyph) const
-    { return gvar_table->get_glyph_var_data (glyph); }
+    unsigned int get_axis_count () const { return table->axisCount; }
 
     private:
-    hb_blob_ptr_t<gvar> gvar_table;
-    hb_vector_t<F2DOT14> shared_tuples;
+    hb_blob_ptr_t<gvar> table;
   };
 
   protected:
-  FixedVersion<>version;       /* Version of gvar table. Set to 0x00010000u. */
-  HBUINT16     axisCount;
+  FixedVersion<>version;       /* Version number of the glyph variations table
+                                * Set to 0x00010000u. */
+  HBUINT16     axisCount;      /* The number of variation axes for this font. This must be
+                                * the same number as axisCount in the 'fvar' table. */
   HBUINT16     sharedTupleCount;
-  LOffsetTo<F2DOT14>
-               sharedTuples;   /* LOffsetTo<UnsizedArrayOf<Tupple>> */
-  HBUINT16     glyphCount;
-  HBUINT16     flags;
-  LOffsetTo<GlyphVarData>
-               dataZ;          /* Array of GlyphVarData */
+                               /* The number of shared tuple records. Shared tuple records
+                                * 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>>
+               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
+                                * glyphs stored elsewhere in the font. */
+  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>
+               dataZ;          /* Offset from the start of this table to the array of
+                                * GlyphVariationData tables. */
   UnsizedArrayOf<HBUINT8>
-               offsetZ;        /* Array of 16-bit or 32-bit (glyphCount+1) offsets */
+               offsetZ;        /* Offsets from the start of the GlyphVariationData array
+                                * to each GlyphVariationData table. */
   public:
   DEFINE_SIZE_MIN (20);
 };
index 223430f..fdcc88d 100644 (file)
@@ -44,6 +44,38 @@ struct DeltaSetIndexMap
                                  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
@@ -63,7 +95,7 @@ struct DeltaSetIndexMap
     }
 
     { /* Repack it. */
-      unsigned int n = get_inner_bitcount ();
+      unsigned int n = get_inner_bit_count ();
       unsigned int outer = u >> n;
       unsigned int inner = u & ((1 << n) - 1);
       u = (outer<<16) | inner;
@@ -72,22 +104,230 @@ struct DeltaSetIndexMap
     return u;
   }
 
-  protected:
-  unsigned int get_width () const          { return ((format >> 4) & 3) + 1; }
-
-  unsigned int get_inner_bitcount () const { return (format & 0xF) + 1; }
+  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. */
+               mapDataZ;       /* The delta-set index mapping data. */
 
   public:
   DEFINE_SIZE_ARRAY (4, mapDataZ);
 };
 
+struct index_map_subset_plan_t
+{
+  enum index_map_index_t {
+    ADV_INDEX,
+    LSB_INDEX, /* dual as TSB */
+    RSB_INDEX, /* dual as BSB */
+    VORG_INDEX
+  };
+
+  void init (const DeltaSetIndexMap  &index_map,
+            hb_inc_bimap_t          &outer_map,
+            hb_vector_t<hb_set_t *> &inner_sets,
+            const hb_subset_plan_t  *plan)
+  {
+    map_count = 0;
+    outer_bit_count = 0;
+    inner_bit_count = 1;
+    max_inners.init ();
+    output_map.init ();
+
+    if (&index_map == &Null (DeltaSetIndexMap)) return;
+
+    unsigned int       last_val = (unsigned int)-1;
+    hb_codepoint_t     last_gid = (hb_codepoint_t)-1;
+    hb_codepoint_t     gid = (hb_codepoint_t) hb_min (index_map.get_map_count (), plan->num_output_glyphs ());
+
+    outer_bit_count = (index_map.get_width () * 8) - index_map.get_inner_bit_count ();
+    max_inners.resize (inner_sets.length);
+    for (unsigned i = 0; i < inner_sets.length; i++) max_inners[i] = 0;
+
+    /* Search backwards for a map value different from the last map value */
+    for (; gid > 0; gid--)
+    {
+      hb_codepoint_t   old_gid;
+      if (!plan->old_gid_for_new_gid (gid - 1, &old_gid))
+      {
+       if (last_gid == (hb_codepoint_t) -1)
+         continue;
+       else
+         break;
+      }
+
+      unsigned int v = index_map.map (old_gid);
+      if (last_gid == (hb_codepoint_t) -1)
+      {
+       last_val = v;
+       last_gid = gid;
+       continue;
+      }
+      if (v != last_val) break;
+
+      last_gid = gid;
+    }
+
+    if (unlikely (last_gid == (hb_codepoint_t)-1)) return;
+    map_count = last_gid;
+    for (gid = 0; gid < map_count; gid++)
+    {
+      hb_codepoint_t   old_gid;
+      if (plan->old_gid_for_new_gid (gid, &old_gid))
+      {
+       unsigned int v = index_map.map (old_gid);
+       unsigned int outer = v >> 16;
+       unsigned int inner = v & 0xFFFF;
+       outer_map.add (outer);
+       if (inner > max_inners[outer]) max_inners[outer] = inner;
+       if (outer >= inner_sets.length) return;
+       inner_sets[outer]->add (inner);
+      }
+    }
+  }
+
+  void fini ()
+  {
+    max_inners.fini ();
+    output_map.fini ();
+  }
+
+  void remap (const DeltaSetIndexMap *input_map,
+             const hb_inc_bimap_t &outer_map,
+             const hb_vector_t<hb_inc_bimap_t> &inner_maps,
+             const hb_subset_plan_t *plan)
+  {
+    if (input_map == &Null (DeltaSetIndexMap)) return;
+
+    for (unsigned int i = 0; i < max_inners.length; i++)
+    {
+      if (inner_maps[i].get_population () == 0) continue;
+      unsigned int bit_count = (max_inners[i]==0)? 1: hb_bit_storage (inner_maps[i][max_inners[i]]);
+      if (bit_count > inner_bit_count) inner_bit_count = bit_count;
+    }
+
+    output_map.resize (map_count);
+    for (hb_codepoint_t gid = 0; gid < output_map.length; gid++)
+    {
+      hb_codepoint_t   old_gid;
+      if (plan->old_gid_for_new_gid (gid, &old_gid))
+      {
+       unsigned int v = input_map->map (old_gid);
+       unsigned int outer = v >> 16;
+       output_map[gid] = (outer_map[outer] << 16) | (inner_maps[outer][v & 0xFFFF]);
+      }
+      else
+       output_map[gid] = 0;    /* Map unused glyph to outer/inner=0/0 */
+    }
+  }
+
+  unsigned int get_inner_bit_count () const { return inner_bit_count; }
+  unsigned int get_width ()           const { return ((outer_bit_count + inner_bit_count + 7) / 8); }
+  unsigned int get_map_count ()       const { return map_count; }
+
+  unsigned int get_size () const
+  { 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 (); }
+
+  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;
+};
+
+struct hvarvvar_subset_plan_t
+{
+  hvarvvar_subset_plan_t() : inner_maps (), index_map_plans () {}
+  ~hvarvvar_subset_plan_t() { fini (); }
+
+  void init (const hb_array_t<const DeltaSetIndexMap *> &index_maps,
+            const VariationStore &_var_store,
+            const hb_subset_plan_t *plan)
+  {
+    index_map_plans.resize (index_maps.length);
+
+    var_store = &_var_store;
+    inner_sets.resize (var_store->get_sub_table_count ());
+    for (unsigned int i = 0; i < inner_sets.length; i++)
+      inner_sets[i] = hb_set_create ();
+    adv_set = hb_set_create ();
+
+    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;
+      outer_map.add (0);
+      for (hb_codepoint_t gid = 0; gid < plan->num_output_glyphs (); gid++)
+      {
+       hb_codepoint_t old_gid;
+       if (plan->old_gid_for_new_gid (gid, &old_gid))
+         inner_sets[0]->add (old_gid);
+      }
+      hb_set_union (adv_set, inner_sets[0]);
+    }
+
+    for (unsigned int i = 1; i < index_maps.length; i++)
+      index_map_plans[i].init (*index_maps[i], outer_map, inner_sets, plan);
+
+    outer_map.sort ();
+
+    if (retain_adv_map)
+    {
+      for (hb_codepoint_t gid = 0; gid < plan->num_output_glyphs (); gid++)
+       if (inner_sets[0]->has (gid))
+         inner_maps[0].add (gid);
+       else
+         inner_maps[0].skip ();
+    }
+    else
+    {
+      inner_maps[0].add_set (adv_set);
+      hb_set_subtract (inner_sets[0], adv_set);
+      inner_maps[0].add_set (inner_sets[0]);
+    }
+
+    for (unsigned int i = 1; i < inner_maps.length; i++)
+      inner_maps[i].add_set (inner_sets[i]);
+
+    for (unsigned int i = 0; i < index_maps.length; i++)
+      index_map_plans[i].remap (index_maps[i], outer_map, inner_maps, plan);
+  }
+
+  void fini ()
+  {
+    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 ();
+  }
+
+  hb_inc_bimap_t outer_map;
+  hb_vector_t<hb_inc_bimap_t> inner_maps;
+  hb_vector_t<index_map_subset_plan_t> index_map_plans;
+  const VariationStore *var_store;
+
+  protected:
+  hb_vector_t<hb_set_t *> inner_sets;
+  hb_set_t *adv_set;
+};
 
 /*
  * HVAR -- Horizontal Metrics Variations
@@ -114,7 +354,59 @@ struct HVARVVAR
                  rsbMap.sanitize (c, this));
   }
 
-  float get_advance_var (hb_font_t *font, hb_codepoint_t glyph) const
+  void listup_index_maps (hb_vector_t<const DeltaSetIndexMap *> &index_maps) const
+  {
+    index_maps.push (&(this+advMap));
+    index_maps.push (&(this+lsbMap));
+    index_maps.push (&(this+rsbMap));
+  }
+
+  bool serialize_index_maps (hb_serialize_context_t *c,
+                            const hb_array_t<index_map_subset_plan_t> &im_plans)
+  {
+    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])))
+      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])))
+      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])))
+      return_trace (false);
+
+    return_trace (true);
+  }
+
+  template <typename T>
+  bool _subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    hvarvvar_subset_plan_t     hvar_plan;
+    hb_vector_t<const DeltaSetIndexMap *>
+                               index_maps;
+
+    ((T*)this)->listup_index_maps (index_maps);
+    hvar_plan.init (index_maps.as_array (), this+varStore, c->plan);
+
+    T *out = c->serializer->allocate_min<T> ();
+    if (unlikely (!out)) return_trace (false);
+
+    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 ())))
+      return_trace (false);
+
+    return_trace (out->T::serialize_index_maps (c->serializer,
+                                               hvar_plan.index_map_plans.as_array ()));
+  }
+
+  float get_advance_var (hb_codepoint_t glyph, hb_font_t *font) const
   {
     unsigned int varidx = (this+advMap).map (glyph);
     return (this+varStore).get_delta (varidx, font->coords, font->num_coords);
@@ -148,6 +440,7 @@ struct HVARVVAR
 
 struct HVAR : HVARVVAR {
   static constexpr hb_tag_t tableTag = HB_OT_TAG_HVAR;
+  bool subset (hb_subset_context_t *c) const { return HVARVVAR::_subset<HVAR> (c); }
 };
 struct VVAR : HVARVVAR {
   static constexpr hb_tag_t tableTag = HB_OT_TAG_VVAR;
@@ -159,6 +452,28 @@ struct VVAR : HVARVVAR {
                  vorgMap.sanitize (c, this));
   }
 
+  void listup_index_maps (hb_vector_t<const DeltaSetIndexMap *> &index_maps) const
+  {
+    HVARVVAR::listup_index_maps (index_maps);
+    index_maps.push (&(this+vorgMap));
+  }
+
+  bool serialize_index_maps (hb_serialize_context_t *c,
+                            const hb_array_t<index_map_subset_plan_t> &im_plans)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!HVARVVAR::serialize_index_maps (c, im_plans)))
+      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])))
+      return_trace (false);
+
+    return_trace (true);
+  }
+
+  bool subset (hb_subset_context_t *c) const { return HVARVVAR::_subset<VVAR> (c); }
+
   protected:
   LOffsetTo<DeltaSetIndexMap>
                vorgMap;        /* Offset to vertical-origin var-idx mapping. */
index 5a9d2af..1b7fad9 100644 (file)
@@ -77,7 +77,9 @@ struct MVAR
                 const int *coords, unsigned int coord_count) const
   {
     const VariationValueRecord *record;
-    record = (VariationValueRecord *) hb_bsearch (&tag, valuesZ.arrayZ,
+    record = (VariationValueRecord *) hb_bsearch (tag,
+                                                 (const VariationValueRecord *)
+                                                   (const HBUINT8 *) valuesZ,
                                                  valueRecordCount, valueRecordSize,
                                                  tag_compare);
     if (!record)
index a4d6b06..c680320 100644 (file)
@@ -84,7 +84,7 @@ struct VORG
     this->defaultVertOriginY = defaultVertOriginY;
     this->vertYOrigins.len = it.len ();
 
-    for (const auto _ : it) c->copy (_);
+    c->copy_all (it);
   }
 
   bool subset (hb_subset_context_t *c) const
@@ -122,10 +122,11 @@ struct VORG
   }
 
   protected:
-  FixedVersion<>       version;                /* Version of VORG table. Set to 0x00010000u. */
-  FWORD                        defaultVertOriginY;     /* The default vertical origin. */
+  FixedVersion<>version;       /* Version of VORG table. Set to 0x00010000u. */
+  FWORD                defaultVertOriginY;
+                               /* The default vertical origin. */
   SortedArrayOf<VertOriginMetric>
-                       vertYOrigins;           /* The array of vertical origins. */
+               vertYOrigins;   /* The array of vertical origins. */
 
   public:
   DEFINE_SIZE_ARRAY(8, vertYOrigins);
index 83875db..dcf0faf 100644 (file)
@@ -41,9 +41,7 @@ struct hb_pool_t
   {
     next = nullptr;
 
-    + hb_iter (chunks)
-    | hb_apply ([] (chunk_t *_) { ::free (_); })
-    ;
+    for (chunk_t *_ : chunks) ::free (_);
 
     chunks.fini ();
   }
index 7859c6a..091b301 100644 (file)
 #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
+#endif
 
 struct hb_sanitize_context_t :
        hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE>
@@ -120,7 +123,7 @@ struct hb_sanitize_context_t :
   hb_sanitize_context_t () :
        debug_depth (0),
        start (nullptr), end (nullptr),
-       max_ops (0),
+       max_ops (0), max_subtables (0),
        writable (false), edit_count (0),
        blob (nullptr),
        num_glyphs (65536),
@@ -134,6 +137,12 @@ struct hb_sanitize_context_t :
   static return_t no_dispatch_return_value () { return false; }
   bool stop_sublookup_iteration (const return_t r) const { return !r; }
 
+  bool visit_subtables (unsigned count)
+  {
+    max_subtables += count;
+    return max_subtables < HB_SANITIZE_MAX_SUTABLES;
+  }
+
   private:
   template <typename T, typename ...Ts> auto
   _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN
@@ -189,8 +198,12 @@ struct hb_sanitize_context_t :
   void start_processing ()
   {
     reset_object ();
-    this->max_ops = hb_max ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR,
-                        (unsigned) HB_SANITIZE_MAX_OPS_MIN);
+    if (unlikely (hb_unsigned_mul_overflows (this->end - this->start, HB_SANITIZE_MAX_OPS_FACTOR)))
+      this->max_ops = HB_SANITIZE_MAX_OPS_MAX;
+    else
+      this->max_ops = hb_clamp ((unsigned) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR,
+                               (unsigned) HB_SANITIZE_MAX_OPS_MIN,
+                               (unsigned) HB_SANITIZE_MAX_OPS_MAX);
     this->edit_count = 0;
     this->debug_depth = 0;
 
@@ -376,7 +389,7 @@ struct hb_sanitize_context_t :
 
   mutable unsigned int debug_depth;
   const char *start, *end;
-  mutable int max_ops;
+  mutable int max_ops, max_subtables;
   private:
   bool writable;
   unsigned int edit_count;
index 4c674b1..4fb4f4e 100644 (file)
@@ -45,12 +45,13 @@ struct hb_serialize_context_t
 {
   typedef unsigned objidx_t;
 
-  struct range_t
-  {
-    char *head, *tail;
-  };
+  enum whence_t {
+     Head,     /* Relative to the current object head (default). */
+     Tail,     /* Relative to the current object tail after packed. */
+     Absolute  /* Absolute: from the start of the serialize buffer. */
+   };
 
-  struct object_t : range_t
+  struct object_t
   {
     void fini () { links.fini (); }
 
@@ -70,17 +71,29 @@ struct hb_serialize_context_t
     struct link_t
     {
       bool is_wide: 1;
-      unsigned position : 31;
+      bool is_signed: 1;
+      unsigned whence: 2;
+      unsigned position: 28;
       unsigned bias;
       objidx_t objidx;
     };
 
+    char *head;
+    char *tail;
     hb_vector_t<link_t> links;
     object_t *next;
   };
 
-  range_t snapshot () { range_t s = {head, tail} ; return s; }
+  struct snapshot_t
+  {
+    char *head;
+    char *tail;
+    object_t *current; // Just for sanity check
+    unsigned num_links;
+  };
 
+  snapshot_t snapshot ()
+  { return snapshot_t { head, tail, current, current->links.length }; }
 
   hb_serialize_context_t (void *start_, unsigned int size) :
     start ((char *) start_),
@@ -123,7 +136,7 @@ struct hb_serialize_context_t
 
   template <typename T1, typename T2>
   bool check_equal (T1 &&v1, T2 &&v2)
-  { return check_success (v1 == v2); }
+  { return check_success ((long long) v1 == (long long) v2); }
 
   template <typename T1, typename T2>
   bool check_assign (T1 &v1, T2 &&v2)
@@ -166,7 +179,7 @@ struct hb_serialize_context_t
     if (packed.length <= 1)
       return;
 
-    pop_pack ();
+    pop_pack (false);
 
     resolve_links ();
   }
@@ -191,11 +204,16 @@ struct hb_serialize_context_t
     object_t *obj = current;
     if (unlikely (!obj)) return;
     current = current->next;
-    revert (*obj);
+    revert (obj->head, obj->tail);
     obj->fini ();
     object_pool.free (obj);
   }
-  objidx_t pop_pack ()
+
+  /* Set share to false when an object is unlikely sharable 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.
+   */
+  objidx_t pop_pack (bool share=true)
   {
     object_t *obj = current;
     if (unlikely (!obj)) return 0;
@@ -211,11 +229,15 @@ struct hb_serialize_context_t
       return 0;
     }
 
-    objidx_t objidx = packed_map.get (obj);
-    if (objidx)
+    objidx_t objidx;
+    if (share)
     {
-      obj->fini ();
-      return objidx;
+      objidx = packed_map.get (obj);
+      if (objidx)
+      {
+       obj->fini ();
+       return objidx;
+      }
     }
 
     tail -= len;
@@ -231,17 +253,24 @@ struct hb_serialize_context_t
 
     objidx = packed.length - 1;
 
-    packed_map.set (obj, objidx);
+    if (share) packed_map.set (obj, objidx);
 
     return objidx;
   }
 
-  void revert (range_t snap)
+  void revert (snapshot_t snap)
+  {
+    assert (snap.current == current);
+    current->links.shrink (snap.num_links);
+    revert (snap.head, snap.tail);
+  }
+  void revert (char *snap_head,
+              char *snap_tail)
   {
-    assert (snap.head <= head);
-    assert (tail <= snap.tail);
-    head = snap.head;
-    tail = snap.tail;
+    assert (snap_head <= head);
+    assert (tail <= snap_tail);
+    head = snap_head;
+    tail = snap_tail;
     discard_stale_objects ();
   }
 
@@ -260,7 +289,9 @@ struct hb_serialize_context_t
   }
 
   template <typename T>
-  void add_link (T &ofs, objidx_t objidx, const void *base = nullptr)
+  void add_link (T &ofs, objidx_t objidx,
+                whence_t whence = Head,
+                unsigned bias = 0)
   {
     static_assert (sizeof (T) == 2 || sizeof (T) == 4, "");
 
@@ -270,18 +301,24 @@ struct hb_serialize_context_t
     assert (current);
     assert (current->head <= (const char *) &ofs);
 
-    if (!base)
-      base = current->head;
-    else
-      assert (current->head <= (const char *) base);
-
     auto& link = *current->links.push ();
+
     link.is_wide = sizeof (T) == 4;
+    link.is_signed = hb_is_signed (hb_unwrap_type (T));
+    link.whence = (unsigned) whence;
     link.position = (const char *) &ofs - current->head;
-    link.bias = (const char *) base - current->head;
+    link.bias = bias;
     link.objidx = objidx;
   }
 
+  unsigned to_bias (const void *base) const
+  {
+    if (!base) return 0;
+    assert (current);
+    assert (current->head <= (const char *) base);
+    return (const char *) base - current->head;
+  }
+
   void resolve_links ()
   {
     if (unlikely (in_error ())) return;
@@ -293,20 +330,29 @@ struct hb_serialize_context_t
       for (const object_t::link_t &link : parent->links)
       {
        const object_t* child = packed[link.objidx];
-       assert (link.bias <= (size_t) (parent->tail - parent->head));
-       unsigned offset = (child->head - parent->head) - link.bias;
+       if (unlikely (!child)) { err_other_error(); return; }
+       unsigned offset = 0;
+       switch ((whence_t) link.whence) {
+       case Head:     offset = child->head - parent->head; break;
+       case Tail:     offset = child->head - parent->tail; break;
+       case Absolute: offset = (head - start) + (child->head - tail); break;
+       }
 
-       if (link.is_wide)
+       assert (offset >= link.bias);
+       offset -= link.bias;
+       if (link.is_signed)
        {
-         auto &off = * ((BEInt<uint32_t, 4> *) (parent->head + link.position));
-         assert (0 == off);
-         check_assign (off, offset);
+         if (link.is_wide)
+           assign_offset<int32_t> (parent, link, offset);
+         else
+           assign_offset<int16_t> (parent, link, offset);
        }
        else
        {
-         auto &off = * ((BEInt<uint16_t, 2> *) (parent->head + link.position));
-         assert (0 == off);
-         check_assign (off, offset);
+         if (link.is_wide)
+           assign_offset<uint32_t> (parent, link, offset);
+         else
+           assign_offset<uint16_t> (parent, link, offset);
        }
       }
   }
@@ -387,6 +433,12 @@ struct hb_serialize_context_t
   Type *copy (const Type *src, Ts&&... ds)
   { return copy (*src, hb_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)...); }
+
   template <typename Type>
   hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; }
 
@@ -441,6 +493,15 @@ struct hb_serialize_context_t
                           (char *) b.arrayZ, free);
   }
 
+  private:
+  template <typename 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));
+    assert (0 == off);
+    check_assign (off, offset);
+  }
+
   public: /* TODO Make private. */
   char *start, *head, *tail, *end;
   unsigned int debug_depth;
index 10638a7..0551ed8 100644 (file)
@@ -69,7 +69,7 @@ hb_set_create ()
 hb_set_t *
 hb_set_get_empty ()
 {
-  return const_cast<hb_set_t *> (&Null(hb_set_t));
+  return const_cast<hb_set_t *> (&Null (hb_set_t));
 }
 
 /**
@@ -145,9 +145,9 @@ hb_set_get_user_data (hb_set_t           *set,
  * hb_set_allocation_successful:
  * @set: a set.
  *
- * 
  *
- * Return value: 
+ *
+ * Return value:
  *
  * Since: 0.9.2
  **/
@@ -161,7 +161,7 @@ hb_set_allocation_successful (const hb_set_t  *set)
  * hb_set_clear:
  * @set: a set.
  *
- * 
+ *
  *
  * Since: 0.9.2
  **/
@@ -175,9 +175,9 @@ hb_set_clear (hb_set_t *set)
  * hb_set_is_empty:
  * @set: a set.
  *
- * 
  *
- * Return value: 
+ *
+ * Return value:
  *
  * Since: 0.9.7
  **/
@@ -190,11 +190,11 @@ hb_set_is_empty (const hb_set_t *set)
 /**
  * hb_set_has:
  * @set: a set.
- * @codepoint: 
+ * @codepoint:
  *
- * 
  *
- * Return value: 
+ *
+ * Return value:
  *
  * Since: 0.9.2
  **/
@@ -208,9 +208,9 @@ hb_set_has (const hb_set_t *set,
 /**
  * hb_set_add:
  * @set: a set.
- * @codepoint: 
+ * @codepoint:
+ *
  *
- * 
  *
  * Since: 0.9.2
  **/
@@ -224,10 +224,10 @@ hb_set_add (hb_set_t       *set,
 /**
  * hb_set_add_range:
  * @set: a set.
- * @first: 
- * @last: 
+ * @first:
+ * @last:
+ *
  *
- * 
  *
  * Since: 0.9.7
  **/
@@ -242,9 +242,9 @@ hb_set_add_range (hb_set_t       *set,
 /**
  * hb_set_del:
  * @set: a set.
- * @codepoint: 
+ * @codepoint:
+ *
  *
- * 
  *
  * Since: 0.9.2
  **/
@@ -258,10 +258,10 @@ hb_set_del (hb_set_t       *set,
 /**
  * hb_set_del_range:
  * @set: a set.
- * @first: 
- * @last: 
+ * @first:
+ * @last:
+ *
  *
- * 
  *
  * Since: 0.9.7
  **/
@@ -278,7 +278,7 @@ hb_set_del_range (hb_set_t       *set,
  * @set: a set.
  * @other: other set.
  *
- * 
+ *
  *
  * Return value: %TRUE if the two sets are equal, %FALSE otherwise.
  *
@@ -312,9 +312,9 @@ hb_set_is_subset (const hb_set_t *set,
 /**
  * hb_set_set:
  * @set: a set.
- * @other: 
+ * @other:
+ *
  *
- * 
  *
  * Since: 0.9.2
  **/
@@ -328,9 +328,9 @@ hb_set_set (hb_set_t       *set,
 /**
  * hb_set_union:
  * @set: a set.
- * @other: 
+ * @other:
+ *
  *
- * 
  *
  * Since: 0.9.2
  **/
@@ -344,9 +344,9 @@ hb_set_union (hb_set_t       *set,
 /**
  * hb_set_intersect:
  * @set: a set.
- * @other: 
+ * @other:
+ *
  *
- * 
  *
  * Since: 0.9.2
  **/
@@ -360,9 +360,9 @@ hb_set_intersect (hb_set_t       *set,
 /**
  * hb_set_subtract:
  * @set: a set.
- * @other: 
+ * @other:
+ *
  *
- * 
  *
  * Since: 0.9.2
  **/
@@ -376,9 +376,9 @@ hb_set_subtract (hb_set_t       *set,
 /**
  * hb_set_symmetric_difference:
  * @set: a set.
- * @other: 
+ * @other:
+ *
  *
- * 
  *
  * Since: 0.9.2
  **/
@@ -394,7 +394,7 @@ hb_set_symmetric_difference (hb_set_t       *set,
  * hb_set_invert:
  * @set: a set.
  *
- * 
+ *
  *
  * Since: 0.9.10
  *
index 36d11c0..b6e2086 100644 (file)
@@ -89,6 +89,23 @@ struct hb_set_t
       }
     }
 
+    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));
@@ -135,7 +152,11 @@ struct hb_set_t
       unsigned int i = m / ELT_BITS;
       unsigned int j = m & ELT_MASK;
 
-      const elt_t vv = v[i] & ((elt_t (1) << (j + 1)) - 1);
+      /* 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)
       {
@@ -258,7 +279,7 @@ struct hb_set_t
     return true;
   }
 
-  void dirty () { population = (unsigned int) -1; }
+  void dirty () { population = UINT_MAX; }
 
   void add (hb_codepoint_t g)
   {
@@ -362,14 +383,56 @@ struct hb_set_t
     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);
+    }
+  }
+
+  public:
   void del_range (hb_codepoint_t a, hb_codepoint_t b)
   {
     /* TODO perform op even if !successful. */
-    /* TODO Optimize, like add_range(). */
     if (unlikely (!successful)) return;
-    for (unsigned int i = a; i < b + 1; i++)
-      del (i);
+    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);
   }
+
   bool get (hb_codepoint_t g) const
   {
     const page_t *page = page_for (g);
@@ -387,7 +450,10 @@ struct hb_set_t
   bool operator () (hb_codepoint_t k) const { return has (k); }
 
   /* Sink interface. */
-  hb_set_t& operator << (hb_codepoint_t v) { add (v); return *this; }
+  hb_set_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)
+  { add_range (range.first, range.second); return *this; }
 
   bool intersects (hb_codepoint_t first, hb_codepoint_t last) const
   {
@@ -446,6 +512,34 @@ struct hb_set_t
     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)
   {
@@ -459,10 +553,22 @@ struct hb_set_t
 
     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++;
@@ -485,9 +591,16 @@ struct hb_set_t
     if (Op::passthru_right)
       count += nb - b;
 
-    if (count > pages.length)
-      if (!resize (count))
-       return;
+    if (!Op::passthru_left)
+    {
+      na  = write_index;
+      next_page = write_index;
+      compact (write_index);
+    }
+
+    if (!resize (count))
+      return;
+
     newCount = count;
 
     /* Process in-place backward. */
@@ -662,7 +775,7 @@ struct hb_set_t
 
   unsigned int get_population () const
   {
-    if (population != (unsigned int) -1)
+    if (population != UINT_MAX)
       return population;
 
     unsigned int pop = 0;
@@ -698,8 +811,15 @@ struct hb_set_t
   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)) :
-      s (&s_), v (INVALID), l (s->get_population () + 1) { __next__ (); }
+    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; }
@@ -707,7 +827,7 @@ struct hb_set_t
     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); }
+    iter_t end () const { return iter_t (*s, false); }
     bool operator != (const iter_t& o) const
     { return s != o.s || v != o.v; }
 
index ffd723d..666470b 100644 (file)
@@ -257,7 +257,7 @@ bail:
 hb_shape_plan_t *
 hb_shape_plan_get_empty ()
 {
-  return const_cast<hb_shape_plan_t *> (&Null(hb_shape_plan_t));
+  return const_cast<hb_shape_plan_t *> (&Null (hb_shape_plan_t));
 }
 
 /**
index 79dc5d0..b4138a3 100644 (file)
@@ -102,7 +102,7 @@ template <enum hb_shaper_order_t order, typename Object> struct hb_shaper_object
          static void destroy (Type *p) { HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (p); } \
        }; \
        \
-       static_assert (true, "") /* Require semicolon. */
+       static_assert (true, "") /* Require semicolon after. */
 
 
 template <typename Object>
index 08a2f21..f5b7fa5 100644 (file)
@@ -51,6 +51,9 @@ DEFINE_NULL_NAMESPACE_BYTES (AAT, SettingName) = {0xFF,0xFF, 0xFF,0xFF};
 const unsigned char _hb_Null_AAT_Lookup[2] = {0xFF, 0xFF};
 
 
+
+/* hb_face_t */
+
 unsigned int
 hb_face_t::load_num_glyphs () const
 {
@@ -73,4 +76,37 @@ hb_face_t::load_upem () const
   return ret;
 }
 
+
+/* hb_user_data_array_t */
+
+bool
+hb_user_data_array_t::set (hb_user_data_key_t *key,
+                          void *              data,
+                          hb_destroy_func_t   destroy,
+                          hb_bool_t           replace)
+{
+  if (!key)
+    return false;
+
+  if (replace) {
+    if (!data && !destroy) {
+      items.remove (key, lock);
+      return true;
+    }
+  }
+  hb_user_data_item_t item = {key, data, destroy};
+  bool ret = !!items.replace_or_insert (item, lock, (bool) replace);
+
+  return ret;
+}
+
+void *
+hb_user_data_array_t::get (hb_user_data_key_t *key)
+{
+  hb_user_data_item_t item = {nullptr, nullptr, nullptr};
+
+  return items.find (key, &item, lock) ? item.data : nullptr;
+}
+
+
 #endif
index 1c67ab4..e7ac119 100644 (file)
@@ -37,6 +37,7 @@
 #define HB_STRING_ARRAY_TYPE_NAME      HB_PASTE(HB_STRING_ARRAY_NAME, _msgstr_t)
 #define HB_STRING_ARRAY_POOL_NAME      HB_PASTE(HB_STRING_ARRAY_NAME, _msgstr)
 #define HB_STRING_ARRAY_OFFS_NAME      HB_PASTE(HB_STRING_ARRAY_NAME, _msgidx)
+#define HB_STRING_ARRAY_LENG_NAME      HB_PASTE(HB_STRING_ARRAY_NAME, _length)
 
 static const union HB_STRING_ARRAY_TYPE_NAME {
   struct {
@@ -66,6 +67,8 @@ static const unsigned int HB_STRING_ARRAY_OFFS_NAME[] =
   sizeof (HB_STRING_ARRAY_TYPE_NAME)
 };
 
+static const unsigned int HB_STRING_ARRAY_LENG_NAME = ARRAY_LENGTH_CONST (HB_STRING_ARRAY_OFFS_NAME) - 1;
+
 static inline hb_bytes_t
 HB_STRING_ARRAY_NAME (unsigned int i)
 {
@@ -77,5 +80,6 @@ HB_STRING_ARRAY_NAME (unsigned int i)
 #undef HB_STRING_ARRAY_TYPE_NAME
 #undef HB_STRING_ARRAY_POOL_NAME
 #undef HB_STRING_ARRAY_OFFS_NAME
+#undef HB_STRING_ARRAY_LENG_NAME
 
 #endif /* HB_STRING_ARRAY_HH */
index c9a880a..04e1db2 100644 (file)
@@ -108,7 +108,7 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan,
        fdmap.add (fd);
       hb_set_destroy (set);
       if (unlikely (fdmap.get_population () != subset_fd_count))
-       return false;
+       return false;
     }
 
     /* update each font dict index stored as "code" in fdselect_ranges */
@@ -158,7 +158,7 @@ serialize_fdselect_3_4 (hb_serialize_context_t *c,
 {
   TRACE_SERIALIZE (this);
   FDSELECT3_4 *p = c->allocate_size<FDSELECT3_4> (size);
-  if (unlikely (p == nullptr)) return_trace (false);
+  if (unlikely (!p)) return_trace (false);
   p->nRanges () = fdselect_ranges.length;
   for (unsigned int i = 0; i < fdselect_ranges.length; i++)
   {
@@ -184,7 +184,7 @@ hb_serialize_cff_fdselect (hb_serialize_context_t *c,
 {
   TRACE_SERIALIZE (this);
   FDSelect *p = c->allocate_min<FDSelect> ();
-  if (unlikely (p == nullptr)) return_trace (false);
+  if (unlikely (!p)) return_trace (false);
   p->format = fdselect_format;
   size -= FDSelect::min_size;
 
@@ -194,7 +194,7 @@ hb_serialize_cff_fdselect (hb_serialize_context_t *c,
   case 0:
   {
     FDSelect0 *p = c->allocate_size<FDSelect0> (size);
-    if (unlikely (p == nullptr)) return_trace (false);
+    if (unlikely (!p)) return_trace (false);
     unsigned int range_index = 0;
     unsigned int fd = fdselect_ranges[range_index++].code;
     for (unsigned int i = 0; i < num_glyphs; i++)
index 3c66119..3400892 100644 (file)
@@ -44,7 +44,7 @@ struct str_encoder_t
 
   void encode_byte (unsigned char b)
   {
-    if (unlikely (buff.push (b) == &Crap(unsigned char)))
+    if (unlikely (buff.push (b) == &Crap (unsigned char)))
       set_error ();
   }
 
@@ -128,26 +128,17 @@ struct str_encoder_t
   bool    error;
 };
 
-struct cff_sub_table_offsets_t {
-  cff_sub_table_offsets_t () : privateDictsOffset (0)
+struct cff_sub_table_info_t {
+  cff_sub_table_info_t ()
+    : fd_array_link (0),
+      char_strings_link (0)
   {
-    topDictInfo.init ();
-    FDSelectInfo.init ();
-    FDArrayInfo.init ();
-    charStringsInfo.init ();
-    globalSubrsInfo.init ();
-    localSubrsInfos.init ();
+    fd_select.init ();
   }
 
-  ~cff_sub_table_offsets_t () { localSubrsInfos.fini (); }
-
-  table_info_t     topDictInfo;
-  table_info_t     FDSelectInfo;
-  table_info_t     FDArrayInfo;
-  table_info_t     charStringsInfo;
-  unsigned int  privateDictsOffset;
-  table_info_t     globalSubrsInfo;
-  hb_vector_t<table_info_t>  localSubrsInfos;
+  table_info_t     fd_select;
+  objidx_t                fd_array_link;
+  objidx_t                char_strings_link;
 };
 
 template <typename OPSTR=op_str_t>
@@ -155,40 +146,26 @@ struct cff_top_dict_op_serializer_t : op_serializer_t
 {
   bool serialize (hb_serialize_context_t *c,
                  const OPSTR &opstr,
-                 const cff_sub_table_offsets_t &offsets) const
+                 const cff_sub_table_info_t &info) const
   {
     TRACE_SERIALIZE (this);
 
     switch (opstr.op)
     {
       case OpCode_CharStrings:
-       return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.charStringsInfo.offset));
+       return_trace (FontDict::serialize_link4_op(c, opstr.op, info.char_strings_link, whence_t::Absolute));
 
       case OpCode_FDArray:
-       return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.FDArrayInfo.offset));
+       return_trace (FontDict::serialize_link4_op(c, opstr.op, info.fd_array_link, whence_t::Absolute));
 
       case OpCode_FDSelect:
-       return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.FDSelectInfo.offset));
+       return_trace (FontDict::serialize_link4_op(c, opstr.op, info.fd_select.link, whence_t::Absolute));
 
       default:
        return_trace (copy_opstr (c, opstr));
     }
     return_trace (true);
   }
-
-  unsigned int calculate_serialized_size (const OPSTR &opstr) const
-  {
-    switch (opstr.op)
-    {
-      case OpCode_CharStrings:
-      case OpCode_FDArray:
-      case OpCode_FDSelect:
-       return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op);
-
-      default:
-       return opstr.str.length;
-    }
-  }
 };
 
 struct cff_font_dict_op_serializer_t : op_serializer_t
@@ -202,33 +179,17 @@ struct cff_font_dict_op_serializer_t : op_serializer_t
     if (opstr.op == OpCode_Private)
     {
       /* serialize the private dict size & offset as 2-byte & 4-byte integers */
-      if (unlikely (!UnsizedByteStr::serialize_int2 (c, privateDictInfo.size) ||
-                   !UnsizedByteStr::serialize_int4 (c, privateDictInfo.offset)))
-       return_trace (false);
-
-      /* serialize the opcode */
-      HBUINT8 *p = c->allocate_size<HBUINT8> (1);
-      if (unlikely (p == nullptr)) return_trace (false);
-      *p = OpCode_Private;
-
-      return_trace (true);
+      return_trace (UnsizedByteStr::serialize_int2 (c, privateDictInfo.size) &&
+                   Dict::serialize_link4_op (c, opstr.op, privateDictInfo.link, whence_t::Absolute));
     }
     else
     {
       HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length);
-      if (unlikely (d == nullptr)) return_trace (false);
+      if (unlikely (!d)) return_trace (false);
       memcpy (d, &opstr.str[0], opstr.str.length);
     }
     return_trace (true);
   }
-
-  unsigned int calculate_serialized_size (const op_str_t &opstr) const
-  {
-    if (opstr.op == OpCode_Private)
-      return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Private);
-    else
-      return opstr.str.length;
-  }
 };
 
 struct cff_private_dict_op_serializer_t : op_serializer_t
@@ -238,7 +199,7 @@ struct cff_private_dict_op_serializer_t : op_serializer_t
 
   bool serialize (hb_serialize_context_t *c,
                  const op_str_t &opstr,
-                 const unsigned int subrsOffset) const
+                 objidx_t subrs_link) const
   {
     TRACE_SERIALIZE (this);
 
@@ -246,31 +207,15 @@ struct cff_private_dict_op_serializer_t : op_serializer_t
       return true;
     if (opstr.op == OpCode_Subrs)
     {
-      if (desubroutinize || (subrsOffset == 0))
+      if (desubroutinize || !subrs_link)
        return_trace (true);
       else
-       return_trace (FontDict::serialize_offset2_op (c, opstr.op, subrsOffset));
+       return_trace (FontDict::serialize_link2_op (c, opstr.op, subrs_link));
     }
     else
       return_trace (copy_opstr (c, opstr));
   }
 
-  unsigned int calculate_serialized_size (const op_str_t &opstr,
-                                         bool has_localsubr=true) const
-  {
-    if (drop_hints && dict_opset_t::is_hint_op (opstr.op))
-      return 0;
-    if (opstr.op == OpCode_Subrs)
-    {
-      if (desubroutinize || !has_localsubr)
-       return 0;
-      else
-       return OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (opstr.op);
-    }
-    else
-      return opstr.str.length;
-  }
-
   protected:
   const bool  desubroutinize;
   const bool  drop_hints;
@@ -300,14 +245,14 @@ struct subr_flattener_t
       hb_codepoint_t  glyph;
       if (!plan->old_gid_for_new_gid (i, &glyph))
       {
-       /* add an endchar only charstring for a missing glyph if CFF1 */
-       if (endchar_op != OpCode_Invalid) flat_charstrings[i].push (endchar_op);
-       continue;
+       /* add an endchar only charstring for a missing glyph if CFF1 */
+       if (endchar_op != OpCode_Invalid) flat_charstrings[i].push (endchar_op);
+       continue;
       }
       const byte_str_t str = (*acc.charStrings)[glyph];
       unsigned int fd = acc.fdSelect->get_fd (glyph);
       if (unlikely (fd >= acc.fdCount))
-       return false;
+       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 };
@@ -456,7 +401,7 @@ struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t>
   bool    vsindex_dropped;
   bool    has_prefix_;
   op_code_t    prefix_op_;
-  number_t     prefix_num_;
+  number_t     prefix_num_;
 
   private:
   typedef parsed_values_t<parsed_cs_op_t> SUPER;
@@ -516,19 +461,19 @@ struct subr_subset_param_t
   template <typename ENV>
   void set_current_str (ENV &env, bool calling)
   {
-    parsed_cs_str_t  *parsed_str = get_parsed_str_for_context (env.context);
-    if (likely (parsed_str != nullptr))
+    parsed_cs_str_t *parsed_str = get_parsed_str_for_context (env.context);
+    if (unlikely (!parsed_str))
     {
-      /* If the called subroutine is parsed partially but not completely yet,
-       * it must be because we are calling it recursively.
-       * Handle it as an error. */
-      if (unlikely (calling && !parsed_str->is_parsed () && (parsed_str->values.length > 0)))
-       env.set_error ();
-      else
-       current_parsed_str = parsed_str;
+      env.set_error ();
+      return;
     }
-    else
+    /* If the called subroutine is parsed partially but not completely yet,
+     * it must be because we are calling it recursively.
+     * Handle it as an error. */
+    if (unlikely (calling && !parsed_str->is_parsed () && (parsed_str->values.length > 0)))
       env.set_error ();
+    else
+      current_parsed_str = parsed_str;
   }
 
   parsed_cs_str_t      *current_parsed_str;
@@ -659,11 +604,11 @@ struct subr_subsetter_t
     {
       hb_codepoint_t  glyph;
       if (!plan->old_gid_for_new_gid (i, &glyph))
-       continue;
+       continue;
       const byte_str_t str = (*acc.charStrings)[glyph];
       unsigned int fd = acc.fdSelect->get_fd (glyph);
       if (unlikely (fd >= acc.fdCount))
-       return false;
+       return false;
 
       cs_interpreter_t<ENV, OPSET, subr_subset_param_t> interp;
       interp.env.init (str, acc, fd);
@@ -677,8 +622,8 @@ struct subr_subsetter_t
       if (unlikely (!interp.interpret (param)))
        return false;
 
-      /* finalize parsed string esp. copy CFF1 width or CFF2 vsindex to the parsed charstring for encoding */
-      SUBSETTER::finalize_parsed_str (interp.env, param, parsed_charstrings[i]);
+      /* complete parsed string esp. copy CFF1 width or CFF2 vsindex to the parsed charstring for encoding */
+      SUBSETTER::complete_parsed_str (interp.env, param, parsed_charstrings[i]);
     }
 
     if (plan->drop_hints)
@@ -740,13 +685,13 @@ struct subr_subsetter_t
       hb_codepoint_t  glyph;
       if (!plan->old_gid_for_new_gid (i, &glyph))
       {
-       /* add an endchar only charstring for a missing glyph if CFF1 */
-       if (endchar_op != OpCode_Invalid) buffArray[i].push (endchar_op);
-       continue;
+       /* add an endchar only charstring for a missing glyph if CFF1 */
+       if (endchar_op != OpCode_Invalid) buffArray[i].push (endchar_op);
+       continue;
       }
       unsigned int  fd = acc.fdSelect->get_fd (glyph);
       if (unlikely (fd >= acc.fdCount))
-       return false;
+       return false;
       if (unlikely (!encode_str (parsed_charstrings[i], fd, buffArray[i])))
        return false;
     }
@@ -900,11 +845,11 @@ struct subr_subsetter_t
     {
       parsed_cs_op_t  &csop = str.values[pos];
       if (csop.op == OpCode_return)
-       break;
+       break;
       if (!csop.for_drop ())
       {
-       drop.all_dropped = false;
-       break;
+       drop.all_dropped = false;
+       break;
       }
     }
 
@@ -986,7 +931,7 @@ struct subr_subsetter_t
   }
 
   protected:
-  const ACC                    &acc;
+  const ACC                    &acc;
   const hb_subset_plan_t       *plan;
 
   subr_closures_t              closures;
index e9e0757..f3ed518 100644 (file)
@@ -64,29 +64,25 @@ struct remap_sid_t : hb_inc_bimap_t
   static unsigned int unoffset_sid (unsigned int sid) { return sid - num_std_strings; }
 };
 
-struct cff1_sub_table_offsets_t : cff_sub_table_offsets_t
+struct cff1_sub_table_info_t : cff_sub_table_info_t
 {
-  cff1_sub_table_offsets_t ()
-    : cff_sub_table_offsets_t (),
-      nameIndexOffset (0),
-      encodingOffset (0)
-  {
-    stringIndexInfo.init ();
-    charsetInfo.init ();
+  cff1_sub_table_info_t ()
+    : cff_sub_table_info_t (),
+      encoding_link (0),
+      charset_link (0)
+   {
     privateDictInfo.init ();
   }
 
-  unsigned int  nameIndexOffset;
-  table_info_t stringIndexInfo;
-  unsigned int  encodingOffset;
-  table_info_t charsetInfo;
+  objidx_t     encoding_link;
+  objidx_t     charset_link;
   table_info_t privateDictInfo;
 };
 
 /* a copy of a parsed out cff1_top_dict_values_t augmented with additional operators */
 struct cff1_top_dict_values_mod_t : cff1_top_dict_values_t
 {
-  void init (const cff1_top_dict_values_t *base_= &Null(cff1_top_dict_values_t))
+  void init (const cff1_top_dict_values_t *base_= &Null (cff1_top_dict_values_t))
   {
     SUPER::init ();
     base = base_;
@@ -117,13 +113,13 @@ 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_offsets_t &offsets_,
+  top_dict_modifiers_t (const cff1_sub_table_info_t &info_,
                           const unsigned int (&nameSIDs_)[name_dict_values_t::ValCount])
-    : offsets (offsets_),
+    : info (info_),
       nameSIDs (nameSIDs_)
   {}
 
-  const cff1_sub_table_offsets_t &offsets;
+  const cff1_sub_table_info_t &info;
   const unsigned int   (&nameSIDs)[name_dict_values_t::ValCount];
 };
 
@@ -139,22 +135,20 @@ struct cff1_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<cff1_top_dic
     switch (op)
     {
       case OpCode_charset:
-       return_trace (FontDict::serialize_offset4_op(c, op, mod.offsets.charsetInfo.offset));
+       if (mod.info.charset_link)
+         return_trace (FontDict::serialize_link4_op(c, op, mod.info.charset_link, whence_t::Absolute));
+       else
+         goto fall_back;
 
       case OpCode_Encoding:
-       return_trace (FontDict::serialize_offset4_op(c, op, mod.offsets.encodingOffset));
+       if (mod.info.encoding_link)
+         return_trace (FontDict::serialize_link4_op(c, op, mod.info.encoding_link, whence_t::Absolute));
+       else
+         goto fall_back;
 
       case OpCode_Private:
-       {
-         if (unlikely (!UnsizedByteStr::serialize_int2 (c, mod.offsets.privateDictInfo.size)))
-           return_trace (false);
-         if (unlikely (!UnsizedByteStr::serialize_int4 (c, mod.offsets.privateDictInfo.offset)))
-           return_trace (false);
-         HBUINT8 *p = c->allocate_size<HBUINT8> (1);
-         if (unlikely (p == nullptr)) return_trace (false);
-         *p = OpCode_Private;
-       }
-       break;
+       return_trace (UnsizedByteStr::serialize_int2 (c, mod.info.privateDictInfo.size) &&
+                     Dict::serialize_link4_op (c, op, mod.info.privateDictInfo.link, whence_t::Absolute));
 
       case OpCode_version:
       case OpCode_Notice:
@@ -165,7 +159,7 @@ struct cff1_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<cff1_top_dic
       case OpCode_PostScript:
       case OpCode_BaseFontName:
       case OpCode_FontName:
-       return_trace (FontDict::serialize_offset2_op(c, op, mod.nameSIDs[name_dict_values_t::name_op_to_index (op)]));
+       return_trace (FontDict::serialize_int2_op (c, op, mod.nameSIDs[name_dict_values_t::name_op_to_index (op)]));
 
       case OpCode_ROS:
        {
@@ -180,86 +174,29 @@ struct cff1_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<cff1_top_dic
                        UnsizedByteStr::serialize_int2 (c, mod.nameSIDs[name_dict_values_t::ordering]) &&
                        copy_opstr (c, supp_op));
        }
+      fall_back:
       default:
-       return_trace (cff_top_dict_op_serializer_t<cff1_top_dict_val_t>::serialize (c, opstr, mod.offsets));
+       return_trace (cff_top_dict_op_serializer_t<cff1_top_dict_val_t>::serialize (c, opstr, mod.info));
     }
     return_trace (true);
   }
 
-  unsigned int calculate_serialized_size (const cff1_top_dict_val_t &opstr) const
-  {
-    op_code_t op = opstr.op;
-    switch (op)
-    {
-      case OpCode_charset:
-      case OpCode_Encoding:
-       return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (op);
-
-      case OpCode_Private:
-       return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Private);
-
-      case OpCode_version:
-      case OpCode_Notice:
-      case OpCode_Copyright:
-      case OpCode_FullName:
-      case OpCode_FamilyName:
-      case OpCode_Weight:
-      case OpCode_PostScript:
-      case OpCode_BaseFontName:
-      case OpCode_FontName:
-       return OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (op);
-
-      case OpCode_ROS:
-       return ((OpCode_Size (OpCode_shortint) + 2) * 2) + (opstr.str.length - opstr.last_arg_offset)/* supplement + op */;
-
-      default:
-       return cff_top_dict_op_serializer_t<cff1_top_dict_val_t>::calculate_serialized_size (opstr);
-    }
-  }
-};
-
-struct font_dict_values_mod_t
-{
-  void init (const cff1_font_dict_values_t *base_,
-            unsigned int fontName_,
-            const table_info_t &privateDictInfo_)
-  {
-    base = base_;
-    fontName = fontName_;
-    privateDictInfo = privateDictInfo_;
-  }
-
-  unsigned get_count () const { return base->get_count (); }
-
-  const op_str_t &operator [] (unsigned int i) const { return (*base)[i]; }
-
-  const cff1_font_dict_values_t    *base;
-  table_info_t            privateDictInfo;
-  unsigned int         fontName;
 };
 
 struct cff1_font_dict_op_serializer_t : cff_font_dict_op_serializer_t
 {
   bool serialize (hb_serialize_context_t *c,
                  const op_str_t &opstr,
-                 const font_dict_values_mod_t &mod) const
+                 const cff1_font_dict_values_mod_t &mod) const
   {
     TRACE_SERIALIZE (this);
 
     if (opstr.op == OpCode_FontName)
-      return_trace (FontDict::serialize_uint2_op (c, opstr.op, mod.fontName));
+      return_trace (FontDict::serialize_int2_op (c, opstr.op, mod.fontName));
     else
       return_trace (SUPER::serialize (c, opstr, mod.privateDictInfo));
   }
 
-  unsigned int calculate_serialized_size (const op_str_t &opstr) const
-  {
-    if (opstr.op == OpCode_FontName)
-      return OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_FontName);
-    else
-      return SUPER::calculate_serialized_size (opstr);
-  }
-
   private:
   typedef cff_font_dict_op_serializer_t SUPER;
 };
@@ -331,7 +268,7 @@ struct cff1_cs_opset_flatten_t : cff1_cs_opset_t<cff1_cs_opset_flatten_t, flatte
 struct range_list_t : hb_vector_t<code_pair_t>
 {
   /* replace the first glyph ID in the "glyph" field each range with a nLeft value */
-  bool finalize (unsigned int last_glyph)
+  bool complete (unsigned int last_glyph)
   {
     bool  two_byte = false;
     for (unsigned int i = (*this).length; i > 0; i--)
@@ -402,7 +339,7 @@ struct cff1_subr_subsetter_t : subr_subsetter_t<cff1_subr_subsetter_t, CFF1Subrs
   cff1_subr_subsetter_t (const OT::cff1::accelerator_subset_t &acc_, const hb_subset_plan_t *plan_)
     : subr_subsetter_t (acc_, plan_) {}
 
-  static void finalize_parsed_str (cff1_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring)
+  static void complete_parsed_str (cff1_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring)
   {
     /* insert width at the beginning of the charstring as necessary */
     if (env.has_width)
@@ -414,8 +351,8 @@ struct cff1_subr_subsetter_t : subr_subsetter_t<cff1_subr_subsetter_t, CFF1Subrs
     param.current_parsed_str->set_parsed ();
     for (unsigned int i = 0; i < env.callStack.get_count (); i++)
     {
-      parsed_cs_str_t  *parsed_str = param.get_parsed_str_for_context (env.callStack[i]);
-      if (likely (parsed_str != nullptr))
+      parsed_cs_str_t *parsed_str = param.get_parsed_str_for_context (env.callStack[i]);
+      if (likely (parsed_str))
        parsed_str->set_parsed ();
       else
        env.set_error ();
@@ -425,16 +362,13 @@ struct cff1_subr_subsetter_t : subr_subsetter_t<cff1_subr_subsetter_t, CFF1Subrs
 
 struct cff_subset_plan {
   cff_subset_plan ()
-    : final_size (0),
-      offsets (),
+    : info (),
       orig_fdcount (0),
       subset_fdcount (1),
       subset_fdselect_format (0),
       drop_hints (false),
       desubroutinize(false)
   {
-    topdict_sizes.init ();
-    topdict_sizes.resize (1);
     topdict_mod.init ();
     subset_fdselect_ranges.init ();
     fdmap.init ();
@@ -452,7 +386,6 @@ struct cff_subset_plan {
 
   ~cff_subset_plan ()
   {
-    topdict_sizes.fini ();
     topdict_mod.fini ();
     subset_fdselect_ranges.fini ();
     fdmap.fini ();
@@ -466,7 +399,7 @@ struct cff_subset_plan {
     sidmap.fini ();
   }
 
-  unsigned int plan_subset_encoding (const OT::cff1::accelerator_subset_t &acc, hb_subset_plan_t *plan)
+  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;
@@ -484,7 +417,7 @@ struct cff_subset_plan {
       hb_codepoint_t  old_glyph;
       if (!plan->old_gid_for_new_gid (glyph, &old_glyph))
       {
-       /* Retain the code for the old missing glyph ID */
+       /* Retain the code for the old missing glyph ID */
        old_glyph = glyph;
       }
       code = acc.glyph_to_code (old_glyph);
@@ -501,7 +434,7 @@ struct cff_subset_plan {
       }
       last_code = code;
 
-      if (encoding != &Null(Encoding))
+      if (encoding != &Null (Encoding))
       {
        hb_codepoint_t  sid = acc.glyph_to_sid (old_glyph);
        encoding->get_supplement_codes (sid, supp_codes);
@@ -515,7 +448,7 @@ struct cff_subset_plan {
     }
     supp_codes.fini ();
 
-    subset_enc_code_ranges.finalize (glyph);
+    subset_enc_code_ranges.complete (glyph);
 
     assert (subset_enc_num_codes <= 0xFF);
     size0 = Encoding0::min_size + HBUINT8::static_size * subset_enc_num_codes;
@@ -525,14 +458,9 @@ struct cff_subset_plan {
       subset_enc_format = 0;
     else
       subset_enc_format = 1;
-
-    return Encoding::calculate_serialized_size (
-                       subset_enc_format,
-                       subset_enc_format? subset_enc_code_ranges.length: subset_enc_num_codes,
-                       subset_enc_supp_codes.length);
   }
 
-  unsigned int plan_subset_charset (const OT::cff1::accelerator_subset_t &acc, hb_subset_plan_t *plan)
+  void plan_subset_charset (const OT::cff1::accelerator_subset_t &acc, hb_subset_plan_t *plan)
   {
     unsigned int  size0, size_ranges;
     hb_codepoint_t  sid, last_sid = CFF_UNDEF_CODE;
@@ -544,7 +472,7 @@ struct cff_subset_plan {
       hb_codepoint_t  old_glyph;
       if (!plan->old_gid_for_new_gid (glyph, &old_glyph))
       {
-       /* Retain the SID for the old missing glyph ID */
+       /* Retain the SID for the old missing glyph ID */
        old_glyph = glyph;
       }
       sid = acc.glyph_to_sid (old_glyph);
@@ -560,7 +488,7 @@ struct cff_subset_plan {
       last_sid = sid;
     }
 
-    bool two_byte = subset_charset_ranges.finalize (glyph);
+    bool two_byte = subset_charset_ranges.complete (glyph);
 
     size0 = Charset0::min_size + HBUINT16::static_size * (plan->num_output_glyphs () - 1);
     if (!two_byte)
@@ -574,10 +502,6 @@ struct cff_subset_plan {
       subset_charset_format = 1;
     else
       subset_charset_format = 2;
-
-    return Charset::calculate_serialized_size (
-                       subset_charset_format,
-                       subset_charset_format? subset_charset_ranges.length: plan->num_output_glyphs ());
   }
 
   bool collect_sids_in_dicts (const OT::cff1::accelerator_subset_t &acc)
@@ -594,7 +518,7 @@ struct cff_subset_plan {
       }
     }
 
-    if (acc.fdArray != &Null(CFF1FDArray))
+    if (acc.fdArray != &Null (CFF1FDArray))
       for (unsigned int i = 0; i < orig_fdcount; i++)
        if (fdmap.has (i))
          (void)sidmap.add (acc.fontDicts[i].fontName);
@@ -609,7 +533,6 @@ struct cff_subset_plan {
     hb_codepoint_t old_glyph;
     if (!plan->old_gid_for_new_gid (0, &old_glyph) || (old_glyph != 0)) return false;
 
-    final_size = 0;
     num_glyphs = plan->num_output_glyphs ();
     orig_fdcount = acc.fdCount;
     drop_hints = plan->drop_hints;
@@ -620,7 +543,7 @@ struct cff_subset_plan {
     for (hb_codepoint_t new_glyph = 0; new_glyph < plan->num_output_glyphs (); new_glyph++)
     {
       if (!plan->old_gid_for_new_gid(new_glyph, &old_glyph))
-       continue;
+       continue;
       if (new_glyph != old_glyph) {
        gid_renum = true;
        break;
@@ -630,13 +553,6 @@ struct cff_subset_plan {
     subset_charset = gid_renum || !acc.is_predef_charset ();
     subset_encoding = !acc.is_CID() && !acc.is_predef_encoding ();
 
-    /* CFF header */
-    final_size += OT::cff1::static_size;
-
-    /* Name INDEX */
-    offsets.nameIndexOffset = final_size;
-    final_size += acc.nameIndex->get_size ();
-
     /* top dict INDEX */
     {
       /* Add encoding/charset to a (copy of) top dict as necessary */
@@ -650,25 +566,16 @@ struct cff_subset_plan {
        if (need_to_add_set)
          topdict_mod.add_op (OpCode_charset);
       }
-      offsets.topDictInfo.offset = final_size;
-      cff1_top_dict_op_serializer_t topSzr;
-      unsigned int topDictSize = TopDict::calculate_serialized_size (topdict_mod, topSzr);
-      offsets.topDictInfo.offSize = calcOffSize(topDictSize);
-      if (unlikely (offsets.topDictInfo.offSize > 4))
-       return false;
-      final_size += CFF1IndexOf<TopDict>::calculate_serialized_size<cff1_top_dict_values_mod_t>
-                                               (offsets.topDictInfo.offSize,
-                                                &topdict_mod, 1, topdict_sizes, topSzr);
     }
 
     /* Determine re-mapping of font index as fdmap among other info */
-    if (acc.fdSelect != &Null(CFF1FDSelect))
+    if (acc.fdSelect != &Null (CFF1FDSelect))
     {
        if (unlikely (!hb_plan_subset_cff_fdselect (plan,
                                  orig_fdcount,
                                  *acc.fdSelect,
                                  subset_fdcount,
-                                 offsets.FDSelectInfo.size,
+                                 info.fd_select.size,
                                  subset_fdselect_format,
                                  subset_fdselect_ranges,
                                  fdmap)))
@@ -683,18 +590,11 @@ struct cff_subset_plan {
       if (unlikely (!collect_sids_in_dicts (acc)))
        return false;
       if (unlikely (sidmap.get_population () > 0x8000))        /* assumption: a dict won't reference that many strings */
-       return false;
-      if (subset_charset)
-       offsets.charsetInfo.size = plan_subset_charset (acc, plan);
+       return false;
 
-      topdict_mod.reassignSIDs (sidmap);
-    }
+      if (subset_charset) plan_subset_charset (acc, plan);
 
-    /* String INDEX */
-    {
-      offsets.stringIndexInfo.offset = final_size;
-      offsets.stringIndexInfo.size = acc.stringIndex->calculate_serialized_size (offsets.stringIndexInfo.offSize, sidmap);
-      final_size += offsets.stringIndexInfo.size;
+      topdict_mod.reassignSIDs (sidmap);
     }
 
     if (desubroutinize)
@@ -704,9 +604,6 @@ struct cff_subset_plan {
                    flattener(acc, plan);
       if (!flattener.flatten (subset_charstrings))
        return false;
-
-      /* no global/local subroutines */
-      offsets.globalSubrsInfo.size = CFF1Subrs::calculate_serialized_size (1, 0, 0);
     }
     else
     {
@@ -723,131 +620,48 @@ struct cff_subset_plan {
       if (!subr_subsetter.encode_globalsubrs (subset_globalsubrs))
        return false;
 
-      /* global subrs */
-      unsigned int dataSize = subset_globalsubrs.total_size ();
-      offsets.globalSubrsInfo.offSize = calcOffSize (dataSize);
-      if (unlikely (offsets.globalSubrsInfo.offSize > 4))
-       return false;
-      offsets.globalSubrsInfo.size = CFF1Subrs::calculate_serialized_size (offsets.globalSubrsInfo.offSize, subset_globalsubrs.length, dataSize);
-
       /* local subrs */
-      if (!offsets.localSubrsInfos.resize (orig_fdcount))
-       return false;
       if (!subset_localsubrs.resize (orig_fdcount))
        return false;
       for (unsigned int fd = 0; fd < orig_fdcount; fd++)
       {
        subset_localsubrs[fd].init ();
-       offsets.localSubrsInfos[fd].init ();
        if (fdmap.has (fd))
        {
          if (!subr_subsetter.encode_localsubrs (fd, subset_localsubrs[fd]))
            return false;
-
-         unsigned int dataSize = subset_localsubrs[fd].total_size ();
-         if (dataSize > 0)
-         {
-           offsets.localSubrsInfos[fd].offset = final_size;
-           offsets.localSubrsInfos[fd].offSize = calcOffSize (dataSize);
-           if (unlikely (offsets.localSubrsInfos[fd].offSize > 4))
-             return false;
-           offsets.localSubrsInfos[fd].size = CFF1Subrs::calculate_serialized_size (offsets.localSubrsInfos[fd].offSize, subset_localsubrs[fd].length, dataSize);
-         }
        }
       }
     }
 
-    /* global subrs */
-    offsets.globalSubrsInfo.offset = final_size;
-    final_size += offsets.globalSubrsInfo.size;
-
     /* Encoding */
-    if (!subset_encoding)
-      offsets.encodingOffset = acc.topDict.EncodingOffset;
-    else
-    {
-      offsets.encodingOffset = final_size;
-      final_size += plan_subset_encoding (acc, plan);
-    }
-
-    /* Charset */
-    if (!subset_charset && acc.is_predef_charset ())
-      offsets.charsetInfo.offset = acc.topDict.CharsetOffset;
-    else
-      offsets.charsetInfo.offset = final_size;
-    final_size += offsets.charsetInfo.size;
-
-    /* FDSelect */
-    if (acc.fdSelect != &Null(CFF1FDSelect))
-    {
-      offsets.FDSelectInfo.offset = final_size;
-      final_size += offsets.FDSelectInfo.size;
-    }
-
-    /* FDArray (FDIndex) */
-    if (acc.fdArray != &Null(CFF1FDArray)) {
-      offsets.FDArrayInfo.offset = final_size;
-      cff1_font_dict_op_serializer_t fontSzr;
-      unsigned int dictsSize = 0;
-      for (unsigned int i = 0; i < acc.fontDicts.length; i++)
-       if (fdmap.has (i))
-         dictsSize += FontDict::calculate_serialized_size (acc.fontDicts[i], fontSzr);
-
-      offsets.FDArrayInfo.offSize = calcOffSize (dictsSize);
-      if (unlikely (offsets.FDArrayInfo.offSize > 4))
-       return false;
-      final_size += CFF1Index::calculate_serialized_size (offsets.FDArrayInfo.offSize, subset_fdcount, dictsSize);
-    }
-
-    /* CharStrings */
-    {
-      offsets.charStringsInfo.offset = final_size;
-      unsigned int dataSize = subset_charstrings.total_size ();
-      offsets.charStringsInfo.offSize = calcOffSize (dataSize);
-      if (unlikely (offsets.charStringsInfo.offSize > 4))
-       return false;
-      final_size += CFF1CharStrings::calculate_serialized_size (offsets.charStringsInfo.offSize, plan->num_output_glyphs (), dataSize);
-    }
+    if (subset_encoding)
+      plan_subset_encoding (acc, plan);
 
     /* private dicts & local subrs */
-    offsets.privateDictInfo.offset = final_size;
-    for (unsigned int i = 0; i < orig_fdcount; i++)
+    if (!acc.is_CID ())
+      fontdicts_mod.push (cff1_font_dict_values_mod_t ());
+    else
     {
-      if (fdmap.has (i))
-      {
-       bool  has_localsubrs = offsets.localSubrsInfos[i].size > 0;
-       cff_private_dict_op_serializer_t privSzr (desubroutinize, plan->drop_hints);
-       unsigned int  priv_size = PrivateDict::calculate_serialized_size (acc.privateDicts[i], privSzr, has_localsubrs);
-       table_info_t  privInfo = { final_size, priv_size, 0 };
-       font_dict_values_mod_t fontdict_mod;
-       if (!acc.is_CID ())
-         fontdict_mod.init ( &Null(cff1_font_dict_values_t), CFF_UNDEF_SID, privInfo );
-       else
-         fontdict_mod.init ( &acc.fontDicts[i], sidmap[acc.fontDicts[i].fontName], privInfo );
-       fontdicts_mod.push (fontdict_mod);
-       final_size += privInfo.size;
-
-       if (!plan->desubroutinize && has_localsubrs)
+      + hb_iter (acc.fontDicts)
+      | hb_filter ([&] (const cff1_font_dict_values_t &_)
+       { return fdmap.has (&_ - &acc.fontDicts[0]); } )
+      | hb_map ([&] (const cff1_font_dict_values_t &_)
        {
-         offsets.localSubrsInfos[i].offset = final_size;
-         final_size += offsets.localSubrsInfos[i].size;
-       }
-      }
+         cff1_font_dict_values_mod_t mod;
+         mod.init (&_, sidmap[_.fontName]);
+         return mod;
+       })
+      | hb_sink (fontdicts_mod)
+      ;
     }
 
-    if (!acc.is_CID ())
-      offsets.privateDictInfo = fontdicts_mod[0].privateDictInfo;
-
     return ((subset_charstrings.length == plan->num_output_glyphs ())
           && (fontdicts_mod.length == subset_fdcount));
   }
 
-  unsigned int get_final_size () const  { return final_size; }
-
-  unsigned int       final_size;
-  hb_vector_t<unsigned int>    topdict_sizes;
   cff1_top_dict_values_mod_t   topdict_mod;
-  cff1_sub_table_offsets_t     offsets;
+  cff1_sub_table_info_t                info;
 
   unsigned int    num_glyphs;
   unsigned int    orig_fdcount;
@@ -862,7 +676,7 @@ struct cff_subset_plan {
   str_buff_vec_t               subset_charstrings;
   str_buff_vec_t               subset_globalsubrs;
   hb_vector_t<str_buff_vec_t>  subset_localsubrs;
-  hb_vector_t<font_dict_values_mod_t>  fontdicts_mod;
+  hb_vector_t<cff1_font_dict_values_mod_t>  fontdicts_mod;
 
   bool         drop_hints;
 
@@ -883,91 +697,95 @@ struct cff_subset_plan {
   bool         desubroutinize;
 };
 
-static inline bool _write_cff1 (const cff_subset_plan &plan,
-                               const OT::cff1::accelerator_subset_t  &acc,
-                               unsigned int num_glyphs,
-                               unsigned int dest_sz,
-                               void *dest)
+static bool _serialize_cff1 (hb_serialize_context_t *c,
+                            cff_subset_plan &plan,
+                            const OT::cff1::accelerator_subset_t  &acc,
+                            unsigned int num_glyphs)
 {
-  hb_serialize_context_t c (dest, dest_sz);
-
-  OT::cff1 *cff = c.start_serialize<OT::cff1> ();
-  if (unlikely (!c.extend_min (*cff)))
-    return false;
-
-  /* header */
-  cff->version.major = 0x01;
-  cff->version.minor = 0x00;
-  cff->nameIndex = cff->min_size;
-  cff->offSize = 4; /* unused? */
-
-  /* name INDEX */
+  /* private dicts & local subrs */
+  for (int i = (int)acc.privateDicts.length; --i >= 0 ;)
   {
-    assert (cff->nameIndex == (unsigned) (c.head - c.start));
-    CFF1NameIndex *dest = c.start_embed<CFF1NameIndex> ();
-    if (unlikely (dest == nullptr)) return false;
-    if (unlikely (!dest->serialize (&c, *acc.nameIndex)))
+    if (plan.fdmap.has (i))
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF name INDEX");
-      return false;
-    }
-  }
+      objidx_t subrs_link = 0;
+      if (plan.subset_localsubrs[i].length > 0)
+      {
+       CFF1Subrs *dest = c->start_embed <CFF1Subrs> ();
+       if (unlikely (!dest)) return false;
+       c->push ();
+       if (likely (dest && dest->serialize (c, plan.subset_localsubrs[i])))
+         subrs_link = c->pop_pack ();
+       else
+       {
+         c->pop_discard ();
+         return false;
+       }
+      }
 
-  /* top dict INDEX */
-  {
-    assert (plan.offsets.topDictInfo.offset == (unsigned) (c.head - c.start));
-    CFF1IndexOf<TopDict> *dest = c.start_embed< CFF1IndexOf<TopDict>> ();
-    if (dest == nullptr) return false;
-    cff1_top_dict_op_serializer_t topSzr;
-    top_dict_modifiers_t  modifier (plan.offsets, plan.topDictModSIDs);
-    if (unlikely (!dest->serialize (&c, plan.offsets.topDictInfo.offSize,
-                                   &plan.topdict_mod, 1,
-                                   plan.topdict_sizes, topSzr, modifier)))
-    {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF top dict");
-      return false;
+      PrivateDict *pd = c->start_embed<PrivateDict> ();
+      if (unlikely (!pd)) return false;
+      c->push ();
+      cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints);
+      /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */
+      if (likely (pd->serialize (c, acc.privateDicts[i], privSzr, subrs_link)))
+      {
+       unsigned fd = plan.fdmap[i];
+       plan.fontdicts_mod[fd].privateDictInfo.size = c->length ();
+       plan.fontdicts_mod[fd].privateDictInfo.link = c->pop_pack ();
+      }
+      else
+      {
+       c->pop_discard ();
+       return false;
+      }
     }
   }
 
-  /* String INDEX */
+  if (!acc.is_CID ())
+    plan.info.privateDictInfo = plan.fontdicts_mod[0].privateDictInfo;
+
+  /* CharStrings */
   {
-    assert (plan.offsets.stringIndexInfo.offset == (unsigned) (c.head - c.start));
-    CFF1StringIndex *dest = c.start_embed<CFF1StringIndex> ();
-    if (unlikely (dest == nullptr)) return false;
-    if (unlikely (!dest->serialize (&c, *acc.stringIndex, plan.offsets.stringIndexInfo.offSize, plan.sidmap)))
+    CFF1CharStrings  *cs = c->start_embed<CFF1CharStrings> ();
+    if (unlikely (!cs)) return false;
+    c->push ();
+    if (likely (cs->serialize (c, plan.subset_charstrings)))
+      plan.info.char_strings_link = c->pop_pack ();
+    else
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF string INDEX");
+      c->pop_discard ();
       return false;
     }
   }
 
-  /* global subrs */
+  /* FDArray (FD Index) */
+  if (acc.fdArray != &Null (CFF1FDArray))
   {
-    assert (plan.offsets.globalSubrsInfo.offset != 0);
-    assert (plan.offsets.globalSubrsInfo.offset == (unsigned) (c.head - c.start));
-
-    CFF1Subrs *dest = c.start_embed <CFF1Subrs> ();
-    if (unlikely (dest == nullptr)) return false;
-    if (unlikely (!dest->serialize (&c, plan.offsets.globalSubrsInfo.offSize, plan.subset_globalsubrs)))
+    CFF1FDArray *fda = c->start_embed<CFF1FDArray> ();
+    if (unlikely (!fda)) return false;
+    c->push ();
+    cff1_font_dict_op_serializer_t  fontSzr;
+    auto it = + hb_zip (+ hb_iter (plan.fontdicts_mod), + hb_iter (plan.fontdicts_mod));
+    if (likely (fda->serialize (c, it, fontSzr)))
+      plan.info.fd_array_link = c->pop_pack (false);
+    else
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize global subroutines");
+      c->pop_discard ();
       return false;
     }
   }
 
-  /* Encoding */
-  if (plan.subset_encoding)
+  /* FDSelect */
+  if (acc.fdSelect != &Null (CFF1FDSelect))
   {
-    assert (plan.offsets.encodingOffset == (unsigned) (c.head - c.start));
-    Encoding *dest = c.start_embed<Encoding> ();
-    if (unlikely (dest == nullptr)) return false;
-    if (unlikely (!dest->serialize (&c,
-                                   plan.subset_enc_format,
-                                   plan.subset_enc_num_codes,
-                                   plan.subset_enc_code_ranges,
-                                   plan.subset_enc_supp_codes)))
+    c->push ();
+    if (likely (hb_serialize_cff_fdselect (c, num_glyphs, *acc.fdSelect, acc.fdCount,
+                                          plan.subset_fdselect_format, plan.info.fd_select.size,
+                                          plan.subset_fdselect_ranges)))
+      plan.info.fd_select.link = c->pop_pack ();
+    else
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize Encoding");
+      c->pop_discard ();
       return false;
     }
   }
@@ -975,129 +793,120 @@ static inline bool _write_cff1 (const cff_subset_plan &plan,
   /* Charset */
   if (plan.subset_charset)
   {
-    assert (plan.offsets.charsetInfo.offset == (unsigned) (c.head - c.start));
-    Charset *dest = c.start_embed<Charset> ();
-    if (unlikely (dest == nullptr)) return false;
-    if (unlikely (!dest->serialize (&c,
-                                   plan.subset_charset_format,
-                                   plan.num_glyphs,
-                                   plan.subset_charset_ranges)))
+    Charset *dest = c->start_embed<Charset> ();
+    if (unlikely (!dest)) return false;
+    c->push ();
+    if (likely (dest->serialize (c,
+                                plan.subset_charset_format,
+                                plan.num_glyphs,
+                                plan.subset_charset_ranges)))
+      plan.info.charset_link = c->pop_pack ();
+    else
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize Charset");
+      c->pop_discard ();
       return false;
     }
   }
 
-  /* FDSelect */
-  if (acc.fdSelect != &Null(CFF1FDSelect))
+  /* Encoding */
+  if (plan.subset_encoding)
   {
-    assert (plan.offsets.FDSelectInfo.offset == (unsigned) (c.head - c.start));
-
-    if (unlikely (!hb_serialize_cff_fdselect (&c, num_glyphs, *acc.fdSelect, acc.fdCount,
-                                             plan.subset_fdselect_format, plan.offsets.FDSelectInfo.size,
-                                             plan.subset_fdselect_ranges)))
+    Encoding *dest = c->start_embed<Encoding> ();
+    if (unlikely (!dest)) return false;
+    c->push ();
+    if (likely (dest->serialize (c,
+                                plan.subset_enc_format,
+                                plan.subset_enc_num_codes,
+                                plan.subset_enc_code_ranges,
+                                plan.subset_enc_supp_codes)))
+      plan.info.encoding_link = c->pop_pack ();
+    else
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF subset FDSelect");
+      c->pop_discard ();
       return false;
     }
   }
 
-  /* FDArray (FD Index) */
-  if (acc.fdArray != &Null(CFF1FDArray))
+  /* global subrs */
   {
-    assert (plan.offsets.FDArrayInfo.offset == (unsigned) (c.head - c.start));
-    CFF1FDArray  *fda = c.start_embed<CFF1FDArray> ();
-    if (unlikely (fda == nullptr)) return false;
-    cff1_font_dict_op_serializer_t  fontSzr;
-    if (unlikely (!fda->serialize (&c, plan.offsets.FDArrayInfo.offSize,
-                                  plan.fontdicts_mod,
-                                  fontSzr)))
+    c->push ();
+    CFF1Subrs *dest = c->start_embed <CFF1Subrs> ();
+    if (unlikely (!dest)) return false;
+    if (likely (dest->serialize (c, plan.subset_globalsubrs)))
+      c->pop_pack ();
+    else
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF FDArray");
+      c->pop_discard ();
       return false;
     }
   }
 
-  /* CharStrings */
+  /* String INDEX */
   {
-    assert (plan.offsets.charStringsInfo.offset == (unsigned) (c.head - c.start));
-    CFF1CharStrings  *cs = c.start_embed<CFF1CharStrings> ();
-    if (unlikely (cs == nullptr)) return false;
-    if (unlikely (!cs->serialize (&c, plan.offsets.charStringsInfo.offSize, plan.subset_charstrings)))
+    CFF1StringIndex *dest = c->start_embed<CFF1StringIndex> ();
+    if (unlikely (!dest)) return false;
+    c->push ();
+    if (likely (dest->serialize (c, *acc.stringIndex, plan.sidmap)))
+      c->pop_pack ();
+    else
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF CharStrings");
+      c->pop_discard ();
       return false;
     }
   }
 
-  /* private dicts & local subrs */
-  assert (plan.offsets.privateDictInfo.offset == (unsigned) (c.head - c.start));
-  for (unsigned int i = 0; i < acc.privateDicts.length; i++)
+  OT::cff1 *cff = c->allocate_min<OT::cff1> ();
+  if (unlikely (!cff))
+    return false;
+
+  /* header */
+  cff->version.major = 0x01;
+  cff->version.minor = 0x00;
+  cff->nameIndex = cff->min_size;
+  cff->offSize = 4; /* unused? */
+
+  /* name INDEX */
+  if (unlikely (!(*acc.nameIndex).copy (c))) return false;
+
+  /* top dict INDEX */
   {
-    if (plan.fdmap.has (i))
+    /* serialize singleton TopDict */
+    TopDict *top = c->start_embed<TopDict> ();
+    if (!top) return false;
+    c->push ();
+    cff1_top_dict_op_serializer_t topSzr;
+    unsigned top_size = 0;
+    top_dict_modifiers_t  modifier (plan.info, plan.topDictModSIDs);
+    if (likely (top->serialize (c, plan.topdict_mod, topSzr, modifier)))
     {
-      PrivateDict  *pd = c.start_embed<PrivateDict> ();
-      if (unlikely (pd == nullptr)) return false;
-      unsigned int priv_size = plan.fontdicts_mod[plan.fdmap[i]].privateDictInfo.size;
-      bool result;
-      cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints);
-      /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */
-      unsigned int subroffset = (plan.offsets.localSubrsInfos[i].size > 0) ? priv_size : 0;
-      result = pd->serialize (&c, acc.privateDicts[i], privSzr, subroffset);
-      if (unlikely (!result))
-      {
-       DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF Private Dict[%d]", i);
-       return false;
-      }
-      if (plan.offsets.localSubrsInfos[i].size > 0)
-      {
-       CFF1Subrs *dest = c.start_embed <CFF1Subrs> ();
-       if (unlikely (dest == nullptr)) return false;
-       if (unlikely (!dest->serialize (&c, plan.offsets.localSubrsInfos[i].offSize, plan.subset_localsubrs[i])))
-       {
-         DEBUG_MSG (SUBSET, nullptr, "failed to serialize local subroutines");
-         return false;
-       }
-      }
+      top_size = c->length ();
+      c->pop_pack (false);
     }
+    else
+    {
+      c->pop_discard ();
+      return false;
+    }
+    /* serialize INDEX header for above */
+    CFF1Index *dest = c->start_embed<CFF1Index> ();
+    if (!dest) return false;
+    return dest->serialize_header (c, hb_iter (hb_array_t<unsigned> (&top_size, 1)));
   }
-
-  assert (c.head == c.end);
-  c.end_serialize ();
-
-  return true;
 }
 
-static inline bool
+static bool
 _hb_subset_cff1 (const OT::cff1::accelerator_subset_t  &acc,
-               const char              *data,
-               hb_subset_plan_t        *plan,
-               hb_blob_t               **prime /* OUT */)
+               hb_subset_context_t     *c)
 {
   cff_subset_plan cff_plan;
 
-  if (unlikely (!cff_plan.create (acc, plan)))
+  if (unlikely (!cff_plan.create (acc, c->plan)))
   {
     DEBUG_MSG(SUBSET, nullptr, "Failed to generate a cff subsetting plan.");
     return false;
   }
 
-  unsigned int  cff_prime_size = cff_plan.get_final_size ();
-  char *cff_prime_data = (char *) calloc (1, cff_prime_size);
-
-  if (unlikely (!_write_cff1 (cff_plan, acc, plan->num_output_glyphs (),
-                             cff_prime_size, cff_prime_data))) {
-    DEBUG_MSG(SUBSET, nullptr, "Failed to write a subset cff.");
-    free (cff_prime_data);
-    return false;
-  }
-
-  *prime = hb_blob_create (cff_prime_data,
-                          cff_prime_size,
-                          HB_MEMORY_MODE_READONLY,
-                          cff_prime_data,
-                          free);
-  return true;
+  return _serialize_cff1 (c->serializer, cff_plan, acc, c->plan->num_output_glyphs ());
 }
 
 /**
@@ -1107,17 +916,11 @@ _hb_subset_cff1 (const OT::cff1::accelerator_subset_t  &acc,
  * Return value: subsetted cff table.
  **/
 bool
-hb_subset_cff1 (hb_subset_plan_t *plan,
-               hb_blob_t       **prime /* OUT */)
+hb_subset_cff1 (hb_subset_context_t *c)
 {
-  hb_blob_t *cff_blob = hb_sanitize_context_t().reference_table<CFF::cff1> (plan->source);
-  const char *data = hb_blob_get_data(cff_blob, nullptr);
-
   OT::cff1::accelerator_subset_t acc;
-  acc.init(plan->source);
-  bool result = likely (acc.is_valid ()) &&
-                       _hb_subset_cff1 (acc, data, plan, prime);
-  hb_blob_destroy (cff_blob);
+  acc.init (c->plan->source);
+  bool result = likely (acc.is_valid ()) && _hb_subset_cff1 (acc, c);
   acc.fini ();
 
   return result;
index 1ec8678..aaf5def 100644 (file)
@@ -32,7 +32,6 @@
 #include "hb-subset-plan.hh"
 
 HB_INTERNAL bool
-hb_subset_cff1 (hb_subset_plan_t *plan,
-              hb_blob_t        **cff_prime /* OUT */);
+hb_subset_cff1 (hb_subset_context_t *c);
 
 #endif /* HB_SUBSET_CFF1_HH */
index 7edc3f5..637f38f 100644 (file)
 
 using namespace CFF;
 
-struct cff2_sub_table_offsets_t : cff_sub_table_offsets_t
+struct cff2_sub_table_info_t : cff_sub_table_info_t
 {
-  cff2_sub_table_offsets_t ()
-    : cff_sub_table_offsets_t (),
-      varStoreOffset (0)
+  cff2_sub_table_info_t ()
+    : cff_sub_table_info_t (),
+      var_store_link (0)
   {}
 
-  unsigned int  varStoreOffset;
+  objidx_t  var_store_link;
 };
 
 struct cff2_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<>
 {
   bool serialize (hb_serialize_context_t *c,
                  const op_str_t &opstr,
-                 const cff2_sub_table_offsets_t &offsets) const
+                 const cff2_sub_table_info_t &info) const
   {
     TRACE_SERIALIZE (this);
 
     switch (opstr.op)
     {
       case OpCode_vstore:
-       return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.varStoreOffset));
+       return_trace (FontDict::serialize_link4_op(c, opstr.op, info.var_store_link));
 
       default:
-       return_trace (cff_top_dict_op_serializer_t<>::serialize (c, opstr, offsets));
-    }
-  }
-
-  unsigned int calculate_serialized_size (const op_str_t &opstr) const
-  {
-    switch (opstr.op)
-    {
-      case OpCode_vstore:
-       return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op);
-
-      default:
-       return cff_top_dict_op_serializer_t<>::calculate_serialized_size (opstr);
+       return_trace (cff_top_dict_op_serializer_t<>::serialize (c, opstr, info));
     }
   }
 };
@@ -116,8 +104,8 @@ struct cff2_cs_opset_flatten_t : cff2_cs_opset_t<cff2_cs_opset_flatten_t, flatte
       const blend_arg_t &arg = env.argStack[i];
       if (arg.blending ())
       {
-       if (unlikely (!((arg.numValues > 0) && (env.argStack.get_count () >= arg.numValues))))
-       {
+       if (unlikely (!((arg.numValues > 0) && (env.argStack.get_count () >= arg.numValues))))
+       {
          env.set_error ();
          return;
        }
@@ -144,8 +132,8 @@ struct cff2_cs_opset_flatten_t : cff2_cs_opset_t<cff2_cs_opset_flatten_t, flatte
       if (unlikely (!((arg1.blending () && (arg.numValues == arg1.numValues) && (arg1.valueIndex == j) &&
              (arg1.deltas.length == env.get_region_count ())))))
       {
-       env.set_error ();
-       return;
+       env.set_error ();
+       return;
       }
       encoder.encode_num (arg1);
     }
@@ -232,7 +220,7 @@ struct cff2_subr_subsetter_t : subr_subsetter_t<cff2_subr_subsetter_t, CFF2Subrs
   cff2_subr_subsetter_t (const OT::cff2::accelerator_subset_t &acc_, const hb_subset_plan_t *plan_)
     : subr_subsetter_t (acc_, plan_) {}
 
-  static void finalize_parsed_str (cff2_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring)
+  static void complete_parsed_str (cff2_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring)
   {
     /* vsindex is inserted at the beginning of the charstring as necessary */
     if (env.seen_vsindex ())
@@ -246,9 +234,9 @@ struct cff2_subr_subsetter_t : subr_subsetter_t<cff2_subr_subsetter_t, CFF2Subrs
 
 struct cff2_subset_plan {
   cff2_subset_plan ()
-    : final_size (0),
-      orig_fdcount (0),
+    : orig_fdcount (0),
       subset_fdcount(1),
+      subset_fdselect_size (0),
       subset_fdselect_format (0),
       drop_hints (false),
       desubroutinize (false)
@@ -258,7 +246,6 @@ struct cff2_subset_plan {
     subset_charstrings.init ();
     subset_globalsubrs.init ();
     subset_localsubrs.init ();
-    privateDictInfos.init ();
   }
 
   ~cff2_subset_plan ()
@@ -268,28 +255,16 @@ struct cff2_subset_plan {
     subset_charstrings.fini_deep ();
     subset_globalsubrs.fini_deep ();
     subset_localsubrs.fini_deep ();
-    privateDictInfos.fini ();
   }
 
   bool create (const OT::cff2::accelerator_subset_t &acc,
              hb_subset_plan_t *plan)
   {
-    final_size = 0;
     orig_fdcount = acc.fdArray->count;
 
     drop_hints = plan->drop_hints;
     desubroutinize = plan->desubroutinize;
 
-    /* CFF2 header */
-    final_size += OT::cff2::static_size;
-
-    /* top dict */
-    {
-      cff2_top_dict_op_serializer_t topSzr;
-      offsets.topDictInfo.size = TopDict::calculate_serialized_size (acc.topDict, topSzr);
-      final_size += offsets.topDictInfo.size;
-    }
-
     if (desubroutinize)
     {
       /* Flatten global & local subrs */
@@ -297,9 +272,6 @@ struct cff2_subset_plan {
                    flattener(acc, plan);
       if (!flattener.flatten (subset_charstrings))
        return false;
-
-      /* no global/local subroutines */
-      offsets.globalSubrsInfo.size = CFF2Subrs::calculate_serialized_size (1, 0, 0);
     }
     else
     {
@@ -316,115 +288,41 @@ struct cff2_subset_plan {
       if (!subr_subsetter.encode_globalsubrs (subset_globalsubrs))
        return false;
 
-      /* global subrs */
-      unsigned int dataSize = subset_globalsubrs.total_size ();
-      offsets.globalSubrsInfo.offSize = calcOffSize (dataSize);
-      offsets.globalSubrsInfo.size = CFF2Subrs::calculate_serialized_size (offsets.globalSubrsInfo.offSize, subset_globalsubrs.length, dataSize);
-
       /* local subrs */
-      if (!offsets.localSubrsInfos.resize (orig_fdcount))
-       return false;
       if (!subset_localsubrs.resize (orig_fdcount))
        return false;
       for (unsigned int fd = 0; fd < orig_fdcount; fd++)
       {
        subset_localsubrs[fd].init ();
-       offsets.localSubrsInfos[fd].init ();
        if (!subr_subsetter.encode_localsubrs (fd, subset_localsubrs[fd]))
          return false;
-
-       unsigned int dataSize = subset_localsubrs[fd].total_size ();
-       if (dataSize > 0)
-       {
-         offsets.localSubrsInfos[fd].offset = final_size;
-         offsets.localSubrsInfos[fd].offSize = calcOffSize (dataSize);
-         offsets.localSubrsInfos[fd].size = CFF2Subrs::calculate_serialized_size (offsets.localSubrsInfos[fd].offSize, subset_localsubrs[fd].length, dataSize);
-       }
       }
     }
 
-    /* global subrs */
-    offsets.globalSubrsInfo.offset = final_size;
-    final_size += offsets.globalSubrsInfo.size;
-
-    /* variation store */
-    if (acc.varStore != &Null(CFF2VariationStore))
-    {
-      offsets.varStoreOffset = final_size;
-      final_size += acc.varStore->get_size ();
-    }
-
     /* FDSelect */
-    if (acc.fdSelect != &Null(CFF2FDSelect))
+    if (acc.fdSelect != &Null (CFF2FDSelect))
     {
-      offsets.FDSelectInfo.offset = final_size;
       if (unlikely (!hb_plan_subset_cff_fdselect (plan,
                                  orig_fdcount,
                                  *(const FDSelect *)acc.fdSelect,
                                  subset_fdcount,
-                                 offsets.FDSelectInfo.size,
+                                 subset_fdselect_size,
                                  subset_fdselect_format,
                                  subset_fdselect_ranges,
                                  fdmap)))
        return false;
-
-      final_size += offsets.FDSelectInfo.size;
     }
     else
       fdmap.identity (1);
 
-    /* FDArray (FDIndex) */
-    {
-      offsets.FDArrayInfo.offset = final_size;
-      cff_font_dict_op_serializer_t fontSzr;
-      unsigned int dictsSize = 0;
-      for (unsigned int i = 0; i < acc.fontDicts.length; i++)
-       if (fdmap.has (i))
-         dictsSize += FontDict::calculate_serialized_size (acc.fontDicts[i], fontSzr);
-
-      offsets.FDArrayInfo.offSize = calcOffSize (dictsSize);
-      final_size += CFF2Index::calculate_serialized_size (offsets.FDArrayInfo.offSize, subset_fdcount, dictsSize);
-    }
-
-    /* CharStrings */
-    {
-      offsets.charStringsInfo.offset = final_size;
-      unsigned int dataSize = subset_charstrings.total_size ();
-      offsets.charStringsInfo.offSize = calcOffSize (dataSize);
-      final_size += CFF2CharStrings::calculate_serialized_size (offsets.charStringsInfo.offSize, plan->num_output_glyphs (), dataSize);
-    }
-
-    /* private dicts & local subrs */
-    offsets.privateDictsOffset = final_size;
-    for (unsigned int i = 0; i < orig_fdcount; i++)
-    {
-      if (fdmap.has (i))
-      {
-       bool  has_localsubrs = offsets.localSubrsInfos[i].size > 0;
-       cff_private_dict_op_serializer_t privSzr (desubroutinize, drop_hints);
-       unsigned int  priv_size = PrivateDict::calculate_serialized_size (acc.privateDicts[i], privSzr, has_localsubrs);
-       table_info_t  privInfo = { final_size, priv_size, 0 };
-       privateDictInfos.push (privInfo);
-       final_size += privInfo.size;
-
-       if (!plan->desubroutinize && has_localsubrs)
-       {
-         offsets.localSubrsInfos[i].offset = final_size;
-         final_size += offsets.localSubrsInfos[i].size;
-       }
-      }
-    }
-
     return true;
   }
 
-  unsigned int get_final_size () const  { return final_size; }
-
-  unsigned int final_size;
-  cff2_sub_table_offsets_t offsets;
+  cff2_sub_table_info_t info;
 
   unsigned int    orig_fdcount;
   unsigned int    subset_fdcount;
+  unsigned int   subset_fdselect_size;
   unsigned int    subset_fdselect_format;
   hb_vector_t<code_pair_t>   subset_fdselect_ranges;
 
@@ -433,200 +331,158 @@ struct cff2_subset_plan {
   str_buff_vec_t           subset_charstrings;
   str_buff_vec_t           subset_globalsubrs;
   hb_vector_t<str_buff_vec_t> subset_localsubrs;
-  hb_vector_t<table_info_t>  privateDictInfos;
 
   bool     drop_hints;
   bool     desubroutinize;
 };
 
-static inline bool _write_cff2 (const cff2_subset_plan &plan,
-                               const OT::cff2::accelerator_subset_t  &acc,
-                               unsigned int num_glyphs,
-                               unsigned int dest_sz,
-                               void *dest)
+static bool _serialize_cff2 (hb_serialize_context_t *c,
+                            cff2_subset_plan &plan,
+                            const OT::cff2::accelerator_subset_t  &acc,
+                            unsigned int num_glyphs)
 {
-  hb_serialize_context_t c (dest, dest_sz);
-
-  OT::cff2 *cff2 = c.start_serialize<OT::cff2> ();
-  if (unlikely (!c.extend_min (*cff2)))
-    return false;
-
-  /* header */
-  cff2->version.major = 0x02;
-  cff2->version.minor = 0x00;
-  cff2->topDict = OT::cff2::static_size;
+  /* private dicts & local subrs */
+  hb_vector_t<table_info_t>  private_dict_infos;
+  if (unlikely (!private_dict_infos.resize (plan.subset_fdcount))) return false;
 
-  /* top dict */
+  for (int i = (int)acc.privateDicts.length; --i >= 0 ;)
   {
-    assert (cff2->topDict == (unsigned) (c.head - c.start));
-    cff2->topDictSize = plan.offsets.topDictInfo.size;
-    TopDict &dict = cff2 + cff2->topDict;
-    cff2_top_dict_op_serializer_t topSzr;
-    if (unlikely (!dict.serialize (&c, acc.topDict, topSzr, plan.offsets)))
+    if (plan.fdmap.has (i))
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 top dict");
-      return false;
-    }
-  }
+      objidx_t subrs_link = 0;
 
-  /* global subrs */
-  {
-    assert (cff2->topDict + plan.offsets.topDictInfo.size == (unsigned) (c.head - c.start));
-    CFF2Subrs *dest = c.start_embed <CFF2Subrs> ();
-    if (unlikely (dest == nullptr)) return false;
-    if (unlikely (!dest->serialize (&c, plan.offsets.globalSubrsInfo.offSize, plan.subset_globalsubrs)))
-    {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize global subroutines");
-      return false;
+      if (plan.subset_localsubrs[i].length > 0)
+      {
+       CFF2Subrs *dest = c->start_embed <CFF2Subrs> ();
+       if (unlikely (!dest)) return false;
+       c->push ();
+       if (likely (dest->serialize (c, plan.subset_localsubrs[i])))
+         subrs_link = c->pop_pack ();
+       else
+       {
+         c->pop_discard ();
+         return false;
+       }
+      }
+      PrivateDict *pd = c->start_embed<PrivateDict> ();
+      if (unlikely (!pd)) return false;
+      c->push ();
+      cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints);
+      if (likely (pd->serialize (c, acc.privateDicts[i], privSzr, subrs_link)))
+      {
+       unsigned fd = plan.fdmap[i];
+       private_dict_infos[fd].size = c->length ();
+       private_dict_infos[fd].link = c->pop_pack ();
+      }
+      else
+      {
+       c->pop_discard ();
+       return false;
+      }
     }
   }
 
-  /* variation store */
-  if (acc.varStore != &Null(CFF2VariationStore))
+  /* CharStrings */
   {
-    assert (plan.offsets.varStoreOffset == (unsigned) (c.head - c.start));
-    CFF2VariationStore *dest = c.start_embed<CFF2VariationStore> ();
-    if (unlikely (!dest->serialize (&c, acc.varStore)))
+    CFF2CharStrings  *cs = c->start_embed<CFF2CharStrings> ();
+    if (unlikely (!cs)) return false;
+    c->push ();
+    if (likely (cs->serialize (c, plan.subset_charstrings)))
+      plan.info.char_strings_link = c->pop_pack ();
+    else
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 Variation Store");
+      c->pop_discard ();
       return false;
     }
   }
 
   /* FDSelect */
-  if (acc.fdSelect != &Null(CFF2FDSelect))
+  if (acc.fdSelect != &Null (CFF2FDSelect))
   {
-    assert (plan.offsets.FDSelectInfo.offset == (unsigned) (c.head - c.start));
-
-    if (unlikely (!hb_serialize_cff_fdselect (&c, num_glyphs, *(const FDSelect *)acc.fdSelect, acc.fdArray->count,
-                                             plan.subset_fdselect_format, plan.offsets.FDSelectInfo.size,
-                                             plan.subset_fdselect_ranges)))
+    c->push ();
+    if (likely (hb_serialize_cff_fdselect (c, num_glyphs, *(const FDSelect *)acc.fdSelect,                                           plan.orig_fdcount,
+                                           plan.subset_fdselect_format, plan.subset_fdselect_size,
+                                           plan.subset_fdselect_ranges)))
+      plan.info.fd_select.link = c->pop_pack ();
+    else
     {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 subset FDSelect");
+      c->pop_discard ();
       return false;
     }
   }
 
   /* FDArray (FD Index) */
   {
-    assert (plan.offsets.FDArrayInfo.offset == (unsigned) (c.head - c.start));
-    CFF2FDArray  *fda = c.start_embed<CFF2FDArray> ();
-    if (unlikely (fda == nullptr)) return false;
-    cff_font_dict_op_serializer_t  fontSzr;
-    if (unlikely (!fda->serialize (&c, plan.offsets.FDArrayInfo.offSize,
-                                  acc.fontDicts, plan.subset_fdcount, plan.fdmap,
-                                  fontSzr, plan.privateDictInfos)))
-    {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 FDArray");
-      return false;
-    }
+    c->push ();
+    CFF2FDArray *fda = c->start_embed<CFF2FDArray> ();
+    if (unlikely (!fda)) return false;
+    cff_font_dict_op_serializer_t fontSzr;
+    auto it =
+    + hb_zip (+ hb_iter (acc.fontDicts)
+             | hb_filter ([&] (const cff2_font_dict_values_t &_)
+               { return plan.fdmap.has (&_ - &acc.fontDicts[0]); }),
+             hb_iter (private_dict_infos))
+    ;
+    if (unlikely (!fda->serialize (c, it, fontSzr))) return false;
+    plan.info.fd_array_link = c->pop_pack ();
   }
 
-  /* CharStrings */
+  /* variation store */
+  if (acc.varStore != &Null (CFF2VariationStore))
   {
-    assert (plan.offsets.charStringsInfo.offset == (unsigned) (c.head - c.start));
-    CFF2CharStrings  *cs = c.start_embed<CFF2CharStrings> ();
-    if (unlikely (cs == nullptr)) return false;
-    if (unlikely (!cs->serialize (&c, plan.offsets.charStringsInfo.offSize, plan.subset_charstrings)))
-    {
-      DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 CharStrings");
-      return false;
-    }
+    c->push ();
+    CFF2VariationStore *dest = c->start_embed<CFF2VariationStore> ();
+    if (unlikely (!dest || !dest->serialize (c, acc.varStore))) return false;
+    plan.info.var_store_link = c->pop_pack ();
   }
 
-  /* private dicts & local subrs */
-  assert (plan.offsets.privateDictsOffset == (unsigned) (c.head - c.start));
-  for (unsigned int i = 0; i < acc.privateDicts.length; i++)
+  OT::cff2 *cff2 = c->allocate_min<OT::cff2> ();
+  if (unlikely (!cff2)) return false;
+
+  /* header */
+  cff2->version.major = 0x02;
+  cff2->version.minor = 0x00;
+  cff2->topDict = OT::cff2::static_size;
+
+  /* top dict */
   {
-    if (plan.fdmap.has (i))
-    {
-      PrivateDict  *pd = c.start_embed<PrivateDict> ();
-      if (unlikely (pd == nullptr)) return false;
-      unsigned int priv_size = plan.privateDictInfos[plan.fdmap[i]].size;
-      bool result;
-      cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints);
-      /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */
-      unsigned int subroffset = (plan.offsets.localSubrsInfos[i].size > 0) ? priv_size : 0;
-      result = pd->serialize (&c, acc.privateDicts[i], privSzr, subroffset);
-      if (unlikely (!result))
-      {
-       DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF Private Dict[%d]", i);
-       return false;
-      }
-      if (plan.offsets.localSubrsInfos[i].size > 0)
-      {
-       CFF2Subrs *dest = c.start_embed <CFF2Subrs> ();
-       if (unlikely (dest == nullptr)) return false;
-       if (unlikely (!dest->serialize (&c, plan.offsets.localSubrsInfos[i].offSize, plan.subset_localsubrs[i])))
-       {
-         DEBUG_MSG (SUBSET, nullptr, "failed to serialize local subroutines");
-         return false;
-       }
-      }
-    }
+    TopDict &dict = cff2 + cff2->topDict;
+    cff2_top_dict_op_serializer_t topSzr;
+    if (unlikely (!dict.serialize (c, acc.topDict, topSzr, plan.info))) return false;
+    cff2->topDictSize = c->head - (const char *)&dict;
   }
 
-  assert (c.head == c.end);
-  c.end_serialize ();
-
-  return true;
+  /* global subrs */
+  {
+    CFF2Subrs *dest = c->start_embed <CFF2Subrs> ();
+    if (unlikely (!dest)) return false;
+    return dest->serialize (c, plan.subset_globalsubrs);
+  }
 }
 
-static inline bool
+static bool
 _hb_subset_cff2 (const OT::cff2::accelerator_subset_t  &acc,
-               const char                    *data,
-               hb_subset_plan_t                *plan,
-               hb_blob_t                      **prime /* OUT */)
+                hb_subset_context_t    *c)
 {
   cff2_subset_plan cff2_plan;
 
-  if (unlikely (!cff2_plan.create (acc, plan)))
-  {
-    DEBUG_MSG(SUBSET, nullptr, "Failed to generate a cff2 subsetting plan.");
-    return false;
-  }
-
-  unsigned int  cff2_prime_size = cff2_plan.get_final_size ();
-  char *cff2_prime_data = (char *) calloc (1, cff2_prime_size);
-
-  if (unlikely (!_write_cff2 (cff2_plan, acc, plan->num_output_glyphs (),
-                             cff2_prime_size, cff2_prime_data))) {
-    DEBUG_MSG(SUBSET, nullptr, "Failed to write a subset cff2.");
-    free (cff2_prime_data);
-    return false;
-  }
-
-  *prime = hb_blob_create (cff2_prime_data,
-                          cff2_prime_size,
-                          HB_MEMORY_MODE_READONLY,
-                          cff2_prime_data,
-                          free);
-  return true;
+  if (unlikely (!cff2_plan.create (acc, c->plan))) return false;
+  return _serialize_cff2 (c->serializer, cff2_plan, acc, c->plan->num_output_glyphs ());
 }
 
 /**
  * hb_subset_cff2:
- * Subsets the CFF2 table according to a provided plan.
- *
- * Return value: subsetted cff2 table.
+ * Subsets the CFF2 table according to a provided subset context.
  **/
 bool
-hb_subset_cff2 (hb_subset_plan_t *plan,
-               hb_blob_t       **prime /* OUT */)
+hb_subset_cff2 (hb_subset_context_t *c)
 {
-  hb_blob_t *cff2_blob = hb_sanitize_context_t().reference_table<CFF::cff2> (plan->source);
-  const char *data = hb_blob_get_data(cff2_blob, nullptr);
-
   OT::cff2::accelerator_subset_t acc;
-  acc.init(plan->source);
-  bool result = likely (acc.is_valid ()) &&
-               _hb_subset_cff2 (acc, data, plan, prime);
-
-  hb_blob_destroy (cff2_blob);
+  acc.init (c->plan->source);
+  bool result = likely (acc.is_valid ()) && _hb_subset_cff2 (acc, c);
   acc.fini ();
 
   return result;
 }
 
-
 #endif
index a07dc29..f10556d 100644 (file)
@@ -32,7 +32,6 @@
 #include "hb-subset-plan.hh"
 
 HB_INTERNAL bool
-hb_subset_cff2 (hb_subset_plan_t *plan,
-              hb_blob_t       **cff2_prime /* OUT */);
+hb_subset_cff2 (hb_subset_context_t *c);
 
 #endif /* HB_SUBSET_CFF2_HH */
index d92f33f..fe9be3c 100644 (file)
@@ -46,10 +46,13 @@ hb_subset_input_create_or_fail ()
   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;
 
   hb_tag_t default_drop_tables[] = {
     // Layout disabled by default
@@ -77,8 +80,6 @@ hb_subset_input_create_or_fail ()
     HB_TAG ('G', 'l', 'o', 'c'),
     HB_TAG ('S', 'i', 'l', 'f'),
     HB_TAG ('S', 'i', 'l', 'l'),
-    // Colour
-    HB_TAG ('s', 'b', 'i', 'x')
   };
 
   input->drop_tables->add_array (default_drop_tables, ARRAY_LENGTH (default_drop_tables));
@@ -116,6 +117,7 @@ hb_subset_input_destroy (hb_subset_input_t *subset_input)
   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);
 
   free (subset_input);
@@ -152,6 +154,12 @@ hb_subset_input_nameid_set (hb_subset_input_t *subset_input)
 }
 
 HB_EXTERN hb_set_t *
+hb_subset_input_namelangid_set (hb_subset_input_t *subset_input)
+{
+  return subset_input->name_languages;
+}
+
+HB_EXTERN hb_set_t *
 hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input)
 {
   return subset_input->drop_tables;
@@ -206,3 +214,16 @@ hb_subset_input_get_retain_gids (hb_subset_input_t *subset_input)
 {
   return subset_input->retain_gids;
 }
+
+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)
+{
+  return subset_input->name_legacy;
+}
index f6dd4ac..0aeb966 100644 (file)
@@ -41,11 +41,13 @@ struct hb_subset_input_t
   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
index f4912f8..232131c 100644 (file)
 
 #include "hb-ot-cmap-table.hh"
 #include "hb-ot-glyf-table.hh"
+#include "hb-ot-layout-gdef-table.hh"
+#include "hb-ot-layout-gpos-table.hh"
 #include "hb-ot-cff1-table.hh"
+#include "hb-ot-color-colr-table.hh"
 #include "hb-ot-var-fvar-table.hh"
 #include "hb-ot-stat-table.hh"
 
+
 #ifndef HB_NO_SUBSET_CFF
 static inline void
 _add_cff_seac_components (const OT::cff1::accelerator_t &cff,
@@ -50,8 +54,24 @@ _add_cff_seac_components (const OT::cff1::accelerator_t &cff,
 #endif
 
 #ifndef HB_NO_SUBSET_LAYOUT
+#ifdef HB_EXPERIMENTAL_API
+static void
+_remap_indexes (const hb_set_t *indexes,
+               hb_map_t       *mapping /* OUT */)
+{
+  unsigned count = indexes->get_population ();
+
+  for (auto _ : + hb_zip (indexes->iter (), hb_range (count)))
+    mapping->set (_.first, _.second);
+
+}
+#endif
+
 static inline void
-_gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain)
+_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)
 {
   hb_set_t lookup_indices;
   hb_ot_layout_collect_lookups (face,
@@ -63,6 +83,81 @@ _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain)
   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
+}
+
+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)
+{
+  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
+  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
+}
+#endif
+
+#ifndef HB_NO_VAR
+static inline void
+  _collect_layout_variation_indices (hb_face_t *face,
+                                    const hb_set_t *glyphset,
+                                    const hb_map_t *gpos_lookups,
+                                    hb_set_t  *layout_variation_indices,
+                                    hb_map_t  *layout_variation_idx_map)
+{
+  hb_blob_ptr_t<OT::GDEF> gdef = hb_sanitize_context_t ().reference_table<OT::GDEF> (face);
+  hb_blob_ptr_t<OT::GPOS> gpos = hb_sanitize_context_t ().reference_table<OT::GPOS> (face);
+
+  if (!gdef->has_data ())
+  {
+    gdef.destroy ();
+    gpos.destroy ();
+    return;
+  }
+  OT::hb_collect_variation_indices_context_t c (layout_variation_indices, glyphset, gpos_lookups);
+  gdef->collect_variation_indices (&c);
+
+  if (hb_ot_layout_has_positioning (face))
+    gpos->collect_variation_indices (&c);
+
+  gdef->remap_layout_variation_indices (layout_variation_indices, layout_variation_idx_map);
+  
+  gdef.destroy ();
+  gpos.destroy ();
 }
 #endif
 
@@ -93,14 +188,22 @@ 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_gsub,
+                         bool close_over_gpos,
+                          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);
+#ifndef HB_NO_SUBSET_CFF
   cff.init (plan->source);
+#endif
+  colr.init (plan->source);
 
   plan->_glyphset_gsub->add (0); // Not-def
   hb_set_union (plan->_glyphset_gsub, input_glyphs_to_retain);
@@ -123,8 +226,11 @@ _populate_gids_to_retain (hb_subset_plan_t* plan,
 
 #ifndef HB_NO_SUBSET_LAYOUT
   if (close_over_gsub)
-    // Add all glyphs needed for GSUB substitutions.
-    _gsub_closure (plan->source, plan->_glyphset_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);
+
+  if (close_over_gpos)
+    _gpos_closure_lookups_features (plan->source, plan->_glyphset_gsub, plan->gpos_lookups, plan->gpos_features);
 #endif
   _remove_invalid_gids (plan->_glyphset_gsub, plan->source->get_num_glyphs ());
 
@@ -138,11 +244,20 @@ _populate_gids_to_retain (hb_subset_plan_t* plan,
     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 ();
+#endif
   glyf.fini ();
   cmap.fini ();
 }
@@ -213,9 +328,12 @@ hb_subset_plan_create (hb_face_t         *face,
   plan->drop_hints = input->drop_hints;
   plan->desubroutinize = input->desubroutinize;
   plan->retain_gids = input->retain_gids;
+  plan->name_legacy = input->name_legacy;
   plan->unicodes = hb_set_create ();
   plan->name_ids = hb_set_reference (input->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->source = hb_face_reference (face);
   plan->dest = hb_face_builder_create ();
@@ -225,11 +343,19 @@ hb_subset_plan_create (hb_face_t         *face,
   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 ();
+  plan->gsub_features = hb_map_create ();
+  plan->gpos_features = hb_map_create ();
+  plan->layout_variation_indices = hb_set_create ();
+  plan->layout_variation_idx_map = hb_map_create ();
 
   _populate_gids_to_retain (plan,
                            input->unicodes,
                            input->glyphs,
-                           !input->drop_tables->has (HB_OT_TAG_GSUB));
+                           !input->drop_tables->has (HB_OT_TAG_GSUB),
+                           !input->drop_tables->has (HB_OT_TAG_GPOS),
+                            !input->drop_tables->has (HB_OT_TAG_GDEF));
 
   _create_old_gid_to_new_gid_map (face,
                                  input->retain_gids,
@@ -253,6 +379,8 @@ 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->glyphs_requested);
   hb_set_destroy (plan->drop_tables);
   hb_face_destroy (plan->source);
   hb_face_destroy (plan->dest);
@@ -261,6 +389,13 @@ 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_map_destroy (plan->gsub_lookups);
+  hb_map_destroy (plan->gpos_lookups);
+  hb_map_destroy (plan->gsub_features);
+  hb_map_destroy (plan->gpos_features);
+  hb_set_destroy (plan->layout_variation_indices);
+  hb_map_destroy (plan->layout_variation_idx_map);
+
 
   free (plan);
 }
index af2337e..7a85b51 100644 (file)
@@ -42,6 +42,7 @@ struct hb_subset_plan_t
   bool drop_hints : 1;
   bool desubroutinize : 1;
   bool retain_gids : 1;
+  bool name_legacy : 1;
 
   // For each cp that we'd like to retain maps to the corresponding gid.
   hb_set_t *unicodes;
@@ -49,6 +50,12 @@ struct hb_subset_plan_t
   // name_ids we would like to retain
   hb_set_t *name_ids;
 
+  // name_languages we would like to retain
+  hb_set_t *name_languages;
+
+  //glyph ids requested to retain
+  hb_set_t *glyphs_requested;
+
   // Tables which should be dropped.
   hb_set_t *drop_tables;
 
@@ -67,6 +74,19 @@ struct hb_subset_plan_t
   hb_set_t *_glyphset;
   hb_set_t *_glyphset_gsub;
 
+  //active lookups we'd like to retain
+  hb_map_t *gsub_lookups;
+  hb_map_t *gpos_lookups;
+
+  //active features we'd like to retain
+  hb_map_t *gsub_features;
+  hb_map_t *gpos_features;
+
+  //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
+  hb_map_t *layout_variation_idx_map;
+
  public:
 
   /*
index ec2f889..3112739 100644 (file)
 #include "hb-ot-hhea-table.hh"
 #include "hb-ot-hmtx-table.hh"
 #include "hb-ot-maxp-table.hh"
+#include "hb-ot-color-sbix-table.hh"
+#include "hb-ot-color-colr-table.hh"
 #include "hb-ot-os2-table.hh"
 #include "hb-ot-post-table.hh"
 #include "hb-ot-cff1-table.hh"
 #include "hb-ot-cff2-table.hh"
 #include "hb-ot-vorg-table.hh"
 #include "hb-ot-name-table.hh"
+#include "hb-ot-color-cbdt-table.hh"
 #include "hb-ot-layout-gsub-table.hh"
 #include "hb-ot-layout-gpos-table.hh"
+#include "hb-ot-var-gvar-table.hh"
+#include "hb-ot-var-hvar-table.hh"
 
 
-HB_UNUSED static inline unsigned int
-_plan_estimate_subset_table_size (hb_subset_plan_t *plan,
-                                 unsigned int table_len);
-static inline unsigned int
-_plan_estimate_subset_table_size (hb_subset_plan_t *plan,
-                                 unsigned int table_len)
+static unsigned
+_plan_estimate_subset_table_size (hb_subset_plan_t *plan, unsigned table_len)
 {
-  unsigned int src_glyphs = plan->source->get_num_glyphs ();
-  unsigned int dst_glyphs = plan->glyphset ()->get_population ();
+  unsigned src_glyphs = plan->source->get_num_glyphs ();
+  unsigned dst_glyphs = plan->glyphset ()->get_population ();
 
   if (unlikely (!src_glyphs))
     return 512 + table_len;
 
-  return 512 + (unsigned int) (table_len * sqrt ((double) dst_glyphs / src_glyphs));
+  return 512 + (unsigned) (table_len * sqrt ((double) dst_glyphs / src_glyphs));
 }
 
 template<typename TableType>
 static bool
-_subset2 (hb_subset_plan_t *plan)
+_subset (hb_subset_plan_t *plan)
 {
   bool result = false;
   hb_blob_t *source_blob = hb_sanitize_context_t ().reference_table<TableType> (plan->source);
@@ -77,26 +78,26 @@ _subset2 (hb_subset_plan_t *plan)
     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 int 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);
+    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);
+      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 (plan, &serializer);
+    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);
+      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);
+       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;
       }
@@ -111,159 +112,119 @@ _subset2 (hb_subset_plan_t *plan)
       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);
+       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));
+       DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset table subsetted to empty.", HB_UNTAG (tag));
       }
     }
   }
   else
-    DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset sanitize failed on source table.", HB_UNTAG (tag));
+    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!");
+  DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset %s", HB_UNTAG (tag), result ? "success" : "FAILED!");
   return result;
 }
 
-template<typename TableType>
 static bool
-_subset (hb_subset_plan_t *plan)
+_is_table_present (hb_face_t *source, hb_tag_t tag)
 {
-  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;
-  hb_bool_t result = false;
-  if (source_blob->data)
-    result = table->subset (plan);
-  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!");
-  return result;
+  hb_tag_t table_tags[32];
+  unsigned offset = 0, num_tables = ARRAY_LENGTH (table_tags);
+  while ((hb_face_get_table_tags (source, offset, &num_tables, table_tags), num_tables))
+  {
+    for (unsigned i = 0; i < num_tables; ++i)
+      if (table_tags[i] == tag)
+       return true;
+    offset += num_tables;
+  }
+  return false;
 }
 
-
 static bool
-_subset_table (hb_subset_plan_t *plan,
-              hb_tag_t          tag)
+_should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
 {
-  DEBUG_MSG(SUBSET, nullptr, "begin subset %c%c%c%c", HB_UNTAG (tag));
-  bool result = true;
-  switch (tag) {
-    case HB_OT_TAG_glyf:
-      result = _subset2<const OT::glyf> (plan);
-      break;
-    case HB_OT_TAG_hdmx:
-      result = _subset2<const OT::hdmx> (plan);
-      break;
-    case HB_OT_TAG_name:
-      result = _subset2<const OT::name> (plan);
-      break;
-    case HB_OT_TAG_head:
-      // TODO that won't work well if there is no glyf
-      DEBUG_MSG(SUBSET, nullptr, "skip head, handled by glyf");
-      result = true;
-      break;
-    case HB_OT_TAG_hhea:
-      DEBUG_MSG(SUBSET, nullptr, "skip hhea handled by hmtx");
-      return true;
-    case HB_OT_TAG_hmtx:
-      result = _subset2<const OT::hmtx> (plan);
-      break;
-    case HB_OT_TAG_vhea:
-      DEBUG_MSG(SUBSET, nullptr, "skip vhea handled by vmtx");
-      return true;
-    case HB_OT_TAG_vmtx:
-      result = _subset2<const OT::vmtx> (plan);
-      break;
-    case HB_OT_TAG_maxp:
-      result = _subset2<const OT::maxp> (plan);
-      break;
-    case HB_OT_TAG_loca:
-      DEBUG_MSG(SUBSET, nullptr, "skip loca handled by glyf");
-      return true;
-    case HB_OT_TAG_cmap:
-      result = _subset2<const OT::cmap> (plan);
-      break;
-    case HB_OT_TAG_OS2:
-      result = _subset2<const OT::OS2> (plan);
-      break;
-    case HB_OT_TAG_post:
-      result = _subset2<const OT::post> (plan);
-      break;
+  if (plan->drop_tables->has (tag))
+    return true;
 
-#ifndef HB_NO_SUBSET_CFF
-    case HB_OT_TAG_cff1:
-      result = _subset<const OT::cff1> (plan);
-      break;
-    case HB_OT_TAG_cff2:
-      result = _subset<const OT::cff2> (plan);
-      break;
-    case HB_OT_TAG_VORG:
-      result = _subset2<const OT::VORG> (plan);
-      break;
-#endif
+  switch (tag)
+  {
+  case HB_TAG ('c','v','a','r'): /* hint table, fallthrough */
+  case HB_TAG ('c','v','t',' '): /* hint table, fallthrough */
+  case HB_TAG ('f','p','g','m'): /* hint table, fallthrough */
+  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;
 
-#ifndef HB_NO_SUBSET_LAYOUT
-    case HB_OT_TAG_GDEF:
-      result = _subset2<const OT::GDEF> (plan);
-      break;
-    case HB_OT_TAG_GSUB:
-      result = _subset2<const OT::GSUB> (plan);
-      break;
-    case HB_OT_TAG_GPOS:
-      result = _subset2<const OT::GPOS> (plan);
-      break;
+#ifdef HB_NO_SUBSET_LAYOUT
+    // Drop Layout Tables if requested.
+  case HB_OT_TAG_GDEF:
+  case HB_OT_TAG_GPOS:
+  case HB_OT_TAG_GSUB:
+  case HB_TAG ('m','o','r','x'):
+  case HB_TAG ('m','o','r','t'):
+  case HB_TAG ('k','e','r','x'):
+  case HB_TAG ('k','e','r','n'):
+    return true;
 #endif
 
-    default:
-      hb_blob_t *source_table = hb_face_reference_table (plan->source, tag);
-      if (likely (source_table))
-       result = plan->add_table (tag, source_table);
-      else
-       result = false;
-      hb_blob_destroy (source_table);
-      break;
+  default:
+    return false;
   }
-  DEBUG_MSG(SUBSET, nullptr, "subset %c%c%c%c %s", HB_UNTAG (tag), result ? "ok" : "FAILED");
-  return result;
 }
 
 static bool
-_should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
+_subset_table (hb_subset_plan_t *plan, hb_tag_t tag)
 {
-  if (plan->drop_tables->has (tag))
-    return true;
+  DEBUG_MSG (SUBSET, nullptr, "subset %c%c%c%c", HB_UNTAG (tag));
+  switch (tag)
+  {
+  case HB_OT_TAG_glyf: return _subset<const OT::glyf> (plan);
+  case HB_OT_TAG_hdmx: return _subset<const OT::hdmx> (plan);
+  case HB_OT_TAG_name: return _subset<const OT::name> (plan);
+  case HB_OT_TAG_head:
+    if (_is_table_present (plan->source, HB_OT_TAG_glyf) && !_should_drop_table (plan, HB_OT_TAG_glyf))
+      return true; /* skip head, handled by glyf */
+    return _subset<const OT::head> (plan);
+  case HB_OT_TAG_hhea: return true; /* skip hhea, handled by hmtx */
+  case HB_OT_TAG_hmtx: return _subset<const OT::hmtx> (plan);
+  case HB_OT_TAG_vhea: return true; /* skip vhea, handled by vmtx */
+  case HB_OT_TAG_vmtx: return _subset<const OT::vmtx> (plan);
+  case HB_OT_TAG_maxp: return _subset<const OT::maxp> (plan);
+  case HB_OT_TAG_sbix: return _subset<const OT::sbix> (plan);
+  case HB_OT_TAG_loca: return true; /* skip loca, handled by glyf */
+  case HB_OT_TAG_cmap: return _subset<const OT::cmap> (plan);
+  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_CBLC: return _subset<const OT::CBLC> (plan);
+  case HB_OT_TAG_CBDT: return true; /* skip CBDT, handled by CBLC */
 
-  switch (tag) {
-    case HB_TAG ('c', 'v', 'a', 'r'): /* hint table, fallthrough */
-    case HB_TAG ('c', 'v', 't', ' '): /* hint table, fallthrough */
-    case HB_TAG ('f', 'p', 'g', 'm'): /* hint table, fallthrough */
-    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;
+#ifndef HB_NO_SUBSET_CFF
+  case HB_OT_TAG_cff1: return _subset<const OT::cff1> (plan);
+  case HB_OT_TAG_cff2: return _subset<const OT::cff2> (plan);
+  case HB_OT_TAG_VORG: return _subset<const OT::VORG> (plan);
+#endif
 
-#ifdef HB_NO_SUBSET_LAYOUT
-    // Drop Layout Tables if requested.
-    case HB_OT_TAG_GDEF:
-    case HB_OT_TAG_GPOS:
-    case HB_OT_TAG_GSUB:
-    case HB_TAG ('m', 'o', 'r', 'x'):
-    case HB_TAG ('m', 'o', 'r', 't'):
-    case HB_TAG ('k', 'e', 'r', 'x'):
-    case HB_TAG ('k', 'e', 'r', 'n'):
-      return true;
+#ifndef HB_NO_SUBSET_LAYOUT
+  case HB_OT_TAG_GDEF: return _subset<const OT::GDEF> (plan);
+  case HB_OT_TAG_GSUB: return _subset<const OT::GSUB> (plan);
+  case HB_OT_TAG_GPOS: return _subset<const OT::GPOS> (plan);
+  case HB_OT_TAG_gvar: return _subset<const OT::gvar> (plan);
+  case HB_OT_TAG_HVAR: return _subset<const OT::HVAR> (plan);
+  case HB_OT_TAG_VVAR: return _subset<const OT::VVAR> (plan);
 #endif
 
-    default:
-      return false;
+  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;
   }
 }
 
@@ -275,33 +236,29 @@ _should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
  * Subsets a font according to provided input.
  **/
 hb_face_t *
-hb_subset (hb_face_t *source,
-          hb_subset_input_t *input)
+hb_subset (hb_face_t *source, 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);
 
-  hb_tag_t table_tags[32];
-  unsigned int offset = 0, count;
-  bool success = true;
   hb_set_t tags_set;
-  do {
-    count = ARRAY_LENGTH (table_tags);
-    hb_face_get_table_tags (source, offset, &count, table_tags);
-    for (unsigned int i = 0; i < count; i++)
+  bool success = true;
+  hb_tag_t table_tags[32];
+  unsigned offset = 0, num_tables = ARRAY_LENGTH (table_tags);
+  while ((hb_face_get_table_tags (source, offset, &num_tables, table_tags), num_tables))
+  {
+    for (unsigned i = 0; i < num_tables; ++i)
     {
       hb_tag_t tag = table_tags[i];
-      if (_should_drop_table (plan, tag) && !tags_set.has (tag))
-      {
-       DEBUG_MSG(SUBSET, nullptr, "drop %c%c%c%c", HB_UNTAG (tag));
-       continue;
-      }
+      if (_should_drop_table (plan, tag) && !tags_set.has (tag)) continue;
       tags_set.add (tag);
-      success = success && _subset_table (plan, tag);
+      success = _subset_table (plan, tag);
+      if (unlikely (!success)) goto end;
     }
-    offset += count;
-  } while (success && count == ARRAY_LENGTH (table_tags));
+    offset += num_tables;
+  }
+end:
 
   hb_face_t *result = success ? hb_face_reference (plan->dest) : hb_face_get_empty ();
   hb_subset_plan_destroy (plan);
index 960afef..ddf4409 100644 (file)
@@ -58,6 +58,9 @@ HB_EXTERN hb_set_t *
 hb_subset_input_nameid_set (hb_subset_input_t *subset_input);
 
 HB_EXTERN hb_set_t *
+hb_subset_input_namelangid_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
 hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input);
 
 HB_EXTERN void
@@ -78,6 +81,12 @@ hb_subset_input_set_retain_gids (hb_subset_input_t *subset_input,
 HB_EXTERN hb_bool_t
 hb_subset_input_get_retain_gids (hb_subset_input_t *subset_input);
 
+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);
index b8dd07a..dc86f15 100644 (file)
@@ -54,14 +54,20 @@ struct hb_subset_context_t :
   dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN
   ( _dispatch (obj, hb_prioritize, hb_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_subset_plan_t *plan_,
-                      hb_serialize_context_t *serializer_) :
+  hb_subset_context_t (hb_blob_t *source_blob_,
+                      hb_subset_plan_t *plan_,
+                      hb_serialize_context_t *serializer_,
+                      hb_tag_t table_tag_) :
+                       source_blob (source_blob_),
                        plan (plan_),
                        serializer (serializer_),
+                       table_tag (table_tag_),
                        debug_depth (0) {}
 };
 
index 8b7d648..88623db 100644 (file)
@@ -4,7 +4,7 @@
  *
  *   ./gen-ucd-table.py ucd.nounihan.grouped.xml
  *
- * on file with this description: Unicode 12.1.0
+ * on file with this description: Unicode 13.0.0
  */
 
 #ifndef HB_UCD_TABLE_HH
@@ -13,7 +13,7 @@
 #include "hb.hh"
 
 static const hb_script_t
-_hb_ucd_sc_map[153] =
+_hb_ucd_sc_map[157] =
 {
                    HB_SCRIPT_COMMON,              HB_SCRIPT_INHERITED,
                   HB_SCRIPT_UNKNOWN,                 HB_SCRIPT_ARABIC,
@@ -91,7 +91,9 @@ _hb_ucd_sc_map[153] =
               HB_SCRIPT_MEDEFAIDRIN,            HB_SCRIPT_OLD_SOGDIAN,
                   HB_SCRIPT_SOGDIAN,                HB_SCRIPT_ELYMAIC,
               HB_SCRIPT_NANDINAGARI, HB_SCRIPT_NYIAKENG_PUACHUE_HMONG,
-                   HB_SCRIPT_WANCHO,
+                   HB_SCRIPT_WANCHO,             HB_SCRIPT_CHORASMIAN,
+              HB_SCRIPT_DIVES_AKURU,    HB_SCRIPT_KHITAN_SMALL_SCRIPT,
+                   HB_SCRIPT_YEZIDI,
 };
 static const uint16_t
 _hb_ucd_dm1_p0_map[825] =
@@ -862,7 +864,7 @@ _hb_ucd_dm2_u32_map[638] =
    HB_CODEPOINT_ENCODE3_11_7_14 (0x04E9u, 0x0308u, 0x04EBu),
 };
 static const uint64_t
-_hb_ucd_dm2_u64_map[387] =
+_hb_ucd_dm2_u64_map[388] =
 {
      HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B7u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B8u, 0x0000u),
      HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BCu, 0x0000u),
@@ -1051,19 +1053,19 @@ _hb_ucd_dm2_u64_map[387] =
   HB_CODEPOINT_ENCODE3 (0x11347u, 0x11357u, 0x1134Cu),HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114B0u, 0x114BCu),
   HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114BAu, 0x114BBu),HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114BDu, 0x114BEu),
   HB_CODEPOINT_ENCODE3 (0x115B8u, 0x115AFu, 0x115BAu),HB_CODEPOINT_ENCODE3 (0x115B9u, 0x115AFu, 0x115BBu),
-   HB_CODEPOINT_ENCODE3 (0x1D157u, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D158u, 0x1D165u, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Eu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Fu, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D170u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D171u, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D172u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1B9u, 0x1D165u, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D1BAu, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Eu, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Fu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Eu, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Fu, 0x0000u),
+  HB_CODEPOINT_ENCODE3 (0x11935u, 0x11930u, 0x11938u), HB_CODEPOINT_ENCODE3 (0x1D157u, 0x1D165u, 0x0000u),
+   HB_CODEPOINT_ENCODE3 (0x1D158u, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Eu, 0x0000u),
+   HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Fu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D170u, 0x0000u),
+   HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D171u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D172u, 0x0000u),
+   HB_CODEPOINT_ENCODE3 (0x1D1B9u, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BAu, 0x1D165u, 0x0000u),
+   HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Eu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Fu, 0x0000u),
+   HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Eu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Fu, 0x0000u),
 };
 
 #ifndef HB_OPTIMIZE_SIZE
 
 static const uint8_t
-_hb_ucd_u8[32102] =
+_hb_ucd_u8[32480] =
 {
     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,
@@ -1077,7 +1079,7 @@ _hb_ucd_u8[32102] =
    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, 65, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+   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,
@@ -1089,6 +1091,7 @@ _hb_ucd_u8[32102] =
    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,
@@ -1176,8 +1179,7 @@ _hb_ucd_u8[32102] =
    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   91, 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,
@@ -1192,7 +1194,7 @@ _hb_ucd_u8[32102] =
    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, 92,
+   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,
@@ -1200,7 +1202,7 @@ _hb_ucd_u8[32102] =
    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, 94,
     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,
@@ -1274,7 +1276,8 @@ _hb_ucd_u8[32102] =
     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,  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,
    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,
@@ -1306,7 +1309,7 @@ _hb_ucd_u8[32102] =
     2, 12, 10, 10,  2,  7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  7,
     7,  2,  7,  7,  2,  7,  7,  7,  7,  7,  2,  2, 12,  7, 10, 12,
    10, 12, 12, 12, 12,  2,  2, 10, 10,  2,  2, 10, 10, 12,  2,  2,
-    2,  2,  2,  2,  2,  2, 12, 10,  2,  2,  2,  2,  7,  7,  2,  7,
+    2,  2,  2,  2,  2, 12, 12, 10,  2,  2,  2,  2,  7,  7,  2,  7,
    26,  7, 15, 15, 15, 15, 15, 15,  2,  2,  2,  2,  2,  2,  2,  2,
     2,  2, 12,  7,  2,  7,  7,  7,  7,  7,  7,  2,  2,  2,  7,  7,
     7,  2,  7,  7,  7,  7,  2,  2,  2,  7,  7,  2,  7,  2,  7,  7,
@@ -1326,12 +1329,12 @@ _hb_ucd_u8[32102] =
    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,  7,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-   12, 12, 10, 10,  2,  7,  7,  7,  7,  7,  7,  7,  7,  2,  7,  7,
+   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,
    10, 12, 12, 12, 12,  2, 10, 10, 10,  2, 10, 10, 10, 12,  7, 26,
     2,  2,  2,  2,  7,  7,  7, 10, 15, 15, 15, 15, 15, 15, 15,  7,
    15, 15, 15, 15, 15, 15, 15, 15, 15, 26,  7,  7,  7,  7,  7,  7,
-    2,  2, 10, 10,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+    2, 12, 10, 10,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
     7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  7,  7,  7,  7,  7,  7,
     7,  7,  2,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2,  7,  2,  2,
     7,  7,  7,  7,  7,  7,  7,  2,  2,  2, 12,  2,  2,  2,  2, 10,
@@ -1415,7 +1418,8 @@ _hb_ucd_u8[32102] =
    12, 10, 12, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10,
    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,  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, 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,
@@ -1464,7 +1468,6 @@ _hb_ucd_u8[32102] =
    23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
    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,
@@ -1505,7 +1508,7 @@ _hb_ucd_u8[32102] =
    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 22, 18, 25, 25,
    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,  2, 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,
@@ -1522,6 +1525,7 @@ _hb_ucd_u8[32102] =
    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, 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,
@@ -1554,10 +1558,10 @@ _hb_ucd_u8[32102] =
     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,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,  2,  2,  7,  6,  6,  5,  7,  7,  7,  7,  7,
+    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,
     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,  2,  2,  2,  2,
+    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,
     7,  7,  7,  7, 21, 21, 21, 21,  2,  2,  2,  2,  2,  2,  2,  2,
    10, 10,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
@@ -1585,7 +1589,7 @@ _hb_ucd_u8[32102] =
     2,  7,  7,  7,  7,  7,  7,  2,  2,  7,  7,  7,  7,  7,  7,  2,
     2,  7,  7,  7,  7,  7,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 24,  6,  6,  6,  6,
-    5,  5,  5,  5,  5,  5,  5,  5,  2,  2,  2,  2,  2,  2,  2,  2,
+    5,  5,  5,  5,  5,  5,  5,  5,  5,  6, 24, 24,  2,  2,  2,  2,
     7,  7,  7, 10, 10, 12, 10, 10, 12, 10, 10, 21, 10, 12,  2,  2,
     7,  7,  7,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7,  7,  7,  7,  7,  2,  2,  2,  2,  7,  7,  7,  7,  7,
@@ -1601,14 +1605,12 @@ _hb_ucd_u8[32102] =
     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,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 23, 26,  2,  2,
    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,
@@ -1625,6 +1627,7 @@ _hb_ucd_u8[32102] =
    15, 15, 15, 15,  2,  2,  2, 26, 26, 26, 26, 26, 26, 26, 26, 26,
    14, 14, 14, 14, 14, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26,
    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 26, 26, 26,  2,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,  2,  2,  2,
    26,  2,  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, 26, 26, 12,  2,  2,
    12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
@@ -1668,8 +1671,11 @@ _hb_ucd_u8[32102] =
     5,  5,  5,  2,  2,  2,  2,  2,  2,  2, 15, 15, 15, 15, 15, 15,
     7,  7,  7,  7, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,  2,  2,
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  2,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  2, 12, 12, 17,  2,  2,
+    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,  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,
@@ -1680,10 +1686,10 @@ _hb_ucd_u8[32102] =
    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,
-   21, 21, 21, 21,  7, 10, 10,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+   21, 21, 21, 21,  7, 10, 10,  7,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7, 12, 21, 21,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10,
-   10,  7,  7,  7,  7, 21, 21, 21, 21, 12, 12, 12, 12, 21,  2,  2,
+   10,  7,  7,  7,  7, 21, 21, 21, 21, 12, 12, 12, 12, 21, 10, 12,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  7, 21,  7, 21, 21, 21,
     2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
@@ -1702,7 +1708,7 @@ _hb_ucd_u8[32102] =
    12, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7,  7,  7, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12,
    10, 10, 12, 12, 12, 10, 12,  7,  7,  7,  7, 21, 21, 21, 21, 21,
-   13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2, 21,  2, 21, 12,  7,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21,  2, 21, 12,  7,
    10, 10, 10, 12, 12, 12, 12, 12, 12, 10, 12, 10, 10, 10, 10, 12,
    12, 10, 12, 12,  7,  7, 21,  7,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 10,
@@ -1718,6 +1724,10 @@ _hb_ucd_u8[32102] =
    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,
    15, 15, 15,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  7,
+    7,  7,  7,  7,  7,  7,  7,  2,  2,  7,  2,  2,  7,  7,  7,  7,
+    7,  7,  7,  7,  2,  7,  7,  2,  7,  7,  7,  7,  7,  7,  7,  7,
+   10, 10, 10, 10, 10, 10,  2, 10, 10,  2,  2, 12, 12, 10, 12,  7,
+   10,  7, 10, 12, 21, 21, 21,  2,  2,  2,  2,  2,  2,  2,  2,  2,
     7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  7,  7,  7,  7,  7,  7,
     7, 10, 10, 10, 12, 12, 12, 12,  2,  2, 12, 12, 10, 10, 10, 10,
    12,  7, 21,  7, 10,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
@@ -1759,7 +1769,8 @@ _hb_ucd_u8[32102] =
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10,  2,  2,  2,  2,  2,  2,  2, 12,
    12, 12, 12,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
-    6,  6, 21,  6,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    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,
     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,
@@ -1832,334 +1843,338 @@ _hb_ucd_u8[32102] =
     2,  7,  7,  7,  2,  7,  7,  7,  7,  7,  2,  7,  7,  7,  7,  7,
    25, 25,  2,  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, 26, 26, 26, 26,
-   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,  2,  2,  2,
+   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 26, 26,
+   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,  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,  2,  2,  2,
-   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,  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,  2, 26, 26, 26, 26,  2,  2,  2, 26, 26, 26, 26, 26, 26,
-   26, 26, 26,  2,  2, 26, 26, 26, 26, 26, 26,  2,  2,  2, 26, 26,
-   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,  2,  2, 26, 26, 26,
-   26, 26, 26, 26,  2,  2,  2,  2, 26, 26, 26,  2,  2,  2,  2,  2,
-    7,  7,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+   26, 26, 26, 26, 26,  2,  2,  2, 26, 26, 26,  2,  2,  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,
     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,  2,
     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,
-    0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
-   14,  0,  0, 15,  0,  0,  0, 16, 17, 18, 19, 20, 21, 22,  0,  0,
-   23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 25,  0,  0,
-   26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  1,  0,  0,  2,  0,  3,  4,  5,  6,  7,
+    8,  9, 10, 11, 12, 12, 12, 13, 14, 12, 15, 16, 17, 18, 19, 20,
+   21, 22,  0,  0,  0,  0, 23,  0,  0,  0,  0,  0,  0,  0, 24, 25,
+    0, 26, 27,  0, 28, 29, 30, 31, 32, 33,  0, 34,  0,  0,  0,  0,
+    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, 36, 37, 38,  0,  0,  0,  0,
+   39, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 27,  0, 28, 29, 30, 31,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,  0, 33,  0,
-    0, 34, 35, 36,  0,  0,  0,  0,  0,  0, 37,  0,  0, 38,  0, 39,
-   40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,  0, 51, 52,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41, 42,  0,  0,
+   43, 44, 45, 46,  0, 47,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53, 54,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 56, 57,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   58, 54, 59,  0,  0,  0,  0,  0, 60, 61,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,
-    7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  9, 10, 11, 12,  0,  0,  0,  0, 13,  0,  0, 14, 15,
-    0, 16,  0,  0,  0,  0,  0, 17, 18,  0,  0, 19,  0, 20, 21,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 22, 23,  0, 24, 25,  0,  0, 26,
-    0,  0,  0,  0,  0,  0,  0, 27, 28, 29,  0,  0,  0, 30, 31, 32,
-    0,  0,  0,  0,  0, 30, 31,  0,  0, 33,  0,  0,  0, 30, 31,  0,
-    0,  0,  0,  0,  0, 30, 31,  0,  0,  0,  0,  0,  0, 30, 31,  0,
-    0,  0,  0,  0,  0,  0, 31,  0,  0,  0,  0,  0,  0,  0, 31, 34,
-    0,  0,  0,  0,  0, 30, 31,  0,  0,  0,  0,  0,  0, 35, 31,  0,
-    0,  0,  0,  0,  0,  0, 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,  0,  0,
-    0,  0, 47,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0, 49,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 50,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 51,  0,  0,  0,  0,  0,  0,  0,  0, 52,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53,  0,  0,  0,  0,
-   54, 55,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0, 57, 49,  0,
-   58, 59,  0,  0, 60,  0,  0,  0, 61, 62,  0,  0,  0, 63,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 64, 65, 66,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 67, 68,  1, 69,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 70, 71, 72,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 73, 74,  0,  0,  0,  0,  0,  0,
-    0, 75,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0, 76,  0,  0,  0,
-    0,  0,  0, 77,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   73, 78,  0, 79,  0,  0,  0,  0,  0, 74, 80,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 49,  0,  1, 74,  0,  0, 81,  0,  0, 82,
-    0,  0,  0,  0,  0, 83, 54,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0, 84, 85,  0,  0, 80,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 31,  0,  0, 86,  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,  0,  0,  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, 88,  0,  0,  0,  0,  0,  0,  0,
-    0, 89,  0,  0,  0,  0,  0,  0,  0,  0, 90,  0,  0, 91,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 92,  0,  0,  0, 93,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 94, 88,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80,  0,
-    0, 75,  0,  0,  0, 95,  0,  0,  0,  0, 96,  0,  0, 97,  0,  0,
-    0, 83,  0,  0,  0,  0, 98,  0,  0,  0,  0,  0,  0, 99,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,100,  0,  0,  0,  0,101, 31,  0,
-  102,103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,104, 33,
-    0,  0,  0,  0,  0,  0,105,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0, 75,106,  0,  0,  0,  0,  0,  0, 75,  0,  0,
-    0,  0,  0,  0,  0,107,  0,  0,  0,  0,  0,  0,108,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 95,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 54,  0,  0,  0,  0, 49,109,  0,
-    0,  0,  0,110,  0,  0,  0,  0,  0,  0,  0,  0,  0, 75,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,111,  0,
-    0,  0,  0,109,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,112,  0,  0,  0,113,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,114,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  115,116,117,  0,118,  0,  0,  0,  0,  0,  0,  0,  0,  0,119,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,121,122,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,123,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,124,  0,  0,  0,  0,  0,  0,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,230,230,230,230,230,230,
-  230,230,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,220,220,220,220,220,220,220,220,  1,  1,
-    1,  1,  1,220,220,220,220,230,230,230,230,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,230,230,
-  230,230,230,230,230,230,230,230,230,230,  0,  0,  0,230,230,230,
-  230,230,  0,  0,  0,  0,  0,  0,  0,  0,  0,220,230,230,230,230,
-  220,230,230,230,222,220,230,230,230,230,230,230,220,220,220,220,
-  220,220,230,230,220,230,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,  0,  0,  0,  0,  0,  0,  0,  0,230,230,230,230,230,230,
-  230,230, 30, 31, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,
-  220,230,230,230,230,230,220,230,230,220, 35,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  230,230,230,230,230,230,230,  0,  0,230,230,230,230,220,230,  0,
-    0,230,230,  0,220,230,230,220,  0,  0,  0, 36,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,230,220,230,230,220,230,
-  230,220,220,220,230,220,220,230,220,230,230,230,220,230,220,230,
-  220,230,220,230,230,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,230,230,230,230,230,230,230,220,230,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,220,  0,  0,  0,  0,  0,  0,  0,  0,
-  230,230,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,  0,  0,  0,  0,  0,
-    0,  0,  0,220,220,220,  0,  0,  0,  0,  0,  0,  0,220,230,230,
-  230,230,230,230,230,230,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,  0,  0,
-    0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,230,220,230,230,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,230,  0,  0,  0,  0,  0,  0, 84,
-   91,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,103,103,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,107,107,107,107,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,118,118,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,122,122,122,122,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,220,220,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,220,
-    0,220,  0,216,  0,  0,  0,  0,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  220,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  7,  0,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,220,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,  0,  9,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,230,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,228,  0,  0,  0,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,230,
-  230,230,230,230,230,230,230,  0,  0,220,230,230,230,230,230,220,
-  220,220,220,220,220,230,230,220,  0,  0,  0,  0,  0,  0,  7,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,230,220,230,230,230,230,230,230,230,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  7,  0,  0,  0,  0,  0,  0,  0,  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,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,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,230,230,230,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,218,228,232,222,224,224,  0,  0,  0,  0,  0,  0,
-    0,  0,  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,
-    0,  0,  0,  0,  0,  0,  0,  0,230,230,  0,  0,  0,  0,  0,  0,
-    9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,220,220,220,  0,  0,  0,  0,  0,  9,  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,  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,  0,  0,  0,  0,  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,220,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  230,230,230,230,230,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,220,  0,230,  0,  0,  0,  0,  0,  0,
-    0,  0,230,  1,220,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,230,
-  220,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,230,230,
-  230,230,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  220,220,230,230,230,220,230,220,220,220,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  9,  7,  0,  0,  0,  0,  0,230,230,230,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,
-    7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  7,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  7,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  230,230,230,230,230,230,230,  0,  0,  0,230,230,230,230,230,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,
-    7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  7,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    9,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  9,  9,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,230,230,230,230,230,230,
-  230,  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,  0,  0,  0,216,
-  216,  1,  1,  1,  0,  0,  0,226,216,216,216,216,216,  0,  0,  0,
-    0,  0,  0,  0,  0,220,220,220,220,220,220,220,220,  0,  0,230,
-  230,230,230,230,220,220,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,230,230,230,230,  0,  0,  0,  0,230,230,230,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  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,  0,  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,  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,
+    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,
+    0,  0,  0,  0,  0,  0,  1, 21,  0,  0,  0,  0,  0, 22, 23, 24,
+    0,  0, 25,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 27,
+   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,  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, 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,  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,
+    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,
+  220,220,220,220,220,220,220,220,  1,  1,  1,  1,  1,220,220,220,
+  220,230,230,230,230,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,230,230,230,230,  0,  0,  0,230,
+  230,230,230,230,  0,220,230,230,230,230,220,230,230,230,222,220,
+  230,230,230,230,230,230,220,220,220,220,220,220,230,230,220,230,
+  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,  0,  0,  0,  0, 27, 28, 29, 30, 31, 32, 33, 34,230,
+  230,220,220,230,230,230,230,230,220,230,230,220, 35,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,230,230,230,230,230,230,
-  230,  0,230,230,230,230,230,230,230,230,230,230,230,230,230,230,
-  230,230,230,  0,  0,230,230,230,230,230,230,230,  0,230,230,  0,
-  230,230,230,230,230,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,230,230,230,230,220,220,220,220,220,220,
-  220,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,230,230,
-  230,230,230,230,  7,  0,  0,  0,  0,  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,
+  230,  0,  0,230,230,230,230,220,230,  0,  0,230,230,  0,220,230,
+  230,220,  0,  0,  0, 36,  0,  0,  0,  0,  0,  0,230,220,230,230,
+  220,230,230,220,220,220,230,220,220,230,220,230,230,230,220,230,
+  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,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,
+    0,  9,  0,  0,  0,230,220,230,230,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,230,  0,  0,  0,  0,  0,  0, 84, 91,  0,  0,  0,  0,  9,
+    9,  0,  0,  0,  0,  0,  9,  0,  0,  0,  0,  0,103,103,  9,  0,
+    0,  0,  0,  0,107,107,107,107,  0,  0,  0,  0,118,118,  9,  0,
+    0,  0,  0,  0,122,122,122,122,  0,  0,  0,  0,220,220,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,220,  0,220,  0,216,  0,  0,
+    0,  0,  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,  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,
+    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,
+    0,  0,  7,  0,  0,  0,  9,  7,  0,  0,  0,  0,  7,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  7,  0,  0,  0,  0,
+    0,  9,  9,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,
+    9,  9,  0,  0,  1,  1,  1,  1,  1,  0,  0,  0,230,230,230,230,
+  230,230,230,  0,  6,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  1,  0,  0,  0,  0,  0,  0,216,216,  1,  1,  1,  0,  0,
+    0,226,216,216,216,216,216,  0,  0,  0,  0,  0,  0,  0,  0,220,
+  220,220,220,220,220,220,220,  0,  0,230,230,230,230,230,220,220,
+    0,  0,  0,  0,  0,  0,230,230,230,230,  0,  0,  0,  0,230,230,
+  230,  0,  0,  0,230,  0,  0,230,230,230,230,230,230,230,  0,230,
+  230,  0,230,230,220,220,220,220,220,220,220,  0,230,230,  7,  0,
+    0,  0,  0,  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, 17, 17,237,  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,  0,  0,  0,  0,  3,  4,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  5,  0,  0,  0,  6,  0,  0,  0,  0,  0,  0,  0,
+   17, 17, 17,237,  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,  0,  0,
+    0,  0,  3,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,
+    0,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  7,  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,  7,  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,  8,  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, 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,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    8,  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, 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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  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,
+   20,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  8, 21, 32,  4,  0, 10,  0, 33,  7, 20, 20, 20,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    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,  0,  0,  0,  0,  0,  0,  0,  0,  8, 21,
+    0,  1,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  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,  0,  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, 20,  1,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8, 21, 32,  4,  0, 10,
-    0, 33,  7, 20, 20, 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,
-    0,  0,  0,  0,  8, 21,  0,  1,  0,  1,  0,  0,  0,  0,  0,  0,
-    0,  0,  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,  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,  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,  0,
+    0,  0,  0,  0,  0,  0, 20, 20,  1, 20, 20,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  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, 21,  0,  1,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   26, 21,  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,  1,  0,  0,  0,
-    0,  2,  0,  0,  0,  0,  0,  0,  3,  4,  0,  0,  0,  0,  0,  0,
-    3, 47, 48,  0,  0,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,  3,  4,  0,  1,  2,  3,  4,  5,
-    6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 17, 19, 20,
-   21, 22, 23, 24, 25, 25, 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,
+    0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  2,  0,  0,  0,  0,
+    0,  0,  3,  4,  0,  0,  0,  0,  0,  0,  3, 47, 48,  0,  0,  0,
+    0,  0,  0,  0,  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,  0,  0,
+    0,  0,  3,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
+   12, 13, 14, 15, 16, 17, 18, 17, 19, 20, 21, 22, 23, 24, 25, 25,
+   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, 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,
+   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,
-   35, 35, 69, 70, 35, 35, 35, 35, 71, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 72, 73, 74, 75, 76, 77, 35, 35, 78, 79, 35, 35, 80, 35,
-   81, 82, 83, 84, 17, 85, 86, 87, 35, 35, 25, 25, 25, 25, 25, 25,
+   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, 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, 88, 25, 25,
-   25, 25, 25, 25, 25, 89, 90, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-   25, 91, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 92,
-   35, 35, 35, 35, 35, 35, 25, 93, 35, 35, 35, 35, 35, 35, 35, 35,
+   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,
@@ -2247,653 +2262,663 @@ _hb_ucd_u8[32102] =
    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 94,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19, 19, 19,
+   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, 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,
+   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,  4,  4,  2,  2,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    4,  4,  4,  4,  4,  0,  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,
+    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,  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,  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,
+   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,
+    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,
     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,  0,  3,  3, 37, 37, 37, 37,
-   37, 37, 37, 37, 37, 37, 37, 37, 37, 37,  2, 37, 37, 37, 37, 37,
+    3,  3,  3,  0,  3,  3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+   37, 37, 37, 37,  2, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
-   37, 37, 37, 37, 37, 37, 37,  2,  2, 37, 37, 37, 38, 38, 38, 38,
-   38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,  2,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 64, 64, 64, 64,
+   37,  2,  2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+   38, 38, 38, 38, 38, 38, 38, 38,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-   64, 64, 64, 64, 64, 64, 64,  2,  2, 64, 64, 64, 90, 90, 90, 90,
+   64,  2,  2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
    90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
-   90, 90, 90, 90, 90, 90, 90, 90, 90, 90,  2,  2, 90, 90, 90, 90,
-   90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,  2, 95, 95, 95, 95,
+   90, 90, 90, 90,  2,  2, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+   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, 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,  2,  2,  2,  2,  2,  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,  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,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    0,  0,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  5,  5,  5,  5,
-    2,  5,  5,  5,  5,  5,  5,  5,  5,  2,  2,  5,  5,  2,  2,  5,
+   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,
+    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,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  0,  0,  7,  7,  7,  7,
+    7,  7,  7,  7,  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,  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,  5,  5,  5,  5,  2,  2,  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,  5,  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,  2,
-    2,  2,  5,  5,  5,  5,  2,  2,  5,  5,  5,  5,  5,  5,  5,  5,
-    5,  2,  2,  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,  5,  5,  5,  5,  5,
-    5,  5,  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, 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, 11, 11,  2,
-    2,  2,  2, 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, 11, 11, 11, 11, 11,
-   11, 11, 11,  2,  2,  2,  2,  2,  2,  2,  2,  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, 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, 10, 10,
-   10, 10,  2, 10, 10, 10,  2, 10, 10, 10,  2,  2, 10,  2,  2,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 10, 10, 10, 10,
-    2,  2, 10, 10, 10, 10, 10, 10, 10, 10, 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, 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, 21, 21, 21,
-   21,  2,  2, 21, 21,  2,  2, 21, 21, 21,  2,  2,  2,  2,  2,  2,
-    2,  2, 21, 21,  2,  2,  2,  2, 21, 21,  2, 21, 21, 21, 21, 21,
-    2,  2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21,  2,  2,  2,  2,  2,  2,  2,  2,  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,  2,  2,  2, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22,  2,  2,  2,  2, 22, 22, 22, 22, 22,  2,
-    2,  2, 22, 22, 22,  2, 22, 22, 22, 22,  2,  2, 22,  2,  2,  2,
-    2,  2,  2, 22,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    2,  2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 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,
+    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, 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, 11, 11,  2,  2,  2,  2, 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, 11, 11, 11, 11, 11, 11, 11, 11,  2,  2,  2,
+    2,  2,  2,  2,  2,  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, 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, 10, 10, 10, 10,  2, 10, 10, 10,
+    2, 10, 10, 10,  2,  2, 10,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 10, 10, 10, 10,  2,  2, 10, 10, 10, 10,
+   10, 10, 10, 10, 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, 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, 21, 21, 21, 21,  2,  2, 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, 21, 21,
+   21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  2,  2,
+    2,  2,  2,  2,  2,  2,  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,  2,  2,  2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+    2,  2,  2,  2, 22, 22, 22, 22, 22,  2,  2,  2, 22, 22, 22,  2,
+   22, 22, 22, 22,  2,  2, 22,  2,  2,  2,  2,  2,  2, 22,  2,  2,
+    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 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,
+   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,
-   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, 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, 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, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 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, 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, 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,
-    2, 20, 20, 20, 20, 20, 20, 20, 20,  2, 20, 20, 20,  2, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 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,
+    2,  2,  2, 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, 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,
+   16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 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, 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,
+   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,
    20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-    2,  2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,  2,  2, 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, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,  2, 36,
-   36, 36, 36, 36, 36, 36, 36, 36,  2, 36,  2,  2, 36, 36, 36, 36,
-   36, 36, 36,  2,  2,  2, 36,  2,  2,  2,  2, 36, 36, 36, 36, 36,
-   36,  2, 36,  2, 36, 36, 36, 36, 36, 36, 36, 36,  2,  2,  2,  2,
-    2,  2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,  2,  2, 36, 36,
-   36,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 24, 24, 24,
+   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, 20, 20, 20, 20, 20, 20, 20, 20,  2,  2, 20, 20, 20, 20,
+   20, 20, 20, 20, 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, 36, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36, 36,  2, 36, 36, 36, 36, 36, 36, 36,
+   36, 36,  2, 36,  2,  2, 36, 36, 36, 36, 36, 36, 36,  2,  2,  2,
+   36,  2,  2,  2,  2, 36, 36, 36, 36, 36, 36,  2, 36,  2, 36, 36,
+   36, 36, 36, 36, 36, 36,  2,  2,  2,  2,  2,  2, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36,  2,  2, 36, 36, 36,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  2, 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, 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, 18,  2, 18, 18, 18, 18, 18, 18, 18, 18,
+   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,
+   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,
-    2, 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,  2,  2, 18, 18, 18, 18,
-   18,  2, 18,  2, 18, 18, 18, 18, 18, 18,  2,  2, 18, 18, 18, 18,
-   18, 18, 18, 18, 18, 18,  2,  2, 18, 18, 18, 18, 25, 25, 25, 25,
+   18, 18, 18, 18,  2,  2, 18, 18, 18, 18, 18,  2, 18,  2, 18, 18,
+   18, 18, 18, 18,  2,  2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+    2,  2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+   25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,  2, 25,
    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-   25, 25, 25, 25,  2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-   25, 25, 25, 25, 25, 25, 25, 25, 25,  2,  2,  2,  2, 25, 25, 25,
+   25, 25, 25,  2,  2,  2,  2, 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,  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, 33, 33, 33, 33, 33, 33, 33, 33,  8,  8,  8,  8,
-    8,  8,  8,  8,  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,  8,
-    8,  8,  8,  8,  8,  8,  8,  0,  8,  8,  8,  8, 12, 12, 12, 12,
-   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, 30, 30,
+   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, 33, 33,
+   33, 33, 33, 33, 33, 33,  8,  8,  8,  8,  8,  8,  8,  8,  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,  8,  8,  8,  8,  8,  8,  8,
+    8,  0,  8,  8,  8,  8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+   30, 30, 30, 30, 30, 30, 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,  2,
+   30, 30, 30, 30,  2,  2, 30,  2, 30, 30, 30, 30,  2,  2, 30, 30,
+   30, 30, 30, 30, 30,  2, 30,  2, 30, 30, 30, 30,  2,  2, 30, 30,
+   30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,  2, 30, 30,
    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 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,  2, 30, 30, 30, 30,  2,  2, 30,  2, 30, 30,
-   30, 30,  2,  2, 30, 30, 30, 30, 30, 30, 30,  2, 30,  2, 30, 30,
-   30, 30,  2,  2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-   30, 30, 30,  2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-   30, 30, 30, 30, 30, 30, 30,  2,  2, 30, 30, 30, 30, 30, 30, 30,
-   30, 30, 30, 30, 30, 30, 30, 30, 30,  2,  2,  2, 30, 30, 30, 30,
-   30, 30, 30, 30, 30, 30,  2,  2,  2,  2,  2,  2, 29, 29, 29, 29,
-   29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-   29, 29,  2,  2, 29, 29, 29, 29, 29, 29,  2,  2, 28, 28, 28, 28,
-   28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34, 34, 34,
+   30,  2,  2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+   30, 30, 30,  2,  2,  2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+    2,  2,  2,  2,  2,  2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+   29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,  2,  2, 29, 29,
+   29, 29, 29, 29,  2,  2, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+   28, 28, 28, 28, 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34,  2,  2,  2, 35, 35, 35, 35,
+   34, 34, 34,  2,  2,  2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
    35, 35, 35, 35, 35, 35, 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, 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,  2,  2,  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,  2,  2,  2,  2,  2,  2,  2,  2, 31, 31, 31, 31,
+   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,
+   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,
+    2,  2,  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,  2,  2,
+    2,  2,  2,  2,  2,  2, 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, 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,  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, 32,  2,  2,  2,  2,  2, 28, 28, 28, 28,
-   28, 28,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 48, 48, 48, 48,
+   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,
+    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,
+   32,  2,  2,  2,  2,  2, 28, 28, 28, 28, 28, 28,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 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,  2, 48, 48, 48, 48,
-   48, 48, 48, 48, 48, 48, 48, 48,  2,  2,  2,  2, 48,  2,  2,  2,
-   48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 52, 52, 52,
+   48, 48, 48, 48, 48,  2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+   48, 48,  2,  2,  2,  2, 48,  2,  2,  2, 48, 48, 48, 48, 48, 48,
+   48, 48, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
-   52, 52, 52, 52, 52, 52, 52, 52, 52, 52,  2,  2, 52, 52, 52, 52,
-   52,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 58, 58, 58, 58,
+   52, 52, 52, 52,  2,  2, 52, 52, 52, 52, 52,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
    58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
-   58, 58, 58, 58, 58, 58, 58, 58,  2,  2,  2,  2, 58, 58, 58, 58,
-   58, 58, 58, 58, 58, 58,  2,  2,  2,  2,  2,  2, 58, 58, 58, 58,
-   58, 58, 58, 58, 58, 58, 58,  2,  2,  2, 58, 58, 54, 54, 54, 54,
+   58, 58,  2,  2,  2,  2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+    2,  2,  2,  2,  2,  2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58,  2,  2,  2, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
    54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
-   54, 54, 54, 54, 54, 54, 54, 54,  2,  2, 54, 54, 91, 91, 91, 91,
+   54, 54,  2,  2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
    91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
-   91, 91, 91, 91, 91, 91, 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,  1,  1,  1,
-    1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2, 62, 62, 62, 62,
+   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,
    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, 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, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70,  2,  2,  2, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70, 70, 70,  2,  2,  2, 70, 70, 70, 73, 73, 73, 73,
-   73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,  6,  6,  6,  6,
-    6,  6,  6,  6,  6,  2,  2,  2,  2,  2,  2,  2,  8,  8,  8,  8,
-    8,  8,  8,  8,  8,  8,  8,  2,  2,  8,  8,  8, 76, 76, 76, 76,
-   76, 76, 76, 76,  2,  2,  2,  2,  2,  2,  2,  2,  1,  1,  1,  0,
-    1,  1,  1,  1,  1,  1,  1,  1,  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, 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, 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,  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,
+   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,
+   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,
+   70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,  2,  2,
+    2, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+    2,  2,  2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+   73, 73, 73, 73, 73, 73,  6,  6,  6,  6,  6,  6,  6,  6,  6,  2,
+    2,  2,  2,  2,  2,  2,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+    8,  2,  2,  8,  8,  8, 76, 76, 76, 76, 76, 76, 76, 76,  2,  2,
+    2,  2,  2,  2,  2,  2,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,
+    1,  1,  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, 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, 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,
+    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,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  2,  9,  9,  9,  9,
-    9,  2,  9,  9,  9,  9,  9,  9,  9,  9,  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,
-    0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,
-    0,  2,  0,  0,  0,  0,  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,  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,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,
-    0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2, 27, 27, 27, 27,
-   27, 27, 27, 27, 27, 27, 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,  2,  0,  0,  0,  0,  0,  0,  0,  0, 56, 56, 56, 56,
+    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,  0,  0,  0,  0,  0,  0,
+    0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,
+    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,  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,
+    0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  2,  2,  2,  2,  2, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+   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, 56, 56, 56, 56, 56, 56,  2, 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, 13, 13, 13, 13,
+   56, 56, 56, 56, 56,  2, 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,
    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,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,
-    0, 13,  0, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 13, 13,
-   13, 13, 13, 13, 13, 13,  1,  1,  1,  1, 12, 12,  0,  0,  0,  0,
-    0,  0,  0,  0, 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,
+    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,
+    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0, 13,  0, 13,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    1,  1,  1,  1, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0, 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, 15, 15,  2,  2,  1,  1,  0,  0, 15, 15, 15,  0, 17, 17, 17,
+   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, 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,  0,  0, 17, 17, 17,  2,  2,  2,  2,
-    2, 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,  2, 12, 12, 12,
+   17,  0,  0, 17, 17, 17,  2,  2,  2,  2,  2, 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,  2, 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,  2, 26, 26, 26, 26,
-   26, 26, 26, 26, 26, 26, 26,  2,  2,  2,  2,  2,  0,  0,  0,  0,
-    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,  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, 39, 39, 39, 39,
+   12, 12, 12, 12, 12,  2,  0,  0,  0,  0,  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,  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,
    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, 86, 86, 86, 86, 86, 86, 77, 77, 77, 77,
+   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,
+   86, 86, 86, 86, 86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
-   77, 77, 77, 77, 77, 77, 77, 77,  2,  2,  2,  2, 79, 79, 79, 79,
-   79, 79, 79, 79, 79, 79, 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,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2, 19, 19, 19, 19, 19, 19, 19, 19, 19, 60, 60, 60, 60,
+   77, 77,  2,  2,  2,  2, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+   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,
+   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, 60, 60, 60, 60, 60,  2,  2,  2,  2,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2, 65, 65, 65, 65,
-   65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
-   65, 65, 65, 65,  2,  2,  2,  2,  2,  2,  2,  2, 75, 75, 75, 75,
-   75, 75, 75, 75, 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, 75, 75,
-   75, 75, 75, 75, 75, 75,  2,  2,  2,  2,  2,  2, 69, 69, 69, 69,
+   60, 60, 60,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    2,  2,  2,  2,  2,  2, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+   65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,  2,  2,
+    2,  2,  2,  2,  2,  2, 75, 75, 75, 75, 75, 75, 75, 75, 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, 75, 75, 75, 75, 75, 75, 75, 75,
+    2,  2,  2,  2,  2,  2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
    69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
-   69, 69, 69, 69, 69, 69, 69, 69, 69, 69,  0, 69, 74, 74, 74, 74,
-   74, 74, 74, 74, 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, 12, 12, 12, 12, 12, 12, 12, 12,  2,  2,  2, 84, 84, 84, 84,
+   69, 69, 69, 69,  0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 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, 12, 12, 12, 12, 12,
+   12, 12, 12,  2,  2,  2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
    84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
-   84, 84, 84, 84, 84, 84, 84, 84, 84, 84,  2,  0, 84, 84, 84, 84,
-   84, 84, 84, 84, 84, 84,  2,  2,  2,  2, 84, 84, 33, 33, 33, 33,
-   33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,  2, 68, 68, 68, 68,
-   68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-   68, 68, 68,  2,  2,  2,  2,  2,  2,  2,  2,  2, 68, 68, 68, 68,
-   68, 68, 68, 68, 68, 68, 68, 68, 68, 68,  2,  2, 68, 68, 68, 68,
-   68, 68, 68, 68, 68, 68,  2,  2, 68, 68, 68, 68, 92, 92, 92, 92,
-   92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,  2,
+   84, 84, 84, 84,  2,  0, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+    2,  2,  2,  2, 84, 84, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+   33, 33, 33, 33, 33,  2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+   68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+   68, 68, 68, 68,  2,  2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+    2,  2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+   92, 92, 92, 92, 92, 92, 92, 92, 92,  2,  2,  2,  2,  2,  2,  2,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  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, 87, 87, 87, 87, 87,
-   87, 87, 87,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 30, 30, 30,
-   30, 30, 30,  2,  2, 30, 30, 30, 30, 30, 30,  2,  2, 30, 30, 30,
-   30, 30, 30,  2,  2,  2,  2,  2,  2,  2,  2,  2, 19, 19, 19, 19,
-   19, 19, 19, 19, 19, 19, 19,  0, 19, 19, 19, 19, 19, 19, 19, 19,
-   19,  9, 19, 19,  2,  2,  2,  2,  2,  2,  2,  2, 87, 87, 87, 87,
-   87, 87, 87, 87, 87, 87, 87, 87, 87, 87,  2,  2, 87, 87, 87, 87,
-   87, 87, 87, 87, 87, 87,  2,  2,  2,  2,  2,  2, 12, 12, 12, 12,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 12, 12, 12, 12,
-   12, 12, 12,  2,  2,  2,  2, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-   12, 12, 12, 12, 12, 12, 12, 12,  2,  2,  2,  2, 13, 13, 13, 13,
-   13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2,  2, 13, 13, 13, 13,
-   13, 13, 13, 13, 13, 13,  2,  2,  2,  2,  2,  2, 19, 19, 19, 19,
-   19, 19, 19,  2,  2,  2,  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,
+    2, 92, 92, 92, 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+   87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  2, 30, 30, 30, 30, 30, 30,  2,  2, 30,
+   30, 30, 30, 30, 30,  2,  2, 30, 30, 30, 30, 30, 30,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19, 19, 19, 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, 87, 87, 87, 87,
+   87, 87, 87, 87,  2,  2, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+    2,  2,  2,  2,  2,  2, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 12, 12, 12, 12, 12, 12, 12,  2,  2,  2,
+    2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   12, 12,  2,  2,  2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13,  2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    2,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19, 19,  2,  2,  2,
+    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,
     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,  2,  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,  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,  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, 17, 17, 17, 17,  0,  0,  2,  2, 12, 12,
-   12, 12, 12, 12,  2,  2, 12, 12, 12, 12, 12, 12,  2,  2, 12, 12,
-   12, 12, 12, 12,  2,  2, 12, 12, 12,  2,  2,  2,  0,  0,  0,  0,
-    0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,
-    2,  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,
+    3,  3,  3,  3,  2,  2,  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,
+    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,
+   17, 17, 17, 17,  0,  0,  2,  2, 12, 12, 12, 12, 12, 12,  2,  2,
+   12, 12, 12, 12, 12, 12,  2,  2, 12, 12, 12, 12, 12, 12,  2,  2,
+   12, 12, 12,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,
+    0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  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, 49, 49, 49,
+   49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,  2, 49, 49,
    49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
-   49, 49, 49,  2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
-   49, 49, 49, 49, 49, 49, 49,  2, 49, 49,  2, 49, 49, 49, 49, 49,
-   49, 49, 49, 49, 49, 49, 49, 49, 49, 49,  2,  2, 49, 49, 49, 49,
-   49, 49, 49, 49, 49, 49, 49,  2,  2,  2,  2,  2,  0,  0,  0,  2,
-    2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  9,  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,  0,  0,  0,  1,  2,  2, 71, 71, 71, 71,
+   49,  2, 49, 49,  2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+   49, 49, 49, 49,  2,  2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+   49,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  2,  2,  2,  9,  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,
+    0,  0,  0,  1,  2,  2, 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,
-   71, 71, 71, 71, 71, 71, 71, 71, 71,  2,  2,  2, 67, 67, 67, 67,
-   67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,  2,  2,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  1,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 42, 42, 42, 42,
-   42, 42, 42, 42, 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,
+   71, 71, 71,  2,  2,  2, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+   67, 67, 67, 67, 67, 67, 67,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 42, 42, 42, 42, 42, 42, 42, 42, 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, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-   41, 41, 41, 41, 41, 41, 41,  2,  2,  2,  2,  2,118,118,118,118,
+   41,  2,  2,  2,  2,  2,118,118,118,118,118,118,118,118,118,118,
   118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,
-  118,118,118,118,118,118,118,  2,  2,  2,  2,  2, 53, 53, 53, 53,
+  118,  2,  2,  2,  2,  2, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
    53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 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, 59, 59, 59, 59, 59, 59, 59, 59,
-    2,  2,  2,  2, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 40, 40, 40, 40,
-   40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, 51, 51,
-   51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50,
+   53, 53, 53, 53,  2, 53, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+   59, 59, 59, 59, 59, 59, 59, 59, 59, 59,  2,  2,  2,  2, 59, 59,
+   59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+   40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+   51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
    50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
-   50, 50, 50, 50, 50, 50, 50, 50, 50, 50,  2,  2, 50, 50, 50, 50,
-   50, 50, 50, 50, 50, 50,  2,  2,  2,  2,  2,  2,135,135,135,135,
+   50, 50, 50, 50,  2,  2, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+    2,  2,  2,  2,  2,  2,135,135,135,135,135,135,135,135,135,135,
+  135,135,135,135,135,135,135,135,135,135,  2,  2,  2,  2,135,135,
   135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
-    2,  2,  2,  2,135,135,135,135,135,135,135,135,135,135,135,135,
-  135,135,135,135,135,135,135,135,  2,  2,  2,  2,106,106,106,106,
-  106,106,106,106,106,106,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,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, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+  135,135,  2,  2,  2,  2,106,106,106,106,106,106,106,106,106,106,
+  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,
+  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,
    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, 81, 81, 81, 81, 81, 81,
-   81, 81,  2, 81, 81, 81, 81, 81, 81, 81, 81, 81,120,120,120,120,
-  120,120,120,120,120,120,120,120,120,120,120,120,116,116,116,116,
+   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, 81, 81, 81, 81, 81, 81, 81, 81,  2, 81, 81, 81,
+   81, 81, 81, 81, 81, 81,120,120,120,120,120,120,120,120,120,120,
+  120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116,
   116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
-  116,116,116,116,116,116,116,116,116,116,116,  2,  2,  2,  2,  2,
-    2,  2,  2,116,116,116,116,116,116,116,116,116,128,128,128,128,
-  128,128,128,128,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,
+  116,116,116,116,116,  2,  2,  2,  2,  2,  2,  2,  2,116,116,116,
+  116,116,116,116,116,116,128,128,128,128,128,128,128,128,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, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-   66, 66, 66, 66, 66, 66, 66, 66,  2,  2,  2, 66, 72, 72, 72, 72,
+   66, 66,  2,  2,  2, 66, 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,  2,  2,  2,  2,  2, 72, 98, 98, 98, 98,
-   98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97,
-   97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
-   97, 97, 97, 97,  2,  2,  2,  2, 97, 97, 97, 97,  2,  2, 97, 97,
-   97, 97, 97, 97, 97, 97, 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,
+    2,  2,  2,  2,  2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
+   98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
+   97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,  2,  2,
+    2,  2, 97, 97, 97, 97,  2,  2, 97, 97, 97, 97, 97, 97, 97, 97,
+   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,  2,  2, 57, 57, 57,  2,  2,  2,  2, 57, 57, 57, 57, 57,
-   57, 57, 57, 57, 57,  2,  2,  2,  2,  2,  2,  2, 88, 88, 88, 88,
-   88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,117,117,117,117,
-  117,117,117,117,117,117,117,117,117,117,117,117,112,112,112,112,
-  112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-  112,112,112,  2,  2,  2,  2,112,112,112,112,112,112,112,112,112,
-  112,112,112,  2,  2,  2,  2,  2,  2,  2,  2,  2, 78, 78, 78, 78,
-   78, 78, 78, 78, 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, 83, 83, 83, 83, 83, 83,
-   83, 83,  2,  2, 83, 83, 83, 83, 83, 83, 83, 83, 82, 82, 82, 82,
-   82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,  2,
-    2,  2,  2,  2, 82, 82, 82, 82, 82, 82, 82, 82,122,122,122,122,
-  122,122,122,122,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,  2,  2,  2,
-    2,  2,  2,  2,  2,122,122,122,122,122,122,122, 89, 89, 89, 89,
-   89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 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,130,130,130,130,130,130,130,130,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,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,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,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,
+   57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,  2,  2, 57, 57,
+   57,  2,  2,  2,  2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,  2,
+    2,  2,  2,  2,  2,  2, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
+   88, 88, 88, 88, 88, 88,117,117,117,117,117,117,117,117,117,117,
+  117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112,
+  112,112,112,112,112,112,112,112,112,112,112,112,112,  2,  2,  2,
+    2,112,112,112,112,112,112,112,112,112,112,112,112,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 78, 78, 78, 78, 78, 78, 78, 78, 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, 83, 83, 83, 83, 83, 83, 83, 83,  2,  2, 83, 83,
+   83, 83, 83, 83, 83, 83, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+   82, 82, 82, 82, 82, 82, 82, 82, 82,  2,  2,  2,  2,  2, 82, 82,
+   82, 82, 82, 82, 82, 82,122,122,122,122,122,122,122,122,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,  2,  2,  2,  2,  2,  2,  2,  2,122,
+  122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+   89, 89, 89, 89, 89, 89, 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,130,130,130,130,130,130,130,130,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,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,
+  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,
+  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,
-  148,148,148,148,148,148,  2,  2,  2,  2,  2,  2,149,149,149,149,
-  149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
-  149,149,149,  2,  2,  2,  2,  2,  2,  2,  2,  2, 94, 94, 94, 94,
+    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,
+  149,149,149,149,149,149,149,149,149,149,149,149,149,  2,  2,  2,
+    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, 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,  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,  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,  2,  2,  2,  2,  2,  2, 96, 96, 96, 96,
-   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   96,  2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96,  2,  2,  2,  2,  2,  2,  2,  2,  2,111,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
-  111,111,111,  2,  2,  2,  2,  2,  2,  2,  2,  2,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,  2,  2,  2, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,108,108,108,108,
-  108,108,108,108,108,108,108,108,108,108,108,108,108,108,  2,108,
+   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,
+    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,
+    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,
+    2,  2,  2,  2,  2,  2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  2, 96, 96, 96, 96,
+   96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  2,  2,
+    2,  2,  2,  2,  2,  2,111,111,111,111,111,111,111,111,111,111,
+  111,111,111,111,111,111,111,111,111,111,111,111,111,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,100,100,100,100,100,100,100,100,100,100,
+  100,100,100,100,100,100,  2, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,108,108,108,108,108,108,108,108,108,108,
+  108,108,108,108,108,108,108,108,  2,108,108,108,108,108,108,108,
   108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,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,129,129,
-  129,129,129,129,129,129,  2,  2,  2,  2,  2,  2,109,109,109,109,
+  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,129,129,129,129,129,129,129,129,
+    2,  2,  2,  2,  2,  2,109,109,109,109,109,109,109,109,109,109,
   109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-  109,109,109,109,109,109,109,  2,  2,  2,  2,  2,109,109,109,109,
-  109,109,109,109,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,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,107,107,107,
-  107,  2,  2,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,107,107,107,107,
-  107,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,137,137,137,137,
+  109,  2,  2,  2,  2,  2,109,109,109,109,109,109,109,109,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,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,107,107,107,107,  2,  2,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,107,107,107,107,107,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,137,137,137,137,137,137,137,137,137,137,
   137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
-  137,137,137,137,137,137,  2,137,  2,137,137,137,124,124,124,124,
-  124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,
-  124,124,124,124,  2,  2,  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,
+  137,137,  2,137,137,137,137,137,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,124,124,124,124,124,124,124,124,124,124,
+  124,124,124,124,124,124,124,124,124,124,124,124,124,124,  2,  2,
+    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,123,123,123,123,123,123,123,123,  2,  2,123,123,
   123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,
-  123,123,  2,  2,123,123,123,123,123,123,123,123,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,114,114,114,114,114,114,114,
-  114,  2,  2,  2,  2,  2,  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,  2,  2,  2,  2,  2,  2,126,126,126,126,
+  123,123,123,123,  2,  2,114,114,114,114,114,114,114,114,114,114,
+  114,114,114,114,114,114,114,114,114,114,114,  2,  2,  2,  2,  2,
+    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,
+    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,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,
+  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,
   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,  2,  2,  2,  2,  2,125,150,150,150,150,
-  150,150,150,150,  2,  2,150,150,150,150,150,150,150,150,150,150,
+  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,
+    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,154,154,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,154,154,154,154,154,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,154,154,154,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,150,150,150,150,150,
-  150,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,141,141,141,141,
-  141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
-  141,141,141,141,  2,  2,  2,  2,  2,  2,  2,  2,140,140,140,140,
-  140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,121,121,121,121,
-  121,121,121,121,121,121,121,121,121,121,121,121,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,
+  150,150,150,150,150,150,150,150,150,150,150,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,141,141,141,141,141,141,141,141,141,141,
+  141,141,141,141,141,141,141,141,141,141,141,141,141,141,  2,  2,
+    2,  2,  2,  2,  2,  2,140,140,140,140,140,140,140,140,140,140,
+  140,140,140,140,140,140,140,140,140,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,121,121,121,121,121,121,121,121,121,121,
+  121,121,121,121,121,121,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,133,133,133,
-  133,133,133,  2,133,133,133,133,133,133,133,133,133,133,133,133,
-  133,133,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,133,133,133,133,
-  133,133,133,133,133,133,133,133,133,  2,  2,  2,134,134,134,134,
-  134,134,134,134,134,134,134,134,134,134,134,134,  2,  2,134,134,
-  134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
-  134,134,134,134,  2,134,134,134,134,134,134,134,134,134,134,134,
-  134,134,134,  2,  2,  2,  2,  2,  2,  2,  2,  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,138,138,138,138,138,138,138,138,138,138,138,138,
-  138,138,138,  2,  2,  2,138,  2,138,138,  2,138,138,138,138,138,
-  138,138,138,138,  2,  2,  2,  2,  2,  2,  2,  2,138,138,138,138,
-  138,138,138,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,
+  133,133,133,133,133,133,133,133,133,133,133,133,133,  2,133,133,
+  133,133,133,133,133,133,133,133,133,133,133,133,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,133,133,133,133,133,133,133,133,133,133,
+  133,133,133,  2,  2,  2,134,134,134,134,134,134,134,134,134,134,
+  134,134,134,134,134,134,  2,  2,134,134,134,134,134,134,134,134,
+  134,134,134,134,134,134,134,134,134,134,134,134,134,134,  2,134,
+  134,134,134,134,134,134,134,134,134,134,134,134,134,  2,  2,  2,
+    2,  2,  2,  2,  2,  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,138,138,
+  138,138,138,138,138,138,138,138,138,138,138,138,138,  2,  2,  2,
+  138,  2,138,138,  2,138,138,138,138,138,138,138,138,138,  2,  2,
+    2,  2,  2,  2,  2,  2,138,138,138,138,138,138,138,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,143,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,143,143,
-  143,143,143,143,143,143,  2,  2,  2,  2,  2,  2,145,145,145,145,
-  145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,
-  145,145,145,145,145,  2,  2,  2,  2,  2,  2,  2, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,  2,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 22, 63, 63, 63, 63,
+  143,143,143,143,143,  2,143,143,  2,143,143,143,143,143,143,  2,
+    2,  2,  2,  2,  2,  2,143,143,143,143,143,143,143,143,143,143,
+    2,  2,  2,  2,  2,  2,145,145,145,145,145,145,145,145,145,145,
+  145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,  2,
+    2,  2,  2,  2,  2,  2, 86,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 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,
    63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
-   63, 63, 63, 63, 63, 63,  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, 80, 80, 80, 80,
+    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, 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, 80, 80, 80, 80, 80, 80,  2, 80, 80, 80, 80,
-   80, 80, 80, 80, 80,  2,  2,  2,  2,  2,  2,  2,127,127,127,127,
-  127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
-  127,127,127,  2,  2,  2,  2,  2,  2,  2,  2,  2, 79, 79, 79, 79,
-   79, 79, 79, 79, 79,  2,  2,  2,  2,  2,  2,  2,115,115,115,115,
+   80, 80, 80, 80, 80,  2, 80, 80, 80, 80, 80, 80, 80, 80, 80,  2,
+    2,  2,  2,  2,  2,  2,127,127,127,127,127,127,127,127,127,127,
+  127,127,127,127,127,127,127,127,127,127,127,127,127,  2,  2,  2,
+    2,  2,  2,  2,  2,  2, 79, 79, 79, 79, 79, 79, 79, 79, 79,  2,
+    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,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,
+  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,
   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,119,119,119,119,119,119,119,119,119,119,
-  119,119,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,119,119,119,119,
-  119,119,119,119,119,119,  2,119,119,119,119,119,119,119,  2,119,
-  119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,
-  119,119,119,119,  2,  2,  2,  2,  2,119,119,119,146,146,146,146,
+  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,
+  119,119,119,119,119,119,119,119,119,119,119,119,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,  2,119,119,119,119,119,119,119,119,119,119,
+    2,119,119,119,119,119,119,119,  2,119,119,119,119,119,119,119,
+  119,119,119,119,119,119,119,119,119,119,119,119,119,119,  2,  2,
+    2,  2,  2,119,119,119,146,146,146,146,146,146,146,146,146,146,
   146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,
-  146,146,146,146,146,146,146,  2,  2,  2,  2,  2, 99, 99, 99, 99,
+  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, 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,
-    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,136,136,136,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 17, 15, 15, 15,
+   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,  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, 15, 15, 15, 15, 15, 15,  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,
+   15, 15, 15, 15, 15,  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,
-  139,139,139,139,139,139,139,139,  2,  2,  2,  2,105,105,105,105,
+  139,139,  2,  2,  2,  2,105,105,105,105,105,105,105,105,105,105,
   105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,
-  105,105,105,105,105,105,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,  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,  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,  2,  0,  2,  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,  2,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,
-    0,  2,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,
-    0,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  0,  0,131,131,131,131,
+  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,  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,
+    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,
+    2,  0,  2,  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,  2,  0,  0,  0,
+    0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,
+    0,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  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,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  2,  2,  0,  0,131,131,131,131,131,131,131,131,131,131,
   131,131,131,131,131,131,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, 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,
+  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,
+   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,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,
+  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,
   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,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,
+    2,  2,  2,  2,  2,152,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,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,  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,  2,  3,  2,  3,  3,  3,  2,  3,  3,  2,
-    3,  2,  2,  3,  2,  3,  2,  3,  2,  3,  2,  3,  2,  3,  3,  2,
-    3,  2,  2,  3,  3,  3,  3,  2,  3,  3,  3,  3,  3,  3,  3,  2,
-    3,  3,  3,  3,  2,  3,  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,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  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,  0,  0,  0,  2,  0,  0,  0,  0,  0,  2,  0,
-    0,  0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,
-    2,  0,  0,  0,  0,  0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,
-    2,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  2,  0,  0,  0,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 13, 13, 13, 13,
-   13, 13, 13,  2,  2,  2,  2,  2,  2,  2,  2,  2, 13, 13, 13, 13,
-   13,  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, 13,  2,  2,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  1,
-    2,  3,  4,  5,  6,  0,  0,  0,  0,  7,  8,  9, 10, 11,  0, 12,
-    0,  0,  0,  0, 13,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,
-   15, 16,  0, 17, 18, 19,  0,  0,  0, 20, 21, 22,  0, 23,  0, 24,
-    0, 25,  0, 26,  0,  0,  0,  0,  0, 27, 28,  0, 29,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+  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,
+    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,
+    2,  3,  2,  3,  3,  3,  2,  3,  3,  2,  3,  2,  2,  3,  2,  3,
+    2,  3,  2,  3,  2,  3,  2,  3,  3,  2,  3,  2,  2,  3,  3,  3,
+    3,  2,  3,  3,  3,  3,  3,  3,  3,  2,  3,  3,  3,  3,  2,  3,
+    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,
+    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,  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,
+    2,  2,  2,  2,  2,  2,  0,  0,  0,  1,  2,  3,  4,  5,  6,  0,
+    0,  0,  0,  7,  8,  9, 10, 11,  0, 12,  0,  0,  0,  0, 13,  0,
+    0, 14,  0,  0,  0,  0,  0,  0,  0,  0, 15, 16,  0, 17, 18, 19,
+    0,  0,  0, 20, 21, 22,  0, 23,  0, 24,  0, 25,  0, 26,  0,  0,
+    0,  0,  0, 27, 28,  0, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 30, 31,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 32, 33, 34, 35, 36, 37, 38, 39, 40,  0,  0,  0,
-   41,  0, 42, 43, 44, 45, 46, 47, 48,  0,  0,  0,  0,  0,  0,  0,
     0,  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,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 50, 51, 52,
+    0,  0, 30, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32, 33,
+   34, 35, 36, 37, 38, 39, 40,  0,  0,  0, 41,  0, 42, 43, 44, 45,
+   46, 47, 48,  0,  0,  0,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 50, 51, 52,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -2943,14 +2968,15 @@ _hb_ucd_u8[32102] =
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   53, 54, 55, 56, 57, 58, 59, 60, 61, 62,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 53, 54, 55, 56, 57, 58,
+   59, 60, 61, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 63,  0,
-   64,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,  0,  0,  0, 63,  0, 64,  0,  0,  0,  0,  0,
+    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, 68,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -2996,8 +3022,8 @@ _hb_ucd_u8[32102] =
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 69, 70, 71,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 68, 69, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -3070,11 +3096,10 @@ _hb_ucd_u8[32102] =
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  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, 72, 73, 74,
-   75, 76, 77, 78, 79,  0,
+    0,  0,  0,  0,  0,  0, 72, 73, 74, 75, 76, 77, 78, 79, 80,  0,
 };
 static const uint16_t
-_hb_ucd_u16[11168] =
+_hb_ucd_u16[11328] =
 {
      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,
@@ -3084,186 +3109,188 @@ _hb_ucd_u16[11168] =
     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,  72,  74,  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,  72,  72, 140,  48, 141, 142, 143, 144,  72,  72,
-   145, 146, 147, 148, 149,  48, 150, 151, 152, 153,  32, 154, 155, 156,  72,  72,
-    48,  48, 157, 158, 159, 160, 161, 162, 163, 164,   9,   9, 165,  11,  11, 166,
+    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,  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, 167, 168,  48,  48, 167,  48,  48, 169, 170, 171,  48,  48,
-    48, 170,  48,  48,  48, 172, 173, 174,  48, 175,   9,   9,   9,   9,   9, 176,
-   177,  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,
+    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,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48, 178,  48, 179, 180,  48,  48,  48,  48, 181, 182,
-   183, 184,  48, 185,  48, 186, 183, 187,  48,  48,  48, 188, 189, 190, 191, 192,
-   193, 191,  48,  48, 194,  48,  48, 195, 196,  48, 197,  48,  48,  48,  48, 198,
-    48, 199, 200, 201, 202,  48, 203, 204,  48,  48, 205,  48, 206, 207, 208, 208,
-    48, 209,  48,  48,  48, 210, 211, 212, 191, 191, 213, 214,  72,  72,  72,  72,
-   215,  48,  48, 216, 217, 159, 218, 219, 220,  48, 221,  64,  48,  48, 222, 223,
-    48,  48, 224, 225, 226,  64,  48, 227, 228,   9,   9, 229, 230, 231, 232, 233,
-    11,  11, 234,  27,  27,  27, 235, 236,  11, 237,  27,  27,  32,  32,  32, 238,
-    13,  13,  13,  13,  13,  13,  13,  13,  13, 239,  13,  13,  13,  13,  13,  13,
-   240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249,
-   250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260,  72, 261, 262, 263,
-   264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276,
-   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-   278, 208, 279, 208, 208, 208, 208, 280, 208, 281, 277, 282, 208, 283, 284, 208,
-   208, 208, 285,  72, 286,  72, 269, 269, 269, 287, 208, 208, 208, 208, 288, 269,
-   208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 289, 290, 208, 208, 291,
-   208, 208, 208, 208, 208, 208, 292, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-   208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277,
-   208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-   277, 277, 277, 277, 277, 277, 277, 277, 298, 299, 277, 277, 277, 300, 277, 301,
-   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
-   208, 208, 208, 277, 302, 208, 208, 303, 208, 304, 208, 208, 208, 208, 208, 208,
-     9,   9, 305,  11,  11, 306, 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,  72,  72,  72, 208, 321, 208, 208, 208, 208, 208, 322,
-   208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323,  72, 324,
-   325, 326, 327, 328, 136,  48,  48,  48,  48, 329, 177,  48,  48,  48,  48, 330,
-   331,  48,  48, 136,  48,  48,  48,  48, 199, 332,  48,  71, 208, 208, 322,  48,
-   208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208,
-   208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
+    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,
+   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,
+   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,
+   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,
+   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, 198, 208, 208, 208, 208,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 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,  72,
-    48, 337,  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,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48, 150, 208, 208, 208, 285,  48,  48, 227,
+    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,
-   338,  48, 339,  72,  13,  13, 340, 341,  13, 342,  48,  48,  48,  48, 343, 344,
-    31, 345, 346, 347,  13,  13,  13, 348, 349, 350, 351, 352, 353,  72,  72, 354,
-   355,  48, 356, 357,  48,  48,  48, 358, 359,  48,  48, 360, 361, 191,  32, 362,
-    64,  48, 363,  48, 364, 365,  48, 150,  76,  48,  48, 366, 367, 368, 369, 370,
-    48,  48, 371, 372, 373, 374,  48, 375,  48,  48,  48, 376, 377, 378, 379, 380,
-   381, 382, 315,  11,  11, 383, 384,  11,  11,  11,  11,  11,  48,  48, 385, 191,
+   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,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 386,  48, 387,  48,  48, 205,
-   388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
-   388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
-   389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-   389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-   389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+    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,
+   390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390,
+   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,
+   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, 203,  48,  48,  48,  48,  48,  48, 206,  72,  72,
-   390, 391, 392, 393, 394,  48,  48,  48,  48,  48,  48, 395, 396, 397,  48,  48,
+    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,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48, 398,  72,  48,  48,  48,  48, 399,  48,  48, 400,  72,  72, 401,
-    32, 402,  32, 403, 404, 405, 406, 407,  48,  48,  48,  48,  48,  48,  48, 408,
-   409,   2,   3,   4,   5, 410, 411, 412,  48, 413,  48, 199, 414, 415, 416, 417,
-   418,  48, 171, 419, 203, 203,  72,  72,  48,  48,  48,  48,  48,  48,  48,  71,
-   420, 269, 269, 421, 270, 270, 270, 422, 423, 324, 424,  72,  72, 208, 208, 425,
-    72,  72,  72,  72,  72,  72,  72,  72,  48, 150,  48,  48,  48, 100, 426, 427,
-    48,  48, 428,  48, 429,  48,  48, 430,  48, 431,  48,  48, 432, 433,  72,  72,
-     9,   9, 434,  11,  11,  48,  48,  48,  48, 203, 191,   9,   9, 435,  11, 436,
-    48,  48, 400,  48,  48,  48, 437,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+    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,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48, 314,  48, 198, 400,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-   438,  48,  48, 439,  48, 440,  48, 441,  48, 199, 442,  72,  72,  72,  48, 443,
-    48, 444,  48, 445,  72,  72,  72,  72,  48,  48,  48, 446, 269, 447, 269, 269,
-   448, 449,  48, 450, 451, 452,  48, 453,  48, 454,  72,  72, 455,  48, 456, 457,
-    48,  48,  48, 458,  48, 459,  48, 460,  48, 461, 462,  72,  72,  72,  72,  72,
-    48,  48,  48,  48, 195,  72,  72,  72,   9,   9,   9, 463,  11,  11,  11, 464,
-    48,  48, 465, 191,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72, 269, 466,  72,  72,  72,  72,  72,  72,  72,  72,
-    48, 454, 467,  48,  62, 468,  72,  72,  72,  72,  72,  72,  72,  72,  48, 314,
-   469,  48,  48, 470, 471, 447, 472, 473, 220,  48,  48, 474, 475,  48, 195, 191,
-   476,  48, 477, 478, 479,  48,  48, 480, 220,  48,  48, 481, 482, 483, 484, 485,
-    48,  97, 486, 487,  72,  72,  72,  72, 488, 489, 490,  48,  48, 491, 492, 191,
-   493,  83,  84, 494, 495, 496, 497, 498,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48,  48, 499, 500, 501,  72,  72,  48,  48,  48, 502, 503, 191,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  48,  48, 504, 505, 506, 507,  72,  72,
-    48,  48,  48, 508, 509, 191, 510,  72,  48,  48, 511, 512, 191,  72,  72,  72,
-    48, 172, 513, 514,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48, 486, 515,  72,  72,  72,  72,  72,  72,   9,   9,  11,  11, 147, 516,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72, 517,  48,  48, 518, 519,  72,
-   520,  48,  48, 521, 522, 523,  48,  48, 524, 525, 526,  72,  48,  48,  48, 195,
+    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,
-    84,  48, 504, 527, 528, 147, 174, 529,  48, 530, 531, 532,  72,  72,  72,  72,
-   533,  48,  48, 534, 535, 191, 536,  48, 537, 538, 191,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  48, 539,
-    72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72, 269, 540, 541, 542,
+    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,  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,
-   270, 270, 270, 270, 270, 270, 543, 544,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48, 386,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
+    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, 199, 545,  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, 314,  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, 195,  48, 199, 368,  72,  72,  72,  72,  72,  72,  48, 203, 546,
-    48,  48,  48, 547, 548, 549, 550, 551,  48,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,   9,   9,  11,  11, 269, 552,  72,  72,  72,  72,  72,  72,
-    48,  48,  48,  48, 553, 554, 555, 555, 556, 557,  72,  72,  72,  72, 558,  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,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 400,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 559,
-    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,  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,  48,
-    48, 199,  72,  72,  72, 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, 205,
+    48, 200,  72,  72,  72, 568, 569,  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, 150, 195, 561, 562,  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,
-   208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323,
-   208, 208, 563, 208, 208, 208, 564, 565, 566, 208, 567, 208, 208, 208, 568,  72,
-   208, 208, 208, 208, 569,  72,  72,  72,  72,  72,  72,  72,  72,  72, 269, 570,
-   208, 208, 208, 208, 208, 285, 269, 451,  72,  72,  72,  72,  72,  72,  72,  72,
-     9, 571,  11, 572, 573, 574, 240,   9, 575, 576, 577, 578, 579,   9, 571,  11,
-   580, 581,  11, 582, 583, 584, 585,   9, 586,  11,   9, 571,  11, 572, 573,  11,
-   240,   9, 575, 585,   9, 586,  11,   9, 571,  11, 587,   9, 588, 589, 590, 591,
-    11, 592,   9, 593, 594, 595, 596,  11, 597,   9, 598,  11, 599, 600, 600, 600,
-   208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-   208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
-    32,  32,  32, 601,  32,  32, 602, 603, 604, 605,  45,  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,
+   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, 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,
-   606, 607, 608,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    48,  48, 150, 609, 610,  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, 611, 612,
+   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, 613, 614,  72,  72,
-     9,   9, 575,  11, 615, 368,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72,  72, 484, 269, 269, 616, 617,  72,  72,  72,  72,
-   484, 269, 618, 619,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-   620,  48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205,  72,  72,  72, 629,
+    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,
-   208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323,
-   174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631,  72,  72,  72, 632, 208,
-   633, 208, 208, 324, 568, 634, 323,  72,  72,  72,  72,  72,  72,  72,  72,  72,
-   208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 635,
-   208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 631, 286,
-   208, 208, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 568, 324,  72,
-   324, 208, 208, 208, 636, 175, 208, 208, 636, 208, 637,  72,  72,  72,  72,  72,
-   638, 208, 208, 208, 208, 208, 208, 639, 208, 208, 640, 208, 641, 208, 208, 208,
-   208, 208, 208, 208, 208, 322, 637, 642, 633, 323,  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, 314,  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,
     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, 204,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48, 203,  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, 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, 643,  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,  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, 100,  72,
-    48, 203,  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, 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,
-   644,  72, 645, 645, 645, 645, 645, 645,  72,  72,  72,  72,  72,  72,  72,  72,
+    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,
-   389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-   389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 646,
-   389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
-   389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 647,
+   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, 391,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 654,
      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,
@@ -3272,31 +3299,31 @@ _hb_ucd_u16[11168] =
     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,  45,  47,  48,  27,
-    49,  49,  49,  49,  49,  50,  51,  49,  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, 110, 110, 111, 112, 113, 110, 114, 115, 116, 117, 118, 119, 120, 121,
-   122, 123, 123, 124, 123, 125,  45,  45, 126, 127, 128, 129, 130, 131,  45,  45,
-   132, 132, 132, 132, 133, 132, 134, 135, 132, 133, 132, 136, 136, 137,  45,  45,
-   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, 195,  45,  45,  45,  45,
-   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, 217,
+    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,
      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
-    11, 218,  11,  11, 218, 219,  11, 220,  11,  11,  11, 221, 221, 222,  11, 223,
-   224,   0,   0,   0,   0,   0, 225, 226, 227, 228,   0,   0,  45,   8,   8, 229,
+    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,
      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,
@@ -3307,46 +3334,46 @@ _hb_ucd_u16[11168] =
      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,
-   139, 139, 140, 243, 243, 243, 244, 245, 143, 246, 247, 247, 247, 247,  14,  14,
-     0,   0,   0,   0,   0,  45,  45,  45, 248, 249, 248, 248, 248, 248, 248, 250,
-   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251,  45, 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, 266,   0,   0, 267, 260,
-   142, 265,   0,   0,   0,   0, 142, 268,   0,   0,   0,   0,   0, 260, 260, 269,
-   260, 260, 260, 260, 260, 270,   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, 251,   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,  45,
-   271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271,
-   271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271,
-   271, 271, 271, 271, 271, 271, 271, 271, 272, 271, 271, 271, 273, 274, 274, 274,
-   275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
-   275, 275, 276,  45,  14,  14,  14,  14,  14,  14, 277, 277, 277, 277, 277, 278,
-     0,   0, 279,   4,   4,   4,   4,   4, 280,   4,   4,   4, 281,  45,  45, 282,
-   283, 283, 284, 285, 286, 286, 286, 287, 288, 288, 288, 288, 289, 290,  49,  49,
-   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, 247,   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,
+   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,
-   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,  45,  45,
-   320, 321,  21, 322, 323,  27,  27,  27,  27,  27,  27,  27, 324,  47,  27,  27,
+   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,
     27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
-    27,  27,  27, 325,  45,  27,  27,  27,  27, 326,  27,  27, 327,  45,  45, 328,
-     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,  45,  45, 342, 342, 342, 342, 342, 342, 342, 346,
-   347,   0,   0, 348,  11,  11,  11,  11, 349, 252, 350,  45,  45,   0,   0, 351,
-    45,  45,  45,  45,  45,  45,  45,  45, 352, 353, 354, 354, 354, 355, 356, 252,
+    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,
@@ -3358,101 +3385,105 @@ _hb_ucd_u16[11168] =
    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,  45,  45,  45,  45,  45,  45,  45,  45,
-   431, 431, 432, 433, 433, 434,  45,  45,  45,  45,  45,  45,  45,  45, 435, 436,
-   437, 437, 437, 437, 438, 439, 437, 440, 441, 441, 441, 441, 442, 443, 444, 445,
-   446, 446, 446, 447, 448, 449, 449, 450, 451, 451, 451, 451, 452, 451, 453, 454,
-   455, 456, 455, 457,  45,  45,  45,  45, 458, 459, 460, 461, 461, 461, 462, 463,
-   464, 465, 466, 467, 468, 469, 470, 471,  45,  45,  45,  45,  45,  45,  45,  45,
-   472, 472, 472, 472, 472, 473,  45,  45, 474, 474, 474, 474, 475, 476,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45, 477, 477, 477, 478, 477, 479,  45,  45,
-   480, 480, 480, 480, 481, 482, 483,  45, 484, 484, 484, 485, 486,  45,  45,  45,
-   487, 488, 489, 487,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   490, 490, 490, 491,  45,  45,  45,  45,  45,  45, 492, 492, 492, 492, 492, 493,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45, 494, 495, 495, 494, 496,  45,
-   497, 497, 497, 497, 498, 499, 499, 499, 499, 499, 500,  45, 501, 501, 501, 502,
+    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,
-   503, 504, 504, 505, 506, 504, 507, 508, 508, 509, 510, 511,  45,  45,  45,  45,
-   512, 513, 513, 514, 515, 516, 517, 518, 519, 520, 521,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45, 522, 523,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45, 524, 524, 524, 525,
-   526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526,
-   526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526,
-   526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526,
-   526, 526, 526, 526, 526, 526, 526, 526, 526, 527,  45,  45,  45,  45,  45,  45,
-   526, 526, 526, 526, 526, 526, 528, 529, 526, 526, 526, 526, 526, 526, 526, 526,
-   526, 526, 526, 526, 530,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531,
-   531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531,
-   531, 531, 532, 533,  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,
-   534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534,
-   534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534,
-   534, 534, 534, 534, 535,  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,
-   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, 277, 277, 277, 277, 277, 277,
-   277, 277, 277, 536, 537, 538, 539,  45,  45,  45,  45,  45,  45, 540, 541, 542,
-   543, 543, 543, 543, 544, 545, 546, 547, 543,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45, 548, 548, 548, 548, 548, 549,  45,  45,  45,  45,  45,  45,
-   550, 550, 550, 550, 551, 550, 550, 550, 552, 550,  45,  45,  45,  45, 553,  45,
-   554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554,
-   554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554,
-   554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554,
-   554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 555,
-   554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 556,
+   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,
-   557, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
-   257, 558,  45,  45,  45, 559, 560, 561, 561, 561, 561, 561, 561, 561, 561, 561,
-   561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 562,
+   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,
-   563, 563, 563, 563, 563, 563, 564, 565, 566, 567, 267,  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,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 568,
-     0,   0, 569,   0,   0,   0, 570, 571, 572,   0, 573,   0,   0,   0, 574,  45,
-    11,  11,  11,  11, 575,  45,  45,  45,  45,  45,  45,  45,  45,  45,   0, 267,
-     0,   0,   0,   0,   0, 234,   0, 574,  45,  45,  45,  45,  45,  45,  45,  45,
-     0,   0,   0,   0,   0, 225,   0,   0,   0, 576, 577, 578, 579,   0,   0,   0,
-   580, 581,   0, 582, 583, 584,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 238,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 585,   0,   0,   0,
-   586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
-   586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
-   586, 586, 586, 586, 586, 586, 586, 586, 587, 588, 589,  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,
-   590, 591, 592,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   593, 593, 594, 595, 596,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45, 597, 597, 597, 598,
+     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,
-   599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 600, 601,  45,  45,
-   602, 602, 602, 602, 603, 604,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-    45,  45,  45,  45,  45,  45,  45, 334,   0,   0,   0, 605,  45,  45,  45,  45,
-   334,   0,   0, 606,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,  45,
-   607,  27, 608, 609, 610, 611, 612, 613, 614, 615, 616, 615,  45,  45,  45, 324,
+   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,
-     0,   0, 252,   0,   0,   0,   0,   0,   0, 267, 227, 334, 334, 334,   0, 568,
-   617,   0,   0,   0,   0,   0, 617,   0,   0,   0, 617,  45,  45,  45, 618,   0,
-   619,   0,   0, 252, 574, 620, 568,  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, 568, 617, 235,
-     0,   0,   0,   0,   0,   0,   0, 267,   0,   0,   0,   0,   0, 574, 252,  45,
-   252,   0,   0,   0, 621, 285,   0,   0, 621,   0, 606,  45,  45,  45,  45,  45,
-   622,   0,   0,   0,   0,   0,   0, 623,   0,   0, 624,   0, 625,   0,   0,   0,
-     0,   0,   0,   0,   0, 267, 606, 626, 627, 568,  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,
-   248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 628,  45,  45,
-   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, 629, 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, 630, 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, 631,  45,
-   248, 318,  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,
-   632,  45,   0,   0,   0,   0,   0,   0,  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,
      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,
@@ -3727,14 +3758,18 @@ _hb_ucd_u16[11168] =
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   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,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1948,1949,
-  1950,1951,1952,1953,1954,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   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,   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,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1955,1956,1957,1959,1958,
-  1960,   0,   0,   0,   0,   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,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
@@ -3801,7 +3836,7 @@ _hb_ucd_gc (unsigned u)
 static inline uint_fast8_t
 _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[14026+(((_hb_ucd_u8[13034+(((_hb_ucd_u8[12544+(u>>4>>4)])<<4)+((u>>4)&15u))])<<4)+((u)&15u))]:0;
+  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;
 }
 static inline unsigned
 _hb_ucd_b4 (const uint8_t* a, unsigned i)
@@ -3811,24 +3846,24 @@ _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[16170+(((_hb_ucd_b4(16042+_hb_ucd_u8,u>>2>>6))<<6)+((u>>2)&63u))])<<2)+((u)&3u)]:0;
+  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;
 }
 static inline uint_fast8_t
 _hb_ucd_sc (unsigned u)
 {
-  return u<918000u?_hb_ucd_u8[18924+(((_hb_ucd_u16[3008+(((_hb_ucd_u8[17130+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:2;
+  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;
 }
 static inline uint_fast16_t
 _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[6048+(((_hb_ucd_u8[29052+(u>>6)])<<6)+((u)&63u))]:0;
+  return u<195102u?_hb_ucd_u16[6144+(((_hb_ucd_u8[29430+(u>>6)])<<6)+((u)&63u))]:0;
 }
 
 
 #elif !defined(HB_NO_UCD_UNASSIGNED)
 
 static const uint8_t
-_hb_ucd_u8[17198] =
+_hb_ucd_u8[17508] =
 {
     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,
@@ -3836,6 +3871,7 @@ _hb_ucd_u8[17198] =
    25, 26, 21, 21, 21, 21, 27, 28, 21, 21, 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, 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,
@@ -3857,13 +3893,12 @@ _hb_ucd_u8[17198] =
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
    21, 21, 21, 21, 21, 21, 21, 21, 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,
-   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,
-   14, 14, 14, 14, 14, 14, 14, 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,
    14, 14, 14, 14, 14, 14, 14, 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,
     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,
@@ -3881,33 +3916,34 @@ _hb_ucd_u8[17198] =
   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,123,143,144,
-  145,146,147,148,149,150,151,123,152,153,123,154,155,156,157,123,
-  158,159,123,160,161,162,123,123,163,164,165,166,123,167,123,168,
-   34, 34, 34, 34, 34, 34, 34,169,170, 34,171,123,123,123,123,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,172,123,123,123,123,123,123,123,
-  123,123,123,123,123,123,123,123, 34, 34, 34, 34,173,123,123,123,
-   34, 34, 34, 34,174,175,176,177,123,123,123,123,178,179,180,181,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,182,
-   34, 34, 34, 34, 34,183,123,123,123,123,123,123,123,123,123,123,
-   34, 34,184, 34, 34,185,123,123,123,123,123,123,123,123,123,123,
-  123,123,123,123,123,123,123,123,186,187,123,123,123,123,123,123,
-   69,188,189,190,191,192,193,123,194,195,196,197,198,199,200,201,
-   69, 69, 69, 69,202,203,123,123,123,123,123,123,123,123,123,123,
-  204,123,205,123,123,206,123,123,123,123,123,123,123,123,123,123,
-   34,207,208,123,123,123,123,123,209,210,211,123,212,213,123,123,
-  214,215,216,217,218,123, 69,219, 69, 69, 69, 69, 69,220,221,222,
-  223,224,225,226,227,228,123,123,123,123,123,123,123,123,123,123,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,229, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,230, 34,
-  231, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,232, 34, 34,
-   34, 34, 34, 34, 34, 34, 34,233,123,123,123,123,123,123,123,123,
-   34, 34, 34, 34,234,123,123,123,123,123,123,123,123,123,123,123,
-  235,123,236,237,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,238,
-  108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,239,
+   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,
     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,
@@ -3944,78 +3980,79 @@ _hb_ucd_u8[17198] =
    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, 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, 44, 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, 62, 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,
-   44, 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, 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, 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, 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, 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, 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,  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, 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, 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, 43, 43, 96, 36, 36, 36, 36, 36,
+   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, 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,
+   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,
+   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,
+   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,
+   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,
+    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,
+   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, 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,
@@ -4039,118 +4076,119 @@ _hb_ucd_u8[17198] =
    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,
-  133, 51,133, 43, 43, 43, 43, 43, 80, 44, 44, 44, 44, 44, 44, 44,
-   67,134, 67,135, 67, 34, 11, 16, 11, 32,135, 67, 49, 11, 11, 67,
-   67, 67,134,134,134, 11, 11,136, 11, 11, 35, 36, 39, 67, 16, 11,
-    8,  8, 49, 16, 16, 26, 67,137, 27, 27, 27, 27, 27, 27, 27, 27,
-  103,103,103,103,103,103,103,103,103,138,139,103,140, 67, 44, 44,
-    8,  8,141, 67, 67,  8, 67, 67,141, 26, 67,141, 67, 67, 67,141,
-   67, 67, 67, 67, 67, 67, 67,  8, 67,141,141, 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,142,143, 67, 67,
-   67, 67, 67, 67, 67, 67,141, 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,144,  8,  8,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,
-    8,127,145,145,145,145,145,145,145,145,145,145,144,  8,  8,  8,
-    8,  8,  8,  8,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  4,  8,
-    8,  8,141, 26,  8,  8,141, 67, 67, 67, 44, 67, 67, 67, 67, 67,
-   67, 67, 67, 44, 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,137, 67, 67,135, 34,146,
-   43, 32, 44, 44, 91,  2, 97,  2, 16, 16, 16,147, 44, 44,147, 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,148,  2,  2,  2,  2,  2,  2, 67, 67, 67, 67, 67, 55, 67, 67,
+  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,149,150,  4,  4,  4,  4,
-    4, 67,  4,  4,  4,  4,151,152,153,103,103,103,103, 43, 43, 84,
-  154, 40, 40, 67,103,155, 63, 67, 36, 36, 36, 61, 57,156,157, 69,
+   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,
-  158, 27, 27, 27, 27, 27, 27, 27, 36, 36,106, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36,159,  2,  7,  7,  7,  7,  7, 36, 44, 44,
-   32, 32, 32, 32, 32, 32, 32, 70, 51,160, 43, 43, 43, 43, 43, 86,
+  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,157, 40, 40, 40, 40,
+   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,161, 34, 35,
+   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, 47, 44, 44, 44, 44,
-   44, 44, 44, 62, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36,
-   36, 92, 85, 83, 67, 67, 44, 44, 27, 27, 27, 67,162, 44, 44, 44,
+   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,
    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,163,  2,  2,  2,  2,  2,  2, 52,
+   36, 70, 84, 43, 43, 84, 43, 84,162,  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,
    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,164, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61,
+    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, 44, 44, 44, 44, 36, 92, 85, 84, 83,163, 85, 44,
+   16, 16, 16, 16,109, 41, 44, 44, 36, 92, 85, 84, 83,162, 85, 44,
    36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 44, 62, 36, 36,
-  165,165,165,165,165,165,165,165,166,166,166,166,166,166,166,166,
-   16, 16, 16,108, 44, 44, 44, 44, 44,147, 16, 16, 44, 44, 62, 71,
-   36, 36, 36, 36,167, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61,
+  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,
    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,145, 44, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36,162, 44,
-    2,  2,  2,168,128, 44, 44, 44,  6,169,170,145,145,145,145,145,
-  145,145,128,168,128,  2,125,171,  2, 64,  2,  2,151,145,145,128,
-    2,172,  8,173, 66,  2, 44, 44, 36, 36, 61, 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,
    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,174, 56,175, 26,  8,141, 90, 44, 44, 44, 44, 79, 65, 67, 44,
+   20,173, 56,174, 26,  8,140, 90, 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,176, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67,
-  103,103,140, 27, 89, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 90,
-   90, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 50, 44,
-  177, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 44, 44,
-   27, 27, 44, 44, 44, 44, 62, 36,150, 36, 36, 36, 36,178, 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,179,103,103, 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,158, 27, 27, 27,
-   44, 44, 44,176, 27, 27, 27, 27, 36, 61, 36, 44, 44,176, 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,180, 30,
-   36, 36, 36, 36, 36, 36,180, 27, 36, 36, 36, 36, 78, 36, 36, 36,
-   36, 36, 70, 80, 44,176, 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,176, 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, 27, 27, 27, 93, 44, 44, 44, 44,
-  177, 27, 30,  2,  2, 44, 44, 44, 85, 96, 36, 36, 36, 36, 36, 36,
+    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,
+   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,
+   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, 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, 88, 44, 44, 44, 44,
+   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, 44,  7,  7,  7,  7,  7, 63, 63,  2,
-  176, 27, 27, 27, 27, 27, 27, 27, 27, 27, 98, 44, 44, 44, 44, 44,
+   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,
    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,
@@ -4158,7 +4196,7 @@ _hb_ucd_u8[17198] =
    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, 91, 91, 71,
+   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,
    60,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 43, 44,
@@ -4166,7 +4204,9 @@ _hb_ucd_u8[17198] =
     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, 36, 44, 36, 36, 36,
+   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,
@@ -4177,199 +4217,202 @@ _hb_ucd_u8[17198] =
    83, 43, 85, 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,163, 64, 44, 44, 44,
-   27, 27, 89, 67, 67, 67, 56, 20,162, 67, 67, 67, 67, 67, 67, 67,
-   67, 44, 44, 44, 44, 44, 44, 91,103,103,103,103,103,103,103,178,
+   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,176, 27, 27,
+   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, 44, 44, 44, 44, 44, 44, 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,147,147, 16, 16, 16,147, 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,176, 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,158, 27,184, 27, 98, 44, 44, 44, 44, 44,
-   27, 27, 27, 27, 27, 27, 27,158, 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, 67, 67, 67, 67, 67, 67, 90, 44,
+   40, 86, 80, 44, 44, 44, 44, 44, 84, 44, 44, 44, 44, 44, 44, 44,
+   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,
+   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, 67, 67, 67, 44,
-   67, 67, 67, 67, 67, 67, 55, 67, 67, 55, 67, 90, 44, 67, 67, 67,
-   67, 90, 55, 67, 67, 90, 44, 67, 67, 67, 67, 67, 67, 90, 55, 67,
-   67, 67, 44, 44, 67, 90, 44, 44, 36, 44, 44, 44, 44, 44, 44, 44,
-   79, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65, 65, 65, 65, 65,
-  166,166,166,166,166,166,166, 44,166,166,166,166,166,166,166,  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, 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,  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,  2,  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, 11, 12,  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, 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,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   35,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 37,  0,  0,  0,  0,
-    0,  0, 38, 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,  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,  0,  0,
-    0, 49, 50, 51,  0, 52,  0, 53,  0, 54,  0,  0,  0,  0, 55, 56,
-    0,  0,  0,  0,  0,  0, 57, 58,  0,  0,  0,  0,  0,  0, 59, 60,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 61,
-    0,  0,  0, 62,  0,  0,  0, 63,  0, 64,  0,  0, 65,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 66, 67,  0,  0, 68,
-    0,  0,  0,  0,  0,  0,  0,  0, 69,  0,  0,  0,  0,  0, 50, 70,
-    0, 71, 72,  0,  0, 73, 74,  0,  0,  0,  0,  0,  0, 75, 76, 77,
-    0,  0,  0,  0,  0,  0,  0, 25,  0,  0,  0,  0,  0,  0,  0,  0,
-   78,  0,  0,  0,  0,  0,  0,  0,  0, 79,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 80,  0,  0,  0,  0,  0,  0,  0, 81,
-    0,  0,  0, 82,  0,  0,  0,  0, 83, 84,  0,  0,  0,  0,  0, 85,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 86,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 87,  0,  0,  0,  0,  0,  0,  0, 69, 62,  0, 88,  0,  0,
-   89, 90,  0, 73,  0,  0, 91,  0,  0, 92,  0,  0,  0,  0,  0, 93,
-    0, 94, 25, 95,  0,  0,  0,  0,  0,  0, 96,  0,  0,  0, 97,  0,
-    0,  0,  0,  0,  0, 62, 98,  0,  0, 62,  0,  0,  0, 99,  0,  0,
-    0,100,  0,  0,  0,  0,  0,  0,  0, 88,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 74,  0, 42,101,  0,102,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,
-    0,  0,103,  0,104,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,105,
-    0,106,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,107,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,108,109,110,  0,  0,  0,  0,111,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,112,113,  0,  0,  0,  0,  0,  0,
-    0,106,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,114,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,115,  0,
+   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,
+   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,
+    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,
-    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,  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, 41,
+  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,
+    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, 86,  0,  0,  0,  0,  0,
-    0, 87,  0,  0, 86,  0,  0,  0,  0,  0,  0,  0,  0, 79,  0,  0,
-    0,  0,  0,  0, 88,  9, 12,  4, 89,  8, 90, 47,  0, 59, 50,  0,
-   21,  1, 21, 91, 92,  1,  1,  1,  1,  1,  1,  1,  1, 93, 94, 95,
-    0,  0,  0,  0, 96,  1, 97, 59, 81, 98, 99,  4, 59,  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,100,101,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,102,  0,  0,  0,  0, 19,  0,  1,  1, 50,
+    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,  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,103,104, 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,105,
-    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, 88,  0,
-    0,  0,  0,106,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,107, 62,
-    0,108,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
-    0,109, 14, 54, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0,110,  0,
-   88,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62, 63,  0,  0,
-   63,  0, 87,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,110,  0,  0,
-    0,  0,111,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 79, 56,
-    0, 38,  1, 59,  1, 59,  0,  0, 64, 87,  0,  0,  0,  0,  0, 60,
-  112,  0,  0,  0,  0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,112,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,
-    0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,  0,
-   87,113,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,
-    0,  0,  0,  0,  8, 90,  0,  0,  0,  0,  0,  0,  1, 88,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,114,  0,115,116,117,118,  0, 52,  4,
-  119, 49, 23,  0,  0,  0,  0,  0,  0,  0, 38, 50,  0,  0,  0,  0,
-   38, 59,  0,  0,  0,  0,  0,  0,  1, 88,  1,  1,  1,  1, 39,  1,
-   48,103, 88,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,
-    0,  0,  0,  0,  4,119,  0,  0,  0,  1,120,  0,  0,  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,
@@ -4391,58 +4434,58 @@ _hb_ucd_u8[17198] =
     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,  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,  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,
+  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,
    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,  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, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+   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,
+    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,
@@ -4464,75 +4507,76 @@ _hb_ucd_u8[17198] =
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 41,  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,
+   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, 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,
+   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, 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, 97,133,134,135,136,137,138,139,140,141, 97,142,143,
-   97,144,145,146,147, 97,148,149, 97,150,151,152, 97, 97,153,154,
-  155,156, 97,157, 97,158,159,159,159,159,159,159,159,160,161,159,
-  162, 97, 97, 97, 97, 97,163,163,163,163,163,163,163,163,164, 97,
-   97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,165,165,
-  165,165,166, 97, 97, 97,167,167,167,167,168,169,170,171, 97, 97,
-   97, 97,172,173,174,175,176,176,176,176,176,176,176,176,176,176,
-  176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
-  176,176,176,176,176,177,176,176,176,176,176,178, 97, 97, 97, 97,
-   97, 97, 97, 97, 97, 97,179,180,181,182,182,183, 97, 97, 97, 97,
-   97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,184,185,
-   97, 97, 97, 97, 97, 97, 59,186,187,188,189,190,191, 97,192,193,
-  194, 59, 59,195, 59,196,197,197,197,197,197,198, 97, 97, 97, 97,
-   97, 97, 97, 97, 97, 97,199, 97,200, 97, 97,201, 97, 97, 97, 97,
-   97, 97, 97, 97, 97, 97,202,203,204, 97, 97, 97, 97, 97,205,206,
-  207, 97,208,209, 97, 97,210,211,212,213,214, 97, 59, 59, 59, 59,
-   59, 59, 59,215,216,217,218,219,220,221,222,223, 97, 97, 97, 97,
-   97, 97, 97, 97, 97, 97, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70,224, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
-   70, 70, 70, 70,225, 70,226, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+   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,227, 70, 70, 70, 70, 70, 70, 70, 70, 70,228, 97, 97,
-   97, 97, 97, 97, 97, 97, 70, 70, 70, 70,229, 97, 97, 97, 97, 97,
-   97, 97, 97, 97, 97, 97,230, 97,231,232,  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,  0,
-    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,  3,  3,
-    3,  3,  3,  3,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,
+   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,
@@ -4557,7 +4601,7 @@ _hb_ucd_u8[17198] =
     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,  2, 21, 21,  2,  2,  2,  2, 21, 21,  2, 21, 21, 21,
+    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,
@@ -4573,76 +4617,75 @@ _hb_ucd_u8[17198] =
     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,  2, 20, 20, 20, 20, 20, 20, 20, 20,  2, 20, 20, 20,  2,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,  2,  2,
-    2,  2, 20, 20, 20, 20, 20, 20, 20, 20,  2,  2, 20, 20,  2,  2,
-   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,  1,  1,  1,  1,  1,  1,  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,  1,  2,  2,  2,  2,  2,  2,  2,  0,  0,
+   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,  2, 56, 56,
+    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,
@@ -4656,44 +4699,46 @@ _hb_ucd_u8[17198] =
    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, 26, 26, 26,  2,  2,  2,  2,  2, 12, 12,
-   12, 12, 12, 12, 12,  0, 17, 17, 17, 17, 17, 17, 17,  0, 39, 39,
+   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,  2,  2,  2,
-    2,  2,  2,  2,  2, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
-   60, 60,  2,  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, 87, 87, 87, 87, 87, 87,  2,  2, 87, 87,
+    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,  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,  9,  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,
@@ -4737,31 +4782,33 @@ _hb_ucd_u8[17198] =
     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,147,147,147,147,147,147,147,147,148,148,
-  148,148,148,148,148,148,148,148,  2,  2,  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, 96, 96,
-   96, 96, 96, 96, 96,  2,111,111,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,  2,100,100,100,100,100,100,100,100,100,100,
-  100,100,100,100,  2,  2,  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,  2,137,  2,137,137,137,124,124,
+    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,
@@ -4771,22 +4818,26 @@ _hb_ucd_u8[17198] =
   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,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, 22, 22,
+    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,
@@ -4800,19 +4851,20 @@ _hb_ucd_u8[17198] =
     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,  2,  2,  2,  2,136,136,
-  136,136,136,136,136,136,136,136,136,  2,  2,  2,  2,  2, 17, 15,
+    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,  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,  0,  0,  0,  2,  0,  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,
@@ -4824,90 +4876,93 @@ _hb_ucd_u8[17198] =
   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,  0,  0,
-    0,  0,  0,  2,  2,  2,  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,  0,  0,  0,  2,  2,  2,  0,  0, 13, 13,
-   13, 13, 13, 13, 13,  2, 13, 13, 13, 13, 13,  2,  2,  2, 13,  2,
-    2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2, 16, 50,
-   84,118, 88, 89, 90, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-   85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 91, 85, 85,
-  220, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-   85, 85, 85, 85, 85, 85, 85, 85, 94, 85, 85, 85, 85, 85, 85, 85,
-   85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-   85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 15,  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,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  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,  0,  0,
-    0,  0,  0,  0,  0,  0,  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, 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,  0,  0,  0,  0,  0,
-    0,  0,  0,  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,  0,  0,
-    0,  0,  0,  0,  0,  0,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,168,169,  0,  0,  0,  0,170,171,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,172,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,
-    0,  0,  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,
+  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,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  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,  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,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  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,
 };
 static const uint16_t
-_hb_ucd_u16[8944] =
+_hb_ucd_u16[9080] =
 {
      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,
@@ -4917,557 +4972,566 @@ _hb_ucd_u16[8944] =
     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,  72,  74,  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,  72,  72, 140,  48, 141, 142, 143, 144,  72,  72,
-   145, 146, 147, 148, 149,  48, 150, 151, 152, 153,  32, 154, 155, 156,  72,  72,
-    48,  48, 157, 158, 159, 160, 161, 162, 163, 164,   9,   9, 165,  11,  11, 166,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 167, 168,  48,  48,
-   167,  48,  48, 169, 170, 171,  48,  48,  48, 170,  48,  48,  48, 172, 173, 174,
-    48, 175,   9,   9,   9,   9,   9, 176, 177,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48, 178,  48, 179, 180,  48,  48,  48,  48, 181, 182,
-   183, 184,  48, 185,  48, 186, 183, 187,  48,  48,  48, 188, 189, 190, 191, 192,
-   193, 191,  48,  48, 194,  48,  48, 195, 196,  48, 197,  48,  48,  48,  48, 198,
-    48, 199, 200, 201, 202,  48, 203, 204,  48,  48, 205,  48, 206, 207, 208, 208,
-    48, 209,  48,  48,  48, 210, 211, 212, 191, 191, 213, 214,  72,  72,  72,  72,
-   215,  48,  48, 216, 217, 159, 218, 219, 220,  48, 221,  64,  48,  48, 222, 223,
-    48,  48, 224, 225, 226,  64,  48, 227, 228,   9,   9, 229, 230, 231, 232, 233,
-    11,  11, 234,  27,  27,  27, 235, 236,  11, 237,  27,  27,  32,  32,  32, 238,
-    13,  13,  13,  13,  13,  13,  13,  13,  13, 239,  13,  13,  13,  13,  13,  13,
-   240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249,
-   250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260,  72, 261, 262, 263,
-   264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276,
-   277, 277, 277, 277, 277, 277, 277, 277, 278, 208, 279, 208, 208, 208, 208, 280,
-   208, 281, 277, 282, 208, 283, 284, 208, 208, 208, 285,  72, 286,  72, 269, 269,
-   269, 287, 208, 208, 208, 208, 288, 269, 208, 208, 208, 208, 208, 208, 208, 208,
-   208, 208, 208, 289, 290, 208, 208, 291, 208, 208, 208, 208, 208, 208, 292, 208,
-   208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277,
-   298, 299, 277, 277, 277, 300, 277, 301, 208, 208, 208, 277, 302, 208, 208, 303,
-   208, 304, 208, 208, 208, 208, 208, 208,   9,   9, 305,  11,  11, 306, 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,  72,  72,  72,
-   208, 321, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 323,  72, 324,
-   325, 326, 327, 328, 136,  48,  48,  48,  48, 329, 177,  48,  48,  48,  48, 330,
-   331,  48,  48, 136,  48,  48,  48,  48, 199, 332,  48,  71, 208, 208, 322,  48,
-   208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208,
-    48,  48,  48, 198, 208, 208, 208, 208,  48,  48,  48,  48,  48,  48,  48,  72,
-    48, 337,  48,  48,  48,  48,  48,  48, 150, 208, 208, 208, 285,  48,  48, 227,
-   338,  48, 339,  72,  13,  13, 340, 341,  13, 342,  48,  48,  48,  48, 343, 344,
-    31, 345, 346, 347,  13,  13,  13, 348, 349, 350, 351, 352, 353,  72,  72, 354,
-   355,  48, 356, 357,  48,  48,  48, 358, 359,  48,  48, 360, 361, 191,  32, 362,
-    64,  48, 363,  48, 364, 365,  48, 150,  76,  48,  48, 366, 367, 368, 369, 370,
-    48,  48, 371, 372, 373, 374,  48, 375,  48,  48,  48, 376, 377, 378, 379, 380,
-   381, 382, 315,  11,  11, 383, 384,  11,  11,  11,  11,  11,  48,  48, 385, 191,
-    48,  48, 386,  48, 387,  48,  48, 205, 388, 388, 388, 388, 388, 388, 388, 388,
-   389, 389, 389, 389, 389, 389, 389, 389,  48,  48,  48,  48,  48,  48, 203,  48,
-    48,  48,  48,  48,  48, 206,  72,  72, 390, 391, 392, 393, 394,  48,  48,  48,
-    48,  48,  48, 395, 396, 397,  48,  48,  48,  48,  48, 398,  72,  48,  48,  48,
-    48, 399,  48,  48, 400,  72,  72, 401,  32, 402,  32, 403, 404, 405, 406, 407,
+    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,  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,
+   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,
+   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, 199, 414, 415, 416, 417, 418,  48, 171, 419, 203, 203,  72,  72,
-    48,  48,  48,  48,  48,  48,  48,  71, 420, 269, 269, 421, 270, 270, 270, 422,
-   423, 324, 424,  72,  72, 208, 208, 425,  72,  72,  72,  72,  72,  72,  72,  72,
-    48, 150,  48,  48,  48, 100, 426, 427,  48,  48, 428,  48, 429,  48,  48, 430,
-    48, 431,  48,  48, 432, 433,  72,  72,   9,   9, 434,  11,  11,  48,  48,  48,
-    48, 203, 191,   9,   9, 435,  11, 436,  48,  48, 400,  48,  48,  48, 437,  72,
-    48,  48,  48, 314,  48, 198, 400,  72, 438,  48,  48, 439,  48, 440,  48, 441,
-    48, 199, 442,  72,  72,  72,  48, 443,  48, 444,  48, 445,  72,  72,  72,  72,
-    48,  48,  48, 446, 269, 447, 269, 269, 448, 449,  48, 450, 451, 452,  48, 453,
-    48, 454,  72,  72, 455,  48, 456, 457,  48,  48,  48, 458,  48, 459,  48, 460,
-    48, 461, 462,  72,  72,  72,  72,  72,  48,  48,  48,  48, 195,  72,  72,  72,
-     9,   9,   9, 463,  11,  11,  11, 464,  48,  48, 465, 191,  72,  72,  72,  72,
-    72,  72,  72,  72,  72,  72, 269, 466,  48, 454, 467,  48,  62, 468,  72,  72,
-    72,  72,  72,  72,  72,  72,  48, 314, 469,  48,  48, 470, 471, 447, 472, 473,
-   220,  48,  48, 474, 475,  48, 195, 191, 476,  48, 477, 478, 479,  48,  48, 480,
-   220,  48,  48, 481, 482, 483, 484, 485,  48,  97, 486, 487,  72,  72,  72,  72,
-   488, 489, 490,  48,  48, 491, 492, 191, 493,  83,  84, 494, 495, 496, 497, 498,
-    48,  48,  48, 499, 500, 501,  72,  72,  48,  48,  48, 502, 503, 191,  72,  72,
-    48,  48, 504, 505, 506, 507,  72,  72,  48,  48,  48, 508, 509, 191, 510,  72,
-    48,  48, 511, 512, 191,  72,  72,  72,  48, 172, 513, 514,  72,  72,  72,  72,
-    48,  48, 486, 515,  72,  72,  72,  72,  72,  72,   9,   9,  11,  11, 147, 516,
-    72,  72, 517,  48,  48, 518, 519,  72, 520,  48,  48, 521, 522, 523,  48,  48,
-   524, 525, 526,  72,  48,  48,  48, 195,  84,  48, 504, 527, 528, 147, 174, 529,
-    48, 530, 531, 532,  72,  72,  72,  72, 533,  48,  48, 534, 535, 191, 536,  48,
-   537, 538, 191,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  72,  48, 539,
-    72,  72,  72,  72, 269, 540, 541, 542,  48, 206,  72,  72,  72,  72,  72,  72,
-   270, 270, 270, 270, 270, 270, 543, 544,  48,  48,  48,  48, 386,  72,  72,  72,
-    48,  48, 199, 545,  72,  72,  72,  72,  48,  48,  48,  48, 314,  72,  72,  72,
-    48,  48,  48, 195,  48, 199, 368,  72,  72,  72,  72,  72,  72,  48, 203, 546,
-    48,  48,  48, 547, 548, 549, 550, 551,  48,  72,  72,  72,  72,  72,  72,  72,
-    72,  72,  72,  72,   9,   9,  11,  11, 269, 552,  72,  72,  72,  72,  72,  72,
-    48,  48,  48,  48, 553, 554, 555, 555, 556, 557,  72,  72,  72,  72, 558,  72,
-    48,  48,  48,  48,  48,  48,  48, 400,  48,  48,  48,  48,  48,  48,  48, 559,
-    48, 199,  72,  72,  72, 559, 560,  48,  48,  48,  48,  48,  48,  48,  48, 205,
-    48,  48,  48,  48,  48,  48,  71, 150, 195, 561, 562,  72,  72,  72,  72,  72,
-   208, 208, 208, 208, 208, 208, 208, 323, 208, 208, 563, 208, 208, 208, 564, 565,
-   566, 208, 567, 208, 208, 208, 568,  72, 208, 208, 208, 208, 569,  72,  72,  72,
-    72,  72,  72,  72,  72,  72, 269, 570, 208, 208, 208, 208, 208, 285, 269, 451,
-     9, 571,  11, 572, 573, 574, 240,   9, 575, 576, 577, 578, 579,   9, 571,  11,
-   580, 581,  11, 582, 583, 584, 585,   9, 586,  11,   9, 571,  11, 572, 573,  11,
-   240,   9, 575, 585,   9, 586,  11,   9, 571,  11, 587,   9, 588, 589, 590, 591,
-    11, 592,   9, 593, 594, 595, 596,  11, 597,   9, 598,  11, 599, 600, 600, 600,
-    32,  32,  32, 601,  32,  32, 602, 603, 604, 605,  45,  72,  72,  72,  72,  72,
-   606, 607, 608,  72,  72,  72,  72,  72,  48,  48, 150, 609, 610,  72,  72,  72,
-    72,  72,  72,  72,  48,  48, 611, 612,  48,  48,  48,  48, 613, 614,  72,  72,
-     9,   9, 575,  11, 615, 368,  72,  72,  72,  72,  72,  72,  72,  72,  72, 484,
-   269, 269, 616, 617,  72,  72,  72,  72, 484, 269, 618, 619,  72,  72,  72,  72,
-   620,  48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205,  72,  72,  72, 629,
-   208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323,
-   174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631,  72,  72,  72, 632, 208,
-   633, 208, 208, 324, 568, 634, 323,  72, 208, 208, 208, 208, 208, 208, 208, 635,
-   208, 208, 208, 208, 208, 323, 631, 286, 208, 208, 208, 208, 208, 208, 208, 322,
-   208, 208, 208, 208, 208, 568, 324,  72, 324, 208, 208, 208, 636, 175, 208, 208,
-   636, 208, 637,  72,  72,  72,  72,  72, 638, 208, 208, 208, 208, 208, 208, 639,
-   208, 208, 640, 208, 641, 208, 208, 208, 208, 208, 208, 208, 208, 322, 637, 642,
-   633, 323,  72,  72,  72,  72,  72,  72,  48,  48,  48,  48,  48, 314,  72,  72,
-    48,  48,  48, 204,  48,  48,  48,  48,  48, 203,  48,  48,  48,  48,  48,  48,
-    48,  48, 643,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 100,  72,
-    48, 203,  72,  72,  72,  72,  72,  72, 644,  72, 645, 645, 645, 645, 645, 645,
-    32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  72,
-   389, 389, 389, 389, 389, 389, 389, 646, 389, 389, 389, 389, 389, 389, 389, 647,
-     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,  51,  26,  26,  52,  31,  53,  31,  31,  31,
-    54,  54,  54,  54,  54,  54,  54,  54,  54,  54,  55,  54,  56,  54,  54,  54,
-    57,  58,  59,  60,  60,  61,  62,  63,  58,  64,  65,  66,  67,  60,  60,  68,
-    69,  70,  71,  72,  72,  73,  74,  75,  70,  76,  77,  78,  79,  72,  80,  26,
-    81,  82,  83,  84,  84,  85,  86,  87,  82,  88,  89,  26,  90,  84,  91,  92,
-    93,  94,  95,  96,  96,  97,  98,  99,  94, 100, 101, 102, 103,  96,  96,  26,
-   104, 105, 106, 107, 108, 105, 109, 110, 105, 106, 111,  26, 112, 109, 109, 113,
-   114, 115, 116, 114, 114, 116, 114, 117, 115, 118, 119, 120, 121, 114, 122, 114,
-   123, 124, 125, 123, 123, 125, 126, 127, 124, 128, 129, 130, 131, 123, 132,  26,
-   133, 134, 135, 136, 136, 136, 136, 136, 134, 135, 137, 136, 138, 136, 136, 136,
-   139, 140, 141, 142, 140, 140, 143, 144, 141, 145, 146, 140, 147, 140, 148,  26,
-   149, 150, 150, 150, 150, 150, 150, 151, 150, 150, 150, 152,  26,  26,  26,  26,
-   153, 154, 155, 155, 156, 155, 155, 157, 158, 157, 155, 159,  26,  26,  26,  26,
-   160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160, 162, 161, 160,
-   160, 160, 160, 161, 160, 160, 160, 163, 160, 163, 164, 165,  26,  26,  26,  26,
-   166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-   166, 166, 166, 166, 167, 167, 167, 167, 168, 169, 167, 167, 167, 167, 167, 170,
-   171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
-   172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 174, 173, 172, 172, 172, 172,
-   172, 173, 172, 172, 172, 172, 173, 174, 173, 172, 174, 172, 172, 172, 172, 172,
-   172, 172, 173, 172, 172, 172, 172, 172, 172, 172, 172, 175, 172, 172, 172, 176,
-   172, 172, 172, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 179,
-   180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
-   181, 181, 181, 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, 185,
-   186, 187, 188,  26, 189, 189, 190,  26, 191, 191, 192,  26, 193, 194, 195,  26,
-   196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 196, 198, 196, 198,
-   199, 200, 201, 202, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 203,
-   201, 201, 201, 201, 201, 204, 180, 180, 180, 180, 180, 180, 180, 180, 205,  26,
-   206, 206, 206, 207, 206, 208, 206, 208, 209, 206, 210, 210, 210, 211, 212,  26,
-   213, 213, 213, 213, 213, 214, 213, 213, 213, 215, 213, 216, 196, 196, 196, 196,
-   217, 217, 217, 218, 219, 219, 219, 219, 219, 219, 219, 220, 219, 219, 219, 221,
-   219, 222, 219, 222, 219, 223,   9, 224,  26,  26,  26,  26,  26,  26,  26,  26,
-   225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 225, 225, 225, 227,
-   228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 230, 231,
-   232, 232, 232, 232, 232, 232, 232, 233, 232, 234, 235, 235, 235, 235, 235, 235,
-    18, 236, 167, 167, 167, 167, 167, 237, 228,  26, 238,   9, 239, 240, 241, 242,
-     2,   2,   2,   2, 243, 244,   2,   2,   2,   2,   2, 245, 246, 247,   2, 248,
-     2,   2,   2,   2,   2,   2,   2, 249,   9,   9,   9,   9,   9,   9,   9, 250,
-    14,  14, 251, 251,  14,  14,  14,  14, 251, 251,  14, 252,  14,  14,  14, 251,
-    14,  14,  14,  14,  14,  14, 253,  14, 253,  14, 254, 255,  14,  14, 256, 257,
-     0, 258,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 259,   0, 260, 261,
-     0, 262,   2, 263,   0,   0,   0,   0,  26,  26,   9,   9,   9,   9, 264,  26,
-     0,   0,   0,   0, 265, 266,   4,   0,   0, 267,   0,   0,   2,   2,   2,   2,
-     2, 268,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0, 262,  26,  26,  26,   0, 269,  26,  26,   0,   0,   0,   0,
-   270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 271,   0,
-     0,   0, 272,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-   273, 273, 273, 273, 273, 274, 273, 273, 273, 273, 273, 274,   2,   2,   2,   2,
-    17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17, 275, 276,
-   167, 167, 167, 167, 168, 169, 277, 277, 277, 277, 277, 277, 277, 278, 279, 278,
-   172, 172, 174,  26, 174, 174, 174, 174, 174, 174, 174, 174,  18,  18,  18,  18,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  26,  26,  26,  26,  26,  26,
-   280, 280, 280, 281, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 282,  26,
-   280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
-   280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283,  26,  26,  26,   0, 284,
-   285,   0,   0,   0, 286, 287,   0, 288, 289, 290, 290, 290, 290, 290, 290, 290,
-   290, 290, 291, 292, 293, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 295,
-   296, 297, 297, 297, 297, 297, 298, 171, 171, 171, 171, 171, 171, 171, 171, 171,
-   171, 299,   0,   0, 297, 297, 297, 300,   0,   0,   0,   0, 284,  26, 294, 294,
-   171, 171, 171, 299,   0,   0,   0,   0,   0,   0,   0,   0, 171, 171, 171, 301,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 294, 294, 294, 294, 294, 302,
-   294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,   0,   0,   0,   0,   0,
-   280, 280, 280, 280, 280, 280, 283,  26,   0,   0,   0,   0,   0,   0,   0,   0,
-   280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,  26,  26,
-   303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
-   303, 304, 303, 303, 303, 303, 303, 303, 305,  26, 306, 306, 306, 306, 306, 306,
-   307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
-   307, 307, 307, 307, 307, 308,  26,  26,  18,  18,  18,  18,  18,  18,  18,  18,
-    18,  18,  18,  18, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,  26,
-     0,   0,   0,   0, 310,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
-     2, 311,   2,   2,   2,   2,   2,   2, 312,  26,  26,  26,  26,  26, 313,   2,
-   314, 314, 314, 314, 314, 315,   0, 316, 317, 317, 317, 317, 317, 317, 317,  26,
-   318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 318, 321,  54,  54,  54,  54,
-   322, 322, 322, 322, 322, 323, 324, 324, 324, 324, 325, 326, 171, 171, 171, 327,
-   328, 328, 328, 328, 328, 328, 328, 328, 328, 329, 328, 330, 166, 166, 166, 331,
-   332, 332, 332, 332, 332, 332, 333,  26, 332, 334, 332, 335, 166, 166, 166, 166,
-   336, 336, 336, 336, 336, 336, 336, 336, 337,  26,  26, 338, 339, 339, 340,  26,
-   341, 341, 341,  26, 174, 174,   2,   2,   2,   2,   2, 342, 343,  26, 178, 178,
-   178, 178, 178, 178, 178, 178, 178, 178, 339, 339, 339, 339, 339, 344, 339, 345,
-   171, 171, 171, 171, 346,  26, 171, 171, 299, 347, 171, 171, 171, 171, 171, 346,
+    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,
-   280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 280, 280,
-   280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 348,  26,  26,  26,  26,
-   349,  26, 350, 351,  25,  25, 352, 353, 354,  25,  31,  31,  31,  31,  31,  31,
-    31,  31,  31,  31,  31,  31,  31,  31, 355,  26,  52,  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, 356,  26,  26,  31,  31,  31,  31,  31,  31,
-    31,  31, 357,  31,  31,  31,  31,  31,  31,  26,  26,  26,  26,  26,  31,  51,
-     9,   9,   0, 316,   9, 358,   0,   0,   0,   0, 359,   0, 262, 284,  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, 294, 293, 294,
-   294, 294, 294, 363, 171, 171, 171, 299, 364, 364, 364, 365, 262, 262,  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, 257,   0, 284, 375,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0, 376,
-   377, 377, 377, 378, 379, 379, 379, 379, 379, 379, 380,  26, 381,   0,   0, 284,
-   382, 382, 382, 382, 383, 384, 385, 385, 385, 386, 387, 387, 387, 387, 387, 388,
-   389, 389, 389, 390, 391, 391, 391, 391, 392, 391, 393,  26,  26,  26,  26,  26,
-   394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 395, 395, 395, 395, 395,
-   396, 396, 396, 397, 396, 398, 399, 399, 399, 399, 400, 399, 399, 399, 399, 400,
-   401, 401, 401, 401, 401,  26, 402, 402, 402, 402, 402, 402, 403, 404,  26,  26,
-   405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405,
-   405, 405, 405, 405, 405, 405, 406,  26, 405, 405, 407,  26, 405,  26,  26,  26,
-   408, 409, 410, 410, 410, 410, 411, 412, 413, 413, 414, 413, 415, 415, 415, 415,
-   416, 416, 416, 417, 418, 416,  26,  26,  26,  26,  26,  26, 419, 419, 420, 421,
-   422, 422, 422, 423, 424, 424, 424, 425,  26,  26,  26,  26,  26,  26,  26,  26,
-   426, 426, 426, 426, 427, 427, 427, 428, 427, 427, 429, 427, 427, 427, 427, 427,
-   430, 431, 432, 433, 434, 434, 435, 436, 434, 437, 434, 437, 438, 438, 438, 438,
-   439, 439, 439, 439,  26,  26,  26,  26, 440, 440, 440, 440, 441, 442, 441,  26,
-   443, 443, 443, 443, 443, 443, 444, 445, 446, 446, 447, 446, 448, 448, 449, 448,
-   450, 450, 451, 452,  26, 453,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   454, 454, 454, 454, 454, 454, 454, 454, 454, 455,  26,  26,  26,  26,  26,  26,
-   456, 456, 456, 456, 456, 456, 457,  26, 456, 456, 456, 456, 456, 456, 457, 458,
-   459, 459, 459, 459, 459,  26, 459, 460,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31, 461,
-   462, 462, 462, 462, 462,  26, 463, 463, 463, 463, 463, 464,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 465, 465, 466,  26,
-   467, 467, 467, 467, 467, 467, 467, 467, 467, 468, 469, 467, 467, 467,  26, 470,
-   471, 471, 471, 471, 471, 471, 471, 471, 472, 473, 474, 474, 474, 475, 474, 476,
-   477, 477, 477, 477, 477, 477, 478, 477, 479,  26, 480, 480, 480, 480, 481,  26,
-   482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 482, 482, 484, 140, 485,  26,
-   486, 486, 487, 486, 486, 486, 486, 488,  26,  26,  26,  26,  26,  26,  26,  26,
-   489, 490, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 494, 495, 494, 496,
-   497, 498, 499, 500, 500, 501, 502, 503, 498, 504, 505, 506, 507, 508, 508,  26,
-   509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 510,  26,  26,  26,  26,
-   511, 511, 511, 511, 511, 511, 511, 511, 511,  26, 511, 512,  26,  26,  26,  26,
-   513, 513, 513, 513, 513, 513, 514, 513, 513, 513, 513, 514,  26,  26,  26,  26,
-   515, 515, 515, 515, 515, 515, 515, 515, 516,  26, 515, 517, 201, 518,  26,  26,
-   519, 519, 519, 519, 519, 519, 519, 520, 519, 521,  26,  26,  26,  26,  26,  26,
-   522, 522, 522, 523, 522, 524, 522, 522,  26,  26,  26,  26,  26,  26,  26,  26,
-   525, 525, 525, 525, 525, 525, 525, 526,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 529,
-    26,  26,  26,  26, 530, 531, 530, 530, 530, 530, 530, 531, 532,  26,  26,  26,
-   533, 533, 533, 533, 533, 533, 533, 533, 533,  26, 534, 534, 534, 534, 534, 534,
-   534, 534, 534, 534, 535,  26,  26,  26, 536, 536, 536, 536, 536, 536, 536, 537,
-   538, 539, 538, 538, 538, 538, 540, 538, 541,  26, 538, 538, 538, 542, 543, 543,
-   543, 543, 544, 543, 543, 545, 546,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   547, 548, 549, 549, 549, 549, 547, 550, 549,  26, 549, 551, 552, 553, 554, 554,
-   554, 555, 556, 557, 554, 558,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 559, 559, 559, 560,
-    26,  26,  26,  26,  26,  26,  26,  26, 109, 109, 109, 109, 109, 109, 561, 562,
-   563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563,
-   563, 563, 563, 564,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 565, 566,  26,
-   563, 563, 563, 563, 563, 563, 563, 563, 567,  26,  26,  26,  26,  26,  26,  26,
-   568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
-   568, 568, 568, 568, 568, 569, 568, 570,  26,  26,  26,  26,  26,  26,  26,  26,
-   571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571,
-   571, 571, 571, 571, 571, 571, 571, 571, 572,  26,  26,  26,  26,  26,  26,  26,
-   309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
-   309, 309, 309, 309, 309, 309, 309, 573, 574, 574, 574, 575, 574, 576,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 577, 577, 577, 578, 578,  26,
-   579, 579, 579, 579, 579, 579, 579, 579, 580,  26, 579, 581, 581, 579, 579, 582,
-   579, 579,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 583, 583, 583, 583, 583, 583, 583, 583,
-   583, 583, 583, 584,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   585, 585, 585, 585, 585, 585, 585, 585, 585, 586, 585, 585, 585, 585, 585, 585,
-   585, 587, 585, 585,  26,  26,  26,  26,  26,  26,  26,  26, 588,  26,  26,  26,
-   589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,
-   589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,  26,
-   589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590,  26,
-   591, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
-   290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,
-   290, 290, 290, 291,  26,  26,  26,  26,  26,  26, 592,  26, 593,  26, 594, 594,
-   594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594,
-   594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595,
-   596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 598,
-   596, 599, 596, 600, 284,  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, 272,  26,
-     0,   0,   0,   0, 262, 361,   0,   0,   0,   0,   0,   0, 601, 602,   0, 603,
-   604, 605,   0,   0,   0, 606,   0,   0,   0,   0,   0,   0,   0, 607,  26,  26,
-    14,  14,  14,  14,  14,  14,  14,  14, 251,  26,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,   0,   0, 284,  26,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 262,  26,   0,   0,   0, 607,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 259,   0,   0,   0,   0,   0,
-     0,   0,   0, 259, 608, 609,   0, 610, 611,   0,   0,   0,   0,   0,   0,   0,
-   612, 613, 259, 259,   0,   0,   0, 614, 615, 616, 617,   0,   0,   0,   0,   0,
-     0,   0,   0,   0, 272,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0, 271,   0,   0,   0,   0,   0,   0,
-   618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618,
-   618, 619,  26, 620, 621, 618,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   274, 273, 273, 622, 623, 624,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   625, 625, 625, 625, 625, 626, 625, 627, 625, 628,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26,  26,  26, 629, 629, 629, 629, 629, 629, 629, 630,
-   631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
-   631, 631, 631, 631, 631, 631, 631, 631, 632, 631, 633,  26,  26,  26,  26,  26,
-   634, 634, 634, 634, 634, 634, 634, 634, 634, 635, 634, 636,  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, 637,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   361,   0,   0,   0,   0,   0,   0, 272,  26,  26,  26,  26,  26,  26,  26,  26,
-   638,  31,  31,  31, 639, 640, 641, 642, 643, 644, 639, 645, 639, 641, 641, 646,
-    31, 647,  31, 648, 649, 647,  31, 648,  26,  26,  26,  26,  26,  26, 355,  26,
-     0,   0,   0,   0,   0, 284,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0, 284,  26,   0, 262, 361,   0, 361,   0, 361,   0,   0,   0, 272,  26,
-     0, 637,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 637,   0,   0,
-     0,   0,   0,   0,   0, 637,  26,  26,  26,  26,  26,  26, 650,   0,   0,   0,
-   651,  26,   0,   0,   0,   0,   0, 284,   0, 607, 316,  26, 272,  26,  26,  26,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 272,  26,   0, 637,   0, 269,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 284,  26,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 607,   0, 284,  26,  26,
-     0, 284,   0,   0,   0,   0,   0,   0,   0,  26,   0, 316,   0,   0,   0,   0,
-     0,  26,   0,   0,   0, 272,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-     0, 611,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 614, 616,
-     0,   0,   0,   0, 613, 652,   0,   0,   0, 613,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 284,  26,   0, 272, 284, 269,
-   269,  26, 272,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 653,  26,  26,  26,  26,  26,
-   280, 280, 280, 280, 280, 280, 654,  26, 280, 280, 280, 280, 280, 280, 280, 280,
-   280, 280, 280, 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
-   280, 280, 280, 280, 348,  26, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
-   280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 655,  26,  26,  26,
-   280, 280, 280, 283,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
-   656,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    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,
+    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,
      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
-     9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,
+     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,
-   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,   0,   0,   0,   0,   0,   0,1948,1949,
-  1950,1951,1952,1953,1954,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1955,1956,1957,1959,1958,
-  1960,   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,   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] =
@@ -5490,12 +5554,12 @@ _hb_ucd_i16[196] =
 static inline uint_fast8_t
 _hb_ucd_gc (unsigned u)
 {
-  return u<1114110u?_hb_ucd_u8[6432+(((_hb_ucd_u8[1248+(((_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[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;
 }
 static inline uint_fast8_t
 _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[8640+(((_hb_ucd_u8[7704+(((_hb_ucd_u8[7048+(((_hb_ucd_u8[6802+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0;
+  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;
 }
 static inline unsigned
 _hb_ucd_b4 (const uint8_t* a, unsigned i)
@@ -5505,28 +5569,29 @@ _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[9372+(((_hb_ucd_u8[9252+(((_hb_ucd_b4(9124+_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[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;
 }
 static inline uint_fast8_t
 _hb_ucd_sc (unsigned u)
 {
-  return u<918000u?_hb_ucd_u8[10822+(((_hb_ucd_u16[1920+(((_hb_ucd_u8[10150+(((_hb_ucd_u8[9700+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2;
+  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;
 }
 static inline uint_fast16_t
 _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[5648+(((_hb_ucd_u8[16174+(((_hb_ucd_b4(16078+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0;
+  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;
 }
 
 
 #else
 
 static const uint8_t
-_hb_ucd_u8[13072] =
+_hb_ucd_u8[13344] =
 {
     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,
@@ -5537,8 +5602,7 @@ _hb_ucd_u8[13072] =
    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,
-   24, 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,  8,  9, 10, 11, 12, 13, 14, 15,
@@ -5562,34 +5626,36 @@ _hb_ucd_u8[13072] =
   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,111,129, 34,
-  130,131,132,133,134,135,136,111,137,138,111,139,140,141,142,111,
-  143,144,111,145,146,147,111,111,148,149,150,151,111,152,111,153,
-   34, 34, 34, 34, 34, 34, 34, 34,154, 34, 34,111,111,111,111,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,155,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,
   111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
-   34, 34, 34, 34,156,157,158, 34,111,111,111,111,159,160,161,162,
+   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,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,
    34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,
-   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,163,111,111,111,111,111,111,
-   67, 67,164,165,166,128, 65,111,167,168,169,170,171,172,173,174,
-   67, 67, 67, 67,175,176,111,111,111,111,111,111,111,111,111,111,
-  177,111,178,111,111,179,111,111,111,111,111,111,111,111,111,111,
-   34,180,181,111,111,111,111,111,128,182,183,111, 34,184,111,111,
-   67, 67,185, 67, 67,111, 67,186, 67, 67, 67, 67, 67, 67, 67, 67,
-   67, 67, 67, 67, 67, 67,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,
    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,
-  187,111,177,177,111,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,
     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,
@@ -5646,9 +5712,9 @@ _hb_ucd_u8[13072] =
    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,
-   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,
-   75, 75, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 74,
+   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,
@@ -5676,51 +5742,51 @@ _hb_ucd_u8[13072] =
    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, 48,
-   48, 48, 48, 48, 48, 48, 48, 48, 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, 96, 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, 97, 97, 97, 97, 16, 16, 16, 16, 11, 11, 98, 99,
-   41, 16, 16, 16, 11, 11, 98, 41, 16, 16, 16, 16, 11, 11,100, 41,
-  101,101,101,101,101,102, 59, 59, 51, 51, 51,  2,103,104,103,104,
-    2,  2,  2,  2,105, 59, 59,106,  2,  2,  2,  2,107,108,  2,109,
-  110,  2,111,112,  2,  2,  2,  2,  2,  9,110,  2,  2,  2,  2,113,
-   59, 59, 59, 59, 59, 59, 59, 59,114, 40, 27, 27, 27,  8,111,115,
-   27, 27, 27, 27, 27,  8,111, 91, 20, 20, 20, 20, 20, 20, 20, 20,
-   43, 43, 43, 43, 43, 43,116, 48,117, 48,117, 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,111,128,  8,  8,  8,  8,
-    8,  8,  8,  4,  4,  4,  4,  4,  8,111,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,103,103,  2,107,108,103,  2,  2,  2,  2,  6,  2, 94,103,  2,
-  103,  4,  4,  4,  4,  2,  2, 77,  2,  2,  2,  2,  2, 51,  2,  2,
-   94,131,  2,  2,  2,  2,  2,  2,  1,  2,132,133,  4,  4,  4,  4,
+    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,
@@ -5733,99 +5799,102 @@ _hb_ucd_u8[13072] =
    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,
    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, 11, 11, 11, 11,
-   11, 11, 11,144, 40, 35, 36, 36, 36, 64, 36, 64, 36, 63, 36, 36,
-   36, 79, 76, 74, 61, 61, 61, 61, 27, 27, 27, 61,145, 61, 61, 61,
+   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,146,
-   36, 63, 75, 43, 43, 75, 43, 75,146,  2,  2,  2,  2,  2,  2, 77,
+   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,147, 43, 43, 43, 43, 43, 16, 16, 16, 16, 16, 99, 40, 40,
-   36, 79, 76, 75, 74,146, 76, 43,148,148,148,148,148,148,148,148,
-  149,149,149,149,149,149,149,149, 16, 16, 16, 16, 16, 16, 35, 64,
-   36, 36, 36, 36,150, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41,
-   41,151, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,129,
-  152,152,152,152,152,152,152,152, 36, 36, 36, 36, 36, 36,145, 61,
-    2,  2,  2,153,112,  2,  2,  2,  6,154,155,129,129,129,129,129,
-  129,129,112,153,112,  2,109,156,  2,  2,  2,  2,134,129,129,112,
-    2,157,  8,  8, 60,  2,  2,  2, 36, 36, 36, 36, 36, 36, 36,158,
-    2,  2,  3,  2,  4,  5,  6,  2, 16, 16, 16, 16, 16, 17, 18,111,
-  112,  4,  2, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 40, 20,159, 53, 20, 26,  8,125, 61,
-   61, 61, 61, 61,160, 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,
-  161,161,161,161,161,161,161,161,162, 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,163, 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,164, 27, 27, 27, 27, 36, 36, 36, 36, 36,164, 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,164, 30, 36, 36, 36, 36, 36, 36,164, 27,
-   36, 36, 36, 36, 71, 36, 36, 36, 36, 36, 63, 43, 43,162, 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,
-   27, 27, 27, 84, 36, 36, 36, 36,162, 27, 30,  2,  2,  2,  2,  2,
-   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, 75, 75, 75, 75, 75,
-   36, 63,  2, 36, 36, 36, 36, 36, 36, 79, 75, 43, 43, 43, 43, 74,
-   78, 36, 58,  2, 56, 43, 57,  2,  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, 82,  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,
-   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,146,  2,  2,  2,  2,
-   27, 27, 81, 61, 61, 61, 53, 20,145, 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, 40, 40, 40, 40, 40, 40, 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,
+    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,
+   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,
@@ -5838,185 +5907,188 @@ _hb_ucd_u8[13072] =
     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,  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, 11, 12,  9, 26, 26,  9, 26,  5,  5, 26, 14,  9,  5, 14,
+   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,  9,  7, 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, 13, 12, 13, 15, 26, 10, 10,  1, 13, 23, 23, 15,  0,  1,
-    2,  3,  4,  5,  6,  7,  8,  9,  9, 10, 11,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9, 12, 13,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 14, 15, 16,  9,
-   17, 18, 19, 20, 21, 22,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9, 23,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 24,  9,  9,
-    9,  9, 25,  9,  9,  9, 26,  9, 27,  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,  0,  0,
-    0,  0,  0,  0,  0,  0, 33,  0,  0, 34,  0,  0, 35,  0, 36,  0,
-    0,  0, 37, 38, 39,  0, 40, 41, 42, 43, 44,  0,  0, 45,  0,  0,
-    0, 46,  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,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0, 49,
-    0, 50,  0,  0,  0,  0,  0,  0,  0,  0, 51,  0, 52,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0, 53, 54, 55,  0,  0,  0,  0, 56,  0,  0, 57, 58, 59,
-   60, 61,  0,  0, 62, 63,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 67,  0,  0,  0, 68,  0, 69,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 70,  0,  0, 71,  0,  0,  0,  0,  0,  0,  0,  0, 72,  0,
-    0,  0,  0,  0,  0,  0,  0, 73,  0,  0,  0, 74, 75,  0, 76, 60,
-    0, 77, 78,  0,  0, 79, 80, 81,  0,  0,  0, 82,  0, 83,  0,  0,
-   49, 84, 49,  0, 85,  0, 86,  0,  0,  0, 75,  0,  0,  0,  0,  0,
-    0, 87, 88, 89, 90,  0,  0,  0,  0,  0, 49,  0,  0,  0,  0, 91,
-   92,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0, 93, 94,  0,  0,  0,  0,  0, 95,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,
-   97,  0,  0, 98,  0,  0,  0,  0,  0,  0, 99,  0,  0,  0, 94,  0,
-    0,  0,  0,  0,  0,100,  0,  0,  0,  0,  0,  0,  0,101,  0,102,
-    0,  0,  0,  0,  0,  0,  0,  0,  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,  0,  0,  0, 57, 49,  0,
-   58, 59,  0,  0, 60,  0,  0,  0, 61, 62,  0,  0,  0, 63,  0, 64,
-   65, 66, 67, 68,  1, 69,  0, 70, 71, 72,  0,  0, 73, 74,  0,  0,
-    0, 75,  0,  0,  1,  1,  0,  0, 76,  0,  0, 77,  0,  0,  0,  0,
-   73, 78,  0, 79,  0,  0,  0,  0,  0, 74, 80,  0,  0,  0, 49,  0,
-    1, 74,  0,  0, 81,  0,  0, 82,  0,  0,  0,  0,  0, 83, 54,  0,
-    0,  0,  0,  0,  0, 84, 85,  0,  0, 80,  0,  0, 31,  0,  0, 86,
-    0,  0,  0,  0, 87,  0,  0,  0,  0, 47,  0,  0, 88,  0,  0,  0,
-    0, 89, 90,  0,  0, 91,  0,  0, 92,  0,  0,  0, 93,  0, 94, 88,
-    0,  0, 80,  0,  0, 75,  0,  0,  0, 95, 96,  0,  0, 97, 98,  0,
-    0,  0,  0,  0,  0, 99,  0,  0,100,  0,  0,  0,  0,101, 31,  0,
-  102,103,104, 33,  0,  0,105,  0,  0,  0,106,  0,  0,  0,  0,  0,
-    0,107,  0,  0,108,  0,  0,  0, 54,  0,  0,  0,  0, 49,109,  0,
-    0,  0,  0,110,  0,  0,111,  0,  0,  0,  0,109,  0,  0,  0,  0,
-    0,112,  0,  0,  0,113,  0,114,  0,  0,  0,  0,115,116,117,  0,
-  118,  0,119,  0,  0,  0,120,121,122,  0,  0,  0,123,  0,  0,124,
-    0,  0,125,  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, 41,  0, 56,  0,  0,  0,  0,
-   19, 10,  1,  0,  0,  0,  0,  0, 86,  0,  0, 87,  0,  0, 86,  0,
-    0,  0,  0, 79,  0,  0, 88,  9, 12,  4, 89,  8, 90, 47,  0, 59,
-   50,  0, 21,  1, 21, 91, 92,  1,  1,  1,  1, 93, 94, 95, 96,  1,
-   97, 59, 81, 98, 99,  4, 59,  0,  0,  0,  0,  0,  0, 19, 50,  0,
-    0,  0,  0,  0,  0, 62,  0,  0,100,101,  0,  0,102,  0,  0,  1,
-    1, 50,  0,  0,  0, 38,  0, 64,  0,  0,  0,  0, 52, 69, 62,  0,
-    0,  0, 79,  0,  0,  0,103,104, 59, 38, 81,  0,  0,  0,  0,  0,
-    0,105,  1, 14,  4, 12, 84,  0,  0,  0,  0, 38, 88,  0,  0,  0,
-    0,106,  0,  0,107, 62,  0,108,  0,  0,  0,  1,  0,  0,  0,109,
-   14, 54,  0,  0,110,  0, 88,  0,  0,  0, 62, 63,  0,  0, 63,  0,
-   87,  0,  0,110,  0,  0,  0,  0,111,  0,  0,  0, 79, 56,  0, 38,
-    1, 59,  1, 59,  0,  0, 64, 87,  0,  0,112,  0,  0,  0, 56,  0,
-    0,  0,  0,112,  0,  0,  0,  0, 62,  0,  0, 62,  0,  0,  0,  0,
-   57,  0, 87,113,  0,  0,  8, 90,  0,  0,  1, 88,  0,  0,  0,  0,
-    0,114,  0,115,116,117,118,  0, 52,  4,119, 49, 23,  0,  0,  0,
-   38, 50, 38, 59,  0,  0,  1, 88,  1,  1,  1,  1, 39,  1, 48,103,
-   88,  0,  0,  0,  0,  1,  4,119,  0,  0,  0,  1,120,  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,  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,  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, 17, 17, 17, 17, 17, 17,
+   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,
    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, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   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,
    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,
@@ -6038,245 +6110,268 @@ _hb_ucd_u8[13072] =
    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, 34,  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,
+   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,
    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, 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, 87,116,117,118,119,120,121,122,123,124, 87,125,126, 87,127,
-  128,129,130, 87,131,132, 87,133,134,135, 87, 87,136,137,138,139,
-   87,140, 87, 21,141,141,141,141,141,141,141,141,141,141,141, 87,
-   87, 87, 87, 87,142,142,142,142,142,142,142,142,142, 87, 87, 87,
-   87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,143,143,143,143,
-  143, 87, 87, 87,144,144,144,144,145,146,147,147, 87, 87, 87, 87,
-  148,148,149,150,151,151,151,151,151,151,151,151,151,151,151,151,
-  151,151,151,151,151,151,151,151,151,151, 87, 87, 87, 87, 87, 87,
-   87, 87, 87, 87,152,153,154,155,155,155, 87, 87, 87, 87, 87, 87,
-   87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,156,157, 87, 87,
-   87, 87, 87, 87, 56, 56,158,159, 51, 56, 56, 87, 56, 56, 56, 56,
-   56, 56, 56, 56,160,160,160,160,160,160, 87, 87, 87, 87, 87, 87,
-   87, 87, 87, 87,161, 87,162, 87, 87,163, 87, 87, 87, 87, 87, 87,
-   87, 87, 87, 87,164,164,165, 87, 87, 87, 87, 87, 56, 56, 56, 87,
-   89, 89, 87, 87, 56, 56, 56, 56,166, 87, 56, 56, 56, 56, 56, 56,
-   56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 87, 87, 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, 56, 87,167,167,  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, 17, 18, 19, 19,
-   19, 19, 19, 19, 20, 21, 22, 22, 23, 24, 22, 25, 22, 22, 22, 22,
-   22, 26, 22, 22, 27, 27, 27, 27, 27, 22, 22, 22, 28, 28, 28, 28,
-   29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 27, 27, 22, 22, 22, 22,
-   22, 22, 32, 22, 33, 33, 33, 33, 33, 34, 35, 33, 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, 44,
-   44, 44, 44, 44, 45, 45, 45, 46, 45, 45, 45, 45, 47, 47, 47, 47,
-   47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
-   48, 49, 48, 48, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51,
-   51, 51, 51, 52, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54,
-   54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56,
-   56, 56, 56, 56, 57, 57, 58, 58, 58, 58, 59, 58, 60, 60, 61, 62,
-   63, 63, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 66, 67, 67, 67,
-   67, 67, 67, 67, 67, 67, 67, 56, 56, 56, 56, 56, 68, 68, 68, 68,
-   68, 69, 69, 69, 70, 70, 70, 70, 70, 70, 65, 65, 71, 71, 72, 72,
-   72, 72, 72, 72, 72, 72, 72,  8,  8,  8,  8,  8, 73, 73, 73, 73,
-   73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76,
-   76, 77, 77, 77, 13, 51, 51, 51, 74, 78, 79, 80,  4,  4, 81,  4,
-    4, 82, 83, 84,  4,  4,  4, 85,  8,  8,  8,  8, 11, 11, 11, 11,
-   11, 11, 11, 11, 86,  0,  0,  0,  0,  0,  0, 87,  0,  4,  0,  0,
-    0,  8,  8,  8,  0,  0, 88, 89, 90,  0,  4,  4,  6,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 91, 91, 91, 91,
-   91, 91, 91, 91, 92, 92, 92, 92, 92, 92,  4,  4, 93, 93, 93, 93,
-   93, 93, 93, 93, 51, 51, 51, 94, 94, 94, 94, 94, 54, 54, 54, 54,
-   54, 54, 13, 13, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
-   95, 95, 95,  0, 96,  0, 97, 98, 99,100,100,100,100,101,102,103,
-  103,103,103,104,105,105,105,106, 53, 53, 53, 53, 53,  0,105,105,
-    0,  0,  0,103, 53, 53,  0,  0,  0,  0, 53,107,  0,  0,  0,  0,
-    0,103,103,108,103,103,103,103,103,109,  0,  0, 95, 95, 95, 95,
-    0,  0,  0,  0,110,110,110,110,110,110,110,110,110,110,110,110,
-  110,111,111,111,112,112,112,112,112,112,112,112,112,112,112,112,
-   13, 13, 13, 13, 13, 13,113,113,113,113,113,113,  0,  0,114,  4,
-    4,  4,  4,  4,115,  4,  4,  4,  4,  4,  4,  4,116,116,116,  0,
-  117,117,117,117,118,118,118,118,118,118, 33, 33,119,119,120,121,
-  121,121, 53, 53,122,122,122,122,123,122, 50, 50,124,124,124,124,
-  124,124, 50, 50,125,125,125,125,125,125,126,126, 54, 54, 54,  4,
-    4,127,128, 55, 55, 55, 55, 55,126,126,126,126,129,129,129,129,
-  129,129,129,129,  4,130, 19, 19, 19, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22,131,  0, 22, 22, 22,  8,  0,132,  0,
-    0,  0,  0, 22, 22, 22, 22, 22, 22, 22, 22,133,  0,  0,  1,  2,
-    1,  2,134,102,103,135, 53, 53, 53, 53,  0,  0,136,136,136,136,
-  136,136,136,136,  0,  0,  0,  0, 11, 11, 11, 11, 11,  0, 11, 11,
-   11,  0,  0,137,138,138,139,139,139,139,140,  0,141,141,141,142,
-  142,143,143,143,144,144,145,145,145,145,145,145,146,146,146,146,
-  146,147,147,147,148,148,148,149,149,149,149,149,150,150,150,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,174,174,174,174,174,175,175,175,175,
-  175,175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,
-  177,178,178,178,179,179,179,179,179,180,180,180,181,181,181,181,
-  181,181,182, 44,183,183,183,183,183,183,183,183,184,184,184,185,
-  185,185,185,185,186,186,186,187,186,186,186,186,188,188,188,188,
-  188,188,188,188,189,189,189,189,189,189,189,189,190,190,190,190,
-  190,190,190,190,191,191,191,191,191,191, 67, 67,192,192,192,192,
-  192,192,192,192,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,198,198,198,198,198,198,198,
-  199,199,199,199,200,200,200,200,200,200,200,201,201,201,201,201,
-  201,201,201,201,202,202,202,202,202,202,203,203,203,203,203,203,
-  203,203,203,203,204,204,204,204,204,204,204,204,205,205,205,205,
-  205,205,205,205,206,206,206,206,206,206,206,206,207,207,207,207,
-  207,207,207,207,113,113,113,113,113,113,113,113,113,113,113,113,
-  208,208,208,208,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,212,212,212,212,212,212,213,  0,214,214,214,214,
-  214,214,214,214,215,100,100,100,100,100,100,100,100,100,100,100,
-  100,100,100,100,100,100,100,100,100,100,216,217,217,217,217,217,
-  217,217,217,217,218,218,218,218,218,218,218,218,218,218,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,219,220,221,  0,222,  0,
-    0,  0,  0,  0,223,223,223,223,223,223,223,223, 92, 92, 92, 92,
-   92, 92, 92, 92,224,224,224,224,224,224,224,224,225,225,225,225,
-  225,225,225,225,226,226,226,226,226,226,226,226,227,227,227,227,
-  227,227,227,227,228,  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, 17, 17, 18, 17, 19, 20, 20, 20,
-   20, 20, 20, 20, 21, 22, 21, 23, 21, 21, 24, 24, 21, 21, 21, 21,
-   23, 21, 25,  7,  7, 26, 21, 21, 27, 21, 21, 21, 21, 21, 21, 22,
-   28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
-   32, 32, 32, 32, 33, 21, 21, 21, 34, 34, 34, 34, 35, 36, 34, 34,
-   34, 37, 34, 34, 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, 47, 47, 47, 47, 47, 47, 47, 48,
-   49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 52, 50, 53, 53, 53, 53,
-   54, 54, 54, 54, 54, 54, 55, 54, 56, 56, 56, 56, 57, 57, 57, 57,
-   58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61,
-   61, 61, 62, 63, 64, 64, 64, 64, 65, 65, 65, 65, 65, 66,  0,  0,
-   67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, 70, 71, 72, 72,
-   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, 82, 82, 82, 83,  7,  7,  7,
-   84,  7, 85, 86,  0, 85, 87,  0,  2, 88, 89,  2,  2,  2,  2, 90,
-   91, 88, 92,  2,  2,  2, 93,  2,  2,  2,  2, 94,  0,  0,  0, 87,
-    1,  0,  0, 95,  0, 96, 97,  0,  4,  0,  0,  0,  0,  0,  0,  4,
-   98, 98, 98, 98, 99, 99, 99, 99, 13, 13, 13, 13,100,100,100,100,
-  101,101,101,101,  0,102,  0,  0,103,101,104,105,  0,  0,101,  0,
-  106,107,107,107,107,107,107,107,107,107,108,106,109,110,110,110,
-  110,110,110,110,110,110,111,109,112,112,112,112,113, 56, 56, 56,
-   56, 56, 56,114,110,110,110,111,110,110,  0,  0,115,115,115,115,
-  116,116,116,116,117,117,117,117,118,118,118,118, 97,  2,  2,  2,
-    2,  2, 95,  2,119,119,119,119,120,120,120,120,121,121,121,121,
-  122,122,122,122,122,122,122,123,124,124,124,124,125,125,125,125,
-  125,125,125,126,127,127,127,127,128,128,128,128,129,129,129,129,
-    2,  2,  3,  2,  2,130,  2,  2,131,131,131,131,132, 17, 17, 19,
-   21, 21, 21,133,  7,  7,  7,134, 21, 21, 21, 24,  0,135,110,110,
-  110,110,110,136,137,137,137,137,  0,  0,  0,138,139,139,139,139,
-  140,140,140,140, 85,  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, 46, 46, 46,
-  183,183,183,183,184,184,184,184,185,185,185,185,186,186,186,186,
-  186,186,187,186,188,188,188,188,189,189,189,189,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,  0,  0,  0,214,214,214,214,
-  215,107,107,107,107,110,110,110,216,216,216,216,217,217,217,217,
-    0,218, 87,  0,  0,  0,218,  7, 83,138,  7,  0,  0,  0,219, 87,
-  220,220,220,220,221,221,221,221,222,222,222,222,223,223,223,223,
-  224,224,224,224,225,  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,  0,  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,  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,147,147,147,147,
-  148,148,148,148,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,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,
-  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,
-   16, 50, 84,118, 88, 89, 90, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-   85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 91,
-   85, 85,220, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-   85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 94, 85, 85, 85, 85, 85,
-   85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-   85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 15,
+   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,
+   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,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  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,  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,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  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,
@@ -6298,30 +6393,18 @@ _hb_ucd_u8[13072] =
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  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,
-    0,  0,  0,  0,  0,  0,  0,  0,  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, 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,  0,  0,  0,
-    0,  0,  0,  0,  0,  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,
-    0,  0,  0,  0,  0,  0,  0,  0,  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,
@@ -6332,18 +6415,16 @@ _hb_ucd_u8[13072] =
     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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,168,169,  0,  0,  0,  0,170,171,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  172,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,  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[4800] =
+_hb_ucd_u16[4848] =
 {
      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,
@@ -6358,7 +6439,7 @@ _hb_ucd_u16[4800] =
     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,
-    90,  47,  47, 110, 111, 112,  80, 113, 114,  47,  47,  47, 115, 116,  99, 117,
+   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,
@@ -6368,77 +6449,79 @@ _hb_ucd_u16[4800] =
     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, 172, 172, 172, 172,
-   173,  47,  47, 174, 175, 120, 176, 177, 178,  47, 179,  61,  47,  47, 180, 181,
-    47,  47, 182, 183, 184,  61,  47, 185,  11,   9,   9,   9,  66, 186, 187, 188,
-    11,  11, 189,  27,  27,  27, 190, 191,  11, 192,  27,  27,  32,  32,  32,  32,
-    13,  13,  13,  13,  13,  13,  13,  13,  13, 193,  13,  13,  13,  13,  13,  13,
-   194, 194, 194, 194, 194, 195, 194,  11, 196, 196, 196, 197, 198, 199, 199, 198,
-   200, 201, 202, 203, 204, 205, 206, 207, 208,  27, 209, 209, 209, 210, 211,  32,
-   212, 213, 214, 215, 216, 143, 217, 217, 218, 219, 220, 144, 221, 222, 144, 223,
-   224, 224, 224, 224, 224, 224, 224, 224, 225, 144, 226, 144, 144, 144, 144, 227,
-   144, 228, 224, 229, 144, 230, 231, 144, 144, 144, 144, 144, 144, 144, 143, 143,
-   143, 232, 144, 144, 144, 144, 233, 143, 144, 144, 144, 144, 144, 144, 144, 144,
-   144, 144, 144, 234, 235, 144, 144, 236, 144, 144, 144, 144, 144, 144, 237, 144,
-   144, 144, 144, 144, 144, 144, 238, 239, 143, 240, 144, 144, 241, 224, 242, 224,
-   243, 244, 224, 224, 224, 245, 224, 246, 144, 144, 144, 224, 247, 144, 144, 144,
-     9,   9,   9,  11,  11,  11, 248, 249,  13,  13,  13,  13,  13,  13, 250, 251,
-    11,  11,  11,  47,  47,  47, 252, 253,  47,  47,  47,  47,  47,  47,  32,  32,
-   254, 255, 256, 257, 258,  66,  66,  66, 259, 260, 261, 262, 263,  47,  47,  47,
+    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, 185, 271,  47,  61,  47,  13,  13, 272, 273,
+    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,   9,   9, 286, 287,  47, 288, 289,  47,  47,  47, 290,
+   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,  11,  11,
-    11,  11,  11,  11,  47,  47, 312, 157, 313, 313, 313, 313, 313, 313, 313, 313,
-   314, 314, 314, 314, 314, 314, 314, 314,  11, 315, 316,  47,  47,  47,  47,  47,
-    47,  47,  47, 317,  31, 318,  47,  47,  47,  47,  47, 319, 320,  47,  47,  47,
-    47,  47,  47,  47,  47,  47,  47, 321,  32, 322,  32, 323, 324, 325, 326,  47,
-    47,  47,  47,  47,  47,  47,  47, 327, 328,   2,   3,   4,   5, 329, 330, 331,
-    47, 332,  47,  47,  47,  47, 333, 334, 335, 143, 143, 336, 217, 217, 217, 337,
-   338, 144, 144, 144, 144, 144, 144, 339, 340, 340, 340, 340, 340, 340, 340, 340,
-    47,  47,  47,  47,  47,  47, 341, 143,  47,  47, 342,  47, 343,  47,  47,  60,
-    47, 344,  47,  47,  47, 345, 217, 217,   9,   9, 145,  11,  11,  47,  47,  47,
-    47,  47, 157,   9,   9, 145,  11,  11,  47,  47,  47,  47,  47,  47, 344,  66,
-    47,  47,  47,  47,  47, 346,  47, 347,  47,  47, 348, 143, 143, 143,  47, 349,
-    47, 350,  47, 344,  66,  66,  66,  66,  47,  47,  47, 351, 143, 143, 143, 143,
-   352,  47,  47, 353, 143,  66,  47, 354,  47, 355, 143, 143, 356,  47, 357,  66,
-    47,  47,  47, 358,  47, 359,  47, 359,  47, 358, 142, 143, 143, 143, 143, 143,
-     9,   9,   9,   9,  11,  11,  11, 360,  47,  47, 361, 157, 157, 157, 157, 157,
-   143, 143, 143, 143, 143, 143, 143, 143,  47, 355, 362,  47,  60, 363,  66,  66,
-   364,  47,  47, 353, 365, 366, 367, 368, 178,  47,  47, 369, 370,  47,  47, 157,
-    95,  47, 371, 372, 373,  47,  47, 374, 178,  47,  47, 375, 376, 377, 378, 143,
-    47,  47, 379, 380,  32,  32,  32,  32,  47,  47, 358,  47,  47, 381, 169, 157,
-    90,  47,  47, 110, 382, 383, 384,  32,  47,  47,  47, 385, 386, 387,  47,  47,
-    47,  47,  47, 388, 389, 157, 157, 157,  47,  47, 390, 391, 392, 393,  32,  32,
-    47,  47,  47, 394, 395, 157,  66,  66,  47,  47, 396, 397, 157, 157, 157, 157,
-    47, 141, 398, 399, 144, 144, 144, 144,  47,  47, 379, 400,  66,  66,  66,  66,
-     9,   9,   9,   9,  11,  11, 126, 401,  47,  47,  47,  47,  47, 402, 403, 404,
-   405,  47,  47, 406, 407, 408,  47,  47, 409, 410,  66,  66,  47,  47,  47,  47,
-    47,  47, 390, 411, 412, 126, 143, 413,  47, 152, 414, 415,  32,  32,  32,  32,
-    47,  47,  47, 352, 416, 157,  47,  47, 417, 418, 157, 157, 157, 157, 157, 157,
-    47,  47,  47,  47,  47,  47,  47, 419, 143, 143, 143, 143, 143, 420, 421, 422,
-   217, 217, 217, 217, 217, 217, 217,  66,  47,  47,  47, 206, 206, 206, 206, 206,
-    47,  47,  47,  47,  47,  47, 300,  66,  47,  47,  47,  47,  47,  47,  47, 423,
-    47,  47,  47, 424, 425, 426, 427,  47,   9,   9,   9,   9,   9,   9,  11,  11,
-   143, 428,  66,  66,  66,  66,  66,  66,  47,  47,  47,  47, 381, 429, 404, 404,
-   430, 431,  27,  27,  27,  27, 432,  27,  47, 433, 206, 206, 206, 206, 206, 206,
-   144, 144, 144, 144, 144, 144, 434, 435, 436, 144, 437, 144, 144, 144, 144, 144,
-   144, 144, 144, 144, 438, 144, 144, 144,   9, 439,  11, 440, 441,  11, 194,   9,
-   442, 443,   9, 444,  11,   9, 439,  11, 440, 441,  11, 194,   9, 442, 443,   9,
-   444,  11,   9, 439,  11, 440, 441,  11, 194,   9, 442, 443,   9, 444,  11,   9,
-   439,  11, 194,   9, 445, 446, 447, 448,  11, 449,   9, 450, 451, 452, 453,  11,
-   454,   9, 455,  11, 456, 157, 157, 157,  32,  32,  32, 457,  32,  32, 458, 459,
-   460, 461,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,
-    47,  47,  47, 462, 463, 144, 144, 144,  47,  47,  47,  47,  47,  47, 464, 465,
-    47,  47,  47,  47, 348,  32,  32,  32,   9,   9, 442,  11, 466, 300,  66,  66,
-   143, 143, 467, 468, 143, 143, 143, 143, 143, 143, 469, 143, 143, 143, 143, 143,
-    47,  47,  47,  47,  47,  47,  47, 224, 143, 144, 144, 144, 144, 144, 144, 144,
-   144, 144, 144, 144, 144, 144, 144, 470, 206, 206, 206, 206, 206, 206, 206, 206,
+    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,
      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,
@@ -6607,10 +6690,11 @@ _hb_ucd_u16[4800] =
      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,   0,   0,   0,   0,   0,   0,1948,1949,
-  1950,1951,1952,1953,1954,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1955,1956,1957,1959,1958,
-  1960,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   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,
@@ -6660,12 +6744,12 @@ _hb_ucd_i16[92] =
 static inline uint_fast8_t
 _hb_ucd_gc (unsigned u)
 {
-  return u<1114112u?_hb_ucd_u8[4840+(((_hb_ucd_u8[1072+(((_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[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;
 }
 static inline uint_fast8_t
 _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[6670+(((_hb_ucd_u8[6166+(((_hb_ucd_u8[5754+(((_hb_ucd_u8[5306+(((_hb_ucd_u8[5182+(u>>2>>2>>2>>4)])<<4)+((u>>2>>2>>2)&15u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
+  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;
 }
 static inline unsigned
 _hb_ucd_b4 (const uint8_t* a, unsigned i)
@@ -6675,17 +6759,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[7538+(((_hb_ucd_u8[7314+(((_hb_ucd_u8[7218+(((_hb_ucd_b4(7154+_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[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;
 }
 static inline uint_fast8_t
 _hb_ucd_sc (unsigned u)
 {
-  return u<918016u?_hb_ucd_u8[11048+(((_hb_ucd_u8[10132+(((_hb_ucd_u8[8788+(((_hb_ucd_u8[8228+(((_hb_ucd_u8[7778+(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[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;
 }
 static inline uint_fast16_t
 _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[1504+(((_hb_ucd_u8[12048+(((_hb_ucd_b4(11952+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0;
+  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;
 }
 
 #endif
index b29f2a9..ad72a26 100644 (file)
@@ -136,20 +136,22 @@ hb_ucd_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
   if ((a & 0xFFFFF800u) == 0x0000u && (b & 0xFFFFFF80) == 0x0300u)
   {
     uint32_t k = HB_CODEPOINT_ENCODE3_11_7_14 (a, b, 0);
-    uint32_t *v = (uint32_t*) hb_bsearch (&k, _hb_ucd_dm2_u32_map,
-                                         ARRAY_LENGTH (_hb_ucd_dm2_u32_map),
-                                         sizeof (*_hb_ucd_dm2_u32_map),
-                                         _cmp_pair_11_7_14);
+    const uint32_t *v = hb_bsearch (k,
+                                   _hb_ucd_dm2_u32_map,
+                                   ARRAY_LENGTH (_hb_ucd_dm2_u32_map),
+                                   sizeof (*_hb_ucd_dm2_u32_map),
+                                   _cmp_pair_11_7_14);
     if (likely (!v)) return false;
     u = HB_CODEPOINT_DECODE3_11_7_14_3 (*v);
   }
   else
   {
     uint64_t k = HB_CODEPOINT_ENCODE3 (a, b, 0);
-    uint64_t *v = (uint64_t*) hb_bsearch (&k, _hb_ucd_dm2_u64_map,
-                                         ARRAY_LENGTH (_hb_ucd_dm2_u64_map),
-                                         sizeof (*_hb_ucd_dm2_u64_map),
-                                         _cmp_pair);
+    const uint64_t *v = hb_bsearch (k,
+                                   _hb_ucd_dm2_u64_map,
+                                   ARRAY_LENGTH (_hb_ucd_dm2_u64_map),
+                                   sizeof (*_hb_ucd_dm2_u64_map),
+                                   _cmp_pair);
     if (likely (!v)) return false;
     u = HB_CODEPOINT_DECODE3_3 (*v);
   }
index 1ff79c9..eb7776e 100644 (file)
@@ -7,13 +7,13 @@
  * on file with this header:
  *
  * # emoji-data.txt
- * # Date: 2019-01-15, 12:10:05 GMT
- * # © 2019 Unicode®, Inc.
+ * # Date: 2020-01-28, 20:52:38 GMT
+ * # © 2020 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: 12.0
+ * # Version: 13.0
  * #
  * # For documentation and usage, see http://www.unicode.org/reports/tr51
  */
@@ -36,7 +36,7 @@ _hb_emoji_u8[448] =
     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,  7,  7,  7,  7,  7,
+   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,
index 08a4054..36070a7 100644 (file)
@@ -212,7 +212,7 @@ DEFINE_NULL_INSTANCE (hb_unicode_funcs_t) =
 hb_unicode_funcs_t *
 hb_unicode_funcs_get_empty ()
 {
-  return const_cast<hb_unicode_funcs_t *> (&Null(hb_unicode_funcs_t));
+  return const_cast<hb_unicode_funcs_t *> (&Null (hb_unicode_funcs_t));
 }
 
 /**
index 0c355f1..34d66d7 100644 (file)
@@ -324,10 +324,10 @@ DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
  * Modify Telugu length marks (ccc=84, ccc=91).
  * These are the only matras in the main Indic scripts range that have
  * a non-zero ccc.  That makes them reorder with the Halant (ccc=9).
- * Assign 5 and 6, which are otherwise unassigned.
+ * Assign 4 and 5, which are otherwise unassigned.
  */
-#define HB_MODIFIED_COMBINING_CLASS_CCC84 5 /* length mark */
-#define HB_MODIFIED_COMBINING_CLASS_CCC91 6 /* ai length mark */
+#define HB_MODIFIED_COMBINING_CLASS_CCC84 4 /* length mark */
+#define HB_MODIFIED_COMBINING_CLASS_CCC91 5 /* ai length mark */
 
 /* Thai
  *
index e93cf7f..48a5dc5 100644 (file)
@@ -55,7 +55,7 @@
  * @short_description: Windows integration
  * @include: hb-uniscribe.h
  *
- * Functions for using HarfBuzz with the Windows fonts.
+ * Functions for using HarfBuzz with Windows fonts.
  **/
 
 typedef HRESULT (WINAPI *SIOT) /*ScriptItemizeOpenType*/(
@@ -453,7 +453,7 @@ _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, nullptr, free);
+                        HB_MEMORY_MODE_WRITABLE, new_sfnt_data, free);
 }
 
 hb_uniscribe_face_data_t *
@@ -583,6 +583,16 @@ _hb_uniscribe_shaper_font_data_destroy (hb_uniscribe_font_data_t *data)
   free (data);
 }
 
+/**
+ * hb_uniscribe_font_get_logfontw:
+ * @font: The #hb_font_t to work upon
+ *
+ * Fetches the LOGFONTW structure that corresponds to the
+ * specified #hb_font_t font.
+ *
+ * Return value: a pointer to the LOGFONTW retrieved
+ *
+ **/
 LOGFONTW *
 hb_uniscribe_font_get_logfontw (hb_font_t *font)
 {
@@ -590,6 +600,16 @@ hb_uniscribe_font_get_logfontw (hb_font_t *font)
   return data ? &data->log_font : nullptr;
 }
 
+/**
+ * hb_uniscribe_font_get_hfont:
+ * @font: The #hb_font_t to work upon
+ *
+ * Fetches the HFONT handle that corresponds to the
+ * specified #hb_font_t font.
+ *
+ * Return value: the HFONT retreieved
+ *
+ **/
 HFONT
 hb_uniscribe_font_get_hfont (hb_font_t *font)
 {
index 7b150fb..d979169 100644 (file)
@@ -117,7 +117,7 @@ struct hb_vector_t
   {
     unsigned int i = (unsigned int) i_;
     if (unlikely (i >= length))
-      return Null(Type);
+      return Null (Type);
     return arrayZ[i];
   }
 
@@ -165,7 +165,7 @@ struct hb_vector_t
   Type *push ()
   {
     if (unlikely (!resize (length + 1)))
-      return &Crap(Type);
+      return &Crap (Type);
     return &arrayZ[length - 1];
   }
   template <typename T>
@@ -228,7 +228,7 @@ struct hb_vector_t
 
   Type pop ()
   {
-    if (!length) return Null(Type);
+    if (!length) return Null (Type);
     return hb_move (arrayZ[--length]); /* Does this move actually work? */
   }
 
index a564e9f..f3ac9b0 100644 (file)
@@ -38,9 +38,9 @@ HB_BEGIN_DECLS
 
 #define HB_VERSION_MAJOR 2
 #define HB_VERSION_MINOR 6
-#define HB_VERSION_MICRO 4
+#define HB_VERSION_MICRO 7
 
-#define HB_VERSION_STRING "2.6.4"
+#define HB_VERSION_STRING "2.6.7"
 
 #define HB_VERSION_ATLEAST(major,minor,micro) \
        ((major)*10000+(minor)*100+(micro) <= \
index c5e7072..b0cc06c 100644 (file)
--- a/src/hb.h
+++ b/src/hb.h
@@ -32,6 +32,7 @@
 #include "hb-buffer.h"
 #include "hb-common.h"
 #include "hb-deprecated.h"
+#include "hb-draw.h"
 #include "hb-face.h"
 #include "hb-font.h"
 #include "hb-map.h"
index fcbd330..3adca88 100644 (file)
--- a/src/hb.hh
+++ b/src/hb.hh
 
 #include <limits.h>
 #include <math.h>
+#include <float.h>
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
@@ -317,6 +318,18 @@ extern "C" void  hb_free_impl(void *ptr);
 #  define HB_FALLTHROUGH /* FALLTHROUGH */
 #endif
 
+/* A tag to enforce use of return value for a function */
+#if __cplusplus >= 201703L
+#  define HB_NODISCARD [[nodiscard]]
+#elif defined(__GNUC__) || defined(__clang__)
+#  define HB_NODISCARD __attribute__((warn_unused_result))
+#elif defined(_MSC_VER)
+#  define HB_NODISCARD _Check_return_
+#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__)))
 /* Disable certain sanitizer errors. */
index 983cb55..e898e6e 100644 (file)
@@ -1,5 +1,7 @@
 /*
  * Copyright © 2007,2008,2009  Red Hat, Inc.
+ * Copyright © 2018,2019,2020  Ebrahim Byagowi
+ * Copyright © 2018  Khaled Hosny
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#include "hb-static.cc"
-#include "hb-open-file.hh"
-#include "hb-ot-layout-gdef-table.hh"
-#include "hb-ot-layout-gsubgpos.hh"
-
-#ifdef HAVE_GLIB
-#include <glib.h>
+#ifdef HAVE_CONFIG_H
+#include "config.h"
 #endif
-#include <stdlib.h>
-#include <stdio.h>
 
+#include "hb.h"
+#include "hb-ot.h"
 
-using namespace OT;
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
 
 #ifdef HB_NO_OPEN
 #define hb_blob_create_from_file(x)  hb_blob_get_empty ()
 #endif
 
-int
-main (int argc, char **argv)
+#if !defined(HB_NO_COLOR) && !defined(HB_NO_DRAW) && defined(HB_EXPERIMENTAL_API)
+static void
+svg_dump (hb_face_t *face, unsigned face_index)
 {
-  if (argc != 2)
+  unsigned glyph_count = hb_face_get_glyph_count (face);
+
+  for (unsigned glyph_id = 0; glyph_id < glyph_count; ++glyph_id)
   {
-    fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]);
-    exit (1);
+    hb_blob_t *blob = hb_ot_color_glyph_reference_svg (face, glyph_id);
+
+    if (hb_blob_get_length (blob) == 0) continue;
+
+    unsigned length;
+    const char *data = hb_blob_get_data (blob, &length);
+
+    char output_path[255];
+    sprintf (output_path, "out/svg-%u-%u.svg%s",
+            glyph_id,
+            face_index,
+            // append "z" if the content is gzipped, https://stackoverflow.com/a/6059405
+            (length > 2 && (data[0] == '\x1F') && (data[1] == '\x8B')) ? "z" : "");
+
+    FILE *f = fopen (output_path, "wb");
+    fwrite (data, 1, length, f);
+    fclose (f);
+
+    hb_blob_destroy (blob);
   }
+}
 
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
-  unsigned int len;
-  const char *font_data = hb_blob_get_data (blob, &len);
-  printf ("Opened font file %s: %d bytes long\n", argv[1], len);
+/* _png API is so easy to use unlike the below code, don't get confused */
+static void
+png_dump (hb_face_t *face, unsigned face_index)
+{
+  unsigned glyph_count = hb_face_get_glyph_count (face);
+  hb_font_t *font = hb_font_create (face);
+
+  /* scans the font for strikes */
+  unsigned sample_glyph_id;
+  /* we don't care about different strikes for different glyphs at this point */
+  for (sample_glyph_id = 0; sample_glyph_id < glyph_count; ++sample_glyph_id)
+  {
+    hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, sample_glyph_id);
+    unsigned blob_length = hb_blob_get_length (blob);
+    hb_blob_destroy (blob);
+    if (blob_length != 0)
+      break;
+  }
+
+  unsigned upem = hb_face_get_upem (face);
+  unsigned blob_length = 0;
+  unsigned strike = 0;
+  for (unsigned ppem = 1; ppem < upem; ++ppem)
+  {
+    hb_font_set_ppem (font, ppem, ppem);
+    hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, sample_glyph_id);
+    unsigned new_blob_length = hb_blob_get_length (blob);
+    hb_blob_destroy (blob);
+    if (new_blob_length != blob_length)
+    {
+      for (unsigned glyph_id = 0; glyph_id < glyph_count; ++glyph_id)
+      {
+       hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, glyph_id);
+
+       if (hb_blob_get_length (blob) == 0) continue;
+
+       unsigned length;
+       const char *data = hb_blob_get_data (blob, &length);
+
+       char output_path[255];
+       sprintf (output_path, "out/png-%u-%u-%u.png", glyph_id, strike, face_index);
+
+       FILE *f = fopen (output_path, "wb");
+       fwrite (data, 1, length, f);
+       fclose (f);
+
+       hb_blob_destroy (blob);
+      }
+
+      strike++;
+      blob_length = new_blob_length;
+    }
+  }
+
+  hb_font_destroy (font);
+}
+
+struct user_data_t
+{
+  FILE *f;
+  hb_position_t ascender;
+};
+
+static void
+move_to (hb_position_t to_x, hb_position_t to_y, user_data_t &user_data)
+{
+  fprintf (user_data.f, "M%d,%d", to_x, user_data.ascender - to_y);
+}
+
+static void
+line_to (hb_position_t to_x, hb_position_t to_y, user_data_t &user_data)
+{
+  fprintf (user_data.f, "L%d,%d", to_x, user_data.ascender - to_y);
+}
+
+static void
+quadratic_to (hb_position_t control_x, hb_position_t control_y,
+             hb_position_t to_x, hb_position_t to_y,
+             user_data_t &user_data)
+{
+  fprintf (user_data.f, "Q%d,%d %d,%d", control_x, user_data.ascender - control_y,
+                                       to_x, user_data.ascender - to_y);
+}
+
+static void
+cubic_to (hb_position_t control1_x, hb_position_t control1_y,
+         hb_position_t control2_x, hb_position_t control2_y,
+         hb_position_t to_x, hb_position_t to_y,
+         user_data_t &user_data)
+{
+  fprintf (user_data.f, "C%d,%d %d,%d %d,%d", control1_x, user_data.ascender - control1_y,
+                                              control2_x, user_data.ascender - control2_y,
+                                              to_x, user_data.ascender - to_y);
+}
+
+static void
+close_path (user_data_t &user_data)
+{
+  fprintf (user_data.f, "Z");
+}
+
+static void
+layered_glyph_dump (hb_font_t *font, hb_draw_funcs_t *funcs, unsigned face_index)
+{
+  hb_face_t *face = hb_font_get_face (font);
+  unsigned palette_count = hb_ot_color_palette_get_count (face);
+  for (unsigned palette = 0; palette < palette_count; ++palette)
+  {
+    unsigned num_colors = hb_ot_color_palette_get_colors (face, palette, 0, nullptr, nullptr);
+    if (!num_colors) continue;
+
+    hb_color_t *colors = (hb_color_t*) calloc (num_colors, sizeof (hb_color_t));
+    hb_ot_color_palette_get_colors (face, palette, 0, &num_colors, colors);
+    if (!num_colors)
+    {
+      free (colors);
+      continue;
+    }
+
+    unsigned num_glyphs = hb_face_get_glyph_count (face);
+    for (hb_codepoint_t gid = 0; gid < num_glyphs; ++gid)
+    {
+      unsigned num_layers = hb_ot_color_glyph_get_layers (face, gid, 0, nullptr, nullptr);
+      if (!num_layers) continue;
 
-  hb_blob_t *font_blob = hb_sanitize_context_t().sanitize_blob<OpenTypeFontFile> (blob);
+      hb_ot_color_layer_t *layers = (hb_ot_color_layer_t*) malloc (num_layers * sizeof (hb_ot_color_layer_t));
+
+      hb_ot_color_glyph_get_layers (face, gid, 0, &num_layers, layers);
+      if (num_layers)
+      {
+       hb_font_extents_t font_extents;
+       hb_font_get_extents_for_direction (font, HB_DIRECTION_LTR, &font_extents);
+       hb_glyph_extents_t extents = {0};
+       if (!hb_font_get_glyph_extents (font, gid, &extents))
+       {
+         printf ("Skip gid: %d\n", gid);
+         continue;
+       }
+
+       char output_path[255];
+       sprintf (output_path, "out/colr-%u-%u-%u.svg", gid, palette, face_index);
+       FILE *f = fopen (output_path, "wb");
+       fprintf (f, "<svg xmlns=\"http://www.w3.org/2000/svg\""
+                   " viewBox=\"%d %d %d %d\">\n",
+                   extents.x_bearing, 0,
+                   extents.x_bearing + extents.width, -extents.height);
+       user_data_t user_data;
+       user_data.ascender = extents.y_bearing;
+       user_data.f = f;
+
+       for (unsigned layer = 0; layer < num_layers; ++layer)
+       {
+         hb_color_t color = 0x000000FF;
+         if (layers[layer].color_index != 0xFFFF)
+           color = colors[layers[layer].color_index];
+         fprintf (f, "<path fill=\"#%02X%02X%02X\" ",
+                  hb_color_get_red (color), hb_color_get_green (color), hb_color_get_green (color));
+         if (hb_color_get_alpha (color) != 255)
+           fprintf (f, "fill-opacity=\"%.3f\"", (double) hb_color_get_alpha (color) / 255.);
+         fprintf (f, "d=\"");
+         if (!hb_font_draw_glyph (font, layers[layer].glyph, funcs, &user_data))
+           printf ("Failed to decompose layer %d while %d\n", layers[layer].glyph, gid);
+         fprintf (f, "\"/>\n");
+       }
+
+       fprintf (f, "</svg>");
+       fclose (f);
+      }
+      free (layers);
+    }
+
+    free (colors);
+  }
+}
+
+static void
+dump_glyphs (hb_font_t *font, hb_draw_funcs_t *funcs, unsigned face_index)
+{
+  unsigned num_glyphs = hb_face_get_glyph_count (hb_font_get_face (font));
+  for (unsigned gid = 0; gid < num_glyphs; ++gid)
+  {
+    hb_font_extents_t font_extents;
+    hb_font_get_extents_for_direction (font, HB_DIRECTION_LTR, &font_extents);
+    hb_glyph_extents_t extents = {0};
+    if (!hb_font_get_glyph_extents (font, gid, &extents))
+    {
+      printf ("Skip gid: %d\n", gid);
+      continue;
+    }
+
+    char output_path[255];
+    sprintf (output_path, "out/%u-%u.svg", face_index, gid);
+    FILE *f = fopen (output_path, "wb");
+    fprintf (f, "<svg xmlns=\"http://www.w3.org/2000/svg\""
+               " viewBox=\"%d %d %d %d\"><path d=\"",
+               extents.x_bearing, 0,
+               extents.x_bearing + extents.width, font_extents.ascender - font_extents.descender);
+    user_data_t user_data;
+    user_data.ascender = font_extents.ascender;
+    user_data.f = f;
+    if (!hb_font_draw_glyph (font, gid, funcs, &user_data))
+      printf ("Failed to decompose gid: %d\n", gid);
+    fprintf (f, "\"/></svg>");
+    fclose (f);
+  }
+}
+
+static void
+dump_glyphs (hb_blob_t *blob, const char *font_name)
+{
+  FILE *font_name_file = fopen ("out/.dumped_font_name", "r");
+  if (font_name_file)
+  {
+    fprintf (stderr, "Purge or rename ./out folder if you like to run a glyph dump,\n"
+                    "run it like `rm -rf out && mkdir out && src/main font-file.ttf`\n");
+    return;
+  }
+
+  font_name_file = fopen ("out/.dumped_font_name", "w");
+  if (!font_name_file)
+  {
+    fprintf (stderr, "./out is not accessible as a folder, create it please\n");
+    return;
+  }
+  fwrite (font_name, 1, strlen (font_name), font_name_file);
+  fclose (font_name_file);
+
+  hb_draw_funcs_t *funcs = hb_draw_funcs_create ();
+  hb_draw_funcs_set_move_to_func (funcs, (hb_draw_move_to_func_t) move_to);
+  hb_draw_funcs_set_line_to_func (funcs, (hb_draw_line_to_func_t) line_to);
+  hb_draw_funcs_set_quadratic_to_func (funcs, (hb_draw_quadratic_to_func_t) quadratic_to);
+  hb_draw_funcs_set_cubic_to_func (funcs, (hb_draw_cubic_to_func_t) cubic_to);
+  hb_draw_funcs_set_close_path_func (funcs, (hb_draw_close_path_func_t) close_path);
+
+  unsigned num_faces = hb_face_count (blob);
+  for (unsigned face_index = 0; face_index < num_faces; ++face_index)
+  {
+    hb_face_t *face = hb_face_create (blob, face_index);
+    hb_font_t *font = hb_font_create (face);
+
+    if (hb_ot_color_has_png (face))
+      printf ("Dumping png (CBDT/sbix)...\n");
+    png_dump (face, face_index);
+
+    if (hb_ot_color_has_svg (face))
+      printf ("Dumping svg (SVG )...\n");
+    svg_dump (face, face_index);
+
+    if (hb_ot_color_has_layers (face) && hb_ot_color_has_palettes (face))
+      printf ("Dumping layered color glyphs (COLR/CPAL)...\n");
+    layered_glyph_dump (font, funcs, face_index);
+
+    dump_glyphs (font, funcs, face_index);
+
+    hb_font_destroy (font);
+    hb_face_destroy (face);
+  }
+
+  hb_draw_funcs_destroy (funcs);
+}
+#endif
+
+#ifndef MAIN_CC_NO_PRIVATE_API
+/* Only this part of this mini app uses private API */
+#include "hb-static.cc"
+#include "hb-open-file.hh"
+#include "hb-ot-layout-gdef-table.hh"
+#include "hb-ot-layout-gsubgpos.hh"
+
+using namespace OT;
+
+static void
+print_layout_info_using_private_api (hb_blob_t *blob)
+{
+  const char *font_data = hb_blob_get_data (blob, nullptr);
+  hb_blob_t *font_blob = hb_sanitize_context_t ().sanitize_blob<OpenTypeFontFile> (blob);
   const OpenTypeFontFile* sanitized = font_blob->as<OpenTypeFontFile> ();
   if (!font_blob->data)
   {
     printf ("Sanitization of the file wasn't successful. Exit");
-    return 1;
+    exit (1);
   }
   const OpenTypeFontFile& ot = *sanitized;
 
-
   switch (ot.get_tag ())
   {
   case OpenTypeFontFile::TrueTypeTag:
@@ -91,22 +380,22 @@ main (int argc, char **argv)
     break;
   }
 
-  int num_fonts = ot.get_face_count ();
-  printf ("%d font(s) found in file\n", num_fonts);
-  for (int n_font = 0; n_font < num_fonts; n_font++)
+  unsigned num_faces = hb_face_count (blob);
+  printf ("%d font(s) found in file\n", num_faces);
+  for (unsigned n_font = 0; n_font < num_faces; ++n_font)
   {
     const OpenTypeFontFace &font = ot.get_face (n_font);
-    printf ("Font %d of %d:\n", n_font, num_fonts);
+    printf ("Font %d of %d:\n", n_font, num_faces);
 
-    int num_tables = font.get_table_count ();
+    unsigned num_tables = font.get_table_count ();
     printf ("  %d table(s) found in font\n", num_tables);
-    for (int n_table = 0; n_table < num_tables; n_table++)
+    for (unsigned n_table = 0; n_table < num_tables; ++n_table)
     {
       const OpenTypeTable &table = font.get_table (n_table);
       printf ("  Table %2d of %2d: %.4s (0x%08x+0x%08x)\n", n_table, num_tables,
              (const char *) table.tag,
-             (unsigned int) table.offset,
-             (unsigned int) table.length);
+             (unsigned) table.offset,
+             (unsigned) table.length);
 
       switch (table.tag)
       {
@@ -115,21 +404,22 @@ main (int argc, char **argv)
       case HB_OT_TAG_GPOS:
        {
 
-       const GSUBGPOS &g = *CastP<GSUBGPOS> (font_data + table.offset);
+       const GSUBGPOS &g = *reinterpret_cast<const GSUBGPOS *> (font_data + table.offset);
 
-       int num_scripts = g.get_script_count ();
+       unsigned num_scripts = g.get_script_count ();
        printf ("    %d script(s) found in table\n", num_scripts);
-       for (int n_script = 0; n_script < num_scripts; n_script++)
+       for (unsigned n_script = 0; n_script < num_scripts; ++n_script)
        {
          const Script &script = g.get_script (n_script);
          printf ("    Script %2d of %2d: %.4s\n", n_script, num_scripts,
-                 (const char *)g.get_script_tag(n_script));
+                 (const char *) g.get_script_tag (n_script));
 
-         if (!script.has_default_lang_sys())
+         if (!script.has_default_lang_sys ())
            printf ("      No default language system\n");
          int num_langsys = script.get_lang_sys_count ();
          printf ("      %d language system(s) found in script\n", num_langsys);
-         for (int n_langsys = script.has_default_lang_sys() ? -1 : 0; n_langsys < num_langsys; n_langsys++) {
+         for (int n_langsys = script.has_default_lang_sys () ? -1 : 0; n_langsys < num_langsys; ++n_langsys)
+         {
            const LangSys &langsys = n_langsys == -1
                                   ? script.get_default_lang_sys ()
                                   : script.get_lang_sys (n_langsys);
@@ -137,16 +427,16 @@ main (int argc, char **argv)
              printf ("      Default Language System\n");
            else
              printf ("      Language System %2d of %2d: %.4s\n", n_langsys, num_langsys,
-                     (const char *)script.get_lang_sys_tag (n_langsys));
+                     (const char *) script.get_lang_sys_tag (n_langsys));
            if (!langsys.has_required_feature ())
              printf ("        No required feature\n");
            else
              printf ("        Required feature index: %d\n",
                      langsys.get_required_feature_index ());
 
-           int num_features = langsys.get_feature_count ();
+           unsigned num_features = langsys.get_feature_count ();
            printf ("        %d feature(s) found in language system\n", num_features);
-           for (int n_feature = 0; n_feature < num_features; n_feature++)
+           for (unsigned n_feature = 0; n_feature < num_features; ++n_feature)
            {
              printf ("        Feature index %2d of %2d: %d\n", n_feature, num_features,
                      langsys.get_feature_index (n_feature));
@@ -154,29 +444,29 @@ main (int argc, char **argv)
          }
        }
 
-       int num_features = g.get_feature_count ();
+       unsigned num_features = g.get_feature_count ();
        printf ("    %d feature(s) found in table\n", num_features);
-       for (int n_feature = 0; n_feature < num_features; n_feature++)
+       for (unsigned n_feature = 0; n_feature < num_features; ++n_feature)
        {
          const Feature &feature = g.get_feature (n_feature);
-         int num_lookups = feature.get_lookup_count ();
+         unsigned num_lookups = feature.get_lookup_count ();
          printf ("    Feature %2d of %2d: %c%c%c%c\n", n_feature, num_features,
-                 HB_UNTAG(g.get_feature_tag(n_feature)));
+                 HB_UNTAG (g.get_feature_tag (n_feature)));
 
          printf ("        %d lookup(s) found in feature\n", num_lookups);
-         for (int n_lookup = 0; n_lookup < num_lookups; n_lookup++) {
+         for (unsigned n_lookup = 0; n_lookup < num_lookups; ++n_lookup) {
            printf ("        Lookup index %2d of %2d: %d\n", n_lookup, num_lookups,
                    feature.get_lookup_index (n_lookup));
          }
        }
 
-       int num_lookups = g.get_lookup_count ();
+       unsigned num_lookups = g.get_lookup_count ();
        printf ("    %d lookup(s) found in table\n", num_lookups);
-       for (int n_lookup = 0; n_lookup < num_lookups; n_lookup++)
+       for (unsigned n_lookup = 0; n_lookup < num_lookups; ++n_lookup)
        {
          const Lookup &lookup = g.get_lookup (n_lookup);
          printf ("    Lookup %2d of %2d: type %d, props 0x%04X\n", n_lookup, num_lookups,
-                 lookup.get_type(), lookup.get_props());
+                 lookup.get_type (), lookup.get_props ());
        }
 
        }
@@ -185,7 +475,7 @@ main (int argc, char **argv)
       case GDEF::tableTag:
        {
 
-       const GDEF &gdef = *CastP<GDEF> (font_data + table.offset);
+       const GDEF &gdef = *reinterpret_cast<const GDEF *> (font_data + table.offset);
 
        printf ("    Has %sglyph classes\n",
                  gdef.has_glyph_classes () ? "" : "no ");
@@ -202,6 +492,28 @@ main (int argc, char **argv)
       }
     }
   }
+}
+/* end of private API use */
+#endif
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 2)
+  {
+    fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]);
+    exit (1);
+  }
+
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  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);
+#endif
+#if !defined(HB_NO_COLOR) && !defined(HB_NO_DRAW) && defined(HB_EXPERIMENTAL_API)
+  dump_glyphs (blob, argv[1]);
+#endif
+  hb_blob_destroy (blob);
 
   return 0;
 }
diff --git a/src/meson.build b/src/meson.build
new file mode 100644 (file)
index 0000000..a156e10
--- /dev/null
@@ -0,0 +1,697 @@
+# 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',
+  '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-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-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-shape-complex-arabic-table.hh',
+  'hb-ot-shape-complex-arabic-win1256.hh',
+  'hb-ot-shape-complex-arabic.cc',
+  'hb-ot-shape-complex-arabic.hh',
+  'hb-ot-shape-complex-default.cc',
+  'hb-ot-shape-complex-hangul.cc',
+  'hb-ot-shape-complex-hebrew.cc',
+  'hb-ot-shape-complex-indic-table.cc',
+  '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-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_base_ragel_generated_sources = [
+  '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',
+  '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',
+  'hb-number-parser.rl',
+  'hb-ot-shape-complex-indic-machine.rl',
+  'hb-ot-shape-complex-khmer-machine.rl',
+  'hb-ot-shape-complex-myanmar-machine.rl',
+  'hb-ot-shape-complex-use-machine.rl',
+]
+
+hb_base_headers = [
+  'hb-aat-layout.h',
+  'hb-aat.h',
+  'hb-blob.h',
+  'hb-buffer.h',
+  'hb-common.h',
+  'hb-deprecated.h',
+  'hb-draw.h',
+  'hb-face.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',
+]
+
+# Optional Sources and Headers with external deps
+
+hb_ft_sources = ['hb-ft.cc']
+hb_ft_headers = ['hb-ft.h']
+
+hb_glib_sources = ['hb-glib.cc']
+hb_glib_headers = ['hb-glib.h']
+
+hb_graphite2_sources = ['hb-graphite2.cc']
+hb_graphite2_headers = ['hb-graphite2.h']
+
+# System-dependent sources and headers
+
+hb_coretext_sources = ['hb-coretext.cc']
+hb_coretext_headers = ['hb-coretext.h']
+
+hb_directwrite_sources = ['hb-directwrite.cc']
+hb_directwrite_headers = ['hb-directwrite.h']
+
+hb_gdi_sources = ['hb-gdi.cc']
+hb_gdi_headers = ['hb-gdi.h']
+
+hb_uniscribe_sources = ['hb-uniscribe.cc']
+hb_uniscribe_headers = ['hb-uniscribe.h']
+
+# Sources for libharfbuzz-gobject and libharfbuzz-icu
+hb_icu_sources = ['hb-icu.cc']
+hb_icu_headers = ['hb-icu.h']
+
+# Sources for libharfbuzz-subset
+hb_subset_sources = [
+  'hb-number.cc',
+  'hb-number.hh',
+  'hb-ot-cff1-table.cc',
+  'hb-ot-cff2-table.cc',
+  'hb-static.cc',
+  'hb-subset-cff-common.cc',
+  'hb-subset-cff-common.hh',
+  'hb-subset-cff1.cc',
+  'hb-subset-cff1.hh',
+  'hb-subset-cff2.cc',
+  'hb-subset-cff2.hh',
+  'hb-subset-input.cc',
+  '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_gobject_sources = [
+  'hb-gobject-structs.cc'
+]
+
+hb_gobject_headers = [
+  '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()
+  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)
+endif
+
+custom_target('harfbuzz.cc',
+  build_by_default: true,
+  output: 'harfbuzz.cc',
+  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)
+
+incsrc = include_directories('.')
+
+hb_sources = hb_base_sources + hb_base_ragel_generated_sources
+hb_headers = hb_base_headers
+
+if conf.get('HAVE_FREETYPE', 0) == 1
+  hb_sources += hb_ft_sources
+  hb_headers += hb_ft_headers
+endif
+
+if conf.get('HAVE_GDI', 0) == 1
+  hb_sources += hb_gdi_sources
+  hb_headers += hb_gdi_headers
+endif
+
+if conf.get('HAVE_GRAPHITE2', 0) == 1
+  hb_sources += hb_graphite2_sources
+  hb_headers += hb_graphite2_headers
+endif
+
+if conf.get('HAVE_GLIB', 0) == 1
+  hb_sources += hb_glib_sources
+  hb_headers += hb_glib_headers
+endif
+
+if conf.get('HAVE_UNISCRIBE', 0) == 1
+  hb_sources += hb_uniscribe_sources
+  hb_headers += hb_uniscribe_headers
+endif
+
+if conf.get('HAVE_DIRECTWRITE', 0) == 1
+  hb_sources += hb_directwrite_sources
+  hb_headers += hb_directwrite_headers
+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']
+endif
+
+have_icu = conf.get('HAVE_ICU', 0) == 1
+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'
+endif
+
+# harfbuzz
+gen_def = find_program('gen-def.py')
+
+harfbuzz_def_command_args = [gen_def, '@OUTPUT@', '@INPUT@']
+if get_option('experimental_api')
+  harfbuzz_def_command_args += '--experimental-api'
+endif
+
+harfbuzz_def = custom_target('harfbuzz.def',
+    command: harfbuzz_def_command_args,
+    input: hb_headers,
+    output: 'harfbuzz.def')
+defs_list = [harfbuzz_def]
+
+version = '0.' + '0'.join(meson.project_version().split('.')) + '.0'
+
+extra_hb_cpp_args = []
+if cpp.get_id() == 'msvc'
+  if get_option('default_library') == 'shared'
+    extra_hb_cpp_args += '-DHB_DLL_EXPORT'
+  endif
+  hb_so_version = ''
+else
+  hb_so_version = '0'
+endif
+
+libharfbuzz = library('harfbuzz', hb_sources,
+  include_directories: incconfig,
+  dependencies: deps,
+  cpp_args: cpp_args + extra_hb_cpp_args,
+  soversion: hb_so_version,
+  version: version,
+  install: true,
+  link_language: chosen_linker,
+)
+
+libharfbuzz_dep = declare_dependency(
+  link_with: libharfbuzz,
+  include_directories: incsrc,
+  dependencies: deps)
+
+# harfbuzz-subset
+harfbuzz_subset_def = custom_target('harfbuzz-subset.def',
+    command: [gen_def, '@OUTPUT@', '@INPUT@'],
+    input: hb_subset_headers,
+    output: 'harfbuzz-subset.def')
+defs_list += [harfbuzz_subset_def]
+
+libharfbuzz_subset = library('harfbuzz-subset', hb_subset_sources,
+  include_directories: incconfig,
+  dependencies: deps,
+  link_with: [libharfbuzz],
+  cpp_args: cpp_args + extra_hb_cpp_args,
+  soversion: hb_so_version,
+  version: version,
+  install: true,
+  link_language: chosen_linker,
+)
+
+libharfbuzz_subset_dep = declare_dependency(
+  link_with: libharfbuzz_subset,
+  include_directories: incsrc,
+  dependencies: deps)
+
+if get_option('tests').enabled()
+  # TODO: MSVC gives the following,
+  # error LNK2019: unresolved external symbol "unsigned __int64 const * const _hb_NullPool"
+  if cpp.get_id() != 'msvc'
+    noinst_programs = {
+      'main': 'main.cc',
+      'test-basics': 'test.cc',
+      'test-buffer-serialize': 'test-buffer-serialize.cc',
+      'test-ot-meta': 'test-ot-meta.cc',
+      'test-ot-name': 'test-ot-name.cc',
+      'test-ot-glyphname': 'test-ot-glyphname.cc',
+      'test-ot-gpos-size-params': 'test-gpos-size-params.cc',
+      'test-ot-gsub-would-substitute': 'test-gsub-would-substitute.cc',
+    }
+    foreach name, source : noinst_programs
+      executable(name, source,
+        include_directories: incconfig,
+        cpp_args: cpp_args,
+        dependencies: libharfbuzz_dep,
+        install: false,
+      )
+    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-number': ['test-number.cc', 'hb-number.cc'],
+    'test-ot-tag': 'hb-ot-tag.cc',
+    'test-unicode-ranges': 'test-unicode-ranges.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
+    test(name, executable(name, source,
+      include_directories: incconfig,
+      cpp_args: cpp_args + ['-DMAIN', '-UNDEBUG'],
+      dependencies: libharfbuzz_dep,
+      install: false,
+    ), suite: ['src'])
+  endforeach
+endif
+
+pkgmod.generate(libharfbuzz,
+  description: 'HarfBuzz text shaping library',
+  subdirs: [meson.project_name()],
+  version: meson.project_version(),
+)
+
+pkgmod.generate(libharfbuzz_subset,
+  description: 'HarfBuzz font subsetter',
+  subdirs: [meson.project_name()],
+  version: meson.project_version(),
+)
+
+if have_icu and not have_icu_builtin
+  harfbuzz_icu_def = custom_target('harfbuzz-icu.def',
+    command: [gen_def, '@OUTPUT@', '@INPUT@'],
+    input: [hb_icu_headers],
+    output: 'harfbuzz-icu.def')
+  defs_list += [harfbuzz_icu_def]
+
+  libharfbuzz_icu = library('harfbuzz-icu', [hb_icu_sources, hb_icu_headers],
+    include_directories: incconfig,
+    dependencies: icu_dep,
+    link_with: [libharfbuzz],
+    cpp_args: cpp_args + extra_hb_cpp_args,
+    soversion: hb_so_version,
+    version: version,
+    install: true,
+    # ICU links to stdc++ anyway so the default linker is good
+    # link_language: chosen_linker,
+  )
+
+  libharfbuzz_icu_dep = declare_dependency(
+    link_with: libharfbuzz_icu,
+    include_directories: incsrc,
+    dependencies: deps)
+
+  pkgmod.generate(libharfbuzz_icu,
+    description: 'HarfBuzz text shaping library ICU integration',
+    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
+
+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')
+configure_file(input: 'harfbuzz-config.cmake.in',
+  output: 'harfbuzz-config.cmake',
+  configuration: cmake_config,
+  install_dir: get_option('libdir') / 'cmake' / 'harfbuzz')
+
+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')
+
+  cc_templ = configure_file(
+    input: 'hb-gobject-enums.cc.tmpl',
+    output: 'hb-gobject-enums-tmp.cc.tmpl',
+    configuration: configuration_data(),
+    format: 'cmake')
+
+  enums = gnome.mkenums('hb-gobject',
+    sources: hb_headers,
+    h_template: h_templ,
+    c_template: cc_templ,
+    identifier_prefix: 'hb_',
+    symbol_prefix: 'hb_gobject',
+  )
+
+  enum_c = custom_target('hb-gobject-enums.cc',
+    input: enums[0],
+    output: 'hb-gobject-enums.cc',
+    command: [find_program('fix_get_types.py'), '@INPUT@', '@OUTPUT@']
+  )
+
+  enum_h = custom_target('hb-gobject-enums.h',
+    input: enums[1],
+    output: 'hb-gobject-enums.h',
+    command: [find_program('fix_get_types.py'), '@INPUT@', '@OUTPUT@'],
+    install: true,
+    install_dir: get_option('prefix') / get_option('includedir') / meson.project_name(),
+  )
+
+  hb_gobject_sources += [enum_c]
+
+  harfbuzz_gobject_def = custom_target('harfbuzz-gobject.def',
+    command: [gen_def, '@OUTPUT@', '@INPUT@'],
+    input: [hb_gobject_headers, enum_h],
+    output: 'harfbuzz-gobject.def')
+  defs_list += [harfbuzz_gobject_def]
+
+  libharfbuzz_gobject = library('harfbuzz-gobject', [hb_gobject_sources, enum_c, enum_h],
+    include_directories: incconfig,
+    dependencies: deps,
+    link_with: [libharfbuzz],
+    cpp_args: cpp_args + extra_hb_cpp_args,
+    soversion: hb_so_version,
+    version: version,
+    install: true,
+    link_language: chosen_linker,
+  )
+
+  gir = find_program('g-ir-scanner', required: get_option('introspection'))
+  build_gir = gir.found() and not meson.is_cross_build()
+
+  if build_gir
+    conf.set('HAVE_INTROSPECTION', 1)
+    hb_gen_files_gir = gnome.generate_gir(libharfbuzz, libharfbuzz_gobject,
+      sources: [hb_headers, hb_sources, hb_gobject_headers, hb_gobject_sources, enum_h],
+      namespace: 'HarfBuzz',
+      nsversion: '0.0',
+      identifier_prefix: 'hb_',
+      symbol_prefix: ['hb', 'hb_gobject'],
+      includes: ['GObject-2.0'],
+      export_packages: ['harfbuzz-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_EXTERN=',
+                    '--cflags-end'])
+  endif
+
+  libharfbuzz_gobject_dep = declare_dependency(
+    link_with: libharfbuzz_gobject,
+    include_directories: incsrc,
+    sources: build_gir ? hb_gen_files_gir : hb_gobject_sources,
+    dependencies: deps)
+
+  pkgmod.generate(libharfbuzz_gobject,
+    description: 'HarfBuzz text shaping library GObject integration',
+    subdirs: [meson.project_name()],
+    version: meson.project_version(),
+  )
+
+  install_headers(hb_gobject_headers, subdir: meson.project_name())
+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()
+  dist_check_script = [
+    'check-c-linkage-decls',
+    'check-externs',
+    'check-header-guards',
+    'check-includes',
+  ]
+
+  env = environment()
+  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))
+
+  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']
+  endif
+
+  foreach name : dist_check_script
+    test(name, find_program(name + '.py'),
+      env: env,
+      depends: name == 'check-symbols' ? defs_list : [],
+      suite: ['src'],
+    )
+  endforeach
+endif
+
+install_headers(hb_headers + hb_subset_headers, subdir: meson.project_name())
diff --git a/src/test-array.cc b/src/test-array.cc
new file mode 100644 (file)
index 0000000..6c88813
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * 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-array.hh"
+
+static void
+test_reverse ()
+{
+  int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
+  hb_array_t<int> a (values, 9);
+  a.reverse();
+
+  int expected_values[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
+  hb_array_t<int> expected (expected_values, 9);
+  assert (a == expected);
+}
+
+static void
+test_reverse_range ()
+{
+  int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
+  hb_array_t<int> a (values, 9);
+  a.reverse(2, 6);
+
+  int expected_values[] = {1, 2, 6, 5, 4, 3, 7, 8, 9};
+  hb_array_t<int> expected (expected_values, 9);
+  assert (a == expected);
+}
+
+static void
+test_reverse_invalid ()
+{
+  int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
+  hb_array_t<int> a (values, 9);
+
+  a.reverse(4, 3);
+  a.reverse(2, 3);
+  a.reverse(5, 5);
+  a.reverse(12, 15);
+
+  int expected_values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
+  hb_array_t<int> expected (expected_values, 9);
+  assert (a == expected);
+}
+
+int
+main (int argc, char **argv)
+{
+  test_reverse ();
+  test_reverse_range ();
+  test_reverse_invalid ();
+}
index 6393f0b..0e78099 100644 (file)
@@ -68,7 +68,7 @@ main (int argc, char **argv)
   buf = hb_buffer_create ();
 
   char line[BUFSIZ], out[BUFSIZ];
-  while (fgets (line, sizeof(line), stdin) != nullptr)
+  while (fgets (line, sizeof(line), stdin))
   {
     hb_buffer_clear_contents (buf);
 
index 9c83171..fd201c8 100644 (file)
@@ -105,7 +105,7 @@ test_iterator (Iter it)
 template <typename Iterable,
          hb_requires (hb_is_iterable (Iterable))>
 static void
-test_iterable (const Iterable &lst = Null(Iterable))
+test_iterable (const Iterable &lst = Null (Iterable))
 {
   for (auto _ : lst)
     (void) _;
index 0b6e02c..9436b90 100644 (file)
@@ -29,6 +29,8 @@
 
 #include <type_traits>
 
+template <typename T> struct U { typedef T type; };
+
 int
 main (int argc, char **argv)
 {
@@ -122,6 +124,9 @@ main (int argc, char **argv)
   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 3591b13..5783528 100644 (file)
@@ -25,7 +25,6 @@
 
 #include "hb.hh"
 #include "hb-number.hh"
-#include "hb-number-parser.hh"
 
 
 int
@@ -146,11 +145,6 @@ main (int argc, char **argv)
     assert ((int) roundf (pv * 1000.) == 123);
     assert (pp - str == 4);
     assert (end - pp == 1);
-
-    /* Test strtod_rl even if libc's strtod_l is used */
-    char *pend;
-    assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == 123);
-    assert (pend - str == 4);
   }
 
   {
@@ -163,10 +157,6 @@ main (int argc, char **argv)
     assert ((int) roundf (pv * 1000.) == 123);
     assert (pp - str == 5);
     assert (end - pp == 0);
-
-    char *pend;
-    assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == 123);
-    assert (pend - str == 5);
   }
 
   {
@@ -179,10 +169,6 @@ main (int argc, char **argv)
     assert ((int) roundf (pv * 1000.) == 123);
     assert (pp - str == 7);
     assert (end - pp == 0);
-
-    char *pend;
-    assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == 123);
-    assert (pend - str == 7);
   }
 
   {
@@ -195,10 +181,6 @@ main (int argc, char **argv)
     assert ((int) roundf (pv * 1000.) == 123);
     assert (pp - str == 6);
     assert (end - pp == 0);
-
-    char *pend;
-    assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == 123);
-    assert (pend - str == 6);
   }
 
   {
@@ -211,10 +193,6 @@ main (int argc, char **argv)
     assert ((int) roundf (pv * 1000.) == 123);
     assert (pp - str == 10);
     assert (end - pp == 0);
-
-    char *pend;
-    assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == 123);
-    assert (pend - str == 10);
   }
 
   {
@@ -228,9 +206,6 @@ main (int argc, char **argv)
     assert (pp - str == 13);
     assert (end - pp == 0);
 
-    char *pend;
-    assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == -123);
-    assert (pend - str == 13);
   }
 
   {
@@ -243,10 +218,6 @@ main (int argc, char **argv)
     assert ((int) roundf (pv * 1000.) == -123);
     assert (pp - str == 8);
     assert (end - pp == 0);
-
-    char *pend;
-    assert ((int) roundf (strtod_rl (str, &pend) * 1000.) == -123);
-    assert (pend - str == 8);
   }
 
   return 0;
diff --git a/src/test-ot-color.cc b/src/test-ot-color.cc
deleted file mode 100644 (file)
index 88924b4..0000000
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright © 2018  Ebrahim Byagowi
- * Copyright © 2018  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.hh"
-
-#include <cairo.h>
-
-#ifdef HB_NO_OPEN
-#define hb_blob_create_from_file(x)  hb_blob_get_empty ()
-#endif
-
-#if !defined(HB_NO_COLOR) && defined(CAIRO_HAS_SVG_SURFACE)
-
-#include "hb-ot.h"
-
-#include "hb-ft.h"
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_GLYPH_H
-
-#include <cairo-ft.h>
-#include <cairo-svg.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-
-static void
-svg_dump (hb_face_t *face, unsigned int face_index)
-{
-  unsigned glyph_count = hb_face_get_glyph_count (face);
-
-  for (unsigned int glyph_id = 0; glyph_id < glyph_count; glyph_id++)
-  {
-    hb_blob_t *blob = hb_ot_color_glyph_reference_svg (face, glyph_id);
-
-    if (hb_blob_get_length (blob) == 0) continue;
-
-    unsigned int length;
-    const char *data = hb_blob_get_data (blob, &length);
-
-    char output_path[255];
-    sprintf (output_path, "out/svg-%u-%u.svg%s",
-            glyph_id,
-            face_index,
-            // append "z" if the content is gzipped, https://stackoverflow.com/a/6059405
-            (length > 2 && (data[0] == '\x1F') && (data[1] == '\x8B')) ? "z" : "");
-
-    FILE *f = fopen (output_path, "wb");
-    fwrite (data, 1, length, f);
-    fclose (f);
-
-    hb_blob_destroy (blob);
-  }
-}
-
-/* _png API is so easy to use unlike the below code, don't get confused */
-static void
-png_dump (hb_face_t *face, unsigned int face_index)
-{
-  unsigned glyph_count = hb_face_get_glyph_count (face);
-  hb_font_t *font = hb_font_create (face);
-
-  /* scans the font for strikes */
-  unsigned int sample_glyph_id;
-  /* we don't care about different strikes for different glyphs at this point */
-  for (sample_glyph_id = 0; sample_glyph_id < glyph_count; sample_glyph_id++)
-  {
-    hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, sample_glyph_id);
-    unsigned int blob_length = hb_blob_get_length (blob);
-    hb_blob_destroy (blob);
-    if (blob_length != 0)
-      break;
-  }
-
-  unsigned int upem = hb_face_get_upem (face);
-  unsigned int blob_length = 0;
-  unsigned int strike = 0;
-  for (unsigned int ppem = 1; ppem < upem; ppem++)
-  {
-    hb_font_set_ppem (font, ppem, ppem);
-    hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, sample_glyph_id);
-    unsigned int new_blob_length = hb_blob_get_length (blob);
-    hb_blob_destroy (blob);
-    if (new_blob_length != blob_length)
-    {
-      for (unsigned int glyph_id = 0; glyph_id < glyph_count; glyph_id++)
-      {
-       hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, glyph_id);
-
-       if (hb_blob_get_length (blob) == 0) continue;
-
-       unsigned int length;
-       const char *data = hb_blob_get_data (blob, &length);
-
-       char output_path[255];
-       sprintf (output_path, "out/png-%u-%u-%u.png", glyph_id, strike, face_index);
-
-       FILE *f = fopen (output_path, "wb");
-       fwrite (data, 1, length, f);
-       fclose (f);
-
-       hb_blob_destroy (blob);
-      }
-
-      strike++;
-      blob_length = new_blob_length;
-    }
-  }
-
-  hb_font_destroy (font);
-}
-
-static void
-layered_glyph_dump (hb_face_t *face, cairo_font_face_t *cairo_face, unsigned int face_index)
-{
-  unsigned int upem = hb_face_get_upem (face);
-
-  unsigned glyph_count = hb_face_get_glyph_count (face);
-  for (hb_codepoint_t gid = 0; gid < glyph_count; ++gid)
-  {
-    unsigned int num_layers = hb_ot_color_glyph_get_layers (face, gid, 0, nullptr, nullptr);
-    if (!num_layers)
-      continue;
-
-    hb_ot_color_layer_t *layers = (hb_ot_color_layer_t*) malloc (num_layers * sizeof (hb_ot_color_layer_t));
-
-    hb_ot_color_glyph_get_layers (face, gid, 0, &num_layers, layers);
-    if (num_layers)
-    {
-      // Measure
-      cairo_text_extents_t extents;
-      {
-       cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
-       cairo_t *cr = cairo_create (surface);
-       cairo_set_font_face (cr, cairo_face);
-       cairo_set_font_size (cr, upem);
-
-       cairo_glyph_t *glyphs = (cairo_glyph_t *) calloc (num_layers, sizeof (cairo_glyph_t));
-       for (unsigned int j = 0; j < num_layers; ++j)
-         glyphs[j].index = layers[j].glyph;
-       cairo_glyph_extents (cr, glyphs, num_layers, &extents);
-       free (glyphs);
-       cairo_surface_destroy (surface);
-       cairo_destroy (cr);
-      }
-
-      // Add a slight margin
-      extents.width += extents.width / 10;
-      extents.height += extents.height / 10;
-      extents.x_bearing -= extents.width / 20;
-      extents.y_bearing -= extents.height / 20;
-
-      // Render
-      unsigned int palette_count = hb_ot_color_palette_get_count (face);
-      for (unsigned int palette = 0; palette < palette_count; palette++)
-      {
-       unsigned int num_colors = hb_ot_color_palette_get_colors (face, palette, 0, nullptr, nullptr);
-       if (!num_colors)
-         continue;
-
-       hb_color_t *colors = (hb_color_t*) calloc (num_colors, sizeof (hb_color_t));
-       hb_ot_color_palette_get_colors (face, palette, 0, &num_colors, colors);
-       if (num_colors)
-       {
-         char output_path[255];
-         sprintf (output_path, "out/colr-%u-%u-%u.svg", gid, palette, face_index);
-
-         cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
-         cairo_t *cr = cairo_create (surface);
-         cairo_set_font_face (cr, cairo_face);
-         cairo_set_font_size (cr, upem);
-
-         for (unsigned int layer = 0; layer < num_layers; ++layer)
-         {
-           hb_color_t color = 0x000000FF;
-           if (layers[layer].color_index != 0xFFFF)
-             color = colors[layers[layer].color_index];
-           cairo_set_source_rgba (cr,
-                                  hb_color_get_red (color) / 255.,
-                                  hb_color_get_green (color) / 255.,
-                                  hb_color_get_blue (color) / 255.,
-                                  hb_color_get_alpha (color) / 255.);
-
-           cairo_glyph_t glyph;
-           glyph.index = layers[layer].glyph;
-           glyph.x = -extents.x_bearing;
-           glyph.y = -extents.y_bearing;
-           cairo_show_glyphs (cr, &glyph, 1);
-         }
-
-         cairo_surface_destroy (surface);
-         cairo_destroy (cr);
-       }
-       free (colors);
-      }
-    }
-
-    free (layers);
-  }
-}
-
-static void
-dump_glyphs (cairo_font_face_t *cairo_face, unsigned int upem,
-            unsigned int num_glyphs, unsigned int face_index)
-{
-  for (unsigned int i = 0; i < num_glyphs; ++i)
-  {
-    cairo_text_extents_t extents;
-    cairo_glyph_t glyph = {0};
-    glyph.index = i;
-
-    // Measure
-    {
-      cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
-      cairo_t *cr = cairo_create (surface);
-      cairo_set_font_face (cr, cairo_face);
-      cairo_set_font_size (cr, upem);
-
-      cairo_glyph_extents (cr, &glyph, 1, &extents);
-      cairo_surface_destroy (surface);
-      cairo_destroy (cr);
-    }
-
-    // Add a slight margin
-    extents.width += extents.width / 10;
-    extents.height += extents.height / 10;
-    extents.x_bearing -= extents.width / 20;
-    extents.y_bearing -= extents.height / 20;
-
-    // Render
-    {
-      char output_path[255];
-      sprintf (output_path, "out/%u-%u.svg", face_index, i);
-      cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
-      cairo_t *cr = cairo_create (surface);
-      cairo_set_font_face (cr, cairo_face);
-      cairo_set_font_size (cr, upem);
-      glyph.x = -extents.x_bearing;
-      glyph.y = -extents.y_bearing;
-      cairo_show_glyphs (cr, &glyph, 1);
-      cairo_surface_destroy (surface);
-      cairo_destroy (cr);
-    }
-  }
-}
-
-int
-main (int argc, char **argv)
-{
-  if (argc != 2) {
-    fprintf (stderr, "usage: %s font-file.ttf\n"
-                    "run it like `rm -rf out && mkdir out && %s font-file.ttf`\n",
-                    argv[0], argv[0]);
-    exit (1);
-  }
-
-
-  FILE *font_name_file = fopen ("out/.dumped_font_name", "r");
-  if (font_name_file != nullptr)
-  {
-    fprintf (stderr, "Purge or move ./out folder in order to run a new dump\n");
-    exit (1);
-  }
-
-  font_name_file = fopen ("out/.dumped_font_name", "w");
-  if (font_name_file == nullptr)
-  {
-    fprintf (stderr, "./out is not accessible as a folder, create it please\n");
-    exit (1);
-  }
-  fwrite (argv[1], 1, strlen (argv[1]), font_name_file);
-  fclose (font_name_file);
-
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
-  unsigned int num_faces = hb_face_count (blob);
-  if (num_faces == 0)
-  {
-    fprintf (stderr, "error: The file (%s) was corrupted, empty or not found", argv[1]);
-    exit (1);
-  }
-
-  for (unsigned int face_index = 0; face_index < hb_face_count (blob); face_index++)
-  {
-    hb_face_t *face = hb_face_create (blob, face_index);
-    hb_font_t *font = hb_font_create (face);
-
-    if (hb_ot_color_has_png (face)) printf ("Dumping png (cbdt/sbix)...\n");
-    png_dump (face, face_index);
-
-    if (hb_ot_color_has_svg (face)) printf ("Dumping svg...\n");
-    svg_dump (face, face_index);
-
-    cairo_font_face_t *cairo_face;
-    {
-      FT_Library library;
-      FT_Init_FreeType (&library);
-      FT_Face ft_face;
-      FT_New_Face (library, argv[1], 0, &ft_face);
-      cairo_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0);
-    }
-    if (hb_ot_color_has_layers (face) && hb_ot_color_has_palettes (face))
-      printf ("Dumping layered color glyphs...\n");
-    layered_glyph_dump (face, cairo_face, face_index);
-
-    unsigned int num_glyphs = hb_face_get_glyph_count (face);
-    unsigned int upem = hb_face_get_upem (face);
-
-    // disabled when color font as cairo rendering of NotoColorEmoji is soooo slow
-    if (!hb_ot_color_has_layers (face) &&
-       !hb_ot_color_has_png (face) &&
-       !hb_ot_color_has_svg (face))
-      dump_glyphs (cairo_face, upem, num_glyphs, face_index);
-
-    hb_font_destroy (font);
-    hb_face_destroy (face);
-    }
-
-  hb_blob_destroy (blob);
-
-  return 0;
-}
-
-#else
-int main (int argc, char **argv) { return 0; }
-#endif
diff --git a/src/test-ot-glyphname.cc b/src/test-ot-glyphname.cc
new file mode 100644 (file)
index 0000000..dffc62b
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright © 2019  Adobe, 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#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 ()
+#endif
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 2) {
+    fprintf (stderr, "usage: %s font-file\n", argv[0]);
+    exit (1);
+  }
+
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+  hb_font_t *font = hb_font_create (face);
+  hb_blob_destroy (blob);
+  blob = nullptr;
+  
+
+  const unsigned int num_glyphs = hb_face_get_glyph_count (face);
+  int  result = 1;
+
+  for (hb_codepoint_t gid = 0; gid < num_glyphs; gid++)
+  {
+    char buf[64];
+    unsigned int buf_size = sizeof (buf);
+    if (hb_font_get_glyph_name (font, gid, buf, buf_size))
+    {
+      hb_codepoint_t   gid_inv;
+      if (hb_font_get_glyph_from_name(font, buf, strlen (buf), &gid_inv))
+      {
+       if (gid == gid_inv)
+       {
+         printf ("%u <-> %s\n", gid, buf);
+       }
+       else
+       {
+         printf ("%u -> %s -> %u\n", gid, buf, gid_inv);
+         result = 0;
+       }
+      }
+      else
+      {
+       printf ("%u -> %s -> ?\n", gid, buf);
+       result = 0;
+      }
+    }
+    else
+    {
+      printf ("%u -> ?\n", gid);
+      result = 0;
+    }
+  }
+
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+
+  return result;
+}
diff --git a/subprojects/expat.wrap b/subprojects/expat.wrap
new file mode 100644 (file)
index 0000000..0b7c53e
--- /dev/null
@@ -0,0 +1,10 @@
+[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
new file mode 100644 (file)
index 0000000..6b18b2b
--- /dev/null
@@ -0,0 +1,6 @@
+[wrap-git]
+directory=fontconfig
+url=https://github.com/centricular/fontconfig.git
+depth=1
+push-url=git@github.com:centricular/fontconfig.git
+revision=meson
diff --git a/subprojects/freetype2.wrap b/subprojects/freetype2.wrap
new file mode 100644 (file)
index 0000000..7c88f89
--- /dev/null
@@ -0,0 +1,6 @@
+[wrap-git]
+directory=freetype2
+url=https://github.com/centricular/freetype2.git
+depth=1
+push-url=git@github.com:centricular/freetype2.git
+revision=meson
diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap
new file mode 100644 (file)
index 0000000..7a4eae1
--- /dev/null
@@ -0,0 +1,6 @@
+[wrap-git]
+directory=glib
+url=https://gitlab.gnome.org/GNOME/glib.git
+depth=1
+push-url=git@gitlab.gnome.org:GNOME/glib.git
+revision=2.58.1
diff --git a/subprojects/libffi.wrap b/subprojects/libffi.wrap
new file mode 100644 (file)
index 0000000..466ca81
--- /dev/null
@@ -0,0 +1,5 @@
+[wrap-git]
+directory=libffi
+url=https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
+depth=1
+revision=meson
diff --git a/subprojects/proxy-libintl.wrap b/subprojects/proxy-libintl.wrap
new file mode 100644 (file)
index 0000000..5e1e19a
--- /dev/null
@@ -0,0 +1,5 @@
+[wrap-git]
+directory=proxy-libintl
+url=https://github.com/frida/proxy-libintl.git
+depth=1
+revision=0.1
diff --git a/subprojects/zlib.wrap b/subprojects/zlib.wrap
new file mode 100644 (file)
index 0000000..b62b63a
--- /dev/null
@@ -0,0 +1,5 @@
+[wrap-git]
+directory=zlib
+url=https://github.com/centricular/zlib.git
+depth=1
+revision=meson
index b8521a4..89dba1e 100755 (executable)
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 2011-2018 Free Software Foundation, Inc.
+# Copyright (C) 2011-2020 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
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
deleted file mode 100644 (file)
index d2b1994..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-add_subdirectory(api)
-add_subdirectory(shaping)
-add_subdirectory(subset)
-add_subdirectory(fuzzing)
index 66b3e6e..b67d707 100644 (file)
@@ -5,7 +5,7 @@ EXTRA_DIST =
 SUBDIRS = api shaping fuzzing subset
 
 EXTRA_DIST += \
-       CMakeLists.txt \
+       meson.build \
        $(NULL)
 
 # Convenience targets:
index e3bbce9..8f0ee9e 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -321,6 +321,8 @@ 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@
@@ -377,7 +379,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
-EXTRA_DIST = CMakeLists.txt $(NULL)
+EXTRA_DIST = meson.build $(NULL)
 SUBDIRS = api shaping fuzzing subset
 all: all-recursive
 
diff --git a/test/api/CMakeLists.txt b/test/api/CMakeLists.txt
deleted file mode 100644 (file)
index 0c7337c..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-if (HB_HAVE_GLIB)
-  file (READ "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.am" MAKEFILEAM)
-  extract_make_variable (TEST_PROGS ${MAKEFILEAM})
-
-  list (APPEND TEST_PROGS
-    test-ot-color
-    test-ot-name
-    test-ot-tag
-    test-c
-    test-cplusplus
-  )
-
-  if (HB_HAVE_FREETYPE)
-    list (APPEND TEST_PROGS test-ot-math)
-  endif ()
-
-  foreach (test_name IN ITEMS ${TEST_PROGS})
-    if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${test_name}.c)
-      add_executable (${test_name} ${test_name}.c)
-    elseif (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${test_name}.cc)
-      add_executable (${test_name} ${test_name}.cc)
-    else ()
-      message (FATAL_ERROR "No source file found for test ${test_name}")
-    endif ()
-    target_link_libraries (${test_name} harfbuzz harfbuzz-subset)
-    if (WIN32)
-      set_property (TARGET ${test_name} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
-      add_test (NAME ${test_name} COMMAND ${test_name})
-    else (WIN32)
-      add_test (${test_name} ${test_name})
-    endif (WIN32)
-  endforeach ()
-  set_tests_properties (${TEST_PROGS} PROPERTIES ENVIRONMENT
-    "G_TEST_SRCDIR=${CMAKE_CURRENT_SOURCE_DIR};G_TEST_BUILDDIR=${CMAKE_CURRENT_BINARY_DIR}"
-  )
-endif ()
index 9d4084b..0170b68 100644 (file)
@@ -12,7 +12,7 @@ lib:
 libs:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
 
-EXTRA_DIST += CMakeLists.txt
+EXTRA_DIST += meson.build
 
 EXTRA_DIST += fonts
 
@@ -32,12 +32,24 @@ TEST_PROGS = \
        test-baseline \
        test-blob \
        test-buffer \
+       test-c \
        test-collect-unicodes \
+       test-cplusplus \
        test-common \
+       test-draw \
        test-font \
        test-map \
        test-object \
+       test-ot-color \
        test-ot-face \
+       test-ot-glyphname \
+       test-ot-ligature-carets \
+       test-ot-name \
+       test-ot-meta \
+       test-ot-metrics \
+       test-ot-tag \
+       test-ot-extents-cff \
+       test-ot-metrics-tt-var \
        test-set \
        test-shape \
        test-subset \
@@ -46,14 +58,22 @@ TEST_PROGS = \
        test-subset-glyf \
        test-subset-hdmx \
        test-subset-hmtx \
+       test-subset-nameids \
        test-subset-os2 \
        test-subset-post \
        test-subset-vmtx \
        test-subset-cff1 \
        test-subset-cff2 \
+       test-subset-gvar \
+       test-subset-hvar \
+       test-subset-vvar \
+       test-subset-sbix \
+       test-subset-gpos \
+       test-subset-colr \
+       test-subset-cbdt \
        test-unicode \
+       test-var-coords \
        test-version \
-       test-subset-nameids \
        $(NULL)
 
 test_subset_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
@@ -67,7 +87,14 @@ test_subset_post_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 test_subset_vmtx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 test_subset_cff1_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 test_subset_cff2_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_gvar_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_hvar_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_vvar_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_sbix_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_cbdt_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 test_subset_nameids_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_gpos_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_colr_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 
 test_unicode_CPPFLAGS = \
        $(AM_CPPFLAGS) \
@@ -79,19 +106,6 @@ test_unicode_CPPFLAGS += $(ICU_CFLAGS)
 test_unicode_LDADD += $(top_builddir)/src/libharfbuzz-icu.la $(ICU_LIBS)
 endif
 
-
-TEST_PROGS += \
-       test-ot-color \
-       test-ot-ligature-carets \
-       test-ot-name \
-       test-ot-meta \
-       test-ot-metrics \
-       test-ot-tag \
-       test-ot-extents-cff \
-       test-ot-metrics-tt-var \
-       $(NULL)
-
-
 if HAVE_PTHREAD
 if HAVE_FREETYPE
 TEST_PROGS += test-multithread
@@ -111,12 +125,7 @@ test_ot_math_LDADD = $(LDADD) $(FREETYPE_LIBS)
 test_ot_math_CPPFLAGS = $(AM_CPPFLAGS) $(FREETYPE_CFLAGS)
 endif # HAVE_FREETYPE
 
-
 # Tests for header compilation
-TEST_PROGS += \
-       test-c \
-       test-cplusplus \
-       $(NULL)
 test_cplusplus_SOURCES = test-cplusplus.cc
 test_c_CPPFLAGS = $(AM_CPPFLAGS)
 test_cplusplus_CPPFLAGS = $(AM_CPPFLAGS)
index 9a3158a..35bb394 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -132,33 +132,40 @@ am__EXEEXT_1 =
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@   $(am__EXEEXT_1)
 @HAVE_GLIB_TRUE@am__EXEEXT_4 = test-aat-layout$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-baseline$(EXEEXT) test-blob$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-buffer$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-buffer$(EXEEXT) test-c$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-collect-unicodes$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-common$(EXEEXT) test-font$(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-face$(EXEEXT) test-set$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-shape$(EXEEXT) test-subset$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-subset-cmap$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-ot-color$(EXEEXT) 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-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-subset-drop-tables$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-glyf$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-hdmx$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-hmtx$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-subset-nameids$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-os2$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-post$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-vmtx$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-cff1$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-subset-cff2$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-unicode$(EXEEXT) test-version$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-subset-nameids$(EXEEXT) $(am__EXEEXT_1) \
-@HAVE_GLIB_TRUE@       test-ot-color$(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-extents-cff$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-ot-metrics-tt-var$(EXEEXT) \
-@HAVE_GLIB_TRUE@       $(am__EXEEXT_1) $(am__EXEEXT_2) \
-@HAVE_GLIB_TRUE@       $(am__EXEEXT_3) test-c$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-cplusplus$(EXEEXT) $(am__EXEEXT_1)
+@HAVE_GLIB_TRUE@       test-subset-gvar$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-subset-hvar$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-subset-vvar$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-subset-sbix$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-subset-gpos$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-subset-colr$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-subset-cbdt$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-unicode$(EXEEXT) test-var-coords$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-version$(EXEEXT) $(am__EXEEXT_1) \
+@HAVE_GLIB_TRUE@       $(am__EXEEXT_2) $(am__EXEEXT_3)
 PROGRAMS = $(noinst_PROGRAMS)
 test_aat_layout_SOURCES = test-aat-layout.c
 test_aat_layout_OBJECTS = test-aat-layout.$(OBJEXT)
@@ -215,6 +222,12 @@ test_cplusplus_LDADD = $(LDADD)
 @HAVE_GLIB_TRUE@test_cplusplus_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
+test_draw_SOURCES = test-draw.c
+test_draw_OBJECTS = test-draw.$(OBJEXT)
+test_draw_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_draw_DEPENDENCIES =  \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
 test_font_SOURCES = test-font.c
 test_font_OBJECTS = test-font.$(OBJEXT)
 test_font_LDADD = $(LDADD)
@@ -260,6 +273,12 @@ test_ot_face_LDADD = $(LDADD)
 @HAVE_GLIB_TRUE@test_ot_face_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
+test_ot_glyphname_SOURCES = test-ot-glyphname.c
+test_ot_glyphname_OBJECTS = test-ot-glyphname.$(OBJEXT)
+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_ligature_carets_SOURCES = test-ot-ligature-carets.c
 test_ot_ligature_carets_OBJECTS = test-ot-ligature-carets.$(OBJEXT)
 test_ot_ligature_carets_LDADD = $(LDADD)
@@ -317,6 +336,10 @@ test_subset_SOURCES = test-subset.c
 test_subset_OBJECTS = test-subset.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_cbdt_SOURCES = test-subset-cbdt.c
+test_subset_cbdt_OBJECTS = test-subset-cbdt.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_cbdt_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
 test_subset_cff1_SOURCES = test-subset-cff1.c
 test_subset_cff1_OBJECTS = test-subset-cff1.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_cff1_DEPENDENCIES = $(am__DEPENDENCIES_2) \
@@ -329,6 +352,10 @@ test_subset_cmap_SOURCES = test-subset-cmap.c
 test_subset_cmap_OBJECTS = test-subset-cmap.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_cmap_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_colr_SOURCES = test-subset-colr.c
+test_subset_colr_OBJECTS = test-subset-colr.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_colr_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
 test_subset_drop_tables_SOURCES = test-subset-drop-tables.c
 test_subset_drop_tables_OBJECTS = test-subset-drop-tables.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_drop_tables_DEPENDENCIES =  \
@@ -338,6 +365,14 @@ test_subset_glyf_SOURCES = test-subset-glyf.c
 test_subset_glyf_OBJECTS = test-subset-glyf.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_glyf_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_gpos_SOURCES = test-subset-gpos.c
+test_subset_gpos_OBJECTS = test-subset-gpos.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_gpos_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_gvar_SOURCES = test-subset-gvar.c
+test_subset_gvar_OBJECTS = test-subset-gvar.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_gvar_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
 test_subset_hdmx_SOURCES = test-subset-hdmx.c
 test_subset_hdmx_OBJECTS = test-subset-hdmx.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_hdmx_DEPENDENCIES = $(am__DEPENDENCIES_2) \
@@ -346,6 +381,10 @@ test_subset_hmtx_SOURCES = test-subset-hmtx.c
 test_subset_hmtx_OBJECTS = test-subset-hmtx.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_hmtx_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_hvar_SOURCES = test-subset-hvar.c
+test_subset_hvar_OBJECTS = test-subset-hvar.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_hvar_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
 test_subset_nameids_SOURCES = test-subset-nameids.c
 test_subset_nameids_OBJECTS = test-subset-nameids.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_nameids_DEPENDENCIES =  \
@@ -359,16 +398,30 @@ test_subset_post_SOURCES = test-subset-post.c
 test_subset_post_OBJECTS = test-subset-post.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_post_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_sbix_SOURCES = test-subset-sbix.c
+test_subset_sbix_OBJECTS = test-subset-sbix.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_sbix_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
 test_subset_vmtx_SOURCES = test-subset-vmtx.c
 test_subset_vmtx_OBJECTS = test-subset-vmtx.$(OBJEXT)
 @HAVE_GLIB_TRUE@test_subset_vmtx_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_vvar_SOURCES = test-subset-vvar.c
+test_subset_vvar_OBJECTS = test-subset-vvar.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_vvar_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
 test_unicode_SOURCES = test-unicode.c
 test_unicode_OBJECTS = test_unicode-test-unicode.$(OBJEXT)
 @HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__DEPENDENCIES_3 = $(top_builddir)/src/libharfbuzz-icu.la \
 @HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@        $(am__DEPENDENCIES_1)
 @HAVE_GLIB_TRUE@test_unicode_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_3)
+test_var_coords_SOURCES = test-var-coords.c
+test_var_coords_OBJECTS = test-var-coords.$(OBJEXT)
+test_var_coords_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_var_coords_DEPENDENCIES =  \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
 test_version_SOURCES = test-version.c
 test_version_OBJECTS = test-version.$(OBJEXT)
 test_version_LDADD = $(LDADD)
@@ -394,26 +447,35 @@ am__depfiles_remade = ./$(DEPDIR)/test-aat-layout.Po \
        ./$(DEPDIR)/test-baseline.Po ./$(DEPDIR)/test-blob.Po \
        ./$(DEPDIR)/test-buffer.Po \
        ./$(DEPDIR)/test-collect-unicodes.Po \
-       ./$(DEPDIR)/test-common.Po ./$(DEPDIR)/test-font.Po \
-       ./$(DEPDIR)/test-map.Po ./$(DEPDIR)/test-object.Po \
-       ./$(DEPDIR)/test-ot-color.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-ot-extents-cff.Po ./$(DEPDIR)/test-ot-face.Po \
+       ./$(DEPDIR)/test-ot-glyphname.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-cff1.Po \
+       ./$(DEPDIR)/test-shape.Po ./$(DEPDIR)/test-subset-cbdt.Po \
+       ./$(DEPDIR)/test-subset-cff1.Po \
        ./$(DEPDIR)/test-subset-cff2.Po \
        ./$(DEPDIR)/test-subset-cmap.Po \
+       ./$(DEPDIR)/test-subset-colr.Po \
        ./$(DEPDIR)/test-subset-drop-tables.Po \
        ./$(DEPDIR)/test-subset-glyf.Po \
+       ./$(DEPDIR)/test-subset-gpos.Po \
+       ./$(DEPDIR)/test-subset-gvar.Po \
        ./$(DEPDIR)/test-subset-hdmx.Po \
        ./$(DEPDIR)/test-subset-hmtx.Po \
+       ./$(DEPDIR)/test-subset-hvar.Po \
        ./$(DEPDIR)/test-subset-nameids.Po \
        ./$(DEPDIR)/test-subset-os2.Po ./$(DEPDIR)/test-subset-post.Po \
-       ./$(DEPDIR)/test-subset-vmtx.Po ./$(DEPDIR)/test-subset.Po \
-       ./$(DEPDIR)/test-version.Po ./$(DEPDIR)/test_c-test-c.Po \
+       ./$(DEPDIR)/test-subset-sbix.Po \
+       ./$(DEPDIR)/test-subset-vmtx.Po \
+       ./$(DEPDIR)/test-subset-vvar.Po ./$(DEPDIR)/test-subset.Po \
+       ./$(DEPDIR)/test-var-coords.Po ./$(DEPDIR)/test-version.Po \
+       ./$(DEPDIR)/test_c-test-c.Po \
        ./$(DEPDIR)/test_cplusplus-test-cplusplus.Po \
        ./$(DEPDIR)/test_multithread-test-multithread.Po \
        ./$(DEPDIR)/test_ot_math-test-ot-math.Po \
@@ -454,30 +516,36 @@ 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-font.c test-map.c \
+       $(test_cplusplus_SOURCES) test-draw.c test-font.c test-map.c \
        test-multithread.c test-object.c test-ot-color.c \
-       test-ot-extents-cff.c test-ot-face.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-cff1.c \
-       test-subset-cff2.c test-subset-cmap.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-hdmx.c test-subset-hmtx.c test-subset-nameids.c \
-       test-subset-os2.c test-subset-post.c test-subset-vmtx.c \
-       test-unicode.c test-version.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-font.c test-map.c \
-       test-multithread.c test-object.c test-ot-color.c \
-       test-ot-extents-cff.c test-ot-face.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-cff1.c \
-       test-subset-cff2.c test-subset-cmap.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-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-hdmx.c test-subset-hmtx.c test-subset-nameids.c \
-       test-subset-os2.c test-subset-post.c test-subset-vmtx.c \
-       test-unicode.c test-version.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;; \
@@ -843,6 +911,8 @@ 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@
@@ -899,30 +969,33 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
-EXTRA_DIST = CMakeLists.txt fonts $(am__append_1)
+EXTRA_DIST = meson.build fonts $(am__append_1)
 CLEANFILES = $(am__append_10)
 DISTCLEANFILES = 
 MAINTAINERCLEANFILES = 
 LINK = $(CXXLINK)
 @HAVE_GLIB_TRUE@AM_CPPFLAGS = -DSRCDIR="\"$(srcdir)\"" -I$(top_srcdir)/src/ -I$(top_builddir)/src/ $(GLIB_CFLAGS)
 @HAVE_GLIB_TRUE@LDADD = $(top_builddir)/src/libharfbuzz.la $(GLIB_LIBS)
-
-# Tests for header compilation
 @HAVE_GLIB_TRUE@TEST_PROGS = test-aat-layout test-baseline test-blob \
-@HAVE_GLIB_TRUE@       test-buffer test-collect-unicodes test-common \
-@HAVE_GLIB_TRUE@       test-font test-map test-object test-ot-face \
+@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-ot-extents-cff test-ot-metrics-tt-var \
 @HAVE_GLIB_TRUE@       test-set test-shape 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-os2 \
-@HAVE_GLIB_TRUE@       test-subset-post test-subset-vmtx \
-@HAVE_GLIB_TRUE@       test-subset-cff1 test-subset-cff2 test-unicode \
-@HAVE_GLIB_TRUE@       test-version test-subset-nameids $(NULL) \
-@HAVE_GLIB_TRUE@       test-ot-color test-ot-ligature-carets \
-@HAVE_GLIB_TRUE@       test-ot-name test-ot-meta test-ot-metrics \
-@HAVE_GLIB_TRUE@       test-ot-tag test-ot-extents-cff \
-@HAVE_GLIB_TRUE@       test-ot-metrics-tt-var $(NULL) $(am__append_4) \
-@HAVE_GLIB_TRUE@       $(am__append_5) test-c test-cplusplus $(NULL)
+@HAVE_GLIB_TRUE@       test-subset-hmtx test-subset-nameids \
+@HAVE_GLIB_TRUE@       test-subset-os2 test-subset-post \
+@HAVE_GLIB_TRUE@       test-subset-vmtx test-subset-cff1 \
+@HAVE_GLIB_TRUE@       test-subset-cff2 test-subset-gvar \
+@HAVE_GLIB_TRUE@       test-subset-hvar test-subset-vvar \
+@HAVE_GLIB_TRUE@       test-subset-sbix test-subset-gpos \
+@HAVE_GLIB_TRUE@       test-subset-colr test-subset-cbdt test-unicode \
+@HAVE_GLIB_TRUE@       test-var-coords test-version $(NULL) \
+@HAVE_GLIB_TRUE@       $(am__append_4) $(am__append_5)
 @HAVE_GLIB_TRUE@test_subset_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 @HAVE_GLIB_TRUE@test_subset_cmap_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 @HAVE_GLIB_TRUE@test_subset_drop_tables_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
@@ -934,7 +1007,14 @@ LINK = $(CXXLINK)
 @HAVE_GLIB_TRUE@test_subset_vmtx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 @HAVE_GLIB_TRUE@test_subset_cff1_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 @HAVE_GLIB_TRUE@test_subset_cff2_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_gvar_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_hvar_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_vvar_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_sbix_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_cbdt_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 @HAVE_GLIB_TRUE@test_subset_nameids_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_gpos_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_colr_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 @HAVE_GLIB_TRUE@test_unicode_CPPFLAGS = $(AM_CPPFLAGS) $(GLIB_CFLAGS) \
 @HAVE_GLIB_TRUE@       $(NULL) $(am__append_2)
 @HAVE_GLIB_TRUE@test_unicode_LDADD = $(LDADD) $(am__append_3)
@@ -945,6 +1025,8 @@ LINK = $(CXXLINK)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_PTHREAD_TRUE@test_multithread_LINK = $(LINK) $(PTHREAD_CFLAGS)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@test_ot_math_LDADD = $(LDADD) $(FREETYPE_LIBS)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@test_ot_math_CPPFLAGS = $(AM_CPPFLAGS) $(FREETYPE_CFLAGS)
+
+# Tests for header compilation
 @HAVE_GLIB_TRUE@test_cplusplus_SOURCES = test-cplusplus.cc
 @HAVE_GLIB_TRUE@test_c_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_6) \
 @HAVE_GLIB_TRUE@       $(am__append_8)
@@ -1060,6 +1142,10 @@ test-cplusplus$(EXEEXT): $(test_cplusplus_OBJECTS) $(test_cplusplus_DEPENDENCIES
        @rm -f test-cplusplus$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_cplusplus_OBJECTS) $(test_cplusplus_LDADD) $(LIBS)
 
+test-draw$(EXEEXT): $(test_draw_OBJECTS) $(test_draw_DEPENDENCIES) $(EXTRA_test_draw_DEPENDENCIES) 
+       @rm -f test-draw$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_draw_OBJECTS) $(test_draw_LDADD) $(LIBS)
+
 test-font$(EXEEXT): $(test_font_OBJECTS) $(test_font_DEPENDENCIES) $(EXTRA_test_font_DEPENDENCIES) 
        @rm -f test-font$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_font_OBJECTS) $(test_font_LDADD) $(LIBS)
@@ -1088,6 +1174,10 @@ test-ot-face$(EXEEXT): $(test_ot_face_OBJECTS) $(test_ot_face_DEPENDENCIES) $(EX
        @rm -f test-ot-face$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_ot_face_OBJECTS) $(test_ot_face_LDADD) $(LIBS)
 
+test-ot-glyphname$(EXEEXT): $(test_ot_glyphname_OBJECTS) $(test_ot_glyphname_DEPENDENCIES) $(EXTRA_test_ot_glyphname_DEPENDENCIES) 
+       @rm -f test-ot-glyphname$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_ot_glyphname_OBJECTS) $(test_ot_glyphname_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)
@@ -1128,6 +1218,10 @@ test-subset$(EXEEXT): $(test_subset_OBJECTS) $(test_subset_DEPENDENCIES) $(EXTRA
        @rm -f test-subset$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_OBJECTS) $(test_subset_LDADD) $(LIBS)
 
+test-subset-cbdt$(EXEEXT): $(test_subset_cbdt_OBJECTS) $(test_subset_cbdt_DEPENDENCIES) $(EXTRA_test_subset_cbdt_DEPENDENCIES) 
+       @rm -f test-subset-cbdt$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_cbdt_OBJECTS) $(test_subset_cbdt_LDADD) $(LIBS)
+
 test-subset-cff1$(EXEEXT): $(test_subset_cff1_OBJECTS) $(test_subset_cff1_DEPENDENCIES) $(EXTRA_test_subset_cff1_DEPENDENCIES) 
        @rm -f test-subset-cff1$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_cff1_OBJECTS) $(test_subset_cff1_LDADD) $(LIBS)
@@ -1140,6 +1234,10 @@ test-subset-cmap$(EXEEXT): $(test_subset_cmap_OBJECTS) $(test_subset_cmap_DEPEND
        @rm -f test-subset-cmap$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_cmap_OBJECTS) $(test_subset_cmap_LDADD) $(LIBS)
 
+test-subset-colr$(EXEEXT): $(test_subset_colr_OBJECTS) $(test_subset_colr_DEPENDENCIES) $(EXTRA_test_subset_colr_DEPENDENCIES) 
+       @rm -f test-subset-colr$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_colr_OBJECTS) $(test_subset_colr_LDADD) $(LIBS)
+
 test-subset-drop-tables$(EXEEXT): $(test_subset_drop_tables_OBJECTS) $(test_subset_drop_tables_DEPENDENCIES) $(EXTRA_test_subset_drop_tables_DEPENDENCIES) 
        @rm -f test-subset-drop-tables$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_drop_tables_OBJECTS) $(test_subset_drop_tables_LDADD) $(LIBS)
@@ -1148,6 +1246,14 @@ test-subset-glyf$(EXEEXT): $(test_subset_glyf_OBJECTS) $(test_subset_glyf_DEPEND
        @rm -f test-subset-glyf$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_glyf_OBJECTS) $(test_subset_glyf_LDADD) $(LIBS)
 
+test-subset-gpos$(EXEEXT): $(test_subset_gpos_OBJECTS) $(test_subset_gpos_DEPENDENCIES) $(EXTRA_test_subset_gpos_DEPENDENCIES) 
+       @rm -f test-subset-gpos$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_gpos_OBJECTS) $(test_subset_gpos_LDADD) $(LIBS)
+
+test-subset-gvar$(EXEEXT): $(test_subset_gvar_OBJECTS) $(test_subset_gvar_DEPENDENCIES) $(EXTRA_test_subset_gvar_DEPENDENCIES) 
+       @rm -f test-subset-gvar$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_gvar_OBJECTS) $(test_subset_gvar_LDADD) $(LIBS)
+
 test-subset-hdmx$(EXEEXT): $(test_subset_hdmx_OBJECTS) $(test_subset_hdmx_DEPENDENCIES) $(EXTRA_test_subset_hdmx_DEPENDENCIES) 
        @rm -f test-subset-hdmx$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_hdmx_OBJECTS) $(test_subset_hdmx_LDADD) $(LIBS)
@@ -1156,6 +1262,10 @@ test-subset-hmtx$(EXEEXT): $(test_subset_hmtx_OBJECTS) $(test_subset_hmtx_DEPEND
        @rm -f test-subset-hmtx$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_hmtx_OBJECTS) $(test_subset_hmtx_LDADD) $(LIBS)
 
+test-subset-hvar$(EXEEXT): $(test_subset_hvar_OBJECTS) $(test_subset_hvar_DEPENDENCIES) $(EXTRA_test_subset_hvar_DEPENDENCIES) 
+       @rm -f test-subset-hvar$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_hvar_OBJECTS) $(test_subset_hvar_LDADD) $(LIBS)
+
 test-subset-nameids$(EXEEXT): $(test_subset_nameids_OBJECTS) $(test_subset_nameids_DEPENDENCIES) $(EXTRA_test_subset_nameids_DEPENDENCIES) 
        @rm -f test-subset-nameids$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_nameids_OBJECTS) $(test_subset_nameids_LDADD) $(LIBS)
@@ -1168,14 +1278,26 @@ test-subset-post$(EXEEXT): $(test_subset_post_OBJECTS) $(test_subset_post_DEPEND
        @rm -f test-subset-post$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_post_OBJECTS) $(test_subset_post_LDADD) $(LIBS)
 
+test-subset-sbix$(EXEEXT): $(test_subset_sbix_OBJECTS) $(test_subset_sbix_DEPENDENCIES) $(EXTRA_test_subset_sbix_DEPENDENCIES) 
+       @rm -f test-subset-sbix$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_sbix_OBJECTS) $(test_subset_sbix_LDADD) $(LIBS)
+
 test-subset-vmtx$(EXEEXT): $(test_subset_vmtx_OBJECTS) $(test_subset_vmtx_DEPENDENCIES) $(EXTRA_test_subset_vmtx_DEPENDENCIES) 
        @rm -f test-subset-vmtx$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_subset_vmtx_OBJECTS) $(test_subset_vmtx_LDADD) $(LIBS)
 
+test-subset-vvar$(EXEEXT): $(test_subset_vvar_OBJECTS) $(test_subset_vvar_DEPENDENCIES) $(EXTRA_test_subset_vvar_DEPENDENCIES) 
+       @rm -f test-subset-vvar$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_vvar_OBJECTS) $(test_subset_vvar_LDADD) $(LIBS)
+
 test-unicode$(EXEEXT): $(test_unicode_OBJECTS) $(test_unicode_DEPENDENCIES) $(EXTRA_test_unicode_DEPENDENCIES) 
        @rm -f test-unicode$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_unicode_OBJECTS) $(test_unicode_LDADD) $(LIBS)
 
+test-var-coords$(EXEEXT): $(test_var_coords_OBJECTS) $(test_var_coords_DEPENDENCIES) $(EXTRA_test_var_coords_DEPENDENCIES) 
+       @rm -f test-var-coords$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_var_coords_OBJECTS) $(test_var_coords_LDADD) $(LIBS)
+
 test-version$(EXEEXT): $(test_version_OBJECTS) $(test_version_DEPENDENCIES) $(EXTRA_test_version_DEPENDENCIES) 
        @rm -f test-version$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_version_OBJECTS) $(test_version_LDADD) $(LIBS)
@@ -1192,12 +1314,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-buffer.Po@am__quote@ # am--include-marker
 @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.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-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-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
@@ -1206,18 +1330,26 @@ 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-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
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-cmap.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-colr.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-drop-tables.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-glyf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-gpos.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-gvar.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-hdmx.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-hmtx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-hvar.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-nameids.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-os2.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-post.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-sbix.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-vmtx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-vvar.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-var-coords.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-version.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_c-test-c.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cplusplus-test-cplusplus.Po@am__quote@ # am--include-marker
@@ -1570,6 +1702,13 @@ test-buffer.log: test-buffer$(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-c.log: test-c$(EXEEXT)
+       @p='test-c$(EXEEXT)'; \
+       b='test-c'; \
+       $(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-collect-unicodes.log: test-collect-unicodes$(EXEEXT)
        @p='test-collect-unicodes$(EXEEXT)'; \
        b='test-collect-unicodes'; \
@@ -1577,6 +1716,13 @@ test-collect-unicodes.log: test-collect-unicodes$(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-cplusplus.log: test-cplusplus$(EXEEXT)
+       @p='test-cplusplus$(EXEEXT)'; \
+       b='test-cplusplus'; \
+       $(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-common.log: test-common$(EXEEXT)
        @p='test-common$(EXEEXT)'; \
        b='test-common'; \
@@ -1584,6 +1730,13 @@ test-common.log: test-common$(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-draw.log: test-draw$(EXEEXT)
+       @p='test-draw$(EXEEXT)'; \
+       b='test-draw'; \
+       $(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-font.log: test-font$(EXEEXT)
        @p='test-font$(EXEEXT)'; \
        b='test-font'; \
@@ -1605,6 +1758,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-color.log: test-ot-color$(EXEEXT)
+       @p='test-ot-color$(EXEEXT)'; \
+       b='test-ot-color'; \
+       $(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'; \
@@ -1612,6 +1772,62 @@ test-ot-face.log: test-ot-face$(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-glyphname.log: test-ot-glyphname$(EXEEXT)
+       @p='test-ot-glyphname$(EXEEXT)'; \
+       b='test-ot-glyphname'; \
+       $(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-ligature-carets.log: test-ot-ligature-carets$(EXEEXT)
+       @p='test-ot-ligature-carets$(EXEEXT)'; \
+       b='test-ot-ligature-carets'; \
+       $(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'; \
+       $(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-meta.log: test-ot-meta$(EXEEXT)
+       @p='test-ot-meta$(EXEEXT)'; \
+       b='test-ot-meta'; \
+       $(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-metrics.log: test-ot-metrics$(EXEEXT)
+       @p='test-ot-metrics$(EXEEXT)'; \
+       b='test-ot-metrics'; \
+       $(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-tag.log: test-ot-tag$(EXEEXT)
+       @p='test-ot-tag$(EXEEXT)'; \
+       b='test-ot-tag'; \
+       $(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-extents-cff.log: test-ot-extents-cff$(EXEEXT)
+       @p='test-ot-extents-cff$(EXEEXT)'; \
+       b='test-ot-extents-cff'; \
+       $(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-metrics-tt-var.log: test-ot-metrics-tt-var$(EXEEXT)
+       @p='test-ot-metrics-tt-var$(EXEEXT)'; \
+       b='test-ot-metrics-tt-var'; \
+       $(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'; \
@@ -1668,6 +1884,13 @@ test-subset-hmtx.log: test-subset-hmtx$(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-subset-nameids.log: test-subset-nameids$(EXEEXT)
+       @p='test-subset-nameids$(EXEEXT)'; \
+       b='test-subset-nameids'; \
+       $(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-os2.log: test-subset-os2$(EXEEXT)
        @p='test-subset-os2$(EXEEXT)'; \
        b='test-subset-os2'; \
@@ -1703,79 +1926,72 @@ test-subset-cff2.log: test-subset-cff2$(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-unicode.log: test-unicode$(EXEEXT)
-       @p='test-unicode$(EXEEXT)'; \
-       b='test-unicode'; \
-       $(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-version.log: test-version$(EXEEXT)
-       @p='test-version$(EXEEXT)'; \
-       b='test-version'; \
+test-subset-gvar.log: test-subset-gvar$(EXEEXT)
+       @p='test-subset-gvar$(EXEEXT)'; \
+       b='test-subset-gvar'; \
        $(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-nameids.log: test-subset-nameids$(EXEEXT)
-       @p='test-subset-nameids$(EXEEXT)'; \
-       b='test-subset-nameids'; \
+test-subset-hvar.log: test-subset-hvar$(EXEEXT)
+       @p='test-subset-hvar$(EXEEXT)'; \
+       b='test-subset-hvar'; \
        $(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'; \
+test-subset-vvar.log: test-subset-vvar$(EXEEXT)
+       @p='test-subset-vvar$(EXEEXT)'; \
+       b='test-subset-vvar'; \
        $(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-ligature-carets.log: test-ot-ligature-carets$(EXEEXT)
-       @p='test-ot-ligature-carets$(EXEEXT)'; \
-       b='test-ot-ligature-carets'; \
+test-subset-sbix.log: test-subset-sbix$(EXEEXT)
+       @p='test-subset-sbix$(EXEEXT)'; \
+       b='test-subset-sbix'; \
        $(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'; \
+test-subset-gpos.log: test-subset-gpos$(EXEEXT)
+       @p='test-subset-gpos$(EXEEXT)'; \
+       b='test-subset-gpos'; \
        $(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-meta.log: test-ot-meta$(EXEEXT)
-       @p='test-ot-meta$(EXEEXT)'; \
-       b='test-ot-meta'; \
+test-subset-colr.log: test-subset-colr$(EXEEXT)
+       @p='test-subset-colr$(EXEEXT)'; \
+       b='test-subset-colr'; \
        $(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-metrics.log: test-ot-metrics$(EXEEXT)
-       @p='test-ot-metrics$(EXEEXT)'; \
-       b='test-ot-metrics'; \
+test-subset-cbdt.log: test-subset-cbdt$(EXEEXT)
+       @p='test-subset-cbdt$(EXEEXT)'; \
+       b='test-subset-cbdt'; \
        $(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-tag.log: test-ot-tag$(EXEEXT)
-       @p='test-ot-tag$(EXEEXT)'; \
-       b='test-ot-tag'; \
+test-unicode.log: test-unicode$(EXEEXT)
+       @p='test-unicode$(EXEEXT)'; \
+       b='test-unicode'; \
        $(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-extents-cff.log: test-ot-extents-cff$(EXEEXT)
-       @p='test-ot-extents-cff$(EXEEXT)'; \
-       b='test-ot-extents-cff'; \
+test-var-coords.log: test-var-coords$(EXEEXT)
+       @p='test-var-coords$(EXEEXT)'; \
+       b='test-var-coords'; \
        $(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-metrics-tt-var.log: test-ot-metrics-tt-var$(EXEEXT)
-       @p='test-ot-metrics-tt-var$(EXEEXT)'; \
-       b='test-ot-metrics-tt-var'; \
+test-version.log: test-version$(EXEEXT)
+       @p='test-version$(EXEEXT)'; \
+       b='test-version'; \
        $(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) \
@@ -1794,20 +2010,6 @@ test-ot-math.log: test-ot-math$(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-c.log: test-c$(EXEEXT)
-       @p='test-c$(EXEEXT)'; \
-       b='test-c'; \
-       $(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-cplusplus.log: test-cplusplus$(EXEEXT)
-       @p='test-cplusplus$(EXEEXT)'; \
-       b='test-cplusplus'; \
-       $(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.log:
        @p='$<'; \
        $(am__set_b); \
@@ -1910,12 +2112,14 @@ distclean: distclean-am
        -rm -f ./$(DEPDIR)/test-buffer.Po
        -rm -f ./$(DEPDIR)/test-collect-unicodes.Po
        -rm -f ./$(DEPDIR)/test-common.Po
+       -rm -f ./$(DEPDIR)/test-draw.Po
        -rm -f ./$(DEPDIR)/test-font.Po
        -rm -f ./$(DEPDIR)/test-map.Po
        -rm -f ./$(DEPDIR)/test-object.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-ligature-carets.Po
        -rm -f ./$(DEPDIR)/test-ot-meta.Po
        -rm -f ./$(DEPDIR)/test-ot-metrics-tt-var.Po
@@ -1924,18 +2128,26 @@ 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-subset-cbdt.Po
        -rm -f ./$(DEPDIR)/test-subset-cff1.Po
        -rm -f ./$(DEPDIR)/test-subset-cff2.Po
        -rm -f ./$(DEPDIR)/test-subset-cmap.Po
+       -rm -f ./$(DEPDIR)/test-subset-colr.Po
        -rm -f ./$(DEPDIR)/test-subset-drop-tables.Po
        -rm -f ./$(DEPDIR)/test-subset-glyf.Po
+       -rm -f ./$(DEPDIR)/test-subset-gpos.Po
+       -rm -f ./$(DEPDIR)/test-subset-gvar.Po
        -rm -f ./$(DEPDIR)/test-subset-hdmx.Po
        -rm -f ./$(DEPDIR)/test-subset-hmtx.Po
+       -rm -f ./$(DEPDIR)/test-subset-hvar.Po
        -rm -f ./$(DEPDIR)/test-subset-nameids.Po
        -rm -f ./$(DEPDIR)/test-subset-os2.Po
        -rm -f ./$(DEPDIR)/test-subset-post.Po
+       -rm -f ./$(DEPDIR)/test-subset-sbix.Po
        -rm -f ./$(DEPDIR)/test-subset-vmtx.Po
+       -rm -f ./$(DEPDIR)/test-subset-vvar.Po
        -rm -f ./$(DEPDIR)/test-subset.Po
+       -rm -f ./$(DEPDIR)/test-var-coords.Po
        -rm -f ./$(DEPDIR)/test-version.Po
        -rm -f ./$(DEPDIR)/test_c-test-c.Po
        -rm -f ./$(DEPDIR)/test_cplusplus-test-cplusplus.Po
@@ -1993,12 +2205,14 @@ maintainer-clean: maintainer-clean-am
        -rm -f ./$(DEPDIR)/test-buffer.Po
        -rm -f ./$(DEPDIR)/test-collect-unicodes.Po
        -rm -f ./$(DEPDIR)/test-common.Po
+       -rm -f ./$(DEPDIR)/test-draw.Po
        -rm -f ./$(DEPDIR)/test-font.Po
        -rm -f ./$(DEPDIR)/test-map.Po
        -rm -f ./$(DEPDIR)/test-object.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-ligature-carets.Po
        -rm -f ./$(DEPDIR)/test-ot-meta.Po
        -rm -f ./$(DEPDIR)/test-ot-metrics-tt-var.Po
@@ -2007,18 +2221,26 @@ 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-subset-cbdt.Po
        -rm -f ./$(DEPDIR)/test-subset-cff1.Po
        -rm -f ./$(DEPDIR)/test-subset-cff2.Po
        -rm -f ./$(DEPDIR)/test-subset-cmap.Po
+       -rm -f ./$(DEPDIR)/test-subset-colr.Po
        -rm -f ./$(DEPDIR)/test-subset-drop-tables.Po
        -rm -f ./$(DEPDIR)/test-subset-glyf.Po
+       -rm -f ./$(DEPDIR)/test-subset-gpos.Po
+       -rm -f ./$(DEPDIR)/test-subset-gvar.Po
        -rm -f ./$(DEPDIR)/test-subset-hdmx.Po
        -rm -f ./$(DEPDIR)/test-subset-hmtx.Po
+       -rm -f ./$(DEPDIR)/test-subset-hvar.Po
        -rm -f ./$(DEPDIR)/test-subset-nameids.Po
        -rm -f ./$(DEPDIR)/test-subset-os2.Po
        -rm -f ./$(DEPDIR)/test-subset-post.Po
+       -rm -f ./$(DEPDIR)/test-subset-sbix.Po
        -rm -f ./$(DEPDIR)/test-subset-vmtx.Po
+       -rm -f ./$(DEPDIR)/test-subset-vvar.Po
        -rm -f ./$(DEPDIR)/test-subset.Po
+       -rm -f ./$(DEPDIR)/test-var-coords.Po
        -rm -f ./$(DEPDIR)/test-version.Po
        -rm -f ./$(DEPDIR)/test_c-test-c.Po
        -rm -f ./$(DEPDIR)/test_cplusplus-test-cplusplus.Po
diff --git a/test/api/fonts/AdobeVFPrototype-Subset.otf b/test/api/fonts/AdobeVFPrototype-Subset.otf
new file mode 100644 (file)
index 0000000..5cc7279
Binary files /dev/null and b/test/api/fonts/AdobeVFPrototype-Subset.otf differ
diff --git a/test/api/fonts/AdobeVFPrototype.WA.gpos.otf b/test/api/fonts/AdobeVFPrototype.WA.gpos.otf
new file mode 100644 (file)
index 0000000..967ef25
Binary files /dev/null and b/test/api/fonts/AdobeVFPrototype.WA.gpos.otf differ
diff --git a/test/api/fonts/AdobeVFPrototype.WAV.gpos.otf b/test/api/fonts/AdobeVFPrototype.WAV.gpos.otf
new file mode 100644 (file)
index 0000000..c9da07b
Binary files /dev/null and b/test/api/fonts/AdobeVFPrototype.WAV.gpos.otf differ
index cc47708..5e6a928 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.abc.otf and b/test/api/fonts/AdobeVFPrototype.abc.otf differ
index 935bdbf..19b7897 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.ac.nohints.otf and b/test/api/fonts/AdobeVFPrototype.ac.nohints.otf differ
index 85f6cf6..73ff879 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 ad4d53b..7d2f79a 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf and b/test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf differ
index beab7d5..193404f 100644 (file)
Binary files a/test/api/fonts/AdobeVFPrototype.ac.otf and b/test/api/fonts/AdobeVFPrototype.ac.otf differ
index 8cb3005..15419b0 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/Estedad-VF.ttf b/test/api/fonts/Estedad-VF.ttf
new file mode 100644 (file)
index 0000000..f6c22b7
Binary files /dev/null and b/test/api/fonts/Estedad-VF.ttf differ
diff --git a/test/api/fonts/Mada-VF.ttf b/test/api/fonts/Mada-VF.ttf
new file mode 100644 (file)
index 0000000..e6f4404
Binary files /dev/null and b/test/api/fonts/Mada-VF.ttf differ
diff --git a/test/api/fonts/Mplus1p-Regular-cmap4-testing.ttf b/test/api/fonts/Mplus1p-Regular-cmap4-testing.ttf
new file mode 100644 (file)
index 0000000..00a4b0a
Binary files /dev/null and b/test/api/fonts/Mplus1p-Regular-cmap4-testing.ttf differ
diff --git a/test/api/fonts/Mplus1p-Regular.ttf b/test/api/fonts/Mplus1p-Regular.ttf
new file mode 100644 (file)
index 0000000..f89a28e
Binary files /dev/null and b/test/api/fonts/Mplus1p-Regular.ttf differ
diff --git a/test/api/fonts/NotoColorEmoji.cmap.38,AE,2049.ttf b/test/api/fonts/NotoColorEmoji.cmap.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..94efc6a
Binary files /dev/null and b/test/api/fonts/NotoColorEmoji.cmap.38,AE,2049.ttf differ
diff --git a/test/api/fonts/NotoColorEmoji.cmap.ttf b/test/api/fonts/NotoColorEmoji.cmap.ttf
new file mode 100644 (file)
index 0000000..c1dd869
Binary files /dev/null and b/test/api/fonts/NotoColorEmoji.cmap.ttf differ
diff --git a/test/api/fonts/NotoColorEmoji.subset.default.2049.ttf b/test/api/fonts/NotoColorEmoji.subset.default.2049.ttf
new file mode 100644 (file)
index 0000000..b577752
Binary files /dev/null and b/test/api/fonts/NotoColorEmoji.subset.default.2049.ttf differ
diff --git a/test/api/fonts/NotoColorEmoji.subset.default.39.ttf b/test/api/fonts/NotoColorEmoji.subset.default.39.ttf
new file mode 100644 (file)
index 0000000..34e878e
Binary files /dev/null and b/test/api/fonts/NotoColorEmoji.subset.default.39.ttf differ
diff --git a/test/api/fonts/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf b/test/api/fonts/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..e7f361a
Binary files /dev/null and b/test/api/fonts/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf differ
diff --git a/test/api/fonts/NotoColorEmoji.subset.index_format3.ttf b/test/api/fonts/NotoColorEmoji.subset.index_format3.ttf
new file mode 100644 (file)
index 0000000..df1ff9b
Binary files /dev/null and b/test/api/fonts/NotoColorEmoji.subset.index_format3.ttf differ
diff --git a/test/api/fonts/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf b/test/api/fonts/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..8d2fb18
Binary files /dev/null and b/test/api/fonts/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf differ
diff --git a/test/api/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf b/test/api/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf
new file mode 100644 (file)
index 0000000..cdccded
Binary files /dev/null and b/test/api/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf differ
diff --git a/test/api/fonts/NotoColorEmoji.subset.ttf b/test/api/fonts/NotoColorEmoji.subset.ttf
new file mode 100644 (file)
index 0000000..14a544a
Binary files /dev/null and b/test/api/fonts/NotoColorEmoji.subset.ttf differ
diff --git a/test/api/fonts/NotoNastaliqUrdu-Regular.ttf b/test/api/fonts/NotoNastaliqUrdu-Regular.ttf
new file mode 100644 (file)
index 0000000..891f633
Binary files /dev/null and b/test/api/fonts/NotoNastaliqUrdu-Regular.ttf differ
diff --git a/test/api/fonts/NotoSansCJKkr-Regular-subset-colon.ttf b/test/api/fonts/NotoSansCJKkr-Regular-subset-colon.ttf
new file mode 100644 (file)
index 0000000..42bb608
Binary files /dev/null and b/test/api/fonts/NotoSansCJKkr-Regular-subset-colon.ttf differ
diff --git a/test/api/fonts/OpenSans-Regular.ttf b/test/api/fonts/OpenSans-Regular.ttf
new file mode 100644 (file)
index 0000000..db43334
Binary files /dev/null and b/test/api/fonts/OpenSans-Regular.ttf differ
index 4830c47..29038b5 100644 (file)
@@ -3,3 +3,9 @@ cmap-format12-only files created by ttx & remove all other cmap entries
 Inconsolata-Regular.abc.widerc.ttf has the hmtx width of "c" set to 600; everything else is 500. Subsetting out c should reduce numberOfHMetrics to 1.
 
 chromacheck-* fonts are from https://github.com/RoelN/ChromaCheck/tree/master/fonts and licensed under MIT by Roel Nieskens and Google.
+
+RanaKufi-Regular.subset.otf is from https://github.com/alif-type/rana-kufi/ but the subset is licensed for us in MIT for the project use.
+
+glyphs.ttf is from https://github.com/RazrFalcon/ttf-parser/blob/337e7d1/tests/fonts/glyphs.ttf
+
+Estedad-VF.ttf, licensed under OFL 1.1, is from https://github.com/aminabedi68/Estedad
diff --git a/test/api/fonts/RanaKufi-Regular.subset.otf b/test/api/fonts/RanaKufi-Regular.subset.otf
new file mode 100644 (file)
index 0000000..a327a2c
Binary files /dev/null and b/test/api/fonts/RanaKufi-Regular.subset.otf differ
diff --git a/test/api/fonts/Roboto-Regular-gpos-.aw.ttf b/test/api/fonts/Roboto-Regular-gpos-.aw.ttf
new file mode 100644 (file)
index 0000000..74ab2bd
Binary files /dev/null and b/test/api/fonts/Roboto-Regular-gpos-.aw.ttf differ
diff --git a/test/api/fonts/Roboto-Regular-gpos-aw.ttf b/test/api/fonts/Roboto-Regular-gpos-aw.ttf
new file mode 100644 (file)
index 0000000..1b34d05
Binary files /dev/null and b/test/api/fonts/Roboto-Regular-gpos-aw.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.empty.ttf b/test/api/fonts/Roboto-Regular.empty.ttf
new file mode 100644 (file)
index 0000000..fbd4fba
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.empty.ttf differ
index fa2a0e4..1e5cc96 100644 (file)
Binary files a/test/api/fonts/SourceHanSans-Regular.41,4C2E.retaingids.otf and b/test/api/fonts/SourceHanSans-Regular.41,4C2E.retaingids.otf differ
diff --git a/test/api/fonts/SourceSansPro-Regular.otf b/test/api/fonts/SourceSansPro-Regular.otf
new file mode 100644 (file)
index 0000000..279e691
Binary files /dev/null and b/test/api/fonts/SourceSansPro-Regular.otf differ
diff --git a/test/api/fonts/SourceSansVariable-Roman-modHVAR.abc.ttf b/test/api/fonts/SourceSansVariable-Roman-modHVAR.abc.ttf
new file mode 100644 (file)
index 0000000..397e7a5
Binary files /dev/null and b/test/api/fonts/SourceSansVariable-Roman-modHVAR.abc.ttf differ
diff --git a/test/api/fonts/SourceSansVariable-Roman-modHVAR.ac.ttf b/test/api/fonts/SourceSansVariable-Roman-modHVAR.ac.ttf
new file mode 100644 (file)
index 0000000..cfdbe1d
Binary files /dev/null and b/test/api/fonts/SourceSansVariable-Roman-modHVAR.ac.ttf differ
diff --git a/test/api/fonts/SourceSansVariable-Roman.abc.ttf b/test/api/fonts/SourceSansVariable-Roman.abc.ttf
new file mode 100644 (file)
index 0000000..690d7d5
Binary files /dev/null and b/test/api/fonts/SourceSansVariable-Roman.abc.ttf differ
diff --git a/test/api/fonts/SourceSansVariable-Roman.ac.retaingids.ttf b/test/api/fonts/SourceSansVariable-Roman.ac.retaingids.ttf
new file mode 100644 (file)
index 0000000..b2e744d
Binary files /dev/null and b/test/api/fonts/SourceSansVariable-Roman.ac.retaingids.ttf differ
diff --git a/test/api/fonts/SourceSansVariable-Roman.ac.ttf b/test/api/fonts/SourceSansVariable-Roman.ac.ttf
new file mode 100644 (file)
index 0000000..2387ea7
Binary files /dev/null and b/test/api/fonts/SourceSansVariable-Roman.ac.ttf differ
diff --git a/test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.retaingids.ttf b/test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.retaingids.ttf
new file mode 100644 (file)
index 0000000..734f6e8
Binary files /dev/null and b/test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.retaingids.ttf differ
diff --git a/test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.ttf b/test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.ttf
new file mode 100644 (file)
index 0000000..b6b9e97
Binary files /dev/null and b/test/api/fonts/SourceSerifVariable-Roman-VVAR.ac.ttf differ
diff --git a/test/api/fonts/Stroking.otf b/test/api/fonts/Stroking.otf
new file mode 100644 (file)
index 0000000..a14c361
Binary files /dev/null and b/test/api/fonts/Stroking.otf differ
diff --git a/test/api/fonts/Stroking.ttf b/test/api/fonts/Stroking.ttf
new file mode 100644 (file)
index 0000000..b88c6fa
Binary files /dev/null and b/test/api/fonts/Stroking.ttf differ
diff --git a/test/api/fonts/TestGVAREight.ttf b/test/api/fonts/TestGVAREight.ttf
new file mode 100644 (file)
index 0000000..271dc4b
Binary files /dev/null and b/test/api/fonts/TestGVAREight.ttf differ
diff --git a/test/api/fonts/TestGVARFour.ttf b/test/api/fonts/TestGVARFour.ttf
new file mode 100644 (file)
index 0000000..3524f37
Binary files /dev/null and b/test/api/fonts/TestGVARFour.ttf differ
diff --git a/test/api/fonts/TestGVAROne.ttf b/test/api/fonts/TestGVAROne.ttf
new file mode 100644 (file)
index 0000000..e155d8f
Binary files /dev/null and b/test/api/fonts/TestGVAROne.ttf differ
diff --git a/test/api/fonts/TestGVARThree.ttf b/test/api/fonts/TestGVARThree.ttf
new file mode 100644 (file)
index 0000000..ac2d7eb
Binary files /dev/null and b/test/api/fonts/TestGVARThree.ttf differ
diff --git a/test/api/fonts/TestGVARTwo.ttf b/test/api/fonts/TestGVARTwo.ttf
new file mode 100644 (file)
index 0000000..bd144c6
Binary files /dev/null and b/test/api/fonts/TestGVARTwo.ttf differ
diff --git a/test/api/fonts/TwemojiMozilla.subset.default.32,3299.ttf b/test/api/fonts/TwemojiMozilla.subset.default.32,3299.ttf
new file mode 100644 (file)
index 0000000..be3a53d
Binary files /dev/null and b/test/api/fonts/TwemojiMozilla.subset.default.32,3299.ttf differ
diff --git a/test/api/fonts/TwemojiMozilla.subset.default.32.ttf b/test/api/fonts/TwemojiMozilla.subset.default.32.ttf
new file mode 100644 (file)
index 0000000..b7d70ad
Binary files /dev/null and b/test/api/fonts/TwemojiMozilla.subset.default.32.ttf differ
diff --git a/test/api/fonts/TwemojiMozilla.subset.default.3297.ttf b/test/api/fonts/TwemojiMozilla.subset.default.3297.ttf
new file mode 100644 (file)
index 0000000..09e5056
Binary files /dev/null and b/test/api/fonts/TwemojiMozilla.subset.default.3297.ttf differ
diff --git a/test/api/fonts/TwemojiMozilla.subset.ttf b/test/api/fonts/TwemojiMozilla.subset.ttf
new file mode 100644 (file)
index 0000000..357dda3
Binary files /dev/null and b/test/api/fonts/TwemojiMozilla.subset.ttf differ
index 8c198b7..dc79b69 100644 (file)
Binary files a/test/api/fonts/cff1_expert.2D,F6E9,FB00.otf and b/test/api/fonts/cff1_expert.2D,F6E9,FB00.otf differ
diff --git a/test/api/fonts/glyphs.ttf b/test/api/fonts/glyphs.ttf
new file mode 100644 (file)
index 0000000..64ff55e
Binary files /dev/null and b/test/api/fonts/glyphs.ttf differ
diff --git a/test/api/fonts/sbix.ttf b/test/api/fonts/sbix.ttf
new file mode 100644 (file)
index 0000000..575af90
Binary files /dev/null and b/test/api/fonts/sbix.ttf differ
diff --git a/test/api/fonts/sbix_X.ttf b/test/api/fonts/sbix_X.ttf
new file mode 100644 (file)
index 0000000..6960f8f
Binary files /dev/null and b/test/api/fonts/sbix_X.ttf differ
index 99f567a..cdd41ed 100644 (file)
@@ -71,6 +71,11 @@ 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_set (input_name_ids, name_ids);
+
+  hb_set_t *name_langids = hb_subset_input_namelangid_set (input);
+  hb_set_add_range (name_langids, 0, 0x5FFF);
+
+  hb_subset_input_set_name_legacy (input, true);
   return input;
 }
 
@@ -94,7 +99,10 @@ hb_subset_test_check (hb_face_t *expected,
   expected_blob = hb_face_reference_table (expected, table);
   actual_blob = hb_face_reference_table (actual, table);
   fprintf(stderr, "comparing %c%c%c%c, expected %d bytes, actual %d bytes\n", HB_UNTAG(table), hb_blob_get_length(expected_blob), hb_blob_get_length (actual_blob));
-  hb_test_assert_blobs_equal (expected_blob, actual_blob);
+
+  if (hb_blob_get_length (expected_blob) != 0 ||
+      hb_blob_get_length (actual_blob) != 0)
+    hb_test_assert_blobs_equal (expected_blob, actual_blob);
   hb_blob_destroy (expected_blob);
   hb_blob_destroy (actual_blob);
 }
index b866e44..c5eb870 100644 (file)
@@ -104,25 +104,25 @@ hb_test_bug (const char *uri_base, unsigned int number)
 static inline void
 hb_test_bug_freedesktop (unsigned int number)
 {
-  hb_test_bug ("http://bugs.freedesktop.org/", number);
+  hb_test_bug ("https://bugs.freedesktop.org/", number);
 }
 
 static inline void
 hb_test_bug_gnome (unsigned int number)
 {
-  hb_test_bug ("http://bugzilla.gnome.org/", number);
+  hb_test_bug ("https://bugzilla.gnome.org/", number);
 }
 
 static inline void
 hb_test_bug_mozilla (unsigned int number)
 {
-  hb_test_bug ("http://bugzilla.mozilla.org/", number);
+  hb_test_bug ("https://bugzilla.mozilla.org/", number);
 }
 
 static inline void
 hb_test_bug_redhat (unsigned int number)
 {
-  hb_test_bug ("http://bugzilla.redhat.com/", number);
+  hb_test_bug ("https://bugzilla.redhat.com/", number);
 }
 
 
diff --git a/test/api/meson.build b/test/api/meson.build
new file mode 100644 (file)
index 0000000..6951773
--- /dev/null
@@ -0,0 +1,87 @@
+if conf.get('HAVE_GLIB', 0) == 0
+  message('You need to have glib support enabled to run test/api tests')
+  subdir_done()
+endif
+
+tests = [
+  'test-aat-layout.c',
+  'test-baseline.c',
+  'test-blob.c',
+  'test-buffer.c',
+  'test-c.c',
+  'test-collect-unicodes.c',
+  'test-cplusplus.cc',
+  'test-common.c',
+  'test-draw.c',
+  'test-font.c',
+  'test-map.c',
+  'test-object.c',
+  'test-ot-color.c',
+  'test-ot-face.c',
+  'test-ot-glyphname.c',
+  'test-ot-ligature-carets.c',
+  'test-ot-name.c',
+  'test-ot-meta.c',
+  'test-ot-metrics.c',
+  'test-ot-tag.c',
+  'test-ot-extents-cff.c',
+  'test-ot-metrics-tt-var.c',
+  'test-set.c',
+  'test-shape.c',
+  'test-subset.c',
+  'test-subset-cmap.c',
+  'test-subset-drop-tables.c',
+  'test-subset-glyf.c',
+  'test-subset-hdmx.c',
+  'test-subset-hmtx.c',
+  'test-subset-nameids.c',
+  'test-subset-os2.c',
+  'test-subset-post.c',
+  'test-subset-vmtx.c',
+  'test-subset-cff1.c',
+  'test-subset-cff2.c',
+  'test-subset-gvar.c',
+  'test-subset-hvar.c',
+  'test-subset-vvar.c',
+  'test-subset-sbix.c',
+  'test-subset-gpos.c',
+  'test-subset-colr.c',
+  'test-subset-cbdt.c',
+  'test-unicode.c',
+  'test-var-coords.c',
+  'test-version.c',
+]
+
+if conf.get('HAVE_FREETYPE', 0) == 1
+  tests += 'test-ot-math.c'
+endif
+
+if conf.get('HAVE_FREETYPE', 0) == 1 and conf.get('HAVE_PTHREAD', 0) == 1
+  tests += 'test-multithread.c'
+endif
+
+# Default test running environment
+env = environment()
+env.set('MALLOC_CHECK_', '2')
+env.set('G_DEBUG', 'gc-friendly')
+env.set('G_SLICE', 'always-malloc')
+env.set('G_TEST_SRCDIR', meson.current_source_dir())
+env.set('G_TEST_BUILDDIR', meson.current_build_dir())
+
+foreach source : tests
+  test_name = source.split('.')[0]
+
+  link_withs = libharfbuzz
+  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]
+  endif
+
+  test(test_name, executable(test_name, source,
+    include_directories: [incconfig, incsrc],
+    dependencies: deps,
+    link_with: link_withs,
+    install: false,
+  ), env: env, suite: ['api'] + (test_name.contains('-subset') ? ['subset'] : []))
+endforeach
diff --git a/test/api/test-draw.c b/test/api/test-draw.c
new file mode 100644 (file)
index 0000000..9cca99e
--- /dev/null
@@ -0,0 +1,944 @@
+/*
+ * 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>
+
+#ifdef HB_EXPERIMENTAL_API
+typedef struct user_data_t
+{
+  char *str;
+  unsigned size;
+  unsigned consumed;
+} user_data_t;
+
+/* Our modified itoa, why not using libc's? it is going to be used
+   in harfbuzzjs where libc isn't available */
+static void _hb_reverse (char *buf, unsigned int len)
+{
+  unsigned start = 0, end = len - 1;
+  while (start < end)
+  {
+    char c = buf[end];
+    buf[end] = buf[start];
+    buf[start] = c;
+    start++; end--;
+  }
+}
+static unsigned _hb_itoa (int32_t num, char *buf)
+{
+  unsigned int i = 0;
+  hb_bool_t is_negative = num < 0;
+  if (is_negative) num = -num;
+  do
+  {
+    buf[i++] = '0' + num % 10;
+    num /= 10;
+  } while (num);
+  if (is_negative) buf[i++] = '-';
+  _hb_reverse (buf, i);
+  buf[i] = '\0';
+  return i;
+}
+
+#define ITOA_BUF_SIZE 12 // 10 digits in int32, 1 for negative sign, 1 for \0
+
+static void
+test_itoa (void)
+{
+  char s[] = "12345";
+  _hb_reverse (s, 5);
+  g_assert_cmpmem (s, 5, "54321", 5);
+
+  {
+    unsigned num = 12345;
+    char buf[ITOA_BUF_SIZE];
+    unsigned len = _hb_itoa (num, buf);
+    g_assert_cmpmem (buf, len, "12345", 5);
+  }
+
+  {
+    unsigned num = 3152;
+    char buf[ITOA_BUF_SIZE];
+    unsigned len = _hb_itoa (num, buf);
+    g_assert_cmpmem (buf, len, "3152", 4);
+  }
+
+  {
+    int num = -6457;
+    char buf[ITOA_BUF_SIZE];
+    unsigned len = _hb_itoa (num, buf);
+    g_assert_cmpmem (buf, len, "-6457", 5);
+  }
+}
+
+static void
+move_to (hb_position_t to_x, hb_position_t to_y, user_data_t *user_data)
+{
+  /* 4 = command character space + comma + array starts with 0 index + nul character space */
+  if (user_data->consumed + 2 * ITOA_BUF_SIZE + 4 > user_data->size) return;
+  user_data->str[user_data->consumed++] = 'M';
+  user_data->consumed += _hb_itoa (to_x, user_data->str + user_data->consumed);
+  user_data->str[user_data->consumed++] = ',';
+  user_data->consumed += _hb_itoa (to_y, user_data->str + user_data->consumed);
+}
+
+static void
+line_to (hb_position_t to_x, hb_position_t to_y, user_data_t *user_data)
+{
+  if (user_data->consumed + 2 * ITOA_BUF_SIZE + 4 > user_data->size) return;
+  user_data->str[user_data->consumed++] = 'L';
+  user_data->consumed += _hb_itoa (to_x, user_data->str + user_data->consumed);
+  user_data->str[user_data->consumed++] = ',';
+  user_data->consumed += _hb_itoa (to_y, user_data->str + user_data->consumed);
+}
+
+static void
+quadratic_to (hb_position_t control_x, hb_position_t control_y,
+             hb_position_t to_x, hb_position_t to_y,
+             user_data_t *user_data)
+{
+
+  if (user_data->consumed + 4 * ITOA_BUF_SIZE + 6 > user_data->size) return;
+  user_data->str[user_data->consumed++] = 'Q';
+  user_data->consumed += _hb_itoa (control_x, user_data->str + user_data->consumed);
+  user_data->str[user_data->consumed++] = ',';
+  user_data->consumed += _hb_itoa (control_y, user_data->str + user_data->consumed);
+  user_data->str[user_data->consumed++] = ' ';
+  user_data->consumed += _hb_itoa (to_x, user_data->str + user_data->consumed);
+  user_data->str[user_data->consumed++] = ',';
+  user_data->consumed += _hb_itoa (to_y, user_data->str + user_data->consumed);
+}
+
+static void
+cubic_to (hb_position_t control1_x, hb_position_t control1_y,
+         hb_position_t control2_x, hb_position_t control2_y,
+         hb_position_t to_x, hb_position_t to_y,
+         user_data_t *user_data)
+{
+  if (user_data->consumed + 6 * ITOA_BUF_SIZE + 8 > user_data->size) return;
+  user_data->str[user_data->consumed++] = 'C';
+  user_data->consumed += _hb_itoa (control1_x, user_data->str + user_data->consumed);
+  user_data->str[user_data->consumed++] = ',';
+  user_data->consumed += _hb_itoa (control1_y, user_data->str + user_data->consumed);
+  user_data->str[user_data->consumed++] = ' ';
+  user_data->consumed += _hb_itoa (control2_x, user_data->str + user_data->consumed);
+  user_data->str[user_data->consumed++] = ',';
+  user_data->consumed += _hb_itoa (control2_y, user_data->str + user_data->consumed);
+  user_data->str[user_data->consumed++] = ' ';
+  user_data->consumed += _hb_itoa (to_x, user_data->str + user_data->consumed);
+  user_data->str[user_data->consumed++] = ',';
+  user_data->consumed += _hb_itoa (to_y, user_data->str + user_data->consumed);
+}
+
+static void
+close_path (user_data_t *user_data)
+{
+  if (user_data->consumed + 2 > user_data->size) return;
+  user_data->str[user_data->consumed++] = 'Z';
+}
+
+static hb_draw_funcs_t *funcs;
+static hb_draw_funcs_t *funcs2; /* this one translates quadratic calls to cubic ones */
+
+static void
+test_hb_draw_empty (void)
+{
+  g_assert (!hb_font_draw_glyph (hb_font_get_empty (), 3, funcs, NULL));
+}
+
+static void
+test_hb_draw_glyf (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/SourceSerifVariable-Roman-VVAR.abc.ttf");
+  hb_font_t *font = hb_font_create (face);
+  hb_face_destroy (face);
+
+  char str[1024];
+  user_data_t user_data = {
+    .str = str,
+    .size = sizeof (str),
+    .consumed = 0
+  };
+
+  user_data.consumed = 0;
+  g_assert (!hb_font_draw_glyph (font, 4, funcs, &user_data));
+
+  user_data.consumed = 0;
+  g_assert (hb_font_draw_glyph (font, 3, funcs, &user_data));
+  char expected[] = "M275,442Q232,442 198,420Q164,397 145,353Q126,309 126,245"
+                   "Q126,182 147,139Q167,95 204,73Q240,50 287,50Q330,50 367,70"
+                   "Q404,90 427,128L451,116Q431,54 384,21Q336,-13 266,-13"
+                   "Q198,-13 148,18Q97,48 70,104Q43,160 43,236Q43,314 76,371"
+                   "Q108,427 160,457Q212,487 272,487Q316,487 354,470Q392,453 417,424"
+                   "Q442,395 448,358Q441,321 403,321Q378,321 367,334"
+                   "Q355,347 350,366L325,454L371,417Q346,430 321,436Q296,442 275,442Z";
+  g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+  /* Test translating quadratic calls to cubic by a _draw_funcs_t that doesn't set the callback */
+  user_data.consumed = 0;
+  g_assert (hb_font_draw_glyph (font, 3, funcs2, &user_data));
+  char expected2[] = "M275,442C246,442 221,435 198,420C175,405 158,382 145,353"
+                    "C132,324 126,288 126,245C126,203 133,168 147,139C160,110 179,88 204,73"
+                    "C228,58 256,50 287,50C316,50 342,57 367,70C392,83 412,103 427,128"
+                    "L451,116C438,75 415,43 384,21C352,-2 313,-13 266,-13C221,-13 181,-3 148,18"
+                    "C114,38 88,67 70,104C52,141 43,185 43,236C43,288 54,333 76,371"
+                    "C97,408 125,437 160,457C195,477 232,487 272,487C301,487 329,481 354,470"
+                    "C379,459 400,443 417,424C434,405 444,383 448,358C443,333 428,321 403,321"
+                    "C386,321 374,325 367,334C359,343 353,353 350,366L325,454L371,417"
+                    "C354,426 338,432 321,436C304,440 289,442 275,442Z";
+  g_assert_cmpmem (str, user_data.consumed, expected2, sizeof (expected2) - 1);
+
+  hb_variation_t var;
+  var.tag = HB_TAG ('w','g','h','t');
+  var.value = 800;
+  hb_font_set_variations (font, &var, 1);
+
+  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"
+                    "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";
+  g_assert_cmpmem (str, user_data.consumed, expected3, sizeof (expected3) - 1);
+
+  hb_font_destroy (font);
+}
+
+static void
+test_hb_draw_cff1 (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/cff1_seac.otf");
+  hb_font_t *font = hb_font_create (face);
+  hb_face_destroy (face);
+
+  char str[1024];
+  user_data_t user_data = {
+    .str = str,
+    .size = sizeof (str),
+    .consumed = 0
+  };
+  g_assert (hb_font_draw_glyph (font, 3, funcs, &user_data));
+  char expected[] = "M203,367C227,440 248,512 268,588L272,588C293,512 314,440 338,367L369,267L172,267L203,367Z"
+                   "M3,0L88,0L151,200L390,200L452,0L541,0L319,656L225,656L3,0Z"
+                   "M300,653L342,694L201,861L143,806L300,653Z";
+  g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+  hb_font_destroy (font);
+}
+
+static void
+test_hb_draw_cff1_rline (void)
+{
+  /* https://github.com/harfbuzz/harfbuzz/pull/2053 */
+  hb_face_t *face = hb_test_open_font_file ("fonts/RanaKufi-Regular.subset.otf");
+  hb_font_t *font = hb_font_create (face);
+  hb_face_destroy (face);
+
+  char str[1024];
+  user_data_t user_data = {
+    .str = str,
+    .size = sizeof (str),
+    .consumed = 0
+  };
+  g_assert (hb_font_draw_glyph (font, 1, funcs, &user_data));
+  char expected[] = "M775,400C705,400 650,343 650,274L650,250L391,250L713,572L392,893"
+                   "L287,1000C311,942 296,869 250,823C250,823 286,858 321,823L571,572"
+                   "L150,150L750,150L750,276C750,289 761,300 775,300C789,300 800,289 800,276"
+                   "L800,100L150,100C100,100 100,150 100,150C100,85 58,23 0,0L900,0L900,274"
+                   "C900,343 844,400 775,400Z";
+  g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+  hb_font_destroy (font);
+}
+
+static void
+test_hb_draw_cff2 (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/AdobeVFPrototype.abc.otf");
+  hb_font_t *font = hb_font_create (face);
+  hb_face_destroy (face);
+
+  char str[1024];
+  user_data_t user_data = {
+    .str = str,
+    .size = sizeof (str)
+  };
+
+  user_data.consumed = 0;
+  g_assert (hb_font_draw_glyph (font, 3, funcs, &user_data));
+  char expected[] = "M275,442C303,442 337,435 371,417L325,454L350,366"
+                   "C357,341 370,321 403,321C428,321 443,333 448,358"
+                   "C435,432 361,487 272,487C153,487 43,393 43,236"
+                   "C43,83 129,-13 266,-13C360,-13 424,33 451,116L427,128"
+                   "C396,78 345,50 287,50C193,50 126,119 126,245C126,373 188,442 275,442Z";
+  g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+  hb_variation_t var;
+  var.tag = HB_TAG ('w','g','h','t');
+  var.value = 800;
+  hb_font_set_variations (font, &var, 1);
+
+  user_data.consumed = 0;
+  g_assert (hb_font_draw_glyph (font, 3, funcs, &user_data));
+  char expected2[] = "M323,448C356,448 380,441 411,427L333,469L339,401"
+                    "C343,322 379,297 420,297C458,297 480,314 492,352"
+                    "C486,433 412,501 303,501C148,501 25,406 25,241"
+                    "C25,70 143,-16 279,-16C374,-16 447,22 488,103L451,137"
+                    "C423,107 390,86 344,86C262,86 209,148 209,261C209,398 271,448 323,448Z";
+  g_assert_cmpmem (str, user_data.consumed, expected2, sizeof (expected2) - 1);
+
+  hb_font_destroy (font);
+}
+
+static void
+test_hb_draw_ttf_parser_tests (void)
+{
+  /* https://github.com/RazrFalcon/ttf-parser/blob/337e7d1c/tests/tests.rs#L50-L133 */
+  char str[1024];
+  user_data_t user_data = {
+    .str = str,
+    .size = sizeof (str)
+  };
+  {
+    hb_face_t *face = hb_test_open_font_file ("fonts/glyphs.ttf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+    {
+      user_data.consumed = 0;
+      g_assert (hb_font_draw_glyph (font, 0, funcs, &user_data));
+      char expected[] = "M50,0L50,750L450,750L450,0L50,0Z";
+      g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+    }
+    {
+      user_data.consumed = 0;
+      g_assert (hb_font_draw_glyph (font, 1, funcs, &user_data));
+      char expected[] = "M56,416L56,487L514,487L514,416L56,416ZM56,217L56,288L514,288L514,217L56,217Z";
+      g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+    }
+    {
+      user_data.consumed = 0;
+      g_assert (hb_font_draw_glyph (font, 4, funcs, &user_data));
+      char expected[] = "M332,468L197,468L197,0L109,0L109,468L15,468L15,509L109,539"
+                       "L109,570Q109,674 155,720Q201,765 283,765Q315,765 342,760"
+                       "Q368,754 387,747L364,678Q348,683 327,688Q306,693 284,693"
+                       "Q240,693 219,664Q197,634 197,571L197,536L332,536L332,468Z"
+                       "M474,737Q494,737 510,724Q525,710 525,681Q525,653 510,639"
+                       "Q494,625 474,625Q452,625 437,639Q422,653 422,681"
+                       "Q422,710 437,724Q452,737 474,737ZM517,536L517,0L429,0L429,536L517,536Z";
+      g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+    }
+    {
+      user_data.consumed = 0;
+      g_assert (hb_font_draw_glyph (font, 5, funcs, &user_data));
+      char expected[] = "";
+      g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+    }
+    {
+      user_data.consumed = 0;
+      g_assert (hb_font_draw_glyph (font, 6, funcs, &user_data));
+      char expected[] = "M346,468L211,468L211,0L123,0L123,468L29,468L29,509L123,539"
+                       "L123,570Q123,674 169,720Q215,765 297,765Q329,765 356,760"
+                       "Q382,754 401,747L378,678Q362,683 341,688Q320,693 298,693"
+                       "Q254,693 233,664Q211,634 211,571L211,536L346,536L346,468Z";
+      g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+    }
+
+    hb_font_destroy (font);
+  }
+  {
+    hb_face_t *face = hb_test_open_font_file ("fonts/cff1_flex.otf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 1, funcs, &user_data));
+    char expected[] = "M0,0C100,0 150,-20 250,-20C350,-20 400,0 500,0C500,100 520,150 520,250"
+                     "C520,350 500,400 500,500C400,500 350,520 250,520C150,520 100,500 0,500"
+                     "C0,400 -20,350 -20,250C-20,150 0,100 0,0ZM50,50C50,130 34,170 34,250"
+                     "C34,330 50,370 50,450C130,450 170,466 250,466C330,466 370,450 450,450"
+                     "C450,370 466,330 466,250C466,170 450,130 450,50C370,50 330,34 250,34"
+                     "C170,34 130,50 50,50Z";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    hb_font_destroy (font);
+  }
+  {
+    hb_face_t *face = hb_test_open_font_file ("fonts/cff1_dotsect.nohints.otf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 1, funcs, &user_data));
+    char expected[] = "M82,0L164,0L164,486L82,486L82,0Z"
+                     "M124,586C156,586 181,608 181,639C181,671 156,692 124,692"
+                     "C92,692 67,671 67,639C67,608 92,586 124,586Z";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    hb_font_destroy (font);
+  }
+}
+
+static void
+test_hb_draw_font_kit_glyphs_tests (void)
+{
+  /* https://github.com/foliojs/fontkit/blob/master/test/glyphs.js */
+  char str[2048];
+  user_data_t user_data = {
+    .str = str,
+    .size = sizeof (str)
+  };
+  /* truetype glyphs */
+  {
+    hb_face_t *face = hb_test_open_font_file ("fonts/OpenSans-Regular.ttf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    /* should get a path for the glyph */
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 37, funcs, &user_data));
+    char expected[] = "M201,1462L614,1462Q905,1462 1035,1375Q1165,1288 1165,1100"
+                     "Q1165,970 1093,886Q1020,801 881,776L881,766Q1214,709 1214,416"
+                     "Q1214,220 1082,110Q949,0 711,0L201,0L201,1462ZM371,836L651,836"
+                     "Q831,836 910,893Q989,949 989,1083Q989,1206 901,1261"
+                     "Q813,1315 621,1315L371,1315L371,836ZM371,692L371,145L676,145"
+                     "Q853,145 943,214Q1032,282 1032,428Q1032,564 941,628Q849,692 662,692L371,692Z";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    /* 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";
+    g_assert_cmpmem (str, user_data.consumed, expected2, sizeof (expected2) - 1);
+
+    hb_font_destroy (font);
+  }
+  {
+    hb_face_t *face = hb_test_open_font_file ("fonts/Mada-VF.ttf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    hb_buffer_t *buffer = hb_buffer_create ();
+    hb_codepoint_t codepoint = 1610; /* ي */
+    hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
+    hb_buffer_set_direction (buffer, HB_DIRECTION_RTL);
+    hb_shape (font, buffer, NULL, 0);
+    codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
+    hb_buffer_destroy (buffer);
+
+    /* should resolve composite glyphs recursively */
+    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";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    /* should transform points of a composite glyph */
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 2, funcs, &user_data)); /* 2 == arAlef.fina */
+    char expected2[] = "M155,624L155,84Q150,90 146,95Q141,99 136,105"
+                      "L292,105L292,0L156,0Q128,0 104,14Q79,27 65,51"
+                      "Q50,74 50,104L50,624L155,624ZM282,105L312,105"
+                      "L312,0L282,0L282,105Z";
+    g_assert_cmpmem (str, user_data.consumed, expected2, sizeof (expected2) - 1);
+
+    hb_font_destroy (font);
+  }
+  /* CFF glyphs, should get a path for the glyph */
+  {
+    hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.otf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 5, funcs, &user_data));
+    char expected[] = "M90,0L258,0C456,0 564,122 564,331C564,539 456,656 254,656L90,656L90,0Z"
+                     "M173,68L173,588L248,588C401,588 478,496 478,331C478,165 401,68 248,68L173,68Z";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    hb_font_destroy (font);
+  }
+  /* CFF glyphs (CID font) */
+  {
+    /* replaced with a subset as the original one was 15MB */
+    hb_face_t *face = hb_test_open_font_file ("fonts/NotoSansCJKkr-Regular-subset-colon.ttf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 1, funcs, &user_data));
+    char expected[] = "M139,390C175,390 205,419 205,459C205,501 175,530 139,530C103,530 73,501 73,459"
+                     "C73,419 103,390 139,390ZM139,-13C175,-13 205,15 205,56C205,97 175,127 139,127"
+                     "C103,127 73,97 73,56C73,15 103,-13 139,-13Z";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    hb_font_destroy (font);
+  }
+  /* Skip SBIX glyphs (empty path), COLR glyphs (empty path), WOFF ttf glyphs, WOFF2 ttf glyph */
+}
+
+static void
+test_hb_draw_font_kit_variations_tests (void)
+{
+  /* https://github.com/foliojs/fontkit/blob/b310db5/test/variations.js */
+  char str[2048];
+  user_data_t user_data = {
+    .str = str,
+    .size = sizeof (str)
+  };
+  /* Skia */
+  {
+    /* Skipping Skia tests for now even the fact we can actually do platform specific tests using our CIs */
+  }
+  /* truetype variations */
+  /* should support sharing all points */
+  {
+    hb_face_t *face = hb_test_open_font_file ("fonts/TestGVAROne.ttf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    hb_variation_t var;
+    var.tag = HB_TAG ('w','g','h','t');
+    var.value = 300;
+    hb_font_set_variations (font, &var, 1);
+
+    hb_buffer_t *buffer = hb_buffer_create ();
+    hb_codepoint_t codepoint = 24396; /* 彌 */
+    hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
+    hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
+    hb_shape (font, buffer, NULL, 0);
+    codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
+    hb_buffer_destroy (buffer);
+
+    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"
+                     "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,43"
+                     "L820,20Q798,58 778,87Q747,43 707,12ZM621,-94L621,730L664,730L664,-94"
+                     "L621,-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";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    hb_font_destroy (font);
+  }
+  /* should support sharing enumerated points */
+  {
+    hb_face_t *face = hb_test_open_font_file ("fonts/TestGVARTwo.ttf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    hb_variation_t var;
+    var.tag = HB_TAG ('w','g','h','t');
+    var.value = 300;
+    hb_font_set_variations (font, &var, 1);
+
+    hb_buffer_t *buffer = hb_buffer_create ();
+    hb_codepoint_t codepoint = 24396; /* 彌 */
+    hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
+    hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
+    hb_shape (font, buffer, NULL, 0);
+    codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
+    hb_buffer_destroy (buffer);
+
+    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,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";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    hb_font_destroy (font);
+  }
+  /* should support sharing no points */
+  {
+    hb_face_t *face = hb_test_open_font_file ("fonts/TestGVARThree.ttf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    hb_variation_t var;
+    var.tag = HB_TAG ('w','g','h','t');
+    var.value = 300;
+    hb_font_set_variations (font, &var, 1);
+
+    hb_buffer_t *buffer = hb_buffer_create ();
+    hb_codepoint_t codepoint = 24396; /* 彌 */
+    hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
+    hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
+    hb_shape (font, buffer, NULL, 0);
+    codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
+    hb_buffer_destroy (buffer);
+
+    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,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";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    hb_font_destroy (font);
+  }
+
+  /* CFF2 variations */
+  {
+    hb_face_t *face = hb_test_open_font_file ("fonts/AdobeVFPrototype-Subset.otf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    hb_variation_t var;
+    var.tag = HB_TAG ('w','g','h','t');
+    /* applies variations to CFF2 glyphs */
+    {
+      var.value = 100;
+      hb_font_set_variations (font, &var, 1);
+
+      hb_buffer_t *buffer = hb_buffer_create ();
+      hb_codepoint_t codepoint = '$';
+      hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
+      hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
+      hb_shape (font, buffer, NULL, 0);
+      codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
+      hb_buffer_destroy (buffer);
+
+      user_data.consumed = 0;
+      g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
+      char expected[] = "M246,15C188,15 147,27 101,68L142,23L117,117C111,143 96,149 81,149"
+                       "C65,149 56,141 52,126C71,40 137,-13 244,-13C348,-13 436,46 436,156"
+                       "C436,229 405,295 271,349L247,359C160,393 119,439 119,506"
+                       "C119,592 178,637 262,637C311,637 346,626 390,585L348,629L373,535"
+                       "C380,510 394,503 408,503C424,503 434,510 437,526C418,614 348,665 259,665"
+                       "C161,665 78,606 78,500C78,414 128,361 224,321L261,305C367,259 395,217 395,152"
+                       "C395,65 334,15 246,15ZM267,331L267,759L240,759L240,331L267,331ZM240,-115"
+                       "L267,-115L267,331L240,331L240,-115Z";
+      g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+    }
+    {
+      var.value = 500;
+      hb_font_set_variations (font, &var, 1);
+
+      hb_buffer_t *buffer = hb_buffer_create ();
+      hb_codepoint_t codepoint = '$';
+      hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
+      hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
+      hb_shape (font, buffer, NULL, 0);
+      codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
+      hb_buffer_destroy (buffer);
+
+      user_data.consumed = 0;
+      g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
+      char expected[] = "M251,36C206,36 165,42 118,61L176,21L161,99C151,152 129,167 101,167"
+                       "C78,167 61,155 51,131C54,43 133,-14 247,-14C388,-14 474,64 474,171"
+                       "C474,258 430,321 294,370L257,383C188,406 150,438 150,499"
+                       "C150,571 204,606 276,606C308,606 342,601 386,582L327,621"
+                       "L343,546C355,490 382,476 408,476C428,476 448,487 455,512"
+                       "C450,597 370,656 264,656C140,656 57,576 57,474C57,373 119,318 227,279"
+                       "L263,266C345,236 379,208 379,145C379,76 329,36 251,36ZM289,320"
+                       "L289,746L242,746L242,320L289,320ZM240,-115L286,-115L286,320L240,320L240,-115Z";
+      g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+    }
+    /* substitutes GSUB features depending on variations */
+    {
+      var.value = 900;
+      hb_font_set_variations (font, &var, 1);
+
+      hb_buffer_t *buffer = hb_buffer_create ();
+      hb_codepoint_t codepoint = '$';
+      hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
+      hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
+      hb_shape (font, buffer, NULL, 0);
+      codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
+      hb_buffer_destroy (buffer);
+
+      user_data.consumed = 0;
+      g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
+      char expected[] = "M258,38C197,38 167,48 118,71L192,19L183,103C177,155 155,174 115,174"
+                       "C89,174 64,161 51,125C52,36 124,-16 258,-16C417,-16 513,67 513,175"
+                       "C513,278 457,328 322,388L289,403C232,429 203,452 203,500C203,562 244,589 301,589"
+                       "C342,589 370,585 420,562L341,607L352,539C363,468 398,454 434,454C459,454 486,468 492,506"
+                       "C491,590 408,643 290,643C141,643 57,563 57,460C57,357 122,307 233,256L265,241"
+                       "C334,209 363,186 363,130C363,77 320,38 258,38ZM318,616L318,734L252,734L252,616"
+                       "L318,616ZM253,-115L319,-115L319,14L253,14L253,-115Z";
+      g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+    }
+
+    hb_font_destroy (font);
+  }
+}
+
+static void
+test_hb_draw_estedad_vf (void)
+{
+  /* https://github.com/harfbuzz/harfbuzz/issues/2215 */
+  char str[2048];
+  user_data_t user_data = {
+    .str = str,
+    .size = sizeof (str)
+  };
+  {
+    /* See https://github.com/google/skia/blob/d38f00a1/gm/stroketext.cpp#L115-L124 */
+    hb_face_t *face = hb_test_open_font_file ("fonts/Estedad-VF.ttf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    hb_variation_t var;
+    hb_variation_from_string ("wght=100", -1, &var);
+    hb_font_set_variations (font, &var, 1);
+
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 156, funcs, &user_data));
+    /* Skip empty path where all the points of a path are equal */
+    char expected[] = "M150,1158L182,1158Q256,1158 317,1170Q377,1182 421,1213L421,430L521,430"
+                     "L521,1490L421,1490L421,1320Q393,1279 344,1262Q294,1244 182,1244L150,1244"
+                     "L150,1158ZM1815,-122L1669,-122L1669,642L1552,642L1055,-117L1055,-206"
+                     "L1569,-206L1569,-458L1669,-458L1669,-206L1815,-206L1815,-122ZM1569,-122"
+                     "L1166,-122L1569,494L1569,-122ZM609,-79L1639,1288L1555,1334L525,-33L609,-79Z";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    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";
+    g_assert_cmpmem (str, user_data.consumed, expected2, sizeof (expected2) - 1);
+
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 262, funcs, &user_data));
+    /* Skip empty path where all the points of a path are equal */
+    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";
+    g_assert_cmpmem (str, user_data.consumed, expected3, sizeof (expected3) - 1);
+
+    hb_font_destroy (font);
+  }
+}
+
+static void
+test_hb_draw_stroking (void)
+{
+  /* https://skia-review.googlesource.com/c/skia/+/266945
+     https://savannah.nongnu.org/bugs/index.php?57701 */
+  char str[2048];
+  user_data_t user_data = {
+    .str = str,
+    .size = sizeof (str)
+  };
+  {
+    /* See https://github.com/google/skia/blob/d38f00a1/gm/stroketext.cpp#L115-L124 */
+    hb_face_t *face = hb_test_open_font_file ("fonts/Stroking.ttf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 6, funcs, &user_data));
+    /* Skip empty path where all the points of a path are equal */
+    char expected[] = "M436,1522Q436,1280 531,1060Q625,839 784,680Q943,521 1164,427Q1384,332 1626,332"
+                     "Q1868,332 2089,427Q2309,521 2468,680Q2627,839 2722,1060Q2816,1280 2816,1522"
+                     "Q2816,1764 2722,1985Q2627,2205 2468,2364Q2309,2523 2089,2618Q1868,2712 1626,2712"
+                     "Q1384,2712 1164,2618Q943,2523 784,2364Q625,2205 531,1985Q436,1764 436,1522ZM256,1528"
+                     "Q256,1714 306,1892Q355,2069 443,2220Q531,2370 658,2497Q784,2623 935,2711"
+                     "Q1085,2799 1263,2849Q1440,2898 1626,2898Q1812,2898 1990,2849Q2167,2799 2318,2711"
+                     "Q2468,2623 2595,2497Q2721,2370 2809,2220Q2897,2069 2947,1892Q2996,1714 2996,1528"
+                     "Q2996,1342 2947,1165Q2897,987 2809,837Q2721,686 2595,560Q2468,433 2318,345"
+                     "Q2167,257 1990,208Q1812,158 1626,158Q1440,158 1263,208Q1085,257 935,345"
+                     "Q784,433 658,560Q531,686 443,837Q355,987 306,1165Q256,1342 256,1528Z";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 7, funcs, &user_data));
+    char expected2[] = "M436,1522Q436,1280 531,1060Q625,839 784,680Q943,521 1164,427"
+                      "Q1384,332 1626,332Q1868,332 2089,427Q2309,521 2468,680"
+                      "Q2627,839 2722,1060Q2816,1280 2816,1522Q2816,1764 2722,1985"
+                      "Q2627,2205 2468,2364Q2309,2523 2089,2618Q1868,2712 1626,2712"
+                      "Q1384,2712 1164,2618Q943,2523 784,2364Q625,2205 531,1985"
+                      "Q436,1764 436,1522ZM256,1528Q256,1714 306,1892Q355,2069 443,2220"
+                      "Q531,2370 658,2497Q784,2623 935,2711Q1085,2799 1263,2849"
+                      "Q1440,2898 1626,2898Q1812,2898 1990,2849Q2167,2799 2318,2711"
+                      "Q2468,2623 2595,2497Q2721,2370 2809,2220Q2897,2069 2947,1892"
+                      "Q2996,1714 2996,1528Q2996,1342 2947,1165Q2897,987 2809,837"
+                      "Q2721,686 2595,560Q2468,433 2318,345Q2167,257 1990,208"
+                      "Q1812,158 1626,158Q1440,158 1263,208Q1085,257 935,345"
+                      "Q784,433 658,560Q531,686 443,837Q355,987 306,1165"
+                      "Q256,1342 256,1528Z";
+    g_assert_cmpmem (str, user_data.consumed, expected2, sizeof (expected2) - 1);
+
+    hb_font_destroy (font);
+  }
+  {
+    /* https://github.com/google/skia/blob/d38f00a1/gm/stroketext.cpp#L131-L138 */
+    hb_face_t *face = hb_test_open_font_file ("fonts/Stroking.otf");
+    hb_font_t *font = hb_font_create (face);
+    hb_face_destroy (face);
+
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 4, funcs, &user_data));
+    /* Skip empty path in CFF */
+    char expected[] = "M106,372C106,532 237,662 397,662C557,662 688,532 688,372C688,212 557,81 397,81C237,81 106,212 106,372Z"
+                     "M62,373C62,188 212,39 397,39C582,39 731,188 731,373C731,558 582,708 397,708C212,708 62,558 62,373Z";
+    g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
+
+    user_data.consumed = 0;
+    g_assert (hb_font_draw_glyph (font, 5, funcs, &user_data));
+    /* Fold consequent move-to commands */
+    char expected2[] = "M106,372C106,532 237,662 397,662C557,662 688,532 688,372"
+                      "C688,212 557,81 397,81C237,81 106,212 106,372ZM62,373"
+                      "C62,188 212,39 397,39C582,39 731,188 731,373"
+                      "C731,558 582,708 397,708C212,708 62,558 62,373Z";
+    g_assert_cmpmem (str, user_data.consumed, expected2, sizeof (expected2) - 1);
+
+    hb_font_destroy (font);
+  }
+}
+
+static void
+test_hb_draw_immutable (void)
+{
+  hb_draw_funcs_t *draw_funcs = hb_draw_funcs_create ();
+  g_assert (!hb_draw_funcs_is_immutable (draw_funcs));
+  hb_draw_funcs_make_immutable (draw_funcs);
+  g_assert (hb_draw_funcs_is_immutable (draw_funcs));
+  hb_draw_funcs_destroy (draw_funcs);
+}
+
+int
+main (int argc, char **argv)
+{
+  funcs = hb_draw_funcs_create ();
+  hb_draw_funcs_set_move_to_func (funcs, (hb_draw_move_to_func_t) move_to);
+  hb_draw_funcs_set_line_to_func (funcs, (hb_draw_line_to_func_t) line_to);
+  hb_draw_funcs_set_quadratic_to_func (funcs, (hb_draw_quadratic_to_func_t) quadratic_to);
+  hb_draw_funcs_set_cubic_to_func (funcs, (hb_draw_cubic_to_func_t) cubic_to);
+  hb_draw_funcs_set_close_path_func (funcs, (hb_draw_close_path_func_t) close_path);
+  hb_draw_funcs_make_immutable (funcs);
+
+  funcs2 = hb_draw_funcs_create ();
+  hb_draw_funcs_set_move_to_func (funcs2, (hb_draw_move_to_func_t) move_to);
+  hb_draw_funcs_set_line_to_func (funcs2, (hb_draw_line_to_func_t) line_to);
+  hb_draw_funcs_set_cubic_to_func (funcs2, (hb_draw_cubic_to_func_t) cubic_to);
+  hb_draw_funcs_set_close_path_func (funcs2, (hb_draw_close_path_func_t) close_path);
+  hb_draw_funcs_make_immutable (funcs2);
+
+  hb_test_init (&argc, &argv);
+  hb_test_add (test_itoa);
+  hb_test_add (test_hb_draw_empty);
+  hb_test_add (test_hb_draw_glyf);
+  hb_test_add (test_hb_draw_cff1);
+  hb_test_add (test_hb_draw_cff1_rline);
+  hb_test_add (test_hb_draw_cff2);
+  hb_test_add (test_hb_draw_ttf_parser_tests);
+  hb_test_add (test_hb_draw_font_kit_glyphs_tests);
+  hb_test_add (test_hb_draw_font_kit_variations_tests);
+  hb_test_add (test_hb_draw_estedad_vf);
+  hb_test_add (test_hb_draw_stroking);
+  hb_test_add (test_hb_draw_immutable);
+  unsigned result = hb_test_run ();
+
+  hb_draw_funcs_destroy (funcs);
+  hb_draw_funcs_destroy (funcs2);
+  return result;
+}
+#else
+int main (int argc HB_UNUSED, char **argv HB_UNUSED)
+{
+  return 0;
+}
+#endif
index 44a9116..0e86123 100644 (file)
 #ifndef TEST_OT_FACE_NO_MAIN
 #include "hb-test.h"
 #endif
+#include <hb-aat.h>
 #include <hb-ot.h>
 
 /* Unit tests for hb-ot-*.h */
 
 
 static void
-test_face (hb_face_t *face,
-          hb_codepoint_t cp)
+test_font (hb_font_t *font, hb_codepoint_t cp)
 {
-  hb_font_t *font = hb_font_create (face);
+  hb_face_t *face = hb_font_get_face (font);
   hb_set_t *set;
   hb_codepoint_t g;
   hb_position_t x, y;
@@ -74,12 +74,39 @@ test_face (hb_face_t *face,
   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_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);
+
   hb_ot_layout_get_baseline (font, HB_OT_LAYOUT_BASELINE_TAG_HANGING, HB_DIRECTION_RTL, HB_SCRIPT_HANGUL, HB_TAG_NONE, NULL);
 
   hb_ot_layout_has_glyph_classes (face);
   hb_ot_layout_has_substitution (face);
   hb_ot_layout_has_positioning (face);
 
+  hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR, cp, 0, NULL, NULL);
+
   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);
@@ -109,15 +136,20 @@ test_face (hb_face_t *face,
   hb_ot_var_normalize_variations (face, NULL, 0, NULL, 0);
   hb_ot_var_normalize_coords (face, 0, NULL, NULL);
 
+#ifdef HB_EXPERIMENTAL_API
+  hb_draw_funcs_t *funcs = hb_draw_funcs_create ();
+  hb_font_draw_glyph (font, cp, funcs, NULL);
+  hb_draw_funcs_destroy (funcs);
+#endif
+
   hb_set_destroy (set);
-  hb_font_destroy (font);
 }
 
 #ifndef TEST_OT_FACE_NO_MAIN
 static void
 test_ot_face_empty (void)
 {
-  test_face (hb_face_get_empty (), 0);
+  test_font (hb_font_get_empty (), 0);
 }
 
 static void
diff --git a/test/api/test-ot-glyphname.c b/test/api/test-ot-glyphname.c
new file mode 100644 (file)
index 0000000..635da9f
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright © 2019  Adobe, 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-test.h"
+#include "hb-ot.h"
+
+static void
+test_one_glyph (hb_font_t *font,  hb_codepoint_t gid, const char *name)
+{
+  char                 buf[64];
+  hb_codepoint_t       glyph;
+
+  g_assert(hb_font_get_glyph_name (font, gid, buf, sizeof (buf)));
+  g_assert_cmpstr(buf, ==, name);
+  g_assert(hb_font_get_glyph_from_name (font, name, -1, &glyph));
+  g_assert_cmpint(glyph, ==, gid);
+}
+
+/* Unit tests for CFF glyph names  */
+
+static void
+test_standard_names (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/MathTestFontFull.otf");
+  hb_font_t *font = hb_font_create (face);
+
+  test_one_glyph (font, 0,   ".notdef");
+  test_one_glyph (font, 27,  "Z");
+
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+}
+
+static void
+test_non_standard_names (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/MathTestFontFull.otf");
+  hb_font_t *font = hb_font_create (face);
+
+  test_one_glyph (font, 46,  "arrowdblright");
+  test_one_glyph (font, 138, "uni21E7_size5");
+
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+}
+
+static void
+test_predef_charset_names (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/cff1_expert.otf");
+  hb_font_t *font = hb_font_create (face);
+
+  test_one_glyph (font, 0,   ".notdef");
+  test_one_glyph (font, 29,  "centsuperior");
+  test_one_glyph (font, 86,  "commainferior");
+
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_standard_names);
+  hb_test_add (test_non_standard_names);
+  hb_test_add (test_predef_charset_names);
+
+  return hb_test_run();
+}
index d842785..4a91643 100644 (file)
 #include <hb-ot.h>
 
 static void
-test_ot_layout_feature_get_name_ids_and_characters (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[2];
-  unsigned int caret_count = 2;
-  g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_RTL,
-                                                            98, 0, &caret_count,
-                                                            caret_array));
+  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)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.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];
+
+  /* call with no result */
+  {
+    unsigned caret_count = 16;
+    g_assert_cmpuint (0, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
+                                                              188, 0, &caret_count,
+                                                              caret_array));
+
+    g_assert_cmpuint (0, ==, caret_count);
+  }
+
+  /* call with no result and some offset */
+  {
+    unsigned caret_count = 16;
+    g_assert_cmpuint (0, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
+                                                              188, 10, &caret_count,
+                                                              caret_array));
 
-  g_assert_cmpuint (2, ==, caret_count);
-  g_assert_cmpuint (1130, ==, caret_array[0]);
-  g_assert_cmpuint (2344, ==, caret_array[1]);
+    g_assert_cmpuint (0, ==, caret_count);
+  }
+
+  /* a glyph with 3 ligature carets */
+  {
+    unsigned caret_count = 16;
+    g_assert_cmpuint (3, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
+                                                              1020, 0, &caret_count,
+                                                              caret_array));
+
+    g_assert_cmpuint (3, ==, caret_count);
+    g_assert_cmpuint (2718, ==, caret_array[0]);
+    g_assert_cmpuint (5438, ==, caret_array[1]);
+    g_assert_cmpuint (8156, ==, caret_array[2]);
+  }
+
+  /* the same glyph as above but with offset */
+  {
+    caret_array[2] = 123;
+
+    unsigned caret_count = 16;
+    g_assert_cmpuint (3, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
+                                                              1020, 1, &caret_count,
+                                                              caret_array));
+
+    g_assert_cmpuint (2, ==, caret_count);
+    g_assert_cmpuint (5438, ==, caret_array[0]);
+    g_assert_cmpuint (8156, ==, caret_array[1]);
+
+    g_assert_cmpuint (123, ==, caret_array[2]);
+  }
+
+  /* the same glyph as above but with another offset */
+  {
+    unsigned caret_count = 16;
+    g_assert_cmpuint (3, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
+                                                              1020, 2, &caret_count,
+                                                              caret_array));
+
+    g_assert_cmpuint (1, ==, caret_count);
+    g_assert_cmpuint (8156, ==, caret_array[0]);
+  }
+
+  /* call with no result */
+  {
+    unsigned caret_count = 16;
+    g_assert_cmpuint (0, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
+                                                              1021, 0, &caret_count,
+                                                              caret_array));
+
+    g_assert_cmpuint (0, ==, caret_count);
+  }
+
+  /* a glyph with 1 ligature caret */
+  {
+    unsigned caret_count = 16;
+    g_assert_cmpuint (1, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
+                                                              1022, 0, &caret_count,
+                                                              caret_array));
+
+    g_assert_cmpuint (1, ==, caret_count);
+    g_assert_cmpuint (3530, ==, caret_array[0]);
+  }
+
+  /* the same glyph as above but with offset */
+  {
+    unsigned caret_count = 16;
+    g_assert_cmpuint (1, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
+                                                              1022, 1, &caret_count,
+                                                              caret_array));
+
+    g_assert_cmpuint (0, ==, caret_count);
+  }
+
+  /* a glyph with 2 ligature carets */
+  {
+    unsigned caret_count = 16;
+    g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR,
+                                                              1023, 0, &caret_count,
+                                                              caret_array));
+
+    g_assert_cmpuint (2, ==, caret_count);
+    g_assert_cmpuint (2352, ==, caret_array[0]);
+    g_assert_cmpuint (4706, ==, caret_array[1]);
+  }
+
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+}
+
+static void
+test_ot_layout_get_ligature_carets_empty (void)
+{
+  hb_face_t *face = hb_face_get_empty ();
+  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);
 
-  g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_BTT,
-                                                            98, 0, &caret_count,
+  hb_position_t caret_array[3];
+  unsigned int caret_count = 3;
+  g_assert_cmpuint (0, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_RTL,
+                                                            1024, 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]);
+  g_assert_cmpuint (0, ==, caret_count);
 
   hb_font_destroy (font);
   hb_face_destroy (face);
@@ -61,7 +241,9 @@ main (int argc, char **argv)
 {
   g_test_init (&argc, &argv, NULL);
 
-  hb_test_add (test_ot_layout_feature_get_name_ids_and_characters);
+  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_empty);
 
   return hb_test_run ();
 }
index 2305a95..cffdeb7 100644 (file)
@@ -234,6 +234,23 @@ test_advance_tt_var_comp_v (void)
   hb_font_destroy (font);
 }
 
+static void
+test_advance_tt_var_gvar_infer (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/TestGVAREight.ttf");
+  hb_font_t *font = hb_font_create (face);
+  hb_ot_font_set_funcs (font);
+  hb_face_destroy (face);
+
+  int coords[6] = {100};
+  hb_font_set_var_coords_normalized (font, coords, 6);
+
+  hb_glyph_extents_t extents = {0};
+  g_assert (hb_font_get_glyph_extents (font, 4, &extents));
+
+  hb_font_destroy (font);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -245,6 +262,7 @@ main (int argc, char **argv)
   hb_test_add (test_advance_tt_var_anchor);
   hb_test_add (test_extents_tt_var_comp);
   hb_test_add (test_advance_tt_var_comp_v);
+  hb_test_add (test_advance_tt_var_gvar_infer);
 
   return hb_test_run ();
 }
index 958fd6b..78ebc03 100644 (file)
@@ -164,10 +164,16 @@ test_ot_tag_script_from_language (void)
   test_script_tags_from_language ("copt", "en", HB_SCRIPT_COPTIC);
   test_script_tags_from_language (NULL, "x-hbsc", HB_SCRIPT_INVALID);
   test_script_tags_from_language ("copt", "x-hbsc", HB_SCRIPT_COPTIC);
+  test_script_tags_from_language (NULL, "x-hbsc-", HB_SCRIPT_INVALID);
+  test_script_tags_from_language (NULL, "x-hbsc-1", HB_SCRIPT_INVALID);
+  test_script_tags_from_language (NULL, "x-hbsc-1a", HB_SCRIPT_INVALID);
+  test_script_tags_from_language (NULL, "x-hbsc-1a2b3c4x", HB_SCRIPT_INVALID);
+  test_script_tags_from_language ("2lon", "x-hbsc-326c6f6e67", HB_SCRIPT_INVALID);
   test_script_tags_from_language ("abc ", "x-hbscabc", HB_SCRIPT_INVALID);
   test_script_tags_from_language ("deva", "x-hbscdeva", HB_SCRIPT_INVALID);
   test_script_tags_from_language ("dev2", "x-hbscdev2", HB_SCRIPT_INVALID);
   test_script_tags_from_language ("dev3", "x-hbscdev3", HB_SCRIPT_INVALID);
+  test_script_tags_from_language ("dev3", "x-hbsc-64657633", HB_SCRIPT_INVALID);
   test_script_tags_from_language ("copt", "x-hbotpap0-hbsccopt", HB_SCRIPT_INVALID);
   test_script_tags_from_language (NULL, "en-x-hbsc", HB_SCRIPT_INVALID);
   test_script_tags_from_language ("copt", "en-x-hbsc", HB_SCRIPT_COPTIC);
@@ -175,6 +181,7 @@ test_ot_tag_script_from_language (void)
   test_script_tags_from_language ("deva", "en-x-hbscdeva", HB_SCRIPT_INVALID);
   test_script_tags_from_language ("dev2", "en-x-hbscdev2", HB_SCRIPT_INVALID);
   test_script_tags_from_language ("dev3", "en-x-hbscdev3", HB_SCRIPT_INVALID);
+  test_script_tags_from_language ("dev3", "en-x-hbsc-64657633", HB_SCRIPT_INVALID);
   test_script_tags_from_language ("copt", "en-x-hbotpap0-hbsccopt", HB_SCRIPT_INVALID);
 }
 
@@ -266,12 +273,12 @@ test_tags_to_script_and_language (const char *script_tag_s,
 static void
 test_ot_tags_to_script_and_language (void)
 {
-  test_tags_to_script_and_language ("DFLT", "ENG", "", "en-x-hbscdflt");
+  test_tags_to_script_and_language ("DFLT", "ENG", "", "en-x-hbsc-44464c54");
   test_tags_to_script_and_language ("latn", "ENG", "Latn", "en");
-  test_tags_to_script_and_language ("deva", "MAR", "Deva", "mr-x-hbscdeva");
-  test_tags_to_script_and_language ("dev2", "MAR", "Deva", "mr-x-hbscdev2");
+  test_tags_to_script_and_language ("deva", "MAR", "Deva", "mr-x-hbsc-64657661");
+  test_tags_to_script_and_language ("dev2", "MAR", "Deva", "mr-x-hbsc-64657632");
   test_tags_to_script_and_language ("dev3", "MAR", "Deva", "mr");
-  test_tags_to_script_and_language ("qaa", "QTZ0", "Qaaa", "x-hbotqtz0-hbscqaa");
+  test_tags_to_script_and_language ("qaa", "QTZ0", "Qaaa", "x-hbot-51545a30-hbsc-71616120");
 }
 
 static void
@@ -291,8 +298,9 @@ test_ot_tag_language (void)
   test_language_two_way ("ENG", "en");
   test_tag_from_language ("ENG", "en_US");
 
-  test_language_two_way ("CJA", "cja"); /* Western Cham */
-  test_language_two_way ("CJM", "cjm"); /* Eastern Cham */
+  test_language_two_way ("CJA", "cja-x-hbot-434a4120"); /* Western Cham */
+  test_language_two_way ("CJM", "cjm-x-hbot-434a4d20"); /* Eastern Cham */
+  test_tag_from_language ("CJM", "cjm");
   test_language_two_way ("EVN", "eve");
 
   test_language_two_way ("HAL", "cfm"); /* BCP47 and current ISO639-3 code for Halam/Falam Chin */
@@ -351,13 +359,20 @@ test_ot_tag_language (void)
   test_tag_from_language ("ZHH", "yue-Hant");
   test_tag_from_language ("ZHS", "yue-Hans");
 
-  test_language_two_way ("ABC", "abc");
-  test_language_two_way ("ABCD", "x-hbotabcd");
+  test_language_two_way ("ABC", "abc-x-hbot-41424320");
+  test_language_two_way ("ABCD", "x-hbot-41424344");
   test_tag_from_language ("ABC", "asdf-asdf-wer-x-hbotabc-zxc");
   test_tag_from_language ("ABC", "asdf-asdf-wer-x-hbotabc");
   test_tag_from_language ("ABCD", "asdf-asdf-wer-x-hbotabcd");
+  test_tag_from_language ("ABC", "asdf-asdf-wer-x-hbot-41424320-zxc");
+  test_tag_from_language ("ABC", "asdf-asdf-wer-x-hbot-41424320");
+  test_tag_from_language ("ABCD", "asdf-asdf-wer-x-hbot-41424344");
 
+  test_tag_from_language ("dflt", "asdf-asdf-wer-x-hbot");
   test_tag_from_language ("dflt", "asdf-asdf-wer-x-hbot-zxc");
+  test_tag_from_language ("dflt", "asdf-asdf-wer-x-hbot-zxc-414243");
+  test_tag_from_language ("dflt", "asdf-asdf-wer-x-hbot-414243");
+  test_tag_from_language ("dflt", "asdf-asdf-wer-x-hbot-4142432");
 
   test_tag_from_language ("dflt", "xy");
   test_tag_from_language ("XYZ", "xyz"); /* Unknown ISO 639-3 */
@@ -423,12 +438,27 @@ test_ot_tag_language (void)
   test_language_two_way ("SYRN", "und-Syrn");
 
   /* Test that x-hbot overrides the base language */
-  test_tag_from_language ("ABC", "fa-x-hbotabc-zxc");
-  test_tag_from_language ("ABC", "fa-ir-x-hbotabc-zxc");
-  test_tag_from_language ("ABC", "zh-x-hbotabc-zxc");
-  test_tag_from_language ("ABC", "zh-cn-x-hbotabc-zxc");
-  test_tag_from_language ("ABC", "zh-xy-x-hbotabc-zxc");
-  test_tag_from_language ("ABC", "xyz-xy-x-hbotabc-zxc");
+  test_tag_from_language ("ABC", "fa-x-hbotabc-hbot-41686121-zxc");
+  test_tag_from_language ("ABC", "fa-ir-x-hbotabc-hbot-41686121-zxc");
+  test_tag_from_language ("ABC", "zh-x-hbotabc-hbot-41686121-zxc");
+  test_tag_from_language ("ABC", "zh-cn-x-hbotabc-hbot-41686121-zxc");
+  test_tag_from_language ("ABC", "zh-xy-x-hbotabc-hbot-41686121-zxc");
+  test_tag_from_language ("ABC", "xyz-xy-x-hbotabc-hbot-41686121-zxc");
+
+  test_tag_from_language ("Aha!", "fa-x-hbot-41686121-hbotabc-zxc");
+  test_tag_from_language ("Aha!", "fa-ir-x-hbot-41686121-hbotabc-zxc");
+  test_tag_from_language ("Aha!", "zh-x-hbot-41686121-hbotabc-zxc");
+  test_tag_from_language ("Aha!", "zh-cn-x-hbot-41686121-hbotabc-zxc");
+  test_tag_from_language ("Aha!", "zh-xy-x-hbot-41686121-hbotabc-zxc");
+  test_tag_from_language ("Aha!", "xyz-xy-x-hbot-41686121-hbotabc-zxc");
+
+  /* Invalid x-hbot */
+  test_tag_from_language ("dflt", "x-hbot");
+  test_tag_from_language ("dflt", "x-hbot-");
+  test_tag_from_language ("dflt", "x-hbot-1");
+  test_tag_from_language ("dflt", "x-hbot-1a");
+  test_tag_from_language ("dflt", "x-hbot-1a2b3c4x");
+  test_tag_from_language ("2lon", "x-hbot-326c6f6e67");
 
   /* Unnormalized BCP 47 tags */
   test_tag_from_language ("ARA", "ar-aao");
index aa2b388..eb690b8 100644 (file)
@@ -135,6 +135,81 @@ test_set_basic (void)
 //   printf ("}\n");
 // }
 
+static void test_set_intersect_empty (void)
+{
+  hb_set_t* a = hb_set_create ();
+  hb_set_add (a, 3585);
+  hb_set_add (a, 21333);
+  hb_set_add (a, 24405);
+
+  hb_set_t* b = hb_set_create();
+  hb_set_add (b, 21483);
+  hb_set_add (b, 24064);
+
+  hb_set_intersect (a, b);
+  g_assert (hb_set_is_empty (a));
+
+  hb_set_destroy (a);
+  hb_set_destroy (b);
+
+
+  a = hb_set_create ();
+  hb_set_add (a, 16777216);
+
+  b = hb_set_create();
+  hb_set_add (b, 0);
+
+  hb_set_intersect (a, b);
+  g_assert (hb_set_is_empty (a));
+
+  hb_set_destroy (a);
+  hb_set_destroy (b);
+}
+
+static void test_set_intersect_page_reduction (void)
+{
+  hb_set_t* a = hb_set_create ();
+  hb_set_add (a, 3585);
+  hb_set_add (a, 21333);
+  hb_set_add (a, 24405);
+
+  hb_set_t* b = hb_set_create();
+  hb_set_add (b, 3585);
+  hb_set_add (b, 24405);
+
+  hb_set_intersect(a, b);
+  g_assert (hb_set_is_equal (a, b));
+
+  hb_set_destroy (a);
+  hb_set_destroy (b);
+}
+
+static void test_set_union (void)
+{
+  hb_set_t* a = hb_set_create();
+  hb_set_add (a, 3585);
+  hb_set_add (a, 21333);
+  hb_set_add (a, 24405);
+
+  hb_set_t* b = hb_set_create();
+  hb_set_add (b, 21483);
+  hb_set_add (b, 24064);
+
+  hb_set_t* u = hb_set_create ();
+  hb_set_add (u, 3585);
+  hb_set_add (u, 21333);
+  hb_set_add (u, 21483);
+  hb_set_add (u, 24064);
+  hb_set_add (u, 24405);
+
+  hb_set_union(b, a);
+  g_assert (hb_set_is_equal (u, b));
+
+  hb_set_destroy (a);
+  hb_set_destroy (b);
+  hb_set_destroy (u);
+}
+
 static void
 test_set_algebra (void)
 {
@@ -395,6 +470,53 @@ test_set_empty (void)
   hb_set_destroy (b);
 }
 
+static void
+test_set_delrange (void)
+{
+  const unsigned P = 512;      /* Page size. */
+  struct { unsigned b, e; } ranges[] = {
+    { 35, P-15 },              /* From page middle thru middle. */
+    { P, P+100 },              /* From page start thru middle. */
+    { P+300, P*2-1 },          /* From page middle thru end. */
+    { P*3, P*4+100 },          /* From page start thru next page middle. */
+    { P*4+300, P*6-1 },                /* From page middle thru next page end. */
+    { P*6+200,P*8+100 },       /* From page middle covering one page thru page middle. */
+    { P*9, P*10+105 },         /* From page start covering one page thru page middle. */
+    { P*10+305, P*12-1 },      /* From page middle covering one page thru page end. */
+    { P*13, P*15-1 },          /* From page start covering two pages thru page end. */
+    { P*15+100, P*18+100 }     /* From page middle covering two pages thru page middle. */
+  };
+  unsigned n = sizeof (ranges) / sizeof(ranges[0]);
+
+  hb_set_t *s = hb_set_create ();
+
+  test_empty (s);
+  for (unsigned int g = 0; g < ranges[n - 1].e + P; g += 2)
+    hb_set_add (s, g);
+
+  hb_set_add (s, P*2-1);
+  hb_set_add (s, P*6-1);
+  hb_set_add (s, P*12-1);
+  hb_set_add (s, P*15-1);
+
+  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++)
+  {
+    unsigned b = ranges[i].b;
+    unsigned e = ranges[i].e;
+    g_assert (hb_set_has (s, (b-2)&~1));
+    while (b <= e)
+      g_assert (!hb_set_has (s, b++));
+    g_assert (hb_set_has (s, (e+2)&~1));
+  }
+
+  hb_set_destroy (s);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -404,6 +526,11 @@ main (int argc, char **argv)
   hb_test_add (test_set_algebra);
   hb_test_add (test_set_iter);
   hb_test_add (test_set_empty);
+  hb_test_add (test_set_delrange);
+
+  hb_test_add (test_set_intersect_empty);
+  hb_test_add (test_set_intersect_page_reduction);
+  hb_test_add (test_set_union);
 
   return hb_test_run();
 }
diff --git a/test/api/test-subset-cbdt.c b/test/api/test-subset-cbdt.c
new file mode 100644 (file)
index 0000000..dcc06e1
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * 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): Calder Kitagawa
+ */
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for CBDT/CBLC subsetting */
+
+static void
+test_subset_cbdt_noop (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoColorEmoji.subset.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, 0x38);
+  hb_set_add (codepoints, 0x39);
+  hb_set_add (codepoints, 0xAE);
+  hb_set_add (codepoints, 0x2049);
+  hb_set_add (codepoints, 0x20E3);
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face, face_subset, HB_TAG ('C','B','L','C'));
+  hb_subset_test_check (face, face_subset, HB_TAG ('C','B','D','T'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face);
+}
+
+static void
+test_subset_cbdt_keep_one (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoColorEmoji.subset.ttf");
+  hb_face_t *face_expected = hb_test_open_font_file ("fonts/NotoColorEmoji.subset.default.39.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, 0x39);
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','B','L','C'));
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','B','D','T'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_expected);
+  hb_face_destroy (face);
+}
+
+static void
+test_subset_cbdt_keep_one_last_subtable (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoColorEmoji.subset.ttf");
+  hb_face_t *face_expected = hb_test_open_font_file ("fonts/NotoColorEmoji.subset.default.2049.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, 0x2049);
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','B','L','C'));
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','B','D','T'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_expected);
+  hb_face_destroy (face);
+}
+
+static void
+test_subset_cbdt_keep_multiple_subtables (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoColorEmoji.subset.multiple_size_tables.ttf");
+  hb_face_t *face_expected = hb_test_open_font_file ("fonts/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, 0x38);
+  hb_set_add (codepoints, 0xAE);
+  hb_set_add (codepoints, 0x2049);
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','B','L','C'));
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','B','D','T'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_expected);
+  hb_face_destroy (face);
+}
+
+static void
+test_subset_cbdt_index_format_3 (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoColorEmoji.subset.index_format3.ttf");
+  hb_face_t *face_expected = hb_test_open_font_file ("fonts/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, 0x38);
+  hb_set_add (codepoints, 0xAE);
+  hb_set_add (codepoints, 0x2049);
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','B','L','C'));
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','B','D','T'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_expected);
+  hb_face_destroy (face);
+}
+
+// TODO: add support/tests for index formats 2,4,5 (image formats are treated as
+// opaque blobs when subsetting so don't need to be tested separately).
+// TODO: add a test that keeps no codepoints.
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_cbdt_noop);
+  hb_test_add (test_subset_cbdt_keep_one);
+  hb_test_add (test_subset_cbdt_keep_one_last_subtable);
+  // The following use manually crafted expectation files as they are not
+  // binary compatible with FontTools.
+  hb_test_add (test_subset_cbdt_keep_multiple_subtables);
+  // Can use FontTools after https://github.com/fonttools/fonttools/issues/1817
+  // is resolved.
+  hb_test_add (test_subset_cbdt_index_format_3);
+
+  return hb_test_run();
+}
index 74e91ca..e16400e 100644 (file)
@@ -90,6 +90,91 @@ test_subset_cmap_noop (void)
   hb_face_destroy (face_abc);
 }
 
+static void
+test_subset_cmap4_no_exceeding_maximum_codepoint (void)
+{
+  hb_face_t *face_origin = hb_test_open_font_file ("fonts/Mplus1p-Regular.ttf");
+  hb_face_t *face_expected = hb_test_open_font_file ("fonts/Mplus1p-Regular-cmap4-testing.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, 0x20);
+  hb_set_add (codepoints, 0x21);
+  hb_set_add (codepoints, 0x1d542);
+  hb_set_add (codepoints, 0x201a2);
+
+  face_subset = hb_subset_test_create_subset (face_origin, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('c','m','a','p'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_expected);
+  hb_face_destroy (face_origin);
+}
+
+static void
+test_subset_cmap_empty_tables (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
+  hb_face_t *face_empty = hb_test_open_font_file ("fonts/Roboto-Regular.empty.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  hb_set_add (codepoints, 100);
+  hb_set_add (codepoints, 101);
+  face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_empty, face_abc_subset, HB_TAG ('c','m','a','p'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_empty);
+}
+
+static void
+test_subset_cmap_noto_color_emoji_noop (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoColorEmoji.cmap.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, 0x38);
+  hb_set_add (codepoints, 0x39);
+  hb_set_add (codepoints, 0xAE);
+  hb_set_add (codepoints, 0x2049);
+  hb_set_add (codepoints, 0x20E3);
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face, face_subset, HB_TAG ('c','m','a','p'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face);
+}
+
+static void
+test_subset_cmap_noto_color_emoji_non_consecutive_glyphs (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/NotoColorEmoji.cmap.ttf");
+  hb_face_t *face_expected = hb_test_open_font_file ("fonts/NotoColorEmoji.cmap.38,AE,2049.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, 0x38);
+  hb_set_add (codepoints, 0xAE);
+  hb_set_add (codepoints, 0x2049);
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('c','m','a','p'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_expected);
+  hb_face_destroy (face);
+}
+
 // TODO(rsheeter) test cmap to no codepoints
 
 int
@@ -100,6 +185,10 @@ main (int argc, char **argv)
   hb_test_add (test_subset_cmap);
   hb_test_add (test_subset_cmap_noop);
   hb_test_add (test_subset_cmap_non_consecutive_glyphs);
+  hb_test_add (test_subset_cmap4_no_exceeding_maximum_codepoint);
+  hb_test_add (test_subset_cmap_empty_tables);
+  hb_test_add (test_subset_cmap_noto_color_emoji_noop);
+  hb_test_add (test_subset_cmap_noto_color_emoji_non_consecutive_glyphs);
 
   return hb_test_run();
 }
diff --git a/test/api/test-subset-colr.c b/test/api/test-subset-colr.c
new file mode 100644 (file)
index 0000000..4035092
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * 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): Calder Kitagawa
+ */
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for COLR subsetting */
+
+static void
+test_subset_colr_noop (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/TwemojiMozilla.subset.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, '2');
+  hb_set_add (codepoints, 0x3297);
+  hb_set_add (codepoints, 0x3299);
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face, face_subset, HB_TAG ('C','O','L','R'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face);
+}
+
+static void
+test_subset_colr_keep_one_colr_glyph (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/TwemojiMozilla.subset.ttf");
+  hb_face_t *face_expected = hb_test_open_font_file ("fonts/TwemojiMozilla.subset.default.3297.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, 0x3297);
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','O','L','R'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_expected);
+  hb_face_destroy (face);
+}
+
+static void
+test_subset_colr_keep_mixed_glyph (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/TwemojiMozilla.subset.ttf");
+  hb_face_t *face_expected = hb_test_open_font_file ("fonts/TwemojiMozilla.subset.default.32,3299.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, '2');
+  hb_set_add (codepoints, 0x3299);
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','O','L','R'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_expected);
+  hb_face_destroy (face);
+}
+
+static void
+test_subset_colr_keep_no_colr_glyph (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/TwemojiMozilla.subset.ttf");
+  hb_face_t *face_expected = hb_test_open_font_file ("fonts/TwemojiMozilla.subset.default.32.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_subset;
+  hb_set_add (codepoints, '2');
+  face_subset = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_expected, face_subset, HB_TAG ('C','O','L','R'));
+
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_expected);
+  hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_colr_noop);
+  hb_test_add (test_subset_colr_keep_one_colr_glyph);
+  hb_test_add (test_subset_colr_keep_mixed_glyph);
+  hb_test_add (test_subset_colr_keep_no_colr_glyph);
+
+  return hb_test_run();
+}
diff --git a/test/api/test-subset-gpos.c b/test/api/test-subset-gpos.c
new file mode 100644 (file)
index 0000000..5c2fe2e
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright © 2020 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for GPOS subsetting */
+
+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");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_pwa_subset;
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'w');
+
+  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'));
+
+  face_pwa_subset = hb_subset_test_create_subset (face_pwa, input);
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_wa, face_pwa_subset, HB_TAG ('G','P','O','S'));
+
+  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");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_wav_subset;
+  hb_set_add (codepoints, 'W');
+  hb_set_add (codepoints, 'A');
+
+  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'));
+
+  face_wav_subset = hb_subset_test_create_subset (face_wav, input);
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_wa, face_wav_subset, HB_TAG ('G','P','O','S'));
+
+  hb_face_destroy (face_wav_subset);
+  hb_face_destroy (face_wav);
+  hb_face_destroy (face_wa);
+#endif
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_gpos_lookup_subtable);
+  hb_test_add (test_subset_gpos_pairpos1_vf);
+
+  return hb_test_run ();
+}
diff --git a/test/api/test-subset-gvar.c b/test/api/test-subset-gvar.c
new file mode 100644 (file)
index 0000000..991be8f
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright © 2019 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for gvar subsetting */
+
+static void
+test_subset_gvar_noop (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file("fonts/SourceSansVariable-Roman.abc.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'b');
+  hb_set_add (codepoints, 'c');
+  face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('g','v','a','r'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+}
+
+static void
+test_subset_gvar (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.abc.ttf");
+  hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.ac.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'c');
+  face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('g','v','a','r'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_gvar_retaingids (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.abc.ttf");
+  hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.ac.retaingids.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  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);
+  face_abc_subset = hb_subset_test_create_subset (face_abc, input);
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('g','v','a','r'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_gvar_noop);
+  hb_test_add (test_subset_gvar);
+  hb_test_add (test_subset_gvar_retaingids);
+
+  return hb_test_run ();
+}
diff --git a/test/api/test-subset-hvar.c b/test/api/test-subset-hvar.c
new file mode 100644 (file)
index 0000000..2a6c2a9
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * Copyright © 2019 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for HVAR subsetting */
+
+static void
+test_subset_map_HVAR_noop (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file("fonts/AdobeVFPrototype.abc.otf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'b');
+  hb_set_add (codepoints, 'c');
+  face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('H','V','A','R'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+}
+
+static void
+test_subset_map_HVAR (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file ("fonts/AdobeVFPrototype.abc.otf");
+  hb_face_t *face_ac = hb_test_open_font_file ("fonts/AdobeVFPrototype.ac.otf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'c');
+  face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('H','V','A','R'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_map_HVAR_retaingids (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file ("fonts/AdobeVFPrototype.abc.otf");
+  hb_face_t *face_ac = hb_test_open_font_file ("fonts/AdobeVFPrototype.ac.retaingids.otf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  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);
+  face_abc_subset = hb_subset_test_create_subset (face_abc, input);
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('H','V','A','R'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_map_modHVAR (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansVariable-Roman-modHVAR.abc.ttf");
+  hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansVariable-Roman-modHVAR.ac.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'c');
+  face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('H','V','A','R'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_identity_HVAR_noop (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file("fonts/SourceSansVariable-Roman.abc.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'b');
+  hb_set_add (codepoints, 'c');
+  face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('H','V','A','R'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+}
+
+static void
+test_subset_identity_HVAR (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.abc.ttf");
+  hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.ac.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'c');
+  face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('H','V','A','R'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_identity_HVAR_retaingids (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.abc.ttf");
+  hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansVariable-Roman.ac.retaingids.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  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);
+  face_abc_subset = hb_subset_test_create_subset (face_abc, input);
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('H','V','A','R'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_map_HVAR_noop);
+  hb_test_add (test_subset_map_HVAR);
+  hb_test_add (test_subset_map_HVAR_retaingids);
+  hb_test_add (test_subset_map_modHVAR);
+  hb_test_add (test_subset_identity_HVAR_noop);
+  hb_test_add (test_subset_identity_HVAR);
+  hb_test_add (test_subset_identity_HVAR_retaingids);
+
+  return hb_test_run ();
+}
diff --git a/test/api/test-subset-sbix.c b/test/api/test-subset-sbix.c
new file mode 100644 (file)
index 0000000..16ac666
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * 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): Calder Kitagawa
+ */
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for sbix subsetting */
+
+static void
+test_subset_sbix_noop (void)
+{
+  hb_face_t *face_XY = hb_test_open_font_file ("fonts/sbix.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_XY_subset;
+  hb_set_add (codepoints, 88);
+  hb_set_add (codepoints, 89);
+  face_XY_subset = hb_subset_test_create_subset (face_XY, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_XY, face_XY_subset, HB_TAG ('s','b','i','x'));
+
+  hb_face_destroy (face_XY_subset);
+  hb_face_destroy (face_XY);
+}
+
+static void
+test_subset_sbix_keep_one (void)
+{
+  hb_face_t *face_XY = hb_test_open_font_file ("fonts/sbix.ttf");
+  hb_face_t *face_X = hb_test_open_font_file ("fonts/sbix_X.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_X_subset;
+  hb_set_add (codepoints, 88);
+  face_X_subset = hb_subset_test_create_subset (face_XY, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_X, face_X_subset, HB_TAG ('s','b','i','x'));
+
+  hb_face_destroy (face_X_subset);
+  hb_face_destroy (face_XY);
+  hb_face_destroy (face_X);
+}
+
+// TODO: add a test that doesn't use contiguous codepoints.
+// TODO: add a test that keeps no codepoints.
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_sbix_noop);
+  hb_test_add (test_subset_sbix_keep_one);
+
+  return hb_test_run();
+}
diff --git a/test/api/test-subset-vvar.c b/test/api/test-subset-vvar.c
new file mode 100644 (file)
index 0000000..2b829a3
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright © 2019 Adobe 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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for VVAR subsetting */
+
+static void
+test_subset_VVAR_noop (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file("fonts/SourceSerifVariable-Roman-VVAR.abc.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'b');
+  hb_set_add (codepoints, 'c');
+  face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('V','V','A','R'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+}
+
+static void
+test_subset_VVAR (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSerifVariable-Roman-VVAR.abc.ttf");
+  hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSerifVariable-Roman-VVAR.ac.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'c');
+  face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('V','V','A','R'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_VVAR_retaingids (void)
+{
+  hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSerifVariable-Roman-VVAR.abc.ttf");
+  hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSerifVariable-Roman-VVAR.ac.retaingids.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_face_t *face_abc_subset;
+  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);
+  face_abc_subset = hb_subset_test_create_subset (face_abc, input);
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('V','V','A','R'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_VVAR_noop);
+  hb_test_add (test_subset_VVAR);
+  hb_test_add (test_subset_VVAR_retaingids);
+
+  return hb_test_run ();
+}
index 71a471d..5c1bcb1 100644 (file)
@@ -178,6 +178,9 @@ static const test_pair_t combining_class_tests_more[] =
   /* Unicode-12.0 character additions */
   {   0x0EBA,   9 },
 
+  /* Unicode-13.0 character additions */
+  {   0x1ABF, 220 },
+
   { 0x111111, 0 }
 };
 
@@ -255,6 +258,9 @@ static const test_pair_t general_category_tests_more[] =
   /* Unicode-12.1 character additions */
   {   0x32FF, HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL },
 
+  /* Unicode-13.0 character additions */
+  {   0x08BE, HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER },
+
   { 0x111111, HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED }
 };
 
@@ -499,6 +505,12 @@ static const test_pair_t script_tests_more[] =
   /* Unicode-12.1 additions */
   {   0x32FF, HB_SCRIPT_COMMON },
 
+  /* Unicode-13.0 additions */
+  {   0x10E80, HB_SCRIPT_YEZIDI },
+  {   0x10FB0, HB_SCRIPT_CHORASMIAN },
+  {   0x11900, HB_SCRIPT_DIVES_AKURU },
+  {   0x18B00, HB_SCRIPT_KHITAN_SMALL_SCRIPT },
+
   { 0x111111, HB_SCRIPT_UNKNOWN }
 };
 
diff --git a/test/api/test-var-coords.c b/test/api/test-var-coords.c
new file mode 100644 (file)
index 0000000..aa152e3
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * 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-ot.h>
+
+/* Unit tests for hb_font_[gs]et_var_coords_ */
+
+static void
+test_get_var_coords (void)
+{
+#ifdef HB_EXPERIMENTAL_API
+#ifndef G_APPROX_VALUE
+#define G_APPROX_VALUE(a, b, epsilon) \
+  (((a) > (b) ? (a) - (b) : (b) - (a)) < (epsilon))
+#endif
+
+#define EPSILON 0.05f
+       
+  hb_face_t *face = hb_test_open_font_file ("fonts/TestCFF2VF.otf");
+  hb_font_t *font = hb_font_create (face);
+
+  /* Normalized coords as input */
+  int normalized_coords[] = {100, 0};
+  hb_font_set_var_coords_normalized (font, normalized_coords, 2);
+  g_assert_cmpint ((int) hb_font_get_var_coords_design (font, NULL)[0], ==, 403);
+  g_assert_cmpint ((int) hb_font_get_var_coords_normalized (font, NULL)[0], ==, 100);
+
+  /* Design coords as input */
+  float design_coords[] = {206.f, 0};
+  hb_font_set_var_coords_design (font, design_coords, 2);
+  g_assert_cmpint ((int) hb_font_get_var_coords_normalized (font, NULL)[0], ==, -16117);
+  g_assert_cmpint ((int) hb_font_get_var_coords_design (font, NULL)[0], ==, 206);
+
+  for (float weight = 200; weight < 901; ++weight)
+  {
+    int normalized;
+    hb_ot_var_normalize_coords (face, 1, &weight, &normalized);
+    hb_font_set_var_coords_normalized (font, &normalized, 1);
+    float converted_back = hb_font_get_var_coords_design (font, NULL)[0];
+    // fprintf (stderr, "%f: %d => %f\n", weight, normalized, converted_back);
+    g_assert_true (G_APPROX_VALUE (converted_back, weight, EPSILON));
+  }
+
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+#endif
+}
+
+static void
+test_get_var_get_axis_infos (void)
+{
+  hb_face_t *face = hb_test_open_font_file ("fonts/Estedad-VF.ttf");
+
+  g_assert_cmpint (hb_ot_var_get_axis_count (face), ==, 2);
+
+  hb_ot_var_axis_info_t info;
+  unsigned c = 1;
+
+  g_assert_cmpint (hb_ot_var_get_axis_infos (face, 0, &c, &info), ==, 2);
+  g_assert (info.tag == HB_TAG ('w','g','h','t'));
+  g_assert_cmpint (c, ==, 1);
+
+  hb_ot_var_get_axis_infos (face, 1, &c, &info);
+  g_assert (info.tag == HB_TAG ('w','d','t','h'));
+  g_assert_cmpint (c, ==, 1);
+
+  hb_ot_var_get_axis_infos (face, 2, &c, &info);
+  g_assert_cmpint (c, ==, 0);
+
+  hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+  hb_test_add (test_get_var_coords);
+  hb_test_add (test_get_var_get_axis_infos);
+  return hb_test_run ();
+}
diff --git a/test/fuzzing/CMakeLists.txt b/test/fuzzing/CMakeLists.txt
deleted file mode 100644 (file)
index 577d13c..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-if (HB_CHECK)
-  file (READ "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.am" MAKEFILEAM)
-  extract_make_variable (hb_shape_fuzzer_SOURCES ${MAKEFILEAM})
-  extract_make_variable (hb_subset_fuzzer_SOURCES ${MAKEFILEAM})
-
-  # TODO: enable these two
-  #extract_make_variable (FUZZING_CPPFLAGS ${MAKEFILEAM}) # extracting regex fail
-  #add_executable (hb-shape-fuzzer # it should be run only after ragel execution
-  #  ${project_sources} ${project_extra_sources} ${project_headers}
-  #  ${hb_shape_fuzzer_SOURCES})
-
-  add_executable (hb-shape-fuzzer ${hb_shape_fuzzer_SOURCES})
-  target_link_libraries (hb-shape-fuzzer harfbuzz)
-
-  add_executable (hb-subset-fuzzer ${hb_subset_fuzzer_SOURCES})
-  target_link_libraries (hb-subset-fuzzer harfbuzz-subset)
-
-  target_compile_definitions(hb-shape-fuzzer PUBLIC ${FUZZING_CPPFLAGS})
-  target_compile_definitions(hb-subset-fuzzer PUBLIC ${FUZZING_CPPFLAGS})
-
-  add_test (NAME hb-shape-fuzzer
-    COMMAND "${PYTHON_EXECUTABLE}" run-shape-fuzzer-tests.py $<TARGET_FILE:hb-shape-fuzzer>
-    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-  add_test (NAME hb-subset-fuzzer
-    COMMAND "${PYTHON_EXECUTABLE}" run-subset-fuzzer-tests.py $<TARGET_FILE:hb-subset-fuzzer>
-    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-endif ()
index 5bd2d7e..2e2b2c9 100644 (file)
@@ -19,13 +19,16 @@ EXTRA_DIST += \
        README \
        run-shape-fuzzer-tests.py \
        run-subset-fuzzer-tests.py \
-       CMakeLists.txt \
+       run-draw-fuzzer-tests.py \
+       meson.build \
        fonts \
        $(NULL)
 
 check_PROGRAMS = \
        hb-shape-fuzzer \
        hb-subset-fuzzer \
+       hb-set-fuzzer \
+       hb-draw-fuzzer \
        $(NULL)
 
 AM_CPPFLAGS = \
@@ -54,9 +57,29 @@ hb_subset_fuzzer_LDADD = \
 hb_subset_fuzzer_CPPFLAGS = $(AM_CPPFLAGS)
 hb_subset_fuzzer_DEPENDENCIES = $(top_builddir)/src/libharfbuzz-subset.la
 
+hb_set_fuzzer_SOURCES = \
+       hb-fuzzer.hh \
+       hb-set-fuzzer.cc \
+       main.cc \
+       $(NULL)
+hb_set_fuzzer_LDADD = $(top_builddir)/src/libharfbuzz.la
+hb_set_fuzzer_CPPFLAGS = $(AM_CPPFLAGS)
+hb_set_fuzzer_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la
+
+hb_draw_fuzzer_SOURCES = \
+       hb-fuzzer.hh \
+       hb-draw-fuzzer.cc \
+       main.cc \
+       $(NULL)
+hb_draw_fuzzer_LDADD = $(top_builddir)/src/libharfbuzz.la
+hb_draw_fuzzer_CPPFLAGS = $(AM_CPPFLAGS)
+hb_draw_fuzzer_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la
+
+
 check:
        EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" LIBTOOL="$(LIBTOOL)" $(srcdir)/run-shape-fuzzer-tests.py
        EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" LIBTOOL="$(LIBTOOL)" $(srcdir)/run-subset-fuzzer-tests.py
+       EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" LIBTOOL="$(LIBTOOL)" $(srcdir)/run-draw-fuzzer-tests.py
 check-valgrind:
        $(AM_V_at)RUN_VALGRIND=1 $(MAKE) $(AM_MAKEFLGS) check
 
index d4e7ba3..eab136b 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -90,7 +90,7 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 check_PROGRAMS = hb-shape-fuzzer$(EXEEXT) hb-subset-fuzzer$(EXEEXT) \
-       $(am__EXEEXT_1)
+       hb-set-fuzzer$(EXEEXT) hb-draw-fuzzer$(EXEEXT) $(am__EXEEXT_1)
 subdir = test/fuzzing
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
@@ -109,14 +109,20 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 =
 am__objects_1 =
-am_hb_shape_fuzzer_OBJECTS =  \
-       hb_shape_fuzzer-hb-shape-fuzzer.$(OBJEXT) \
-       hb_shape_fuzzer-main.$(OBJEXT) $(am__objects_1)
-hb_shape_fuzzer_OBJECTS = $(am_hb_shape_fuzzer_OBJECTS)
+am_hb_draw_fuzzer_OBJECTS = hb_draw_fuzzer-hb-draw-fuzzer.$(OBJEXT) \
+       hb_draw_fuzzer-main.$(OBJEXT) $(am__objects_1)
+hb_draw_fuzzer_OBJECTS = $(am_hb_draw_fuzzer_OBJECTS)
 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_set_fuzzer_OBJECTS = hb_set_fuzzer-hb-set-fuzzer.$(OBJEXT) \
+       hb_set_fuzzer-main.$(OBJEXT) $(am__objects_1)
+hb_set_fuzzer_OBJECTS = $(am_hb_set_fuzzer_OBJECTS)
+am_hb_shape_fuzzer_OBJECTS =  \
+       hb_shape_fuzzer-hb-shape-fuzzer.$(OBJEXT) \
+       hb_shape_fuzzer-main.$(OBJEXT) $(am__objects_1)
+hb_shape_fuzzer_OBJECTS = $(am_hb_shape_fuzzer_OBJECTS)
 am_hb_subset_fuzzer_OBJECTS =  \
        hb_subset_fuzzer-hb-subset-fuzzer.$(OBJEXT) \
        hb_subset_fuzzer-main.$(OBJEXT) $(am__objects_1)
@@ -136,7 +142,11 @@ 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)/hb_shape_fuzzer-hb-shape-fuzzer.Po \
+am__depfiles_remade = ./$(DEPDIR)/hb_draw_fuzzer-hb-draw-fuzzer.Po \
+       ./$(DEPDIR)/hb_draw_fuzzer-main.Po \
+       ./$(DEPDIR)/hb_set_fuzzer-hb-set-fuzzer.Po \
+       ./$(DEPDIR)/hb_set_fuzzer-main.Po \
+       ./$(DEPDIR)/hb_shape_fuzzer-hb-shape-fuzzer.Po \
        ./$(DEPDIR)/hb_shape_fuzzer-main.Po \
        ./$(DEPDIR)/hb_subset_fuzzer-hb-subset-fuzzer.Po \
        ./$(DEPDIR)/hb_subset_fuzzer-main.Po
@@ -177,8 +187,10 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(hb_shape_fuzzer_SOURCES) $(hb_subset_fuzzer_SOURCES)
-DIST_SOURCES = $(hb_shape_fuzzer_SOURCES) $(hb_subset_fuzzer_SOURCES)
+SOURCES = $(hb_draw_fuzzer_SOURCES) $(hb_set_fuzzer_SOURCES) \
+       $(hb_shape_fuzzer_SOURCES) $(hb_subset_fuzzer_SOURCES)
+DIST_SOURCES = $(hb_draw_fuzzer_SOURCES) $(hb_set_fuzzer_SOURCES) \
+       $(hb_shape_fuzzer_SOURCES) $(hb_subset_fuzzer_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -339,6 +351,8 @@ 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@
@@ -396,7 +410,8 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
 EXTRA_DIST = README run-shape-fuzzer-tests.py \
-       run-subset-fuzzer-tests.py CMakeLists.txt fonts $(NULL)
+       run-subset-fuzzer-tests.py run-draw-fuzzer-tests.py \
+       meson.build fonts $(NULL)
 CLEANFILES = 
 DISTCLEANFILES = 
 MAINTAINERCLEANFILES = 
@@ -427,6 +442,24 @@ hb_subset_fuzzer_LDADD = \
 
 hb_subset_fuzzer_CPPFLAGS = $(AM_CPPFLAGS)
 hb_subset_fuzzer_DEPENDENCIES = $(top_builddir)/src/libharfbuzz-subset.la
+hb_set_fuzzer_SOURCES = \
+       hb-fuzzer.hh \
+       hb-set-fuzzer.cc \
+       main.cc \
+       $(NULL)
+
+hb_set_fuzzer_LDADD = $(top_builddir)/src/libharfbuzz.la
+hb_set_fuzzer_CPPFLAGS = $(AM_CPPFLAGS)
+hb_set_fuzzer_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la
+hb_draw_fuzzer_SOURCES = \
+       hb-fuzzer.hh \
+       hb-draw-fuzzer.cc \
+       main.cc \
+       $(NULL)
+
+hb_draw_fuzzer_LDADD = $(top_builddir)/src/libharfbuzz.la
+hb_draw_fuzzer_CPPFLAGS = $(AM_CPPFLAGS)
+hb_draw_fuzzer_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la
 all: all-am
 
 .SUFFIXES:
@@ -470,6 +503,14 @@ clean-checkPROGRAMS:
        echo " rm -f" $$list; \
        rm -f $$list
 
+hb-draw-fuzzer$(EXEEXT): $(hb_draw_fuzzer_OBJECTS) $(hb_draw_fuzzer_DEPENDENCIES) $(EXTRA_hb_draw_fuzzer_DEPENDENCIES) 
+       @rm -f hb-draw-fuzzer$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(hb_draw_fuzzer_OBJECTS) $(hb_draw_fuzzer_LDADD) $(LIBS)
+
+hb-set-fuzzer$(EXEEXT): $(hb_set_fuzzer_OBJECTS) $(hb_set_fuzzer_DEPENDENCIES) $(EXTRA_hb_set_fuzzer_DEPENDENCIES) 
+       @rm -f hb-set-fuzzer$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(hb_set_fuzzer_OBJECTS) $(hb_set_fuzzer_LDADD) $(LIBS)
+
 hb-shape-fuzzer$(EXEEXT): $(hb_shape_fuzzer_OBJECTS) $(hb_shape_fuzzer_DEPENDENCIES) $(EXTRA_hb_shape_fuzzer_DEPENDENCIES) 
        @rm -f hb-shape-fuzzer$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(hb_shape_fuzzer_OBJECTS) $(hb_shape_fuzzer_LDADD) $(LIBS)
@@ -484,6 +525,10 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_draw_fuzzer-hb-draw-fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_draw_fuzzer-main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_set_fuzzer-hb-set-fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_set_fuzzer-main.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_shape_fuzzer-hb-shape-fuzzer.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_shape_fuzzer-main.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_subset_fuzzer-hb-subset-fuzzer.Po@am__quote@ # am--include-marker
@@ -516,6 +561,62 @@ am--depfiles: $(am__depfiles_remade)
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
 
+hb_draw_fuzzer-hb-draw-fuzzer.o: hb-draw-fuzzer.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_draw_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_draw_fuzzer-hb-draw-fuzzer.o -MD -MP -MF $(DEPDIR)/hb_draw_fuzzer-hb-draw-fuzzer.Tpo -c -o hb_draw_fuzzer-hb-draw-fuzzer.o `test -f 'hb-draw-fuzzer.cc' || echo '$(srcdir)/'`hb-draw-fuzzer.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/hb_draw_fuzzer-hb-draw-fuzzer.Tpo $(DEPDIR)/hb_draw_fuzzer-hb-draw-fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-draw-fuzzer.cc' object='hb_draw_fuzzer-hb-draw-fuzzer.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) $(hb_draw_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_draw_fuzzer-hb-draw-fuzzer.o `test -f 'hb-draw-fuzzer.cc' || echo '$(srcdir)/'`hb-draw-fuzzer.cc
+
+hb_draw_fuzzer-hb-draw-fuzzer.obj: hb-draw-fuzzer.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_draw_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_draw_fuzzer-hb-draw-fuzzer.obj -MD -MP -MF $(DEPDIR)/hb_draw_fuzzer-hb-draw-fuzzer.Tpo -c -o hb_draw_fuzzer-hb-draw-fuzzer.obj `if test -f 'hb-draw-fuzzer.cc'; then $(CYGPATH_W) 'hb-draw-fuzzer.cc'; else $(CYGPATH_W) '$(srcdir)/hb-draw-fuzzer.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/hb_draw_fuzzer-hb-draw-fuzzer.Tpo $(DEPDIR)/hb_draw_fuzzer-hb-draw-fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-draw-fuzzer.cc' object='hb_draw_fuzzer-hb-draw-fuzzer.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) $(hb_draw_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_draw_fuzzer-hb-draw-fuzzer.obj `if test -f 'hb-draw-fuzzer.cc'; then $(CYGPATH_W) 'hb-draw-fuzzer.cc'; else $(CYGPATH_W) '$(srcdir)/hb-draw-fuzzer.cc'; fi`
+
+hb_draw_fuzzer-main.o: main.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_draw_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_draw_fuzzer-main.o -MD -MP -MF $(DEPDIR)/hb_draw_fuzzer-main.Tpo -c -o hb_draw_fuzzer-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/hb_draw_fuzzer-main.Tpo $(DEPDIR)/hb_draw_fuzzer-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='main.cc' object='hb_draw_fuzzer-main.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) $(hb_draw_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_draw_fuzzer-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
+
+hb_draw_fuzzer-main.obj: main.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_draw_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_draw_fuzzer-main.obj -MD -MP -MF $(DEPDIR)/hb_draw_fuzzer-main.Tpo -c -o hb_draw_fuzzer-main.obj `if test -f 'main.cc'; then $(CYGPATH_W) 'main.cc'; else $(CYGPATH_W) '$(srcdir)/main.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/hb_draw_fuzzer-main.Tpo $(DEPDIR)/hb_draw_fuzzer-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='main.cc' object='hb_draw_fuzzer-main.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) $(hb_draw_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_draw_fuzzer-main.obj `if test -f 'main.cc'; then $(CYGPATH_W) 'main.cc'; else $(CYGPATH_W) '$(srcdir)/main.cc'; fi`
+
+hb_set_fuzzer-hb-set-fuzzer.o: hb-set-fuzzer.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_set_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_set_fuzzer-hb-set-fuzzer.o -MD -MP -MF $(DEPDIR)/hb_set_fuzzer-hb-set-fuzzer.Tpo -c -o hb_set_fuzzer-hb-set-fuzzer.o `test -f 'hb-set-fuzzer.cc' || echo '$(srcdir)/'`hb-set-fuzzer.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/hb_set_fuzzer-hb-set-fuzzer.Tpo $(DEPDIR)/hb_set_fuzzer-hb-set-fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-set-fuzzer.cc' object='hb_set_fuzzer-hb-set-fuzzer.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) $(hb_set_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_set_fuzzer-hb-set-fuzzer.o `test -f 'hb-set-fuzzer.cc' || echo '$(srcdir)/'`hb-set-fuzzer.cc
+
+hb_set_fuzzer-hb-set-fuzzer.obj: hb-set-fuzzer.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_set_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_set_fuzzer-hb-set-fuzzer.obj -MD -MP -MF $(DEPDIR)/hb_set_fuzzer-hb-set-fuzzer.Tpo -c -o hb_set_fuzzer-hb-set-fuzzer.obj `if test -f 'hb-set-fuzzer.cc'; then $(CYGPATH_W) 'hb-set-fuzzer.cc'; else $(CYGPATH_W) '$(srcdir)/hb-set-fuzzer.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/hb_set_fuzzer-hb-set-fuzzer.Tpo $(DEPDIR)/hb_set_fuzzer-hb-set-fuzzer.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-set-fuzzer.cc' object='hb_set_fuzzer-hb-set-fuzzer.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) $(hb_set_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_set_fuzzer-hb-set-fuzzer.obj `if test -f 'hb-set-fuzzer.cc'; then $(CYGPATH_W) 'hb-set-fuzzer.cc'; else $(CYGPATH_W) '$(srcdir)/hb-set-fuzzer.cc'; fi`
+
+hb_set_fuzzer-main.o: main.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_set_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_set_fuzzer-main.o -MD -MP -MF $(DEPDIR)/hb_set_fuzzer-main.Tpo -c -o hb_set_fuzzer-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/hb_set_fuzzer-main.Tpo $(DEPDIR)/hb_set_fuzzer-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='main.cc' object='hb_set_fuzzer-main.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) $(hb_set_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_set_fuzzer-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
+
+hb_set_fuzzer-main.obj: main.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_set_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_set_fuzzer-main.obj -MD -MP -MF $(DEPDIR)/hb_set_fuzzer-main.Tpo -c -o hb_set_fuzzer-main.obj `if test -f 'main.cc'; then $(CYGPATH_W) 'main.cc'; else $(CYGPATH_W) '$(srcdir)/main.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/hb_set_fuzzer-main.Tpo $(DEPDIR)/hb_set_fuzzer-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='main.cc' object='hb_set_fuzzer-main.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) $(hb_set_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_set_fuzzer-main.obj `if test -f 'main.cc'; then $(CYGPATH_W) 'main.cc'; else $(CYGPATH_W) '$(srcdir)/main.cc'; fi`
+
 hb_shape_fuzzer-hb-shape-fuzzer.o: hb-shape-fuzzer.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_shape_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_shape_fuzzer-hb-shape-fuzzer.o -MD -MP -MF $(DEPDIR)/hb_shape_fuzzer-hb-shape-fuzzer.Tpo -c -o hb_shape_fuzzer-hb-shape-fuzzer.o `test -f 'hb-shape-fuzzer.cc' || echo '$(srcdir)/'`hb-shape-fuzzer.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/hb_shape_fuzzer-hb-shape-fuzzer.Tpo $(DEPDIR)/hb_shape_fuzzer-hb-shape-fuzzer.Po
@@ -707,7 +808,11 @@ clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
        mostlyclean-am
 
 distclean: distclean-am
-               -rm -f ./$(DEPDIR)/hb_shape_fuzzer-hb-shape-fuzzer.Po
+               -rm -f ./$(DEPDIR)/hb_draw_fuzzer-hb-draw-fuzzer.Po
+       -rm -f ./$(DEPDIR)/hb_draw_fuzzer-main.Po
+       -rm -f ./$(DEPDIR)/hb_set_fuzzer-hb-set-fuzzer.Po
+       -rm -f ./$(DEPDIR)/hb_set_fuzzer-main.Po
+       -rm -f ./$(DEPDIR)/hb_shape_fuzzer-hb-shape-fuzzer.Po
        -rm -f ./$(DEPDIR)/hb_shape_fuzzer-main.Po
        -rm -f ./$(DEPDIR)/hb_subset_fuzzer-hb-subset-fuzzer.Po
        -rm -f ./$(DEPDIR)/hb_subset_fuzzer-main.Po
@@ -756,7 +861,11 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-               -rm -f ./$(DEPDIR)/hb_shape_fuzzer-hb-shape-fuzzer.Po
+               -rm -f ./$(DEPDIR)/hb_draw_fuzzer-hb-draw-fuzzer.Po
+       -rm -f ./$(DEPDIR)/hb_draw_fuzzer-main.Po
+       -rm -f ./$(DEPDIR)/hb_set_fuzzer-hb-set-fuzzer.Po
+       -rm -f ./$(DEPDIR)/hb_set_fuzzer-main.Po
+       -rm -f ./$(DEPDIR)/hb_shape_fuzzer-hb-shape-fuzzer.Po
        -rm -f ./$(DEPDIR)/hb_shape_fuzzer-main.Po
        -rm -f ./$(DEPDIR)/hb_subset_fuzzer-hb-subset-fuzzer.Po
        -rm -f ./$(DEPDIR)/hb_subset_fuzzer-main.Po
@@ -809,6 +918,7 @@ $(top_builddir)/src/libharfbuzz-subset.la: libs
 check:
        EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" LIBTOOL="$(LIBTOOL)" $(srcdir)/run-shape-fuzzer-tests.py
        EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" LIBTOOL="$(LIBTOOL)" $(srcdir)/run-subset-fuzzer-tests.py
+       EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" LIBTOOL="$(LIBTOOL)" $(srcdir)/run-draw-fuzzer-tests.py
 check-valgrind:
        $(AM_V_at)RUN_VALGRIND=1 $(MAKE) $(AM_MAKEFLGS) check
 
diff --git a/test/fuzzing/fonts/1746cad6bc3fb2b355db50a5af37c9b58d9ad376 b/test/fuzzing/fonts/1746cad6bc3fb2b355db50a5af37c9b58d9ad376
new file mode 100644 (file)
index 0000000..8e58f0d
Binary files /dev/null and b/test/fuzzing/fonts/1746cad6bc3fb2b355db50a5af37c9b58d9ad376 differ
diff --git a/test/fuzzing/fonts/NotoColorEmoji.subset.index_format3.ttf b/test/fuzzing/fonts/NotoColorEmoji.subset.index_format3.ttf
new file mode 100644 (file)
index 0000000..df1ff9b
Binary files /dev/null and b/test/fuzzing/fonts/NotoColorEmoji.subset.index_format3.ttf differ
diff --git a/test/fuzzing/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf b/test/fuzzing/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf
new file mode 100644 (file)
index 0000000..cdccded
Binary files /dev/null and b/test/fuzzing/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf differ
diff --git a/test/fuzzing/fonts/NotoColorEmoji.subset.ttf b/test/fuzzing/fonts/NotoColorEmoji.subset.ttf
new file mode 100644 (file)
index 0000000..14a544a
Binary files /dev/null and b/test/fuzzing/fonts/NotoColorEmoji.subset.ttf differ
diff --git a/test/fuzzing/fonts/TwemojiMozilla.subset.ttf b/test/fuzzing/fonts/TwemojiMozilla.subset.ttf
new file mode 100644 (file)
index 0000000..357dda3
Binary files /dev/null and b/test/fuzzing/fonts/TwemojiMozilla.subset.ttf differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-4822416500195328 b/test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-4822416500195328
new file mode 100644 (file)
index 0000000..d13a838
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-4822416500195328 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-5598263003840512 b/test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-5598263003840512
new file mode 100644 (file)
index 0000000..2b3143d
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-5598263003840512 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-6327734241591296 b/test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-6327734241591296
new file mode 100644 (file)
index 0000000..f476997
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-harfbuzz_fuzzer-6327734241591296 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5072750494875648 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5072750494875648
new file mode 100644 (file)
index 0000000..29ea912
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5072750494875648 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5638729035677696 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5638729035677696
new file mode 100644 (file)
index 0000000..0aaed32
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5638729035677696 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5643643755429888 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5643643755429888
new file mode 100644 (file)
index 0000000..d18e3b5
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5643643755429888 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5644258942386176 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5644258942386176
new file mode 100644 (file)
index 0000000..5e0fe47
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5644258942386176 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5657878543728640 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5657878543728640
new file mode 100644 (file)
index 0000000..897e4bc
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5657878543728640 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5680362806575104 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5680362806575104
new file mode 100644 (file)
index 0000000..51828e8
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5680362806575104 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5689920685867008 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5689920685867008
new file mode 100644 (file)
index 0000000..4121e5a
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5689920685867008 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5641053680173056 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5641053680173056
new file mode 100644 (file)
index 0000000..760167f
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5641053680173056 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5686749313892352 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5686749313892352
new file mode 100644 (file)
index 0000000..c6e33d2
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5686749313892352 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5756332481708032 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5756332481708032
new file mode 100644 (file)
index 0000000..99af4b9
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5756332481708032 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4601449528688640 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4601449528688640
new file mode 100644 (file)
index 0000000..922d2d5
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4601449528688640 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4684060812378112 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4684060812378112
new file mode 100644 (file)
index 0000000..dd9ce36
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4684060812378112 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4710179695493120 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4710179695493120
new file mode 100644 (file)
index 0000000..655cda5
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4710179695493120 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4850271066914816 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4850271066914816
new file mode 100644 (file)
index 0000000..458478e
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4850271066914816 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4977194146988032 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4977194146988032
new file mode 100644 (file)
index 0000000..7f8275a
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-4977194146988032 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5012913062150144 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5012913062150144
new file mode 100644 (file)
index 0000000..9fea686
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5012913062150144 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5017946948370432 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5017946948370432
new file mode 100644 (file)
index 0000000..c1fb1d1
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5017946948370432 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5103148350963712 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5103148350963712
new file mode 100644 (file)
index 0000000..f40b66b
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5103148350963712 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5151890782027776 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5151890782027776
new file mode 100644 (file)
index 0000000..f1fd18a
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5151890782027776 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5157039562162176 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5157039562162176
new file mode 100644 (file)
index 0000000..54fbd3b
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5157039562162176 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5163560220753920 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5163560220753920
new file mode 100644 (file)
index 0000000..b0adc5d
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5163560220753920 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5170405903695872 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5170405903695872
new file mode 100644 (file)
index 0000000..33fda47
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5170405903695872 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5180622648770560 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5180622648770560
new file mode 100644 (file)
index 0000000..f6ce7c0
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5180622648770560 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5221177988743168 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5221177988743168
new file mode 100644 (file)
index 0000000..cffd8ac
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5221177988743168 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5334300410773504 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5334300410773504
new file mode 100644 (file)
index 0000000..3ae21cd
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5334300410773504 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5644474732249088 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5644474732249088
new file mode 100644 (file)
index 0000000..7ee1efa
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5644474732249088 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5677289226108928 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5677289226108928
new file mode 100644 (file)
index 0000000..ecb527e
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5677289226108928 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5719356528656384 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5719356528656384
new file mode 100644 (file)
index 0000000..490e843
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5719356528656384 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5740518101090304 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5740518101090304
new file mode 100644 (file)
index 0000000..951bc6c
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5740518101090304 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5952939792531456 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5952939792531456
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6107935408390144 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6107935408390144
new file mode 100644 (file)
index 0000000..4c81a86
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6107935408390144 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6120104833843200 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6120104833843200
new file mode 100644 (file)
index 0000000..f002d27
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6120104833843200 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6128803416637440 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6128803416637440
new file mode 100644 (file)
index 0000000..a27a9c1
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6128803416637440 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6142466903506944 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6142466903506944
new file mode 100644 (file)
index 0000000..3ab6230
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6142466903506944 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6198448785981440 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6198448785981440
new file mode 100644 (file)
index 0000000..c243a78
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6198448785981440 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6223034666713088 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6223034666713088
new file mode 100644 (file)
index 0000000..0e72493
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6223034666713088 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6462232674959360 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6462232674959360
new file mode 100644 (file)
index 0000000..33603bb
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6462232674959360 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6600932143136768 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6600932143136768
new file mode 100644 (file)
index 0000000..78a2709
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6600932143136768 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6603291950841856 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6603291950841856
new file mode 100644 (file)
index 0000000..12b91a0
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6603291950841856 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6712347260092416 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6712347260092416
new file mode 100644 (file)
index 0000000..37e5368
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-6712347260092416 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer.exe-5470269447340032 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer.exe-5470269447340032
new file mode 100644 (file)
index 0000000..f5c27ee
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer.exe-5470269447340032 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5088336521986048 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5088336521986048
new file mode 100644 (file)
index 0000000..5c23559
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5088336521986048 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5668491560747008 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5668491560747008
new file mode 100644 (file)
index 0000000..cf9814a
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5668491560747008 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5681465586352128 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5681465586352128
new file mode 100644 (file)
index 0000000..cc6708a
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5681465586352128 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5686960406659072 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5686960406659072
new file mode 100644 (file)
index 0000000..f6e1461
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5686960406659072 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5703524300357632 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5703524300357632
new file mode 100644 (file)
index 0000000..baff79f
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5703524300357632 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5712313459146752 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5712313459146752
new file mode 100644 (file)
index 0000000..319a56c
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5712313459146752 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5750654771658752 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5750654771658752
new file mode 100644 (file)
index 0000000..1ba504d
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5750654771658752 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-set-fuzzer-6255224052514816 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-set-fuzzer-6255224052514816
new file mode 100644 (file)
index 0000000..d8a3989
--- /dev/null
@@ -0,0 +1 @@
+       
\ No newline at end of file
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5154718402215936 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5154718402215936
new file mode 100644 (file)
index 0000000..3dbf5a5
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5154718402215936 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5158673602314240 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5158673602314240
new file mode 100644 (file)
index 0000000..9add16d
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5158673602314240 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5196560812474368 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5196560812474368
new file mode 100644 (file)
index 0000000..cc37c6e
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5196560812474368 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5632586529898496 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5632586529898496
new file mode 100644 (file)
index 0000000..6b0a192
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5632586529898496 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5642666339991552 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5642666339991552
new file mode 100644 (file)
index 0000000..a9d66af
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5642666339991552 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5642899625082880 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5642899625082880
new file mode 100644 (file)
index 0000000..ad45129
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5642899625082880 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5648999235715072 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5648999235715072
new file mode 100644 (file)
index 0000000..bf1cd32
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5648999235715072 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5652700541222912 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5652700541222912
new file mode 100644 (file)
index 0000000..1650649
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5652700541222912 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5666162551029760 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5666162551029760
new file mode 100644 (file)
index 0000000..fb27d42
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5666162551029760 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5711096049041408 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5711096049041408
new file mode 100644 (file)
index 0000000..310fabb
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5711096049041408 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5711472756260864 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5711472756260864
new file mode 100644 (file)
index 0000000..7264709
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5711472756260864 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5712050577211392 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5712050577211392
new file mode 100644 (file)
index 0000000..9b31fed
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5712050577211392 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5742079188140032 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5742079188140032
new file mode 100644 (file)
index 0000000..d989234
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5742079188140032 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5749627240841216 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5749627240841216
new file mode 100644 (file)
index 0000000..360938a
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5749627240841216 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5769590820044800 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5769590820044800
new file mode 100644 (file)
index 0000000..f6368c6
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5769590820044800 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-6306977171374080 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-6306977171374080
new file mode 100644 (file)
index 0000000..95f02d7
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-6306977171374080 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5121706490593280 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5121706490593280
new file mode 100644 (file)
index 0000000..d94f5a7
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5121706490593280 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5148388450631680 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5148388450631680
new file mode 100644 (file)
index 0000000..16213e4
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5148388450631680 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5160311461511168 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5160311461511168
new file mode 100644 (file)
index 0000000..50db8d4
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5160311461511168 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5167653459329024 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5167653459329024
new file mode 100644 (file)
index 0000000..fe83d24
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5167653459329024 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5169035432165376 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5169035432165376
new file mode 100644 (file)
index 0000000..74958bf
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5169035432165376 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5206191479455744 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5206191479455744
new file mode 100644 (file)
index 0000000..e82995e
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5206191479455744 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5640452927127552 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5640452927127552
new file mode 100644 (file)
index 0000000..f9cf239
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5640452927127552 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5640889218629632 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5640889218629632
new file mode 100644 (file)
index 0000000..a83df52
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5640889218629632 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641053680173056 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641053680173056
new file mode 100644 (file)
index 0000000..f639f17
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641053680173056 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641370503217152 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641370503217152
new file mode 100644 (file)
index 0000000..22827d6
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5641370503217152 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5642531954229248 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5642531954229248
new file mode 100644 (file)
index 0000000..8631cd6
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5642531954229248 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5650879734874112 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5650879734874112
new file mode 100644 (file)
index 0000000..24da16e
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5650879734874112 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5662792105590784 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5662792105590784
new file mode 100644 (file)
index 0000000..d283d14
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5662792105590784 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5674228796358656 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5674228796358656
new file mode 100644 (file)
index 0000000..323f5c5
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5674228796358656 differ
index 3881fbe..11a2367 100644 (file)
Binary files a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5675720390475776 and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5675720390475776 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5678476148867072 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5678476148867072
new file mode 100644 (file)
index 0000000..f1af962
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5678476148867072 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5684014636859392 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5684014636859392
new file mode 100644 (file)
index 0000000..f7d3c0d
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5684014636859392 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5685097303375872 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5685097303375872
new file mode 100644 (file)
index 0000000..cc9e421
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5685097303375872 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695865298092032 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695865298092032
new file mode 100644 (file)
index 0000000..ac1571c
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695865298092032 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695925913911296 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695925913911296
new file mode 100644 (file)
index 0000000..42296e5
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695925913911296 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5697351339999232 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5697351339999232
new file mode 100644 (file)
index 0000000..c72812e
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5697351339999232 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5704307501694976 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5704307501694976
new file mode 100644 (file)
index 0000000..f2f0ec9
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5704307501694976 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708063625969664 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708063625969664
new file mode 100644 (file)
index 0000000..01973d5
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708063625969664 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708764082864128 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708764082864128
new file mode 100644 (file)
index 0000000..96cfb00
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5708764082864128 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5711849555755008 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5711849555755008
new file mode 100644 (file)
index 0000000..c464afa
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5711849555755008 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5713850117914624 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5713850117914624
new file mode 100644 (file)
index 0000000..51cf483
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5713850117914624 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5715299773186048 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5715299773186048
new file mode 100644 (file)
index 0000000..b7a3721
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5715299773186048 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5719588814979072 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5719588814979072
new file mode 100644 (file)
index 0000000..383e61a
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5719588814979072 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5733203291144192 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5733203291144192
new file mode 100644 (file)
index 0000000..1e39613
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5733203291144192 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5735719311507456 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5735719311507456
new file mode 100644 (file)
index 0000000..83314a1
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5735719311507456 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
new file mode 100644 (file)
index 0000000..0c5c734
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5741295280848896 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5745268385906688 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5745268385906688
new file mode 100644 (file)
index 0000000..b69d811
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5745268385906688 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747028458209280 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747028458209280
new file mode 100644 (file)
index 0000000..557c823
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747028458209280 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747280156295168 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747280156295168
new file mode 100644 (file)
index 0000000..5761151
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747280156295168 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5753173985984512 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5753173985984512
new file mode 100644 (file)
index 0000000..46ec929
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5753173985984512 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5756658848890880 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5756658848890880
new file mode 100644 (file)
index 0000000..8717442
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5756658848890880 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5758358618898432 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5758358618898432
new file mode 100644 (file)
index 0000000..b93e1b1
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5758358618898432 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5759725666041856 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5759725666041856
new file mode 100644 (file)
index 0000000..b23c11a
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5759725666041856 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5759783999635456 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5759783999635456
new file mode 100644 (file)
index 0000000..96775e9
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5759783999635456 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5764020596899840 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5764020596899840
new file mode 100644 (file)
index 0000000..af2a62a
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5764020596899840 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6276691949518848 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6276691949518848
new file mode 100644 (file)
index 0000000..5465069
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6276691949518848 differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb_shape_fuzzer-5633785895911424 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb_shape_fuzzer-5633785895911424
new file mode 100644 (file)
index 0000000..0bbeb5c
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb_shape_fuzzer-5633785895911424 differ
diff --git a/test/fuzzing/fonts/fuzz-0-harfbuzz_fuzzer b/test/fuzzing/fonts/fuzz-0-harfbuzz_fuzzer
new file mode 100644 (file)
index 0000000..0f6503d
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-0-harfbuzz_fuzzer differ
diff --git a/test/fuzzing/fonts/fuzz-0-harfbuzz_hb-fuzzer b/test/fuzzing/fonts/fuzz-0-harfbuzz_hb-fuzzer
new file mode 100644 (file)
index 0000000..8b1c293
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-0-harfbuzz_hb-fuzzer differ
diff --git a/test/fuzzing/fonts/fuzz-1-harfbuzz_fuzzer b/test/fuzzing/fonts/fuzz-1-harfbuzz_fuzzer
new file mode 100644 (file)
index 0000000..eac0b7d
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-1-harfbuzz_fuzzer differ
diff --git a/test/fuzzing/fonts/fuzz-1-harfbuzz_fuzzer(1) b/test/fuzzing/fonts/fuzz-1-harfbuzz_fuzzer(1)
new file mode 100644 (file)
index 0000000..d508980
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-1-harfbuzz_fuzzer(1) differ
diff --git a/test/fuzzing/fonts/fuzz-2-harfbuzz_fuzzer b/test/fuzzing/fonts/fuzz-2-harfbuzz_fuzzer
new file mode 100644 (file)
index 0000000..a358833
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-2-harfbuzz_fuzzer differ
diff --git a/test/fuzzing/fonts/fuzz-2-harfbuzz_fuzzer(1) b/test/fuzzing/fonts/fuzz-2-harfbuzz_fuzzer(1)
new file mode 100644 (file)
index 0000000..a358833
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-2-harfbuzz_fuzzer(1) differ
diff --git a/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer
new file mode 100644 (file)
index 0000000..f467471
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer differ
diff --git a/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(1) b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(1)
new file mode 100644 (file)
index 0000000..d53fcff
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(1) differ
diff --git a/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(2) b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(2)
new file mode 100644 (file)
index 0000000..bab475e
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(2) differ
diff --git a/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(3) b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(3)
new file mode 100644 (file)
index 0000000..81045cf
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(3) differ
diff --git a/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(4) b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(4)
new file mode 100644 (file)
index 0000000..ee58436
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(4) differ
diff --git a/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(5) b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(5)
new file mode 100644 (file)
index 0000000..f467471
Binary files /dev/null and b/test/fuzzing/fonts/fuzz-3-harfbuzz_fuzzer(5) differ
diff --git a/test/fuzzing/fonts/kanit.ttf b/test/fuzzing/fonts/kanit.ttf
new file mode 100644 (file)
index 0000000..03dc644
Binary files /dev/null and b/test/fuzzing/fonts/kanit.ttf differ
diff --git a/test/fuzzing/fonts/sbix.ttf b/test/fuzzing/fonts/sbix.ttf
new file mode 100644 (file)
index 0000000..e3da30a
Binary files /dev/null and b/test/fuzzing/fonts/sbix.ttf differ
diff --git a/test/fuzzing/hb-draw-fuzzer.cc b/test/fuzzing/hb-draw-fuzzer.cc
new file mode 100644 (file)
index 0000000..1baefda
--- /dev/null
@@ -0,0 +1,175 @@
+#include <assert.h>
+#include <stdlib.h>
+
+#include <hb-ot.h>
+
+#include "hb-fuzzer.hh"
+
+#ifdef HB_EXPERIMENTAL_API
+struct _user_data_t
+{
+  bool is_open;
+  unsigned path_len;
+  hb_position_t path_start_x;
+  hb_position_t path_start_y;
+  hb_position_t path_last_x;
+  hb_position_t path_last_y;
+};
+
+static void
+_move_to (hb_position_t to_x, hb_position_t to_y, void *user_data_)
+{
+  _user_data_t *user_data = (_user_data_t *) user_data_;
+  assert (!user_data->is_open);
+  user_data->is_open = true;
+  user_data->path_start_x = user_data->path_last_x = to_x;
+  user_data->path_start_y = user_data->path_last_y = to_y;
+}
+
+static void
+_line_to (hb_position_t to_x, hb_position_t to_y, void *user_data_)
+{
+  _user_data_t *user_data = (_user_data_t *) user_data_;
+  assert (user_data->is_open);
+  assert (user_data->path_last_x != to_x || user_data->path_last_y != to_y);
+  ++user_data->path_len;
+  user_data->path_last_x = to_x;
+  user_data->path_last_y = to_y;
+}
+
+static void
+_quadratic_to (hb_position_t control_x, hb_position_t control_y,
+              hb_position_t to_x, hb_position_t to_y, void *user_data_)
+{
+  _user_data_t *user_data = (_user_data_t *) user_data_;
+  assert (user_data->is_open);
+  assert (user_data->path_last_x != control_x || user_data->path_last_y != control_y ||
+         user_data->path_last_x != to_x || user_data->path_last_y != to_y);
+  ++user_data->path_len;
+  user_data->path_last_x = to_x;
+  user_data->path_last_y = to_y;
+}
+
+static void
+_cubic_to (hb_position_t control1_x, hb_position_t control1_y,
+          hb_position_t control2_x, hb_position_t control2_y,
+          hb_position_t to_x, hb_position_t to_y, void *user_data_)
+{
+  _user_data_t *user_data = (_user_data_t *) user_data_;
+  assert (user_data->is_open);
+  assert (user_data->path_last_x != control1_x || user_data->path_last_y != control1_y ||
+         user_data->path_last_x != control2_x || user_data->path_last_y != control2_y ||
+         user_data->path_last_x != to_x || user_data->path_last_y != to_y);
+  ++user_data->path_len;
+  user_data->path_last_x = to_x;
+  user_data->path_last_y = to_y;
+}
+
+static void
+_close_path (void *user_data_)
+{
+  _user_data_t *user_data = (_user_data_t *) user_data_;
+  assert (user_data->is_open && user_data->path_len != 0);
+  user_data->path_len = 0;
+  user_data->is_open = false;
+  assert (user_data->path_start_x == user_data->path_last_x &&
+         user_data->path_start_y == user_data->path_last_y);
+}
+#endif
+
+/* Similar to test-ot-face.c's #test_font() */
+static void misc_calls_for_gid (hb_face_t *face, hb_font_t *font, hb_set_t *set, hb_codepoint_t cp)
+{
+  /* Other gid specific misc calls */
+  hb_face_collect_variation_unicodes (face, cp, set);
+
+  hb_codepoint_t g;
+  hb_font_get_nominal_glyph (font, cp, &g);
+  hb_font_get_variation_glyph (font, cp, cp, &g);
+  hb_font_get_glyph_h_advance (font, cp);
+  hb_font_get_glyph_v_advance (font, cp);
+  hb_position_t x, y;
+  hb_font_get_glyph_h_origin (font, cp, &x, &y);
+  hb_font_get_glyph_v_origin (font, cp, &x, &y);
+  hb_font_get_glyph_contour_point (font, cp, 0, &x, &y);
+  char buf[64];
+  hb_font_get_glyph_name (font, cp, buf, sizeof (buf));
+
+  hb_ot_color_palette_get_name_id (face, cp);
+  hb_ot_color_palette_color_get_name_id (face, cp);
+  hb_ot_color_palette_get_flags (face, cp);
+  hb_ot_color_palette_get_colors (face, cp, 0, nullptr, nullptr);
+  hb_ot_color_glyph_get_layers (face, cp, 0, nullptr, nullptr);
+  hb_blob_destroy (hb_ot_color_glyph_reference_svg (face, cp));
+  hb_blob_destroy (hb_ot_color_glyph_reference_png (font, cp));
+
+  hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR, cp, 0, nullptr, nullptr);
+
+  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_variants (font, cp, HB_DIRECTION_TTB, 0, nullptr, nullptr);
+  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)
+{
+  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);
+  hb_font_t *font = hb_font_create (face);
+
+  unsigned num_coords = 0;
+  if (size) num_coords = data[size - 1];
+  num_coords = hb_ot_var_get_axis_count (face) > num_coords ? num_coords : hb_ot_var_get_axis_count (face);
+  int *coords = (int *) calloc (num_coords, sizeof (int));
+  if (size > num_coords + 1)
+    for (unsigned i = 0; i < num_coords; ++i)
+      coords[i] = ((int) data[size - num_coords + i - 1] - 128) * 10;
+  hb_font_set_var_coords_normalized (font, coords, num_coords);
+  free (coords);
+
+  unsigned glyph_count = hb_face_get_glyph_count (face);
+  glyph_count = glyph_count > 16 ? 16 : glyph_count;
+
+#ifdef HB_EXPERIMENTAL_API
+  _user_data_t user_data = {false, 0, 0, 0, 0, 0};
+
+  hb_draw_funcs_t *funcs = hb_draw_funcs_create ();
+  hb_draw_funcs_set_move_to_func (funcs, (hb_draw_move_to_func_t) _move_to);
+  hb_draw_funcs_set_line_to_func (funcs, (hb_draw_line_to_func_t) _line_to);
+  hb_draw_funcs_set_quadratic_to_func (funcs, (hb_draw_quadratic_to_func_t) _quadratic_to);
+  hb_draw_funcs_set_cubic_to_func (funcs, (hb_draw_cubic_to_func_t) _cubic_to);
+  hb_draw_funcs_set_close_path_func (funcs, (hb_draw_close_path_func_t) _close_path);
+#endif
+  volatile unsigned counter = !glyph_count;
+  hb_set_t *set = hb_set_create ();
+  for (unsigned gid = 0; gid < glyph_count; ++gid)
+  {
+#ifdef HB_EXPERIMENTAL_API
+    hb_font_draw_glyph (font, gid, funcs, &user_data);
+    assert (!user_data.is_open);
+#endif
+
+    /* Glyph extents also may practices the similar path, call it now that is related */
+    hb_glyph_extents_t extents;
+    if (hb_font_get_glyph_extents (font, gid, &extents))
+      counter += !!extents.width + !!extents.height + !!extents.x_bearing + !!extents.y_bearing;
+
+    if (!counter) counter += 1;
+
+    /* other misc calls */
+    misc_calls_for_gid (face, font, set, gid);
+  }
+  hb_set_destroy (set);
+  assert (counter);
+#ifdef HB_EXPERIMENTAL_API
+  hb_draw_funcs_destroy (funcs);
+#endif
+
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+  hb_blob_destroy (blob);
+  return 0;
+}
diff --git a/test/fuzzing/hb-set-fuzzer.cc b/test/fuzzing/hb-set-fuzzer.cc
new file mode 100644 (file)
index 0000000..d5e5d0e
--- /dev/null
@@ -0,0 +1,76 @@
+#include "hb-fuzzer.hh"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#include "hb.h"
+
+enum set_operation_t : uint8_t
+{
+  INTERSECT = 0,
+  UNION = 1,
+  SUBTRACT = 2,
+  SYMMETRIC_DIFFERENCE = 3
+};
+
+struct instructions_t
+{
+  set_operation_t operation;
+  uint32_t first_set_size;
+};
+
+static hb_set_t *create_set (const uint32_t *value_array, int count)
+{
+  hb_set_t *set = hb_set_create ();
+  for (int i = 0; i < count; i++)
+    hb_set_add (set, value_array[i]);
+  return set;
+}
+
+
+extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size)
+{
+  if (size < sizeof (instructions_t))
+    return 0;
+
+  const instructions_t &instructions = reinterpret_cast<const instructions_t &> (data);
+  data += sizeof (instructions_t);
+  size -= sizeof (instructions_t);
+
+  const uint32_t *values = reinterpret_cast<const uint32_t *> (data);
+  size = size / sizeof (uint32_t);
+
+  if (size < instructions.first_set_size)
+    return 0;
+
+  hb_set_t *set_a = create_set (values, instructions.first_set_size);
+
+  values += instructions.first_set_size;
+  size -= instructions.first_set_size;
+  hb_set_t *set_b = create_set (values, size);
+
+  switch (instructions.operation)
+  {
+  case INTERSECT:
+    hb_set_intersect (set_a, set_b);
+    break;
+  case UNION:
+    hb_set_union (set_a, set_b);
+    break;
+  case SUBTRACT:
+    hb_set_subtract (set_a, set_b);
+    break;
+  case SYMMETRIC_DIFFERENCE:
+    hb_set_symmetric_difference (set_a, set_b);
+    break;
+  default:
+    break;
+  }
+
+  hb_set_destroy (set_a);
+  hb_set_destroy (set_b);
+
+  return 0;
+}
index 64a6b12..eb03132 100644 (file)
@@ -3,6 +3,8 @@
 #include <hb-ot.h>
 #include <string.h>
 
+#include <stdlib.h>
+
 #define TEST_OT_FACE_NO_MAIN 1
 #include "../api/test-ot-face.c"
 #undef TEST_OT_FACE_NO_MAIN
@@ -16,6 +18,16 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
   hb_ot_font_set_funcs (font);
   hb_font_set_scale (font, 12, 12);
 
+  unsigned num_coords = 0;
+  if (size) num_coords = data[size - 1];
+  num_coords = hb_ot_var_get_axis_count (face) > num_coords ? num_coords : hb_ot_var_get_axis_count (face);
+  int *coords = (int *) calloc (num_coords, sizeof (int));
+  if (size > num_coords + 1)
+    for (unsigned i = 0; i < num_coords; ++i)
+      coords[i] = ((int) data[size - num_coords + i - 1] - 128) * 10;
+  hb_font_set_var_coords_normalized (font, coords, num_coords);
+  free (coords);
+
   {
     const char text[] = "ABCDEXYZ123@_%&)*$!";
     hb_buffer_t *buffer = hb_buffer_create ();
@@ -29,7 +41,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
   unsigned int len = sizeof (text32);
   if (size < len)
     len = size;
-  memcpy(text32, data + size - len, len);
+  if (len)
+    memcpy(text32, data + size - len, len);
 
   hb_buffer_t *buffer = hb_buffer_create ();
   hb_buffer_add_utf32 (buffer, text32, sizeof (text32) / sizeof (text32[0]), 0, -1);
@@ -37,8 +50,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
   hb_shape (font, buffer, nullptr, 0);
   hb_buffer_destroy (buffer);
 
-  /* Misc calls on face. */
-  test_face (face, text32[15]);
+  /* Misc calls on font. */
+  test_font (font, text32[15]);
 
   hb_font_destroy (font);
   hb_face_destroy (face);
index 5318f64..9e892eb 100644 (file)
@@ -1,28 +1,20 @@
 #include "hb-fuzzer.hh"
 
 #include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
 
 int main (int argc, char **argv)
 {
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
-
-  unsigned int len;
-  const char *font_data = hb_blob_get_data (blob, &len);
-  if (len == 0)
-  {
-    printf ("Font not found.\n");
-    exit (1);
-  }
-
   for (int i = 1; i < argc; i++)
   {
-    printf ("%s\n", argv[i]);
-    LLVMFuzzerTestOneInput ((const uint8_t *) font_data, len);
-  }
+    hb_blob_t *blob = hb_blob_create_from_file (argv[i]);
+
+    unsigned int len;
+    const char *font_data = hb_blob_get_data (blob, &len);
+    printf ("%s%s\n", argv[i], len ? "" : " (note: not found or was empty)");
 
-  hb_blob_destroy (blob);
+    LLVMFuzzerTestOneInput ((const uint8_t *) font_data, len);
 
+    hb_blob_destroy (blob);
+  }
   return 0;
 }
diff --git a/test/fuzzing/meson.build b/test/fuzzing/meson.build
new file mode 100644 (file)
index 0000000..712b97d
--- /dev/null
@@ -0,0 +1,54 @@
+tests = [
+  'hb-shape-fuzzer.cc',
+  'hb-subset-fuzzer.cc',
+  'hb-set-fuzzer.cc',
+  'hb-draw-fuzzer.cc',
+]
+
+foreach file_name : tests
+  test_name = file_name.split('.')[0].underscorify()
+
+  exe = executable(test_name, [file_name, 'main.cc'],
+    cpp_args: cpp_args,
+    include_directories: [incconfig, incsrc],
+    dependencies: deps,
+    link_with: [libharfbuzz, libharfbuzz_subset],
+    install: false,
+  )
+  set_variable('@0@_exe'.format(test_name.underscorify()), exe)
+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,
+  ],
+  depends: [hb_shape_fuzzer_exe, libharfbuzz, libharfbuzz_subset],
+  workdir: meson.current_build_dir() / '..' / '..',
+  env: env,
+  suite: ['fuzzing'],
+)
+
+test('subset_fuzzer', find_program('run-subset-fuzzer-tests.py'),
+  args: [
+    hb_subset_fuzzer_exe,
+  ],
+  # as the tests are ran concurrently let's raise acceptable time here
+  # ideally better to break and let meson handles them in parallel
+  timeout: 300,
+  workdir: meson.current_build_dir() / '..' / '..',
+  env: env,
+  suite: ['fuzzing'],
+)
+
+test('draw_fuzzer', find_program('run-draw-fuzzer-tests.py'),
+  args: [
+    hb_draw_fuzzer_exe,
+  ],
+  workdir: meson.current_build_dir() / '..' / '..',
+  env: env,
+  suite: ['fuzzing'],
+)
diff --git a/test/fuzzing/run-draw-fuzzer-tests.py b/test/fuzzing/run-draw-fuzzer-tests.py
new file mode 100755 (executable)
index 0000000..7f40cf8
--- /dev/null
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+
+import sys, os, subprocess, tempfile, shutil
+
+
+def cmd (command):
+       # https://stackoverflow.com/a/4408409 as we might have huge output sometimes
+       with tempfile.TemporaryFile () as tempf:
+               p = subprocess.Popen (command, stderr=tempf)
+
+               try:
+                       p.wait (timeout=int (os.environ.get ("HB_TEST_SHAPE_FUZZER_TIMEOUT", "2")))
+                       tempf.seek (0)
+                       text = tempf.read ()
+
+                       #TODO: Detect debug mode with a better way
+                       is_debug_mode = b"SANITIZE" in text
+
+                       return ("" if is_debug_mode else text.decode ("utf-8").strip ()), p.returncode
+               except subprocess.TimeoutExpired:
+                       return 'error: timeout, ' + ' '.join (command), 1
+
+
+srcdir = os.environ.get ("srcdir", ".")
+EXEEXT = os.environ.get ("EXEEXT", "")
+top_builddir = os.environ.get ("top_builddir", ".")
+hb_draw_fuzzer = os.path.join (top_builddir, "hb-draw-fuzzer" + EXEEXT)
+
+if not os.path.exists (hb_draw_fuzzer):
+       if len (sys.argv) == 1 or not os.path.exists (sys.argv[1]):
+               sys.exit ("""Failed to find hb-draw-fuzzer binary automatically,
+please provide it as the first argument to the tool""")
+
+       hb_draw_fuzzer = sys.argv[1]
+
+print ('hb_draw_fuzzer:', hb_draw_fuzzer)
+fails = 0
+
+libtool = os.environ.get ('LIBTOOL')
+valgrind = None
+if os.environ.get ('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):
+       if "draw" not in file: continue
+       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])
+       else:
+               text, returncode = cmd ([hb_draw_fuzzer, path])
+               if 'error' in text:
+                       returncode = 1
+
+       if (not valgrind or returncode) and text.strip ():
+               print (text)
+
+       if returncode != 0:
+               print ('failure on %s' % file)
+               fails = fails + 1
+
+
+if fails:
+       sys.exit ("%d draw fuzzer related tests failed." % fails)
index 94fc877..7e2ef22 100755 (executable)
@@ -1,60 +1,24 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
-from __future__ import print_function, division, absolute_import
-
-import sys, os, subprocess, tempfile, threading
-
-
-def which (program):
-       # https://stackoverflow.com/a/377028
-       def is_exe (fpath):
-               return os.path.isfile (fpath) and os.access (fpath, os.X_OK)
-
-       fpath, _ = os.path.split (program)
-       if fpath:
-               if is_exe (program):
-                       return program
-       else:
-               for path in os.environ["PATH"].split (os.pathsep):
-                       exe_file = os.path.join (path, program)
-                       if is_exe (exe_file):
-                               return exe_file
-
-       return None
+import sys, os, subprocess, tempfile, shutil
 
 
 def cmd (command):
-       # https://stackoverflow.com/a/4408409
-       # https://stackoverflow.com/a/10012262
+       # https://stackoverflow.com/a/4408409 as we might have huge output sometimes
        with tempfile.TemporaryFile () as tempf:
                p = subprocess.Popen (command, stderr=tempf)
-               is_killed = {'value': False}
-
-               def timeout (p, is_killed):
-                       is_killed['value'] = True
-                       p.kill ()
-               timeout_seconds = int (os.environ.get ("HB_TEST_SHAPE_FUZZER_TIMEOUT", "2"))
-               timer = threading.Timer (timeout_seconds, timeout, [p, is_killed])
 
                try:
-                       timer.start()
-                       p.wait ()
+                       p.wait (timeout=int (os.environ.get ("HB_TEST_SHAPE_FUZZER_TIMEOUT", "2")))
                        tempf.seek (0)
                        text = tempf.read ()
 
                        #TODO: Detect debug mode with a better way
                        is_debug_mode = b"SANITIZE" in text
 
-                       text = "" if is_debug_mode else text.decode ("utf-8").strip ()
-                       returncode = p.returncode
-               finally:
-                       timer.cancel()
-
-               if is_killed['value']:
-                       text = 'error: timeout, ' + text
-                       returncode = 1
-
-               return text, returncode
+                       return ("" if is_debug_mode else text.decode ("utf-8").strip ()), p.returncode
+               except subprocess.TimeoutExpired:
+                       return 'error: timeout, ' + ' '.join (command), 1
 
 
 srcdir = os.environ.get ("srcdir", ".")
@@ -64,9 +28,8 @@ hb_shape_fuzzer = os.path.join (top_builddir, "hb-shape-fuzzer" + EXEEXT)
 
 if not os.path.exists (hb_shape_fuzzer):
        if len (sys.argv) == 1 or not os.path.exists (sys.argv[1]):
-               print ("""Failed to find hb-shape-fuzzer binary automatically,
+               sys.exit ("""Failed to find hb-shape-fuzzer binary automatically,
 please provide it as the first argument to the tool""")
-               sys.exit (1)
 
        hb_shape_fuzzer = sys.argv[1]
 
@@ -76,10 +39,9 @@ fails = 0
 libtool = os.environ.get ('LIBTOOL')
 valgrind = None
 if os.environ.get ('RUN_VALGRIND', ''):
-       valgrind = which ('valgrind')
+       valgrind = shutil.which ('valgrind')
        if valgrind is None:
-               print ("""Valgrind requested but not found.""")
-               sys.exit (1)
+               sys.exit ("""Valgrind requested but not found.""")
        if libtool is None:
                print ("""Valgrind support is currently autotools only and needs libtool but not found.""")
 
@@ -104,5 +66,4 @@ for file in os.listdir (parent_path):
 
 
 if fails:
-       print ("%i shape fuzzer related tests failed." % fails)
-       sys.exit (1)
+       sys.exit ("%d shape fuzzer related tests failed." % fails)
index f290e6e..5fd547d 100755 (executable)
@@ -1,60 +1,24 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
-from __future__ import print_function, division, absolute_import
+import sys, os, subprocess, tempfile, shutil
 
-import sys, os, subprocess, tempfile, threading
 
-
-def which(program):
-       # https://stackoverflow.com/a/377028
-       def is_exe(fpath):
-               return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
-
-       fpath, _ = os.path.split(program)
-       if fpath:
-               if is_exe(program):
-                       return program
-       else:
-               for path in os.environ["PATH"].split(os.pathsep):
-                       exe_file = os.path.join(path, program)
-                       if is_exe(exe_file):
-                               return exe_file
-
-       return None
-
-
-def cmd(command):
-       # https://stackoverflow.com/a/4408409
-       # https://stackoverflow.com/a/10012262
-       with tempfile.TemporaryFile() as tempf:
+def cmd (command):
+       # https://stackoverflow.com/a/4408409 as we might have huge output sometimes
+       with tempfile.TemporaryFile () as tempf:
                p = subprocess.Popen (command, stderr=tempf)
-               is_killed = {'value': False}
-
-               def timeout(p, is_killed):
-                       is_killed['value'] = True
-                       p.kill()
-               timeout_seconds = int (os.environ.get ("HB_TEST_SUBSET_FUZZER_TIMEOUT", "8"))
-               timer = threading.Timer (timeout_seconds, timeout, [p, is_killed])
 
                try:
-                       timer.start()
-                       p.wait ()
+                       p.wait (timeout=int (os.environ.get ("HB_TEST_SUBSET_FUZZER_TIMEOUT", "12")))
                        tempf.seek (0)
                        text = tempf.read ()
 
                        #TODO: Detect debug mode with a better way
                        is_debug_mode = b"SANITIZE" in text
 
-                       text = "" if is_debug_mode else text.decode ("utf-8").strip ()
-                       returncode = p.returncode
-               finally:
-                       timer.cancel()
-
-               if is_killed['value']:
-                       text = 'error: timeout, ' + text
-                       returncode = 1
-
-               return text, returncode
+                       return ("" if is_debug_mode else text.decode ("utf-8").strip ()), p.returncode
+               except subprocess.TimeoutExpired:
+                       return 'error: timeout, ' + ' '.join (command), 1
 
 
 srcdir = os.environ.get ("srcdir", ".")
@@ -64,9 +28,8 @@ hb_subset_fuzzer = os.path.join (top_builddir, "hb-subset-fuzzer" + EXEEXT)
 
 if not os.path.exists (hb_subset_fuzzer):
         if len (sys.argv) < 2 or not os.path.exists (sys.argv[1]):
-                print ("""Failed to find hb-subset-fuzzer binary automatically,
+                sys.exit ("""Failed to find hb-subset-fuzzer binary automatically,
 please provide it as the first argument to the tool""")
-                sys.exit (1)
 
         hb_subset_fuzzer = sys.argv[1]
 
@@ -76,10 +39,9 @@ fails = 0
 libtool = os.environ.get('LIBTOOL')
 valgrind = None
 if os.environ.get('RUN_VALGRIND', ''):
-       valgrind = which ('valgrind')
+       valgrind = shutil.which ('valgrind')
        if valgrind is None:
-               print ("""Valgrind requested but not found.""")
-               sys.exit (1)
+               sys.exit ("""Valgrind requested but not found.""")
        if libtool is None:
                print ("""Valgrind support is currently autotools only and needs libtool but not found.""")
 
@@ -111,5 +73,4 @@ run_dir (os.path.join (srcdir, "..", "subset", "data", "fonts"))
 run_dir (os.path.join (srcdir, "fonts"))
 
 if fails:
-        print ("%i subset fuzzer related tests failed." % fails)
-        sys.exit (1)
+       sys.exit ("%d subset fuzzer related tests failed." % fails)
diff --git a/test/meson.build b/test/meson.build
new file mode 100644 (file)
index 0000000..c3a2002
--- /dev/null
@@ -0,0 +1,4 @@
+subdir('api')
+subdir('fuzzing')
+subdir('shaping')
+subdir('subset')
diff --git a/test/shaping/CMakeLists.txt b/test/shaping/CMakeLists.txt
deleted file mode 100644 (file)
index 8e33ede..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-if (HB_BUILD_UTILS)
-  file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/in-house/Makefile.sources" INHOUSE)
-  extract_make_variable (TESTS ${INHOUSE})
-  foreach (test IN ITEMS ${TESTS})
-    add_test (NAME ${test}
-      COMMAND "${PYTHON_EXECUTABLE}" run-tests.py $<TARGET_FILE:hb-shape> "data/in-house/${test}"
-      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-    set_property (TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
-  endforeach ()
-
-  file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/aots/Makefile.sources" INHOUSE)
-  extract_make_variable (TESTS ${INHOUSE})
-  foreach (test IN ITEMS ${TESTS})
-    add_test (NAME ${test}
-      COMMAND "${PYTHON_EXECUTABLE}" run-tests.py $<TARGET_FILE:hb-shape> "data/aots/${test}"
-      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-    set_property (TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
-  endforeach ()
-
-  file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/text-rendering-tests/Makefile.sources" TEXTRENDERING)
-  extract_make_variable (TESTS ${TEXTRENDERING})
-  foreach (test IN ITEMS ${TESTS})
-    add_test (NAME ${test}
-      COMMAND "${PYTHON_EXECUTABLE}" run-tests.py $<TARGET_FILE:hb-shape> "data/text-rendering-tests/${test}"
-      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-    set_property (TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
-  endforeach ()
-endif ()
index 66272da..316b173 100644 (file)
@@ -15,7 +15,7 @@ libs:
 
 EXTRA_DIST += \
        README.md \
-       CMakeLists.txt \
+       meson.build \
        hb-diff \
        hb-diff-colorize \
        hb-diff-filter-failures \
index fb952e1..07e2bd5 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -321,6 +321,8 @@ 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@
@@ -379,7 +381,7 @@ top_srcdir = @top_srcdir@
 NULL = 
 
 # TODO Figure out Python stuff
-EXTRA_DIST = README.md CMakeLists.txt hb-diff hb-diff-colorize \
+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)
index 8a1562c..baad3cc 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -321,6 +321,8 @@ 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@
index 3b1faee..a2a009b 100644 (file)
@@ -9,29 +9,13 @@ 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)
 
-init-aots:
-       git clone https://github.com/adobe-type-tools/aots $(srcdir)/aots
-       make -C$(srcdir)/aots
-       make -C$(srcdir)/aots/harfbuzz
-       touch $(srcdir)/init-aots
-
-update-tests: init-aots lib
-       cp $(srcdir)/hb-aots-tester.cpp $(srcdir)/aots/harfbuzz/hb-aots-tester.cpp
-       $(CXX) -Wno-narrowing $(srcdir)/aots/harfbuzz/hb-aots-tester.cpp \
-               -I$(top_srcdir)/src/ -o $(srcdir)/aots/harfbuzz/aots \
-               -L$(top_builddir)/src/.libs -lharfbuzz
-       rm -rf $(srcdir)/tests/
-       mkdir $(srcdir)/tests/
-       export LD_LIBRARY_PATH=$(realpath $(top_builddir)/src/.libs); cd $(srcdir)/aots/harfbuzz; ./aots
-
-.PHONY: update-tests
-
 include Makefile.sources
 
 -include $(top_srcdir)/git.mk
index 3b0ab1f..3acea22 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -565,6 +565,8 @@ 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@
@@ -624,6 +626,7 @@ NULL =
 EXTRA_DIST = \
        COPYING \
        fonts \
+       update.py \
        $(TESTS) \
        $(NULL)
 
@@ -994,23 +997,6 @@ uninstall-am:
 lib:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
 
-init-aots:
-       git clone https://github.com/adobe-type-tools/aots $(srcdir)/aots
-       make -C$(srcdir)/aots
-       make -C$(srcdir)/aots/harfbuzz
-       touch $(srcdir)/init-aots
-
-update-tests: init-aots lib
-       cp $(srcdir)/hb-aots-tester.cpp $(srcdir)/aots/harfbuzz/hb-aots-tester.cpp
-       $(CXX) -Wno-narrowing $(srcdir)/aots/harfbuzz/hb-aots-tester.cpp \
-               -I$(top_srcdir)/src/ -o $(srcdir)/aots/harfbuzz/aots \
-               -L$(top_builddir)/src/.libs -lharfbuzz
-       rm -rf $(srcdir)/tests/
-       mkdir $(srcdir)/tests/
-       export LD_LIBRARY_PATH=$(realpath $(top_builddir)/src/.libs); cd $(srcdir)/aots/harfbuzz; ./aots
-
-.PHONY: update-tests
-
 -include $(top_srcdir)/git.mk
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/test/shaping/data/aots/update.py b/test/shaping/data/aots/update.py
new file mode 100755 (executable)
index 0000000..8446df7
--- /dev/null
@@ -0,0 +1,29 @@
+#!/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)
index 86d887e..a58d36d 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -113,8 +113,9 @@ TESTS = tests/aat-trak.tests tests/aat-morx.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/spaces.tests tests/simple.tests \
-       tests/sinhala.tests tests/tibetan-contractions-1.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 \
@@ -495,6 +496,8 @@ 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@
index bf14a98..3c1b48e 100644 (file)
@@ -43,6 +43,7 @@ TESTS = \
        tests/none-directional.tests \
        tests/positioning-features.tests \
        tests/rand.tests \
+       tests/rotation.tests \
        tests/spaces.tests \
        tests/simple.tests \
        tests/sinhala.tests \
diff --git a/test/shaping/data/in-house/fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf b/test/shaping/data/in-house/fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf
new file mode 100644 (file)
index 0000000..952d40a
Binary files /dev/null and b/test/shaping/data/in-house/fonts/2681c1c72d6484ed3410417f521b1b819b4e2392.ttf differ
index 80e392c..455742d 100644 (file)
@@ -1,6 +1,6 @@
 ../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=4+0|uni17ca=4+0|uni17b8=4@0,300+0|space=7+600]
 ../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+17CA,U+17B8:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|uni17bb=1@-75,-700+0|uni17b8=1+0]
-../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200C,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=2+0|uni093F.750=3+397|uni092F=3+924]
-../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924]
-../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200C,U+091F,U+094D,U+200D,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=3+876|uni094D=3@4,0+0|space=5+0|uni093F=6+398|uni091F=6+876|uni094D=6@4,0+0|space=6+0|uni092F=6+924]
-../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924]
+../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]
index 434e0a5..daa4497 100644 (file)
@@ -8,14 +8,28 @@
 /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@-252,120+-252|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647]
+/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+05E1,U+05B0:[shevahebrew=0@51,0+0|samekhhebrew=0+1361]
 /Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0054,U+0068,U+0020,U+0074,U+0068,U+0020,U+006C,U+006C,U+0020,U+0074,U+0065,U+0020,U+0074,U+006F,U+0020,U+0074,U+0072,U+0020,U+0066,U+0072,U+0020,U+0066,U+0075,U+0020,U+0066,U+006A:[T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098]
 /Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[T=0+1497|e=1@-62,0+699|space=2+569|A=3+1431|V=4@-37,0+1377|space=5+569|T=6+1510|r=7@-50,0+803|space=8+569|V=9+1376|a=10@-37,0+1014|space=11+569|r=12+853|T=13+1560|space=14+569|e=15+761|T=16+1560|space=17+569|T=18+1515|d=19@-45,0+1006]
-/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0627,U+0644,U+0623,U+064E,U+0628,U+0652,U+062C,U+064E,U+062F,U+0650,U+064A,U+064E,U+0651,U+0629,U+0640,U+0627,U+0644,U+0639,U+064E,U+0631,U+064E,U+0628,U+0650,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=26+713|u064e_u0651.shaddaFatha=23@0,-200+0|u064a.medial.yeh=23+656|u0650.kasra=21@80,290+80|u0628.initial.beh=21@-80,0+576|u064e.fatha=19@200,-570+200|u0631.final.reh=19@-200,0+702|u064e.fatha=17@200,-200+200|u0639.medial.ain=17@-200,0+738|u0644.initial.lam=16+515|u0627.final.alef=15+647|u0640.tatweel=14+449|u0629.final.tehMarbuta=13+713|u064e_u0651.shaddaFatha=10@0,-200+0|u064a.initial.yeh=10+656|u0650.kasra=8@80,570+80|u062f.final.dal=8@-80,0+822|u064e.fatha=6@290,-160+290|u062c.medial.jeem=6@-290,0+1069|u0652.sukun=4@0,-200+0|u0628.initial.beh=4+656|u064e.fatha=1@-252,120+-252|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647]
+/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+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+05E1,U+05B0:[shevahebrew=0@51,0+0|samekhhebrew=0+1361]
 /Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0054,U+0068,U+0020,U+0074,U+0068,U+0020,U+006C,U+006C,U+0020,U+0074,U+0065,U+0020,U+0074,U+006F,U+0020,U+0074,U+0072,U+0020,U+0066,U+0072,U+0020,U+0066,U+0075,U+0020,U+0066,U+006A:[T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098]
 /Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[T=0+1497|e=1@-62,0+699|space=2+569|A=3+1431|V=4@-37,0+1377|space=5+569|T=6+1510|r=7@-50,0+803|space=8+569|V=9+1376|a=10@-37,0+1014|space=11+569|r=12+853|T=13+1560|space=14+569|e=15+761|T=16+1560|space=17+569|T=18+1515|d=19@-45,0+1006]
-/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0627,U+0644,U+0623,U+064E,U+0628,U+0652,U+062C,U+064E,U+062F,U+0650,U+064A,U+064E,U+0651,U+0629,U+0640,U+0627,U+0644,U+0639,U+064E,U+0631,U+064E,U+0628,U+0650,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=26+713|u064e_u0651.shaddaFatha=23@0,-200+0|u064a.medial.yeh=23+656|u0650.kasra=21@80,290+80|u0628.initial.beh=21@-80,0+576|u064e.fatha=19@200,-570+200|u0631.final.reh=19@-200,0+702|u064e.fatha=17@200,-200+200|u0639.medial.ain=17@-200,0+738|u0644.initial.lam=16+515|u0627.final.alef=15+647|u0640.tatweel=14+449|u0629.final.tehMarbuta=13+713|u064e_u0651.shaddaFatha=10@0,-200+0|u064a.initial.yeh=10+656|u0650.kasra=8@80,570+80|u062f.final.dal=8@-80,0+822|u064e.fatha=6@290,-160+290|u062c.medial.jeem=6@-290,0+1069|u0652.sukun=4@0,-200+0|u0628.initial.beh=4+656|u064e.fatha=1@-252,120+-252|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647]
+/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+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/rotation.tests b/test/shaping/data/in-house/tests/rotation.tests
new file mode 100644 (file)
index 0000000..6ecad26
--- /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]
index dd2a3a2..7631c3b 100644 (file)
@@ -7,7 +7,7 @@
 ../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:--font-funcs=ft: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/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]
diff --git a/test/shaping/data/text-rendering-tests/DISABLED b/test/shaping/data/text-rendering-tests/DISABLED
new file mode 100644 (file)
index 0000000..2728522
--- /dev/null
@@ -0,0 +1,21 @@
+# Non-Unicode cmap
+tests/CMAP-3.tests
+
+# Rounding differences
+tests/SHARAN-1.tests
+tests/SHBALI-1.tests
+tests/SHBALI-2.tests
+tests/SHKNDA-2.tests
+tests/SHKNDA-3.tests
+
+# TODO: Needs investigation
+tests/SHLANA-1.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
+tests/SHLANA-10.tests
index cad0358..17d7ba5 100644 (file)
@@ -12,8 +12,9 @@ update:
 EXTRA_DIST = \
        README \
        COPYING \
-       update.sh \
-       extract-tests.py \
+       DISABLED \
+       update.py \
+       meson.build \
        fonts \
        $(TESTS) \
        $(NULL)
index 9f4c011..bebe203 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -89,8 +89,8 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-TESTS = tests/AVAR-1.tests tests/CFF-1.tests tests/CFF2-1.tests \
-       tests/CFF-2.tests tests/CMAP-1.tests tests/CMAP-2.tests \
+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 \
@@ -99,21 +99,21 @@ TESTS = tests/AVAR-1.tests tests/CFF-1.tests tests/CFF2-1.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-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-1.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-2.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-3.tests tests/MORX-40.tests \
-       tests/MORX-41.tests tests/MORX-4.tests tests/MORX-5.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/SHBALI-3.tests tests/SHKNDA-1.tests \
-       $(am__EXEEXT_1)
+       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 \
@@ -489,6 +489,8 @@ 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@
@@ -548,8 +550,9 @@ NULL =
 EXTRA_DIST = \
        README \
        COPYING \
-       update.sh \
-       extract-tests.py \
+       DISABLED \
+       update.py \
+       meson.build \
        fonts \
        $(TESTS) \
        $(NULL)
@@ -558,13 +561,21 @@ TEST_EXTENSIONS = .tests
 TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
 DISBALED_TESTS = \
        tests/CMAP-3.tests \
-       tests/MORX-31.tests \
-       tests/MORX-41.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
index ccbbb37..78d48eb 100644 (file)
@@ -1,8 +1,8 @@
 TESTS = \
        tests/AVAR-1.tests \
        tests/CFF-1.tests \
-       tests/CFF2-1.tests \
        tests/CFF-2.tests \
+       tests/CFF2-1.tests \
        tests/CMAP-1.tests \
        tests/CMAP-2.tests \
        tests/CVAR-1.tests \
@@ -29,6 +29,7 @@ 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 \
@@ -38,7 +39,7 @@ TESTS = \
        tests/MORX-17.tests \
        tests/MORX-18.tests \
        tests/MORX-19.tests \
-       tests/MORX-1.tests \
+       tests/MORX-2.tests \
        tests/MORX-20.tests \
        tests/MORX-21.tests \
        tests/MORX-22.tests \
@@ -49,7 +50,7 @@ TESTS = \
        tests/MORX-27.tests \
        tests/MORX-28.tests \
        tests/MORX-29.tests \
-       tests/MORX-2.tests \
+       tests/MORX-3.tests \
        tests/MORX-30.tests \
        tests/MORX-31.tests \
        tests/MORX-32.tests \
@@ -60,26 +61,35 @@ TESTS = \
        tests/MORX-37.tests \
        tests/MORX-38.tests \
        tests/MORX-39.tests \
-       tests/MORX-3.tests \
+       tests/MORX-4.tests \
        tests/MORX-40.tests \
        tests/MORX-41.tests \
-       tests/MORX-4.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 \
        $(NULL)
 
 DISBALED_TESTS = \
        tests/CMAP-3.tests \
-       tests/MORX-31.tests \
-       tests/MORX-41.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)
diff --git a/test/shaping/data/text-rendering-tests/extract-tests.py b/test/shaping/data/text-rendering-tests/extract-tests.py
deleted file mode 100755 (executable)
index f1722b5..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env python
-
-from __future__ import print_function, division, absolute_import
-
-import sys
-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)+']'
-
-html = ET.fromstring(sys.stdin.read())
-found = False
-
-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
-       print ("../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
-       print ("../fonts/%s:%s:%s:*" % (font, opts, unistr(text)))
-
-sys.exit(0 if found else 1)
index 5df9867..4a16594 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestAVAR.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestAVAR.ttf differ
index da485d9..94b5ba9 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestCMAP14.otf and b/test/shaping/data/text-rendering-tests/fonts/TestCMAP14.otf differ
index 158a77a..1ed3df4 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestGPOSThree.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestGPOSThree.ttf differ
index 76d04eb..55cceb7 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestGPOSTwo.otf and b/test/shaping/data/text-rendering-tests/fonts/TestGPOSTwo.otf differ
index 8fce4ac..ec27e03 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestGSUBThree.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestGSUBThree.ttf differ
index 0ecd326..3dddf69 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestGVARNine.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestGVARNine.ttf differ
index a87395c..07a3c54 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestHVAROne.otf and b/test/shaping/data/text-rendering-tests/fonts/TestHVAROne.otf differ
index 35369d1..d3f7c0c 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestKERNOne.otf and b/test/shaping/data/text-rendering-tests/fonts/TestKERNOne.otf differ
index 9255e99..a53de2e 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf differ
index 91c364f..c6e6343 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXEighteen.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXEighteen.ttf differ
index 92b889c..b7e0f45 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf differ
index 37d0b63..1d348dd 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf differ
index 0028972..07512ab 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXFour.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXFour.ttf differ
index 31c30c0..fb96112 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf differ
index 98ebe33..be18c75 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXFourtyone.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXFourtyone.ttf differ
index 4371df4..edbf4b1 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf differ
index 88b8dec..53d6466 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXOne.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXOne.ttf differ
index 9dd3a84..4fe4fc2 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXSeventeen.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXSeventeen.ttf differ
index e34e1fe..7cbc0eb 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXSixteen.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXSixteen.ttf differ
index 5827ec5..1d43897 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf differ
index f3c6f0f..48f81d1 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf differ
index 29a41d0..0968544 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf differ
index f157063..88d67ef 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf differ
index a70dadc..94d064f 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfour.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfour.ttf differ
index c106ae9..189061a 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf differ
index c64c12c..39455ea 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyone.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyone.ttf differ
index 22057f1..9bdea11 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf differ
index 6676e52..28a522e 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf differ
index 5cab73e..af887d9 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtythree.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtythree.ttf differ
index 07ed76c..e8314c7 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtytwo.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtytwo.ttf differ
index 56984f2..33cc72b 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXThree.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThree.ttf differ
index b1e4bc4..b660833 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwelve.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwelve.ttf differ
index 769e29b..9d7d9ec 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwenty.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwenty.ttf differ
index edabb43..e02d354 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyeight.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyeight.ttf differ
index e3fadf5..88c0866 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfive.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfive.ttf differ
index 271dddb..3706325 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfour.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfour.ttf differ
index 9f015ca..10368bc 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentynine.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentynine.ttf differ
index 4101680..e9e8413 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyone.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyone.ttf differ
index 960b4cf..a459cb3 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyseven.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyseven.ttf differ
index 603b1c6..040fd87 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentysix.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentysix.ttf differ
index df34912..18a90fd 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentythree.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentythree.ttf differ
index 4459e8a..f2b6f6c 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentytwo.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentytwo.ttf differ
index 39f2db5..365a635 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwo.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwo.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestSFNTOne.otf b/test/shaping/data/text-rendering-tests/fonts/TestSFNTOne.otf
new file mode 100644 (file)
index 0000000..974e286
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestSFNTOne.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestSFNTTwo.ttf b/test/shaping/data/text-rendering-tests/fonts/TestSFNTTwo.ttf
new file mode 100644 (file)
index 0000000..a1d62cf
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestSFNTTwo.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestSVGgradientTransform.otf b/test/shaping/data/text-rendering-tests/fonts/TestSVGgradientTransform.otf
new file mode 100644 (file)
index 0000000..59cfc5a
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestSVGgradientTransform.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestSVGgzip.otf b/test/shaping/data/text-rendering-tests/fonts/TestSVGgzip.otf
new file mode 100644 (file)
index 0000000..69d976f
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestSVGgzip.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestSVGmultiGlyphs.otf b/test/shaping/data/text-rendering-tests/fonts/TestSVGmultiGlyphs.otf
new file mode 100644 (file)
index 0000000..50fdc19
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestSVGmultiGlyphs.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestShapeLana.ttf b/test/shaping/data/text-rendering-tests/fonts/TestShapeLana.ttf
new file mode 100644 (file)
index 0000000..f7c3f81
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestShapeLana.ttf differ
index 425bce6..85f1d97 100644 (file)
Binary files a/test/shaping/data/text-rendering-tests/fonts/TestTRAKOne.ttf and b/test/shaping/data/text-rendering-tests/fonts/TestTRAKOne.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/meson.build b/test/shaping/data/text-rendering-tests/meson.build
new file mode 100644 (file)
index 0000000..0d950f5
--- /dev/null
@@ -0,0 +1,95 @@
+text_rendering_tests = [
+  'AVAR-1.tests',
+  'CFF-1.tests',
+  'CFF-2.tests',
+  'CFF2-1.tests',
+  'CMAP-1.tests',
+  'CMAP-2.tests',
+  'CVAR-1.tests',
+  'CVAR-2.tests',
+  'GLYF-1.tests',
+  'GPOS-1.tests',
+  'GPOS-2.tests',
+  'GPOS-3.tests',
+  'GPOS-4.tests',
+  'GPOS-5.tests',
+  'GSUB-1.tests',
+  'GSUB-2.tests',
+  'GSUB-3.tests',
+  'GVAR-1.tests',
+  'GVAR-2.tests',
+  'GVAR-3.tests',
+  'GVAR-4.tests',
+  'GVAR-5.tests',
+  'GVAR-6.tests',
+  'GVAR-7.tests',
+  'GVAR-8.tests',
+  'GVAR-9.tests',
+  'HVAR-1.tests',
+  'HVAR-2.tests',
+  'KERN-1.tests',
+  'KERN-2.tests',
+  'MORX-1.tests',
+  'MORX-10.tests',
+  'MORX-11.tests',
+  'MORX-12.tests',
+  'MORX-13.tests',
+  'MORX-14.tests',
+  'MORX-16.tests',
+  'MORX-17.tests',
+  'MORX-18.tests',
+  'MORX-19.tests',
+  'MORX-2.tests',
+  'MORX-20.tests',
+  'MORX-21.tests',
+  'MORX-22.tests',
+  'MORX-23.tests',
+  'MORX-24.tests',
+  'MORX-25.tests',
+  'MORX-26.tests',
+  'MORX-27.tests',
+  'MORX-28.tests',
+  'MORX-29.tests',
+  'MORX-3.tests',
+  'MORX-30.tests',
+  'MORX-31.tests',
+  'MORX-32.tests',
+  'MORX-33.tests',
+  'MORX-34.tests',
+  'MORX-35.tests',
+  'MORX-36.tests',
+  'MORX-37.tests',
+  'MORX-38.tests',
+  'MORX-39.tests',
+  'MORX-4.tests',
+  'MORX-40.tests',
+  'MORX-41.tests',
+  'MORX-5.tests',
+  'MORX-6.tests',
+  'MORX-7.tests',
+  'MORX-8.tests',
+  'MORX-9.tests',
+  'SFNT-1.tests',
+  'SFNT-2.tests',
+  'SHBALI-3.tests',
+  'SHKNDA-1.tests',
+]
+
+disabled_text_rendering_tests = [
+  'CMAP-3.tests',
+  'SHARAN-1.tests',
+  'SHBALI-1.tests',
+  'SHBALI-2.tests',
+  'SHKNDA-2.tests',
+  'SHKNDA-3.tests',
+  'SHLANA-1.tests',
+  'SHLANA-10.tests',
+  'SHLANA-2.tests',
+  'SHLANA-3.tests',
+  'SHLANA-4.tests',
+  'SHLANA-5.tests',
+  'SHLANA-6.tests',
+  'SHLANA-7.tests',
+  'SHLANA-8.tests',
+  'SHLANA-9.tests',
+]
diff --git a/test/shaping/data/text-rendering-tests/tests/SFNT-1.tests b/test/shaping/data/text-rendering-tests/tests/SFNT-1.tests
new file mode 100644 (file)
index 0000000..7a6feeb
--- /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/shaping/data/text-rendering-tests/tests/SFNT-2.tests b/test/shaping/data/text-rendering-tests/tests/SFNT-2.tests
new file mode 100644 (file)
index 0000000..2c952b5
--- /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/shaping/data/text-rendering-tests/update.py b/test/shaping/data/text-rendering-tests/update.py
new file mode 100755 (executable)
index 0000000..fe5db16
--- /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.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/data/text-rendering-tests/update.sh b/test/shaping/data/text-rendering-tests/update.sh
deleted file mode 100755 (executable)
index 47545bc..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/sh
-
-dir=`dirname "$0"`
-
-set -ex
-if test -d text-rendering-tests; then
-       cd text-rendering-tests
-       git pull
-       cd ..
-else
-       git clone https://github.com/unicode-org/text-rendering-tests
-fi
-
-test -d fonts && git rm -rf fonts
-test -d fonts && (echo "fonts/ dir not empty; investigate."; false)
-cp -a text-rendering-tests/fonts .
-git add fonts
-
-rmdir tests || true
-test -d tests && git rm -rf tests || true
-test -d tests && (echo "tests/ dir not empty; investigate."; false)
-mkdir tests
-
-echo "TESTS = \\" > Makefile.sources
-
-DISABLED="DISBALED_TESTS = \\"
-for x in text-rendering-tests/testcases/*.html; do
-       test "x$x" = xtext-rendering-tests/testcases/index.html && continue
-       out=tests/`basename "$x" .html`.tests
-       "$dir"/extract-tests.py < "$x" > "$out"
-       if grep -q "^$out$" DISABLED; then
-               DISABLED="$DISABLED
-       $out \\"
-       else
-               echo "  $out \\" >> Makefile.sources
-       fi
-done
-git add tests
-
-echo ' $(NULL)' >> Makefile.sources
-echo >> Makefile.sources
-echo "$DISABLED" >> Makefile.sources
-echo ' $(NULL)' >> Makefile.sources
-git add Makefile.sources
-
-git commit -e -m "[test/text-rendering-tests] Update from upstream"
index 3705de7..15a1e27 100755 (executable)
@@ -1,10 +1,9 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 from hb_test_tools import *
 import sys, os
 
 if len (sys.argv) < 2:
-       print "usage: %s FILES..." % sys.argv[0]
-       sys.exit (1)
+       sys.exit ("usage: %s FILES..." % sys.argv[0])
 
 ZipDiffer.diff_files (FileHelpers.open_file_or_stdin (f) for f in sys.argv[1:])
index 1fdae8a..7c481f5 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 from hb_test_tools import *
 
index 34b76de..fc868d9 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 from hb_test_tools import *
 
index 12ee8f0..f847116 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 from hb_test_tools import *
 
index 9ac5ed6..1dc7052 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 from hb_test_tools import *
 
index 5889807..99a99b3 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 from hb_test_tools import *
 
index 1d004c0..41289b5 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 from hb_test_tools import *
 
index feff70a..a9368ad 100644 (file)
@@ -1,13 +1,7 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
-from __future__ import print_function, division, absolute_import
-
-import sys, os, re, difflib, unicodedata, errno, cgi
+import sys, os, re, difflib, unicodedata, errno, cgi, itertools
 from itertools import *
-try:
-       import unicodedata2 as unicodedata
-except Exception:
-       pass
 
 diff_symbols = "-+=*&^%$#@!~/"
 diff_colors = ['red', 'green', 'blue']
@@ -15,78 +9,6 @@ diff_colors = ['red', 'green', 'blue']
 def codepoints(s):
        return (ord (u) for u in s)
 
-try:
-       unichr = unichr
-
-       if sys.maxunicode < 0x10FFFF:
-               # workarounds for Python 2 "narrow" builds with UCS2-only support.
-
-               _narrow_unichr = unichr
-
-               def unichr(i):
-                       """
-                       Return the unicode character whose Unicode code is the integer 'i'.
-                       The valid range is 0 to 0x10FFFF inclusive.
-
-                       >>> _narrow_unichr(0xFFFF + 1)
-                       Traceback (most recent call last):
-                         File "<stdin>", line 1, in ?
-                       ValueError: unichr() arg not in range(0x10000) (narrow Python build)
-                       >>> unichr(0xFFFF + 1) == u'\U00010000'
-                       True
-                       >>> unichr(1114111) == u'\U0010FFFF'
-                       True
-                       >>> unichr(0x10FFFF + 1)
-                       Traceback (most recent call last):
-                         File "<stdin>", line 1, in ?
-                       ValueError: unichr() arg not in range(0x110000)
-                       """
-                       try:
-                               return _narrow_unichr(i)
-                       except ValueError:
-                               try:
-                                       padded_hex_str = hex(i)[2:].zfill(8)
-                                       escape_str = "\\U" + padded_hex_str
-                                       return escape_str.decode("unicode-escape")
-                               except UnicodeDecodeError:
-                                       raise ValueError('unichr() arg not in range(0x110000)')
-
-               def codepoints(s):
-                       high_surrogate = None
-                       for u in s:
-                               cp = ord (u)
-                               if 0xDC00 <= cp <= 0xDFFF:
-                                       if high_surrogate:
-                                               yield 0x10000 + (high_surrogate - 0xD800) * 0x400 + (cp - 0xDC00)
-                                               high_surrogate = None
-                                       else:
-                                               yield 0xFFFD
-                               else:
-                                       if high_surrogate:
-                                               yield 0xFFFD
-                                               high_surrogate = None
-                                       if 0xD800 <= cp <= 0xDBFF:
-                                               high_surrogate = cp
-                                       else:
-                                               yield cp
-                                               high_surrogate = None
-                       if high_surrogate:
-                               yield 0xFFFD
-
-except NameError:
-       unichr = chr
-
-try:
-       unicode = unicode
-except NameError:
-       unicode = str
-
-def tounicode(s, encoding='ascii', errors='strict'):
-       if not isinstance(s, unicode):
-               return s.decode(encoding, errors)
-       else:
-               return s
-
 class ColorFormatter:
 
        class Null:
@@ -213,7 +135,7 @@ class ZipDiffer:
        def diff_files (files, symbols=diff_symbols):
                files = tuple (files) # in case it's a generator, copy it
                try:
-                       for lines in izip_longest (*files):
+                       for lines in itertools.zip_longest (*files):
                                if all (lines[0] == line for line in lines[1:]):
                                        sys.stdout.writelines ([" ", lines[0]])
                                        continue
@@ -223,8 +145,7 @@ class ZipDiffer:
                                                sys.stdout.writelines ([symbols[i], l])
                except IOError as e:
                        if e.errno != errno.EPIPE:
-                               print ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror), file=sys.stderr)
-                               sys.exit (1)
+                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
 
 
 class DiffFilters:
@@ -276,7 +197,7 @@ class Stats:
                   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: http://en.wikipedia.org/wiki/Standard_score"""
+                  See: https://en.wikipedia.org/wiki/Standard_score"""
 
                return (self.mean () - population.mean ()) / population.stddev ()
 
@@ -399,8 +320,7 @@ class UtilMains:
        def process_multiple_files (callback, mnemonic = "FILE"):
 
                if "--help" in sys.argv:
-                       print ("Usage: %s %s..." % (sys.argv[0], mnemonic))
-                       sys.exit (1)
+                       sys.exit ("Usage: %s %s..." % (sys.argv[0], mnemonic))
 
                try:
                        files = sys.argv[1:] if len (sys.argv) > 1 else ['-']
@@ -408,23 +328,20 @@ class UtilMains:
                                callback (FileHelpers.open_file_or_stdin (s))
                except IOError as e:
                        if e.errno != errno.EPIPE:
-                               print ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror), file=sys.stderr)
-                               sys.exit (1)
+                               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:
-                       print ("Usage: %s %s..." % (sys.argv[0], mnemonic))
-                       sys.exit (1)
+                       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:
-                               print ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror), file=sys.stderr)
-                               sys.exit (1)
+                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
 
        @staticmethod
        def filter_multiple_strings_or_stdin (callback, mnemonic, \
@@ -432,9 +349,12 @@ class UtilMains:
                                              concat_separator = False):
 
                if "--help" in sys.argv:
-                       print ("Usage:\n  %s %s...\nor:\n  %s\n\nWhen called with no arguments, input is read from standard input." \
-                             % (sys.argv[0], mnemonic, sys.argv[0]))
-                       sys.exit (1)
+                       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:
@@ -452,15 +372,14 @@ class UtilMains:
                                print (separator.join (callback (x) for x in (args)))
                except IOError as e:
                        if e.errno != errno.EPIPE:
-                               print ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror), file=sys.stderr)
-                               sys.exit (1)
+                               sys.exit ("%s: %s: %s" % (sys.argv[0], e.filename, e.strerror))
 
 
 class Unicode:
 
        @staticmethod
        def decode (s):
-               return u','.join ("U+%04X" % cp for cp in codepoints (tounicode (s, 'utf-8')))
+               return ','.join ("U+%04X" % cp for cp in codepoints (s))
 
        @staticmethod
        def parse (s):
@@ -470,9 +389,7 @@ class Unicode:
 
        @staticmethod
        def encode (s):
-               s = u''.join (unichr (x) for x in Unicode.parse (s))
-               if sys.version_info[0] == 2: s = s.encode ('utf-8')
-               return s
+               return ''.join (chr (x) for x in Unicode.parse (s))
 
        shorthands = {
                "ZERO WIDTH NON-JOINER": "ZWNJ",
@@ -508,8 +425,8 @@ class Unicode:
        def pretty_names (s):
                s = re.sub (r"[<+>\\uU]", " ", s)
                s = re.sub (r"0[xX]", " ", s)
-               s = [unichr (int (x, 16)) for x in re.split ('[, \n]', s) if len (x)]
-               return u' + '.join (Unicode.pretty_name (x) for x in s).encode ('utf-8')
+               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:
@@ -528,8 +445,7 @@ class Manifest:
 
                if not os.path.exists (s):
                        if strict:
-                               print ("%s: %s does not exist" % (sys.argv[0], s), file=sys.stderr)
-                               sys.exit (1)
+                               sys.exit ("%s: %s does not exist" % (sys.argv[0], s))
                        return
 
                s = os.path.normpath (s)
@@ -544,8 +460,7 @@ class Manifest:
                                                yield p
                        except IOError:
                                if strict:
-                                       print ("%s: %s does not exist" % (sys.argv[0], os.path.join (s, "MANIFEST")), file=sys.stderr)
-                                       sys.exit (1)
+                                       sys.exit ("%s: %s does not exist" % (sys.argv[0], os.path.join (s, "MANIFEST")))
                                return
                else:
                        yield s
diff --git a/test/shaping/meson.build b/test/shaping/meson.build
new file mode 100644 (file)
index 0000000..d301585
--- /dev/null
@@ -0,0 +1,228 @@
+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
index 7f24354..62a4795 100755 (executable)
@@ -115,7 +115,7 @@ exec 3<"$unicodes_file"
 exec 4<"$glyphs_file"
 relative_subset="$subset"
 if test "$out" != "/dev/stdout"; then
-       relative_subset="$(/usr/bin/python -c 'import os, sys; print (os.path.relpath (sys.argv[1], sys.argv[2]))' "$subset" "$(dirname "$out")")"
+       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"
index 26853e4..9731067 100755 (executable)
@@ -1,14 +1,7 @@
-#!/usr/bin/env python
-
-from __future__ import print_function, division, absolute_import
+#!/usr/bin/env python3
 
 import sys, os, subprocess, hashlib, tempfile, shutil
 
-def cmd(command):
-       global process
-       process.stdin.write ((' '.join (command) + '\n').encode ("utf-8"))
-       process.stdin.flush ()
-       return process.stdout.readline().decode ("utf-8").strip ()
 
 args = sys.argv[1:]
 
@@ -18,14 +11,24 @@ if len (args) and args[0] == "--reference":
        args = args[1:]
 
 if not args or args[0].find('hb-shape') == -1 or not os.path.exists (args[0]):
-       print ("""First argument does not seem to point to usable hb-shape.""")
-       sys.exit (1)
+       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'],
+def cmd(command):
+       process = subprocess.Popen ([hb_shape, '--batch'],
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
-                           stderr=sys.stdout)
+                           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
@@ -44,7 +47,7 @@ for filename in args:
        if filename == '-':
                f = sys.stdin
        else:
-               f = open (filename)
+               f = open (filename, encoding='utf8')
 
        for line in f:
                comment = False
@@ -63,6 +66,9 @@ for filename in args:
 
                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:
@@ -104,30 +110,38 @@ for filename in args:
                        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 != glyphs2 and glyphs_expected != '*':
-                       print ("FT funcs: " + glyphs1) # file=sys.stderr
-                       print ("OT funcs: " + glyphs2) # file=sys.stderr
+               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]))
+                       print (":".join ([fontfile, options, unicodes, glyphs1[0]]))
                        continue
 
-               if glyphs1.strip() != glyphs_expected and glyphs_expected != '*':
-                       print ("Actual:   " + glyphs1) # file=sys.stderr
-                       print ("Expected: " + glyphs_expected) # file=sys.stderr
+               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
+       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):
diff --git a/test/subset/CMakeLists.txt b/test/subset/CMakeLists.txt
deleted file mode 100644 (file)
index af2b41a..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-if (HB_BUILD_UTILS)
-  file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/Makefile.sources" SOURCES)
-  extract_make_variable (TESTS ${SOURCES})
-  foreach (test IN ITEMS ${TESTS})
-    add_test (NAME ${test}
-      COMMAND "${PYTHON_EXECUTABLE}" run-tests.py $<TARGET_FILE:hb-subset> "data/${test}"
-      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-    set_property(TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
-  endforeach ()
-endif ()
index da4b3d4..47b0039 100644 (file)
@@ -11,7 +11,7 @@ libs:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
 
 EXTRA_DIST += \
-       CMakeLists.txt \
+       meson.build \
        run-tests.py \
        subset_test_suite.py \
        $(NULL)
index c661983..652e410 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -321,6 +321,8 @@ 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@
@@ -377,7 +379,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
-EXTRA_DIST = CMakeLists.txt run-tests.py subset_test_suite.py $(NULL)
+EXTRA_DIST = meson.build run-tests.py subset_test_suite.py $(NULL)
 CLEANFILES = subset_test_suite.py[co] $(NULL)
 SUBDIRS = data
 all: all-recursive
index 4508fcd..beb0a04 100644 (file)
@@ -16,8 +16,20 @@ EXTRA_DIST += \
        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)
index 17a079f..7fb7174 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -91,10 +91,9 @@ 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/layout.tests \
-       tests/layout.gpos.tests tests/layout.gpos2.tests \
-       tests/layout.gpos3.tests tests/layout.gsub6.tests \
-       tests/cmap14.tests $(am__EXEEXT_1)
+       tests/cff-japanese.tests tests/cmap.tests tests/cmap14.tests \
+       tests/sbix.tests tests/colr.tests tests/cbdt.tests \
+       $(am__EXEEXT_1)
 XFAIL_TESTS = $(am__EXEEXT_1)
 subdir = test/subset/data
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -530,6 +529,8 @@ 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@
@@ -589,8 +590,13 @@ 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/layout.gpos3 expected/layout.gsub6 expected/cmap14 \
-       fonts profiles $(NULL)
+       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)
 CLEANFILES = 
 SUBDIRS = 
 TEST_EXTENSIONS = .tests
index 5b93f27..a6b8659 100644 (file)
@@ -4,12 +4,27 @@ 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 \
+       $(NULL)
+
+DISABLED_TESTS = \
        tests/layout.tests \
        tests/layout.gpos.tests \
        tests/layout.gpos2.tests \
        tests/layout.gpos3.tests \
+       tests/layout.gpos4.tests \
+       tests/layout.gpos6.tests \
+       tests/layout.gpos8.tests \
+       tests/layout.gsub3.tests \
        tests/layout.gsub6.tests \
-       tests/cmap14.tests \
+       tests/layout.gdef.tests \
+       tests/layout.context.tests \
+       tests/layout.gdef-varstore.tests \
+       tests/layout.gdef-attachlist.tests \
        $(NULL)
 
 XFAIL_TESTS = \
index efe5bcb..31a4093 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 8e12241..31b8d9a 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 bd802a5..9411e46 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 9fbebb5..8d561d5 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 7391741..88ab0e1 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 5de8d89..a29c708 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 05d83d8..7582995 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 f47887e..1f83796 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 bfa9267..354ee07 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 8c12158..68c21bf 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 6a47c39..c2d90fc 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 e3c0727..41a6bee 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 36a4b9a..345b9c9 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 251794c..d6fab9b 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 9e65c83..84313ca 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 ada1649..c41f61b 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 6b0dc6c..01482f0 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 6425ecf..eaadf25 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
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,62,63.ttf
new file mode 100644 (file)
index 0000000..f720295
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,63.ttf
new file mode 100644 (file)
index 0000000..e711246
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61.ttf
new file mode 100644 (file)
index 0000000..8936629
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.61.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.62.ttf
new file mode 100644 (file)
index 0000000..a8b6914
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.62.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.63.ttf
new file mode 100644 (file)
index 0000000..4a53bb2
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..a29c708
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.retain-all-codepoint.ttf differ
index 90e49be..748b6d9 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 5277d15..c639e4d 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 de06660..2cf7df7 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 effad7b..4890c3b 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 21c8205..13fc238 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 fbb8c33..4128989 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
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,62,63.ttf
new file mode 100644 (file)
index 0000000..31a4093
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,63.ttf
new file mode 100644 (file)
index 0000000..31b8d9a
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61.ttf
new file mode 100644 (file)
index 0000000..9411e46
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.61.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.62.ttf
new file mode 100644 (file)
index 0000000..8d561d5
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.62.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.63.ttf
new file mode 100644 (file)
index 0000000..88ab0e1
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..a29c708
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,62,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,62,63.ttf
new file mode 100644 (file)
index 0000000..31a4093
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,63.ttf
new file mode 100644 (file)
index 0000000..31b8d9a
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61.ttf
new file mode 100644 (file)
index 0000000..9411e46
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.61.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.62.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.62.ttf
new file mode 100644 (file)
index 0000000..8d561d5
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.62.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.63.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.63.ttf
new file mode 100644 (file)
index 0000000..88ab0e1
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.63.ttf differ
diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..a29c708
Binary files /dev/null and b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.retain-all-codepoint.ttf differ
index 3c0f4cd..fbe8501 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 a5ce9e0..be4e5b4 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 1b84335..89f37bf 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 97eaa26..e299483 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 f42edb7..5787e50 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 cc2805a..75f4803 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
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,62,63.ttf
new file mode 100644 (file)
index 0000000..dbed582
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,63.ttf
new file mode 100644 (file)
index 0000000..5913420
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61.ttf
new file mode 100644 (file)
index 0000000..3635f68
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.62.ttf
new file mode 100644 (file)
index 0000000..91fcad8
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.63.ttf
new file mode 100644 (file)
index 0000000..737cbdc
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..9744bc3
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,62,63.ttf
new file mode 100644 (file)
index 0000000..bf8264b
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,63.ttf
new file mode 100644 (file)
index 0000000..c64172a
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61.ttf
new file mode 100644 (file)
index 0000000..9b26144
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.62.ttf
new file mode 100644 (file)
index 0000000..d737cd7
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.63.ttf
new file mode 100644 (file)
index 0000000..5e4d494
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..892ccb8
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints-retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,62,63.ttf
new file mode 100644 (file)
index 0000000..bf8264b
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,63.ttf
new file mode 100644 (file)
index 0000000..bc54940
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61.ttf
new file mode 100644 (file)
index 0000000..9b26144
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.62.ttf
new file mode 100644 (file)
index 0000000..32cf9f7
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.63.ttf
new file mode 100644 (file)
index 0000000..776e758
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..892ccb8
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.drop-hints.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,62,63.ttf
new file mode 100644 (file)
index 0000000..dbed582
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,63.ttf
new file mode 100644 (file)
index 0000000..dbed582
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61.ttf
new file mode 100644 (file)
index 0000000..dbed582
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.62.ttf
new file mode 100644 (file)
index 0000000..dbed582
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.63.ttf
new file mode 100644 (file)
index 0000000..dbed582
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..9744bc3
Binary files /dev/null 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.name-ids.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,62,63.ttf
new file mode 100644 (file)
index 0000000..a7af973
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,63.ttf
new file mode 100644 (file)
index 0000000..ac780db
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61.ttf
new file mode 100644 (file)
index 0000000..c4321d1
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.62.ttf
new file mode 100644 (file)
index 0000000..4c553ca
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.63.ttf
new file mode 100644 (file)
index 0000000..5234b74
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..9d22541
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-ids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,62,63.ttf
new file mode 100644 (file)
index 0000000..9bb2a9d
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,63.ttf
new file mode 100644 (file)
index 0000000..7373aa3
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61.ttf
new file mode 100644 (file)
index 0000000..26fe19e
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.62.ttf
new file mode 100644 (file)
index 0000000..02cd270
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.63.ttf
new file mode 100644 (file)
index 0000000..64a892e
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..d5d4238
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-languages.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,62,63.ttf
new file mode 100644 (file)
index 0000000..dbed582
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,63.ttf
new file mode 100644 (file)
index 0000000..5913420
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61.ttf
new file mode 100644 (file)
index 0000000..3635f68
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.62.ttf
new file mode 100644 (file)
index 0000000..91fcad8
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.63.ttf
new file mode 100644 (file)
index 0000000..737cbdc
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.name-legacy.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..9744bc3
Binary files /dev/null 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.retain-gids.61,62,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,62,63.ttf
new file mode 100644 (file)
index 0000000..dbed582
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,63.ttf
new file mode 100644 (file)
index 0000000..47e72c6
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61.ttf
new file mode 100644 (file)
index 0000000..3635f68
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.61.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.62.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.62.ttf
new file mode 100644 (file)
index 0000000..57f7ec7
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.62.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.63.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.63.ttf
new file mode 100644 (file)
index 0000000..d0426a0
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.63.ttf differ
diff --git a/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..9744bc3
Binary files /dev/null and b/test/subset/data/expected/basics/NanumMyeongjo-Regular-subset.retain-gids.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,62,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,62,63.ttf
new file mode 100644 (file)
index 0000000..12d9208
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,63.ttf
new file mode 100644 (file)
index 0000000..12d9208
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61.ttf
new file mode 100644 (file)
index 0000000..12d9208
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.61.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.62.ttf
new file mode 100644 (file)
index 0000000..12d9208
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.62.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.63.ttf
new file mode 100644 (file)
index 0000000..12d9208
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.gids.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.gids.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..12d9208
Binary files /dev/null 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.name-languages.61,62,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,62,63.ttf
new file mode 100644 (file)
index 0000000..12d9208
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,63.ttf
new file mode 100644 (file)
index 0000000..1af233f
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61.ttf
new file mode 100644 (file)
index 0000000..a699eea
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.61.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.62.ttf
new file mode 100644 (file)
index 0000000..52706dc
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.62.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.63.ttf
new file mode 100644 (file)
index 0000000..3de7c77
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..12d9208
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-languages.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,62,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,62,63.ttf
new file mode 100644 (file)
index 0000000..12d9208
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,63.ttf
new file mode 100644 (file)
index 0000000..1af233f
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61.ttf
new file mode 100644 (file)
index 0000000..a699eea
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.61.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.62.ttf
new file mode 100644 (file)
index 0000000..52706dc
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.62.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.63.ttf
new file mode 100644 (file)
index 0000000..3de7c77
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..12d9208
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.name-legacy.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.2049.ttf
new file mode 100644 (file)
index 0000000..b577752
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,2049.ttf
new file mode 100644 (file)
index 0000000..6f4814c
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,20E3.ttf
new file mode 100644 (file)
index 0000000..1872d24
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..14a544a
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..5631ded
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.39.ttf
new file mode 100644 (file)
index 0000000..34e878e
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.AE.ttf
new file mode 100644 (file)
index 0000000..1764f93
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.default.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.2049.ttf
new file mode 100644 (file)
index 0000000..c9d65cc
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,2049.ttf
new file mode 100644 (file)
index 0000000..9b25457
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,20E3.ttf
new file mode 100644 (file)
index 0000000..7b36e6f
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..a1fcc8c
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..1596444
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.39.ttf
new file mode 100644 (file)
index 0000000..f7075d2
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.AE.ttf
new file mode 100644 (file)
index 0000000..8a68548
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints-retain-gids.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf
new file mode 100644 (file)
index 0000000..073edc9
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,2049.ttf
new file mode 100644 (file)
index 0000000..3d9c782
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,20E3.ttf
new file mode 100644 (file)
index 0000000..b8eadb0
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..a1fcc8c
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..eabf61a
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.39.ttf
new file mode 100644 (file)
index 0000000..936bb3c
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf
new file mode 100644 (file)
index 0000000..77f4be2
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.drop-hints.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.2049.ttf
new file mode 100644 (file)
index 0000000..79e2d5d
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,2049.ttf
new file mode 100644 (file)
index 0000000..8183201
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,20E3.ttf
new file mode 100644 (file)
index 0000000..b465c5e
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..4b7649d
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..3074fb3
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.39.ttf
new file mode 100644 (file)
index 0000000..18b002f
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.AE.ttf
new file mode 100644 (file)
index 0000000..c627676
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.default.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.2049.ttf
new file mode 100644 (file)
index 0000000..129e7f9
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,2049.ttf
new file mode 100644 (file)
index 0000000..ac58380
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,20E3.ttf
new file mode 100644 (file)
index 0000000..128da7c
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..b2f7f73
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..a79bd91
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.39.ttf
new file mode 100644 (file)
index 0000000..e663b7b
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.AE.ttf
new file mode 100644 (file)
index 0000000..c568252
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints-retain-gids.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.2049.ttf
new file mode 100644 (file)
index 0000000..fe772c9
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,2049.ttf
new file mode 100644 (file)
index 0000000..45b4ded
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,20E3.ttf
new file mode 100644 (file)
index 0000000..1306b06
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..b2f7f73
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..abd10a6
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.39.ttf
new file mode 100644 (file)
index 0000000..36e4096
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.AE.ttf
new file mode 100644 (file)
index 0000000..8659f8b
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.drop-hints.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.2049.ttf
new file mode 100644 (file)
index 0000000..2cee950
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,2049.ttf
new file mode 100644 (file)
index 0000000..70c9f1b
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,20E3.ttf
new file mode 100644 (file)
index 0000000..de9ec81
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..4b7649d
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..17a8911
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.39.ttf
new file mode 100644 (file)
index 0000000..c63734d
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.AE.ttf
new file mode 100644 (file)
index 0000000..981fdac
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.gap.retain-gids.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.2049.ttf
new file mode 100644 (file)
index 0000000..5d8b04f
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,2049.ttf
new file mode 100644 (file)
index 0000000..058cc2a
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,20E3.ttf
new file mode 100644 (file)
index 0000000..11e4412
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..a53a3c6
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..a6be214
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.39.ttf
new file mode 100644 (file)
index 0000000..b3d8000
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.AE.ttf
new file mode 100644 (file)
index 0000000..6eda40d
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.default.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.2049.ttf
new file mode 100644 (file)
index 0000000..516edf2
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,2049.ttf
new file mode 100644 (file)
index 0000000..75307b5
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,20E3.ttf
new file mode 100644 (file)
index 0000000..232d48a
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..cafcec2
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..13bebcb
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.39.ttf
new file mode 100644 (file)
index 0000000..681723c
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.AE.ttf
new file mode 100644 (file)
index 0000000..b2f3346
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints-retain-gids.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.2049.ttf
new file mode 100644 (file)
index 0000000..1974057
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,2049.ttf
new file mode 100644 (file)
index 0000000..346df61
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,20E3.ttf
new file mode 100644 (file)
index 0000000..d01e7e0
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..cafcec2
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..967397c
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.39.ttf
new file mode 100644 (file)
index 0000000..07faf3d
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.AE.ttf
new file mode 100644 (file)
index 0000000..b23af82
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.drop-hints.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.2049.ttf
new file mode 100644 (file)
index 0000000..76911a5
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,2049.ttf
new file mode 100644 (file)
index 0000000..77422d0
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,20E3.ttf
new file mode 100644 (file)
index 0000000..60a94b8
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..a53a3c6
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..ee3d5cf
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.39.ttf
new file mode 100644 (file)
index 0000000..40208c0
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.AE.ttf
new file mode 100644 (file)
index 0000000..f9b5d53
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.index_format3.retain-gids.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.2049.ttf
new file mode 100644 (file)
index 0000000..91135db
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,2049.ttf
new file mode 100644 (file)
index 0000000..327b5a9
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,20E3.ttf
new file mode 100644 (file)
index 0000000..90509e0
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..dc414bc
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..e560bcb
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.39.ttf
new file mode 100644 (file)
index 0000000..5e6fe09
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.AE.ttf
new file mode 100644 (file)
index 0000000..2395fbc
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.default.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.2049.ttf
new file mode 100644 (file)
index 0000000..1579c3c
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,2049.ttf
new file mode 100644 (file)
index 0000000..6601691
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,20E3.ttf
new file mode 100644 (file)
index 0000000..9777dba
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..4f684e1
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..7d5f7c4
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.39.ttf
new file mode 100644 (file)
index 0000000..c675123
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.AE.ttf
new file mode 100644 (file)
index 0000000..40ab37f
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints-retain-gids.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.2049.ttf
new file mode 100644 (file)
index 0000000..3314ada
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,2049.ttf
new file mode 100644 (file)
index 0000000..11481e0
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,20E3.ttf
new file mode 100644 (file)
index 0000000..66a5ce9
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..4f684e1
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..aff5f6c
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.39.ttf
new file mode 100644 (file)
index 0000000..359c37f
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.AE.ttf
new file mode 100644 (file)
index 0000000..f456bdb
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.drop-hints.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.2049.ttf
new file mode 100644 (file)
index 0000000..9bbbfc1
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,2049.ttf
new file mode 100644 (file)
index 0000000..129b0c7
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,20E3.ttf
new file mode 100644 (file)
index 0000000..6bcdf40
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..dc414bc
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..c55b0a7
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.39.ttf
new file mode 100644 (file)
index 0000000..6d5fa0e
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.AE.ttf
new file mode 100644 (file)
index 0000000..82e9d84
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.multiple_size_tables.retain-gids.AE.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.2049.ttf
new file mode 100644 (file)
index 0000000..968ed75
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,2049.ttf
new file mode 100644 (file)
index 0000000..2f14cad
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,20E3.ttf
new file mode 100644 (file)
index 0000000..8e211fd
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf
new file mode 100644 (file)
index 0000000..14a544a
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,39,AE,2049,38,20E3.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,AE,2049.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,AE,2049.ttf
new file mode 100644 (file)
index 0000000..06fbe73
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.38,AE,2049.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.39.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.39.ttf
new file mode 100644 (file)
index 0000000..dc003fe
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.39.ttf differ
diff --git a/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf
new file mode 100644 (file)
index 0000000..c990eca
Binary files /dev/null and b/test/subset/data/expected/cbdt/NotoColorEmoji.subset.retain-gids.AE.ttf differ
index f0ea3ca..780b278 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf differ
index 7ea55a2..655f8c2 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.61,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.61,62,63.otf differ
index 07b9aa2..bbc29ed 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf differ
index 2811017..012e843 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.1FC,21,41,20,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.1FC,21,41,20,62,63.otf differ
index 98bbf38..eaafafe 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.61,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.61,62,63.otf differ
index 2d88e57..4449e0e 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf differ
index cf0fbf6..de556b5 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf differ
index 8ab8294..85e2711 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otf differ
index de475e6..98a856e 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf differ
index e5775fd..86b849a 100644 (file)
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 b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.1FC,21,41,20,62,63.otf differ
index 572ea74..08b023c 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.61,62,63.otf differ
index 376f658..1c246c1 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf differ
index cf3228d..d409eab 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.1FC,21,41,20,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.1FC,21,41,20,62,63.otf differ
index 1bafff1..910216e 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.61,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.61,62,63.otf differ
index 34303e7..c1d8776 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf differ
index e23e37f..76505a0 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.1FC,21,41,20,62,63.otf differ
index b5a565e..87a279f 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.61,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.61,62,63.otf differ
index 6045b4c..edb013e 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf differ
index 112dec7..2cf6200 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf differ
index 929c4e2..3e500ab 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.61,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.61,62,63.otf differ
index 939a565..02edb95 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf differ
index e1613ac..def021f 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.1FC,21,41,20,62,63.otf differ
index 479c5e0..8ca5055 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.61,62,63.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.61,62,63.otf differ
index 95149dc..0529b72 100644 (file)
Binary files a/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf and b/test/subset/data/expected/cff-full-font/SourceSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,62.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,62.ttf
new file mode 100644 (file)
index 0000000..5eb324e
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,62.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,FEFA.ttf
new file mode 100644 (file)
index 0000000..f992c46
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.61,FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf
new file mode 100644 (file)
index 0000000..dd44a81
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEE6,FECF.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf
new file mode 100644 (file)
index 0000000..bb09c4d
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEF9,FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEFA.ttf
new file mode 100644 (file)
index 0000000..209f039
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.default.FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,62.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,62.ttf
new file mode 100644 (file)
index 0000000..b61474d
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,62.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,FEFA.ttf
new file mode 100644 (file)
index 0000000..675e2d3
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.61,FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEE6,FECF.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEE6,FECF.ttf
new file mode 100644 (file)
index 0000000..12a9fb2
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEE6,FECF.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf
new file mode 100644 (file)
index 0000000..82ce49d
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEF9,FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEFA.ttf
new file mode 100644 (file)
index 0000000..46ec429
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints-retain-gids.FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,62.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,62.ttf
new file mode 100644 (file)
index 0000000..bdba814
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,62.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf
new file mode 100644 (file)
index 0000000..2678e54
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.61,FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf
new file mode 100644 (file)
index 0000000..dc1e50c
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEE6,FECF.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf
new file mode 100644 (file)
index 0000000..7b2add8
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEF9,FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf
new file mode 100644 (file)
index 0000000..1aa367c
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.drop-hints.FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,62.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,62.ttf
new file mode 100644 (file)
index 0000000..b2e4657
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,62.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf
new file mode 100644 (file)
index 0000000..76dd00d
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.61,FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf
new file mode 100644 (file)
index 0000000..4f5cdbf
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEE6,FECF.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf
new file mode 100644 (file)
index 0000000..ce964fd
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEF9,FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEFA.ttf
new file mode 100644 (file)
index 0000000..859a7f1
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.name-ids.FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,62.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,62.ttf
new file mode 100644 (file)
index 0000000..745e32d
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,62.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,FEFA.ttf
new file mode 100644 (file)
index 0000000..6faea20
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.61,FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf
new file mode 100644 (file)
index 0000000..77fa170
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEE6,FECF.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf
new file mode 100644 (file)
index 0000000..54620ed
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEF9,FEFA.ttf differ
diff --git a/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf
new file mode 100644 (file)
index 0000000..06d379b
Binary files /dev/null and b/test/subset/data/expected/cmap/AdobeBlank-Regular.retain-gids.FEFA.ttf 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
new file mode 100644 (file)
index 0000000..aecfd1c
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E02,4E03.otf 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
new file mode 100644 (file)
index 0000000..3249149
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E03.otf 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
new file mode 100644 (file)
index 0000000..1c17acf
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E00,4E05,4E07.otf 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
new file mode 100644 (file)
index 0000000..4a66226
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E02,4E03,4E08.otf 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
new file mode 100644 (file)
index 0000000..806f689
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E02.otf 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
new file mode 100644 (file)
index 0000000..55f28d4
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E03.otf 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
new file mode 100644 (file)
index 0000000..d17a22a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E05,4E07,4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..cc4305d
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..f2093c9
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.gids.4E08.otf 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
new file mode 100644 (file)
index 0000000..09c8f8d
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font1.gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..460e81b
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E02,4E03.otf 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
new file mode 100644 (file)
index 0000000..f6df4cf
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E03.otf 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
new file mode 100644 (file)
index 0000000..5d15cd7
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.default.4E00,4E05,4E07.otf 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
new file mode 100644 (file)
index 0000000..71bc4d6
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.default.4E02,4E03,4E08.otf 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
new file mode 100644 (file)
index 0000000..f28bd1d
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.default.4E02.otf 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
new file mode 100644 (file)
index 0000000..d4401c7
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.default.4E03.otf 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
new file mode 100644 (file)
index 0000000..65c74c4
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.default.4E05,4E07,4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..9794277
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.default.4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..dea9124
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.default.4E08.otf 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
new file mode 100644 (file)
index 0000000..12365f4
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.default.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..f7679f5
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E02,4E03.otf 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
new file mode 100644 (file)
index 0000000..327f83f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E03.otf 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
new file mode 100644 (file)
index 0000000..a3289fd
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E00,4E05,4E07.otf 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
new file mode 100644 (file)
index 0000000..d0ba860
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02,4E03,4E08.otf 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
new file mode 100644 (file)
index 0000000..9707490
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E02.otf 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
new file mode 100644 (file)
index 0000000..f5de519
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E03.otf 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
new file mode 100644 (file)
index 0000000..9203411
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E05,4E07,4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..d7b13af
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..ae141a6
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.4E08.otf 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
new file mode 100644 (file)
index 0000000..646ed6f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints-retain-gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..0493452
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E02,4E03.otf 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
new file mode 100644 (file)
index 0000000..2322e5d
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E03.otf 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
new file mode 100644 (file)
index 0000000..6b9edac
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E00,4E05,4E07.otf 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
new file mode 100644 (file)
index 0000000..9f243b8
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02,4E03,4E08.otf 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
new file mode 100644 (file)
index 0000000..8954cd7
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E02.otf 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
new file mode 100644 (file)
index 0000000..e623928
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E03.otf 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
new file mode 100644 (file)
index 0000000..51237ad
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E05,4E07,4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..e219c39
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..9fc0bda
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.4E08.otf 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
new file mode 100644 (file)
index 0000000..02232ea
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.drop-hints.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..f902287
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E02,4E03.otf 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
new file mode 100644 (file)
index 0000000..426f769
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E03.otf 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
new file mode 100644 (file)
index 0000000..0c2674a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E00,4E05,4E07.otf 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
new file mode 100644 (file)
index 0000000..a59de5d
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E02,4E03,4E08.otf 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
new file mode 100644 (file)
index 0000000..6a5a3a7
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E02.otf 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
new file mode 100644 (file)
index 0000000..df159d0
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E03.otf 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
new file mode 100644 (file)
index 0000000..9b9f2b4
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E05,4E07,4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..bbac4f5
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..38b3fa8
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.gids.4E08.otf 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
new file mode 100644 (file)
index 0000000..3996080
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..021c980
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E02,4E03.otf 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
new file mode 100644 (file)
index 0000000..cf3a5b3
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E03.otf 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
new file mode 100644 (file)
index 0000000..7c537c1
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E00,4E05,4E07.otf 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
new file mode 100644 (file)
index 0000000..f24488b
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02,4E03,4E08.otf 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
new file mode 100644 (file)
index 0000000..8d9e65a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E02.otf 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
new file mode 100644 (file)
index 0000000..f2f5ba0
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E03.otf 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
new file mode 100644 (file)
index 0000000..aef4bd3
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E05,4E07,4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..f24ad1f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..00c466f
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.4E08.otf 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
new file mode 100644 (file)
index 0000000..86fe67b
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.name-ids.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
new file mode 100644 (file)
index 0000000..0bc930a
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E02,4E03.otf 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
new file mode 100644 (file)
index 0000000..9746b45
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E03.otf 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
new file mode 100644 (file)
index 0000000..2d378d8
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E00,4E05,4E07.otf 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
new file mode 100644 (file)
index 0000000..42ada2e
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02,4E03,4E08.otf 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
new file mode 100644 (file)
index 0000000..7e4cf58
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E02.otf 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
new file mode 100644 (file)
index 0000000..846fee5
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E03.otf 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
new file mode 100644 (file)
index 0000000..018805c
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E05,4E07,4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..1945b0b
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08,4E09.otf 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
new file mode 100644 (file)
index 0000000..f45fda1
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.4E08.otf 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
new file mode 100644 (file)
index 0000000..ac622b6
Binary files /dev/null and b/test/subset/data/expected/cmap14/cmap14_font2.retain-gids.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297,3299.ttf
new file mode 100644 (file)
index 0000000..d8165b3
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297.ttf
new file mode 100644 (file)
index 0000000..a1c29de
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3297.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3299.ttf
new file mode 100644 (file)
index 0000000..be3a53d
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32.ttf
new file mode 100644 (file)
index 0000000..136e15d
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.32.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297,3299.ttf
new file mode 100644 (file)
index 0000000..3ebe1c9
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297.ttf
new file mode 100644 (file)
index 0000000..09e5056
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3297.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3299.ttf
new file mode 100644 (file)
index 0000000..f11b8c3
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.default.3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297,3299.ttf
new file mode 100644 (file)
index 0000000..07968d0
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297.ttf
new file mode 100644 (file)
index 0000000..add6a09
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3297.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3299.ttf
new file mode 100644 (file)
index 0000000..f9b9c7d
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32.ttf
new file mode 100644 (file)
index 0000000..f69b0c5
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.32.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297,3299.ttf
new file mode 100644 (file)
index 0000000..78ae5ce
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297.ttf
new file mode 100644 (file)
index 0000000..cce38b5
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3297.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3299.ttf
new file mode 100644 (file)
index 0000000..0abccae
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints-retain-gids.3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297,3299.ttf
new file mode 100644 (file)
index 0000000..07968d0
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297.ttf
new file mode 100644 (file)
index 0000000..a3c6c89
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3297.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3299.ttf
new file mode 100644 (file)
index 0000000..378c04a
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32.ttf
new file mode 100644 (file)
index 0000000..f69b0c5
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.32.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297,3299.ttf
new file mode 100644 (file)
index 0000000..bde72d8
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297.ttf
new file mode 100644 (file)
index 0000000..f412189
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3297.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3299.ttf
new file mode 100644 (file)
index 0000000..3e92ac2
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.drop-hints.3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297,3299.ttf
new file mode 100644 (file)
index 0000000..d8165b3
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297.ttf
new file mode 100644 (file)
index 0000000..ab9f5d3
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3297.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3299.ttf
new file mode 100644 (file)
index 0000000..4e7fdba
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32.ttf
new file mode 100644 (file)
index 0000000..136e15d
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.32.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297,3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297,3299.ttf
new file mode 100644 (file)
index 0000000..dd78315
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297,3299.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297.ttf
new file mode 100644 (file)
index 0000000..d440ba0
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3297.ttf differ
diff --git a/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3299.ttf b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3299.ttf
new file mode 100644 (file)
index 0000000..7f256e0
Binary files /dev/null and b/test/subset/data/expected/colr/TwemojiMozilla.subset.retain-gids.3299.ttf differ
index e8b7b37..cf126ce 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 912e1fb..0bc7d80 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 6f19df6..1dae8e5 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 9ea42ab..03459bc 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 4d12593..46d88cf 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 281b475..91f4682 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
diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.1FC,21,41,20,62,63.ttf
new file mode 100644 (file)
index 0000000..91da5dd
Binary files /dev/null and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.1FC,21,41,20,62,63.ttf differ
diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf
new file mode 100644 (file)
index 0000000..175e856
Binary files /dev/null and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf differ
diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf
new file mode 100644 (file)
index 0000000..b966f04
Binary files /dev/null and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.D7,D8,D9,DA,DE.ttf differ
diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf
new file mode 100644 (file)
index 0000000..91da5dd
Binary files /dev/null and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.1FC,21,41,20,62,63.ttf differ
diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf
new file mode 100644 (file)
index 0000000..175e856
Binary files /dev/null and b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf differ
diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf
new file mode 100644 (file)
index 0000000..b966f04
Binary files /dev/null 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/japanese/Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf
new file mode 100644 (file)
index 0000000..7232004
Binary files /dev/null and b/test/subset/data/expected/japanese/Mplus1p-Regular.default.1D715,1D7D8,41,42.ttf differ
diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.default.25771.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.default.25771.ttf
new file mode 100644 (file)
index 0000000..1dcfeec
Binary files /dev/null and b/test/subset/data/expected/japanese/Mplus1p-Regular.default.25771.ttf differ
index 6770dac..92e2feb 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 0c66219..8b9ec31 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 4a5a6f8..a02fec6 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 465ce34..fb20dc7 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 28f3c37..c1c2f51 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
diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf
new file mode 100644 (file)
index 0000000..f98c029
Binary files /dev/null and b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.1D715,1D7D8,41,42.ttf differ
diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.25771.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.25771.ttf
new file mode 100644 (file)
index 0000000..5bdc97b
Binary files /dev/null and b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.25771.ttf differ
index 1bebda7..cf97a83 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 a43998d..b3dba2e 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 34c7788..1ba361a 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 92ec10b..6c54f62 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 b9bb539..08bbbdc 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
diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf
new file mode 100644 (file)
index 0000000..8b6ddd8
Binary files /dev/null and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.1D715,1D7D8,41,42.ttf differ
diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.25771.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.25771.ttf
new file mode 100644 (file)
index 0000000..cce2d36
Binary files /dev/null and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.25771.ttf differ
diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,3048,304A,304B.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,3048,304A,304B.ttf
new file mode 100644 (file)
index 0000000..beb4e52
Binary files /dev/null and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,3048,304A,304B.ttf differ
diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf
new file mode 100644 (file)
index 0000000..178989a
Binary files /dev/null and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.3042,3044,3046,73E0,5EA6,8F38.ttf differ
diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf
new file mode 100644 (file)
index 0000000..5fa32f3
Binary files /dev/null and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.61,63,65,6B.ttf differ
diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf
new file mode 100644 (file)
index 0000000..17d4d07
Binary files /dev/null and b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E,6975,73E0,5EA6,8F38,6E05.ttf differ
diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.keep-gdef.660E.ttf
new file mode 100644 (file)
index 0000000..b715f26
Binary files /dev/null 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
new file mode 100644 (file)
index 0000000..41f4ff4
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..67e87dc
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf 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
new file mode 100644 (file)
index 0000000..47fe5d0
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf 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
new file mode 100644 (file)
index 0000000..48e0524
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41.otf 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
new file mode 100644 (file)
index 0000000..eff7821
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..b1a0b3c
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..b070e2b
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42.otf 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
new file mode 100644 (file)
index 0000000..a2715ef
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,43.otf 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
new file mode 100644 (file)
index 0000000..c94a78f
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41.otf 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
new file mode 100644 (file)
index 0000000..eff7821
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.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
new file mode 100644 (file)
index 0000000..520a373
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..b9e8c99
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf 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
new file mode 100644 (file)
index 0000000..52fcc8c
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf 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
new file mode 100644 (file)
index 0000000..ae6325f
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41.otf 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
new file mode 100644 (file)
index 0000000..339bfe8
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..3deac41
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..5f0ded3
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42.otf 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
new file mode 100644 (file)
index 0000000..5c14c1b
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,43.otf 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
new file mode 100644 (file)
index 0000000..2152ca7
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41.otf 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
new file mode 100644 (file)
index 0000000..339bfe8
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.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
new file mode 100644 (file)
index 0000000..ab85997
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..ca3494f
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42.otf 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
new file mode 100644 (file)
index 0000000..58c9bf4
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,43.otf 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
new file mode 100644 (file)
index 0000000..84bae1a
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41.otf 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
new file mode 100644 (file)
index 0000000..5588fd3
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..7c11995
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..2ee02fe
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42.otf 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
new file mode 100644 (file)
index 0000000..6e881ee
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,43.otf 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
new file mode 100644 (file)
index 0000000..a4c8c42
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41.otf 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
new file mode 100644 (file)
index 0000000..5588fd3
Binary files /dev/null and b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.retain-all-codepoint.otf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A01.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A01.ttf
new file mode 100644 (file)
index 0000000..598a105
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A01.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A05,A06.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A05,A06.ttf
new file mode 100644 (file)
index 0000000..ccb6de8
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A05,A06.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A07,A1B.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A07,A1B.ttf
new file mode 100644 (file)
index 0000000..92548f4
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.A07,A1B.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..bba2499
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A01.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A01.ttf
new file mode 100644 (file)
index 0000000..2caaad7
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A01.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A05,A06.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A05,A06.ttf
new file mode 100644 (file)
index 0000000..a8b8b8b
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A05,A06.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A07,A1B.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A07,A1B.ttf
new file mode 100644 (file)
index 0000000..33ce18b
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.A07,A1B.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..6e6bca5
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A01.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A01.ttf
new file mode 100644 (file)
index 0000000..c298dec
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A01.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf
new file mode 100644 (file)
index 0000000..cc4b514
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A05,A06.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf
new file mode 100644 (file)
index 0000000..a47466a
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.A07,A1B.ttf differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttf
new file mode 100644 (file)
index 0000000..ae02f3f
Binary files /dev/null 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
new file mode 100644 (file)
index 0000000..745b740
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43,57.otf 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
new file mode 100644 (file)
index 0000000..729b23c
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..0689b4e
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,42.otf 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
new file mode 100644 (file)
index 0000000..8263d78
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41,56,57.otf 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
new file mode 100644 (file)
index 0000000..2396fc4
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.41.otf 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
new file mode 100644 (file)
index 0000000..2315ed9
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.default.42,57.otf 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
new file mode 100644 (file)
index 0000000..1e691e3
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43,57.otf 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
new file mode 100644 (file)
index 0000000..cc1f15d
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..965dc97
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,42.otf 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
new file mode 100644 (file)
index 0000000..6b2063d
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41,56,57.otf 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
new file mode 100644 (file)
index 0000000..c828aca
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.41.otf 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
new file mode 100644 (file)
index 0000000..0a31696
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.drop-hints.42,57.otf 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
new file mode 100644 (file)
index 0000000..cf686c3
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43,57.otf 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
new file mode 100644 (file)
index 0000000..dc41ad4
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..749daaf
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,42.otf 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
new file mode 100644 (file)
index 0000000..a178115
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41,56,57.otf 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
new file mode 100644 (file)
index 0000000..96374c4
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.41.otf 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
new file mode 100644 (file)
index 0000000..e17e1ec
Binary files /dev/null and b/test/subset/data/expected/layout.gdef-varstore/AdobeVFPrototype.keep-gdef-gpos.42,57.otf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.1E00,303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.1E00,303.ttf
new file mode 100644 (file)
index 0000000..d505524
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.1E00,303.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.303.ttf
new file mode 100644 (file)
index 0000000..c710e19
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.303.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.309,20,30F.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.309,20,30F.ttf
new file mode 100644 (file)
index 0000000..c4f5e02
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.309,20,30F.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.323.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.323.ttf
new file mode 100644 (file)
index 0000000..134a7dd
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.323.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.41,42,43.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.41,42,43.ttf
new file mode 100644 (file)
index 0000000..b037840
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.41,42,43.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.1E00,303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.1E00,303.ttf
new file mode 100644 (file)
index 0000000..5b1077f
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.1E00,303.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.303.ttf
new file mode 100644 (file)
index 0000000..665a3ec
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.303.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.309,20,30F.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.309,20,30F.ttf
new file mode 100644 (file)
index 0000000..cb041bd
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.309,20,30F.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.323.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.323.ttf
new file mode 100644 (file)
index 0000000..eea77c1
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.323.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.41,42,43.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.41,42,43.ttf
new file mode 100644 (file)
index 0000000..dcf5653
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.41,42,43.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.1E00,303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.1E00,303.ttf
new file mode 100644 (file)
index 0000000..b7411bb
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.1E00,303.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.303.ttf
new file mode 100644 (file)
index 0000000..1f5cb5c
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.303.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf
new file mode 100644 (file)
index 0000000..5f10399
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.309,20,30F.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.323.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.323.ttf
new file mode 100644 (file)
index 0000000..9562cc3
Binary files /dev/null and b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.323.ttf differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.41,42,43.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef-gpos.41,42,43.ttf
new file mode 100644 (file)
index 0000000..0ad2532
Binary files /dev/null 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.otf b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41.otf
new file mode 100644 (file)
index 0000000..e56bbf4
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.41.otf 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
new file mode 100644 (file)
index 0000000..eb8f88c
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout-retain-gids.42,44.otf 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
new file mode 100644 (file)
index 0000000..5277309
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,43.otf 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
new file mode 100644 (file)
index 0000000..5a74887
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41,46.otf 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
new file mode 100644 (file)
index 0000000..1caeeab
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.41.otf 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
new file mode 100644 (file)
index 0000000..09e38d5
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.42,44.otf 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
new file mode 100644 (file)
index 0000000..c429dc9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.43,46.otf 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
new file mode 100644 (file)
index 0000000..2d6962b
Binary files /dev/null and b/test/subset/data/expected/layout.gpos/gpos1_2_font.keep-layout.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..5972234
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..852808e
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_1_font7.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..5d9fe77
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..83e2e61
Binary files /dev/null and b/test/subset/data/expected/layout.gpos2/gpos2_2_font5.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..5c6dcee
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..aea6a56
Binary files /dev/null and b/test/subset/data/expected/layout.gpos3/gpos3_font3.keep-layout.41,42,43.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
new file mode 100644 (file)
index 0000000..1c2e5a4
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,44.otf 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
new file mode 100644 (file)
index 0000000..2fed45d
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,45.otf 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
new file mode 100644 (file)
index 0000000..0007615
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..8eb6ace
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42.otf 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
new file mode 100644 (file)
index 0000000..73315f3
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44,45,46.otf 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
new file mode 100644 (file)
index 0000000..4005a0d
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44.otf 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
new file mode 100644 (file)
index 0000000..c9f261c
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,45.otf 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
new file mode 100644 (file)
index 0000000..9ed6a9b
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43.otf 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
new file mode 100644 (file)
index 0000000..f50cc90
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41.otf 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
new file mode 100644 (file)
index 0000000..d4f9fc0
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..5447973
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,44.otf 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
new file mode 100644 (file)
index 0000000..e6c891b
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,45.otf 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
new file mode 100644 (file)
index 0000000..127f798
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..6cafcb8
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42.otf 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
new file mode 100644 (file)
index 0000000..5f47542
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44,45,46.otf 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
new file mode 100644 (file)
index 0000000..8fe4d63
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44.otf 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
new file mode 100644 (file)
index 0000000..147ed57
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,45.otf 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
new file mode 100644 (file)
index 0000000..1b0f243
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43.otf 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
new file mode 100644 (file)
index 0000000..657b686
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41.otf 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
new file mode 100644 (file)
index 0000000..d4f9fc0
Binary files /dev/null and b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.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
new file mode 100644 (file)
index 0000000..92d1e28
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,44.otf 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
new file mode 100644 (file)
index 0000000..28d5cb4
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43,45.otf 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
new file mode 100644 (file)
index 0000000..7d58a98
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..4261081
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,42.otf 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
new file mode 100644 (file)
index 0000000..d944ebf
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44,45,46.otf 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
new file mode 100644 (file)
index 0000000..7dc3d62
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,44.otf 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
new file mode 100644 (file)
index 0000000..f7727d4
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43,45.otf 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
new file mode 100644 (file)
index 0000000..7e564d5
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41,43.otf 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
new file mode 100644 (file)
index 0000000..c9ae1c7
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.41.otf 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
new file mode 100644 (file)
index 0000000..f636342
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout-retain-gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..106c55a
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,44.otf 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
new file mode 100644 (file)
index 0000000..ba37625
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43,45.otf 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
new file mode 100644 (file)
index 0000000..8a6aa87
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..1b8a1ca
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,42.otf 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
new file mode 100644 (file)
index 0000000..09e27e6
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44,45,46.otf 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
new file mode 100644 (file)
index 0000000..48e8928
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,44.otf 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
new file mode 100644 (file)
index 0000000..e4656fe
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43,45.otf 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
new file mode 100644 (file)
index 0000000..5527d9f
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41,43.otf 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
new file mode 100644 (file)
index 0000000..c151b9d
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.41.otf 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
new file mode 100644 (file)
index 0000000..f636342
Binary files /dev/null and b/test/subset/data/expected/layout.gpos6/gpos6_font1.keep-layout.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..61f41df
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf 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
new file mode 100644 (file)
index 0000000..3190942
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..3fabe71
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..34966da
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf 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
new file mode 100644 (file)
index 0000000..206062b
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..3fabe71
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.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
new file mode 100644 (file)
index 0000000..4c3af13
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf 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
new file mode 100644 (file)
index 0000000..4a10c76
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..53dccf9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..7130a4c
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf 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
new file mode 100644 (file)
index 0000000..b64fb14
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..53dccf9
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.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
new file mode 100644 (file)
index 0000000..9bc50e5
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.30,31,32,33.otf 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
new file mode 100644 (file)
index 0000000..66b1941
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..e7cc68d
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..55f3f66
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.30,31,32,33.otf 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
new file mode 100644 (file)
index 0000000..5f69d87
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..e7cc68d
Binary files /dev/null and b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.retain-all-codepoint.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
new file mode 100644 (file)
index 0000000..1d67ee4
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9,53F1.otf 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
new file mode 100644 (file)
index 0000000..31fc761
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53A9.otf 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
new file mode 100644 (file)
index 0000000..2fd89a4
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.53F1.otf 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
new file mode 100644 (file)
index 0000000..e737ed1
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout-retain-gids.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..685c2c9
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9,53F1.otf 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
new file mode 100644 (file)
index 0000000..fc1f61b
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53A9.otf 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
new file mode 100644 (file)
index 0000000..367edeb
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.53F1.otf 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
new file mode 100644 (file)
index 0000000..c55b233
Binary files /dev/null and b/test/subset/data/expected/layout.gsub3/gsub_alternate_substitution.keep-layout.retain-all-codepoint.otf 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
new file mode 100644 (file)
index 0000000..30e98e0
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..e87cfff
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..90634d6
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..80da795
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..d87455d
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout-retain-gids.41,42,43.otf 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
new file mode 100644 (file)
index 0000000..45bc0be
Binary files /dev/null and b/test/subset/data/expected/layout.gsub6/gsub_chaining3_simple_f2.keep-layout.41,42,43.otf differ
diff --git a/test/subset/data/expected/sbix/sbix.default.58,59.ttf b/test/subset/data/expected/sbix/sbix.default.58,59.ttf
new file mode 100644 (file)
index 0000000..d99bfc9
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.default.58,59.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.default.58.ttf b/test/subset/data/expected/sbix/sbix.default.58.ttf
new file mode 100644 (file)
index 0000000..6960f8f
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.default.58.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.default.59.ttf b/test/subset/data/expected/sbix/sbix.default.59.ttf
new file mode 100644 (file)
index 0000000..1a4ac97
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.default.59.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58,59.ttf b/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58,59.ttf
new file mode 100644 (file)
index 0000000..96f03e6
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58,59.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58.ttf b/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58.ttf
new file mode 100644 (file)
index 0000000..d88e416
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.58.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.59.ttf b/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.59.ttf
new file mode 100644 (file)
index 0000000..0de61a8
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.drop-hints-retain-gids.59.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.drop-hints.58,59.ttf b/test/subset/data/expected/sbix/sbix.drop-hints.58,59.ttf
new file mode 100644 (file)
index 0000000..96f03e6
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.drop-hints.58,59.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.drop-hints.58.ttf b/test/subset/data/expected/sbix/sbix.drop-hints.58.ttf
new file mode 100644 (file)
index 0000000..d88e416
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.drop-hints.58.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.drop-hints.59.ttf b/test/subset/data/expected/sbix/sbix.drop-hints.59.ttf
new file mode 100644 (file)
index 0000000..a3c09e9
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.drop-hints.59.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.retain-gids.58,59.ttf b/test/subset/data/expected/sbix/sbix.retain-gids.58,59.ttf
new file mode 100644 (file)
index 0000000..d99bfc9
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.retain-gids.58,59.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.retain-gids.58.ttf b/test/subset/data/expected/sbix/sbix.retain-gids.58.ttf
new file mode 100644 (file)
index 0000000..6960f8f
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.retain-gids.58.ttf differ
diff --git a/test/subset/data/expected/sbix/sbix.retain-gids.59.ttf b/test/subset/data/expected/sbix/sbix.retain-gids.59.ttf
new file mode 100644 (file)
index 0000000..21d014b
Binary files /dev/null and b/test/subset/data/expected/sbix/sbix.retain-gids.59.ttf differ
diff --git a/test/subset/data/fonts/AdobeBlank-Regular.ttf b/test/subset/data/fonts/AdobeBlank-Regular.ttf
new file mode 100644 (file)
index 0000000..817f51a
Binary files /dev/null and b/test/subset/data/fonts/AdobeBlank-Regular.ttf differ
diff --git a/test/subset/data/fonts/AdobeVFPrototype.otf b/test/subset/data/fonts/AdobeVFPrototype.otf
new file mode 100644 (file)
index 0000000..2f1b173
Binary files /dev/null and b/test/subset/data/fonts/AdobeVFPrototype.otf differ
diff --git a/test/subset/data/fonts/IndicTestJalandhar-Regular.ttf b/test/subset/data/fonts/IndicTestJalandhar-Regular.ttf
new file mode 100644 (file)
index 0000000..4d73975
Binary files /dev/null and b/test/subset/data/fonts/IndicTestJalandhar-Regular.ttf differ
diff --git a/test/subset/data/fonts/NanumMyeongjo-Regular-subset.ttf b/test/subset/data/fonts/NanumMyeongjo-Regular-subset.ttf
new file mode 100644 (file)
index 0000000..73b395e
Binary files /dev/null and b/test/subset/data/fonts/NanumMyeongjo-Regular-subset.ttf differ
diff --git a/test/subset/data/fonts/NotoColorEmoji.subset.gap.ttf b/test/subset/data/fonts/NotoColorEmoji.subset.gap.ttf
new file mode 100644 (file)
index 0000000..885059a
Binary files /dev/null and b/test/subset/data/fonts/NotoColorEmoji.subset.gap.ttf differ
diff --git a/test/subset/data/fonts/NotoColorEmoji.subset.index_format3.ttf b/test/subset/data/fonts/NotoColorEmoji.subset.index_format3.ttf
new file mode 100644 (file)
index 0000000..df1ff9b
Binary files /dev/null and b/test/subset/data/fonts/NotoColorEmoji.subset.index_format3.ttf differ
diff --git a/test/subset/data/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf b/test/subset/data/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf
new file mode 100644 (file)
index 0000000..cdccded
Binary files /dev/null and b/test/subset/data/fonts/NotoColorEmoji.subset.multiple_size_tables.ttf differ
diff --git a/test/subset/data/fonts/NotoColorEmoji.subset.ttf b/test/subset/data/fonts/NotoColorEmoji.subset.ttf
new file mode 100644 (file)
index 0000000..14a544a
Binary files /dev/null and b/test/subset/data/fonts/NotoColorEmoji.subset.ttf differ
diff --git a/test/subset/data/fonts/SourceSerifVariable-Roman.ttf b/test/subset/data/fonts/SourceSerifVariable-Roman.ttf
new file mode 100644 (file)
index 0000000..4a73845
Binary files /dev/null and b/test/subset/data/fonts/SourceSerifVariable-Roman.ttf differ
diff --git a/test/subset/data/fonts/TwemojiMozilla.subset.ttf b/test/subset/data/fonts/TwemojiMozilla.subset.ttf
new file mode 100644 (file)
index 0000000..357dda3
Binary files /dev/null and b/test/subset/data/fonts/TwemojiMozilla.subset.ttf differ
diff --git a/test/subset/data/fonts/cmap14_font2.otf b/test/subset/data/fonts/cmap14_font2.otf
new file mode 100644 (file)
index 0000000..4a7da80
Binary files /dev/null and b/test/subset/data/fonts/cmap14_font2.otf differ
diff --git a/test/subset/data/fonts/gpos4_multiple_anchors_1.otf b/test/subset/data/fonts/gpos4_multiple_anchors_1.otf
new file mode 100644 (file)
index 0000000..e77cbb6
Binary files /dev/null and b/test/subset/data/fonts/gpos4_multiple_anchors_1.otf differ
diff --git a/test/subset/data/fonts/gpos6_font1.otf b/test/subset/data/fonts/gpos6_font1.otf
new file mode 100644 (file)
index 0000000..fd640ac
Binary files /dev/null and b/test/subset/data/fonts/gpos6_font1.otf differ
diff --git a/test/subset/data/fonts/gpos_chaining1_multiple_subrules_f1.otf b/test/subset/data/fonts/gpos_chaining1_multiple_subrules_f1.otf
new file mode 100644 (file)
index 0000000..721115e
Binary files /dev/null and b/test/subset/data/fonts/gpos_chaining1_multiple_subrules_f1.otf differ
diff --git a/test/subset/data/fonts/gpos_chaining2_multiple_subrules_f1.otf b/test/subset/data/fonts/gpos_chaining2_multiple_subrules_f1.otf
new file mode 100644 (file)
index 0000000..ef7f635
Binary files /dev/null and b/test/subset/data/fonts/gpos_chaining2_multiple_subrules_f1.otf differ
diff --git a/test/subset/data/fonts/gpos_chaining3_simple_f1.otf b/test/subset/data/fonts/gpos_chaining3_simple_f1.otf
new file mode 100644 (file)
index 0000000..b6f1863
Binary files /dev/null and b/test/subset/data/fonts/gpos_chaining3_simple_f1.otf differ
diff --git a/test/subset/data/fonts/gpos_context1_multiple_subrules_f1.otf b/test/subset/data/fonts/gpos_context1_multiple_subrules_f1.otf
new file mode 100644 (file)
index 0000000..fc84d1f
Binary files /dev/null and b/test/subset/data/fonts/gpos_context1_multiple_subrules_f1.otf differ
diff --git a/test/subset/data/fonts/gpos_context2_multiple_subrules_f1.otf b/test/subset/data/fonts/gpos_context2_multiple_subrules_f1.otf
new file mode 100644 (file)
index 0000000..c5afd3e
Binary files /dev/null and b/test/subset/data/fonts/gpos_context2_multiple_subrules_f1.otf differ
diff --git a/test/subset/data/fonts/gpos_context3_simple_f1.otf b/test/subset/data/fonts/gpos_context3_simple_f1.otf
new file mode 100644 (file)
index 0000000..fad7550
Binary files /dev/null and b/test/subset/data/fonts/gpos_context3_simple_f1.otf differ
diff --git a/test/subset/data/fonts/gsub_alternate_substitution.otf b/test/subset/data/fonts/gsub_alternate_substitution.otf
new file mode 100644 (file)
index 0000000..188b8e8
Binary files /dev/null and b/test/subset/data/fonts/gsub_alternate_substitution.otf differ
diff --git a/test/subset/data/fonts/sbix.ttf b/test/subset/data/fonts/sbix.ttf
new file mode 100644 (file)
index 0000000..575af90
Binary files /dev/null and b/test/subset/data/fonts/sbix.ttf differ
diff --git a/test/subset/data/profiles/gids.txt b/test/subset/data/profiles/gids.txt
new file mode 100644 (file)
index 0000000..4fa4f6e
--- /dev/null
@@ -0,0 +1 @@
+--gids=1,2,3
diff --git a/test/subset/data/profiles/keep-gdef-gpos.txt b/test/subset/data/profiles/keep-gdef-gpos.txt
new file mode 100644 (file)
index 0000000..071f341
--- /dev/null
@@ -0,0 +1 @@
+--drop-tables-=GDEF,GPOS
diff --git a/test/subset/data/profiles/keep-gdef.txt b/test/subset/data/profiles/keep-gdef.txt
new file mode 100644 (file)
index 0000000..4252d67
--- /dev/null
@@ -0,0 +1 @@
+--drop-tables-=GDEF
diff --git a/test/subset/data/profiles/name-languages.txt b/test/subset/data/profiles/name-languages.txt
new file mode 100644 (file)
index 0000000..1a6f933
--- /dev/null
@@ -0,0 +1 @@
+--name-languages=*
diff --git a/test/subset/data/profiles/name-legacy.txt b/test/subset/data/profiles/name-legacy.txt
new file mode 100644 (file)
index 0000000..1867445
--- /dev/null
@@ -0,0 +1 @@
+--name-legacy
index 772f33c..c5aa136 100644 (file)
@@ -1,6 +1,7 @@
 FONTS:
 Roboto-Regular.abc.ttf
 Comfortaa-Regular-new.ttf
+NanumMyeongjo-Regular-subset.ttf
 
 PROFILES:
 default.txt
@@ -8,6 +9,9 @@ drop-hints.txt
 drop-hints-retain-gids.txt
 retain-gids.txt
 name-ids.txt
+name-languages.txt
+name-legacy.txt
+gids.txt
 
 SUBSETS:
 abc
diff --git a/test/subset/data/tests/cbdt.tests b/test/subset/data/tests/cbdt.tests
new file mode 100644 (file)
index 0000000..5e74fef
--- /dev/null
@@ -0,0 +1,20 @@
+FONTS:
+NotoColorEmoji.subset.ttf
+NotoColorEmoji.subset.index_format3.ttf
+NotoColorEmoji.subset.multiple_size_tables.ttf
+NotoColorEmoji.subset.gap.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+drop-hints-retain-gids.txt
+retain-gids.txt
+
+SUBSETS:
+89®⁉8⃣
+8®⁉
+8⁉
+9
+⁉
+8⃣
diff --git a/test/subset/data/tests/cmap.tests b/test/subset/data/tests/cmap.tests
new file mode 100644 (file)
index 0000000..7d5cba7
--- /dev/null
@@ -0,0 +1,16 @@
+FONTS:
+AdobeBlank-Regular.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+drop-hints-retain-gids.txt
+retain-gids.txt
+name-ids.txt
+
+SUBSETS:
+ﻺ
+ﻹﻺ
+ﻦﻏ
+ab
+aﻺ
index 6575870..0ed4fb8 100644 (file)
@@ -1,5 +1,6 @@
 FONTS:
 cmap14_font1.otf
+cmap14_font2.otf
 
 PROFILES:
 default.txt
@@ -7,6 +8,7 @@ drop-hints.txt
 drop-hints-retain-gids.txt
 retain-gids.txt
 name-ids.txt
+gids.txt
 
 SUBSETS:
 一丂七
diff --git a/test/subset/data/tests/colr.tests b/test/subset/data/tests/colr.tests
new file mode 100644 (file)
index 0000000..5da60b6
--- /dev/null
@@ -0,0 +1,17 @@
+FONTS:
+TwemojiMozilla.subset.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+drop-hints-retain-gids.txt
+retain-gids.txt
+
+SUBSETS:
+2
+㊗
+㊙
+2㊗
+2㊙
+㊗㊙
+2㊗㊙
index 225bb48..d9519b6 100644 (file)
@@ -1,5 +1,6 @@
 FONTS:
 Roboto-Regular.ttf
+SourceSerifVariable-Roman.ttf
 
 PROFILES:
 default.txt
index 5a04380..28264ad 100644 (file)
@@ -4,6 +4,7 @@ Mplus1p-Regular.ttf
 PROFILES:
 default.txt
 drop-hints.txt
+keep-gdef.txt
 
 SUBSETS:
 明
@@ -11,6 +12,7 @@ acek
 明極珠度輸清
 あいうえおか
 あいう珠度輸
-
+𝜕𝟘AB
+𥝱
 
 
diff --git a/test/subset/data/tests/layout.gpos.tests b/test/subset/data/tests/layout.gpos.tests
deleted file mode 100644 (file)
index 2d0f936..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-FONTS:
-gpos1_2_font.otf
-
-PROFILES:
-keep-layout-retain-gids.txt
-
-SUBSETS:
-AC
-CF
-AF
-*
diff --git a/test/subset/data/tests/layout.gpos2.tests b/test/subset/data/tests/layout.gpos2.tests
deleted file mode 100644 (file)
index 94fe78a..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-FONTS:
-gpos2_1_font7.otf
-gpos2_2_font5.otf
-
-PROFILES:
-keep-layout.txt
-keep-layout-retain-gids.txt
-
-SUBSETS:
-!#
-!#%
-*
diff --git a/test/subset/data/tests/layout.gpos3.tests b/test/subset/data/tests/layout.gpos3.tests
deleted file mode 100644 (file)
index 409272f..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-FONTS:
-gpos3_font3.otf
-
-PROFILES:
-keep-layout.txt
-keep-layout-retain-gids.txt
-
-SUBSETS:
-()
-(+
-)+
-*
diff --git a/test/subset/data/tests/layout.gsub6.tests b/test/subset/data/tests/layout.gsub6.tests
deleted file mode 100644 (file)
index 47399b8..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-FONTS:
-gsub_chaining1_multiple_subrules_f1.otf
-gsub_chaining2_multiple_subrules_f1.otf
-gsub_chaining3_simple_f2.otf
-
-PROFILES:
-keep-layout.txt
-keep-layout-retain-gids.txt
-
-SUBSETS:
-0123
-*
diff --git a/test/subset/data/tests/layout.tests b/test/subset/data/tests/layout.tests
deleted file mode 100644 (file)
index dd1c26e..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-FONTS:
-Roboto-Regular.smallcaps.ttf
-
-PROFILES:
-keep-layout.txt
-keep-layout-retain-gids.txt
-
-SUBSETS:
-ABC
-AC
-C
-A
-ÊË
diff --git a/test/subset/data/tests/sbix.tests b/test/subset/data/tests/sbix.tests
new file mode 100644 (file)
index 0000000..2796873
--- /dev/null
@@ -0,0 +1,13 @@
+FONTS:
+sbix.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+drop-hints-retain-gids.txt
+retain-gids.txt
+
+SUBSETS:
+X
+Y
+XY
diff --git a/test/subset/meson.build b/test/subset/meson.build
new file mode 100644 (file)
index 0000000..a75b8f7
--- /dev/null
@@ -0,0 +1,44 @@
+tests = [
+  'basics',
+  'full-font',
+  'cff-full-font',
+  'japanese',
+  'cff-japanese',
+  'layout',
+  'layout.gpos',
+  'layout.gpos2',
+  'layout.gpos3',
+  'layout.gpos4',
+  'layout.gpos6',
+  'layout.gsub3',
+  'layout.gsub6',
+  'layout.gdef',
+  'cmap',
+  'cmap14',
+  'sbix',
+  'colr',
+  'cbdt',
+]
+
+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,
+      meson.current_source_dir() / 'data' / 'tests' / fname,
+    ],
+    # as the tests are ran concurrently let's raise acceptable time here
+    # ideally better to break and let meson handles them in parallel
+    timeout: 500,
+    workdir: meson.current_build_dir() / '..' / '..',
+    suite: ['subset'],
+  )
+endforeach
index 5d221e6..f32a4fa 100755 (executable)
@@ -1,49 +1,31 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Runs a subsetting test suite. Compares the results of subsetting via harfbuzz
 # to subsetting via fonttools.
 
-from __future__ import print_function, division, absolute_import
-
-import io
 from difflib import unified_diff
 import os
 import re
 import subprocess
 import sys
 import tempfile
+import shutil
 
 from subset_test_suite import SubsetTestSuite
 
-# https://stackoverflow.com/a/377028
-def which (program):
-       def is_exe (fpath):
-               return os.path.isfile (fpath) and os.access (fpath, os.X_OK)
-
-       fpath, _ = os.path.split (program)
-       if fpath:
-               if is_exe (program):
-                       return program
-       else:
-               for path in os.environ["PATH"].split (os.pathsep):
-                       exe_file = os.path.join (path, program)
-                       if is_exe (exe_file):
-                               return exe_file
-
-       return None
-
-fonttools = which ("fonttools")
-ots_sanitize = which ("ots-sanitize")
+fonttools = shutil.which ("fonttools")
+ots_sanitize = shutil.which ("ots-sanitize")
 
 if not fonttools:
        print ("fonttools is not present, skipping test.")
        sys.exit (77)
 
-def cmd(command):
+def cmd (command):
        p = subprocess.Popen (
-               command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+               command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+               universal_newlines=True)
        (stdoutdata, stderrdata) = p.communicate ()
-       print (stderrdata, end="") # file=sys.stderr
+       print (stderrdata, end="", file=sys.stderr)
        return stdoutdata, p.returncode
 
 def read_binary (file_path):
@@ -67,7 +49,8 @@ def run_test (test, should_check_ots):
                    "--font-file=" + test.font_path,
                    "--output-file=" + out_file,
                    "--unicodes=%s" % test.unicodes (),
-                   "--drop-tables+=DSIG,GPOS,GSUB,GDEF,gvar,avar,MVAR,HVAR"]
+                   "--drop-tables+=DSIG,GPOS,GSUB,GDEF",
+                    "--drop-tables-=sbix"]
        cli_args.extend (test.get_profile_flags ())
        print (' '.join (cli_args))
        _, return_code = cmd (cli_args)
@@ -75,21 +58,39 @@ def run_test (test, should_check_ots):
        if return_code:
                return fail_test (test, cli_args, "%s returned %d" % (' '.join (cli_args), return_code))
 
-       expected_ttx, return_code = run_ttx (os.path.join (test_suite.get_output_directory (),
-                                            test.get_font_name ()))
+       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, return_code = run_ttx (out_file)
+       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 = strip_check_sum (expected_ttx)
-       actual_ttx = strip_check_sum (actual_ttx)
+       expected_ttx_text = strip_check_sum (expected_ttx_text)
+       actual_ttx_text = strip_check_sum (actual_ttx_text)
 
-       if not actual_ttx == expected_ttx:
-               for line in unified_diff (expected_ttx.splitlines (1), actual_ttx.splitlines (1)):
+       if not actual_ttx_text == expected_ttx_text:
+               for line in unified_diff (expected_ttx_text.splitlines (1), actual_ttx_text.splitlines (1)):
                        sys.stdout.write (line)
                sys.stdout.flush ()
                return fail_test (test, cli_args, 'ttx for expected and actual does not match.')
@@ -101,14 +102,14 @@ def run_test (test, should_check_ots):
 
        return 0
 
-def run_ttx (file):
-       print ("fonttools ttx %s" % file)
-       return cmd ([fonttools, "ttx", "-q", "-o-", file])
+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.decode ("utf-8"), count=1)
+                      ttx_string, count=1)
 
 def has_ots ():
        if not ots_sanitize:
@@ -119,32 +120,29 @@ def has_ots ():
 def check_ots (path):
        ots_report, returncode = cmd ([ots_sanitize, path])
        if returncode:
-               print("OTS Failure: %s" % ots_report);
+               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]):
-       print ("First argument does not seem to point to usable hb-subset.")
-       sys.exit (1)
+       sys.exit ("First argument does not seem to point to usable hb-subset.")
 hb_subset, args = args[0], args[1:]
 
 if not len (args):
-       print ("No tests supplied.")
-       sys.exit (1)
+       sys.exit ("No tests supplied.")
 
 has_ots = has_ots()
 
 fails = 0
 for path in args:
-       with io.open (path, mode="r", encoding="utf-8") as f:
+       with open (path, mode="r", encoding="utf-8") as f:
                print ("Running tests in " + path)
                test_suite = SubsetTestSuite (path, f.read ())
                for test in test_suite.tests ():
                        fails += run_test (test, has_ots)
 
 if fails != 0:
-       print (str (fails) + " test(s) failed.")
-       sys.exit(1)
+       sys.exit ("%d test(s) failed." % fails)
 else:
        print ("All tests passed.")
index 47664d0..b7fd105 100644 (file)
@@ -1,6 +1,5 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
-import io
 import os
 
 # A single test in a subset test suite. Identifies a font
@@ -18,8 +17,8 @@ class Test:
                        return ",".join("%X" % ord(c) for (i, c) in enumerate(self.subset))
 
        def get_profile_flags(self):
-               with io.open(self.profile_path, mode="r", encoding="utf-8") as f:
-                   return f.read().splitlines();
+               with open (self.profile_path, mode="r", encoding="utf-8") as f:
+                   return f.read().splitlines()
 
        def get_font_name(self):
                font_base_name = os.path.basename(self.font_path)
index 5298e77..29f6909 100644 (file)
@@ -6,6 +6,8 @@ CLEANFILES =
 DISTCLEANFILES =
 MAINTAINERCLEANFILES =
 
+EXTRA_DIST += meson.build
+
 include Makefile.sources
 
 # Convenience targets:
index d8f7b32..fae6cf2 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# 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,
@@ -390,6 +390,8 @@ 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@
@@ -446,7 +448,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
-EXTRA_DIST = 
+EXTRA_DIST = meson.build
 CLEANFILES = 
 DISTCLEANFILES = 
 MAINTAINERCLEANFILES = 
index 58df0a6..80b3704 100644 (file)
@@ -229,7 +229,7 @@ block_best (const biimage_t &bi, bool *inverse)
   assert (bi.width  <= CELL_W);
   assert (bi.height <= CELL_H);
 
-  unsigned int score = (unsigned int) -1;
+  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};
@@ -279,7 +279,7 @@ block_best (const biimage_t &bi, bool *inverse)
 
   /* Find best lower line */
   if (1) {
-    unsigned int best_s = (unsigned int) -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++)
@@ -311,7 +311,7 @@ block_best (const biimage_t &bi, bool *inverse)
 
   /* Find best left line */
   if (1) {
-    unsigned int best_s = (unsigned int) -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++)
index 008e4e6..253e48a 100644 (file)
@@ -65,7 +65,7 @@ struct subset_consumer_t
       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)) != nullptr);
+    } while ((c = g_utf8_find_next_char(c, text + text_len)));
   }
 
   hb_bool_t
@@ -74,7 +74,7 @@ struct subset_consumer_t
     const char* data = hb_blob_get_data (blob, &data_length);
 
     FILE *fp_out = fopen(output_file, "wb");
-    if (fp_out == nullptr) {
+    if (!fp_out) {
       fprintf(stderr, "Unable to open output file\n");
       return false;
     }
diff --git a/util/meson.build b/util/meson.build
new file mode 100644 (file)
index 0000000..59fde47
--- /dev/null
@@ -0,0 +1,65 @@
+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',
+]
+
+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,
+      link_with: [libharfbuzz],
+      install: true,
+    )
+  endif
+
+  hb_shape = executable('hb-shape', hb_shape_sources,
+    cpp_args: cpp_args,
+    include_directories: [incconfig, incsrc],
+    dependencies: deps,
+    link_with: [libharfbuzz],
+    install: true,
+  )
+
+  hb_subset = executable('hb-subset', hb_subset_cli_sources,
+    cpp_args: cpp_args,
+    include_directories: [incconfig, incsrc],
+    dependencies: deps,
+    link_with: [libharfbuzz, libharfbuzz_subset],
+    install: true,
+  )
+
+  hb_ot_shape_closure = executable('hb-ot-shape-closure', hb_ot_shape_closure_sources,
+    cpp_args: cpp_args,
+    include_directories: [incconfig, incsrc],
+    dependencies: deps,
+    link_with: [libharfbuzz],
+    install: true,
+  )
+else
+  # Disable tests that use this
+  hb_shape = disabler()
+  hb_subset = disabler()
+endif
index 35fa05e..9c3954c 100644 (file)
 #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,
@@ -85,6 +145,62 @@ parse_nameids (const char *name,
 }
 
 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,
@@ -128,8 +244,11 @@ subset_options_t::add_options (option_parser_t *parser)
   {
     {"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."},
index 43ff90a..ee09ac5 100644 (file)
@@ -116,7 +116,7 @@ pre_parse (GOptionContext *context G_GNUC_UNUSED,
 {
   option_group_t *option_group = (option_group_t *) data;
   option_group->pre_parse (error);
-  return *error == nullptr;
+  return !*error;
 }
 
 static gboolean
@@ -127,7 +127,7 @@ post_parse (GOptionContext *context G_GNUC_UNUSED,
 {
   option_group_t *option_group = static_cast<option_group_t *>(data);
   option_group->post_parse (error);
-  return *error == nullptr;
+  return !*error;
 }
 
 void
@@ -152,16 +152,40 @@ option_parser_t::parse (int *argc, char ***argv)
   GError *parse_error = nullptr;
   if (!g_option_context_parse (context, argc, argv, &parse_error))
   {
-    if (parse_error != nullptr) {
+    if (parse_error)
+    {
       fail (true, "%s", parse_error->message);
       //g_error_free (parse_error);
-    } else
+    }
+    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,
@@ -372,7 +396,7 @@ parse_unicodes (const char *name G_GNUC_UNUSED,
       {
        g_string_free (gs, TRUE);
        g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "Failed parsing Unicode values at: '%s'", s);
+                    "Failed parsing Unicode values at: '%s'", s);
        return false;
       }
 
@@ -397,6 +421,7 @@ view_options_t::add_options (option_parser_t *parser)
     {"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}
   };
@@ -624,7 +649,7 @@ output_options_t::add_options (option_parser_t *parser)
 {
   const char *text;
 
-  if (nullptr == supported_formats)
+  if (!supported_formats)
     text = "Set output serialization format";
   else
   {
@@ -746,7 +771,7 @@ text_options_t::get_line (unsigned int *len)
       line = text;
       line_len = text_len;
     }
-    if (line_len == (unsigned int) -1)
+    if (line_len == UINT_MAX)
       line_len = strlen (line);
 
     if (!line_len) {
@@ -915,7 +940,7 @@ format_options_t::serialize_glyphs (hb_buffer_t *buffer,
 
   while (start < num_glyphs)
   {
-    char buf[1024];
+    char buf[32768];
     unsigned int consumed;
     start += hb_buffer_serialize_glyphs (buffer, start, num_glyphs,
                                         buf, sizeof (buf), &consumed,
index 9e22b40..2c10578 100644 (file)
@@ -125,6 +125,8 @@ struct view_options_t : option_group_t
     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);
@@ -141,6 +143,10 @@ struct view_options_t : option_group_t
   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;
@@ -517,7 +523,7 @@ struct text_options_t : option_group_t
     fp = nullptr;
     gs = nullptr;
     line = nullptr;
-    line_len = (unsigned int) -1;
+    line_len = UINT_MAX;
 
     add_options (parser);
   }
index e8e334b..0db3306 100644 (file)
@@ -40,17 +40,25 @@ view_cairo_t::render (const font_options_t *font_opts)
   int y_sign = font_opts->font_size_y < 0 ? -1 : +1;
 
   hb_font_t *font = font_opts->get_font();
-  hb_font_extents_t extents;
-  hb_font_get_extents_for_direction (font, direction, &extents);
 
-  double ascent = y_sign * scalbn ((double) extents.ascender, scale_bits);
-  double descent = y_sign * -scalbn ((double) extents.descender, scale_bits);
-  double font_height = y_sign * scalbn ((double) extents.ascender - extents.descender + extents.line_gap, scale_bits);
-  double leading = font_height + view_options.line_space;
+  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 - view_options.line_space;
+  (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);
@@ -79,8 +87,7 @@ view_cairo_t::render (const font_options_t *font_opts)
   cairo_translate (cr, view_options.margin.l, view_options.margin.t);
   if (vertical)
     cairo_translate (cr,
-                    w /* We stack lines right to left */
-                    -font_height * .5 /* "ascent" for vertical */,
+                    w - ascent, /* We currently always stack lines right to left */
                     y_sign < 0 ? h : 0);
   else
    {