Imported Upstream version 1.7.6 upstream/1.7.6
authorYoungbok Shin <youngb.shin@samsung.com>
Tue, 3 Apr 2018 05:01:34 +0000 (14:01 +0900)
committerYoungbok Shin <youngb.shin@samsung.com>
Tue, 3 Apr 2018 05:01:34 +0000 (14:01 +0900)
917 files changed:
BUILD.md
CMakeLists.txt
ChangeLog
INSTALL
Makefile.am
Makefile.in
NEWS
README
RELEASING.md [new file with mode: 0644]
TODO
aclocal.m4
ar-lib
autogen.sh
compile
config.guess
config.h.in
config.sub
configure
configure.ac
depcomp
docs/HarfBuzz.png
docs/HarfBuzz.svg [new file with mode: 0644]
docs/Makefile.am
docs/Makefile.in
docs/harfbuzz-docs.xml
docs/harfbuzz-sections.txt
docs/harfbuzz.types
docs/html/HarfBuzz.png
docs/html/HarfBuzz.svg [new file with mode: 0644]
docs/html/a-clustering-example-for-levels-0-and-1.html
docs/html/adding-text-to-the-buffer.html
docs/html/annotation-glossary.html
docs/html/api-index-0-9-10.html
docs/html/api-index-0-9-11.html
docs/html/api-index-0-9-2.html
docs/html/api-index-0-9-20.html
docs/html/api-index-0-9-22.html
docs/html/api-index-0-9-28.html
docs/html/api-index-0-9-30.html
docs/html/api-index-0-9-31.html
docs/html/api-index-0-9-38.html
docs/html/api-index-0-9-39.html
docs/html/api-index-0-9-41.html
docs/html/api-index-0-9-42.html
docs/html/api-index-0-9-5.html
docs/html/api-index-0-9-7.html
docs/html/api-index-0-9-8.html
docs/html/api-index-1-0-5.html
docs/html/api-index-1-1-2.html
docs/html/api-index-1-1-3.html
docs/html/api-index-1-2-3.html
docs/html/api-index-1-3-3.html
docs/html/api-index-1-4-2.html [new file with mode: 0644]
docs/html/api-index-1-4-3.html [new file with mode: 0644]
docs/html/api-index-1-5-0.html [new file with mode: 0644]
docs/html/api-index-1-6-0.html [new file with mode: 0644]
docs/html/api-index-full.html
docs/html/buffers-language-script-and-direction.html
docs/html/building.html
docs/html/ch08.html
docs/html/clusters.html
docs/html/customizing-unicode-functions.html
docs/html/deprecated-api-index.html
docs/html/fonts-and-faces.html
docs/html/harfbuzz-Buffers.html
docs/html/harfbuzz-Shaping.html
docs/html/harfbuzz-hb-blob.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-ot-font.html
docs/html/harfbuzz-hb-ot-layout.html
docs/html/harfbuzz-hb-ot-math.html
docs/html/harfbuzz-hb-ot-shape.html
docs/html/harfbuzz-hb-ot-tag.html
docs/html/harfbuzz-hb-ot.html
docs/html/harfbuzz-hb-set.html
docs/html/harfbuzz-hb-shape-plan.html
docs/html/harfbuzz-hb-unicode.html
docs/html/harfbuzz-hb-uniscribe.html
docs/html/harfbuzz-hb-version.html
docs/html/harfbuzz-hb.html
docs/html/harfbuzz.devhelp2
docs/html/hello-harfbuzz.html
docs/html/index.html
docs/html/install-harfbuzz.html
docs/html/level-2.html
docs/html/object-tree.html
docs/html/plans-and-caching.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/style.css
docs/html/the-distinction-between-levels-0-and-1.html
docs/html/using-harfbuzzs-native-opentype-implementation.html
docs/html/using-your-own-font-functions.html
docs/html/what-about-the-other-scripts.html
docs/html/what-is-harfbuzz.html
docs/html/why-is-it-called-harfbuzz.html
docs/usermanual-buffers-language-script-and-direction.xml
docs/usermanual-clusters.xml
docs/usermanual-fonts-and-faces.xml
docs/usermanual-hello-harfbuzz.xml
docs/usermanual-install-harfbuzz.xml
docs/usermanual-what-is-harfbuzz.xml
docs/version.xml
gtk-doc.make
harfbuzz.doap
install-sh
ltmain.sh
m4/ax_code_coverage.m4 [new file with mode: 0644]
m4/ax_pthread.m4
m4/libtool.m4
m4/ltoptions.m4
m4/ltsugar.m4
m4/ltversion.m4
m4/lt~obsolete.m4
missing
replace-enum-strings.cmake [new file with mode: 0644]
src/Makefile.am
src/Makefile.in
src/Makefile.sources
src/check-c-linkage-decls.sh
src/check-defs.sh [deleted file]
src/check-externs.sh [new file with mode: 0755]
src/check-header-guards.sh
src/check-includes.sh
src/check-libstdc++.sh
src/check-static-inits.sh
src/check-symbols.sh
src/dump-indic-data.cc [new file with mode: 0644]
src/dump-khmer-data.cc [new file with mode: 0644]
src/dump-myanmar-data.cc [new file with mode: 0644]
src/dump-use-data.cc [new file with mode: 0644]
src/gen-arabic-table.py
src/gen-def.py [new file with mode: 0755]
src/gen-indic-table.py
src/gen-use-table.py
src/harfbuzz-config.cmake.in [new file with mode: 0644]
src/harfbuzz-subset.pc.in [new file with mode: 0644]
src/harfbuzz.pc.in
src/hb-aat-layout-ankr-table.hh [new file with mode: 0644]
src/hb-aat-layout-common-private.hh [new file with mode: 0644]
src/hb-aat-layout-kerx-table.hh [new file with mode: 0644]
src/hb-aat-layout-morx-table.hh [new file with mode: 0644]
src/hb-aat-layout-private.hh [new file with mode: 0644]
src/hb-aat-layout-trak-table.hh [new file with mode: 0644]
src/hb-aat-layout.cc [new file with mode: 0644]
src/hb-atomic-private.hh
src/hb-blob.cc
src/hb-blob.h
src/hb-buffer-deserialize-json.hh
src/hb-buffer-deserialize-json.rl
src/hb-buffer-deserialize-text.hh
src/hb-buffer-deserialize-text.rl
src/hb-buffer-private.hh
src/hb-buffer-serialize.cc
src/hb-buffer.cc
src/hb-buffer.h
src/hb-cache-private.hh [deleted file]
src/hb-common.cc
src/hb-common.h
src/hb-coretext.cc
src/hb-coretext.h
src/hb-debug.hh [new file with mode: 0644]
src/hb-deprecated.h
src/hb-directwrite.cc
src/hb-dsalgs.hh [new file with mode: 0644]
src/hb-face-private.hh
src/hb-face.cc
src/hb-face.h
src/hb-fallback-shape.cc
src/hb-font-private.hh
src/hb-font.cc
src/hb-font.h
src/hb-ft.cc
src/hb-ft.h
src/hb-glib.cc
src/hb-gobject-enums.h.tmpl
src/hb-gobject-structs.cc
src/hb-gobject-structs.h
src/hb-graphite2.cc
src/hb-icu.cc
src/hb-mutex-private.hh
src/hb-object-private.hh
src/hb-open-file-private.hh
src/hb-open-type-private.hh
src/hb-ot-cmap-table.hh
src/hb-ot-color-cbdt-table.hh [moved from src/hb-ot-cbdt-table.hh with 70% similarity]
src/hb-ot-color-colr-table.hh [new file with mode: 0644]
src/hb-ot-color-cpal-table.hh [new file with mode: 0644]
src/hb-ot-color.cc [new file with mode: 0644]
src/hb-ot-font.cc
src/hb-ot-glyf-table.hh
src/hb-ot-hdmx-table.hh [new file with mode: 0644]
src/hb-ot-head-table.hh
src/hb-ot-hhea-table.hh
src/hb-ot-hmtx-table.hh
src/hb-ot-kern-table.hh [new file with mode: 0644]
src/hb-ot-layout-base-table.hh [new file with mode: 0644]
src/hb-ot-layout-common-private.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-private.hh
src/hb-ot-layout-jstf-table.hh
src/hb-ot-layout-private.hh
src/hb-ot-layout.cc
src/hb-ot-layout.h
src/hb-ot-map-private.hh
src/hb-ot-map.cc
src/hb-ot-math-table.hh
src/hb-ot-maxp-table.hh
src/hb-ot-name-table.hh
src/hb-ot-os2-table.hh
src/hb-ot-os2-unicode-ranges.hh [new file with mode: 0644]
src/hb-ot-post-macroman.hh [new file with mode: 0644]
src/hb-ot-post-table.hh
src/hb-ot-shape-complex-arabic-fallback.hh
src/hb-ot-shape-complex-arabic-table.hh
src/hb-ot-shape-complex-arabic-win1256.hh
src/hb-ot-shape-complex-arabic.cc
src/hb-ot-shape-complex-default.cc
src/hb-ot-shape-complex-hangul.cc
src/hb-ot-shape-complex-hebrew.cc
src/hb-ot-shape-complex-indic-machine.hh
src/hb-ot-shape-complex-indic-machine.rl
src/hb-ot-shape-complex-indic-private.hh
src/hb-ot-shape-complex-indic-table.cc
src/hb-ot-shape-complex-indic.cc
src/hb-ot-shape-complex-khmer-machine.hh [new file with mode: 0644]
src/hb-ot-shape-complex-khmer-machine.rl [new file with mode: 0644]
src/hb-ot-shape-complex-khmer-private.hh [new file with mode: 0644]
src/hb-ot-shape-complex-khmer.cc [new file with mode: 0644]
src/hb-ot-shape-complex-myanmar-machine.hh
src/hb-ot-shape-complex-myanmar-machine.rl
src/hb-ot-shape-complex-myanmar-private.hh [new file with mode: 0644]
src/hb-ot-shape-complex-myanmar.cc
src/hb-ot-shape-complex-private.hh
src/hb-ot-shape-complex-thai.cc
src/hb-ot-shape-complex-tibetan.cc
src/hb-ot-shape-complex-use-machine.hh
src/hb-ot-shape-complex-use-machine.rl
src/hb-ot-shape-complex-use-private.hh
src/hb-ot-shape-complex-use-table.cc
src/hb-ot-shape-complex-use.cc
src/hb-ot-shape-fallback.cc
src/hb-ot-shape-normalize.cc
src/hb-ot-shape-private.hh
src/hb-ot-shape.cc
src/hb-ot-tag.cc
src/hb-ot-var-avar-table.hh
src/hb-ot-var-fvar-table.hh
src/hb-ot-var-hvar-table.hh
src/hb-ot-var-mvar-table.hh
src/hb-ot-var.cc
src/hb-private.hh
src/hb-set-digest-private.hh [new file with mode: 0644]
src/hb-set-private.hh
src/hb-set.cc
src/hb-set.h
src/hb-shape-plan.cc
src/hb-shape.cc
src/hb-shaper-private.hh
src/hb-shaper.cc
src/hb-string-array.hh [new file with mode: 0644]
src/hb-subset-glyf.cc [new file with mode: 0644]
src/hb-subset-glyf.hh [new file with mode: 0644]
src/hb-subset-input.cc [new file with mode: 0644]
src/hb-subset-plan.cc [new file with mode: 0644]
src/hb-subset-plan.hh [new file with mode: 0644]
src/hb-subset-private.hh [new file with mode: 0644]
src/hb-subset.cc [new file with mode: 0644]
src/hb-subset.h [new file with mode: 0644]
src/hb-ucdn.cc
src/hb-ucdn/Makefile.in
src/hb-ucdn/Makefile.sources
src/hb-ucdn/README
src/hb-ucdn/ucdn.c
src/hb-ucdn/ucdn.h
src/hb-ucdn/ucdn_db.h [moved from src/hb-ucdn/unicodedata_db.h with 64% similarity]
src/hb-unicode-private.hh
src/hb-unicode.cc
src/hb-uniscribe.cc
src/hb-utf-private.hh
src/hb-version.h
src/main.cc
src/test-buffer-serialize.cc
src/test-size-params.cc
src/test-unicode-ranges.cc [new file with mode: 0644]
src/test-would-substitute.cc
src/test.cc
test-driver
test/CMakeLists.txt [new file with mode: 0644]
test/Makefile.am
test/Makefile.in
test/api/CMakeLists.txt [new file with mode: 0644]
test/api/Makefile.am
test/api/Makefile.in
test/api/fonts/Inconsolata-Regular.ab.ttf [new file with mode: 0644]
test/api/fonts/Inconsolata-Regular.abc.ttf [new file with mode: 0644]
test/api/fonts/Inconsolata-Regular.abc.widerc.ttf [new file with mode: 0644]
test/api/fonts/Inconsolata-Regular.ac.ttf [new file with mode: 0644]
test/api/fonts/Inconsolata-Regular.ac.widerc.ttf [new file with mode: 0644]
test/api/fonts/MathTestFontFull.ttx [new file with mode: 0644]
test/api/fonts/README [new file with mode: 0644]
test/api/fonts/Roboto-Regular.abc.cmap-format12-only.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular.abc.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular.ac.cmap-format12-only.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular.ac.nohints.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular.ac.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular.b.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular.components.1fc.nohints.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular.components.subset.ttf [new file with mode: 0644]
test/api/fonts/Roboto-Regular.components.ttf [new file with mode: 0644]
test/api/hb-subset-test.h [new file with mode: 0644]
test/api/hb-test.h
test/api/test-blob.c
test/api/test-buffer.c
test/api/test-c.c
test/api/test-ot-color.c [new file with mode: 0644]
test/api/test-ot-tag.c
test/api/test-set.c
test/api/test-subset-cmap.c [new file with mode: 0644]
test/api/test-subset-glyf.c [new file with mode: 0644]
test/api/test-subset-hdmx.c [new file with mode: 0644]
test/api/test-subset-hmtx.c [new file with mode: 0644]
test/api/test-subset-os2.c [new file with mode: 0644]
test/fuzzing/CMakeLists.txt [new file with mode: 0644]
test/fuzzing/Makefile.am
test/fuzzing/Makefile.in
test/fuzzing/README
test/fuzzing/run-fuzzer-tests.py [new file with mode: 0755]
test/shaping/CMakeLists.txt [new file with mode: 0644]
test/shaping/Makefile.am
test/shaping/Makefile.in
test/shaping/README.md
test/shaping/data/Makefile.am [new file with mode: 0644]
test/shaping/data/Makefile.in [moved from win32/Makefile.in with 57% similarity]
test/shaping/data/in-house/COPYING [new file with mode: 0644]
test/shaping/data/in-house/Makefile.am [new file with mode: 0644]
test/shaping/data/in-house/Makefile.in [new file with mode: 0644]
test/shaping/data/in-house/Makefile.sources [new file with mode: 0644]
test/shaping/data/in-house/fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf [moved from test/shaping/fonts/sha1sum/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf with 100% similarity]
test/shaping/data/in-house/fonts/051d92f8bc6ff724511b296c27623f824de256e9.ttf [moved from test/shaping/fonts/sha1sum/051d92f8bc6ff724511b296c27623f824de256e9.ttf with 100% similarity]
test/shaping/data/in-house/fonts/074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/07f054357ff8638bac3711b422a1e31180bba863.ttf [moved from test/shaping/fonts/sha1sum/07f054357ff8638bac3711b422a1e31180bba863.ttf with 100% similarity]
test/shaping/data/in-house/fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf [moved from test/shaping/fonts/sha1sum/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf with 100% similarity]
test/shaping/data/in-house/fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/191826b9643e3f124d865d617ae609db6a2ce203.ttf [moved from test/shaping/fonts/sha1sum/191826b9643e3f124d865d617ae609db6a2ce203.ttf with 100% similarity]
test/shaping/data/in-house/fonts/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf [moved from test/shaping/fonts/sha1sum/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf with 100% similarity]
test/shaping/data/in-house/fonts/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf [moved from test/shaping/fonts/sha1sum/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf with 100% similarity]
test/shaping/data/in-house/fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf [moved from test/shaping/fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf with 100% similarity]
test/shaping/data/in-house/fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf [moved from test/shaping/fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf with 100% similarity]
test/shaping/data/in-house/fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/205edd09bd3d141cc9580f650109556cc28b22cb.ttf [moved from test/shaping/fonts/sha1sum/205edd09bd3d141cc9580f650109556cc28b22cb.ttf with 100% similarity]
test/shaping/data/in-house/fonts/217a934cfe15c548b572c203dceb2befdf026462.ttf [moved from test/shaping/fonts/sha1sum/217a934cfe15c548b572c203dceb2befdf026462.ttf with 100% similarity]
test/shaping/data/in-house/fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/226bc2deab3846f1a682085f70c67d0421014144.ttf [moved from test/shaping/fonts/sha1sum/226bc2deab3846f1a682085f70c67d0421014144.ttf with 100% similarity]
test/shaping/data/in-house/fonts/233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/243798dd281c1c77c065958e1ff467420faa9bde.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/270b89df543a7e48e206a2d830c0e10e5265c630.ttf [moved from test/shaping/fonts/sha1sum/270b89df543a7e48e206a2d830c0e10e5265c630.ttf with 100% similarity]
test/shaping/data/in-house/fonts/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf [moved from test/shaping/fonts/sha1sum/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf with 100% similarity]
test/shaping/data/in-house/fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/341421e629668b1a1242245d39238ca48432d35d.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/3493e92eaded2661cadde752a39f9d58b11f0326.ttf [moved from test/shaping/fonts/sha1sum/3493e92eaded2661cadde752a39f9d58b11f0326.ttf with 100% similarity]
test/shaping/data/in-house/fonts/3511ff5c1647150595846ac414c595cccac34f18.ttf [moved from test/shaping/fonts/sha1sum/3511ff5c1647150595846ac414c595cccac34f18.ttf with 100% similarity]
test/shaping/data/in-house/fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf [moved from test/shaping/fonts/sha1sum/37033cc5cf37bb223d7355153016b6ccece93b28.ttf with 100% similarity]
test/shaping/data/in-house/fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf [moved from test/shaping/fonts/sha1sum/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf with 100% similarity]
test/shaping/data/in-house/fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf [moved from test/shaping/fonts/sha1sum/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf with 100% similarity]
test/shaping/data/in-house/fonts/43ef465752be9af900745f72fe29cb853a1401a5.ttf [moved from test/shaping/fonts/sha1sum/43ef465752be9af900745f72fe29cb853a1401a5.ttf with 100% similarity]
test/shaping/data/in-house/fonts/45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf [moved from test/shaping/fonts/sha1sum/45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf with 100% similarity]
test/shaping/data/in-house/fonts/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf [moved from test/shaping/fonts/sha1sum/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf with 100% similarity]
test/shaping/data/in-house/fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf [moved from test/shaping/fonts/sha1sum/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf with 100% similarity]
test/shaping/data/in-house/fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf [moved from test/shaping/fonts/sha1sum/5028afb650b1bb718ed2131e872fbcce57828fff.ttf with 100% similarity]
test/shaping/data/in-house/fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf [moved from test/shaping/fonts/sha1sum/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf with 100% similarity]
test/shaping/data/in-house/fonts/55c88ebbe938680b08f92c3de20713183e0c7481.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf [moved from test/shaping/fonts/sha1sum/56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf with 100% similarity]
test/shaping/data/in-house/fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf [moved from test/shaping/fonts/sha1sum/57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf with 100% similarity]
test/shaping/data/in-house/fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf [moved from test/shaping/fonts/sha1sum/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf with 100% similarity]
test/shaping/data/in-house/fonts/5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf [moved from test/shaping/fonts/sha1sum/5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf with 100% similarity]
test/shaping/data/in-house/fonts/641bd9db850193064d17575053ae2bf8ec149ddc.ttf [moved from test/shaping/fonts/sha1sum/641bd9db850193064d17575053ae2bf8ec149ddc.ttf with 100% similarity]
test/shaping/data/in-house/fonts/663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf [moved from test/shaping/fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf with 100% similarity]
test/shaping/data/in-house/fonts/6ff0fbead4462d9f229167b4e6839eceb8465058.ttf [moved from test/shaping/fonts/sha1sum/6ff0fbead4462d9f229167b4e6839eceb8465058.ttf with 100% similarity]
test/shaping/data/in-house/fonts/706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf [moved from test/shaping/fonts/sha1sum/706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf with 100% similarity]
test/shaping/data/in-house/fonts/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf [moved from test/shaping/fonts/sha1sum/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf with 100% similarity]
test/shaping/data/in-house/fonts/7a37dc4d5bf018456aea291cee06daf004c0221c.ttf [moved from test/shaping/fonts/sha1sum/7a37dc4d5bf018456aea291cee06daf004c0221c.ttf with 100% similarity]
test/shaping/data/in-house/fonts/7e14e7883ed152baa158b80e207b66114c823a8b.ttf [moved from test/shaping/fonts/sha1sum/7e14e7883ed152baa158b80e207b66114c823a8b.ttf with 100% similarity]
test/shaping/data/in-house/fonts/8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf [moved from test/shaping/fonts/sha1sum/8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf with 100% similarity]
test/shaping/data/in-house/fonts/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf [moved from test/shaping/fonts/sha1sum/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf with 100% similarity]
test/shaping/data/in-house/fonts/81c368a33816fb20e9f647e8f24e2180f4720263.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf [moved from test/shaping/fonts/sha1sum/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf with 100% similarity]
test/shaping/data/in-house/fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/8454d22037f892e76614e1645d066689a0200e61.ttf [moved from test/shaping/fonts/sha1sum/8454d22037f892e76614e1645d066689a0200e61.ttf with 100% similarity]
test/shaping/data/in-house/fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf [moved from test/shaping/fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf with 100% similarity]
test/shaping/data/in-house/fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf [moved from test/shaping/fonts/sha1sum/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf with 100% similarity]
test/shaping/data/in-house/fonts/94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/98b7887cff91f722b92a8ff800120954606354f9.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/a014549f766436cf55b2ceb40e462038938ee899.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf [moved from test/shaping/fonts/sha1sum/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf with 100% similarity]
test/shaping/data/in-house/fonts/a34a9191d9376bda419836effeef7e75c1386016.ttf [moved from test/shaping/fonts/sha1sum/a34a9191d9376bda419836effeef7e75c1386016.ttf with 100% similarity]
test/shaping/data/in-house/fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf [moved from test/shaping/fonts/sha1sum/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf with 100% similarity]
test/shaping/data/in-house/fonts/a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/a919b33197965846f21074b24e30250d67277bce.ttf [moved from test/shaping/fonts/sha1sum/a919b33197965846f21074b24e30250d67277bce.ttf with 100% similarity]
test/shaping/data/in-house/fonts/a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf [moved from test/shaping/fonts/sha1sum/a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf with 100% similarity]
test/shaping/data/in-house/fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf [moved from test/shaping/fonts/sha1sum/b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf with 100% similarity]
test/shaping/data/in-house/fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf [moved from test/shaping/fonts/sha1sum/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf with 100% similarity]
test/shaping/data/in-house/fonts/bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf [moved from test/shaping/fonts/sha1sum/bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf with 100% similarity]
test/shaping/data/in-house/fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf [moved from test/shaping/fonts/sha1sum/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf with 100% similarity]
test/shaping/data/in-house/fonts/bb9473d2403488714043bcfb946c9f78b86ad627.ttf [moved from test/shaping/fonts/sha1sum/bb9473d2403488714043bcfb946c9f78b86ad627.ttf with 100% similarity]
test/shaping/data/in-house/fonts/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf [moved from test/shaping/fonts/sha1sum/c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf with 100% similarity]
test/shaping/data/in-house/fonts/cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf [moved from test/shaping/fonts/sha1sum/cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf with 100% similarity]
test/shaping/data/in-house/fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/d629e7fedc0b350222d7987345fe61613fa3929a.ttf [moved from test/shaping/fonts/sha1sum/d629e7fedc0b350222d7987345fe61613fa3929a.ttf with 100% similarity]
test/shaping/data/in-house/fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf [moved from test/shaping/fonts/sha1sum/df768b9c257e0c9c35786c47cae15c46571d56be.ttf with 100% similarity]
test/shaping/data/in-house/fonts/e207635780b42f898d58654b65098763e340f5c7.ttf [moved from test/shaping/fonts/sha1sum/e207635780b42f898d58654b65098763e340f5c7.ttf with 100% similarity]
test/shaping/data/in-house/fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf [moved from test/shaping/fonts/sha1sum/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf with 100% similarity]
test/shaping/data/in-house/fonts/e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf [moved from test/shaping/fonts/sha1sum/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf with 100% similarity]
test/shaping/data/in-house/fonts/ef2511f215aa3ca847cbfffbf861793b42170875.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf [moved from test/shaping/fonts/sha1sum/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf with 100% similarity]
test/shaping/data/in-house/fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf [moved from test/shaping/fonts/sha1sum/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf with 100% similarity]
test/shaping/data/in-house/fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf [new file with mode: 0644]
test/shaping/data/in-house/fonts/f499fbc23865022234775c43503bba2e63978fe1.ttf [moved from test/shaping/fonts/sha1sum/f499fbc23865022234775c43503bba2e63978fe1.ttf with 100% similarity]
test/shaping/data/in-house/fonts/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf [moved from test/shaping/fonts/sha1sum/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf with 100% similarity]
test/shaping/data/in-house/fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf [moved from test/shaping/fonts/sha1sum/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf with 100% similarity]
test/shaping/data/in-house/fonts/fab39d60d758cb586db5a504f218442cd1395725.ttf [moved from test/shaping/fonts/sha1sum/fab39d60d758cb586db5a504f218442cd1395725.ttf with 100% similarity]
test/shaping/data/in-house/fonts/fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf [moved from test/shaping/fonts/sha1sum/fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf with 100% similarity]
test/shaping/data/in-house/fonts/fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf [moved from test/shaping/fonts/sha1sum/fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf with 100% similarity]
test/shaping/data/in-house/fonts/ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf [moved from test/shaping/fonts/sha1sum/ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf with 100% similarity]
test/shaping/data/in-house/tests/arabic-fallback-shaping.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/arabic-feature-order.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/arabic-like-joining.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/arabic-mark-order.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/arabic-stch.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/automatic-fractions.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/cluster.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/color-fonts.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/context-matching.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/cursive-positioning.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/default-ignorables.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/emoji-flag-tags.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/fallback-positioning.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/fuzzed.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/hangul-jamo.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/hyphens.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/indic-consonant-with-stacker.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/indic-init.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/indic-joiners.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/indic-old-spec.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/indic-pref-blocking.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/indic-script-extensions.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/indic-special-cases.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/indic-syllable.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/language-tags.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/ligature-id.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/mark-attachment.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/mark-filtering-sets.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/mongolian-variation-selector.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/myanmar-syllable.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/simple.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/spaces.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/tibetan-contractions-1.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/tibetan-contractions-2.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/tibetan-vowels.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/use-marchen.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/use-syllable.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/use.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/variations-rvrn.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/vertical.tests [new file with mode: 0644]
test/shaping/data/in-house/tests/zero-width-marks.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/COPYING [new file with mode: 0644]
test/shaping/data/text-rendering-tests/Makefile.am [new file with mode: 0644]
test/shaping/data/text-rendering-tests/Makefile.in [new file with mode: 0644]
test/shaping/data/text-rendering-tests/Makefile.sources [new file with mode: 0644]
test/shaping/data/text-rendering-tests/README [new file with mode: 0644]
test/shaping/data/text-rendering-tests/extract-tests.py [new file with mode: 0755]
test/shaping/data/text-rendering-tests/fonts/AdobeVFPrototype-Subset.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/FDArrayTest257.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/FDArrayTest65535.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/NotoSansBalinese-Regular.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/NotoSansKannada-Regular.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/NotoSerifKannada-Regular.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/Selawik-README.md [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/Selawik-variable.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestAVAR.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestCMAP14.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestCMAPMacTurkish.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestCVARGVAROne.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestCVARGVARTwo.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGLYFOne.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGPOSFour.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGPOSOne.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGPOSThree.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGPOSTwo.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGSUBOne.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGVAREight.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGVARFour.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGVARNine.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGVAROne.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGVARThree.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestGVARTwo.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestHVAROne.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestHVARTwo.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestKERNOne.otf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXEighteen.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXFour.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXOne.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXSeventeen.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXSixteen.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXThree.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXTwelve.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXTwenty.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfive.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyone.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentysix.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentythree.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXTwentytwo.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestMORXTwo.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestShapeAran.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/TestShapeEthi.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/fonts/Zycon.ttf [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/AVAR-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/CFF-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/CFF-2.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/CFF2-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/CMAP-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/CMAP-2.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/CVAR-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/CVAR-2.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GLYF-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GPOS-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GPOS-2.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GPOS-3.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GPOS-4.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GPOS-5.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GSUB-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GSUB-2.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GVAR-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GVAR-2.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GVAR-3.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GVAR-4.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GVAR-5.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GVAR-6.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GVAR-7.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GVAR-8.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/GVAR-9.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/HVAR-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/HVAR-2.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/KERN-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/KERN-2.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/SHBALI-3.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/tests/SHKNDA-1.tests [new file with mode: 0644]
test/shaping/data/text-rendering-tests/update.sh [new file with mode: 0755]
test/shaping/fonts/sha1sum/6466d38c62e73a39202435a4f73bf5d6acbb73c0.ttf [deleted file]
test/shaping/fonts/sha1sum/7ef276fc886ea502a03b9b0e5c8b547d5dc2b61c.ttf [deleted file]
test/shaping/hb-diff-ngrams [deleted file]
test/shaping/hb-manifest-read [deleted file]
test/shaping/hb-manifest-update [deleted file]
test/shaping/hb_test_tools.py
test/shaping/record-test.sh
test/shaping/run-tests.py [new file with mode: 0755]
test/shaping/run-tests.sh [deleted file]
test/shaping/tests/arabic-fallback-shaping.tests [deleted file]
test/shaping/tests/arabic-feature-order.tests [deleted file]
test/shaping/tests/arabic-like-joining.tests [deleted file]
test/shaping/tests/automatic-fractions.tests [deleted file]
test/shaping/tests/cluster.tests [deleted file]
test/shaping/tests/color-fonts.tests [deleted file]
test/shaping/tests/context-matching.tests [deleted file]
test/shaping/tests/cursive-positioning.tests [deleted file]
test/shaping/tests/default-ignorables.tests [deleted file]
test/shaping/tests/fallback-positioning.tests [deleted file]
test/shaping/tests/fuzzed.tests [deleted file]
test/shaping/tests/hangul-jamo.tests [deleted file]
test/shaping/tests/hyphens.tests [deleted file]
test/shaping/tests/indic-joiner-candrabindu.tests [deleted file]
test/shaping/tests/indic-old-spec.tests [deleted file]
test/shaping/tests/indic-pref-blocking.tests [deleted file]
test/shaping/tests/language-tags.tests [deleted file]
test/shaping/tests/ligature-id.tests [deleted file]
test/shaping/tests/mark-filtering-sets.tests [deleted file]
test/shaping/tests/mongolian-variation-selector.tests [deleted file]
test/shaping/tests/simple.tests [deleted file]
test/shaping/tests/spaces.tests [deleted file]
test/shaping/tests/use-marchen.tests [deleted file]
test/shaping/tests/use.tests [deleted file]
test/shaping/tests/vertical.tests [deleted file]
test/shaping/tests/zero-width-marks.tests [deleted file]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-persian/mehran.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-persian/mehran.txt with 95% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/2grams.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/2grams.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/3grams.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/3grams.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/4grams.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/4grams.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/5grams.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/5grams.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/6grams.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/6grams.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/7grams.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/7grams.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/8grams.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/8grams.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/LICENSE [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/README [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/README with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/SOURCES [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/language-urdu/crulp/ligatures/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/lam-alef.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/misc/diacritics/lam-alef.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/language-arabic.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/misc/diacritics/language-arabic.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/language-persian.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/misc/diacritics/language-persian.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/language-urdu.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/misc/diacritics/language-urdu.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/ligature-components.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/misc/diacritics/ligature-components.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/ligature-diacritics.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/misc/diacritics/ligature-diacritics.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-arabic/misc/diacritics/mark-skipping.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-arabic/misc/diacritics/mark-skipping.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-mongolian/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-mongolian/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-mongolian/misc/non-joining.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-mongolian/misc/non-joining.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-mongolian/misc/poem.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-mongolian/misc/poem.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-mongolian/misc/variation-selectors.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-mongolian/misc/variation-selectors.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-nko/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-nko/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-phags-pa/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-phags-pa/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-arabic/script-syriac/misc/abbreviation-mark.txt [new file with mode: 0644]
test/shaping/texts/in-house/shaper-arabic/script-syriac/misc/alaph.txt [moved from test/shaping/texts/in-tree/shaper-arabic/script-syriac/misc/alaph.txt with 100% similarity]
test/shaping/texts/in-house/shaper-default/script-ethiopic/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-default/script-ethiopic/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-default/script-han/misc/cjk-compat.txt [moved from test/shaping/texts/in-tree/shaper-default/script-han/misc/cjk-compat.txt with 100% similarity]
test/shaping/texts/in-house/shaper-default/script-hiragana/misc/kazuraki-liga-lines.txt [moved from test/shaping/texts/in-tree/shaper-default/script-hiragana/misc/kazuraki-liga-lines.txt with 100% similarity]
test/shaping/texts/in-house/shaper-default/script-hiragana/misc/kazuraki-liga.txt [moved from test/shaping/texts/in-tree/shaper-default/script-hiragana/misc/kazuraki-liga.txt with 100% similarity]
test/shaping/texts/in-house/shaper-default/script-linear-b/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-default/script-linear-b/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-default/script-tifinagh/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-default/script-tifinagh/misc/misc.txt with 98% similarity]
test/shaping/texts/in-house/shaper-hangul/script-hangul/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-hangul/script-hangul/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-hebrew/script-hebrew/misc/diacritics.txt [moved from test/shaping/texts/in-tree/shaper-hebrew/script-hebrew/misc/diacritics.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/misc/reph.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/misc/reph.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/dottedcircle.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/misc/dottedcircle.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/eyelash.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/misc/eyelash.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/joiners.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/misc/joiners.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/spec-deviations.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/misc/spec-deviations.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/tricky-reordering.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/misc/tricky-reordering.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/misc/right-matras.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/misc/right-matras.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/cibu.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/misc/cibu.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/dot-reph.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/misc/dot-reph.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/misc/bindu.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/misc/bindu.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/extensive.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/misc/extensive.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/reph.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/misc/reph.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/split-matras.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/misc/split-matras.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-devanagari/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/LICENSE [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/LICENSE with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/README [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/README with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/SOURCES [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/SOURCES with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt [moved from test/shaping/texts/in-tree/shaper-indic/indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/south-east-asian/script-javanese/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-javanese/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-khmer/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/other-marks-invalid.txt [moved from test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-khmer/misc/other-marks-invalid.txt with 100% similarity]
test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/other-marks.txt [moved from test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-khmer/misc/other-marks.txt with 100% similarity]
test/shaping/texts/in-house/shaper-myanmar/script-myanmar/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-myanmar/script-myanmar/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-myanmar/script-myanmar/misc/otspec.txt [moved from test/shaping/texts/in-tree/shaper-myanmar/script-myanmar/misc/otspec.txt with 98% similarity]
test/shaping/texts/in-house/shaper-myanmar/script-myanmar/misc/utn11.txt [moved from test/shaping/texts/in-tree/shaper-myanmar/script-myanmar/misc/utn11.txt with 100% similarity]
test/shaping/texts/in-house/shaper-thai/script-lao/misc/sara-am.txt [moved from test/shaping/texts/in-tree/shaper-thai/script-lao/misc/sara-am.txt with 100% similarity]
test/shaping/texts/in-house/shaper-thai/script-thai/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-thai/script-thai/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-thai/script-thai/misc/phinthu.txt [moved from test/shaping/texts/in-tree/shaper-thai/script-thai/misc/phinthu.txt with 100% similarity]
test/shaping/texts/in-house/shaper-thai/script-thai/misc/pua-shaping.txt [moved from test/shaping/texts/in-tree/shaper-thai/script-thai/misc/pua-shaping.txt with 100% similarity]
test/shaping/texts/in-house/shaper-thai/script-thai/misc/sara-am.txt [moved from test/shaping/texts/in-tree/shaper-thai/script-thai/misc/sara-am.txt with 100% similarity]
test/shaping/texts/in-house/shaper-tibetan/script-tibetan/misc/contractions.txt [moved from test/shaping/texts/in-tree/shaper-tibetan/script-tibetan/misc/contractions.txt with 100% similarity]
test/shaping/texts/in-house/shaper-tibetan/script-tibetan/misc/misc.txt [moved from test/shaping/texts/in-tree/shaper-tibetan/script-tibetan/misc/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-use/script-batak/misc.txt [moved from test/shaping/texts/in-tree/shaper-use/script-batak/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-use/script-buginese/misc.txt [moved from test/shaping/texts/in-tree/shaper-use/script-buginese/misc.txt with 56% similarity]
test/shaping/texts/in-house/shaper-use/script-cham/misc.txt [moved from test/shaping/texts/in-tree/shaper-use/script-cham/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-use/script-kaithi/misc.txt [moved from test/shaping/texts/in-tree/shaper-use/script-kaithi/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-use/script-kharoshti/misc.txt [moved from test/shaping/texts/in-tree/shaper-use/script-kharoshti/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-use/script-tai-tham/misc.txt [moved from test/shaping/texts/in-tree/shaper-use/script-tai-tham/misc.txt with 100% similarity]
test/shaping/texts/in-house/shaper-use/script-tai-tham/torture.txt [moved from test/shaping/texts/in-tree/shaper-use/script-tai-tham/torture.txt with 100% similarity]
test/shaping/texts/in-tree/shaper-arabic/script-syriac/misc/abbreviation-mark.txt [deleted file]
test/subset/CMakeLists.txt [new file with mode: 0644]
test/subset/Makefile.am [new file with mode: 0644]
test/subset/Makefile.in [new file with mode: 0644]
test/subset/data/Makefile.am [new file with mode: 0644]
test/subset/data/Makefile.in [new file with mode: 0644]
test/subset/data/Makefile.sources [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.default.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.default.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.default.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.default.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.default.63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,63.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.62.ttf [new file with mode: 0644]
test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.63.ttf [new file with mode: 0644]
test/subset/data/expected/full-font/Roboto-Regular.default.1FC,21,41,20,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/full-font/Roboto-Regular.default.61,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/full-font/Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf [new file with mode: 0644]
test/subset/data/expected/full-font/Roboto-Regular.drop-hints.61,62,63.ttf [new file with mode: 0644]
test/subset/data/fonts/Roboto-Regular.abc.ttf [new file with mode: 0644]
test/subset/data/fonts/Roboto-Regular.ttf [new file with mode: 0644]
test/subset/data/profiles/default.txt [new file with mode: 0644]
test/subset/data/profiles/drop-hints.txt [new file with mode: 0644]
test/subset/data/tests/basics.tests [new file with mode: 0644]
test/subset/data/tests/full-font.tests [new file with mode: 0644]
test/subset/run-tests.py [new file with mode: 0755]
test/subset/subset_test_suite.py [new file with mode: 0644]
util/Makefile.am
util/Makefile.in
util/Makefile.sources
util/ansi-print.cc
util/ansi-print.hh
util/hb-ot-shape-closure.cc
util/hb-shape.cc
util/hb-subset.cc [new file with mode: 0644]
util/helper-cairo-ansi.hh
util/helper-cairo.cc
util/helper-cairo.hh
util/main-font-text.hh
util/options.cc
util/options.hh
util/shape-consumer.hh
util/view-cairo.hh
win32/Makefile.am [deleted file]
win32/Makefile.vc [deleted file]
win32/README.txt [deleted file]
win32/build-rules-msvc.mak [deleted file]
win32/config-msvc.mak [deleted file]
win32/config.h.win32 [deleted file]
win32/config.h.win32.in [deleted file]
win32/create-lists-msvc.mak [deleted file]
win32/create-lists.bat [deleted file]
win32/detectenv-msvc.mak [deleted file]
win32/generate-msvc.mak [deleted file]
win32/hb-introspection-msvc.mak [deleted file]
win32/info-msvc.mak [deleted file]
win32/install.mak [deleted file]
win32/introspection-msvc.mak [deleted file]

index 7518c2e..8a6b569 100644 (file)
--- a/BUILD.md
+++ b/BUILD.md
@@ -1,36 +1,50 @@
 On Linux, install the development packages for FreeType,
 Cairo, and GLib. For example, on Ubuntu / Debian, you would do:
 On Linux, install the development packages for FreeType,
 Cairo, and GLib. For example, on Ubuntu / Debian, you would do:
-* sudo apt-get install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
+
+    sudo apt-get install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
 
 whereas on Fedora, RHEL, CentOS, and other Red Hat based systems you would do:
 
 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 the Mac, using MacPorts:
-* sudo port install freetype glib2 cairo
+    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 macOS, using MacPorts:
+
+    sudo port install freetype glib2 cairo
 
 or using Homebrew:
 
 or using Homebrew:
-* brew install freetype glib cairo
+
+    brew install freetype glib cairo
 
 If you are using a tarball, you can now proceed to running configure and make
 as with any other standard package. That should leave you with a shared
 
 If you are using a tarball, you can now proceed to running configure and make
 as with any other standard package. That should leave you with a shared
-library in src/, and a few utility programs including hb-view and hb-shape
-under util/.  From the tarball, NMake Makefiles are also provided in win32/,
-which supports building HarfBuzz using Visual Studio, with a README.txt that
-gives instructions on building using NMake.
+library in `src/`, and a few utility programs including `hb-view` and `hb-shape`
+under `util/`.
+
 If you are bootstraping from git, you need a few more tools before you can
 If you are bootstraping from git, you need a few more tools before you can
-run autogen.sh for the first time. Namely, pkg-config and ragel. Again,
-on Ubuntu / Debian:
-* sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools
+run `autogen.sh` for the first time. Namely, `pkg-config` and `ragel`.
+
+Again, on Ubuntu / Debian:
+
+    sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools
 
 and on Fedora, RHEL, CentOS:
 
 and on Fedora, RHEL, CentOS:
-* sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc
+
+    sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc
 
 on the Mac, using MacPorts:
 
 on the Mac, using MacPorts:
-* sudo port install autoconf automake libtool pkgconfig ragel gtk-doc
+
+    sudo port install autoconf automake libtool pkgconfig ragel gtk-doc
 
 or using Homebrew:
 
 or using Homebrew:
-* brew install autoconf automake libtool pkgconfig ragel gtk-doc
+
+    brew install autoconf automake libtool pkgconfig ragel gtk-doc
 
 To build the Python bindings, you also need:
 
 
 To build the Python bindings, you also need:
 
-* brew install pygobject3
+    brew install pygobject3
index 91e7eca..defd5d6 100644 (file)
@@ -1,8 +1,24 @@
 cmake_minimum_required(VERSION 2.8.0)
 project(harfbuzz)
 
 cmake_minimum_required(VERSION 2.8.0)
 project(harfbuzz)
 
-## Disallow in-source builds
-if ("${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
+enable_testing()
+
+## Limit framework build to Xcode generator
+if (BUILD_FRAMEWORK)
+  # for a framework build on macOS, use:
+  # cmake -DBUILD_FRAMEWORK=ON -Bbuild -H. -GXcode && cmake --build build
+  if (NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode")
+    message(FATAL_ERROR
+      "You should use Xcode generator with BUILD_FRAMEWORK enabled")
+  endif ()
+  set (CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")
+  set (CMAKE_MACOSX_RPATH ON)
+  set (BUILD_SHARED_LIBS ON)
+endif ()
+
+
+## Disallow in-source builds, as CMake generated make files can collide with autotools ones
+if (NOT MSVC AND "${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
   message(FATAL_ERROR
     "
 In-source builds are not permitted!  Make a separate folder for"
   message(FATAL_ERROR
     "
 In-source builds are not permitted!  Make a separate folder for"
@@ -14,7 +30,7 @@ Before that, remove the files created by this failed run with"
     "
   rm -rf CMakeCache.txt CMakeFiles")
 endif ()
     "
   rm -rf CMakeCache.txt CMakeFiles")
 endif ()
-##
+
 
 ## HarfBuzz build configurations
 option(HB_HAVE_FREETYPE "Enable freetype interop helpers" OFF)
 
 ## HarfBuzz build configurations
 option(HB_HAVE_FREETYPE "Enable freetype interop helpers" OFF)
@@ -24,167 +40,250 @@ option(HB_HAVE_GLIB "Enable glib unicode functions" OFF)
 option(HB_HAVE_ICU "Enable icu unicode functions" OFF)
 if (APPLE)
   option(HB_HAVE_CORETEXT "Enable CoreText shaper backend on macOS" ON)
 option(HB_HAVE_ICU "Enable icu unicode functions" OFF)
 if (APPLE)
   option(HB_HAVE_CORETEXT "Enable CoreText shaper backend on macOS" ON)
+  set (CMAKE_MACOSX_RPATH ON)
 endif ()
 if (WIN32)
   option(HB_HAVE_UNISCRIBE "Enable Uniscribe shaper backend on Windows" OFF)
 endif ()
 if (WIN32)
   option(HB_HAVE_UNISCRIBE "Enable Uniscribe shaper backend on Windows" OFF)
-  option(HB_HAVE_DIRECWRITE "Enable DirectWrite shaper backend on Windows" OFF)
+  option(HB_HAVE_DIRECTWRITE "Enable DirectWrite shaper backend on Windows" OFF)
 endif ()
 option(HB_BUILD_UTILS "Build harfbuzz utils, needs cairo, freetype, and glib properly be installed" OFF)
 if (HB_BUILD_UTILS)
 endif ()
 option(HB_BUILD_UTILS "Build harfbuzz utils, needs cairo, freetype, and glib properly be installed" OFF)
 if (HB_BUILD_UTILS)
-  set(HB_HAVE_GLIB ON)
-  set(HB_HAVE_FREETYPE ON)
+  set (HB_HAVE_GLIB ON)
+  set (HB_HAVE_FREETYPE ON)
+endif ()
+
+option(HB_HAVE_GOBJECT "Enable GObject Bindings" OFF)
+if (HB_HAVE_GOBJECT)
+  set (HB_HAVE_GLIB ON)
+endif ()
+
+option(HB_HAVE_INTROSPECTION "Enable building introspection (.gir/.typelib) files" OFF)
+if (HB_HAVE_INTROSPECTION)
+  set (HB_HAVE_GOBJECT ON)
+  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_BUILTIN_UCDN 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_DIRECTWRITE ON)
+  elseif (APPLE)
+    set (HB_HAVE_CORETEXT ON)
+  endif ()
 endif ()
 
 include_directories(AFTER
   ${PROJECT_SOURCE_DIR}/src
   ${PROJECT_BINARY_DIR}/src
 endif ()
 
 include_directories(AFTER
   ${PROJECT_SOURCE_DIR}/src
   ${PROJECT_BINARY_DIR}/src
-  )
+)
 
 add_definitions(-DHAVE_OT)
 
 add_definitions(-DHAVE_OT)
-
-if (BUILD_SHARED_LIBS)
-  add_definitions(-DHAVE_ATEXIT)
+add_definitions(-DHAVE_FALLBACK)
+
+
+## Functions and headers
+include (CheckFunctionExists)
+include (CheckIncludeFile)
+macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools
+  foreach (func_name ${ARGN})
+    string(TOUPPER ${func_name} definiton_to_add)
+    check_function_exists(${func_name} HAVE_${definiton_to_add})
+    if (${HAVE_${definiton_to_add}})
+      add_definitions(-DHAVE_${definiton_to_add})
+    endif ()
+  endforeach ()
+endmacro ()
+check_funcs(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l)
+check_include_file(unistd.h HAVE_UNISTD_H)
+if (${HAVE_UNISTD_H})
+  add_definitions(-DHAVE_UNISTD_H)
+endif ()
+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 ()
 
 endif ()
 
+
 if (MSVC)
   add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
 endif ()
 
 if (MSVC)
   add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
 endif ()
 
-if (WIN32 AND NOT MINGW AND BUILD_SHARED_LIBS)
-  add_definitions("-DHB_EXTERN=__declspec(dllexport) extern")
+if (BUILD_SHARED_LIBS)
+  if (WIN32 AND NOT MINGW)
+    add_definitions("-DHB_EXTERN=__declspec(dllexport) extern")
+  else ()
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden")
+  endif ()
 endif ()
 endif ()
-##
 
 
-set(IN_HB_DIST FALSE)
-if (EXISTS "${PROJECT_SOURCE_DIR}/src/hb-version.h")
-  # perhaps we are on dist directory
-  set(IN_HB_DIST TRUE)
-  set(HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
-endif ()
+
+## Detect if we are running inside a distribution or regular repository folder
+# if (EXISTS "${PROJECT_SOURCE_DIR}/ChangeLog")
+#   # perhaps we are on dist directory
+#   set (IN_HB_DIST TRUE)
+#   #set (HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
+# endif ()
+
 
 ## Extract variables from Makefile files
 
 ## Extract variables from Makefile files
-# http://stackoverflow.com/a/27630120/1414809
-function (prepend var prefix)
-  set(listVar "")
-  foreach (f ${ARGN})
-    list(APPEND listVar "${prefix}${f}")
-  endforeach ()
-  set(${var} "${listVar}" PARENT_SCOPE)
+function (extract_make_variable variable makefile_source)
+  string(REGEX MATCH "${variable} = ([^$]+)\\$" temp ${makefile_source})
+  string(REGEX MATCHALL "[^ \n\t\\]+" listVar ${CMAKE_MATCH_1})
+  set (${variable} ${listVar} PARENT_SCOPE)
 endfunction ()
 
 endfunction ()
 
-function (extract_make_variable variable file prefix)
-  string(REGEX MATCH "${variable} = ([^$]+)\\$" temp ${file})
-  string(REGEX MATCHALL "[^ \n\t\\]+" list ${CMAKE_MATCH_1})
-  prepend(list ${prefix} ${list})
-  set(${variable} ${list} PARENT_SCOPE)
+# http://stackoverflow.com/a/27630120
+function (add_prefix_to_list var prefix)
+  set (listVar "")
+  foreach (f ${${var}})
+    list(APPEND listVar "${prefix}${f}")
+  endforeach ()
+  set (${var} "${listVar}" PARENT_SCOPE)
 endfunction ()
 
 file(READ ${PROJECT_SOURCE_DIR}/src/Makefile.sources SRCSOURCES)
 file(READ ${PROJECT_SOURCE_DIR}/util/Makefile.sources UTILSOURCES)
 file(READ ${PROJECT_SOURCE_DIR}/src/hb-ucdn/Makefile.sources UCDNSOURCES)
 
 endfunction ()
 
 file(READ ${PROJECT_SOURCE_DIR}/src/Makefile.sources SRCSOURCES)
 file(READ ${PROJECT_SOURCE_DIR}/util/Makefile.sources UTILSOURCES)
 file(READ ${PROJECT_SOURCE_DIR}/src/hb-ucdn/Makefile.sources UCDNSOURCES)
 
-extract_make_variable(HB_BASE_sources ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/")
-extract_make_variable(HB_BASE_headers ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/")
-extract_make_variable(HB_OT_sources ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/")
-extract_make_variable(HB_OT_headers ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/")
-
-if (IN_HB_DIST)
-  set(RAGEL_GENERATED_DIR "${PROJECT_SOURCE_DIR}/src/")
-else ()
-  set(RAGEL_GENERATED_DIR "${PROJECT_BINARY_DIR}/src/")
-endif ()
-extract_make_variable(HB_BASE_RAGEL_GENERATED_sources ${SRCSOURCES} ${RAGEL_GENERATED_DIR})
-extract_make_variable(HB_OT_RAGEL_GENERATED_sources ${SRCSOURCES} ${RAGEL_GENERATED_DIR})
-
-extract_make_variable(HB_VIEW_sources ${UTILSOURCES} "${PROJECT_SOURCE_DIR}/util/")
-extract_make_variable(HB_SHAPE_sources ${UTILSOURCES} "${PROJECT_SOURCE_DIR}/util/")
-extract_make_variable(HB_OT_SHAPE_CLOSURE_sources ${UTILSOURCES} "${PROJECT_SOURCE_DIR}/util/")
+extract_make_variable(HB_BASE_sources ${SRCSOURCES})
+add_prefix_to_list(HB_BASE_sources "${PROJECT_SOURCE_DIR}/src/")
+extract_make_variable(HB_BASE_headers ${SRCSOURCES})
+add_prefix_to_list(HB_BASE_headers "${PROJECT_SOURCE_DIR}/src/")
+extract_make_variable(HB_FALLBACK_sources ${SRCSOURCES})
+add_prefix_to_list(HB_FALLBACK_sources "${PROJECT_SOURCE_DIR}/src/")
+extract_make_variable(HB_OT_sources ${SRCSOURCES})
+add_prefix_to_list(HB_OT_sources "${PROJECT_SOURCE_DIR}/src/")
+extract_make_variable(HB_OT_headers ${SRCSOURCES})
+add_prefix_to_list(HB_OT_headers "${PROJECT_SOURCE_DIR}/src/")
+
+extract_make_variable(HB_SUBSET_sources ${SRCSOURCES})
+add_prefix_to_list(HB_SUBSET_sources "${PROJECT_SOURCE_DIR}/src/")
+
+extract_make_variable(HB_SUBSET_headers ${SRCSOURCES})
+add_prefix_to_list(HB_SUBSET_headers "${PROJECT_SOURCE_DIR}/src/")
+
+extract_make_variable(HB_BASE_RAGEL_GENERATED_sources ${SRCSOURCES})
+extract_make_variable(HB_OT_RAGEL_GENERATED_sources ${SRCSOURCES})
+#if (IN_HB_DIST)
+  add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/")
+  add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/")
+#else ()
+#  add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
+#  add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
+#endif ()
+
+extract_make_variable(HB_VIEW_sources ${UTILSOURCES})
+add_prefix_to_list(HB_VIEW_sources "${PROJECT_SOURCE_DIR}/util/")
+extract_make_variable(HB_SHAPE_sources ${UTILSOURCES})
+add_prefix_to_list(HB_SHAPE_sources "${PROJECT_SOURCE_DIR}/util/")
+extract_make_variable(HB_SUBSET_CLI_sources ${UTILSOURCES})
+add_prefix_to_list(HB_SUBSET_CLI_sources "${PROJECT_SOURCE_DIR}/util/")
+extract_make_variable(HB_OT_SHAPE_CLOSURE_sources ${UTILSOURCES})
+add_prefix_to_list(HB_OT_SHAPE_CLOSURE_sources "${PROJECT_SOURCE_DIR}/util/")
+
+extract_make_variable(LIBHB_UCDN_sources ${UCDNSOURCES})
+add_prefix_to_list(LIBHB_UCDN_sources "${PROJECT_SOURCE_DIR}/src/hb-ucdn/")
 
 
-extract_make_variable(LIBHB_UCDN_sources ${UCDNSOURCES} "${PROJECT_SOURCE_DIR}/src/hb-ucdn/")
 
 file(READ configure.ac CONFIGUREAC)
 string(REGEX MATCH "\\[(([0-9]+)\\.([0-9]+)\\.([0-9]+))\\]" HB_VERSION_MATCH ${CONFIGUREAC})
 
 file(READ configure.ac CONFIGUREAC)
 string(REGEX MATCH "\\[(([0-9]+)\\.([0-9]+)\\.([0-9]+))\\]" HB_VERSION_MATCH ${CONFIGUREAC})
-set(HB_VERSION ${CMAKE_MATCH_1})
-set(HB_VERSION_MAJOR ${CMAKE_MATCH_2})
-set(HB_VERSION_MINOR ${CMAKE_MATCH_3})
-set(HB_VERSION_MICRO ${CMAKE_MATCH_4})
-##
-
-if (NOT IN_HB_DIST)
-  ## Define ragel tasks
-  find_program(RAGEL "ragel")
-
-  if (RAGEL)
-    message(STATUS "ragel found at: ${RAGEL}")
-  else ()
-    message(FATAL_ERROR "ragel not found, get it here -- http://www.complang.org/ragel/ or, use harfbuzz releases https://github.com/behdad/harfbuzz/releases")
-  endif ()
-
-  foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources} ${HB_OT_RAGEL_GENERATED_sources})
-    string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output})
-    set(target_name ${CMAKE_MATCH_1})
-    add_custom_command(OUTPUT ${ragel_output}
-      COMMAND ${RAGEL} -G2 -o ${ragel_output} ${PROJECT_SOURCE_DIR}/src/${target_name}.rl -I ${PROJECT_SOURCE_DIR} ${ARGN}
-      DEPENDS ${PROJECT_SOURCE_DIR}/src/${target_name}.rl
-      )
-    add_custom_target(harfbuzz_${target_name} DEPENDS ${PROJECT_BINARY_DIR}/src/${target_name})
-  endforeach ()
+set (HB_VERSION ${CMAKE_MATCH_1})
+set (HB_VERSION_MAJOR ${CMAKE_MATCH_2})
+set (HB_VERSION_MINOR ${CMAKE_MATCH_3})
+set (HB_VERSION_MICRO ${CMAKE_MATCH_4})
+
+
+## Define ragel tasks
+# if (NOT IN_HB_DIST)
+#  foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources} ${HB_OT_RAGEL_GENERATED_sources})
+#    string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output})
+#    set (target_name ${CMAKE_MATCH_1})
+#    add_custom_command(OUTPUT ${ragel_output}
+#      COMMAND ${RAGEL} -G2 -o ${ragel_output} ${PROJECT_SOURCE_DIR}/src/${target_name}.rl -I ${PROJECT_SOURCE_DIR} ${ARGN}
+#      DEPENDS ${PROJECT_SOURCE_DIR}/src/${target_name}.rl
+#    )
+#    add_custom_target(harfbuzz_${target_name} DEPENDS ${PROJECT_BINARY_DIR}/src/${target_name})
+#  endforeach ()
+
+#  mark_as_advanced(RAGEL)
+# endif ()
+
+
+## Generate hb-version.h
+# if (NOT IN_HB_DIST)
+#  set (HB_VERSION_H_IN "${PROJECT_SOURCE_DIR}/src/hb-version.h.in")
+#  set (HB_VERSION_H "${PROJECT_BINARY_DIR}/src/hb-version.h")
+#  set_source_files_properties("${HB_VERSION_H}" PROPERTIES GENERATED true)
+#  configure_file("${HB_VERSION_H_IN}" "${HB_VERSION_H}.tmp" @ONLY)
+#  execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_if_different
+#    "${HB_VERSION_H}.tmp"
+#    "${HB_VERSION_H}"
+#  )
+#  file(REMOVE "${HB_VERSION_H}.tmp")
+# endif ()
 
 
-  mark_as_advanced(RAGEL)
-  ##
-
-  ## Generate hb-version.h
-  set(HB_VERSION_H_IN "${PROJECT_SOURCE_DIR}/src/hb-version.h.in")
-  set(HB_VERSION_H "${PROJECT_BINARY_DIR}/src/hb-version.h")
-  set_source_files_properties("${HB_VERSION_H}" PROPERTIES GENERATED true)
-  configure_file("${HB_VERSION_H_IN}" "${HB_VERSION_H}.tmp" @ONLY)
-  execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_if_different
-    "${HB_VERSION_H}.tmp"
-    "${HB_VERSION_H}")
-  file(REMOVE "${HB_VERSION_H}.tmp")
-  ##
-endif ()
 
 ## Define sources and headers of the project
 
 ## Define sources and headers of the project
-set(project_sources
+set (project_sources
   ${HB_BASE_sources}
   ${HB_BASE_RAGEL_GENERATED_sources}
 
   ${HB_BASE_sources}
   ${HB_BASE_RAGEL_GENERATED_sources}
 
+  ${HB_FALLBACK_sources}
   ${HB_OT_sources}
   ${HB_OT_RAGEL_GENERATED_sources}
   ${HB_OT_sources}
   ${HB_OT_RAGEL_GENERATED_sources}
-  )
+)
 
 
-set(project_headers
-  ${HB_VERSION_H}
+set (subset_project_sources
+  ${HB_SUBSET_sources}
+)
+
+set (project_extra_sources)
+
+set (project_headers
+  #${HB_VERSION_H}
 
   ${HB_BASE_headers}
   ${HB_OT_headers}
 
   ${HB_BASE_headers}
   ${HB_OT_headers}
-  )
+)
 
 
-if (HB_HAVE_FREETYPE)
-  add_definitions(-DHAVE_FREETYPE=1 -DHAVE_FT_FACE_GETCHARVARIANTINDEX=1)
+set (subset_project_headers
+  ${HB_SUBSET_headers}
+)
 
 
-  # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindFreetype2.cmake
-  find_package(PkgConfig)
-  pkg_check_modules(PC_FREETYPE2 QUIET freetype2)
 
 
-  find_path(FREETYPE2_HEADER_DIR NAMES freetype.h HINTS ${PC_FREETYPE2_INCLUDE_DIRS} ${PC_FREETYPE2_INCLUDEDIR} $ENV{FREETYPE_DIR}/include PATH_SUFFIXES freetype)
-  find_path(FREETYPE2_ROOT_INCLUDE_DIR NAMES freetype/freetype.h HINTS ${PC_FREETYPE2_INCLUDE_DIRS} ${PC_FREETYPE2_INCLUDEDIR} $ENV{FREETYPE_DIR}/include)
-  if (CMAKE_BUILD_TYPE MATCHES Debug)
-    set(FREETYPE2_LIBRARY_NAME freetyped)
-  else ()
-    set(FREETYPE2_LIBRARY_NAME freetype)
+## Find and include needed header folders and libraries
+if (HB_HAVE_FREETYPE)
+  include (FindFreetype)
+  if (NOT FREETYPE_FOUND)
+    message(FATAL_ERROR "HB_HAVE_FREETYPE was set, but we failed to find it. Maybe add a CMAKE_PREFIX_PATH= to your Freetype2 install prefix")
   endif ()
   endif ()
-  find_library(FREETYPE2_LIBRARIES ${FREETYPE2_LIBRARY_NAME} HINTS ${PC_FREETYPE2_LIBDIR} ${PC_FREETYPE2_LIBRARY_DIRS} $ENV{FREETYPE_DIR}/lib)
 
 
-  include_directories(AFTER ${FREETYPE2_HEADER_DIR} ${FREETYPE2_ROOT_INCLUDE_DIR})
+  list(APPEND THIRD_PARTY_LIBS ${FREETYPE_LIBRARIES})
+  include_directories(AFTER ${FREETYPE_INCLUDE_DIRS})
+  add_definitions(-DHAVE_FREETYPE=1)
 
   list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ft.cc)
   list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-ft.h)
 
 
   list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ft.cc)
   list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-ft.h)
 
-  list(APPEND THIRD_PARTY_LIBS ${FREETYPE2_LIBRARIES})
+  # So check_funcs can find its headers
+  set (CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${FREETYPE_INCLUDE_DIRS})
+  set (CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${FREETYPE_LIBRARIES})
 
 
-  mark_as_advanced(FREETYPE2_HEADER_DIR FREETYPE2_ROOT_INCLUDE_DIR FREETYPE2_LIBRARIES)
+  check_funcs(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var)
 endif ()
 
 if (HB_HAVE_GRAPHITE2)
 endif ()
 
 if (HB_HAVE_GRAPHITE2)
@@ -207,9 +306,8 @@ if (HB_BUILTIN_UCDN)
   include_directories(src/hb-ucdn)
   add_definitions(-DHAVE_UCDN)
 
   include_directories(src/hb-ucdn)
   add_definitions(-DHAVE_UCDN)
 
-  list(APPEND project_sources
-    ${PROJECT_SOURCE_DIR}/src/hb-ucdn.cc
-    ${LIBHB_UCDN_sources})
+  list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ucdn.cc)
+  list(APPEND project_extra_sources ${LIBHB_UCDN_sources})
 endif ()
 
 if (HB_HAVE_GLIB)
 endif ()
 
 if (HB_HAVE_GLIB)
@@ -264,7 +362,7 @@ if (APPLE AND HB_HAVE_CORETEXT)
   if (APPLICATION_SERVICES_FRAMEWORK)
     list(APPEND THIRD_PARTY_LIBS ${APPLICATION_SERVICES_FRAMEWORK})
   endif (APPLICATION_SERVICES_FRAMEWORK)
   if (APPLICATION_SERVICES_FRAMEWORK)
     list(APPEND THIRD_PARTY_LIBS ${APPLICATION_SERVICES_FRAMEWORK})
   endif (APPLICATION_SERVICES_FRAMEWORK)
-  
+
   mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK)
 endif ()
 
   mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK)
 endif ()
 
@@ -285,7 +383,112 @@ if (WIN32 AND HB_HAVE_DIRECTWRITE)
 
   list(APPEND THIRD_PARTY_LIBS dwrite rpcrt4)
 endif ()
 
   list(APPEND THIRD_PARTY_LIBS dwrite rpcrt4)
 endif ()
-##
+
+if (HB_HAVE_GOBJECT)
+  include (FindPythonInterp)
+  include (FindPerl)
+
+  # Use the hints from glib-2.0.pc to find glib-mkenums
+  find_package(PkgConfig)
+  pkg_check_modules(PC_GLIB QUIET glib-2.0)
+  find_program(GLIB_MKENUMS glib-mkenums
+    HINTS ${PC_glib_mkenums}
+  )
+  set (GLIB_MKENUMS_CMD)
+
+  if (WIN32 AND NOT MINGW)
+    # In Visual Studio builds, shebang lines are not supported
+    # in the standard cmd.exe shell that we use, so we need to
+    # first determine whether glib-mkenums is a Python or PERL
+    # script
+    execute_process(COMMAND "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}" --version
+      RESULT_VARIABLE GLIB_MKENUMS_PYTHON
+      OUTPUT_QUIET ERROR_QUIET
+    )
+    if (GLIB_MKENUMS_PYTHON EQUAL 0)
+      message("${GLIB_MKENUMS} is a Python script.")
+      set (GLIB_MKENUMS_CMD "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}")
+    else ()
+      execute_process(COMMAND "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}" --version
+        RESULT_VARIABLE GLIB_MKENUMS_PERL
+        OUTPUT_QUIET ERROR_QUIET
+      )
+      if (GLIB_MKENUMS_PERL EQUAL 0)
+        message("${GLIB_MKENUMS} is a PERL script.")
+        set (GLIB_MKENUMS_CMD "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}")
+      endif ()
+      if (NOT GLIB_MKENUMS_PERL EQUAL 0 AND NOT GLIB_MKENUMS_PYTHON EQUAL 0)
+        message(FATAL_ERROR "Unable to determine type of glib-mkenums script")
+      endif ()
+    endif ()
+  else ()
+    set (GLIB_MKENUMS_CMD "${GLIB_MKENUMS}")
+  endif ()
+  if (NOT GLIB_MKENUMS_CMD)
+    message(FATAL_ERROR "HB_HAVE_GOBJECT was set, but we failed to find glib-mkenums, which is required")
+  endif ()
+
+  pkg_check_modules(PC_GOBJECT QUIET gobject-2.0)
+
+  find_library(GOBJECT_LIBRARIES NAMES gobject-2.0 HINTS ${PC_GLIB_LIBDIR} ${PC_GLIB_LIBRARY_DIRS})
+  find_path(GOBJECT_INCLUDE_DIR NAMES glib-object.h HINTS ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0)
+
+  include_directories(${GOBJECTCONFIG_INCLUDE_DIR} ${GOBJECT_INCLUDE_DIR})
+  mark_as_advanced(GOBJECT_LIBRARIES GOBJECT_INCLUDE_DIR)
+
+  list(APPEND hb_gobject_sources ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.cc)
+  list(APPEND hb_gobject_gen_sources
+    ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc
+  )
+  list(APPEND hb_gobject_structs_headers
+    ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.h
+  )
+  list(APPEND hb_gobject_headers
+    ${PROJECT_SOURCE_DIR}/src/hb-gobject.h
+    ${hb_gobject_structs_headers}
+  )
+  list(APPEND hb_gobject_gen_headers
+    ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
+  )
+
+  add_custom_command(
+    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
+    COMMAND ${GLIB_MKENUMS_CMD}
+      --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl
+      --identifier-prefix hb_
+      --symbol-prefix hb_gobject
+      ${hb_gobject_structs_headers}
+      ${project_headers}
+      > ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h.tmp
+    COMMAND "${CMAKE_COMMAND}"
+      "-DENUM_INPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h.tmp"
+      "-DENUM_OUTPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h"
+      -P ${PROJECT_SOURCE_DIR}/replace-enum-strings.cmake
+    DEPENDS ${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl
+      ${hb_gobject_header}
+      ${project_headers}
+  )
+
+  add_custom_command(
+    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc
+    COMMAND ${GLIB_MKENUMS_CMD}
+      --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.cc.tmpl
+      --identifier-prefix hb_
+      --symbol-prefix hb_gobject
+      ${hb_gobject_header}
+      ${project_headers}
+      > ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc.tmp
+    COMMAND "${CMAKE_COMMAND}"
+      "-DENUM_INPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc.tmp"
+      "-DENUM_OUTPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc"
+      -P ${PROJECT_SOURCE_DIR}/replace-enum-strings.cmake
+    DEPENDS ${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.cc.tmpl
+      ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
+      ${hb_gobject_header}
+      ${project_headers}
+  )
+endif ()
+
 
 ## Atomic ops availability detection
 file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c"
 
 ## Atomic ops availability detection
 file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c"
@@ -297,7 +500,7 @@ file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c"
 ")
 try_compile(HB_HAVE_INTEL_ATOMIC_PRIMITIVES
   ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives
 ")
 try_compile(HB_HAVE_INTEL_ATOMIC_PRIMITIVES
   ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives
-  SOURCES ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c)
+  ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c)
 if (HB_HAVE_INTEL_ATOMIC_PRIMITIVES)
   add_definitions(-DHAVE_INTEL_ATOMIC_PRIMITIVES)
 endif ()
 if (HB_HAVE_INTEL_ATOMIC_PRIMITIVES)
   add_definitions(-DHAVE_INTEL_ATOMIC_PRIMITIVES)
 endif ()
@@ -313,15 +516,190 @@ file(WRITE "${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c"
 ")
 try_compile(HB_HAVE_SOLARIS_ATOMIC_OPS
   ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops
 ")
 try_compile(HB_HAVE_SOLARIS_ATOMIC_OPS
   ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops
-  SOURCES ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c)
+  ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c)
 if (HB_HAVE_SOLARIS_ATOMIC_OPS)
   add_definitions(-DHAVE_SOLARIS_ATOMIC_OPS)
 endif ()
 if (HB_HAVE_SOLARIS_ATOMIC_OPS)
   add_definitions(-DHAVE_SOLARIS_ATOMIC_OPS)
 endif ()
-##
 
 
-add_library(harfbuzz ${project_sources} ${project_headers})
+
+## Define harfbuzz library
+add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers})
 target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})
 
 target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})
 
+## Define harfbuzz-subset library
+add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers})
+add_dependencies(harfbuzz-subset harfbuzz)
+target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS})
+
+if (UNIX OR MINGW)
+  # Make symbols link locally
+  link_libraries(-Bsymbolic-functions)
+
+  if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    # Make sure we don't link to libstdc++
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions")
+    set (CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "m") # libm
+    set (CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
+    set_target_properties(harfbuzz PROPERTIES LINKER_LANGUAGE C)
+    set_target_properties(harfbuzz-subset PROPERTIES LINKER_LANGUAGE C)
+
+    # No threadsafe statics as we do it ourselves
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics")
+  endif ()
+endif ()
+
+## Define harfbuzz-gobject library
+if (HB_HAVE_GOBJECT)
+  add_library(harfbuzz-gobject
+    ${hb_gobject_sources}
+    ${hb_gobject_gen_sources}
+    ${hb_gobject_headers}
+    ${hb_gobject_gen_headers}
+  )
+  include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/src)
+  add_dependencies(harfbuzz-gobject harfbuzz)
+  target_link_libraries(harfbuzz-gobject harfbuzz ${GOBJECT_LIBRARIES} ${THIRD_PARTY_LIBS})
+endif ()
+
+# On Windows, g-ir-scanner requires a DLL build in order for it to work
+if (WIN32)
+  if (NOT BUILD_SHARED_LIBS)
+    message("Building introspection files on Windows requires BUILD_SHARED_LIBS to be enabled.")
+    set (HB_HAVE_INTROSPECTION OFF)
+  endif ()
+endif ()
+
+if (HB_HAVE_INTROSPECTION)
+
+  find_package(PkgConfig)
+  pkg_check_modules(PC_GI QUIET gobject-introspection-1.0)
+
+  find_program(G_IR_SCANNER g-ir-scanner
+    HINTS ${PC_g_ir_scanner}
+  )
+
+  find_program(G_IR_COMPILER g-ir-compiler
+    HINTS ${PC_g_ir_compiler}
+  )
+
+  if (WIN32 AND NOT MINGW)
+    # Note that since we already enable HB_HAVE_GOBJECT
+    # we would already have PYTHON_EXECUTABLE handy
+    set (G_IR_SCANNER_CMD "${PYTHON_EXECUTABLE}" "${G_IR_SCANNER}")
+  else ()
+    set (G_IR_SCANNER_CMD "${G_IR_SCANNER}")
+  endif ()
+
+  # We need to account for the varying output directories
+  # when we build using Visual Studio projects
+  if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
+    set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>")
+  else ()
+    set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>")
+  endif ()
+
+  # Get the CFlags that we used to build HarfBuzz/HarfBuzz-GObject
+  set (hb_defines_cflags "")
+  foreach (hb_cflag ${hb_cflags})
+    list(APPEND hb_defines_cflags "-D${hb_cflag}")
+  endforeach (hb_cflag)
+
+  # Get the other dependent libraries we used to build HarfBuzz/HarfBuzz-GObject
+  set (extra_libs "")
+  foreach (extra_lib ${THIRD_PARTY_LIBS})
+    # We don't want the .lib extension here...
+    string(REPLACE ".lib" "" extra_lib_stripped "${extra_lib}")
+    list(APPEND extra_libs "--extra-library=${extra_lib_stripped}")
+  endforeach ()
+
+  set (introspected_sources)
+  foreach (f
+    ${project_headers}
+    ${project_sources}
+    ${hb_gobject_gen_sources}
+    ${hb_gobject_gen_headers}
+    ${hb_gobject_sources}
+    ${hb_gobject_headers}
+  )
+    if (WIN32)
+      # Nasty issue: We need to make drive letters lower case,
+      # otherwise g-ir-scanner won't like it and give us a bunch
+      # of invalid items and unresolved types...
+      STRING(SUBSTRING "${f}" 0 1 drive)
+      STRING(SUBSTRING "${f}" 1 -1 path)
+      if (drive MATCHES "[A-Z]")
+        STRING(TOLOWER ${drive} drive_lower)
+        list(APPEND introspected_sources "${drive_lower}${path}")
+      else ()
+        list(APPEND introspected_sources "${f}")
+      endif ()
+    else ()
+      list(APPEND introspected_sources "${f}")
+    endif ()
+  endforeach ()
+
+  # Finally, build the introspection files...
+  add_custom_command(
+    TARGET harfbuzz-gobject
+    POST_BUILD
+    COMMAND ${G_IR_SCANNER_CMD}
+      --warn-all --no-libtool --verbose
+      -n hb
+      --namespace=HarfBuzz
+      --nsversion=0.0
+      --identifier-prefix=hb_
+      --include GObject-2.0
+      --pkg-export=harfbuzz
+      --cflags-begin
+      -I${PROJECT_SOURCE_DIR}/src
+      -I${PROJECT_BINARY_DIR}/src
+      ${hb_includedir_cflags}
+      ${hb_defines_cflags}
+      -DHB_H
+      -DHB_H_IN
+      -DHB_OT_H
+      -DHB_OT_H_IN
+      -DHB_GOBJECT_H
+      -DHB_GOBJECT_H_IN
+      -DHB_EXTERN=
+      --cflags-end
+      --library=harfbuzz-gobject
+      --library=harfbuzz
+      -L${hb_libpath}
+      ${extra_libs}
+      ${introspected_sources}
+      -o ${hb_libpath}/HarfBuzz-0.0.gir
+    DEPENDS harfbuzz-gobject harfbuzz
+  )
+
+  add_custom_command(
+    TARGET harfbuzz-gobject
+    POST_BUILD
+    COMMAND "${G_IR_COMPILER}"
+      --verbose --debug
+      --includedir ${CMAKE_CURRENT_BINARY_DIR}
+      ${hb_libpath}/HarfBuzz-0.0.gir
+      -o ${hb_libpath}/HarfBuzz-0.0.typelib
+    DEPENDS ${hb_libpath}/HarfBuzz-0.0.gir harfbuzz-gobject
+  )
+endif ()
+
+
+## Additional framework build configs
+if (BUILD_FRAMEWORK)
+  set (CMAKE_MACOSX_RPATH ON)
+  set_target_properties(harfbuzz PROPERTIES
+    FRAMEWORK TRUE
+    PUBLIC_HEADER "${project_headers}"
+    XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
+  )
+  set (MACOSX_FRAMEWORK_IDENTIFIER "harfbuzz")
+  set (MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${HB_VERSION}")
+  set (MACOSX_FRAMEWORK_BUNDLE_VERSION "${HB_VERSION}")
+endif ()
+
+
+## Additional harfbuzz build artifacts
 if (HB_BUILD_UTILS)
   # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindCairo.cmake
   find_package(PkgConfig)
 if (HB_BUILD_UTILS)
   # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindCairo.cmake
   find_package(PkgConfig)
@@ -340,22 +718,131 @@ if (HB_BUILD_UTILS)
   add_executable(hb-shape ${HB_SHAPE_sources})
   target_link_libraries(hb-shape harfbuzz)
 
   add_executable(hb-shape ${HB_SHAPE_sources})
   target_link_libraries(hb-shape harfbuzz)
 
+  add_executable(hb-subset ${HB_SUBSET_CLI_sources})
+  target_link_libraries(hb-subset harfbuzz harfbuzz-subset)
+
   add_executable(hb-ot-shape-closure ${HB_OT_SHAPE_CLOSURE_sources})
   target_link_libraries(hb-ot-shape-closure harfbuzz)
 
   add_executable(hb-ot-shape-closure ${HB_OT_SHAPE_CLOSURE_sources})
   target_link_libraries(hb-ot-shape-closure harfbuzz)
 
-  mark_as_advanced(CAIRO_LIBRARIESNAMES)
+  mark_as_advanced(CAIRO_INCLUDE_DIRS CAIRO_LIBRARIESNAMES)
 endif ()
 
 endif ()
 
+
 ## Install
 ## Install
+include (GNUInstallDirs)
+
 if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
 if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
-  install(FILES ${project_headers} DESTINATION include/harfbuzz)
+  install(FILES ${project_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz)
+  if (HB_HAVE_GOBJECT)
+    install(FILES ${hb_gobject_headers} ${hb_gobject_gen_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz)
+  endif ()
 endif ()
 
 if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
   install(TARGETS harfbuzz
 endif ()
 
 if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
   install(TARGETS harfbuzz
-    ARCHIVE DESTINATION lib
-    LIBRARY DESTINATION lib
-    RUNTIME DESTINATION bin
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    FRAMEWORK DESTINATION Library/Frameworks
+  )
+  if (HB_BUILD_UTILS)
+    install(TARGETS hb-view
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+    install(TARGETS hb-view
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+
+    install(TARGETS hb-shape
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+
+    install(TARGETS hb-ot-shape-closure
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    )
+  endif ()
+  if (HB_HAVE_GOBJECT)
+    install(TARGETS harfbuzz-gobject
+      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
     )
     )
+    if (HB_HAVE_INTROSPECTION)
+      if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
+        set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>")
+      else ()
+        set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>")
+      endif ()
+
+      install(FILES "${hb_libpath}/HarfBuzz-0.0.gir"
+        DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/gir-1.0
+      )
+
+      install(FILES "${hb_libpath}/HarfBuzz-0.0.typelib"
+        DESTINATION ${CMAKE_INSTALL_LIBDIR}/girepository-1.0
+      )
+    endif ()
+  endif ()
+endif ()
+
+if (UNIX AND CMAKE_GENERATOR STREQUAL "Ninja")
+  if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcolor-diagnostics")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcolor-diagnostics")
+  endif ()
+  if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color")
+  endif ()
 endif ()
 endif ()
-##
+
+
+## src/ executables
+foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges)
+  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
+    string(REPLACE ";" " " space_separated_headers "${project_headers}")
+    add_custom_command(TARGET harfbuzz POST_BUILD
+      COMMAND ${CMAKE_COMMAND} -E env "headers=${space_separated_headers}" python ${PROJECT_SOURCE_DIR}/src/gen-def.py ${PROJECT_BINARY_DIR}/harfbuzz.def
+      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)
index 86ffc1f..02300c3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
+commit ac2ece3e153167224c85cc384e2826ea9711a8b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 15:52:42 2018 +0100
+
+    [ot] Comment out AAT include
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 23a9ac993862b4a9032d38e80491a769b7ee86da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 15:51:42 2018 +0100
+
+    Remove hb-ot-color.h
+
+    So I can make a release.
+
+ src/Makefile.sources          |  1 -
+ src/hb-ot-color-cpal-table.hh | 48 +++++++++++++++++++++++++
+ src/hb-ot-color.h             | 81
+ -------------------------------------------
+ src/hb-ot.h                   |  1 -
+ 4 files changed, 48 insertions(+), 83 deletions(-)
+
+commit 790a11700773dd664e4d5edac63c404c5ebce080
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 15:31:15 2018 +0100
+
+    [ot] Remove hb-ot-base.h
+
+    BASE table API will go into hb-ot-layout.h.
+
+ src/Makefile.sources           |  1 -
+ src/hb-ot-base.h               | 56
+ ------------------------------------------
+ src/hb-ot-layout-base-table.hh |  1 -
+ src/hb-ot-layout.h             | 16 ++++++++++++
+ src/hb-ot.h                    |  1 -
+ 5 files changed, 16 insertions(+), 59 deletions(-)
+
+commit f014a124f582215fa96afc28b534a1ca0bf17167
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 10:49:26 2018 +0100
+
+    [set] Fix algebra
+
+    Was totally b0rked. Ouch!
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/863
+
+ src/hb-set-private.hh | 20 +++++++++++++++++---
+ 1 file changed, 17 insertions(+), 3 deletions(-)
+
+commit 7587683cdce8ee9b7f07bae82aa1bb163e79ab92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 09:55:22 2018 +0100
+
+    [set] Minor
+
+    In preparation to fix https://github.com/harfbuzz/harfbuzz/issues/863
+
+    Binary operations are sets are completely broken. Ouch.
+
+ src/hb-set-private.hh | 21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+commit e4cbb87bd3512c3a6e97ea3923ecd1b26b0a1251
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 09:37:22 2018 +0100
+
+    Minor
+
+ src/hb-ot-color-colr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c6150333c29b458ed34858f24e94acc0f771aa0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 7 09:27:16 2018 +0100
+
+    Sign
+
+ src/test-unicode-ranges.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9a6f9b4d4284f0378a71a181fe216d97c913669e
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Mar 6 13:46:51 2018 -0800
+
+    [set] add a test demonstrating a bug in hb_set_union.
+
+ test/api/test-set.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 9b4a5d7ef1ec068042e3c793845a4dbc3308d4b7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Mar 7 00:23:40 2018 +0330
+
+    [ci] Enable -Werror=unused (#862)
+
+ .travis.yml             | 4 ++--
+ src/hb-ot-glyf-table.hh | 1 -
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 54cbe6702c1e4c934c60512367abaf801294c1bb
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Mar 6 16:41:08 2018 +0330
+
+    [ot-color] Further improvements on COLR/CPAL implementation (#859)
+
+    * Implemented a bsearch on get_base_glyph_record
+    * Made get_color_record_argb actually work
+
+ src/hb-ot-color-colr-table.hh | 35 ++++++++++++++-----------
+ src/hb-ot-color-cpal-table.hh | 59
+ +++++++++++++++----------------------------
+ src/hb-ot-color.h             | 12 ++-------
+ 3 files changed, 42 insertions(+), 64 deletions(-)
+
+commit 18d14b8e0d5d28106800ebf835ff3155a4f4de7c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 5 14:25:11 2018 +0330
+
+    [dev-run] an option to open using a GUI app
+
+ src/dev-run.sh | 22 ++++++++++++++++++----
+ 1 file changed, 18 insertions(+), 4 deletions(-)
+
+commit 1db83954948dfae3f75f61c535c5de1b3a843a69
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 5 13:02:50 2018 +0330
+
+    [ci] minor, bring back the removed assertion
+
+ .ci/run-coveralls.sh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5895fe3d4d0441dacf8989740cf4150193397796
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Mar 5 12:58:34 2018 +0330
+
+    [ci] minor
+
+ .ci/trigger-coverity.sh | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit a3e29fd38f01b26b6306f9f7142a54cc7d6c6080
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Mar 4 02:56:27 2018 +0330
+
+    [aat/kerx] Add a TODO
+
+ src/hb-aat-layout-kerx-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0ef6ab25ab4456e387711ae246900486ad738d26
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Mar 4 02:47:26 2018 +0330
+
+    [ot-color] Move cbdt to the namespace (#860)
+
+ src/Makefile.sources                                   | 2 +-
+ src/{hb-ot-cbdt-table.hh => hb-ot-color-cbdt-table.hh} | 6 +++---
+ src/hb-ot-font.cc                                      | 3 ++-
+ 3 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 6659cb56fae0c900ae88e95bedcb3b76234c8838
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Mar 4 02:31:53 2018 +0330
+
+    [ci] Remove --coverage as use of --enable-code-coverage
+
+ .travis.yml | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 00dd321ace75ff0d1824cf75cd41490c5dd6ad76
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 23:26:11 2018 +0330
+
+    [ci] Don't run coveralls on freetype folder
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f50aedd371f1a6894d1bf7732f017b51cbdd59bd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 23:17:36 2018 +0330
+
+    [ci] Remove failing check on run-coveralls
+
+ .ci/run-coveralls.sh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit a0031c120e3ac5c059b81a004b9386fab3d662fc
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 23:09:25 2018 +0330
+
+    Add lcov tool for coverage tests
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ecef95b21264347f9505e3ed4fb25ec7e4ccca5d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 23:03:13 2018 +0330
+
+    [ci] Enable code coverage on Travis Linux builds
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f7399796a1ed36cfc4f1ef7631584569baa80981
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 22:55:09 2018 +0330
+
+    Enable coverage test on autotools (#857)
+
+ configure.ac           |   1 +
+ m4/ax_code_coverage.m4 | 264
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/Makefile.am        |   6 +-
+ 3 files changed, 269 insertions(+), 2 deletions(-)
+
+commit c446c23f0f09e541891b49184febdfc75cb3505f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 22:43:23 2018 +0330
+
+    [ot-color] Move the related tables to hb-ot-color-* (#858)
+
+ src/Makefile.sources                                   | 4 ++--
+ src/{hb-ot-colr-table.hh => hb-ot-color-colr-table.hh} | 6 +++---
+ src/{hb-ot-cpal-table.hh => hb-ot-color-cpal-table.hh} | 6 +++---
+ src/hb-ot-color.cc                                     | 4 ++--
+ src/hb-ot-layout.cc                                    | 4 ++--
+ 5 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 48ed15a2bcdc1999e2d39fdcb2644ba4c3beccfe
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 22:00:29 2018 +0330
+
+    [COLR/CPAL] Provide enough helper for rasterization (#855)
+
+ src/hb-ot-colr-table.hh | 47
+ ++++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-cpal-table.hh | 18 +++++++++++++++---
+ 2 files changed, 59 insertions(+), 6 deletions(-)
+
+commit 432758a7ac3c1a857e67069f157efbf4ebf5521b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Mar 3 01:05:59 2018 +0330
+
+    [COLR] Revert previous sanitization on the table
+
+    That sanitization wasn't right, firstLayerIndex is an index from
+    beginning of the Layer Records
+    not the table itself.
+
+ src/hb-ot-colr-table.hh | 23 ++++++-----------------
+ 1 file changed, 6 insertions(+), 17 deletions(-)
+
+commit 71b4598ea37b316571bae22ced2f1b38185c9f44
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 2 11:04:09 2018 +0330
+
+    [aat/kerx] Improve format 6 subtable
+
+ src/hb-aat-layout-kerx-table.hh | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit b73a5a1c240478616827529c94f0133018f9f790
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 2 00:07:26 2018 +0330
+
+    [aat/kerx] Make parsing of the table actually work (#850)
+
+ src/hb-aat-layout-kerx-table.hh | 298
+ +++++++++++++++++-----------------------
+ 1 file changed, 124 insertions(+), 174 deletions(-)
+
+commit a570edcde2f89e59b5ccd4867a8c0eed084bf35d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Mar 2 00:06:03 2018 +0330
+
+    [COLR] Sanitize BaseGlyphRecord (#854)
+
+ src/hb-ot-colr-table.hh | 27 ++++++++++++++++++---------
+ 1 file changed, 18 insertions(+), 9 deletions(-)
+
+commit 7e958646a4a825bfe3aac56ddb96100d68c5592c
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Mar 1 10:27:18 2018 +0330
+
+    [CPAL] Fix version checking logic on sanitizer (#851)
+
+ src/hb-ot-cpal-table.hh | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
+
+commit bcf578fefe6d7af0a962329ceb9989ce61ec467d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 28 16:31:46 2018 -0800
+
+    [test] Add test suite for Brahmi Number Joiners
+
+    https://github.com/harfbuzz/harfbuzz/pull/660
+
+ .../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf   | Bin 0 ->
+ 2768 bytes
+ test/shaping/data/in-house/tests/use-syllable.tests      |   1 +
+ test/shaping/record-test.sh                              |   2 +-
+ 3 files changed, 2 insertions(+), 1 deletion(-)
+
+commit b4ba71ea7ccce70e24138373774741c7f03dd24e
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 28 15:44:00 2018 -0800
+
+    [subset] In subset integration test pass output through ots-sanitize
+    if present.
+
+ test/subset/run-tests.py | 25 +++++++++++++++++++++++--
+ 1 file changed, 23 insertions(+), 2 deletions(-)
+
+commit 588a4e0f9b2d71362503a274de7200f3eb4367f7
+Merge: 55a4dfa3 b3f1a045
+Author: rsheeter <rsheeter@google.com>
+Date:   Wed Feb 28 13:52:29 2018 -0800
+
+    Merge pull request #845 from googlefonts/drophints
+
+    [subset] drop hints from composites
+
+commit b3f1a045a8b86747afce6bc154f2a166ea678efb
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 28 11:41:24 2018 -0800
+
+    [subset] kick the build
+
+ src/hb-subset-glyf.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 20d57399235b410d2bdc98103c8bb3dfd1c34176
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 28 11:15:08 2018 -0800
+
+    [subset] extract a method to flip off composite instruction flag
+
+ src/hb-subset-glyf.cc | 24 +++++++++++++++---------
+ 1 file changed, 15 insertions(+), 9 deletions(-)
+
+commit 55a4dfa374bae1db846c3b848b7e59fb0014b627
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 28 15:43:23 2018 +0330
+
+    Use old project location of coverity
+
+    https://github.com/harfbuzz/harfbuzz/commit/8089711a61687d565f207c56d3d2b658f514d7ab#commitcomment-27835452
+
+ .travis.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3821978bcd92cbdb607111452796e051c456f391
+Merge: 77227462 f671f7f0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 28 13:30:17 2018 +0330
+
+    Merge pull request #847 from ebraminio/colr
+
+    [colr] Implement
+
+commit f671f7f0a8caa7b5763e00146e1ec4b9a7258227
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 28 13:19:40 2018 +0330
+
+    [colr] Implement
+
+ src/Makefile.sources        |  1 +
+ src/hb-ot-color.cc          |  9 +++++
+ src/hb-ot-color.h           |  9 -----
+ src/hb-ot-colr-table.hh     | 98
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cpal-table.hh     |  6 +--
+ src/hb-ot-layout-private.hh |  6 ++-
+ src/hb-ot-layout.cc         | 11 +++--
+ 7 files changed, 122 insertions(+), 18 deletions(-)
+
+commit 772274625e9f17d726f2a1da8192ec3ec24793a3
+Merge: 0eec3315 5b9c2340
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 28 12:05:49 2018 +0330
+
+    Merge pull request #841 from ebraminio/color
+
+    Support CPAL table
+
+commit 0eec33154a418fba97a08be7169b59e748b7e785
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 28 11:53:39 2018 +0330
+
+    [cmake] cleanup (#846)
+
+ CMakeLists.txt          | 70
+ ++++++++++++++++++++-----------------------------
+ test/api/CMakeLists.txt |  2 +-
+ 2 files changed, 30 insertions(+), 42 deletions(-)
+
+commit 5b9c234043d0483e53e9da5fe4afd7743190b538
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 27 22:56:17 2018 +0330
+
+    [CPAL] Refactor and address the reviews
+
+ NEWS                                               |   3 +-
+ src/Makefile.am                                    |   1 -
+ src/hb-ot-color.cc                                 |  70 +++----------
+ src/hb-ot-color.h                                  |  31 +++---
+ src/hb-ot-cpal-table.hh                            | 116
+ +++++++++++++++------
+ src/hb-ot-layout-private.hh                        |   3 +-
+ src/hb-ot-layout.cc                                |   5 +-
+ test/api/hb-test.h                                 |   2 +
+ test/api/test-ot-color.c                           |  39 +++----
+ .../319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf   | Bin
+ .../e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf   | Bin
+ 11 files changed, 141 insertions(+), 129 deletions(-)
+
+commit 6836a821428b714b9f2e95d5c4ebbd73867d9a53
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 27 20:51:12 2018 -0800
+
+    [subset] remove WE_HAVE_INSTRUCTIONS from composites when dropping
+    hints
+
+ src/hb-subset-glyf.cc | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit ffcb5cbf71b312cdd4606a3285e10e201ff5bccd
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 27 20:17:04 2018 -0800
+
+    [subset] update the test file for composite, fix an offset calculation
+
+ src/hb-ot-glyf-table.hh                                  |   2 +-
+ test/api/fonts/Roboto-Regular.components.1fc.nohints.ttf | Bin 0 ->
+ 932 bytes
+ test/api/test-subset-glyf.c                              |   5 ++---
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+commit c8b230e4377bc8e80d37835a229511ce0e30cc47
+Merge: b3790a65 904dd7be
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 27 17:25:32 2018 -0800
+
+    Merge branch 'expand-tests' of github.com:googlefonts/harfbuzz
+    into drophints
+
+commit 904dd7beea756fd7429fad36f5c37321aedb4e81
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 14:33:36 2018 -0800
+
+    [subset] Add drop hinting profile to full-font.tests
+
+ .../Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf     | Bin 0 ->
+ 2152 bytes
+ .../full-font/Roboto-Regular.drop-hints.61,62,63.ttf     | Bin 0 ->
+ 1968 bytes
+ test/subset/data/tests/full-font.tests                   |   1 +
+ 3 files changed, 1 insertion(+)
+
+commit 70a1049b3f8dc241fcb9b524bd010f0c1606f6ad
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 14:28:50 2018 -0800
+
+    [subset] Add a drop hints profile to basics.tests
+
+ .../basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf     | Bin 0 ->
+ 876 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf        | Bin 0 ->
+ 792 bytes
+ .../expected/basics/Roboto-Regular.abc.drop-hints.61.ttf  | Bin 0 ->
+ 684 bytes
+ .../expected/basics/Roboto-Regular.abc.drop-hints.62.ttf  | Bin 0 ->
+ 652 bytes
+ .../expected/basics/Roboto-Regular.abc.drop-hints.63.ttf  | Bin 0 ->
+ 656 bytes
+ test/subset/data/profiles/drop-hints.txt                  |   1 +
+ test/subset/data/tests/basics.tests                       |   1 +
+ 7 files changed, 2 insertions(+)
+
+commit 5241d7f4b999d5457de564bd950b60d70f9d0e19
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 13:15:40 2018 -0800
+
+    [subset] apply subset profiles (flags) to the subset integration
+    tests.
+
+ test/subset/generate-expected-outputs.py | 27 ++++++++++++++-------------
+ test/subset/run-tests.py                 |  3 ++-
+ test/subset/subset_test_suite.py         | 11 ++++++++---
+ 3 files changed, 24 insertions(+), 17 deletions(-)
+
+commit a4aca190a93f94c25c906ec0269183d8b2d0b5e8
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 11:36:16 2018 -0800
+
+    [subset] add expected/full-font to dist files.
+
+ test/subset/data/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d31ace32740b1777ebb023ffdb10cd0cfec3997e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 18:51:56 2018 -0800
+
+    [subset] Add subset integration tests using the full roboto font.
+
+ test/subset/data/Makefile.sources                      |   1 +
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf      | Bin 0 ->
+ 3700 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf      | Bin 0 ->
+ 3320 bytes
+ test/subset/data/fonts/Roboto-Regular.ttf              | Bin 0 ->
+ 171676 bytes
+ test/subset/data/tests/full-font.tests                 |  10 ++++++++++
+ test/subset/generate-expected-outputs.py               |  12 ++++++++----
+ 6 files changed, 19 insertions(+), 4 deletions(-)
+
+commit 33f4381314c5248b8b112e344af7548806f93a82
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 18:39:09 2018 -0800
+
+    [subset] Add some more variations of the basic test.
+
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf       | Bin 0 ->
+ 2120 bytes
+ .../expected/basics/Roboto-Regular.abc.default.61,63.ttf | Bin 0 ->
+ 1932 bytes
+ .../expected/basics/Roboto-Regular.abc.default.61.ttf    | Bin 0 ->
+ 1744 bytes
+ .../expected/basics/Roboto-Regular.abc.default.63.ttf    | Bin 0 ->
+ 1668 bytes
+ test/subset/data/tests/basics.tests                      |   4 ++++
+ 5 files changed, 4 insertions(+)
+
+commit b3790a65a18e8402b2b09dfc24aaea40a51de569
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 27 17:23:30 2018 -0800
+
+    [subset] add a (failing for now) test for composite glyf hint dropping
+
+ src/hb-ot-glyf-table.hh     |  8 ++++----
+ test/api/test-subset-glyf.c | 27 +++++++++++++++++++++++++--
+ 2 files changed, 29 insertions(+), 6 deletions(-)
+
+commit 4c6023f861a4b87782c17ac626ffee7e93f15fc8
+Merge: d7633d0a 921b65cb
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 17:06:27 2018 -0700
+
+    Merge pull request #842 from googlefonts/maxp
+
+    [subset] when dropping hints, clear hint related fields in maxp.
+
+commit 921b65cbc29f0c2c9c13e9fb272dafe4c8a14591
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 14:37:18 2018 -0800
+
+    [subset] minor fixes in hb-ot-maxp-table.hh
+
+ src/hb-ot-maxp-table.hh | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+commit b26db48bfff804e139331817a86ecc811547afcd
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 14:14:05 2018 -0800
+
+    [subset] whitespace for hb-ot-maxp-table.hh
+
+ src/hb-ot-maxp-table.hh | 30 +++++++++++++++---------------
+ 1 file changed, 15 insertions(+), 15 deletions(-)
+
+commit a76344da796670f33b2fa48a9b1676545dac93c2
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 14:11:36 2018 -0800
+
+    [subset] Add maxpV1Tail instead of defining a struct inside maxp
+    for v1 data.
+
+ src/hb-ot-maxp-table.hh | 81
+ ++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 49 insertions(+), 32 deletions(-)
+
+commit f14d1b64c2d148ffdec95c17adbee3f185d5d436
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 27 13:49:00 2018 -0800
+
+    [subset] when dropping hints, clear hint related fields in maxp.
+
+ src/hb-ot-maxp-table.hh     | 43
+ ++++++++++++++++++++++++++++++++++++++++---
+ test/api/test-subset-glyf.c | 30 +++++++++++++++++++++++-------
+ 2 files changed, 63 insertions(+), 10 deletions(-)
+
+commit d7633d0a4091c025638ba3fc8fb0d8e9a0e9ff8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 27 12:50:57 2018 -0800
+
+    [BASE] More
+
+ src/hb-ot-layout-base-table.hh | 153
+ ++++-------------------------------------
+ 1 file changed, 12 insertions(+), 141 deletions(-)
+
+commit 7a70c20fec6ece9e729dc2634e2896a8d8eb9962
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 27 12:45:26 2018 -0800
+
+    [BASE] Clean up first 29%
+
+ src/hb-ot-layout-base-table.hh | 262
+ +++++++++++++++++++----------------------
+ src/hb-ot-layout-gsub-table.hh |   2 +-
+ 2 files changed, 125 insertions(+), 139 deletions(-)
+
+commit 101850f9e6b9e0932fe1dd4169f88d6764c669c1
+Merge: 5967eaba f110c0c8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 27 20:15:54 2018 +0330
+
+    Merge with master
+
+commit f110c0c8866c853c0d5a930564a2b69231a33322
+Merge: 4a1d51ef 0ad8c663
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 27 11:41:12 2018 +0330
+
+    Merge pull request #838 from harfbuzz/BASE
+
+    BASE table
+
+commit 0ad8c663e0b4602e2a413e77a8158bf8a46755d5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 26 12:45:08 2018 +0330
+
+    Remove public API of the branch
+
+ src/hb-ot-base.h               |  4 ++--
+ src/hb-ot-layout-base-table.hh | 20 +++++++++---------
+ src/hb-ot-layout.cc            | 48
+ ++++++++++++++++++++----------------------
+ 3 files changed, 35 insertions(+), 37 deletions(-)
+
+commit 4a1d51ef15a423706406f784a146078073147885
+Merge: d0caf7e5 903771b6
+Author: rsheeter <rsheeter@google.com>
+Date:   Mon Feb 26 20:23:41 2018 -0800
+
+    Merge pull request #818 from googlefonts/drophints
+
+    [subset] Drop hints
+
+commit 903771b6c7689b9eee9a11bac128c42f39833b2e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 26 19:50:06 2018 -0800
+
+    [subset] clearer name for trim() and better comment about composite
+    handling, per review feedback
+
+ src/hb-ot-glyf-table.hh |  8 +++++---
+ src/hb-subset-glyf.cc   | 17 ++++++++---------
+ 2 files changed, 13 insertions(+), 12 deletions(-)
+
+commit d0caf7e5e3294c25230ed0e5580c647fa0f1a2c8
+Merge: 6c844ae8 44dc36dd
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 19:24:18 2018 -0700
+
+    Merge pull request #840 from googlefonts/os2
+
+    [subset] During os2 subsetting update ulUnicodeRange[]c
+
+commit 44dc36dd82fc948a15e2ad0d605eb4a466b3553d
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:56:23 2018 -0800
+
+    [subset] update to comment in hb-ot-os2-unicode-ranges.hh
+
+ src/hb-ot-os2-unicode-ranges.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ad3f2f77dafdee524e836e732077ee9670602369
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:51:27 2018 -0800
+
+    [subset] small cleanups in hb-ot-os2-table.
+
+ src/hb-ot-os2-table.hh          | 5 +++--
+ src/hb-ot-os2-unicode-ranges.hh | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit f1c8fc3487d5c5efb8ee1804acb07e6e282d3bc5
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:48:51 2018 -0800
+
+    [subset] small updates to gen-unicode-ranges.py
+
+ src/gen-unicode-ranges.py       | 6 ++++--
+ src/hb-ot-os2-unicode-ranges.hh | 3 ++-
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 0c0fe2ff8209228f2ddfce464b7b6f1b1ee1654a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:47:10 2018 -0800
+
+    [subset] Move util/generated-unicode-ranges.py to
+    src/gen-unicode-ranges.py
+
+ util/generate-unicode-ranges.py => src/gen-unicode-ranges.py | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit f630ae5161bfc8420f9ae0127fd8c7f447874fdd
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:46:17 2018 -0800
+
+    [subset] unsigned int -> hb_codepoint_t.
+
+ src/hb-ot-os2-unicode-ranges.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6368ce4c927b1457cf19945d5957e91d4621dc8b
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 17:44:39 2018 -0800
+
+    [subset] const in _compare_range.
+
+ src/hb-ot-os2-unicode-ranges.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 0be9fea0a96701b159a9db190e55b1c3efc38a28
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 16:15:09 2018 -0800
+
+    [subset] Add comment to os2UnicodeRangesSorted.
+
+ src/hb-ot-os2-unicode-ranges.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e20ab71d12b032371b830b76462e5e979d963b58
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 16:13:10 2018 -0800
+
+    [subset] Fix incorrect index.
+
+ src/hb-ot-os2-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 074b5a29a166d1812abc7229a71af4a3bb311536
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 16:11:24 2018 -0800
+
+    [subset] Add special case handling of bit 57 in os2 ulUnicodeRange.
+
+ src/hb-ot-os2-table.hh     | 7 +++++++
+ src/test-unicode-ranges.cc | 3 ---
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit ddc4f2b9fc5566e70558a57133289f84d467cc98
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 15:59:32 2018 -0800
+
+    [subset] Add python util that was used to generated
+    hb-ot-os2-unicode-ranges.hh
+
+ util/generate-unicode-ranges.py | 50
+ +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 50 insertions(+)
+
+commit f757757eda5f00a89a156e3427bdf8c4313611ef
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 15:56:36 2018 -0800
+
+    [subset] Add cmake build def for test-unicode-ranges.
+
+ CMakeLists.txt  | 2 +-
+ src/Makefile.am | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit f82f2a3e50805503d93aa1aa1ccb27da4967a14a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 15:52:01 2018 -0800
+
+    [subset] Rename hb-os2-unicode-ranges.cc to test-unicode-ranges.cc.
+
+ src/Makefile.am                                             | 2 +-
+ src/{hb-ot-os2-unicode-ranges.cc => test-unicode-ranges.cc} | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 4014555ca083dea3e4f42120aeaf52a2186b8a09
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 15:50:13 2018 -0800
+
+    [subset] set ulUnicodeRange[] in os2.
+
+ src/Makefile.sources            |   1 -
+ src/hb-ot-os2-table.hh          |  23 ++++-
+ src/hb-ot-os2-unicode-ranges.cc | 221
+ ++--------------------------------------
+ src/hb-ot-os2-unicode-ranges.hh | 210
+ +++++++++++++++++++++++++++++++++++++-
+ 4 files changed, 236 insertions(+), 219 deletions(-)
+
+commit a570142d0c6d819feeeeb9e209fc90a33c1c2b48
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 26 15:20:23 2018 -0800
+
+    [subset] Move hb-ot-os2-unicode-ranges into a cc file with a helper
+    methods and tests.
+
+ src/Makefile.am                 |   9 +-
+ src/Makefile.sources            |   2 +
+ src/hb-ot-os2-unicode-ranges.cc | 279
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-os2-unicode-ranges.hh | 189 +--------------------------
+ 4 files changed, 292 insertions(+), 187 deletions(-)
+
+commit 8e81799b32f3dfaca000fa5d42943ceed9af8d17
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 18:35:41 2018 -0800
+
+    [subset] Add hb-ot-os2-unicode-ranges.hh, a map of os2 unicode ranges.
+
+ src/hb-ot-os2-unicode-ranges.hh | 220
+ ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 220 insertions(+)
+
+commit 6c844ae8e89f52f5f40eace66bb987544fc316e3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 26 23:04:27 2018 +0330
+
+    [dev-run] show images using iTerm2 images feature
+
+ src/dev-run.sh | 32 ++++++++++++++++++++++++++++----
+ 1 file changed, 28 insertions(+), 4 deletions(-)
+
+commit 28c4245e9f76c6c53a4589e7745a60ed0e97414a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 01:10:42 2018 -0800
+
+    [aat/ankr] Define Anchor struct
+
+ src/hb-aat-layout-ankr-table.hh | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit e347fb908b188f71df13215c8939b0f3a12c716f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 01:08:00 2018 -0800
+
+    Minor
+
+ src/hb-ot-layout-gdef-table.hh |  4 ++--
+ src/hb-ot-layout-gpos-table.hh | 12 ++++++------
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 05fbd14e715ed5d0f0f86388b1538ad8e8c7c506
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 01:04:16 2018 -0800
+
+    [aat/ankr] Minor
+
+    DEFINE_SIZE_MIN is to be used only in rare cases. For fixed-size
+    structs
+    we want DEFINE_SIZE_STATIC.
+
+ src/hb-aat-layout-ankr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f90cd9b1f5ade8ad5e3b7caf0272936ad7a0f419
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 01:03:23 2018 -0800
+
+    [aat/ankr] Hook up Lookup table
+
+ src/hb-aat-layout-ankr-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c36598450e9698168851c0ae7d0b4c9e562c4924
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 00:57:07 2018 -0800
+
+    [aat/ankr] Simplify
+
+ src/hb-aat-layout-ankr-table.hh | 36 ++++++++----------------------------
+ 1 file changed, 8 insertions(+), 28 deletions(-)
+
+commit fa3a69e2334ec4122d672670614a8e5a95611d75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 00:32:11 2018 -0800
+
+    [aat/trak] Simplify sanitize()
+
+ src/hb-aat-layout-trak-table.hh | 67
+ ++++++++++-------------------------------
+ 1 file changed, 16 insertions(+), 51 deletions(-)
+
+commit f0bc6c0992c4302ae1a20f155ad256bfa331087c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 26 00:18:17 2018 -0800
+
+    [aat/trak] Clean up
+
+    We always just used "unsigned int" for counter values. There's
+    no use for uint16_t outside of a struct.
+
+    Also, no need for explict casting where implicit does.
+
+ src/hb-aat-layout-trak-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit bb82f01383db7cf05040fbd5881e17e263ef6369
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 25 12:30:33 2018 +0330
+
+    [aat] trak sanitization
+
+ src/dev-run.sh                  |  4 +-
+ src/hb-aat-layout-trak-table.hh | 95
+ ++++++++++++++++++++++++++++++++---------
+ src/hb-aat-layout.cc            |  2 +-
+ util/options.hh                 |  2 +-
+ 4 files changed, 78 insertions(+), 25 deletions(-)
+
+commit becb1d9eea15c07f9ea4e229be56f9aca0f768af
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 26 11:29:48 2018 +0330
+
+    [aat] minor
+
+    Ops, this was done for testing
+
+ src/hb-aat-layout-ankr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit df1c7d5b60520d2b3c756b700d5ac41668fc0983
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 25 19:06:25 2018 -0800
+
+    Minor
+
+ src/hb-open-type-private.hh | 5 +++--
+ src/hb-subset.cc            | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 6dd46fa598cacdd046ba4548bc6ddf7f37c46dee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 25 18:54:52 2018 -0800
+
+    [aat/trak] Minor
+
+    Maybe we should make DEFINE_* make structs uncopyable.
+
+ src/hb-aat-layout-trak-table.hh | 56
+ +++++++++++++++++++++++------------------
+ 1 file changed, 32 insertions(+), 24 deletions(-)
+
+commit ae14dd0fb0a176f6f0143690907b51626999d248
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 26 00:31:09 2018 +0330
+
+    [aat] Implement ankr
+
+ src/Makefile.sources            |  3 +-
+ src/hb-aat-layout-ankr-table.hh | 86
+ +++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout-kerx-table.hh |  2 +-
+ src/hb-aat-layout.cc            | 37 +++++++++++++-----
+ src/hb-ot-layout-private.hh     |  6 ++-
+ src/hb-ot-layout.cc             |  6 ++-
+ 6 files changed, 124 insertions(+), 16 deletions(-)
+
+commit 551fa2d200a06d00d054f2c8e7aad1cb4d25249b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 25 16:32:17 2018 -0800
+
+    [BASE] Minor
+
+ src/Makefile.sources           |   1 -
+ src/hb-ot-base.cc              |  58 -----------------------
+ src/hb-ot-layout-base-table.hh | 103
+ ++++++++++++++++++++++++++++-------------
+ src/hb-ot-layout.cc            |  34 ++++++++++++++
+ src/hb-ot-layout.h             |   1 +
+ 5 files changed, 105 insertions(+), 92 deletions(-)
+
+commit 05699fd996ed9c0e5dde8918388ac188e58df1a7
+Merge: 83af6c23 3ebcd5a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 24 12:01:54 2018 -0800
+
+    Merge remote-tracking branch 'eroux/add-base'
+
+commit a8d3c2c030d2c21c70e0b8bd43f7d05ff4818b75
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 24 16:42:12 2018 +0330
+
+    [ci] Add clang O3/O0 testers (#834)
+
+ .circleci/config.yml | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit c73255f3eb2f060ec72d18790b374f6b6e4032aa
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sat Feb 24 00:44:07 2018 +0200
+
+    Workaround for old automake on Travis Linux images
+
+    https://github.com/harfbuzz/harfbuzz/pull/821#issuecomment-368116538
+
+ .ci/fail.sh | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit cd28eb9f5dc237325c64380d9d87e673b8e94985
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 24 14:17:54 2018 +0330
+
+    Add -Werror=unused-function check to Travis (#832)
+
+ .travis.yml          |  4 ++--
+ src/hb-aat-layout.cc | 24 ++++++++++++------------
+ test/api/test-set.c  | 19 ++++++++++---------
+ 3 files changed, 24 insertions(+), 23 deletions(-)
+
+commit 1ab16f4556ef3e54a40b63cf4570c0ae986894e7
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 24 12:49:42 2018 +0330
+
+    [aat] Implement trak logic (#816)
+
+ src/hb-aat-layout-kerx-table.hh |  7 ++++
+ src/hb-aat-layout-private.hh    |  3 ++
+ src/hb-aat-layout-trak-table.hh | 78
+ +++++++++++++++++++++++++++++++++++++++--
+ src/hb-aat-layout.cc            | 46 ++++++++++++++++++++++++
+ src/hb-open-type-private.hh     |  4 +--
+ src/hb-ot-layout-private.hh     | 22 ++++++++++++
+ src/hb-ot-layout.cc             |  4 +++
+ src/hb-ot-shape.cc              |  2 ++
+ 8 files changed, 161 insertions(+), 5 deletions(-)
+
+commit b91e8da36e164168cd532fd6e6950c5d743a14dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 22:51:17 2018 -0800
+
+    Include hb-version.h in git (#825)
+
+ CMakeLists.txt       | 36 ++++++++++++++--------------
+ src/Makefile.am      |  8 +++----
+ src/Makefile.sources |  3 ---
+ src/hb-version.h     | 66
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 87 insertions(+), 26 deletions(-)
+
+commit 5267520e078ed413df78f3a6781fd5370b6da63a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 18:36:22 2018 -0800
+
+    [subset] update hdmx test to create input explicitly
+
+ test/api/test-subset-hdmx.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2e3ee489f8374227fa94a8d8684e839e643888ea
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 18:18:54 2018 -0800
+
+    [subset] format tweak, doc string
+
+ src/hb-subset-input.cc | 12 +++++++++---
+ src/hb-subset.h        |  2 +-
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+commit d78393b5547135b8db0356b0ec14d5ed0d334768
+Merge: 1454d82a 83af6c23
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 17:53:26 2018 -0800
+
+    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into
+    drophints
+
+commit 1454d82a9d3d9a47901b3d92ff7f2c05c596c0d5
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 17:49:23 2018 -0800
+
+    [subset] keep glyph trim separate of more general get_offset
+
+ src/hb-ot-glyf-table.hh | 12 ++++--------
+ src/hb-subset-glyf.cc   |  6 ++++--
+ 2 files changed, 8 insertions(+), 10 deletions(-)
+
+commit 0ac8c0c1e6a6c076ce33b16baa173ff8763ac04e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 17:43:00 2018 -0800
+
+    [subset] zero glyf and loca memory before writing so pads are
+    clean. Test just the part of maxp we care about
+
+ src/hb-ot-glyf-table.hh     |  6 +++---
+ src/hb-subset-glyf.cc       |  4 ++--
+ test/api/test-subset-glyf.c | 19 ++++++++++++++++---
+ 3 files changed, 21 insertions(+), 8 deletions(-)
+
+commit 83af6c237f2bfd66af76a8647a62b3d1ab996744
+Merge: 7e5e1feb dc5c7927
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 18:33:25 2018 -0700
+
+    Merge pull request #829 from googlefonts/test-checksum
+
+    [subset] Caclculate head table checksum adjustment
+
+commit dc5c7927e75ea09461e46fe6e56897091b4b4f00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 16:42:06 2018 -0800
+
+    [subset] Caclculate head table checksum adjustment
+
+    Test still fails, because we do not serialize tables in the same
+    order that fonttools subsetter does.
+
+ src/hb-open-file-private.hh | 51
+ ++++++++++++++++++++++++++++++++++-----------
+ src/hb-ot-head-table.hh     |  2 ++
+ src/hb-subset.cc            |  2 ++
+ 3 files changed, 43 insertions(+), 12 deletions(-)
+
+commit 7e5e1feb666d6a861b5cd64bf29a16e3854fb812
+Merge: ec2538c8 99967e21
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 17:59:08 2018 -0700
+
+    Merge pull request #828 from googlefonts/mem-fixes
+
+    [subset] Fix several memory leaks in subsetting.
+
+commit ec2538c8803be254b6e09ca0ea724b07c35126da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 15:51:26 2018 -0800
+
+    [subset] Fix checksum calc out-of-bounds access
+
+ src/hb-open-file-private.hh | 18 ++++++++++--------
+ src/hb-open-type-private.hh |  3 ++-
+ 2 files changed, 12 insertions(+), 9 deletions(-)
+
+commit 99967e21c6e3f6882d6eadf5c22f4120684b1fc5
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:45:45 2018 -0800
+
+    [subset] Fix memory leak in hb-subset-glyf.
+
+ src/hb-subset-glyf.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e61f360dc828bfd46477b7ddff56874da9f03538
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:44:21 2018 -0800
+
+    [subset] Fix memory leak in hb-subset-plan.
+
+ src/hb-subset-plan.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 66b0a390793ab06692dd49e67baef52a6a7d82aa
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:41:52 2018 -0800
+
+    [subset] Fix memory leak in hb-subset.
+
+ src/hb-subset.cc | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 0fb8a5ce192025ffd83ae714db932e4b86594ae1
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:37:43 2018 -0800
+
+    [subset] Fix memory leak in cmap subsetting.
+
+ src/hb-ot-cmap-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 4665aaa19304bdf0362bdfcebcae65feb19a8964
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:36:14 2018 -0800
+
+    [subset] Fix memory leak in hmtx subsetting.
+
+ src/hb-ot-hmtx-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 5a36b55fba03cd07c9b101f0222b8d189bcd3bbf
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 15:30:14 2018 -0800
+
+    [subset] Fix memory leak in subset face destroy.
+
+ src/hb-subset.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d38f37b2e37942a3fd13cd753c8b8587a06c0f3a
+Author: Ben Boeckel <mathstuf@users.noreply.github.com>
+Date:   Fri Feb 23 16:55:53 2018 -0500
+
+    autoconf: provide a harfbuzz-config for use from CMake (#822)
+
+ configure.ac                 |  2 ++
+ src/Makefile.am              |  4 ++-
+ src/harfbuzz-config.cmake.in | 82
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 87 insertions(+), 1 deletion(-)
+
+commit e0939d811f1fdeda9c5763e7e53887b3d3cb21eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 13:19:34 2018 -0800
+
+    Clean up check-defs and check-symbols (#821)
+
+    Also, call c++filt on their results.
+
+    Also build and fix and check harfbuzz-gobject.def
+
+    Also changes harfbuzz-gobject to distribute generated enum sources.
+
+ CMakeLists.txt              |  3 +--
+ src/Makefile.am             | 33 ++++++++++++++++------------
+ src/Makefile.sources        |  9 +++++---
+ src/check-defs.sh           | 52
+ ---------------------------------------------
+ src/check-symbols.sh        | 30 ++++++++++++++++++++------
+ src/hb-gobject-enums.h.tmpl |  3 ++-
+ src/hb-gobject-structs.h    | 45 ++++++++++++++++++++++++++-------------
+ 7 files changed, 81 insertions(+), 94 deletions(-)
+
+commit 9bd6d25254d9bfc612004982dba286a3751d1d29
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 23 13:05:58 2018 -0800
+
+    [subset] clone trim logic from fonttools glyf handling
+
+ src/hb-ot-glyf-table.hh                      |  92
+ ++++++++++++++++++++++++++-
+ src/hb-subset-glyf.cc                        |  26 ++++----
+ src/hb-subset-plan.cc                        |   3 +
+ src/hb-subset.cc                             |  13 ++--
+ test/api/fonts/Roboto-Regular.ac.nohints.ttf | Bin 1128 -> 848 bytes
+ test/api/hb-subset-test.h                    |   1 +
+ test/api/test-subset-glyf.c                  |   6 +-
+ 7 files changed, 117 insertions(+), 24 deletions(-)
+
+commit b1ec82105189053d648a798cf5b3ab2887046298
+Merge: e15e41ef c2e4713b
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 23 12:32:18 2018 -0700
+
+    Merge pull request #823 from googlefonts/hdmx
+
+    [subset] Add hdmx subsetting.
+
+commit e15e41ef12e146333e355defef8db210378b5be0
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 18:41:50 2018 -0800
+
+    [subset] Remove commented code from run-tests.py.
+
+ test/subset/run-tests.py | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 2b844803433bd1557a7fd0c93a91c66ef5319b21
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 18:38:44 2018 -0800
+
+    [subset] Update expected files for subsetting integration test to
+    not include cmap 4.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1740 ->
+ 1692 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit a88504c601ac95601730bd602861c13e5ac4fdd8
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 14:28:18 2018 -0800
+
+    [subset] Fix checksum clearning in subset test diff. Add an updated
+    expected file (has cmap4 restored).
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1692 ->
+ 1740 bytes
+ test/subset/run-tests.py                              |   7 +++++--
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 537698b60131bd3d7999919a04596c41dda6b2e4
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 14:07:52 2018 -0800
+
+    [subset] Don't compare actual to itself in Fix
+    test/subset/run-tests. Print a diff on failure.
+
+ test/subset/run-tests.py | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit c2e4713b5b561675b0f7b358ccf83d64ef0b6c41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 10:45:03 2018 -0800
+
+    [hdmx] Fix sanitize()
+
+ src/hb-ot-hdmx-table.hh | 23 +++++++----------------
+ 1 file changed, 7 insertions(+), 16 deletions(-)
+
+commit 84d4bb91ceca22484abb597c19eb18311e2514f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 10:38:35 2018 -0800
+
+    [hdmx] Minor
+
+ src/hb-ot-hdmx-table.hh | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit cf7a6e520e9601da9d27bc8f6bbe5d2eff23998d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 23 10:34:26 2018 -0800
+
+    [hdmx] Move DeviceRecord to toplevel again
+
+    More readable.
+
+ src/hb-ot-hdmx-table.hh | 112
+ ++++++++++++++++++++++++------------------------
+ 1 file changed, 57 insertions(+), 55 deletions(-)
+
+commit 96d7805a9235443972c6b6c5cd9502283c8836e9
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 16:48:28 2018 -0800
+
+    [subset] More complete sanitization implementation for hdmx.
+
+ src/hb-ot-hdmx-table.hh | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+commit c02532a3d2325c8fb9332f63f687cbaec77b2239
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 16:40:50 2018 -0800
+
+    [subset] Formatting and comments in hdmx.
+
+ src/hb-ot-hdmx-table.hh | 31 +++++++++++++++++++------------
+ 1 file changed, 19 insertions(+), 12 deletions(-)
+
+commit 6b372f439b257808b048d02ebf5a867dabcd1231
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 12:00:00 2018 -0800
+
+    [subset] In hb-ot-hdmx-table, s/glyf/hdmx.
+
+ src/hb-ot-hdmx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec302ad5bda6bea870f6d33f9698a1782472a213
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 22 11:57:35 2018 -0800
+
+    [subset] Fail subset if a table fails to sanitize.
+
+ src/hb-subset.cc | 19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+commit 15fc45bfedef433025145289fe916739907b573b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 17:59:57 2018 -0800
+
+    [subset] Add a unit test for hdmx subsetting.
+
+ test/api/Makefile.am        |  2 ++
+ test/api/test-subset-hdmx.c | 81
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 83 insertions(+)
+
+commit aa4aa2353c52f86fd56446de6b7ff86a9e990b9c
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 17:43:32 2018 -0800
+
+    [subset] Enable hdmx subsetting.
+
+ src/hb-subset.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit bd18b6adf8697c1ce3f4e3831b9f2a99d930e97d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 17:42:58 2018 -0800
+
+    [subset] Move DeviceRecord inside of hdmx.
+
+ src/hb-ot-hdmx-table.hh | 98
+ +++++++++++++++++++++++++------------------------
+ 1 file changed, 50 insertions(+), 48 deletions(-)
+
+commit 6704cded65985b2de262bdd3bb0887929e5a3b0b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 16:00:10 2018 -0800
+
+    [subset] Add hdmx subsetting implementation.
+
+ src/hb-ot-hdmx-table.hh | 29 ++++++++++++++++++++++++++---
+ 1 file changed, 26 insertions(+), 3 deletions(-)
+
+commit 84b68e58862647b4ede414b2e608c47d390fd60a
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 15:43:47 2018 -0800
+
+    [subset] In hdmx serialize set the correct value of sizeDeviceRecord.
+
+ src/hb-ot-hdmx-table.hh | 29 ++++++++++++++++-------------
+ 1 file changed, 16 insertions(+), 13 deletions(-)
+
+commit dddf44279f610e77e8b9a0819fd91f48802158b6
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 15:36:09 2018 -0800
+
+    [subset] When serializing a DeviceRecord in hdmx pad to make 32
+    bit aligned.
+
+ src/hb-ot-hdmx-table.hh | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+commit ab7a8f3b7419b604816e12cb93e77c0ba45a57af
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 15:15:22 2018 -0800
+
+    [subset] Begin implementing serialize for hdmx.
+
+ src/hb-ot-hdmx-table.hh | 79
+ +++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 77 insertions(+), 2 deletions(-)
+
+commit fe42862ab30d17483a1d0c2e2b1d859d01bbaff1
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 21 14:18:49 2018 -0800
+
+    [subset] Sketch out a basic hb-ot-hdmx.hh.
+
+ src/Makefile.sources    |  1 +
+ src/hb-ot-hdmx-table.hh | 77
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc        |  1 +
+ 3 files changed, 79 insertions(+)
+
+commit 4f6f7c3b22ec788f609bdffc7e0893816657b3a0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Feb 23 02:54:12 2018 +0330
+
+    [util] Implement ppem/ptem on hb-{shape,view} (#811)
+
+ util/options.cc | 33 ++++++++++++++++++++++++++++-----
+ util/options.hh |  6 ++++++
+ 2 files changed, 34 insertions(+), 5 deletions(-)
+
+commit a6bd6bcee08c9522f9269b5c63f784688abddcff
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 22 16:52:56 2018 +0330
+
+    [dev-run] minor
+
+ src/dev-run.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa13a04cf3345311a2434f0d7f6346f967491c45
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 22 16:48:03 2018 +0330
+
+    [dev-run] Add gdb/lldb shortcuts
+
+ src/dev-run.sh | 40 +++++++++++++++++++++++++++++++---------
+ 1 file changed, 31 insertions(+), 9 deletions(-)
+
+commit 4f07437dfebd3dc5923f40154c6f1b7e1dce1bd4
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 21 22:23:05 2018 -0800
+
+    [subset] sketch out dropping in-glyf instructions. Sometimes yields
+    differnet size glyphs than fonttools, possibly due to padding not
+    being corrected
+
+ src/hb-ot-glyf-table.hh                      |  45 ++++++++++++++++
+ src/hb-subset-glyf.cc                        |  78
+ +++++++++++++++++++++------
+ src/hb-subset-input.cc                       |   6 +++
+ src/hb-subset.h                              |   2 +
+ test/api/fonts/Roboto-Regular.ac.nohints.ttf | Bin 0 -> 1128 bytes
+ test/api/hb-subset-test.h                    |  15 +++---
+ test/api/test-subset-cmap.c                  |   4 +-
+ test/api/test-subset-glyf.c                  |  32 +++++++++--
+ test/api/test-subset-hmtx.c                  |  10 ++--
+ test/api/test-subset-os2.c                   |   2 +-
+ 10 files changed, 160 insertions(+), 34 deletions(-)
+
+commit 2d0265242bb9a080886d6e0aa653c62e5770a15a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 21 09:42:46 2018 -0800
+
+    [subset] keep the result of _subset
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4fb97be78d9287e489c9f67d1bfe7682235bdf38
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 21 14:38:02 2018 -0800
+
+    Add two more ragel-generated headers
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/817
+
+ src/hb-buffer-deserialize-json.hh | 643
+ ++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer-deserialize-text.hh | 571 +++++++++++++++++++++++++++++++++
+ 2 files changed, 1214 insertions(+)
+
+commit 74e0c13a4a55848e797242c02c8f067e587ea603
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 21 11:19:18 2018 -0800
+
+    [subset] drop hint tables if so flagged. Still need to dump glyf
+    instructions.
+
+ src/hb-subset-plan.cc    |  1 +
+ src/hb-subset-plan.hh    |  2 ++
+ src/hb-subset-private.hh |  2 +-
+ src/hb-subset.cc         | 11 +++++++++--
+ util/hb-subset.cc        |  2 +-
+ util/options.cc          |  2 +-
+ util/options.hh          |  4 ++--
+ 7 files changed, 17 insertions(+), 7 deletions(-)
+
+commit edee28801e4dbb5b734b4038d93fe1594e267ab1
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 21 22:13:58 2018 +0330
+
+    Add .editorconfig (#810)
+
+    More information: http://editorconfig.org/
+
+ .editorconfig | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 0bd100e144885ed8144cf23e7e106014858a1724
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 21 10:34:00 2018 -0800
+
+    [subset] add --hinting flag
+
+ src/hb-subset-private.hh |  1 +
+ util/hb-subset.cc        |  6 +++++-
+ util/options.cc          | 15 +++++++++++++++
+ util/options.hh          | 14 ++++++++++++++
+ 4 files changed, 35 insertions(+), 1 deletion(-)
+
+commit 7ecca8c0a83a6c71154fcc80887a4f895c0c5a23
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 21 09:42:46 2018 -0800
+
+    [subset] keep the result of _subset
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eada749e4642ea90300c9c68c226fa76a3e35a75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 21 00:35:23 2018 -0800
+
+    Use HB_SET_VALUE_INVALID consistently
+
+ src/hb-ot-layout-common-private.hh | 6 +++---
+ src/hb-ot-shape.cc                 | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 2cc845f311b6dc4f0feda8b8fc5609fbd51b5923
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 18:13:41 2018 -0800
+
+    [subset] fix calculation of range shiftz. Should be 16 * len -
+    searchRange not 16 * (len - searchRange).
+
+ src/hb-open-type-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 8e614ade5aef102baed56f91c2fcb1f3d1788ea9
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 17:36:54 2018 -0800
+
+    [subset] Reverse table order for font serialization to match what
+    OTS expects.
+
+ src/hb-open-file-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a998eeee4ad7bba4a1574c9735618891b6bd0948
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 16:48:52 2018 -0800
+
+    [subset] sanity check glyph data writes during glyph subsetting to
+    ensure they are inbounds.
+
+ src/hb-subset-glyf.cc | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 0ab73e594275cf064e09b9df2e1df337a589745d
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 15:33:03 2018 -0800
+
+    [subset] Sanity check that loca writes are inbounds.
+
+ src/hb-subset-glyf.cc | 55
+ ++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 41 insertions(+), 14 deletions(-)
+
+commit 73e20ec6e9ad86bea023fc8b6fc10287889ed048
+Merge: 6ae4013f 69e443b2
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 17:34:59 2018 -0700
+
+    Merge pull request #812 from googlefonts/cleanup
+
+    Clean up of glyf subsetting.
+
+commit 6ae4013f2e53d6496507a58b715298fee4eadcee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 20 15:02:25 2018 -0800
+
+    [aat] Cosmetic touch-ups to trak table
+
+ src/hb-aat-layout-trak-table.hh | 31 +++++++++++++++++--------------
+ 1 file changed, 17 insertions(+), 14 deletions(-)
+
+commit abc82b493e301e5588d689baa1434b3ce6577fcd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 20 14:34:16 2018 -0800
+
+    Add Ragel-generated files to git
+
+    I know it's bad form; I know I've said no to this multiple times...
+    But this is part of an experiment to see if we can make rolling
+    HarfBuzz
+    into Chrome much faster. That will give us a lot more testing exposure
+    that currently Chrome does.
+
+    Doing this while those files are still considered ignored by our
+    gitignore rules; will see how that flies.
+
+ autogen.sh                                 |   10 +-
+ src/Makefile.am                            |    3 +-
+ src/hb-ot-shape-complex-indic-machine.hh   | 1319
+ ++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-khmer-machine.hh   |  294 +++++++
+ src/hb-ot-shape-complex-myanmar-machine.hh |  413 +++++++++
+ src/hb-ot-shape-complex-use-machine.hh     |  502 +++++++++++
+ 6 files changed, 2535 insertions(+), 6 deletions(-)
+
+commit 69e443b254fceb29f26f6a0c0129fe3c93c19cfb
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 14:29:21 2018 -0800
+
+    [subset] Switch to hb_blob_copy_writable_or_fail in glyf subsetting.
+
+ src/hb-ot-glyf-table.hh | 29 +++++++++++------------------
+ src/hb-ot-maxp-table.hh |  3 +--
+ 2 files changed, 12 insertions(+), 20 deletions(-)
+
+commit e3e0ac98238b78530a625a6b7e7647dbabbe1c4d
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 20 14:07:40 2018 -0800
+
+    [subset] Move glyf subsetting code into hb-ot-glyf-table.hh
+
+ src/hb-ot-glyf-table.hh | 49
+ +++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-subset.cc        | 50
+ +------------------------------------------------
+ 2 files changed, 49 insertions(+), 50 deletions(-)
+
+commit d1f16fce963092404bf0b59e449a3215ca031b54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 20 10:32:09 2018 -0800
+
+    Don't use %zu
+
+    Some of our bots / compilers don't like it. Wasn't caught by bots
+    because this
+    is only in debug code.
+
+    https://github.com/harfbuzz/harfbuzz/pull/809/commits/825ad378e0f0e6e6bb690894a0d5d25f198be21b
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c7e834a2fc5f8fb81f5316447e4075902d58d8a3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 20 17:59:04 2018 +0330
+
+    [dev-run] minor
+
+ src/dev-run.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 975c35214f8c8f0d90a8b114e1a8c06d5ecdecfd
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 20 17:49:29 2018 +0330
+
+    [dev-run] Support autotools builds
+
+ src/dev-run.sh | 46 +++++++++++++++++++++++++++++++---------------
+ 1 file changed, 31 insertions(+), 15 deletions(-)
+
+commit 25136d9b7265d8920a78f3f832f1c69da4ef1f5b
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Tue Feb 20 10:26:07 2018 +0200
+
+    Use %zu format specifier for size_t to fix cross platform build
+
+    Fixes Chromium Android builds, compare
+    https://ci.chromium.org/buildbot/tryserver.chromium.android/linux_android_rel_ng/491787
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 53cf61b0299775f94c625de1bb0a7979b3b0c379
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 20 10:53:10 2018 +0330
+
+    Change Alpine and ArchLinux bot to test O3 and O0 on gcc, #801
+
+ .circleci/config.yml | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit a64eacd8a6cb9811bcaadf20b8b8ae56306cbd75
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 19 23:27:08 2018 +0330
+
+    [aat] First dig on 'trak'
+
+ src/Makefile.sources            |   3 +-
+ src/hb-aat-layout-trak-table.hh | 100
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |   3 +-
+ src/hb-ot-layout-private.hh     |   6 ++-
+ 4 files changed, 108 insertions(+), 4 deletions(-)
+
+commit 0bff6991de308044b077ce74bd45d57d8c4afe5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 19 11:51:25 2018 -0800
+
+    Ugh. Really fix build.
+
+ src/hb-subset-private.hh  | 2 +-
+ src/hb-subset.cc          | 3 +--
+ test/api/hb-subset-test.h | 1 +
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 4fcbd22b18040cbfd7410e6a090c5f9624eb9a0f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 19 11:49:25 2018 -0800
+
+    Fix build after previous commit
+
+ src/hb-subset-plan.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 0bbf90ded00dd00ee3f79c1bd16c775d7c893278
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 19 11:38:53 2018 -0800
+
+    [subset] Don't include hb-subset.h from hb.h
+
+ src/hb.h | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit fde04777d1d429fd0981002194f5c19599fda350
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 19 20:00:07 2018 +0330
+
+    Check availability of entr instead now that this works with it
+
+ src/dev-run.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b095ce59ebc5723a1b9c049eebb8f204455c9a72
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 19 11:58:20 2018 +0330
+
+    Simplify hb-fuzzer output printing and fix ArchLinux bot
+
+ test/fuzzing/run-fuzzer-tests.py | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit be51f763a752bed1c395bff19afe3291a6063d00
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 19 11:06:13 2018 +0330
+
+    Test debug builds on ArchLinux bot
+
+    Fixes #805
+
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e2d2d819848ed0ff1c60b9bde1f9c8f9495ec5b4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 17:28:53 2018 -0800
+
+    Limit how much work sanitize() can do
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=6022
+
+ src/Makefile.am                                       |   2 ++
+ src/hb-open-type-private.hh                           |  16
+ ++++++++++++++--
+ .../233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf      | Bin 0 ->
+ 1048576 bytes
+ test/shaping/data/in-house/tests/fuzzed.tests         |   1 +
+ 4 files changed, 17 insertions(+), 2 deletions(-)
+
+commit 7033fe5877c6f9500575f20f17135f74dc9c0547
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 17:12:04 2018 -0800
+
+    [aat] Minor
+
+ src/hb-aat-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6fa690c75a572a1076124b428b76929b2674e532
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 16:27:59 2018 -0800
+
+    Fix debug build
+
+    Context needs to be called 'c'. The TRACE_* rely on that.
+
+ src/hb-ot-cmap-table.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 05d1e77db8f3e5280e93b6885ff4f7df113b612b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 16:26:04 2018 -0800
+
+    [aat] Silence warning
+
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a21fceb05311f61ef179b2f3aa6497562555f241
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 16:10:15 2018 -0800
+
+    [ci] Make AppVeyor less noisy
+
+ appveyor.yml | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 1c50a88623a881a9e2b2b0f1f6a783962626f03a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 15:57:09 2018 -0800
+
+    Readjust mark attachment heuristic a bit more
+
+    Previously adjusted logic could fail if nothing around was ligated,
+    and something moved.  This should take care of that.
+
+    CC https://github.com/harfbuzz/harfbuzz/issues/740
+
+ src/hb-ot-layout-gpos-table.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 246e280d88b6b26757297a349f01e52c15eaec53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 15:42:25 2018 -0800
+
+    [test] Add test for https://github.com/harfbuzz/harfbuzz/issues/740
+
+ .../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf   | Bin 0 ->
+ 5680 bytes
+ test/shaping/data/in-house/tests/use.tests               |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 79756c9039a628b0df441228ca1ea20b8a91e3e8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 19 03:17:44 2018 +0330
+
+    [aat] First dig on 'kerx' (#704)
+
+ src/Makefile.sources            |   1 +
+ src/hb-aat-layout-kerx-table.hh | 377
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |   1 +
+ src/hb-ot-layout-private.hh     |   2 +
+ 4 files changed, 381 insertions(+)
+
+commit 279c70a5b36446f444e5d2f4ac1db7614c8a3db8
+Merge: e9164478 89b82814
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 14:04:33 2018 -0800
+
+    Merge pull request #796 from ebraminio/dev-run
+
+    Add a continuous builder using fswatch
+
+commit e91644786bf7c278e75962b851d5d47011ff175c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 12:41:24 2018 -0800
+
+    Remove unused check
+
+ configure.ac | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 89b82814b605d2bfcc481a47607e642a928dff15
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Feb 16 12:53:33 2018 +0330
+
+    Add a continuous builder using fswatch
+
+ CMakeLists.txt          | 24 +++++++++++++-----------
+ src/dev-run.sh          | 22 ++++++++++++++++++++++
+ test/api/CMakeLists.txt |  2 +-
+ 3 files changed, 36 insertions(+), 12 deletions(-)
+
+commit 0bd2d76bdd83569366762416bf7c8fd8e90021aa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 11:55:26 2018 -0800
+
+    [test] Fix a couple of coverity_scan issues
+
+ test/api/hb-subset-test.h | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+commit 8089711a61687d565f207c56d3d2b658f514d7ab
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 18 23:25:15 2018 +0330
+
+    Another attempt on fixing coverity
+
+    I hope I am in a correct direction at least
+
+ .travis.yml | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 79d0d791b9ee920e1f687a93de5adf5d113cc829
+Merge: 21646cc4 97a71102
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 11:35:51 2018 -0800
+
+    Merge pull request #800 from harfbuzz/bitops
+
+    Optimize set through optimized bit operations
+
+commit 97a71102153d28982297a190739c7d82e76b109e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 10:50:24 2018 -0800
+
+    Fix BitScanForward() usage
+
+    Should fix Win64 bot.
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit fe8f40a4180e7b02831a264c0b3c66763156abb6
+Merge: cd11107b 21646cc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 18 10:45:33 2018 -0800
+
+    Merge branch 'master' into bitops
+
+commit 21646cc4a6160088933774e179df9be4865a9f4b
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Feb 16 12:08:55 2018 -0500
+
+    Do not mark the first glyph as unsafe to break
+
+    Fixes #791.
+
+ src/hb-buffer-private.hh | 3 +--
+ src/hb-coretext.cc       | 4 ----
+ src/hb-directwrite.cc    | 2 --
+ src/hb-graphite2.cc      | 1 -
+ src/hb-uniscribe.cc      | 2 --
+ 5 files changed, 1 insertion(+), 11 deletions(-)
+
+commit 04dedec96b76600eecdb739b72814a4a56b270ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 18:32:57 2018 -0800
+
+    [test] Remove unused var
+
+ test/api/test-subset-hmtx.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 181b7471074cc814e0f498fc05fd6850c3f5e403
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 17:08:44 2018 -0800
+
+    Update outdated TODO file
+
+ TODO | 29 +----------------------------
+ 1 file changed, 1 insertion(+), 28 deletions(-)
+
+commit 6d56db8983e03fbebbeb61282bef8cb1f9abb8e2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 17:02:57 2018 -0800
+
+    [test/api] Distribute all fonts
+
+ test/api/Makefile.am | 21 ++-------------------
+ 1 file changed, 2 insertions(+), 19 deletions(-)
+
+commit e5ab34fd3a104f7ff2f0b36c66770c88b2ea1051
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 16:58:17 2018 -0800
+
+    Misc fixes
+
+    Should bring bag djgpp bot.
+
+ src/hb-ot-os2-table.hh | 54
+ +++++++++++++++++++++++++-------------------------
+ src/hb-subset-plan.cc  | 16 +++++++--------
+ 2 files changed, 34 insertions(+), 36 deletions(-)
+
+commit df9e22656de746bde65dee775a66f1a80f1c2e32
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 17:02:51 2018 -0700
+
+    [subset] add a glyf subsetting test for a font with composite glyphs.
+
+ .../api/fonts/Roboto-Regular.components.subset.ttf | Bin 0 -> 2052 bytes
+ test/api/fonts/Roboto-Regular.components.ttf       | Bin 0 -> 2572 bytes
+ test/api/test-subset-glyf.c                        |  21
+ +++++++++++++++++++++
+ 3 files changed, 21 insertions(+)
+
+commit c36d015b0e9c363431cd9d228b776ad419fde474
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 17:02:15 2018 -0700
+
+    [subset] missing return.
+
+ test/api/hb-subset-test.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2130392dcc30784ee34c487ab16316006c91f16d
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 17:01:00 2018 -0700
+
+    [subset] Add support for updating reference gids in components to
+    their new values.
+
+ src/hb-subset-glyf.cc | 38 +++++++++++++++++++++++++++++++++-----
+ 1 file changed, 33 insertions(+), 5 deletions(-)
+
+commit 49544eb860e523838892d6ce88eeca72ffd19da4
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 16:56:15 2018 -0700
+
+    [subset] Refactor composite glyf iteration code into an Iterator
+    outside of the accelerator.
+
+ src/hb-ot-glyf-table.hh | 110
+ +++++++++++++++++++++++++-----------------------
+ src/hb-subset-plan.cc   |   6 +--
+ 2 files changed, 60 insertions(+), 56 deletions(-)
+
+commit dc6d67df1395faf38d7587b1dd3c6661ee7cd6f0
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 15:20:14 2018 -0700
+
+    [subset] Use gids_to_retain_sorted to produce old gid -> new gid
+    mapping since it now has the more complete set.
+
+ src/hb-subset-plan.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit dcac9fe96429d4e272a3fbd60a6162f988f58f71
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 11:27:03 2018 -0700
+
+    [subset] Use complex glyph closure to populate gids_to_retain_sorted.
+
+ src/hb-subset-plan.cc | 43 ++++++++++++++++++++++++-------------------
+ src/hb-subset-plan.hh |  6 ++++++
+ 2 files changed, 30 insertions(+), 19 deletions(-)
+
+commit 58a54c9d4f72e228c012451c4469da730742d3d8
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 16 11:20:38 2018 -0700
+
+    [subset] add constant to get_composite and in_table methods in
+    hb-ot-glyf-table
+
+ src/hb-ot-glyf-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 73e1434814eb37005b4159babf972a2743b25700
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 15 14:41:56 2018 -0800
+
+    [subset] Add a DFS search to produce a closure of composite glyphs.
+
+ src/hb-subset-plan.cc | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit d3684141437fad6ebf5f9945f92125c9a42ea853
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 15 14:03:34 2018 -0800
+
+    [subset] add helper methods to glyf accelerator for reading composite
+    glyph information.
+
+ src/hb-ot-glyf-table.hh | 115
+ ++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 112 insertions(+), 3 deletions(-)
+
+commit cd11107bb44ac719709e10264e9e6ba6a1cfae0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 18:28:58 2018 -0800
+
+    Another bitops fallback fix
+
+    I'm confident that all bugs are hashed out now.
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4e517ecb6b7c27d4053a6476bb9262858e2567ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 18:20:12 2018 -0800
+
+    Another bitops fallback impl fix
+
+ src/hb-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit f18b9fbf6583dff72675be7859fc147ec24a0dd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 18:14:41 2018 -0800
+
+    [set] Implement iteration using bitop intrinsics
+
+ src/hb-set-private.hh | 55
+ ++++++++++++++++++---------------------------------
+ 1 file changed, 19 insertions(+), 36 deletions(-)
+
+commit 6a91a2eb04951f6e33706c2b8e9cd987b429fce9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 17:49:41 2018 -0800
+
+    Fix wide bitops implemenetation
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d25c3e69e9b0cb9d947e98845b9e3a14ce58e350
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 17:45:09 2018 -0800
+
+    [set] Readjust parameters
+
+ src/hb-set-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 6d5c0bf8b18ed53e8d40dcbae83ec66ed2116843
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 17:33:26 2018 -0800
+
+    Fix bitops fallback impl
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 82eb1dac163cb4aef8a2e4ebad542378f4e28dca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 16:52:09 2018 -0800
+
+    Flesh out other bit ops some more for 128bit as well
+
+ src/hb-private.hh | 165
+ +++++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 126 insertions(+), 39 deletions(-)
+
+commit 864a2dddae9eb1303c59d0d3717fce307a72a524
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 14:21:40 2018 -0800
+
+    Clean up bit functions
+
+    Compile all code-paths possible, to better catch errors.
+    Also enable MSVC ones on mingw which seems to support them.
+
+ src/hb-private.hh | 43 +++++++++++++++++++++++++++----------------
+ 1 file changed, 27 insertions(+), 16 deletions(-)
+
+commit 978ace6fbbc828adc20f21591d138f41d8508ebc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 16:06:17 2018 -0800
+
+    Improve _hb_popcount()
+
+    Support 128bit type.
+
+ configure.ac                   |  3 ++-
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-map.cc               |  2 +-
+ src/hb-private.hh              | 61
+ +++++++++++++++++++++++++++---------------
+ 4 files changed, 44 insertions(+), 24 deletions(-)
+
+commit 7b5ce7404716a17f91ff86d374c7b76ee7ce3247
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 15:37:22 2018 -0800
+
+    Fix warnings
+
+ src/hb-ot-os2-table.hh    | 2 +-
+ test/api/hb-subset-test.h | 3 ++-
+ test/api/hb-test.h        | 9 +++++++--
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 94d32d1b83892ed4f124463cf4322bf74b3e850d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 15:36:20 2018 -0800
+
+    Enable C99 if available
+
+    Hopefully we can now mix-and-match code and declaration in the C
+    test files.
+
+ configure.ac | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 926db874552519734fab6c04258887ea634f5324
+Merge: 882a3bf4 c7a633f9
+Author: rsheeter <rsheeter@google.com>
+Date:   Fri Feb 16 15:27:29 2018 -0800
+
+    Merge pull request #792 from googlefonts/master
+
+    Support more tables in subsetter
+
+commit 882a3bf4abcdac60414db41d54dbbb7d2368c908
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 14:17:20 2018 -0800
+
+    That didn't work...
+
+ RELEASING.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b1f186df78ed14cbc8be919e7f552df2bd7561e0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 16 14:13:38 2018 -0800
+
+    Add mingw32.sh and mingw64.sh
+
+ RELEASING.md | 28 +---------------------------
+ mingw32.sh   | 22 ++++++++++++++++++++++
+ mingw64.sh   | 22 ++++++++++++++++++++++
+ 3 files changed, 45 insertions(+), 27 deletions(-)
+
+commit d37310ac5d5f8a3fd1ce1e535647e7c6bb0d7926
+Author: Arkady Shapkin <arkady.shapkin@gmail.com>
+Date:   Fri Feb 16 21:45:08 2018 +0300
+
+    Remove checking macros __OPTIMIZE__ for MSVC
+
+    Visual C++ compiler doesn't define macros __OPTIMIZE__  when
+    optimizations enabled
+
+ src/hb-private.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 4eff0fc5b87084765ac2e36ba9f09d7d257f32fb
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Feb 16 20:22:52 2018 +0200
+
+    Make this work for old versions of automake
+
+ .ci/fail.sh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit f8077c97909778c117d37773c9da570d831dacd2
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Feb 15 11:47:08 2018 +0200
+
+    Print only the failed log
+
+ .ci/fail.sh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 8e3b4c0e11642470069b866a73768a866ac3fdb3
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Feb 15 11:25:24 2018 +0200
+
+    Simplify calls to collect-logs.sh
+
+ .ci/{collect-logs.sh => fail.sh} |  3 +++
+ .circleci/config.yml             | 13 +++++++++----
+ .travis.yml                      |  6 +++---
+ appveyor.yml                     |  2 +-
+ 4 files changed, 16 insertions(+), 8 deletions(-)
+
+commit c7a633f95710fcf2fe9151b41feba7db4b1bab0e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 16 11:11:20 2018 -0800
+
+    [subset] try to get more info from bot where g_assert_cmpmem fails
+
+ test/api/hb-subset-test.h | 12 +++++-------
+ test/api/hb-test.h        | 11 ++++++++---
+ 2 files changed, 13 insertions(+), 10 deletions(-)
+
+commit 0bb2d7ac12b7cf482580b6d2e8534eef8a233f96
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 16 06:26:02 2018 -0800
+
+    [subset] fix int type for blob length in hb-subset-test.h
+
+ test/api/hb-subset-test.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit be0a01a67613f45db7f7e9be84cb883f0344c817
+Merge: 7acaa3b7 139c9928
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 16 06:01:41 2018 -0800
+
+    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz
+
+commit 139c9928f6152088fa6eee0279e33cb821aeb541
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Feb 16 13:27:26 2018 +0330
+
+    Fix hb-private.hh compile issue
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6c10328eb88b0641586f31a782b63f45eada5609
+Author: Arkady Shapkin <arkady.shapkin@gmail.com>
+Date:   Thu Feb 15 23:17:46 2018 +0300
+
+    Use _BitScanForward and _BitScanReverse on MSVC
+
+ src/hb-private.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 7acaa3b781da835cdb11dbe523c819feb4eef996
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 14:28:29 2018 -0800
+
+    [subset] apparently C99 is too much to ask in 2018
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b1740106a9c825874faf3f1315770d1e3c790cf9
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 13:55:21 2018 -0800
+
+    [subset] fix format specifier for size_t
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e00c37aaae3922b425c0528bfdd36d59cf9c5796
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 12:53:52 2018 -0800
+
+    [subset] fix no matching function MIN in djgpp
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6122ad2442666d89ef39bdf5a2bb9d3f6d8e2b03
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 11:40:28 2018 -0800
+
+    [subset] add files to EXTRA_DIST
+
+ test/api/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 0758cbc4c2f52c629d05515b8d2816e8d6a2a2c1
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 11:29:01 2018 -0800
+
+    [subset] correct bug introduced to get_advance
+
+ src/hb-ot-hmtx-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 3fd11f4397aec9cda3a7d29246ab3ae56115ad36
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 15 11:15:12 2018 -0800
+
+    [subset] remove unused decl
+
+ src/hb-subset-private.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 23d21a74b55eaf6d6d367097099e6b3bb78bae37
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Feb 15 02:52:15 2018 +0200
+
+    Move collect_logs to .ci dir
+
+    Next to other CI scripts.
+
+ .collect_logs => .ci/collect-logs.sh | 0
+ .circleci/config.yml                 | 8 ++++----
+ .travis.yml                          | 6 +++---
+ appveyor.yml                         | 2 +-
+ 4 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 0e088a63d10dd09e025515bfa8ae68aa2922eaf6
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 21:11:45 2018 -0800
+
+    [subset] hmtx space bracket. authors++
+
+ src/hb-ot-hmtx-table.hh | 40 ++++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
+
+commit 1725c35da0ea2f829b6d6b6c1963607fd6dfb577
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 19:36:33 2018 -0800
+
+    [subset] cmap space bracket
+
+ src/hb-ot-cmap-table.hh | 72
+ ++++++++++++++++++++++++-------------------------
+ 1 file changed, 36 insertions(+), 36 deletions(-)
+
+commit e158739bfb9e5d60989e179fcc8744f3125e2067
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 19:22:37 2018 -0800
+
+    [subset] space bracket
+
+ src/hb-ot-hmtx-table.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 2d6b1e2af74abea645a943d264e148d56d018101
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 19:14:01 2018 -0800
+
+    [subset] maxp copy writeable fn
+
+ src/hb-ot-maxp-table.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 1efecd965fe81d65e2763be4f43df2d8c4d8be44
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 18:42:29 2018 -0800
+
+    [subset] hmtx use copy writeable fn instead of direct memory
+
+ src/hb-ot-hmtx-table.hh | 23 ++++-------------------
+ 1 file changed, 4 insertions(+), 19 deletions(-)
+
+commit 27012526f9b3848676bc2a4fb8e68c630af18620
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 19:01:00 2018 -0800
+
+    [subset] whitespace
+
+ test/api/test-subset-hmtx.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit b1bd0b5f506dad9d04fd3a6abcb92122f231e0f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 18:50:19 2018 -0800
+
+    [subset] Minor
+
+ src/hb-ot-cmap-table.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 83f57e24bfc2000373192ec44b067fdd7dee8a65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 18:43:53 2018 -0800
+
+    [test] Reinstate
+    test/shaping/data/in-house/tests/myanmar-syllable.tests
+
+ test/shaping/data/in-house/tests/myanmar-syllable.tests | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5ae6526ef4aa9b3c943cad984dc2fff09cdf597b
+Merge: 2903b2f3 04c1ec2b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 18:42:32 2018 -0800
+
+    [subset] Merge remote-tracking branch 'googlefonts/master'
+
+commit 04c1ec2b7396c05f6e8afc9d87679422782aa1e8
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 17:00:18 2018 -0800
+
+    [subset] Don't fail on different checksum adjustment in subsetting
+    tests.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1740 ->
+ 1692 bytes
+ test/subset/run-tests.py                              |   8 ++++++++
+ 2 files changed, 8 insertions(+)
+
+commit 0775bc0f7a59241456142b48abced75fd3db5a42
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 16:37:35 2018 -0800
+
+    [subset] Fix hhea subsetting and clean up some memory leaks.
+
+ src/hb-ot-hmtx-table.hh | 25 ++++++++++++++-----------
+ 1 file changed, 14 insertions(+), 11 deletions(-)
+
+commit b56c9384bcc177236debd26fdbbf14319e4c62b9
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 16:05:39 2018 -0800
+
+    [subset] Add missing face reference in hb-subset-plan plus ensure
+    all struct members are cleaned up on destroy.
+
+ src/hb-subset-plan.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit e0ffebead6230b8e1ee8dd97425505706321793e
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 16:01:08 2018 -0800
+
+    [subset] In hb-subset-test use hb_set_union instead of manually
+    copying set.
+
+ test/api/hb-subset-test.h | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit e330ef3711c543372f9f8550a967c512bbf87d83
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 15:57:11 2018 -0800
+
+    [subset] Restore hb_face_data_destroy to be internal.
+
+ src/hb-subset.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 3ab7d2649bf5c92d3837b3132d65d4659d0fa003
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 15:48:57 2018 -0800
+
+    [subset] Fix memory leak in hb-ot-{maxp,os2}. Plus some formatting.
+
+ src/hb-ot-maxp-table.hh |  6 ++++--
+ src/hb-ot-os2-table.hh  | 24 +++++++++++++-----------
+ 2 files changed, 17 insertions(+), 13 deletions(-)
+
+commit 2903b2f357eb495c9badac1b2f74e65e1d1075bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 15:46:27 2018 -0800
+
+    Another linker tweaking
+
+    Trying to fix this warning:
+    cc1: warning: command line option ‘-fno-threadsafe-statics’ is
+    valid for C++/ObjC++ but not for C
+
+    Let's see what the clang bots think of it.
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e1f1f96577a80846749782b6e199a661f4189ec0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 15:44:48 2018 -0800
+
+    [set] Tune size again
+
+    Switch from a 128+64 hierarchy, to 32+32. New page size is 1024.
+    This should make set iteration faster, without affecting other op
+    performances much.
+
+ src/hb-set-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 66e282df32410831f1c4e157e9dcf8c76f2bc3d8
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:31:13 2018 -0800
+
+    [subset] remove TODO that was already done
+
+ src/hb-subset-plan.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 4696624ad9987b0eebcf5c84dafdb204b886f28e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:30:49 2018 -0800
+
+    [subset] maxp wrong int type, note to use copy_writable_or_fail
+
+ src/hb-ot-maxp-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3ed70e5e64910e1c22225f542a525807b000cb2a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:24:49 2018 -0800
+
+    [subset] return bool not hb_bool_t from table::subset
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ src/hb-ot-maxp-table.hh | 2 +-
+ src/hb-ot-os2-table.hh  | 2 +-
+ src/hb-subset.cc        | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 88d56e241bd6bb768656d77cf8f99ccc97fb2446
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:20:43 2018 -0800
+
+    [subset] Use a supplier instead of memcpy and fix a few unnecessary
+    {}s for cmap
+
+ src/hb-ot-cmap-table.hh | 24 ++++++------------------
+ 1 file changed, 6 insertions(+), 18 deletions(-)
+
+commit 42a80f00d51317207c49611b76d6bba06230371b
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:04:35 2018 -0800
+
+    [subset] add free
+
+ src/hb-ot-hmtx-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d463e9f6b57bebb3aa4875fe11c927c26c3e3974
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 15:04:15 2018 -0800
+
+    [subset] Give Behdad credit again
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa87770372a3156658412ff0d70e32083c6b0484
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 14:16:25 2018 -0800
+
+    [subset] First pass at hmtx
+
+ src/hb-ot-cmap-table.hh                           |  19 +--
+ src/hb-ot-hhea-table.hh                           |   6 +-
+ src/hb-ot-hmtx-table.hh                           | 163
+ ++++++++++++++++++---
+ src/hb-ot-maxp-table.hh                           |   8 +-
+ src/hb-ot-os2-table.hh                            |   8 +-
+ src/hb-subset-glyf.cc                             |   5 +-
+ src/hb-subset-glyf.hh                             |   1 -
+ src/hb-subset-plan.cc                             |  12 ++
+ src/hb-subset-plan.hh                             |  10 ++
+ src/hb-subset-private.hh                          |  11 ++
+ src/hb-subset.cc                                  |  85 ++++++-----
+ test/api/Makefile.am                              |   7 +
+ test/api/fonts/Inconsolata-Regular.ab.ttf         | Bin 0 -> 5048 bytes
+ test/api/fonts/Inconsolata-Regular.abc.ttf        | Bin 0 -> 5224 bytes
+ test/api/fonts/Inconsolata-Regular.abc.widerc.ttf | Bin 0 -> 5228 bytes
+ test/api/fonts/Inconsolata-Regular.ac.ttf         | Bin 0 -> 4940 bytes
+ test/api/fonts/Inconsolata-Regular.ac.widerc.ttf  | Bin 0 -> 4944 bytes
+ test/api/fonts/README                             |   2 +
+ test/api/test-subset-hmtx.c                       | 164
+ ++++++++++++++++++++++
+ 19 files changed, 422 insertions(+), 79 deletions(-)
+
+commit 20022575c658b29796db80c387641309d0c49586
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 15 01:15:39 2018 +0330
+
+    Redirect email notifications to another mailing list dedicated for
+    this (#790)
+
+ .travis.yml  | 4 ++--
+ appveyor.yml | 5 +++++
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 581996ea7976847b6356c9cc81b564f0c278f0f3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Feb 15 00:43:46 2018 +0330
+
+    Add .collect_logs and use it on CI bots, fixes #786 (#789)
+
+ .circleci/config.yml | 8 ++++----
+ .collect_logs        | 6 ++++++
+ .travis.yml          | 6 +++---
+ appveyor.yml         | 2 +-
+ 4 files changed, 14 insertions(+), 8 deletions(-)
+
+commit e5edcc81bf14311c56bd2f50808552076c3c4d77
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 11:17:53 2018 -0800
+
+    [subset] Fix codepoint iteration in hb-subset-test.
+
+ test/api/hb-subset-test.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ccae99fdadcf86aeda15dc230a3ddcd6ff176533
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 11:12:09 2018 -0800
+
+    Another try
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8b1dbbef1aec3b6880186070e7386a5553d67b15
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 11:04:12 2018 -0800
+
+    Fix compile error in hb-subset-test.
+
+ test/api/hb-subset-test.h | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit f53627e19100df6eb7f32d58e7c4ce47a783f1a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 10:59:22 2018 -0800
+
+    [test] Fix warning
+
+ test/api/test-subset.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8c3612af650e4c8e01a9fdc127342b07b5c77962
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 10:57:34 2018 -0800
+
+    Tweak Makefile some more
+
+ src/Makefile.am | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit d594f947b68ad36d32ce107847f5f02ec3528076
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 10:55:25 2018 -0800
+
+    [subset] Allow linking to libstdc++
+
+    We want to use it.
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a0fe3011bafbe36e7d5810acc7df21bea08c802a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 14 10:52:41 2018 -0800
+
+    copy all cmap groups at once
+
+ src/hb-ot-cmap-table.hh | 14 ++++----------
+ 1 file changed, 4 insertions(+), 10 deletions(-)
+
+commit d008b62887afe631f50009f40e605c8456ddd011
+Merge: b0eefacf 109314cb
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 14 10:38:52 2018 -0800
+
+    Merge remote-tracking branch 'upstream/master' into fixed
+
+commit b0eefacf4cb885f510f9551bf2e9216808ca61e8
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 18:15:58 2018 -0800
+
+    [subset] Drop GSUB, GDEF, GPOS, and DSIG from subsetter expected
+    test outputs.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 2460 ->
+ 1740 bytes
+ test/subset/generate-expected-outputs.py              |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 89f17e3965ba776565f2de2bf56a4b135f336e53
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 18:14:50 2018 -0800
+
+    [subset] capitalize dsig.
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit df6d780355d7da805a9b9033452f8814c5360bba
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 17:56:17 2018 -0800
+
+    [subset] Extract maxp subsetting into hb-ot-maxp-table.
+
+ src/hb-ot-maxp-table.hh     | 19 ++++++++++++++++++-
+ src/hb-subset.cc            | 28 ++--------------------------
+ test/api/test-subset-glyf.c |  5 +++--
+ 3 files changed, 23 insertions(+), 29 deletions(-)
+
+commit 865b6971ad5c2ec4bc33c36a78a36b90da5f5543
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 17:42:20 2018 -0800
+
+    [subset] Add a test for OS/2 fixes during subsetting.
+
+ test/api/Makefile.am                |   2 ++
+ test/api/fonts/Roboto-Regular.b.ttf | Bin 0 -> 1996 bytes
+ test/api/test-subset-os2.c          |  59
+ ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 61 insertions(+)
+
+commit 343dfe89655683966836e44afb4fd32c47377844
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 17:33:48 2018 -0800
+
+    [subset] white and add inline in hb-ot-cmap-table.
+
+ src/hb-ot-cmap-table.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 24904383df03c472c865bd97bfe844f5e86a7172
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 17:31:01 2018 -0800
+
+    [subset] Correct usFirstCharIndex and usLastCharIndex in OS2 table
+    when subsetting.
+
+ src/hb-ot-os2-table.hh | 45 +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc       | 16 ++++++++++------
+ 2 files changed, 55 insertions(+), 6 deletions(-)
+
+commit 109314cb55e6d95d5c3a87b9ed1ba4e74a880078
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Feb 14 21:05:11 2018 +0330
+
+    Another attempt on fixing the tests on Travis (#788)
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 694eaf636713b8d0bbe13f38c2553b1a2f3d2d3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 14 01:00:10 2018 -0800
+
+    [set] Add backwards iterator
+
+    New API:
+    - hb_set_previous()
+    - hb_set_previous_range()
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-set-private.hh      | 79
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-set.cc              | 49 +++++++++++++++++++++++++++-
+ src/hb-set.h               | 19 ++++++++---
+ test/api/test-set.c        | 53 +++++++++++++++++++++++++++++--
+ 5 files changed, 194 insertions(+), 8 deletions(-)
+
+commit fe3bc524bd4f93bd67c13ed402720a13dd3484d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 23:51:45 2018 -0800
+
+    [set] Allow starting iteration from a non-member of the set
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a989f3edec5864d5de8b217aa595c962d8fc4b0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 22:12:36 2018 -0800
+
+    Add hb_blob_copy_writable_or_fail()
+
+    New API:
+    - hb_blob_copy_writable_or_fail()
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-blob.cc             | 25 +++++++++++++++++++++++++
+ src/hb-blob.h              |  3 +++
+ 3 files changed, 29 insertions(+)
+
+commit 9046e924421869bf167b52cd394e868796091f62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 22:07:12 2018 -0800
+
+    [subset] Rename constructor to hb_subset_input_create_or_fail()
+
+    To signify that unlike rest of library, returns nullptr on failure.
+
+ src/hb-subset-input.cc      | 6 ++----
+ src/hb-subset.h             | 2 +-
+ test/api/test-subset-glyf.c | 3 ++-
+ test/api/test-subset.c      | 7 +++++--
+ util/hb-subset.cc           | 2 +-
+ 5 files changed, 11 insertions(+), 9 deletions(-)
+
+commit 507804479a81672ec0c089313adad9fa308d78fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:46:28 2018 -0800
+
+    [use] Add dump-use-data
+
+ src/Makefile.am                        |  4 ++++
+ src/dump-use-data.cc                   | 38
+ ++++++++++++++++++++++++++++++++++
+ src/gen-use-table.py                   |  2 +-
+ src/hb-ot-shape-complex-use-private.hh |  2 +-
+ src/hb-ot-shape-complex-use-table.cc   |  2 +-
+ src/hb-ot-shape-complex-use.cc         |  4 ++--
+ 6 files changed, 47 insertions(+), 5 deletions(-)
+
+commit 15ba4fbe01433c8627f9e6a60106ca77d3e1ad4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:41:51 2018 -0800
+
+    [khmer] Add dump-khmer-data
+
+ src/Makefile.am                          |   4 +
+ src/Makefile.sources                     |   1 +
+ src/dump-khmer-data.cc                   |  43 +++++++++++
+ src/hb-ot-shape-complex-khmer-private.hh | 124
+ +++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-khmer.cc         |  98 +-----------------------
+ 5 files changed, 173 insertions(+), 97 deletions(-)
+
+commit effddd03bd6fb0aac14b46a16b281f3749e44780
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:38:15 2018 -0800
+
+    [myanmar] Add dump-myanmar-data
+
+ src/Makefile.am                            |   4 +
+ src/Makefile.sources                       |   1 +
+ src/dump-myanmar-data.cc                   |  43 ++++++++
+ src/hb-ot-shape-complex-indic-private.hh   |   8 +-
+ src/hb-ot-shape-complex-myanmar-private.hh | 171
+ +++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-myanmar.cc         | 138 +----------------------
+ 6 files changed, 225 insertions(+), 140 deletions(-)
+
+commit c0e45b60a001a45c8ed1f12af8f2f222161eca6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:23:38 2018 -0800
+
+    [indic] Rename print-indic-table to dump-indic-data
+
+    Makes more sense given what this prints, err, dumps.
+
+ src/Makefile.am                                  | 8 ++++----
+ src/{print-indic-table.cc => dump-indic-data.cc} | 0
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 9b878bd2165236b067d59410673cf5cc54968fa7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:22:47 2018 -0800
+
+    [indic] Explicitly number indic_position_t
+
+    So it's easier to cross-reference from output of print-indic-table.
+
+ src/hb-ot-shape-complex-indic-private.hh | 32
+ ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
+
+commit 8634846a0a1049c42ea84ca34402957c981b4c73
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 21:18:00 2018 -0800
+
+    More tweaking linker and linker flags
+
+ src/Makefile.am | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d830d3d2448b2248dff642c701b442e1260e2d85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 19:01:03 2018 -0800
+
+    [indic] Share some copy/pasta code
+
+ src/hb-ot-shape-complex-indic-private.hh | 29
+ +++++++++++++++++++++++++++--
+ src/hb-ot-shape-complex-indic.cc         | 27 ---------------------------
+ src/hb-ot-shape-complex-khmer.cc         | 30
+ ++++++++----------------------
+ src/hb-ot-shape-complex-myanmar.cc       | 19 ++-----------------
+ 4 files changed, 37 insertions(+), 68 deletions(-)
+
+commit 397ed53e55b9450742867a43d164b498ec735f50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 18:54:26 2018 -0800
+
+    [indic] Add print-indic-table
+
+ src/Makefile.am                          |  14 ++-
+ src/hb-ot-shape-complex-indic-private.hh | 185
+ ++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic.cc         | 187
+ -------------------------------
+ src/print-indic-table.cc                 |  43 +++++++
+ 4 files changed, 239 insertions(+), 190 deletions(-)
+
+commit fd0bde6325a7dfe3ba54b683646ca0693c414446
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 16:35:30 2018 -0800
+
+    [subset] Fix loca offsets
+
+    Was writing source font's offsets. Ouch.
+
+ src/hb-subset-glyf.cc | 30 +++++++++++-------------------
+ 1 file changed, 11 insertions(+), 19 deletions(-)
+
+commit aeed082e282b97e40c2e8590bdd8818affc7de6c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 14:02:59 2018 -0800
+
+    Another tweak at libstdc++ things
+
+    To fix this warning:
+
+    cc1: warning: command line option ‘-fno-threadsafe-statics’ is
+    valid for C++/ObjC++ but not for C
+
+ src/Makefile.am | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c7d7c9898e22905888dc4304f6d8e79b55654174
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 14:00:14 2018 -0800
+
+    [aat] Minor
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2dbfeecf96c6993d42594f43133d945d67ddbdbc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 13:59:39 2018 -0800
+
+    Minor
+
+ src/hb-aat-layout-morx-table.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit d5b33f2fe1603e894e21f45afb4c00c8d670fb5c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 13:50:50 2018 -0800
+
+    [subset] hb_subset_input_t changes
+
+ src/Makefile.sources        |   1 +
+ src/hb-face.h               |   1 -
+ src/hb-set.cc               |  14 +++---
+ src/hb-subset-input.cc      | 109
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset-plan.cc       |   2 +-
+ src/hb-subset-private.hh    |  11 ++++-
+ src/hb-subset.cc            |  40 ++--------------
+ src/hb-subset.h             |  12 ++++-
+ test/api/test-subset-glyf.c |   4 +-
+ test/api/test-subset.c      |   2 +-
+ util/hb-subset.cc           |  20 ++++----
+ 11 files changed, 153 insertions(+), 63 deletions(-)
+
+commit 28e63a1287fd38a98eed6725c2f4d0820066b0d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 13 13:39:50 2018 -0800
+
+    Disable threadsafe static's for all libraries
+
+    Even in libharfbuzz-subset, we still will handle our own threadsafety
+    for statics.
+
+ src/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7caddb51b1e69a2803f86756e2ce2acff685c7d0
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 13 15:12:43 2018 +0330
+
+    Specify the project name for coverity, trying to fix #785
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b969a82e30f0ff7bf6b2ea2600ef170764774a8c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 12 20:51:26 2018 -0800
+
+    Pass no-libstdc++ flags only to libraries suppressing it
+
+ src/Makefile.am | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 97a2f0320056b591d7a747022869fe9cd8ecc6e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 12 18:51:10 2018 -0800
+
+    [subset] Allocate bulk memory with malloc(), not calloc()
+
+    We use calloc() to allocate simple structs and set them to zero.
+    For bulk memory, use malloc() that doesn't zero.
+
+ src/hb-subset-glyf.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 96f1f52ea3a42b27f59aecffe65c918295e53b3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 12 18:48:51 2018 -0800
+
+    Use hb_face_get_upem() instead of face->get_upem()
+
+    Such that hmtx accelerator can be used from libharfbuzz-subset.
+
+ src/hb-ot-cbdt-table.hh | 2 +-
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 3d66f441cc4d4feb2fd4b03be9f764c91f4de8b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 12 18:43:42 2018 -0800
+
+    [subset] Remove unreachable code
+
+    sanitizer.sanitize never return nullptr.
+
+ src/hb-subset.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 42040a273facc696d9a54fc4d89857665e87e3d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 12 18:41:36 2018 -0800
+
+    Allow libharfbuzz-subset to link to libstdc++
+
+    We want to use it instead of reinventing hashmap...
+
+    Also, don't change linker for ICU since libicu also uses libstdc++.
+
+ src/Makefile.am        | 2 --
+ src/check-libstdc++.sh | 3 ++-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 4af3c5e25822cc5a401837da547c75a17b7f7b48
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 23:21:24 2018 +0330
+
+    Move linker specifying to a better place
+
+ src/Makefile.am | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+commit 8cf8b78faaf3e7ee261bdc44a1ad5a1973eab1a2
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 16:30:21 2018 -0800
+
+    [subset] whitespace
+
+ test/api/test-subset-cmap.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d1a4d5616f792c6ad84bcc5011040167ddd7cc3f
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 16:25:32 2018 -0800
+
+    output format 12 as enc 10 to match how Roboto did it
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 89ee20f1a39ac78268b57a9aebe8e7428f9944bf
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 16:01:15 2018 -0800
+
+    basic wiring for a (failing) cmap test
+
+ test/api/Makefile.am                               |   2 +
+ test/api/fonts/README                              |   1 +
+ .../Roboto-Regular.abc.cmap-format12-only.ttf      | Bin 0 -> 2412 bytes
+ .../fonts/Roboto-Regular.ac.cmap-format12-only.ttf | Bin 0 -> 2212 bytes
+ test/api/hb-subset-test.h                          |   3 +-
+ test/api/test-subset-cmap.c                        |  82
+ +++++++++++++++++++++
+ test/api/test-subset-glyf.c                        |   5 +-
+ .../data/in-house/tests/myanmar-syllable.tests     |   1 -
+ 8 files changed, 87 insertions(+), 7 deletions(-)
+
+commit afb1da3a1891b7c0fdd047bcb7b3bde86e830444
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 14:37:47 2018 -0800
+
+    auto-completed the wrong gids_to_retain
+
+ src/hb-subset-plan.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1330edc4fe3ffbf18313d6432045606865c610c4
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 14:29:23 2018 -0800
+
+    Use functions to get new gids. Avoid 0; fonttools drops it from cmap.
+
+ src/hb-ot-cmap-table.hh | 24 ++++++++++++++++++------
+ src/hb-subset-plan.cc   | 25 ++++++++++++++++++++-----
+ src/hb-subset-plan.hh   |  5 +++++
+ src/hb-subset.cc        |  2 +-
+ 4 files changed, 44 insertions(+), 12 deletions(-)
+
+commit 1639bdd33122dc8e5522b95c37660273d1fc609e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 13:40:42 2018 -0800
+
+    [subset] Remove test-subset, testing is planned to be done at the
+    table level here with test/subset covering the complete subsetting
+    operation.
+
+ test/api/Makefile.am   |  1 -
+ test/api/test-subset.c | 73
+ --------------------------------------------------
+ 2 files changed, 74 deletions(-)
+
+commit 4cdd1b16c99f2681eb11d626c4408eebcc1672be
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 13:36:28 2018 -0800
+
+    [subset] added todo in test-subset-glyf.
+
+ test/api/test-subset-glyf.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 1714feef4f7ec9e758e65edcbe5d5591562f46ee
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 13:35:17 2018 -0800
+
+    [subset] re-enable test-subset-glyf. Refactor to use common functions
+    in hb-subset-test.h
+
+ test/api/test-subset-glyf.c | 109
+ +++++++++++---------------------------------
+ 1 file changed, 27 insertions(+), 82 deletions(-)
+
+commit d8d8bd8405ec0db781c4c2bbb7ebd6ff520b3c2d
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 13:33:55 2018 -0800
+
+    [subset] Add some helper functions for writing tests around
+    subsetting.
+
+ test/api/Makefile.am      |   2 +-
+ test/api/hb-subset-test.h | 123
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 124 insertions(+), 1 deletion(-)
+
+commit e8318188c0e53a267a01c45b0fc8d29ad775738a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 11:38:28 2018 -0800
+
+    [subset] Fix loca generation, was previously writing the original
+    glyph starting offset.
+
+ src/hb-subset-glyf.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 0b94d590d971de0b44b0db941c7a3e095f15fbc9
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Feb 12 16:45:36 2018 +0200
+
+    Rename --with-stdcpp → --with-libstdc++
+
+    Also improve wording a bit and fix make check in --with-libstdc++=yes.
+
+ configure.ac    | 11 ++++++-----
+ src/Makefile.am | 11 ++++++++---
+ 2 files changed, 14 insertions(+), 8 deletions(-)
+
+commit a5713bc2cb4a3fd71d3bc94b9f155339b09eb71a
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 11:30:45 2018 -0800
+
+    we love all our groups
+
+ src/hb-ot-cmap-table.hh | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 692f86e569847adb332186cbb08f344ebe41fa6c
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 11:29:23 2018 -0800
+
+    drop GDEF, GPOS, GSUB, and dsig
+
+ src/hb-subset.cc | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+commit 83e1ef92156d8688b96d14957efcdf7601768799
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 11:22:32 2018 -0800
+
+    [subset] Set the new number of glyphs in maxp.
+
+ src/hb-ot-maxp-table.hh |  5 +++++
+ src/hb-subset.cc        | 37 ++++++++++++++++++++++++++++++++-----
+ 2 files changed, 37 insertions(+), 5 deletions(-)
+
+commit 427f9e4b90bfadb8af13cbd27b7c3ee0153ca8b1
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 11:18:28 2018 -0800
+
+    Don't force loca version to long.
+
+ src/hb-subset-glyf.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 5df080bf155a12f98929b99438da492063ab9218
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 12 10:15:59 2018 -0800
+
+    Destroy the subset plan at the end of subsetting.
+
+ src/hb-subset.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0301e5be286f5080ec34e9f30c75e73f28d0218b
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 10:12:11 2018 -0800
+
+    Build a working cmap format 12
+
+ src/hb-ot-cmap-table.hh | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit ebd31d376d63c9698c0eae34ed295558f7230918
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 10:10:08 2018 -0800
+
+    subset for real
+
+ src/hb-subset.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 62c7d677e8699143e55e7bfa0cc3c1db75f32506
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Mon Feb 12 10:09:35 2018 -0800
+
+    C-style comments
+
+ src/hb-open-file-private.hh | 15 ++++++++-------
+ 1 file changed, 8 insertions(+), 7 deletions(-)
+
+commit 91f0d51f0525097fef6173046379a89414cb515f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 17:20:12 2018 +0330
+
+    Fix symbol exporting issue on msys2 and ✅ bringing all the bots
+    (#781)
+
+ src/Makefile.am | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 133e17fe2335abb77f61dbf1cff1955c21334137
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 15:24:22 2018 +0330
+
+    Minor
+
+ src/check-defs.sh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 16f5b53eec4c3238cf92438a17e6dc532e8a61f5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 15:18:13 2018 +0330
+
+    Minor, don't skip the whole test when one .def file not found
+
+ src/check-defs.sh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit a9b650d38407f6f2a26d8386e801600b1004d5d6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 15:10:13 2018 +0330
+
+    Apply check-defs.sh to -icu and -subset, toward mingw fix (#780)
+
+ CMakeLists.txt    | 11 ++++++++---
+ src/Makefile.am   | 21 ++++++++++++++++-----
+ src/check-defs.sh | 12 +++++-------
+ src/gen-def.py    |  9 ++++++---
+ 4 files changed, 35 insertions(+), 18 deletions(-)
+
+commit 2efc8965506d8fd31934be1dba3322f922f3409d
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 12:00:07 2018 +0330
+
+    Add --with-stdcpp for ossfuzzer and mupdf use (#770)
+
+ configure.ac    | 12 ++++++------
+ src/Makefile.am | 14 +++++++++++++-
+ 2 files changed, 19 insertions(+), 7 deletions(-)
+
+commit 82e04758c895ce2cd6bddde5f72e592c718fcb69
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 11:56:32 2018 +0330
+
+    minor
+
+ .travis.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 7daa2822f6320801dfed09782ae46687e7c8cbb3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Feb 12 11:27:00 2018 +0330
+
+    Add Travis based Coverity trigger (#778)
+
+ .ci/trigger-coverity.sh | 13 +++++++++++++
+ .travis.yml             | 14 ++++++++++++++
+ 2 files changed, 27 insertions(+)
+
+commit 7747bdb11b0635738a14c099bfaf58461cadd79a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:12:52 2018 -0800
+
+    Remove linker selection from hb-ucdn
+
+    Since this is a convenience library, it's not actually linked. Or
+    so I think.
+    Hoping this might fix this Appveyor failure:
+
+    https://ci.appveyor.com/project/harfbuzz/harfbuzz/build/job/9884jyb5vryja9pw
+
+    Making all in hb-ucdn
+    make[4]: Entering directory '/c/projects/harfbuzz/src/hb-ucdn'
+      CC       libhb_ucdn_la-ucdn.lo
+      GEN      libhb-ucdn.la
+    /bin/sh: libhb_ucdn_la-ucdn.lo: command not found
+    make[4]: *** [Makefile:404: libhb-ucdn.la] Error 127
+    make[4]: Leaving directory '/c/projects/harfbuzz/src/hb-ucdn'
+    make[3]: *** [Makefile:2548: all-recursive] Error 1
+    make[3]: Leaving directory '/c/projects/harfbuzz/src'
+    make[2]: *** [Makefile:1382: all] Error 2
+    make[2]: Leaving directory '/c/projects/harfbuzz/src'
+    make[1]: *** [Makefile:486: all-recursive] Error 1
+    make[1]: Leaving directory '/c/projects/harfbuzz'
+    make: *** [Makefile:418: all] Error 2
+
+ src/hb-ucdn/Makefile.am | 11 -----------
+ 1 file changed, 11 deletions(-)
+
+commit 90d1c740c370b97dfff52420db013ed50075b984
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:08:59 2018 -0800
+
+    Add MSVC to no-visibility list
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0db6c6f214a83ffeeefb7c3b77476567e534facb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 18:28:10 2018 -0800
+
+    Add Sun compiler to no-visibility as well
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/776
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d33ba163611c42acd0125472191ea40745f905eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 18:26:41 2018 -0800
+
+    Fix more warnings
+
+ test/api/test-buffer.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit dde6448379c9eeb0fc7cc476688002be661229b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 18:24:22 2018 -0800
+
+    Another try at fixing multiple-defintion of NullPool
+
+    This one might do it...
+
+ src/hb-open-type-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit b5f25844fbdd3167051c8d3586b404ae7f077b3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:49:18 2018 -0600
+
+    [docs] Minor update
+
+ docs/harfbuzz-sections.txt | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 41906cd5efc2fe17f5fff3fa5fe8488e0cdc6399
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:46:06 2018 -0600
+
+    [subset] Another fixup
+
+    I broke this in c31fcf4c58d96eb7d9781a986991b1a79ac7be44
+
+ src/hb-ot-cmap-table.hh  | 2 +-
+ test/subset/run-tests.py | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit cd32177a322b5fd70c92f67f21b64686bf5d5533
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:34:05 2018 -0600
+
+    Try at fixing multiple-definition of NullPool
+
+    If we don't have visibility, make NullPool static.
+
+ src/hb-open-type-private.hh | 8 +++++++-
+ src/hb-ot-layout.cc         | 2 ++
+ src/hb-private.hh           | 4 +---
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 3d421ce30713582484471baba76470c84dabc118
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:01:44 2018 -0600
+
+    [subset] Use auto_array_t where it does make sense
+
+    Better fix for https://github.com/harfbuzz/harfbuzz/pull/775
+
+ src/hb-subset-plan.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 9aa2eb61e6cb3e4308140bed8a8531877ffd6adf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 11 19:00:42 2018 -0600
+
+    Minor
+
+ src/hb-ot-cmap-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit ae6d0259b4f075885070f833d0f2a96333bf4af3
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 11 15:40:55 2018 +0330
+
+    Install fonttools on two bots and enable cmake hb-subset test (#777)
+
+ .circleci/config.yml       | 6 ++++--
+ test/subset/CMakeLists.txt | 8 ++++----
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit c8d4c2e32f1cea610a9c91dc6b0c32e9ffe84f20
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 11 13:15:44 2018 +0330
+
+    Initialize bad_indices on hb-subset (#775)
+
+ src/hb-subset-plan.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5845e5ca3bac21c0b03e71eab282b02fb7e868a4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 11 12:03:33 2018 +0330
+
+    fix gobject compile issue (#773)
+
+ src/hb-gobject-structs.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9b5af3ec7f80a7793d5d3891e762d83026de0a5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 21:50:26 2018 -0600
+
+    [gpos] Adjust mark attachment heuristic
+
+    Hopefully it...
+    fixes https://github.com/harfbuzz/harfbuzz/issues/740
+
+ src/hb-ot-layout-gpos-table.hh | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 70b06cc6e71e15f0d7550f67b113eed5e6f30a5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 16:13:06 2018 -0600
+
+    More fixes
+
+ util/hb-subset.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 6c1848b1e3b8969afc441f094b0d7b64b4b14933
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:52:35 2018 -0600
+
+    Misc warning fixes
+
+ test/api/test-blob.c   |  2 +-
+ test/api/test-buffer.c | 14 +++++++-------
+ test/api/test-ot-tag.c |  2 +-
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 7039803b51f23cb15dd7e12b105c379bd2e38d71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:47:50 2018 -0600
+
+    Fix djgpp bot
+
+ src/hb-subset-glyf.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cdab20df1e55da196ffc6bc00d580e5ef74c1975
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:45:17 2018 -0600
+
+    Minor
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 203b647530b1550388bb3ce2f67e3b17e019d3e4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 11 01:00:03 2018 +0330
+
+    Favor use of static instead HB_INTERNAL
+
+ src/hb-subset-glyf.cc | 8 ++++----
+ src/hb-subset-plan.cc | 4 ++--
+ src/hb-subset.cc      | 2 +-
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 4c5bdb4b39a723b624346d9b9ff9ace964fff0fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:40:54 2018 -0600
+
+    [test] Disable test-subset-glyf for now
+
+ test/api/test-subset-glyf.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 43314ff4c05076decbd1eb07ed78f732b6ebcba9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:40:03 2018 -0600
+
+    More fixes
+
+    test-subset-glyf still failing. No idea why :(
+
+ src/hb-subset.cc            |  3 +--
+ test/api/test-subset-glyf.c | 26 ++++++++++++++++----------
+ 2 files changed, 17 insertions(+), 12 deletions(-)
+
+commit a981d798eab41b6a7c6484776f04fe178bd536ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 15:17:28 2018 -0600
+
+    Fix more build issues
+
+    Hopefully most bots come back with this...
+
+ src/check-libstdc++.sh   |  5 +++--
+ src/check-symbols.sh     |  2 +-
+ src/hb-buffer.h          |  1 -
+ src/hb-gobject-structs.h |  6 ++++++
+ src/hb-subset-plan.cc    | 10 +++++++---
+ src/hb-subset.cc         |  6 +++---
+ 6 files changed, 20 insertions(+), 10 deletions(-)
+
+commit 6c4ca6135a2ce846431b0ede6a288d3b2f97167e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sun Feb 11 00:42:06 2018 +0330
+
+    Hide more symbols of hb-subset (#771)
+
+ src/hb-subset-plan.cc | 2 +-
+ src/hb-subset.cc      | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit c31fcf4c58d96eb7d9781a986991b1a79ac7be44
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 14:20:10 2018 -0600
+
+    [subset] Replace auto_array with prealloced_array
+
+    auto_array has constructor/destructor. Cannot be used in POD object,
+    as the clang
+    bots all noticed...
+
+ src/hb-ot-cmap-table.hh |  8 ++++----
+ src/hb-subset-glyf.cc   |  6 +++---
+ src/hb-subset-plan.cc   | 23 +++++++++++------------
+ src/hb-subset-plan.hh   |  9 +++------
+ 4 files changed, 21 insertions(+), 25 deletions(-)
+
+commit 931d67900ee6d96b5962a475c1b71a58b821bcba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 14:11:16 2018 -0600
+
+    Fix some other bots
+
+ src/hb-subset-glyf.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 4011d885b7fca87c717fdaa4bd0318a42308865a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 14:09:06 2018 -0600
+
+    [util] Remove use of ssize_t which was failing on MSVC
+
+ util/hb-subset.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bfa871634ce9ef9f4ed18348d898686952d6cbe3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 13:37:28 2018 -0600
+
+    Minor
+
+ src/hb-subset-glyf.hh | 2 +-
+ src/hb-subset-plan.hh | 2 +-
+ src/hb-subset.cc      | 3 +--
+ src/hb-subset.h       | 2 +-
+ 4 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 844f48ea9a72d28e2c088497f6c403c54e1751a8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 10 23:13:12 2018 +0330
+
+    Fix symbol exporting and libstdc++ linkage of hb-subset (#769)
+
+ CMakeLists.txt          |  6 ++----
+ src/Makefile.am         |  3 +++
+ src/check-defs.sh       |  2 +-
+ src/check-libstdc++.sh  | 20 +++++++++++---------
+ src/check-symbols.sh    | 28 +++++++++++++++-------------
+ src/hb-subset-glyf.cc   |  8 ++++----
+ src/hb-subset-glyf.hh   |  2 +-
+ src/hb-subset-plan.cc   |  4 ++--
+ src/hb-subset-plan.hh   |  8 ++++----
+ src/hb-subset.cc        |  2 +-
+ src/hb-ucdn/Makefile.am | 11 +++++++++++
+ 11 files changed, 55 insertions(+), 39 deletions(-)
+
+commit 91519c6a5b130ced569cedc3710ab395b663240d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 13:35:17 2018 -0600
+
+    [aat] Add buffer messages
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit af274507c4f4c5a582543affa71d81a87d6d9151
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 13:25:49 2018 -0600
+
+    Minor
+
+ src/hb-private.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit 570d523761b23a3c668d9071712d5f10944d21fc
+Merge: 71130a20 d18decd2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 13:24:22 2018 -0600
+
+    [subset] Merge remote-tracking branch 'googlefonts/master'
+
+commit 71130a20fae7c256b0ab1aa397cc1ac2d11dd487
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 13:15:57 2018 -0600
+
+    Replace Supplier.advance with Supplier::operator+=
+
+ src/hb-open-file-private.hh        |  4 ++--
+ src/hb-open-type-private.hh        |  7 ++++---
+ src/hb-ot-layout-common-private.hh |  4 ++--
+ src/hb-ot-layout-gsub-table.hh     | 10 +++++-----
+ 4 files changed, 13 insertions(+), 12 deletions(-)
+
+commit d0f3e7f59719bdb6a2105ee85a8f3ee799741dab
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 10 12:45:28 2018 -0600
+
+    [util] Use setlinebuf() if present
+
+    To work around mysterious bug on OS X.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/727
+
+ configure.ac    |  6 ++----
+ util/options.cc | 12 ++++++++++--
+ 2 files changed, 12 insertions(+), 6 deletions(-)
+
+commit ad575a5f47a51ee553710873ac2672479b76ba5e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 10 19:50:11 2018 +0330
+
+    Fix cast warnings on clang (#768)
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d18decd2013f24f315dbd3b15cdd80c5a734e7e9
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 18:41:21 2018 -0800
+
+    In glyf subsetting add suport for writing out a short loca table
+    when possible.
+
+ src/hb-subset-glyf.cc | 42 +++++++++++++++++++++++++++++++++---------
+ 1 file changed, 33 insertions(+), 9 deletions(-)
+
+commit 9275bd03ea427eb607dde6a8e65f78a350b88323
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 9 17:33:34 2018 -0800
+
+    First pass at building a cmap
+
+ src/hb-ot-cmap-table.hh | 103
+ ++++++++++++++++++++++++++++++++++++++++++++----
+ src/hb-subset.cc        |  37 +++++++++--------
+ 2 files changed, 115 insertions(+), 25 deletions(-)
+
+commit d2170d14780ad6f8e0d17a1e011445c3bcc20871
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 17:24:16 2018 -0800
+
+    Check for failures from add table.
+
+ src/hb-subset.cc | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 4816064c0e5464d032a55001a959a9abcef7f70e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Fri Feb 9 17:14:37 2018 -0800
+
+    add missing return
+
+ src/hb-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 0089443756cdcef0182e55cf8480b96a64d31cc7
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 16:22:09 2018 -0800
+
+    Keep a second set of glyph ids in subset plan which is sorted by
+    glyph id and always has gid 0
+
+ src/hb-subset-glyf.cc |  2 +-
+ src/hb-subset-plan.cc | 34 +++++++++++++++++++++++++---------
+ src/hb-subset-plan.hh |  1 +
+ 3 files changed, 27 insertions(+), 10 deletions(-)
+
+commit 3bc81558d836e27e77bda0d6da9c71f530719579
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 16:06:33 2018 -0800
+
+    Formatting for hb-subset-plan.
+
+ src/hb-subset-plan.cc | 51
+ +++++++++++++++++++++++++++------------------------
+ 1 file changed, 27 insertions(+), 24 deletions(-)
+
+commit 8cef3a61995317d3a5724221108647d7e66fe24a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 9 16:04:23 2018 -0600
+
+    Try fixing build with Sun Studio
+
+    Trying to fix:
+    https://circleci.com/gh/harfbuzz/harfbuzz/6635
+
+    Also part of:
+    https://github.com/harfbuzz/harfbuzz/issues/630
+
+ src/hb-private.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 86aa4b3ba7cd075f01614874dae88a771b8c54fd
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 13:54:43 2018 -0800
+
+    Return empty face on hb_subset failure instead of null. Plus some
+    minor cleanups for _add_head_and_set_loca_version
+
+ src/hb-subset.cc | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit d45f240e4e330cedad737fdb792b311c37a19e32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 9 15:51:45 2018 -0600
+
+    Typo
+
+ src/hb-buffer.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b7aa651b4714b996816023a4929c0289065493f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 9 15:43:20 2018 -0600
+
+    [docs] Improve UNSAFE_TO_BREAK docs
+
+ src/hb-buffer.h | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit 671f0a7733a496eb46b08dc88c3c46b804cdd895
+Author: bungeman <bungeman@chromium.org>
+Date:   Thu Feb 1 13:31:25 2018 -0500
+
+    Documentation for HB_GLYPH_FLAG_UNSAFE_TO_BREAK.
+
+    HB_GLYPH_FLAG_UNSAFE_TO_BREAK means that the glyph with this flag is
+    somehow affected by the previous logical glyph (the previous index
+    in the buffer if ltr and the next index if the buffer is rtl). If
+    these two glyphs are separated by a break (line or otherwise) then the
+    underlying text should be re-shaped on both sides up to corresponding
+    position in the text of some glyph not marked with this flag.
+
+ src/hb-buffer.h | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 1582eabee6017839518b821ef93a329a0a86a453
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 12:52:08 2018 -0800
+
+    Update head table with loca format selected by glyf+loca subsetting.
+
+ src/hb-subset-glyf.cc |  7 +++----
+ src/hb-subset-glyf.hh |  1 +
+ src/hb-subset.cc      | 37 +++++++++++++++++++++++++++++++++++--
+ 3 files changed, 39 insertions(+), 6 deletions(-)
+
+commit 335bbaa66f66e86d417cc123a2bf397e8b834f64
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 9 10:55:15 2018 -0800
+
+    Remove uneeded code in hb-subset.
+
+ src/hb-subset.cc | 19 -------------------
+ 1 file changed, 19 deletions(-)
+
+commit 3346ba9cd5198d27c7416b8c71fecb6c8d3cb335
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 9 11:05:17 2018 -0600
+
+    [test/text-rendering-tests] Update from upstream
+
+ .../text-rendering-tests/fonts/TestMORXTwentysix.ttf  | Bin 3260 ->
+ 3252 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 1cd98d05e07498653ba60a68b6342d1a90429eba
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 8 19:39:57 2018 -0800
+
+    Create the groups for a cmap format12. Does not yet build the
+    actual table.
+
+ src/hb-ot-cmap-table.hh | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit 59c658c8d53481990fe0efa66422353d0687474b
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 8 19:22:47 2018 -0800
+
+    capture codepoints sorted so we can use them for cmap later. one
+    day we will have a map
+
+ src/hb-ot-cmap-table.hh | 14 ---------
+ src/hb-private.hh       | 61 +++++++++++++++++++++++++---------------
+ src/hb-subset-glyf.cc   | 16 +++++------
+ src/hb-subset-plan.cc   | 75
+ ++++++++++++++++++++++++++++++++++---------------
+ src/hb-subset-plan.hh   |  8 ++++--
+ src/hb-subset.cc        | 29 ++++++++++++-------
+ 6 files changed, 123 insertions(+), 80 deletions(-)
+
+commit 8431c38cdc05ddcddb1aa5fbb72a95446b500fd2
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 8 19:20:58 2018 -0800
+
+    remove output noise
+
+ util/hb-subset.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 5cca0c07afbe9ab4b28d333f6f853063ecd75aff
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 8 19:05:46 2018 -0800
+
+    fix comment
+
+ src/hb-open-file-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a19138e668e77a0c05da2ab065c5366c8359b377
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Thu Feb 8 19:03:41 2018 -0800
+
+    comment the serialization of table
+
+ src/hb-open-file-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 5a34114f9685680d4a8cdf85a8ac90172c5620d7
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 18:32:24 2018 -0800
+
+    Add an extra entry to the end of the loca table to identify the end
+    of the last glyph's data.
+
+ src/hb-subset-glyf.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit aac7d962120aa137385324b33a173df4f19fd80b
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 18:18:16 2018 -0800
+
+    Apply per table subsetting while building the new face in hb_subset.
+
+ src/hb-subset-glyf.cc |   1 +
+ src/hb-subset.cc      | 105
+ ++++++++++++++++++++++++++++++--------------------
+ 2 files changed, 65 insertions(+), 41 deletions(-)
+
+commit 3e81832432a1cae0dc28242bb6ff279753effd27
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 15:55:12 2018 -0800
+
+    Disable subset tests on cmake for now.
+
+ test/subset/CMakeLists.txt | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 2f941053111d60433ab39cc70edd69c962896961
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 15:55:12 2018 -0800
+
+    Disable subset tests on cmake for now.
+
+ test/subset/CMakeLists.txt | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit e081c9e8fc84843740c8a55b49403acc3fe4f0b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:44:24 2018 -0600
+
+    Oops!
+
+ test/subset/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1c49afe179e7e1884ceeae1d93e50fa51f18f894
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:38:58 2018 -0600
+
+    Whitespace
+
+ test/subset/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9682ef135f16cb3368b9c5970fdcec71301b687e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:35:57 2018 -0600
+
+    Minor fixups
+
+ CMakeLists.txt              | 2 +-
+ src/hb-ot-cmap-table.hh     | 6 +++---
+ src/hb-subset.cc            | 6 +++---
+ test/api/hb-test.h          | 5 +++++
+ test/api/test-subset-glyf.c | 4 ----
+ test/api/test-subset.c      | 4 ----
+ 6 files changed, 12 insertions(+), 15 deletions(-)
+
+commit 35eeb893efcdfa2bf6a136cd2911d564334e573c
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 15:17:34 2018 -0800
+
+    Don't include subset headers in libharfbuzz.
+
+ CMakeLists.txt | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 42234424a0fc43d298be082b4c7b1e288e94bbb6
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 15:11:15 2018 -0800
+
+    Fix include gaurds and include order in hb-subset-glyf and
+    hb-subset-plan
+
+ src/hb-subset-glyf.hh | 6 ++++--
+ src/hb-subset-plan.cc | 2 +-
+ src/hb-subset-plan.hh | 5 +++--
+ 3 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 0f3c756cbfe8a263ee388481acac7a24d9684c44
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 14:59:32 2018 -0800
+
+    Add CMake config for building a separate harfbuzz-subset.
+
+ CMakeLists.txt          | 17 ++++++++++++++---
+ test/api/CMakeLists.txt |  2 +-
+ 2 files changed, 15 insertions(+), 4 deletions(-)
+
+commit d4d120ad79ff65c6987ca127da5d9ee30740b0b1
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 14:26:18 2018 -0800
+
+    Skip subset to fonttools comparison test if TTX is not present.
+
+ test/subset/run-tests.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 29d915284e46fb9be01221a88c9e969080daa1b2
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 11:31:27 2018 -0800
+
+    Whitespace
+
+ test/subset/run-tests.py | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit f9420d9effcfb3464d4b99e54decb3d90e4a410d
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 8 11:30:36 2018 -0800
+
+    In the hb-subset to fontTools comparison, use ttx to compare the
+    fonts. This allows for some binary differences such as re-ordered
+    tables.
+
+ test/subset/run-tests.py | 21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+commit 8e9fd6f1ab491519cf7205467bc5d20056fce99d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 19:01:21 2018 -0800
+
+    Implement basic loca (long version only) subsetting.
+
+ src/hb-subset-glyf.cc | 66
+ +++++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 46 insertions(+), 20 deletions(-)
+
+commit f9c665fed1347f7af6d36ba129f9d174f4ac54dc
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 16:53:18 2018 -0800
+
+    Update interface to hb-subset-glyf to subset glyf and loca.
+
+ src/hb-subset-glyf.cc | 10 +++++++---
+ src/hb-subset-glyf.hh |  7 ++++---
+ src/hb-subset.cc      |  7 +++++--
+ 3 files changed, 16 insertions(+), 8 deletions(-)
+
+commit f2ceb5ee4d745e0e6e754f0b0ea16b29dbedbf1b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 16:47:31 2018 -0800
+
+    Comment out failing assert in test-subset-glyf for now. Should be
+    re-enabled once hb_subset is writing out a new face.
+
+ test/api/test-subset-glyf.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 89dbebd4ad948ddad8e10323315a809c11d7cafa
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 16:32:56 2018 -0800
+
+    Add a basic test for glyf subsetting.
+
+ test/api/Makefile.am                  |   4 +
+ test/api/fonts/Roboto-Regular.abc.ttf | Bin 0 -> 2460 bytes
+ test/api/fonts/Roboto-Regular.ac.ttf  | Bin 0 -> 2268 bytes
+ test/api/test-subset-glyf.c           | 134
+ ++++++++++++++++++++++++++++++++++
+ 4 files changed, 138 insertions(+)
+
+commit 217ed5e3c885532fa8b332cc0d0f9cb4eef32e2b
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 16:30:07 2018 -0800
+
+    Cleanups in hb-subset-glyf and hb-subset-plan.
+
+ src/hb-subset-glyf.cc | 30 +++++++++++++++---------------
+ src/hb-subset-plan.hh |  2 +-
+ 2 files changed, 16 insertions(+), 16 deletions(-)
+
+commit 13193a9b97302480cc11787787fa6826a97be4bb
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 16:09:52 2018 -0800
+
+    move to the hb_face_t dest pattern
+
+ src/hb-ot-cmap-table.hh |  7 ++++++-
+ src/hb-subset.cc        | 28 +++++++++++++---------------
+ 2 files changed, 19 insertions(+), 16 deletions(-)
+
+commit 0859a006695097c2a66a07284f3cc5b8de8edb05
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 15:59:36 2018 -0800
+
+    sketch a subset<T> and call it for cmap. Add subset to cmap, albeit
+    not working even for the msot basic case just yet
+
+ src/hb-ot-cmap-table.hh | 18 ++++++++++++++++--
+ src/hb-subset.cc        | 30 ++++++++++++++++++++++++++++++
+ 2 files changed, 46 insertions(+), 2 deletions(-)
+
+commit c1ab95dd907b1c4a2e2de17447683fe803fe4087
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:22:07 2018 -0600
+
+    Fix overflow in space fallback shaping
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=657466
+
+ src/hb-ot-shape-fallback.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b220b5a44425db387b2149c4904a43ab369a2d6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:14:52 2018 -0600
+
+    Avoid undefined-behavior in fallback mark positioning
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=5584
+
+ src/hb-ot-shape-fallback.cc | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 3b68a03a1c5a23adbc73f4508009dd5b72bc9d81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 17:00:37 2018 -0600
+
+    [fuzzer] Minor
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 194140d3f352b53b95757cccb7fff50425747cd6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 16:27:57 2018 -0600
+
+    [util] Minor
+
+ util/hb-subset.cc |  2 +-
+ util/options.hh   | 10 ++++++++--
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 5021ba2a2186a77d7d70be5602b960d14634d8b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 15:11:28 2018 -0600
+
+    [aat] Minor
+
+ src/hb-aat-layout-common-private.hh | 10 +++++-----
+ src/hb-aat-layout-morx-table.hh     |  7 +++----
+ 2 files changed, 8 insertions(+), 9 deletions(-)
+
+commit 1242ad8424f5e8357fe6fd2143430aa8cfaf0954
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 8 14:10:01 2018 -0600
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   2 ++
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 ++
+ .../text-rendering-tests/fonts/TestMORXTwentyfive.ttf    | Bin 0 ->
+ 3260 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentysix.ttf     | Bin 0 ->
+ 3260 bytes
+ .../data/text-rendering-tests/tests/MORX-25.tests        |   9 +++++++++
+ .../data/text-rendering-tests/tests/MORX-26.tests        |   2 ++
+ 6 files changed, 15 insertions(+)
+
+commit 77ad8b5c8b3a9148cf2944abdd494618e642ee2c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:54:33 2018 -0600
+
+    TODO
+
+ src/hb-open-file-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 941bbd9f257367f838e55d079751c6059974fe2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:49:01 2018 -0600
+
+    [subset] Fix thinko
+
+ src/hb-open-file-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 931f8b7eb5e740ce81e5be6bfec60dbe3ac7ebc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:42:03 2018 -0600
+
+    Fix another thinko
+
+ src/hb-open-file-private.hh | 2 +-
+ src/hb-private.hh           | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 39b86695cf56736170c772424c9a8b75bca0254c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:37:03 2018 -0600
+
+    [subset] Fix thinko
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eeffabc87572193a9e95f22647e80ae44e5a0089
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:34:05 2018 -0600
+
+    Build
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c479a59988b0cf3e557e22e97e1977962c803fa7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 21:13:10 2018 -0600
+
+    [subset] Assemble font
+
+ src/hb-open-file-private.hh | 50
+ +++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-open-type-private.hh | 33 +++++++++++++++++++++++------
+ src/hb-ot-map-private.hh    | 10 ++++-----
+ src/hb-private.hh           | 20 +++++++++++-------
+ src/hb-set-private.hh       |  8 +++----
+ src/hb-subset.cc            | 51
+ +++++++++++++++++++++++++++++++++++++++------
+ test/api/test-subset.c      |  9 ++++++--
+ 7 files changed, 150 insertions(+), 31 deletions(-)
+
+commit 34ac3548b7c9dbc57f277cf9a7a337cd1a8a04bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 18:07:45 2018 -0600
+
+    [set] Respect stride
+
+    Ouch!
+
+ src/hb-set-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 577becaf7b5ccd9de8ba533447f944427b9e4452
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 17:38:40 2018 -0600
+
+    [subset] Fixup
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c9acab3cfbe4a21e86ad309ebb452f103b1c1b04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 17:12:55 2018 -0600
+
+    Whitespace
+
+ src/hb-open-file-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 7fd0b61dee18380c302009f8be9cd68dadab7308
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 16:44:52 2018 -0600
+
+    [subset] Create new face and copy all tables to it
+
+    test-subset fails now because subset-face does not know how to
+    compile itself.
+
+ src/hb-subset.cc | 37 ++++++++++++++++++++++++++-----------
+ 1 file changed, 26 insertions(+), 11 deletions(-)
+
+commit 4e1abe2ce0b5163cbbbb8f8be0e9f7deba5ab2cb
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 13:28:11 2018 -0800
+
+    Refactor subset glyf to remove multiple calls to glyf.fini()
+
+ src/hb-subset-glyf.cc | 52
+ +++++++++++++++++++++++++++++----------------------
+ 1 file changed, 30 insertions(+), 22 deletions(-)
+
+commit 0a5d1440f829f07454592adde9dd3aa93ad74442
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 13:09:54 2018 -0800
+
+    Add implementation of glyf subsetting.
+
+ src/hb-subset-glyf.cc | 81
+ +++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 76 insertions(+), 5 deletions(-)
+
+commit 05d65baa1bb64664ba838993fd35f3899d52eb8d
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Feb 7 10:55:30 2018 -0800
+
+    Extract glyf offset calculation into it's own method.
+
+ src/hb-ot-glyf-table.hh | 26 ++++++++++++++++++--------
+ 1 file changed, 18 insertions(+), 8 deletions(-)
+
+commit 6d7c6e19dc769cf9997b7c1f8a4598eb44ca0b3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 14:09:56 2018 -0600
+
+    Fix two undefined-behavior issues
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/761
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/762
+
+ src/hb-ot-hmtx-table.hh              |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 10 +++++-----
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit b87cbe2bec1d589621ba143af59443f63230ffeb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 14:11:26 2018 -0500
+
+    Try fixing build for platforms that have no visibility attributes
+
+ src/hb-private.hh | 1 +
+ src/hb-subset.cc  | 2 ++
+ src/main.cc       | 2 ++
+ 3 files changed, 5 insertions(+)
+
+commit f70100417c71cff071c119607a7b75dcead05a05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 13:58:23 2018 -0500
+
+    [test] Minor
+
+ test/api/test-ot-tag.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6804b61d2e49fcf9eac9fa0b86497ba91b220bee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 13:47:35 2018 -0500
+
+    [subset] Add hb_subset_face
+
+    It's a hb_face_t that has add_table() and in the future knows how to
+    compile itself into a font blob.
+
+ src/hb-private.hh |  9 ++++++
+ src/hb-subset.cc  | 88
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 97 insertions(+)
+
+commit af02812fc51812a7e2265a1100bbca1a5bf8af45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 13:07:46 2018 -0500
+
+    [subset] Change hb_subset API to remove hb_subset_face_t
+
+ src/hb-subset-plan.cc    | 12 ++++++++---
+ src/hb-subset-plan.hh    |  2 +-
+ src/hb-subset-private.hh | 10 ----------
+ src/hb-subset.cc         | 52
+ ++++++++----------------------------------------
+ src/hb-subset.h          | 25 ++++++-----------------
+ test/api/test-subset.c   |  9 +++++----
+ util/hb-subset.cc        | 12 ++++++-----
+ 7 files changed, 36 insertions(+), 86 deletions(-)
+
+commit 2da0d87e769b2ced71e4281e336bdbca65de2b3f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 12:44:35 2018 -0500
+
+    Remove NullPool visibility hack
+
+    We keep a separate private NullPool in libharfbuzz-subset.so
+    This can fire back later since now there are two separate null
+    objects,
+    and comparisons to the null pool can be confused.  Something to deal
+    with when it comes up. Ouch!
+
+ src/hb-open-type-private.hh | 4 +---
+ src/hb-subset.cc            | 4 ++++
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit b95aa204ee284c47e63dc1e34b3c5b4bdf9e7ab7
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 09:37:06 2018 -0800
+
+    glyph ids to retain should most likely keep the glyph id not the
+    codepoint
+
+ src/hb-subset-plan.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 91428713bd6975b3bbfbdce54701f6aef5457121
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 09:35:59 2018 -0800
+
+    Remove \ns leftover from fprintf
+
+ src/hb-subset-plan.cc | 4 ++--
+ src/hb-subset.cc      | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit eb485bb9e90017abaf7dcdd7e39a82125d6807c3
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 09:32:36 2018 -0800
+
+    Horrid hack to assign new gids. Use DEBUG_MSG over fprintf
+
+ src/hb-subset-plan.cc | 27 +++++++++++++++++++++++----
+ src/hb-subset-plan.hh |  5 +++++
+ src/hb-subset.cc      |  9 +++++++++
+ 3 files changed, 37 insertions(+), 4 deletions(-)
+
+commit 8b80cbb1dd13e2870a956825f5dafc4419b44200
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 09:31:31 2018 -0800
+
+    Add a subset debug category
+
+ src/hb-debug.hh | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit ee433d36fa544c3138718cc3f796b29e6df8a195
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 12:30:18 2018 -0500
+
+    [aat] Set debug lookup_index
+
+ src/hb-aat-layout-common-private.hh | 2 ++
+ src/hb-aat-layout-morx-table.hh     | 3 +++
+ 2 files changed, 5 insertions(+)
+
+commit 38df1ec8e0b457be9140c67e2c5c19153714d90e
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Feb 7 07:58:58 2018 -0800
+
+    TEMPORARY: remove HB_INTERNAL from null pool so subset builds again
+
+ src/hb-open-type-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 53aa0e95420c5c3bfe8af21cf7956535d35b06e6
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 6 17:05:22 2018 -0800
+
+    Add an instance of glyf::accelerator_t to hb-subset-glyf.
+
+ src/hb-subset-glyf.cc | 13 ++++++++++---
+ src/hb-subset-glyf.hh |  2 +-
+ src/hb-subset.cc      |  4 +---
+ 3 files changed, 12 insertions(+), 7 deletions(-)
+
+commit ef62dfed3fc7cfad7f7ce9292cb3bd1616f09384
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 6 17:12:17 2018 -0800
+
+    add back assert_pod
+
+ src/hb-subset-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d0ce3c66e2af2785203f7bbb1d4abca5c226045d
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 6 16:58:35 2018 -0800
+
+    Resolve codepoints:glyph ids. Does not compile; undefined reference
+    to OT::_hb_NullPool
+
+ src/hb-subset-plan.cc    | 25 +++++++++++++++++++------
+ src/hb-subset-plan.hh    |  2 +-
+ src/hb-subset-private.hh | 17 +++++++++++++++--
+ src/hb-subset.cc         | 13 ++++---------
+ 4 files changed, 39 insertions(+), 18 deletions(-)
+
+commit 6a45e5df24ccc59c5a39bf42323c9b550f49e16d
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 6 16:04:09 2018 -0800
+
+    Add skeleton of hb-subset-glyf, call if from hb_subset(...)
+
+ src/Makefile.sources  |  2 ++
+ src/hb-subset-glyf.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset-glyf.hh | 37 +++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc      | 18 ++++++++++++++++--
+ 4 files changed, 100 insertions(+), 2 deletions(-)
+
+commit 31ec3c2ec41161c6ae75bc91d1c237bf2d245e37
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Feb 6 15:37:34 2018 -0800
+
+    Create a subset plan in hb_subset.
+
+ src/hb-subset.cc | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 6c52d94fd11915b76e858bc45633ee60b8c1d8f4
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Feb 6 15:31:14 2018 -0800
+
+    capture the set of codepoints passed by --unicodes
+
+ util/hb-subset.cc | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit 25e9173fe8446735f7e36ec963c7d3554c85631b
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 17:26:25 2018 -0800
+
+    Make hb-subset-plan private.
+
+ src/Makefile.sources                        |  2 +-
+ src/hb-subset-plan.cc                       | 27
+ ++++++++++++++++-----------
+ src/{hb-subset-plan.h => hb-subset-plan.hh} | 22 +++++++++++++---------
+ 3 files changed, 30 insertions(+), 21 deletions(-)
+
+commit af46a4da5a47dd6e0dd98e1740f18e93c337e689
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 17:14:46 2018 -0800
+
+    Move definition of hb_subset_input into hb-subset-private.hh.
+
+ src/Makefile.sources     |  1 +
+ src/hb-subset-plan.cc    |  2 +-
+ src/hb-subset-private.hh | 40 ++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc         | 12 ++----------
+ 4 files changed, 44 insertions(+), 11 deletions(-)
+
+commit 7481f0ce21489d2b19b2e33d05358736ddee20bf
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 16:05:12 2018 -0800
+
+    Add codepoints to subset input.
+
+ src/hb-subset.cc       | 24 ++++++++++++++++--------
+ src/hb-subset.h        |  2 +-
+ test/api/test-subset.c |  2 +-
+ util/hb-subset.cc      |  2 +-
+ 4 files changed, 19 insertions(+), 11 deletions(-)
+
+commit 1cfe650f020cf440bf157daa9907bffd6e35bd7a
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 15:22:30 2018 -0800
+
+    Add a basic sketch of hb-subset-plan.
+
+ src/Makefile.sources  |  2 ++
+ src/hb-subset-plan.cc | 72
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset-plan.h  | 49 +++++++++++++++++++++++++++++++++++
+ 3 files changed, 123 insertions(+)
+
+commit 126ffdbe95020c04dc61413690febd8a56bf264f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 7 12:26:41 2018 -0500
+
+    [aat] Fix debug compile
+
+ src/hb-aat-layout-common-private.hh | 6 +++++-
+ src/hb-aat-layout-morx-table.hh     | 2 +-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 8cb8bfd5b5eff75247cd447f3766294fdff2d644
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 6 20:40:42 2018 +0330
+
+    [test] Fix test-subset on old distros (#758)
+
+    https://developer.gnome.org/glib/stable/glib-Testing.html#g-assert-cmpmem
+
+ test/api/test-subset.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 2971e9da49d6ac07f8a9a4e9b00e167b800a5c7f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 6 11:48:04 2018 -0500
+
+    [aat] Adjust unsafe-to-break logic some more
+
+    I believe I'm happy with it now.
+
+ src/hb-aat-layout-common-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit f49256d80f19bc265e6a197719345313ba26f9d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 6 11:39:36 2018 -0500
+
+    [aat] Simplify unsafe-to-break logic
+
+ src/hb-aat-layout-common-private.hh | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit cc1e0840baed881f2bfd8468a9645bfe94f47303
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 6 10:20:48 2018 -0500
+
+    [buffer] Tweak diff re glyph_flags again
+
+    We expect the buffer to have no flags that the reference doesn't...
+    Meh. Makes MORX tests pass now. Need to better define the behavior.
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d49ae5154e0b069ffa2605ea3f66abb583319ec8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 6 13:48:10 2018 +0330
+
+    Fix hb-buffer logic error
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 70e13ade81a2a09e17d75bdc7e3fe45d8ec9e2c6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Feb 6 13:20:38 2018 +0330
+
+    [subset] Fix Windows issue on endlines (#756)
+
+ util/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f41b92134a276716b7e2d7ef54996b30f36a10a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 5 19:51:09 2018 -0500
+
+    Fix fallthrough compiler warning with gcc >= 7
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/755
+
+ src/hb-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit b7b7f0ac59ec85b224e13d9e6c3c4063e731ad32
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Feb 5 19:40:31 2018 -0500
+
+    [test] Minor
+
+ test/api/Makefile.am | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 0ff007daaa471d05cc0473beec4ba4d434b084b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 20:22:07 2018 -0500
+
+    [subset] Minor
+
+ src/hb-subset.h | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit fc1e82a5aef410138381bc8f5476dcff5679b464
+Merge: ae39fc81 2ea22893
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 15:35:13 2018 -0800
+
+    Merge pull request #754 from googlefonts/master
+
+    Fix build for subsetting code.
+
+commit 2ea228935d41b55fed45b7423b69bc15b42e3abc
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 15:10:01 2018 -0800
+
+    ssize_t -> size_t
+
+ util/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c25898eb54217e2a1c681233a6b9adcd7940652e
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 14:35:32 2018 -0800
+
+    Switch to fopen() instead of open() in subset test. open wasn't
+    compiling on windows.
+
+ util/hb-subset.cc | 13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
+
+commit fc04f11ce1999da042a39c5b271351223033292f
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 11:12:33 2018 -0800
+
+    Rename HB_SUBSET_sources -> HB_SUBSET_CLI_sources to match what
+    cmake is looking for.
+
+ util/Makefile.am      | 3 +--
+ util/Makefile.sources | 2 +-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit e428f7b1c21e0a7d6b9af507d98031b8eebcbeb5
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 10:24:16 2018 -0800
+
+    Wrap unistd.h include in ifdef.
+
+ util/hb-subset.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5f6eb1256fb6c251303d3728fc27875fe7a9ffb8
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Feb 5 10:23:38 2018 -0800
+
+    Add libharfbuzz-subset.la to linking when building api tests.
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ae39fc8171b2c26d4ae64954a8055732c9241bcc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 20:18:52 2018 -0500
+
+    [subset] Build hb-subset into separate libharfbuzz-subset.so
+
+ src/Makefile.am           | 19 +++++++++++++------
+ src/harfbuzz-subset.pc.in | 12 ++++++++++++
+ util/Makefile.am          |  2 ++
+ 3 files changed, 27 insertions(+), 6 deletions(-)
+
+commit eac20e459564134e0087497ed76b1c84195ad7e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 20:08:50 2018 -0500
+
+    [subset] Minor
+
+ util/Makefile.am      |  2 +-
+ util/Makefile.sources |  2 +-
+ util/hb-subset.cc     | 10 +++++-----
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 257022b1789f928975b04b5d214bbe9192e11997
+Merge: 3615f344 edcd3b80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 20:01:35 2018 -0500
+
+    Merge pull request #745 from googlefonts/master
+
+    Interface for hb_subset, skeleton for the hb-subset cli, and basic
+    testing rigging.
+
+commit 3615f344ec00059972d8ce75522022b5294764a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 17:19:58 2018 -0500
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   1 +
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   3 ++-
+ .../text-rendering-tests/fonts/TestMORXTwentythree.ttf   | Bin 0 ->
+ 1836 bytes
+ .../data/text-rendering-tests/tests/MORX-23.tests        |   1 +
+ 4 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 54e6efadd6a30587736858d3fb497ed4e5e5f252
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 14:58:02 2018 -0500
+
+    [aat] Fix unsafe-to-break
+
+    At any position, if state is not zero, mark unsafe-to-break before,
+    unless we can reason it safe.
+
+    At any position, if there's an action entry for end-of-text, mark
+    unsafe to break.
+
+    Also changes buffer diff impl to allow for flag differences as long
+    as the buffer glyph flags are superset of reference glyph flags.
+
+    With this, all MORX tests pass.
+
+ src/hb-aat-layout-common-private.hh | 31 +++++++++++++++++++++++++------
+ src/hb-aat-layout-morx-table.hh     | 35
+ +++++++++++++++++++++++------------
+ src/hb-buffer.cc                    |  2 +-
+ 3 files changed, 49 insertions(+), 19 deletions(-)
+
+commit edcd3b80e9617ec8c4c4a55536938fb510b6aeba
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Sun Feb 4 12:31:24 2018 -0800
+
+    Actually call hb_subset
+
+ util/hb-subset.cc | 51
+ ++++++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 34 insertions(+), 17 deletions(-)
+
+commit 7b01761adef6f64f1139b30c985aa5f52314073a
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 2 17:54:11 2018 -0800
+
+    Add CMakeLists.txt to dist files for subset test.
+
+ test/subset/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f83a43b56134188c2e1f3496d40ec0cd9109f250
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 2 17:50:45 2018 -0800
+
+    Add CMake configuration for all of the new subsetting code.
+
+ CMakeLists.txt             | 14 ++++++++++++++
+ src/Makefile.sources       |  9 +++++++--
+ test/CMakeLists.txt        |  1 +
+ test/subset/CMakeLists.txt |  9 +++++++++
+ util/Makefile.am           |  2 +-
+ util/Makefile.sources      |  2 +-
+ 6 files changed, 33 insertions(+), 4 deletions(-)
+
+commit 5bc0cda179bca452145d4523eeba415986edb6e3
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Feb 2 17:49:14 2018 -0800
+
+    Add missing unistd header to hb-subset.
+
+ util/hb-subset.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 06fe297f2a9fc6ee98179ddd26ef089b7fdb9e74
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 1 18:36:15 2018 -0800
+
+    Properly include subset test data files.
+
+ test/subset/data/Makefile.am | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 058b1260ad1105d0d8d6bf21f8f65a336e735bd2
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 1 18:22:14 2018 -0800
+
+    Re-write hb-subset utility to use main-font-text driver.
+
+ test/subset/run-tests.py |  15 +++---
+ util/Makefile.sources    |   3 ++
+ util/hb-subset.cc        | 131
+ +++++++++++++++++++++++++----------------------
+ 3 files changed, 82 insertions(+), 67 deletions(-)
+
+commit ede84ffa426edb950c4ec4f89833c85475a1c64f
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 1 17:17:36 2018 -0800
+
+    Whitespace
+
+ util/hb-subset.cc | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
+
+commit 2763a2c5982c0db072697abe8ba01342d5977237
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 1 17:14:51 2018 -0800
+
+    Include subset test files in distribution.
+
+ test/subset/Makefile.am      | 7 ++++++-
+ test/subset/data/Makefile.am | 7 +++++++
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 34fa7b3ad23b544b0914bc6002d60525224c68e1
+Author: Garret Rieger <grieger@google.com>
+Date:   Thu Feb 1 16:50:18 2018 -0800
+
+    Whitespace
+
+ src/hb-subset.h | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 8c3a6727377895f18e1b5c7076404d8aede17176
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 15:43:24 2018 -0800
+
+    Get test-subset to pass.
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 74d39ed2639857d5f1a90d9c0d864227a6482b40
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 15:20:52 2018 -0800
+
+    Attach add a hb_face_t to hb_subset_face_t.
+
+ src/hb-subset.cc | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+commit 76b84c36b9560e132918adb4c0c5a0d9bdfb0978
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 14:53:28 2018 -0800
+
+    Whitespace
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a2965f2ea5428c19be54f998ef9152c5ff6975ea
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 14:53:09 2018 -0800
+
+    Add a basic implementation of hb-subset to enable compilation of
+    test-subset.
+
+ src/hb-subset.cc       | 146
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.h        |   5 +-
+ test/api/Makefile.am   |   1 +
+ test/api/test-subset.c |  12 ++--
+ 4 files changed, 156 insertions(+), 8 deletions(-)
+
+commit 38af23b8df1a84f24d379d27d1a1e20f9ce07f34
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 11:32:23 2018 -0800
+
+    Make the expected output for subsetting basics test be equal to the
+    input file for now.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1996 ->
+ 2460 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit b59c08eb045db2b6c952de81510b8159a4f72fb1
+Author: Garret Rieger <grieger@google.com>
+Date:   Wed Jan 31 11:14:53 2018 -0800
+
+    Add the beginning of a unit test for hb-subset
+
+ test/api/test-subset.c | 67
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 67 insertions(+)
+
+commit e9d154ac8ddd2712a34c53c95a17e469f95e5b30
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Tue Jan 30 19:27:11 2018 -0800
+
+    tweak test failure output. write to a temp file not stdout. test
+    still fails because expected is not just an identical copy of input
+
+ test/subset/run-tests.py | 41 +++++++++++++++++++++++++++----------
+ util/hb-subset.cc        | 53
+ +++++++++++++++++++++++++++++++++---------------
+ 2 files changed, 67 insertions(+), 27 deletions(-)
+
+commit cf403e1a53381f293aceac5cdbe031bbb2a7af77
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jan 30 18:40:23 2018 -0800
+
+    Add hb-subset.h to hb.h
+
+ src/hb.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c02573516c05ac97acb243ef5dec26af86086ded
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jan 30 18:39:41 2018 -0800
+
+    Fix typo in hb-subset.h
+
+ src/hb-subset.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 76351518ca9bc88aa6fbc975e1e35bd86432d652
+Author: Garret Rieger <grieger@google.com>
+Date:   Tue Jan 30 14:03:16 2018 -0800
+
+    Remove basic subset test from XFAIL
+
+ test/subset/data/Makefile.sources | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit b029b7c19a733a2a39860238ad300e6c4a3f7802
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jan 29 13:31:49 2018 -0800
+
+    Whitespace
+
+ test/subset/data/Makefile.sources | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0853260e997aded264f42bb369d4fcb39cccb7d6
+Author: Garret Rieger <grieger@google.com>
+Date:   Mon Jan 29 13:30:02 2018 -0800
+
+    Configure automake to run the new subset tests.
+
+ configure.ac                                        |  2 ++
+ test/Makefile.am                                    |  2 +-
+ test/subset/Makefile.am                             | 16 ++++++++++++++++
+ test/subset/data/Makefile.am                        | 16 ++++++++++++++++
+ test/subset/data/Makefile.sources                   | 10 ++++++++++
+ test/subset/data/tests/{basics.txt => basics.tests} |  0
+ 6 files changed, 45 insertions(+), 1 deletion(-)
+
+commit 5c63c37b2b5aba8bf2f8ff35b7da0d116ebfe8b5
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 26 16:57:42 2018 -0800
+
+    WIP test runner for subset tests.
+
+ test/subset/run-tests.py | 64
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 64 insertions(+)
+
+commit cc46cd88a1b84b02694fa6d88c4286e93336f096
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 26 14:25:39 2018 -0800
+
+    In generate-expected-outputs read the test definition with utf8
+    encoding.
+
+ test/subset/generate-expected-outputs.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 4cdae914e2e2fff1ff91e2f42648a8acb82a5494
+Author: Garret Rieger <grieger@google.com>
+Date:   Fri Jan 26 13:57:48 2018 -0800
+
+    Add basic directory structure for subsetter integration tests. Plus
+    a utility for generating expected output files.
+
+ .../basics/Roboto-Regular.abc.default.62.ttf       | Bin 0 -> 1996 bytes
+ test/subset/data/fonts/Roboto-Regular.abc.ttf      | Bin 0 -> 2460 bytes
+ test/subset/data/profiles/default.txt              |   0
+ test/subset/data/tests/basics.txt                  |   8 ++
+ test/subset/generate-expected-outputs.py           |  40 ++++++++++
+ test/subset/subset_test_suite.py                   |  82
+ +++++++++++++++++++++
+ 6 files changed, 130 insertions(+)
+
+commit 9ccb8366f603a9e4a7a3c3f96420a19d4f6fb390
+Author: Rod Sheeter <rsheeter@google.com>
+Date:   Wed Jan 17 22:09:07 2018 -0800
+
+    Start to sketch APIs for subsetting
+
+ src/Makefile.am       |  2 ++
+ src/Makefile.sources  |  4 +++
+ src/hb-subset.cc      |  0
+ src/hb-subset.h       | 88
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ util/Makefile.am      |  3 ++
+ util/Makefile.sources |  4 +++
+ util/hb-subset.cc     | 61 +++++++++++++++++++++++++++++++++++
+ 7 files changed, 162 insertions(+)
+
+commit 89b1906d990658c763f35113c8978a5e21bffc22
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 14:45:02 2018 -0500
+
+    [aat] More adjustment to ContextualSubtable
+
+    See comment.
+
+    With this, MORX-20 passes if I turn --verify off.  Our unsafe-to-break
+    logic is currently broken in presence of end-of-text actions.  That's,
+    ugh, extra work to fix.  Let me try...
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 8be596f0b76543e19644c0b77c1bcf4d9e783c2b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 14:40:17 2018 -0500
+
+    [aat] In ContextualSubstitute, apply end-of-text action to last glyph
+
+ src/hb-aat-layout-morx-table.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit c0b1c7eb2eed67147adec3d2c9e02d01f279c8f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 14:19:41 2018 -0500
+
+    [aat] Remove unneeded check
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fcb8be1a385cb4432dc6064fba77939716d27a02
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Feb 4 12:38:18 2018 -0500
+
+    [configure] Fix wording
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/741
+
+ configure.ac | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aed32589af6d5fce3e68fe41865e258ea7eb2413
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 2 16:08:50 2018 -0500
+
+    [aat] In ContextualSubtable, mark mark after substituting mark
+
+    Fixes MORX-21.
+
+ src/hb-aat-layout-morx-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit fe5f9b1ae318939eaa23d0175a5eb7e1739177ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Feb 2 15:53:25 2018 -0500
+
+    [aat] Fix ContextualSubtable sanitization
+
+    Fixes MORX-18, MORX-19, and MORX-22.
+
+ src/hb-aat-layout-morx-table.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit cf943f682bcdd73e3ad1f6108c1a1870b991d5e4
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Sun Feb 4 12:05:12 2018 +0200
+
+    Correctly show documentation build status
+
+    Correctly show if building documentation is enabled or not in
+    configure
+    summary.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/741
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e8859fca3eafb5aab6d029563b31219ccca0d673
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Sun Feb 4 01:26:57 2018 +0700
+
+    Enable use of atexit() on macOS and related platforms.
+
+    The atexit() man page indicates that this is expected to behave
+    in the expected way on unloading of shared libraries.
+
+ src/hb-private.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit a89573770b4c0f9c444ad6499bec5dc022087a97
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Sun Feb 4 01:31:53 2018 +0700
+
+    Use nullptr, not NULL.
+
+ src/hb-aat-layout-common-private.hh | 2 +-
+ src/hb-buffer-deserialize-json.rl   | 4 ++--
+ src/hb-buffer-deserialize-text.rl   | 4 ++--
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 07885e65adf1d3cb324de99501f9867f1a2553f8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat Feb 3 12:53:48 2018 +0330
+
+    [cmake] unistd typo fix (#747)
+
+ CMakeLists.txt | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit ccb0367dae4cbb9c8215dbf20ac7f9acfba2fa14
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Feb 2 12:04:04 2018 -0500
+
+    Let VS1 follow U+1031 MYANMAR VOWEL SIGN E
+
+ src/hb-ot-shape-complex-myanmar-machine.rl               |   2 +-
+ src/hb-ot-shape-complex-myanmar.cc                       |   5 +++++
+ test/shaping/README.md                                   |  10 +++++-----
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf   | Bin 0 ->
+ 1536 bytes
+ test/shaping/data/in-house/tests/myanmar-syllable.tests  |   1 +
+ 6 files changed, 13 insertions(+), 6 deletions(-)
+
+commit c6dbf6e77cae30772ffa110c651cb4287ab3b0dc
+Author: punchcutter <zarijoscha@gmail.com>
+Date:   Wed Jan 31 14:09:04 2018 -0800
+
+    Allow optional ZWJ in virama terminated cluster
+
+ src/hb-ot-shape-complex-use-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dae20fb5a79caad9a4af14137a961b60fe256235
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 31 20:16:08 2018 +0700
+
+    Use nullptr instead of 0.
+
+ src/hb-coretext.cc           | 4 ++--
+ src/test-buffer-serialize.cc | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 90218fa93cf8b5d4b192be12d31aed92d271d09e
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 31 20:44:45 2018 +0700
+
+    Fix typos.
+
+ src/hb-blob.cc                     | 2 +-
+ src/hb-buffer-private.hh           | 2 +-
+ src/hb-common.cc                   | 2 +-
+ src/hb-coretext.cc                 | 2 +-
+ src/hb-directwrite.cc              | 2 +-
+ src/hb-ft.cc                       | 2 +-
+ src/hb-graphite2.cc                | 2 +-
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 8 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 148ca61075d821a09e42e2c75fbc9be47cfc6003
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 31 22:24:51 2018 +0700
+
+    [ot-layout] Fix nullptr dereference.
+
+    If the `calloc` for `gsub_accels` or `gpos_accels` fails, then the
+    unlikely branch afterwards can be taken, which frees up the
+    `hb_ot_layout_t`, but since those fields can now be `nullptr`, then
+    we don't want to dereference them.
+
+ src/hb-ot-layout.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 0c66043a924fd114017a862d2cacd70f64b92370
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 31 20:24:27 2018 +0700
+
+    [coretext] Fix memory leaks.
+
+    In `reference_table`, if the data is empty and we return early,
+    we still need to release the data object.
+
+    In `hb_coretext_shape`, there two edge cases where an early
+    return should release the attributed string.
+
+ src/hb-coretext.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit f0b700db394ccdff30ff83961a3e2ea9ff4ea472
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 30 11:16:51 2018 -0800
+
+    1.7.5
+
+ NEWS         | 9 +++++++++
+ configure.ac | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 585b5760987e1ddd31e11fc55a2ce55ddb5b1663
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 30 11:51:56 2018 -0800
+
+    Fix distcheck
+
+ test/shaping/data/in-house/Makefile.am             | 2 +-
+ test/shaping/data/text-rendering-tests/Makefile.am | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit e89df6e1aee9cb6fe1268643ce19816808baf0c4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 30 10:58:44 2018 -0800
+
+    [aat] Limit number of DontAdvance transitions
+
+    Remove the faulty loop-detection logic. Use max-ops for breaking
+    out of infinite loops or heavy work.
+
+    https://twitter.com/behdadesfahbod/status/958065026262183936
+
+ src/hb-aat-layout-common-private.hh | 33
+ ++-------------------------------
+ 1 file changed, 2 insertions(+), 31 deletions(-)
+
+commit e00743b47d25a2487b7f232a514a042e2962a089
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 29 10:07:05 2018 -0800
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   7 +++++++
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   7 +++++++
+ .../data/text-rendering-tests/fonts/TestMORXEighteen.ttf | Bin 0 ->
+ 3256 bytes
+ .../text-rendering-tests/fonts/TestMORXSeventeen.ttf     | Bin 0 ->
+ 1788 bytes
+ .../data/text-rendering-tests/fonts/TestMORXSixteen.ttf  | Bin 0 ->
+ 1812 bytes
+ .../data/text-rendering-tests/fonts/TestMORXTwenty.ttf   | Bin 0 ->
+ 3232 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentyone.ttf     | Bin 0 ->
+ 3244 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentytwo.ttf     | Bin 0 ->
+ 3256 bytes
+ .../data/text-rendering-tests/tests/MORX-14.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-16.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-17.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-18.tests        |   4 ++++
+ .../data/text-rendering-tests/tests/MORX-19.tests        |   2 ++
+ .../data/text-rendering-tests/tests/MORX-20.tests        |   7 +++++++
+ .../data/text-rendering-tests/tests/MORX-21.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-22.tests        |   1 +
+ 16 files changed, 32 insertions(+)
+
+commit 29d901286e632fa4de5ea198cc455cae56bc09a8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 30 10:01:46 2018 +0330
+
+    [cmake] Build src/ executables (#733)
+
+ CMakeLists.txt | 40 ++++++++++++++++++++++++++--------------
+ 1 file changed, 26 insertions(+), 14 deletions(-)
+
+commit 55cae0d72eecb5116008815b598481dd1404fc6a
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 29 18:05:24 2018 +0330
+
+    [test] Use 'otool -L' where ldd doesn't exist (macOS) (#732)
+
+ src/check-libstdc++.sh | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+commit 2ec7dd1f6cb78ee6a0621aa98f18500d3318c90c
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Sun Jan 28 17:48:28 2018 -0500
+
+    Fix Travis build on macOS (#731)
+
+ .travis.yml       | 2 +-
+ src/check-defs.sh | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 12757b692905062fe0fc266a6230238b3492abfd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 26 18:14:05 2018 -0800
+
+    Misc warning fixes
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/712
+
+ src/hb-ot-layout-gsubgpos-private.hh | 9 ++++-----
+ src/hb-ot-map-private.hh             | 1 -
+ src/hb-ot-map.cc                     | 5 ++---
+ 3 files changed, 6 insertions(+), 9 deletions(-)
+
+commit 85be365ed9238caf0283346ab4e5c5127096fc8a
+Author: bungeman <bungeman@chromium.org>
+Date:   Fri Jan 26 13:38:06 2018 -0500
+
+    Use KernSubTableFormat2::rightClassTable
+
+    Issue originally reported at http://cppfiles.com/chromium.txt .
+
+    This fixes what appears to be a copy - paste issue which causes both
+    KernSubTableFormat2::rightClassTable and the 'right' argument to
+    KernSubTableFormat2::get_kerning to go unused.
+
+ src/hb-ot-kern-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c41b7fc10588323b5d8c0007befa701994115f7b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 25 09:53:32 2018 +0330
+
+    [cmake] Use -fvisibility-inlines-hidden instead (#726)
+
+ CMakeLists.txt | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 3d615766060e34a6e716c8737f651b6d6871ae85
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 22 21:23:19 2018 +0330
+
+    [cmake] fix symbol exporting issue on newer gcc (#724)
+
+ CMakeLists.txt | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 8b60e7c2c301a24906d591c80c42fd5e506072d2
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 22 18:37:26 2018 +0330
+
+    [ci] minor, less hacks (#722)
+
+ .circleci/config.yml | 20 ++++++--------------
+ .travis.yml          |  8 ++++----
+ CMakeLists.txt       | 11 +++++++----
+ 3 files changed, 17 insertions(+), 22 deletions(-)
+
+commit aaf934de3b9e3447897b4da566655d6d0494e87b
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 22 13:16:54 2018 +0330
+
+    [ci] minor (#721)
+
+ .circleci/config.yml | 4 ++--
+ .travis.yml          | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit bd752db733e3d8c2c8773d831aebdd8a5cbb5e04
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 22 13:08:35 2018 +0330
+
+    [ci] unbreak bots with outdated freetype version (#718)
+
+ .circleci/config.yml | 10 +++++++++-
+ .travis.yml          | 10 +++++++++-
+ 2 files changed, 18 insertions(+), 2 deletions(-)
+
+commit 19a93fcf1946ad29f07306a0b6c65377bdaa49f0
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Sun Jan 21 20:40:34 2018 +0700
+
+    Fix typos.
+
+ src/hb-blob.h   | 2 +-
+ src/hb-buffer.h | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 51ce3828e67a8ca7e4ea4b69e88c395e243bf01f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 19 18:36:39 2018 -0800
+
+    [aat] Fix Ligature matching
+
+    I hope... Makes "ffi" work with Zapfino. I'm not sure if doing it
+    correctly though...
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bef509855c7a2c4400a947d2527d1dc048da1284
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 19 18:24:00 2018 -0800
+
+    [aat] Add TODO
+
+ src/hb-aat-layout-morx-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e6f283ed7db6f8e2f8016dcbf07e589c40976aa6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 19 18:08:56 2018 -0800
+
+    [aat] Implement LigatureSubtable
+
+    We form the Zapfino ligature now. Yay! No further testing done.
+
+ src/hb-aat-layout-common-private.hh |  25 ++++++---
+ src/hb-aat-layout-morx-table.hh     | 108
+ +++++++++++++++++++++++++++++++++---
+ 2 files changed, 115 insertions(+), 18 deletions(-)
+
+commit f07ce661a2056965c573c99bdb721c065563ea7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 19 16:52:01 2018 -0800
+
+    [aat] Embed a sanitizer context in hb_aat_apply_context_t
+
+    For run-time checking.
+
+ src/hb-aat-layout-common-private.hh | 22 ++++++++++++++++------
+ src/hb-aat-layout.cc                | 16 ++++++++--------
+ 2 files changed, 24 insertions(+), 14 deletions(-)
+
+commit 046690a4df0fdc93e3490210ef105f26057b1462
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 17 16:59:55 2018 -0800
+
+    [aat] Add hb_aat_apply_context_t
+
+ src/hb-aat-layout-common-private.hh | 23 +++++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh     | 27 +++++++++++++--------------
+ src/hb-aat-layout-private.hh        |  2 +-
+ src/hb-aat-layout.cc                |  8 +++++---
+ src/hb-ot-shape.cc                  |  3 +--
+ 5 files changed, 43 insertions(+), 20 deletions(-)
+
+commit fd034490942c06e31cfb42f32023c78734f8aeeb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 17 16:46:51 2018 -0800
+
+    Rename hb_apply_context_t to hb_ot_apply_context_t
+
+ src/hb-aat-layout-morx-table.hh            | 16 ++++-----
+ src/hb-aat-layout-private.hh               |  2 +-
+ src/hb-aat-layout.cc                       |  2 +-
+ src/hb-ot-layout-gpos-table.hh             | 48 ++++++++++++-------------
+ src/hb-ot-layout-gsub-table.hh             | 24 ++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh       | 58
+ +++++++++++++++---------------
+ src/hb-ot-layout-private.hh                |  4 +--
+ src/hb-ot-layout.cc                        | 16 ++++-----
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
+ src/hb-ot-shape-fallback.cc                |  4 +--
+ src/hb-ot-shape.cc                         |  2 +-
+ 11 files changed, 89 insertions(+), 89 deletions(-)
+
+commit 94b49beee972fec98cbb80658df3d8491b45485d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 17 12:46:08 2018 -0800
+
+    Whitespace
+
+ src/hb-ot-head-table.hh | 20 +++++++++-----------
+ src/hb-ot-post-table.hh | 10 +++++-----
+ 2 files changed, 14 insertions(+), 16 deletions(-)
+
+commit e849b8a85bb66219db4d797d86ddd60ed7c26a2e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 19 16:12:24 2018 +0330
+
+    [cmake] Always put test/api/CMakeLists.txt on distributions
+
+ test/api/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c8f2a4f5b99d3be3079286817386b4185d35a545
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Thu Jan 18 22:49:40 2018 +0100
+
+    hb-common.cc: Hatran script is right-to-left (#714)
+
+    "Hatran is written from right to left horizontally"
+
+    http://www.unicode.org/L2/L2012/12312-n4324-hatran.pdf
+
+    This ancient script was added with Unicode 8.0.
+
+    Also this spreadsheet (referenced in an inline comment in the
+    source code) has it as RTL: http://goo.gl/x9ilM
+
+ src/hb-common.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 00806149b9b591e4ec15996d3d56bdbd60687821
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 19 01:12:31 2018 +0330
+
+    Improve avoiding C++ linkage, definition creation and cmake tests
+    (#710)
+
+ .circleci/config.yml |  4 ++--
+ CMakeLists.txt       | 46 ++++++++++++++++++++++++++--------------------
+ configure.ac         |  3 +++
+ src/Makefile.am      | 11 ++---------
+ src/check-defs.sh    | 37 +++++++++++++++++++++++--------------
+ src/gen-def.py       | 16 ++++++++++++++++
+ 6 files changed, 72 insertions(+), 45 deletions(-)
+
+commit 9b693212a834a96252f4ebe0b006b85e9f35fc91
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Jan 18 16:34:13 2018 -0500
+
+    Update record-test.sh to the new directory layout (#716)
+
+ test/shaping/README.md      | 11 ++++++-----
+ test/shaping/record-test.sh | 17 +++++++++++++----
+ 2 files changed, 19 insertions(+), 9 deletions(-)
+
+commit 461a605fdec3361a038d3715adf615353c4f91fa
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 17 10:02:48 2018 -0800
+
+    [aat] Allocate set dynamically
+
+ src/hb-aat-layout-common-private.hh | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+commit 4c4a9fc8617fed9bc1a7805c9aed294b4f6b66ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 17 09:47:50 2018 -0800
+
+    Typo
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/711
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 90f01bad637c8b1214f46d4df6d9552a6a728e29
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 16 22:00:21 2018 +0330
+
+    [cmake] don't link to libstdc++ (#707)
+
+ CMakeLists.txt | 38 +++++++++++++++++++++++++-------------
+ 1 file changed, 25 insertions(+), 13 deletions(-)
+
+commit 5e14e5f65d3dd1ed471ed73fab7e3207ae04e8fb
+Author: rdb <rdb@users.noreply.github.com>
+Date:   Tue Jan 16 17:04:33 2018 +0100
+
+    [cmake] Fix for CMake 3.0 and below (#706)
+
+ CMakeLists.txt | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c97a7eca7f7b6fc1c50a4ac7fccf3fa2d777430e
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 16 14:18:09 2018 +0330
+
+    [cmake] Fix symbols visibility and enable check-symbols.sh test (#705)
+
+ .circleci/config.yml |  2 +-
+ CMakeLists.txt       | 22 ++++++++++++++--------
+ 2 files changed, 15 insertions(+), 9 deletions(-)
+
+commit 60f84ef014f9280da24d5eb9ce833a7f37210242
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 15 20:46:58 2018 -0500
+
+    Disable MORX-13/14
+
+    Really, need better way to catch these :(.
+
+ test/shaping/data/text-rendering-tests/DISABLED         | 2 ++
+ test/shaping/data/text-rendering-tests/Makefile.sources | 4 ++--
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit 949f6af2897b8982c81a059ea98e1c29bbce4772
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 15 20:44:10 2018 -0500
+
+    Disallow sanitize recursing into Extension subtables multiple times
+
+    Fixes https://oss-fuzz.com/v2/testcase-detail/5216838347653120
+    which is a stack overflow, not by way of infinite recursion, just
+    being deep.  That's disallowed anyway, so catch it as it happens,
+    not afterwards.
+
+ src/hb-ot-layout-gsub-table.hh       | 5 ++---
+ src/hb-ot-layout-gsubgpos-private.hh | 4 +++-
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+commit bcb6f1ae0a08e5c7af88a7affaad42a67c5adac5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 15 20:34:05 2018 -0500
+
+    Whitespace
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 12fffce10eb6ffebdedd655d0b1f10a99adf1808
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 15 15:41:51 2018 -0500
+
+    [aat] Sanitize classTable in StateTable
+
+ src/hb-aat-layout-common-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit e6263c7142ca22efd9a3c93353a513f475c1c48d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 15 15:37:55 2018 -0500
+
+    [aat] Wire up table length to apply()
+
+ src/hb-aat-layout-morx-table.hh | 17 +++++++++--------
+ src/hb-aat-layout.cc            | 20 +++++++++++++++-----
+ src/hb-open-type-private.hh     |  6 +++---
+ 3 files changed, 27 insertions(+), 16 deletions(-)
+
+commit 679ae744d07db7746a983ece54c22635a9dc3cff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Jan 14 15:03:31 2018 -0500
+
+    [aat] Towards implementing LigatureSubtable
+
+ src/hb-aat-layout-morx-table.hh | 61
+ +++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 58 insertions(+), 3 deletions(-)
+
+commit c9e12a2b9b34d73d37def2261a5c1a7ef20b8349
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 13 17:05:12 2018 +0000
+
+    Fix set initializer
+
+ src/hb-set-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 54a1e250a839f030b43dbeba66cadc50ab5f90f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Jan 13 14:44:39 2018 +0000
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 ++
+ .../data/text-rendering-tests/fonts/TestMORXFourteen.ttf | Bin 0 ->
+ 1816 bytes
+ .../data/text-rendering-tests/fonts/TestMORXThirteen.ttf | Bin 0 ->
+ 1820 bytes
+ .../data/text-rendering-tests/tests/MORX-13.tests        |   1 +
+ .../data/text-rendering-tests/tests/MORX-14.tests        |   1 +
+ 5 files changed, 4 insertions(+)
+
+commit 9009b341c46caaa81deae8ea55e6f7dd98565f59
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 12:04:53 2018 +0100
+
+    [aat] Fix some struct sizes
+
+    I hate it that with my compiler at least, it doesn't catch totally
+    uncompilable
+    statements in templates if they are not used...
+
+ src/hb-aat-layout-common-private.hh | 2 +-
+ src/hb-aat-layout-morx-table.hh     | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 57051b4f672d7d9dd10c45cc95b1e50e32cd42a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:42:25 2018 +0100
+
+    [aat] Flush rest of buffer if state machine failed
+
+ src/hb-aat-layout-common-private.hh | 12 +++++++++---
+ src/hb-aat-layout-morx-table.hh     |  2 ++
+ 2 files changed, 11 insertions(+), 3 deletions(-)
+
+commit 369dfab0f8b7f22338bbd7a58a27e2e02e1efc29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:37:01 2018 +0100
+
+    Minor
+
+ docs/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 25364c4f0020a66bd6f4bce1656ea47f1093396d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:31:20 2018 +0100
+
+    [aat] Fix symbol visibility
+
+    Not sure why only one of the bots sees this as visible...
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ee16b9d8d35af1e74369edf7b733886c4b743a68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:28:09 2018 +0100
+
+    Revert accidental morx enablement
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 44f0ee346f53c51ec4abccc81cc24abf6f018e85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:27:51 2018 +0100
+
+    Fix docs
+
+ docs/harfbuzz-sections.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit cdfa801ff4fe301d7bd41c9eee57cae75001ce4b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:12:20 2018 +0100
+
+    [aat] Tweak previous commit
+
+ src/hb-aat-layout-common-private.hh | 2 ++
+ src/hb-ot-shape.cc                  | 4 ++--
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+commit f7600228a4b37e6f6b65394aceeeb14bf4133c23
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 11:09:21 2018 +0100
+
+    [aat] Detect infinite-loops in state machine
+
+ src/hb-aat-layout-common-private.hh | 36
+ +++++++++++++++++++++++++++++-------
+ 1 file changed, 29 insertions(+), 7 deletions(-)
+
+commit d514f1480cffb81850ef212155c66ee9e0383350
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 10:55:44 2018 +0100
+
+    [circleci] cat test logs on failure on autotools-based builds
+
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1facef337862a0ceee9a8ac1d4dc94ff94fcb3b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 10:53:52 2018 +0100
+
+    [travis] On test failure, cat all .log files
+
+ .travis.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit cdd86bf3a28961e85a8918d77937587df313d47b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 10:51:51 2018 +0100
+
+    [travis] Update cat'ing test-suite.log files
+
+ .travis.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 22d8c765e7b556601173a3e70f5bc9f310263a98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 09:46:38 2018 +0100
+
+    Disable C++11
+
+    To better catch errors locally.
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dd38db523a1001178bf4cae3721c098466534736
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 09:45:42 2018 +0100
+
+    [aat] Fix more builds
+
+    Maybe I should disable C++11 detection such that my compiler also
+    catches
+    these.  Doesn't look like we can switch to it for a while anyway...
+
+ src/hb-aat-layout-common-private.hh |  2 +-
+ src/hb-aat-layout-morx-table.hh     | 18 +++++++++---------
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 72cb2b1f57ba79938c74e0406fc7457fce287f69
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 09:38:55 2018 +0100
+
+    [aat] Fix builds
+
+ src/hb-aat-layout-morx-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e3a15d0c6d088963e61f7fbebe25e1096d8e2903
+Author: Ting-Wei Lan <lantw@src.gnome.org>
+Date:   Fri Jan 12 15:33:16 2018 +0800
+
+    Update _POSIX_C_SOURCE to the latest version
+
+    Defining _POSIX_C_SOURCE to an old version on FreeBSD can cause C99 to
+    be disabled in libc.
+
+ src/hb-blob.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c70d58f97da7dcbdd7ea72a44f39130a75a279f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 00:08:22 2018 +0100
+
+    [aat] Port RearrangementSubtable to StateTableDriver
+
+ src/hb-aat-layout-morx-table.hh | 91
+ ++++++++++++++++++++---------------------
+ 1 file changed, 44 insertions(+), 47 deletions(-)
+
+commit 117cfe7bb7cef682eb151b94f1eb12363ba3af67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 12 00:01:36 2018 +0100
+
+    [aat] Add StateTableDriver and convert ContextualSubtable to it
+
+ src/hb-aat-layout-common-private.hh | 51 ++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh     | 93
+ ++++++++++++++++++-------------------
+ 2 files changed, 95 insertions(+), 49 deletions(-)
+
+commit 0d39ac224c680b1f0134b58e78391497fbe47370
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 22:47:08 2018 +0100
+
+    [test/text-rendering-tests] Update README
+
+ test/shaping/data/text-rendering-tests/README | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 17a66f133c7e523403b6c90b011fcf0acb6356c6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 22:46:19 2018 +0100
+
+    [test] Disable MORX-12
+
+    Ouch. I need a better workflow for this.
+
+ test/shaping/data/text-rendering-tests/Makefile.sources | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 1f1c85a54aad8a25a67041cbb9c4277d28c1c761
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 22:43:57 2018 +0100
+
+    [aat] Remove 'mort' support
+
+    It's dead, Jim!
+
+ src/hb-aat-layout-common-private.hh |  55 +++++-----------
+ src/hb-aat-layout-morx-table.hh     | 122
+ ++++++++++--------------------------
+ 2 files changed, 46 insertions(+), 131 deletions(-)
+
+commit 7e2fed6d73f89986e5777028cdcd24e3baf2f86c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 19:25:21 2018 +0100
+
+    [aat] Allow DontAdvance
+
+    Apparently CoreText does allow these.  To be done: detect infinite
+    loops.
+
+    Fixes MORX-12 test.
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1387fe8f9c474e88f86828733d4c01bd56f44432
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 19:22:37 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   1 +
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 ++
+ .../data/text-rendering-tests/fonts/TestMORXTwelve.ttf   | Bin 0 ->
+ 2200 bytes
+ .../data/text-rendering-tests/tests/MORX-12.tests        |   3 +++
+ 4 files changed, 6 insertions(+)
+
+commit 17f01aff910b3871d0a6c45fd4305304b7f68ab5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 18:54:49 2018 +0100
+
+    [aat] Sanitize ContextualSubtable
+
+ src/hb-aat-layout-common-private.hh | 23 +++++++++++++++++++----
+ src/hb-aat-layout-morx-table.hh     | 34
+ ++++++++++++++++++++++++----------
+ 2 files changed, 43 insertions(+), 14 deletions(-)
+
+commit 9b82aa19d812e70b7fade4b7669a9ce27855951e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 18:19:42 2018 +0100
+
+    More warning fixes
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 680cbc2eb325edc6b8562f39485b146aa56b3872
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 18:15:53 2018 +0100
+
+    [aat] Sanitize StateTable
+
+ src/hb-aat-layout-common-private.hh | 43
+ ++++++++++++++++++++++++++++++++++---
+ 1 file changed, 40 insertions(+), 3 deletions(-)
+
+commit 0e3b3379a04a67a22e44e17d6bf849359f4fca68
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 18:01:10 2018 +0100
+
+    [aat] Actually fix d887f931485b715775e922516a4b0de5bb92c34f
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1eb98c9916c6cb447f999170840b7f37de4b282d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 17:59:03 2018 +0100
+
+    [test/text-rendering-tests] Actually disable MORX-11
+
+ test/shaping/data/text-rendering-tests/Makefile.sources | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3f291ffd5a9480ac0f528eaedd43c7e9af738ee2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 17:57:46 2018 +0100
+
+    [buffer] Fix compiler warnings
+
+    line 323: Warning: info hides hb_buffer_t::info
+    ...
+
+ src/hb-buffer-private.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit d887f931485b715775e922516a4b0de5bb92c34f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 17:41:34 2018 +0100
+
+    [aat] Make bots happy
+
+    Don't know why this is not caught by my compiler.  Looks like clang
+    catches it
+    while gcc doesn't.
+
+    In file included from ../src/hb-aat-layout-morx-table.hh:31:
+    ../src/hb-aat-layout-common-private.hh:523:30: error: no member named
+    'static_size' in 'AAT::ContextualSubtable<AAT::MorxTypes>::EntryData'
+      DEFINE_SIZE_STATIC (4 + T::static_size);
+                                ~~~^
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit f6be730994434e706cc27d68b796492d876e82b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 15:23:24 2018 +0100
+
+    [aat] In NoncontextualSubtable, handle MarkLast with end-of-line
+    transition
+
+    Fixes MORX-11 test.
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1d20d109a07bf9c775ab91dfbbb55f7bd80fd9d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 15:18:22 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   3 ++-
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   3 ++-
+ .../data/text-rendering-tests/fonts/TestMORXEleven.ttf   | Bin 0 ->
+ 1624 bytes
+ .../data/text-rendering-tests/tests/MORX-11.tests        |   1 +
+ 4 files changed, 5 insertions(+), 2 deletions(-)
+
+commit f9be673814aeb2c8abab52a672598576c6ed20c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 15:15:07 2018 +0100
+
+    [aat] Implement ContextualSubtable
+
+    Tested with Zapfino and text "2nd". Sascha will create tests later.
+
+ src/hb-aat-layout-morx-table.hh | 70
+ ++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 66 insertions(+), 4 deletions(-)
+
+commit 335a9c1fe489db53549801b4996dd0f6f5eded62
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 14:50:47 2018 +0100
+
+    [aat] Towards implementing ContextualSubtable
+
+ src/hb-aat-layout-common-private.hh | 58 ++++++++++++++++++++++--
+ src/hb-aat-layout-morx-table.hh     | 88
+ ++++++++++++++++++++++++++-----------
+ 2 files changed, 117 insertions(+), 29 deletions(-)
+
+commit 62348f647f7b1604e008dbed46a54eff245fc106
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 12:00:28 2018 +0100
+
+    [aat] Implement end-of-text in state machine
+
+    Passes MORX-10 test now.
+
+ src/hb-aat-layout-morx-table.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit fc405b7ca77088135cb7de11cb32c254b85272fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 11:55:29 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   1 +
+ test/shaping/data/text-rendering-tests/Makefile.sources  |  11
+ ++++++-----
+ .../data/text-rendering-tests/fonts/TestMORXTen.ttf      | Bin 0 ->
+ 1620 bytes
+ .../data/text-rendering-tests/tests/MORX-10.tests        |   1 +
+ 4 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 9adbd938fafe1de4e279489fc37ae33c900e22f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 11:55:10 2018 +0100
+
+    Minor
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4177f646aa60180f094e064a53e54c5402fe53c6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 11 15:43:23 2018 +0330
+
+    [cmake] Update and unbreak (#700)
+
+ test/shaping/CMakeLists.txt | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 94644d7ea4cf217e4d6c6ff57d65e1e20866ea6d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 11:49:07 2018 +0100
+
+    [aat] Generate finegrained unsafe-to-break in state-machine!
+
+    Neato.
+
+ src/hb-aat-layout-morx-table.hh | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 994eb7744c530bbaa5d6d8b8e07ca936e81aade8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 11:37:12 2018 +0100
+
+    [buffer] Fix crash
+
+ src/hb-buffer-serialize.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d6076747ac6706b4d8361714d46aced9683c44a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:51:46 2018 +0100
+
+    [test/text-rendering-tests] Add DISABLED list
+
+ test/shaping/data/text-rendering-tests/DISABLED | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+commit de02b5093c42a527ae67084b30943369ed59efe6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:48:42 2018 +0100
+
+    [test/in-house] Add Makefile.sources
+
+ test/shaping/data/in-house/Makefile.am      | 46
+ ++---------------------------
+ test/shaping/data/in-house/Makefile.sources | 46
+ +++++++++++++++++++++++++++++
+ 2 files changed, 48 insertions(+), 44 deletions(-)
+
+commit 7c32e01d04deaab511d41f5dec0dfd9fc0469f39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:47:31 2018 +0100
+
+    Minor
+
+ src/Makefile.am                                  | 1 +
+ src/Makefile.sources                             | 2 --
+ test/shaping/data/text-rendering-tests/update.sh | 2 --
+ util/Makefile.am                                 | 1 +
+ util/Makefile.sources                            | 2 --
+ 5 files changed, 2 insertions(+), 6 deletions(-)
+
+commit a5adc5aa84c03184fd1c8a486be80ff0af1f448c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:30:22 2018 +0100
+
+    [test/text-rendering-tests] Update from upstream
+
+    Also adds an update.sh script that does this automatically.
+
+ test/shaping/data/text-rendering-tests/Makefile.am |  52
+ +++------------------
+ .../data/text-rendering-tests/Makefile.sources     |  51
+ ++++++++++++++++++++
+ .../text-rendering-tests/fonts/TestMORXEight.ttf   | Bin 0 -> 2184 bytes
+ .../text-rendering-tests/fonts/TestMORXNine.ttf    | Bin 0 -> 1624 bytes
+ .../data/text-rendering-tests/tests/MORX-5.tests   |  25 ++++++++++
+ .../data/text-rendering-tests/tests/MORX-6.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-7.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-8.tests   |   3 ++
+ .../data/text-rendering-tests/tests/MORX-9.tests   |   1 +
+ test/shaping/data/text-rendering-tests/update.sh   |  48
+ +++++++++++++++++++
+ 10 files changed, 136 insertions(+), 46 deletions(-)
+
+commit c861daacc4255d41d2358868b917277422949dc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:11:01 2018 +0100
+
+    [test/text-rendering-tests] Add README and COPYING
+
+ test/shaping/data/text-rendering-tests/COPYING     | 13 +++++++++++++
+ test/shaping/data/text-rendering-tests/Makefile.am |  2 ++
+ test/shaping/data/text-rendering-tests/README      |  4 ++++
+ 3 files changed, 19 insertions(+)
+
+commit 14b4d84eef18bd54287c10ce44eaef4f642f6238
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 10:08:25 2018 +0100
+
+    [aat] Fix RearrangementSubtable action
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ea3e86c6401d41cf54d82692eccbf44c87be2fd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 09:58:42 2018 +0100
+
+    Minor
+
+ test/shaping/data/Makefile.am                      | 4 ++++
+ test/shaping/data/in-house/Makefile.am             | 4 ++++
+ test/shaping/data/text-rendering-tests/Makefile.am | 4 ++++
+ 3 files changed, 12 insertions(+)
+
+commit 800e4ae80232f022404be155afd497b0421a6a64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 09:57:55 2018 +0100
+
+    [aat] Mark state-machine-based lookup as completely unsafe-to-break
+
+    To be improved later.
+
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ca42d961293a9e4dfd0817c1a02d454008583282
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 11 09:15:34 2018 +0100
+
+    [aat] Implement RearrangementSubtable
+
+ src/hb-aat-layout-common-private.hh |  89 ++++++++++++++++-
+ src/hb-aat-layout-morx-table.hh     | 192
+ +++++++++++++++++++++++++++++++-----
+ src/hb-open-type-private.hh         |   2 -
+ src/hb-private.hh                   |   7 +-
+ 4 files changed, 254 insertions(+), 36 deletions(-)
+
+commit 5dbbd0fdb9a343554112a846b392803f11c13197
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 11 12:33:22 2018 +0330
+
+    Move the #define of _GNU_SOURCE to the top of hb-private.hh (#697)
+
+    This fixes the build on Cygwin.
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 90e3c9e69e93e05d9fb534fd43b5c99cf58a7cb4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 11 12:31:05 2018 +0330
+
+    [cmake] Fix hb-blob test (#699)
+
+ CMakeLists.txt | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 1461965c2220cd957c26b3fe5835200e426bc715
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 11 08:48:22 2018 +0330
+
+    [test] Better tests output by converting stderr to stdout (#696)
+
+    https://gitlab.kitware.com/cmake/cmake/issues/17630
+
+ test/shaping/run-tests.py | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit ebb9b7d6335536804b50002fb83dd30da42a8ad5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 11 08:15:06 2018 +0330
+
+    [test] Print shaping output on CI fails (#695)
+
+ .circleci/config.yml      | 4 ++--
+ test/shaping/run-tests.py | 8 ++++----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit e24bea8e91ba9f447f1f7f252bdefacef1f83593
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jan 10 23:51:56 2018 +0330
+
+    [cmake] Another try on making sure feature testing is working (#691)
+
+ .circleci/config.yml | 131
+ ++++++++++++++++++++++++++++-----------------------
+ CMakeLists.txt       |  17 ++++---
+ 2 files changed, 79 insertions(+), 69 deletions(-)
+
+commit 746a37d5bdd2e965aa316e95ba5a7bad809d76a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 16:47:47 2018 +0100
+
+    [util] Replace setlinebuf
+
+ util/options.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ff2083c53eecc67c011b96b0b9a58331043e53cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 13:54:36 2018 +0100
+
+    [util] Set stdio files to line buffering
+
+    So we can stream lines to hb-shape and read output.
+
+ util/options.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 80fd5743200cbe221ae3adf057fe0e5ef54a894c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 11:09:53 2018 +0100
+
+    [aat] Add Class subtable thingy
+
+    From old 'mort' table.
+
+ src/hb-aat-layout-common-private.hh | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 71e0ed9cbad8438239dcedf1bcfa8e19b9dfdc89
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jan 10 15:45:12 2018 +0330
+
+    [cmake] Add header existence tests (#685)
+
+ .circleci/config.yml        |  4 ++--
+ CMakeLists.txt              | 53
+ ++++++++++++++++++++++++++++++---------------
+ test/shaping/CMakeLists.txt |  1 -
+ 3 files changed, 37 insertions(+), 21 deletions(-)
+
+commit a073621b5dc2865a014821307128a8fdd1d7d992
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jan 10 12:13:28 2018 +0330
+
+    [cmake] Fix tests against latest changes (#690)
+
+ test/shaping/CMakeLists.txt | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit 0b22da954142ad7a1e949a56448cee4e836fff75
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Jan 10 07:12:07 2018 +0200
+
+    Improve HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES docs
+
+    Add the note about absolute glyph positions from the commit message.
+
+ src/hb-buffer.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 6db0b17c4ce56bd7477941e7a2fc85997c04588e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 05:40:43 2018 +0100
+
+    [test] Move test handling to sundirectories
+
+ configure.ac                                       |  3 +
+ test/shaping/Makefile.am                           | 98
+ +---------------------
+ test/shaping/data/Makefile.am                      |  9 ++
+ test/shaping/data/in-house/Makefile.am             | 58 +++++++++++++
+ test/shaping/data/text-rendering-tests/Makefile.am | 60 +++++++++++++
+ 5 files changed, 131 insertions(+), 97 deletions(-)
+
+commit 4c982b4867707fcd2259b344b06e5bba8dd0c1e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 05:26:55 2018 +0100
+
+    [test] Whitelist one more passing test
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 188ee6e5eeef3c63c332cfa30795d37da1bc1682
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 05:13:47 2018 +0100
+
+    Calculate anchor positions in float, then round
+
+    Hoping to reduce rounding error, to make tests happier...
+    No luck.
+
+ src/hb-font-private.hh         |  6 ++++++
+ src/hb-ot-layout-gpos-table.hh | 44
+ +++++++++++++++++++++---------------------
+ 2 files changed, 28 insertions(+), 22 deletions(-)
+
+commit 0b28e1199d62765db4e855756b96022e423dcc17
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 05:02:42 2018 +0100
+
+    [test] Whitelist one more passing test
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7cdd6ab068500aa18de9a856bfbe730d0aac9a27
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 04:33:08 2018 +0100
+
+    Round, instead of floor, when applying variations
+
+    Hoping this would fix remaining text-rendering-tests failures,
+    but so far no luck.
+
+ src/hb-font-private.hh         | 2 +-
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-private.hh              | 1 +
+ 3 files changed, 3 insertions(+), 2 deletions(-)
+
+commit 6dc6f0c9f844a006b4518ce789e319fcef6e9680
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 04:12:35 2018 +0100
+
+    [test] Whitelist one passing test
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec939761e4d1b2f825db715290d70e18b1c9dd12
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:56:43 2018 +0100
+
+    Minor
+
+ test/shaping/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c4eac531dfad55f691557a684b3a6bde83c4bcea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:51:09 2018 +0100
+
+    Minor
+
+ test/shaping/Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 285a0bd799426c544d896f8fbcc27f4613a28e9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:49:32 2018 +0100
+
+    [test] Another try
+
+    Making cmake happy this time.
+
+ test/shaping/Makefile.am | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 95b32b00557d6afcfc469f8dcc51d8bfa8243a00
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:48:09 2018 +0100
+
+    [test] Fix text disabling
+
+    Ouch, make!
+
+ test/shaping/Makefile.am | 27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+commit a938d105b8d6e2d654079ea7d89e2e3ef5e0aed4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:41:55 2018 +0100
+
+    [test/text-rendering-tests] Disable failing tests
+
+ test/shaping/Makefile.am | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit ed95d5e374a10770eb305dfa43a9f5b39933aac7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:38:52 2018 +0100
+
+    [test/text-rendering-tests] Disable failing tests
+
+ test/shaping/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b1e97f364e5ffdc08b52f889e3fea80a7e83e99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:35:20 2018 +0100
+
+    Add HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES
+
+    New API:
+    HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES
+    hb-shape / hb-view --remove-default-ignorables
+
+    One more text-rendering-tests test passing.  Eleven failing.
+
+ src/hb-buffer.h                                    | 17 ++++--
+ src/hb-ot-shape.cc                                 |  6 +-
+ .../data/text-rendering-tests/extract-tests.py     |  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/GPOS-2.tests   |  6 +-
+ .../data/text-rendering-tests/tests/GPOS-3.tests   |  8 +--
+ .../data/text-rendering-tests/tests/GPOS-4.tests   |  8 +--
+ .../data/text-rendering-tests/tests/GPOS-5.tests   | 10 ++--
+ .../data/text-rendering-tests/tests/GSUB-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/GSUB-2.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-1.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/GVAR-2.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/GVAR-3.tests   | 18 +++---
+ .../data/text-rendering-tests/tests/GVAR-4.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-5.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-6.tests   | 22 +++----
+ .../data/text-rendering-tests/tests/GVAR-7.tests   | 14 ++---
+ .../data/text-rendering-tests/tests/GVAR-8.tests   | 12 ++--
+ .../data/text-rendering-tests/tests/GVAR-9.tests   | 20 +++----
+ .../data/text-rendering-tests/tests/HVAR-1.tests   | 12 ++--
+ .../data/text-rendering-tests/tests/HVAR-2.tests   | 12 ++--
+ .../data/text-rendering-tests/tests/KERN-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/KERN-2.tests   |  2 +-
+ .../data/text-rendering-tests/tests/MORX-1.tests   |  2 +-
+ .../data/text-rendering-tests/tests/MORX-2.tests   | 32 +++++-----
+ .../data/text-rendering-tests/tests/MORX-3.tests   | 32 +++++-----
+ .../data/text-rendering-tests/tests/MORX-4.tests   | 30 +++++-----
+ .../data/text-rendering-tests/tests/SHARAN-1.tests | 12 ++--
+ .../data/text-rendering-tests/tests/SHBALI-1.tests | 44 +++++++-------
+ .../data/text-rendering-tests/tests/SHBALI-2.tests | 24 ++++----
+ .../data/text-rendering-tests/tests/SHBALI-3.tests | 18 +++---
+ .../data/text-rendering-tests/tests/SHKNDA-1.tests | 68
+ +++++++++++-----------
+ .../data/text-rendering-tests/tests/SHKNDA-2.tests | 32 +++++-----
+ .../data/text-rendering-tests/tests/SHKNDA-3.tests | 62
+ ++++++++++----------
+ util/options.cc                                    |  1 +
+ util/options.hh                                    | 14 +++--
+ 46 files changed, 435 insertions(+), 419 deletions(-)
+
+commit 46e4ed552fb1205eb6cbc16450bb231998fc7347
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:22:08 2018 +0100
+
+    [test/text-rendering-tests] Hook up font variations
+
+    Six more passing. Twelve failing now.
+
+ .../data/text-rendering-tests/extract-tests.py     |  6 +++-
+ .../data/text-rendering-tests/tests/AVAR-1.tests   | 34
+ +++++++++++-----------
+ .../data/text-rendering-tests/tests/CFF2-1.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/CVAR-1.tests   |  6 ++--
+ .../data/text-rendering-tests/tests/CVAR-2.tests   |  6 ++--
+ .../data/text-rendering-tests/tests/GPOS-5.tests   | 10 +++----
+ .../data/text-rendering-tests/tests/GVAR-1.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/GVAR-2.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/GVAR-3.tests   | 18 ++++++------
+ .../data/text-rendering-tests/tests/GVAR-4.tests   | 22 +++++++-------
+ .../data/text-rendering-tests/tests/GVAR-5.tests   | 22 +++++++-------
+ .../data/text-rendering-tests/tests/GVAR-6.tests   | 22 +++++++-------
+ .../data/text-rendering-tests/tests/GVAR-7.tests   | 14 ++++-----
+ .../data/text-rendering-tests/tests/GVAR-8.tests   | 12 ++++----
+ .../data/text-rendering-tests/tests/GVAR-9.tests   | 20 ++++++-------
+ .../data/text-rendering-tests/tests/HVAR-1.tests   | 12 ++++----
+ .../data/text-rendering-tests/tests/HVAR-2.tests   | 12 ++++----
+ 17 files changed, 137 insertions(+), 133 deletions(-)
+
+commit 2b3f62fc4de8f10c2168f212b1368478312e6dec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:16:56 2018 +0100
+
+    [test] Add tests from text-rendering-tests repo
+
+    https://github.com/unicode-org/text-rendering-tests
+
+ test/shaping/Makefile.am                           |  44 ++++++++++++++-
+ .../fonts/AdobeVFPrototype-Subset.otf              | Bin 0 -> 7096 bytes
+ .../text-rendering-tests/fonts/FDArrayTest257.otf  | Bin 0 -> 145212
+ bytes
+ .../fonts/FDArrayTest65535.otf                     | Bin 0 -> 492740
+ bytes
+ .../fonts/NotoSansBalinese-Regular.ttf             | Bin 0 -> 32304 bytes
+ .../fonts/NotoSansKannada-Regular.ttf              | Bin 0 -> 83868 bytes
+ .../fonts/NotoSerifKannada-Regular.ttf             | Bin 0 -> 96936 bytes
+ .../text-rendering-tests/fonts/Selawik-README.md   |  60
+ +++++++++++++++++++++
+ .../fonts/Selawik-variable.ttf                     | Bin 0 -> 481504
+ bytes
+ .../data/text-rendering-tests/fonts/TestAVAR.ttf   | Bin 0 -> 1608 bytes
+ .../data/text-rendering-tests/fonts/TestCMAP14.otf | Bin 0 -> 1628 bytes
+ .../fonts/TestCMAPMacTurkish.ttf                   | Bin 0 -> 19644 bytes
+ .../text-rendering-tests/fonts/TestCVARGVAROne.ttf | Bin 0 -> 12336 bytes
+ .../text-rendering-tests/fonts/TestCVARGVARTwo.ttf | Bin 0 -> 12256 bytes
+ .../text-rendering-tests/fonts/TestGLYFOne.ttf     | Bin 0 -> 1516 bytes
+ .../text-rendering-tests/fonts/TestGPOSFour.ttf    | Bin 0 -> 315020
+ bytes
+ .../text-rendering-tests/fonts/TestGPOSOne.ttf     | Bin 0 -> 10384 bytes
+ .../text-rendering-tests/fonts/TestGPOSThree.ttf   | Bin 0 -> 3500 bytes
+ .../text-rendering-tests/fonts/TestGPOSTwo.otf     | Bin 0 -> 1680 bytes
+ .../text-rendering-tests/fonts/TestGSUBOne.otf     | Bin 0 -> 1788 bytes
+ .../text-rendering-tests/fonts/TestGVAREight.ttf   | Bin 0 -> 4692 bytes
+ .../text-rendering-tests/fonts/TestGVARFour.ttf    | Bin 0 -> 3204 bytes
+ .../text-rendering-tests/fonts/TestGVARNine.ttf    | Bin 0 -> 2168 bytes
+ .../text-rendering-tests/fonts/TestGVAROne.ttf     | Bin 0 -> 14312 bytes
+ .../text-rendering-tests/fonts/TestGVARThree.ttf   | Bin 0 -> 14336 bytes
+ .../text-rendering-tests/fonts/TestGVARTwo.ttf     | Bin 0 -> 15668 bytes
+ .../text-rendering-tests/fonts/TestHVAROne.otf     | Bin 0 -> 3984 bytes
+ .../text-rendering-tests/fonts/TestHVARTwo.ttf     | Bin 0 -> 4004 bytes
+ .../text-rendering-tests/fonts/TestKERNOne.otf     | Bin 0 -> 1380 bytes
+ .../text-rendering-tests/fonts/TestMORXFour.ttf    | Bin 0 -> 4764 bytes
+ .../text-rendering-tests/fonts/TestMORXOne.ttf     | Bin 0 -> 2404 bytes
+ .../text-rendering-tests/fonts/TestMORXThree.ttf   | Bin 0 -> 4104 bytes
+ .../text-rendering-tests/fonts/TestMORXTwo.ttf     | Bin 0 -> 4960 bytes
+ .../text-rendering-tests/fonts/TestShapeAran.ttf   | Bin 0 -> 116044
+ bytes
+ .../text-rendering-tests/fonts/TestShapeEthi.ttf   | Bin 0 -> 5292 bytes
+ .../data/text-rendering-tests/fonts/Zycon.ttf      | Bin 0 -> 21036 bytes
+ .../data/text-rendering-tests/tests/AVAR-1.tests   |  17 ++++++
+ .../data/text-rendering-tests/tests/CFF-1.tests    |  13 +++++
+ .../data/text-rendering-tests/tests/CFF-2.tests    |  13 +++++
+ .../data/text-rendering-tests/tests/CFF2-1.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/CMAP-1.tests   |   4 ++
+ .../data/text-rendering-tests/tests/CMAP-2.tests   |   2 +
+ .../data/text-rendering-tests/tests/CMAP-3.tests   |  20 +++++++
+ .../data/text-rendering-tests/tests/CVAR-1.tests   |   3 ++
+ .../data/text-rendering-tests/tests/CVAR-2.tests   |   3 ++
+ .../data/text-rendering-tests/tests/GLYF-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/GPOS-1.tests   |  19 +++++++
+ .../data/text-rendering-tests/tests/GPOS-2.tests   |   3 ++
+ .../data/text-rendering-tests/tests/GPOS-3.tests   |   4 ++
+ .../data/text-rendering-tests/tests/GPOS-4.tests   |   4 ++
+ .../data/text-rendering-tests/tests/GPOS-5.tests   |   5 ++
+ .../data/text-rendering-tests/tests/GSUB-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/GSUB-2.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-1.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/GVAR-2.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/GVAR-3.tests   |   9 ++++
+ .../data/text-rendering-tests/tests/GVAR-4.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-5.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-6.tests   |  11 ++++
+ .../data/text-rendering-tests/tests/GVAR-7.tests   |   7 +++
+ .../data/text-rendering-tests/tests/GVAR-8.tests   |   6 +++
+ .../data/text-rendering-tests/tests/GVAR-9.tests   |  10 ++++
+ .../data/text-rendering-tests/tests/HVAR-1.tests   |   6 +++
+ .../data/text-rendering-tests/tests/HVAR-2.tests   |   6 +++
+ .../data/text-rendering-tests/tests/KERN-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/KERN-2.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-1.tests   |   1 +
+ .../data/text-rendering-tests/tests/MORX-2.tests   |  16 ++++++
+ .../data/text-rendering-tests/tests/MORX-3.tests   |  16 ++++++
+ .../data/text-rendering-tests/tests/MORX-4.tests   |  15 ++++++
+ .../data/text-rendering-tests/tests/SHARAN-1.tests |   6 +++
+ .../data/text-rendering-tests/tests/SHBALI-1.tests |  22 ++++++++
+ .../data/text-rendering-tests/tests/SHBALI-2.tests |  12 +++++
+ .../data/text-rendering-tests/tests/SHBALI-3.tests |   9 ++++
+ .../data/text-rendering-tests/tests/SHKNDA-1.tests |  34 ++++++++++++
+ .../data/text-rendering-tests/tests/SHKNDA-2.tests |  16 ++++++
+ .../data/text-rendering-tests/tests/SHKNDA-3.tests |  31 +++++++++++
+ 77 files changed, 510 insertions(+), 1 deletion(-)
+
+commit 6b19178ee35fec3b2115d6a06a86db36dc838b38
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 03:07:30 2018 +0100
+
+    Prefix int types with HB
+
+    Such a headache that Windows defines UINT8, ...; Just prefix it.
+
+ src/hb-aat-layout-common-private.hh  |  29 +++---
+ src/hb-aat-layout-morx-table.hh      |  65 +++++++------
+ src/hb-open-file-private.hh          |   6 +-
+ src/hb-open-type-private.hh          |  70 +++++++-------
+ src/hb-ot-cbdt-table.hh              |  78 ++++++++--------
+ src/hb-ot-cmap-table.hh              |  90 +++++++++---------
+ src/hb-ot-glyf-table.hh              |  10 +-
+ src/hb-ot-head-table.hh              |  28 +++---
+ src/hb-ot-hhea-table.hh              |  18 ++--
+ src/hb-ot-kern-table.hh              |  36 ++++----
+ src/hb-ot-layout-common-private.hh   | 120 ++++++++++++------------
+ src/hb-ot-layout-gdef-table.hh       |  22 ++---
+ src/hb-ot-layout-gpos-table.hh       |  94 +++++++++----------
+ src/hb-ot-layout-gsub-table.hh       |  30 +++---
+ src/hb-ot-layout-gsubgpos-private.hh | 172
+ +++++++++++++++++------------------
+ src/hb-ot-math-table.hh              |  26 +++---
+ src/hb-ot-maxp-table.hh              |   2 +-
+ src/hb-ot-name-table.hh              |  16 ++--
+ src/hb-ot-os2-table.hh               |  70 +++++++-------
+ src/hb-ot-post-table.hh              |  16 ++--
+ src/hb-ot-var-avar-table.hh          |   4 +-
+ src/hb-ot-var-fvar-table.hh          |  20 ++--
+ src/hb-ot-var-hvar-table.hh          |   8 +-
+ src/hb-ot-var-mvar-table.hh          |  10 +-
+ 24 files changed, 517 insertions(+), 523 deletions(-)
+
+commit 81e321c802afcc43186737e6900f8d7e2f9d4fd3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:56:29 2018 +0100
+
+    [aat] Try fixing VC bots
+
+    c:\projects\harfbuzz\src\hb-aat-layout-common-private.hh(51):
+    error C2872: 'UINT16': ambiguous symbol
+    [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+    C:\Program Files (x86)\Windows
+    Kits\10\Include\10.0.14393.0\shared\basetsd.h(80): note: could be
+    'unsigned short UINT16'
+    c:\projects\harfbuzz\src\hb-open-type-private.hh(648): note: or
+    'OT::UINT16'
+
+ src/hb-aat-layout-common-private.hh | 3 +++
+ src/hb-aat-layout-morx-table.hh     | 3 +++
+ 2 files changed, 6 insertions(+)
+
+commit 0ed69c946247feb5bbb5be06d5314c5e0c0fec67
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:49:36 2018 +0100
+
+    Disable processing of morx table in ot shaper
+
+    So I can merge this to master...
+
+ src/hb-ot-shape.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3f29ea91441b2e8c86cf379b4803f638a2e8dcfc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:48:04 2018 +0100
+
+    [util] Add hb-shape --ned
+
+    For not displaying extra data: no clusters, no advance. Just data
+    pertaining
+    to where glyphs end up on the screen.
+
+ test/shaping/data/text-rendering-tests/extract-tests.py |  2 +-
+ util/options.cc                                         | 13
+ +++++++++++++
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit 7020130665316365c288d0960fc288faa8f5bdf7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:37:39 2018 +0100
+
+    [test] Minor
+
+ test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5f94b4cc39f2f61b38c954ddac1aae6a052845bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:35:59 2018 +0100
+
+    [kern] Mark unsafe-to-break
+
+ src/hb-ot-shape-fallback.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 71fd6325b6cba2586709022dd33530c61141bf8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 02:20:14 2018 +0100
+
+    Add option to buffer serialization to not output glyph advances
+
+    When advances are not printed, glyph offsets reflect absolute glyph
+    positions.
+
+    New API:
+    HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES
+    hb-shape --no-advances
+
+ src/hb-buffer-serialize.cc | 38 ++++++++++++++++++++++++++++----------
+ src/hb-buffer.h            |  5 ++++-
+ util/hb-shape.cc           |  2 ++
+ util/options.cc            |  2 ++
+ util/options.hh            |  2 ++
+ 5 files changed, 38 insertions(+), 11 deletions(-)
+
+commit 316a28f8f8a9c459936ce9f2786d4d64a8f4e2c0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 01:54:12 2018 +0100
+
+    [test] Add script for extracting tests from text-rendering-tests
+
+    Work in progress...
+
+    https://github.com/unicode-org/text-rendering-tests
+
+ .../data/text-rendering-tests/extract-tests.py     | 45
+ ++++++++++++++++++++++
+ 1 file changed, 45 insertions(+)
+
+commit 6b4d63f295f419f55983a8fc72f582802f55b09f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 10 01:13:36 2018 +0100
+
+    [test] Minor
+
+ test/shaping/run-tests.py | 9 ---------
+ 1 file changed, 9 deletions(-)
+
+commit 504f913654d5904604e6abdbf7d0653f40db51fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 23:15:54 2018 +0100
+
+    [test] Simplify test runner
+
+    Always pass hb-shape as first argument to run-tests.py.
+
+    Also require automake 1.13.
+
+ configure.ac              |  3 +--
+ test/shaping/Makefile.am  | 18 ++----------------
+ test/shaping/run-tests.py | 22 +++++-----------------
+ 3 files changed, 8 insertions(+), 35 deletions(-)
+
+commit 141db8b7a3abf2adbf0caa0659d9239396f6a2db
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 23:11:00 2018 +0100
+
+    [test] Minor
+
+ test/shaping/Makefile.am  | 4 ----
+ test/shaping/run-tests.py | 4 ++--
+ 2 files changed, 2 insertions(+), 6 deletions(-)
+
+commit 44c65eee28e2de5c54028cb0ef144f56da16ef58
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 21:58:57 2018 +0100
+
+    [test] Reorganize test suite
+
+    In anticipation of importing more test suites.
+
+ test/fuzzing/run-fuzzer-tests.py                   |   2 +-
+ test/shaping/Makefile.am                           |  86
+ +++++++++---------
+ test/shaping/{fonts => data/in-house}/COPYING      |   7 +-
+ .../0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf   | Bin
+ .../051d92f8bc6ff724511b296c27623f824de256e9.ttf   | Bin
+ .../074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf   | Bin
+ .../07f054357ff8638bac3711b422a1e31180bba863.ttf   | Bin
+ .../15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf   | Bin
+ .../1735326da89f0818cd8c51a0600e9789812c0f94.ttf   | Bin
+ .../191826b9643e3f124d865d617ae609db6a2ce203.ttf   | Bin
+ .../1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf   | Bin
+ .../1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf   | Bin
+ .../1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf   | Bin
+ .../1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf   | Bin
+ .../1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf   | Bin
+ .../205edd09bd3d141cc9580f650109556cc28b22cb.ttf   | Bin
+ .../217a934cfe15c548b572c203dceb2befdf026462.ttf   | Bin
+ .../21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf   | Bin
+ .../226bc2deab3846f1a682085f70c67d0421014144.ttf   | Bin
+ .../243798dd281c1c77c065958e1ff467420faa9bde.ttf   | Bin
+ .../24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf   | Bin
+ .../270b89df543a7e48e206a2d830c0e10e5265c630.ttf   | Bin
+ .../298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf   | Bin
+ .../2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf   | Bin
+ .../341421e629668b1a1242245d39238ca48432d35d.ttf   | Bin
+ .../3493e92eaded2661cadde752a39f9d58b11f0326.ttf   | Bin
+ .../3511ff5c1647150595846ac414c595cccac34f18.ttf   | Bin
+ .../37033cc5cf37bb223d7355153016b6ccece93b28.ttf   | Bin
+ .../373e67bf41ca264e260a9716162b71a23549e885.ttf   | Bin
+ .../375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf   | Bin
+ .../3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf   | Bin
+ .../3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf   | Bin
+ .../43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf   | Bin
+ .../43ef465752be9af900745f72fe29cb853a1401a5.ttf   | Bin
+ .../45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf   | Bin
+ .../49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf   | Bin
+ .../4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf   | Bin
+ .../4fac3929fc3332834e93673780ec0fe94342d193.ttf   | Bin
+ .../5028afb650b1bb718ed2131e872fbcce57828fff.ttf   | Bin
+ .../53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf   | Bin
+ .../54674a3111d209fb6be0ed31745314b7a8d2c244.ttf   | Bin
+ .../558661aa659912f4d30ecd27bd09835171a8e2b0.ttf   | Bin
+ .../55c88ebbe938680b08f92c3de20713183e0c7481.ttf   | Bin
+ .../56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf   | Bin
+ .../57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf   | Bin
+ .../59a585a63b3df608fbeef00956c8c108deec7de6.ttf   | Bin
+ .../5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf   | Bin
+ .../5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf   | Bin
+ .../641bd9db850193064d17575053ae2bf8ec149ddc.ttf   | Bin
+ .../663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf   | Bin
+ .../6991b13ce889466be6de3f66e891de2bc0f117ee.ttf   | Bin
+ .../6ff0fbead4462d9f229167b4e6839eceb8465058.ttf   | Bin
+ .../706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf   | Bin
+ .../757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf   | Bin
+ .../7a37dc4d5bf018456aea291cee06daf004c0221c.ttf   | Bin
+ .../7e14e7883ed152baa158b80e207b66114c823a8b.ttf   | Bin
+ .../8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf   | Bin
+ .../813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf   | Bin
+ .../81c368a33816fb20e9f647e8f24e2180f4720263.ttf   | Bin
+ .../8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf   | Bin
+ .../8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf   | Bin
+ .../82f4f3b57bb55344e72e70231380202a52af5805.ttf   | Bin
+ .../8454d22037f892e76614e1645d066689a0200e61.ttf   | Bin
+ .../85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf   | Bin
+ .../856ff9562451293cbeff6f396d4e3877c4f0a436.ttf   | Bin
+ .../85fe0be440c64ac77699e21c2f1bd933a919167e.ttf   | Bin
+ .../87f85d17d26f1fe9ad28d7365101958edaefb967.ttf   | Bin
+ .../8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf   | Bin
+ .../94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf   | Bin
+ .../96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf   | Bin
+ .../98b7887cff91f722b92a8ff800120954606354f9.ttf   | Bin
+ .../9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf   | Bin
+ .../a014549f766436cf55b2ceb40e462038938ee899.ttf   | Bin
+ .../a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf   | Bin
+ .../a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf   | Bin
+ .../a34a9191d9376bda419836effeef7e75c1386016.ttf   | Bin
+ .../a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf   | Bin
+ .../a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf   | Bin
+ .../a919b33197965846f21074b24e30250d67277bce.ttf   | Bin
+ .../a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf   | Bin
+ .../b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf   | Bin
+ .../b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf   | Bin
+ .../b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf   | Bin
+ .../bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf   | Bin
+ .../bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf   | Bin
+ .../bb9473d2403488714043bcfb946c9f78b86ad627.ttf   | Bin
+ .../bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf   | Bin
+ .../bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf   | Bin
+ .../bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf   | Bin
+ .../c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf   | Bin
+ .../cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf   | Bin
+ .../d23d76ea0909c14972796937ba072b5a40c1e257.ttf   | Bin
+ .../d629e7fedc0b350222d7987345fe61613fa3929a.ttf   | Bin
+ .../d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf   | Bin
+ .../dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf   | Bin
+ .../df768b9c257e0c9c35786c47cae15c46571d56be.ttf   | Bin
+ .../e207635780b42f898d58654b65098763e340f5c7.ttf   | Bin
+ .../e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf   | Bin
+ .../e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf   | Bin
+ .../ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf   | Bin
+ .../ef2511f215aa3ca847cbfffbf861793b42170875.ttf   | Bin
+ .../ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf   | Bin
+ .../f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf   | Bin
+ .../f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf   | Bin
+ .../f499fbc23865022234775c43503bba2e63978fe1.ttf   | Bin
+ .../f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf   | Bin
+ .../f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf   | Bin
+ .../fab39d60d758cb586db5a504f218442cd1395725.ttf   | Bin
+ .../fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf   | Bin
+ .../fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf   | Bin
+ .../ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf   | Bin
+ .../in-house/tests/arabic-fallback-shaping.tests   |   1 +
+ .../data/in-house/tests/arabic-feature-order.tests |   4 +
+ .../data/in-house/tests/arabic-like-joining.tests  |   1 +
+ .../data/in-house/tests/arabic-mark-order.tests    |   6 ++
+ test/shaping/data/in-house/tests/arabic-stch.tests |   1 +
+ .../data/in-house/tests/automatic-fractions.tests  |   3 +
+ test/shaping/data/in-house/tests/cluster.tests     |   2 +
+ test/shaping/data/in-house/tests/color-fonts.tests |   1 +
+ .../data/in-house/tests/context-matching.tests     |   3 +
+ .../data/in-house/tests/cursive-positioning.tests  |   4 +
+ .../data/in-house/tests/default-ignorables.tests   |   2 +
+ .../data/in-house/tests/emoji-flag-tags.tests      |   2 +
+ .../data/in-house/tests/fallback-positioning.tests |   2 +
+ test/shaping/data/in-house/tests/fuzzed.tests      |  22 +++++
+ test/shaping/data/in-house/tests/hangul-jamo.tests |   2 +
+ test/shaping/data/in-house/tests/hyphens.tests     |   2 +
+ .../tests/indic-consonant-with-stacker.tests       |   4 +
+ test/shaping/data/in-house/tests/indic-init.tests  |   1 +
+ .../in-house/tests/indic-joiner-candrabindu.tests  |   2 +
+ .../data/in-house/tests/indic-joiners.tests        |   2 +
+ .../data/in-house/tests/indic-old-spec.tests       |   2 +
+ .../data/in-house/tests/indic-pref-blocking.tests  |   2 +
+ .../in-house/tests/indic-script-extensions.tests   |   2 +
+ .../data/in-house/tests/indic-special-cases.tests  |   3 +
+ .../data/in-house/tests/indic-syllable.tests       |   8 ++
+ .../data/in-house/tests/language-tags.tests        |  12 +++
+ test/shaping/data/in-house/tests/ligature-id.tests |  36 ++++++++
+ .../data/in-house/tests/mark-attachment.tests      |   1 +
+ .../data/in-house/tests/mark-filtering-sets.tests  |   5 ++
+ .../tests/mongolian-variation-selector.tests       |   4 +
+ test/shaping/data/in-house/tests/simple.tests      |   2 +
+ test/shaping/data/in-house/tests/spaces.tests      |  17 ++++
+ .../in-house/tests/tibetan-contractions-1.tests    |  60 +++++++++++++
+ .../in-house/tests/tibetan-contractions-2.tests    |  53 +++++++++++
+ .../data/in-house/tests/tibetan-vowels.tests       |  11 +++
+ test/shaping/data/in-house/tests/use-marchen.tests |  35 ++++++++
+ .../shaping/data/in-house/tests/use-syllable.tests |   7 ++
+ test/shaping/data/in-house/tests/use.tests         |   4 +
+ .../data/in-house/tests/variations-rvrn.tests      | 100
+ +++++++++++++++++++++
+ test/shaping/data/in-house/tests/vertical.tests    |   3 +
+ .../data/in-house/tests/zero-width-marks.tests     |  11 +++
+ test/shaping/run-tests.py                          |  48 ++++------
+ .../tests/misc/arabic-fallback-shaping.tests       |   1 -
+ test/shaping/tests/misc/arabic-feature-order.tests |   4 -
+ test/shaping/tests/misc/arabic-like-joining.tests  |   1 -
+ test/shaping/tests/misc/arabic-mark-order.tests    |   6 --
+ test/shaping/tests/misc/arabic-stch.tests          |   1 -
+ test/shaping/tests/misc/automatic-fractions.tests  |   3 -
+ test/shaping/tests/misc/cluster.tests              |   2 -
+ test/shaping/tests/misc/color-fonts.tests          |   1 -
+ test/shaping/tests/misc/context-matching.tests     |   3 -
+ test/shaping/tests/misc/cursive-positioning.tests  |   4 -
+ test/shaping/tests/misc/default-ignorables.tests   |   2 -
+ test/shaping/tests/misc/emoji-flag-tags.tests      |   2 -
+ test/shaping/tests/misc/fallback-positioning.tests |   2 -
+ test/shaping/tests/misc/fuzzed.tests               |  22 -----
+ test/shaping/tests/misc/hangul-jamo.tests          |   2 -
+ test/shaping/tests/misc/hyphens.tests              |   2 -
+ .../tests/misc/indic-consonant-with-stacker.tests  |   4 -
+ test/shaping/tests/misc/indic-init.tests           |   1 -
+ .../tests/misc/indic-joiner-candrabindu.tests      |   2 -
+ test/shaping/tests/misc/indic-joiners.tests        |   2 -
+ test/shaping/tests/misc/indic-old-spec.tests       |   2 -
+ test/shaping/tests/misc/indic-pref-blocking.tests  |   2 -
+ .../tests/misc/indic-script-extensions.tests       |   2 -
+ test/shaping/tests/misc/indic-special-cases.tests  |   3 -
+ test/shaping/tests/misc/indic-syllable.tests       |   8 --
+ test/shaping/tests/misc/language-tags.tests        |  12 ---
+ test/shaping/tests/misc/ligature-id.tests          |  36 --------
+ test/shaping/tests/misc/mark-attachment.tests      |   1 -
+ test/shaping/tests/misc/mark-filtering-sets.tests  |   5 --
+ .../tests/misc/mongolian-variation-selector.tests  |   4 -
+ test/shaping/tests/misc/simple.tests               |   2 -
+ test/shaping/tests/misc/spaces.tests               |  17 ----
+ .../tests/misc/tibetan-contractions-1.tests        |  60 -------------
+ .../tests/misc/tibetan-contractions-2.tests        |  53 -----------
+ test/shaping/tests/misc/tibetan-vowels.tests       |  11 ---
+ test/shaping/tests/misc/use-marchen.tests          |  35 --------
+ test/shaping/tests/misc/use-syllable.tests         |   7 --
+ test/shaping/tests/misc/use.tests                  |   4 -
+ test/shaping/tests/misc/variations-rvrn.tests      | 100
+ ---------------------
+ test/shaping/tests/misc/vertical.tests             |   3 -
+ test/shaping/tests/misc/zero-width-marks.tests     |  11 ---
+ .../script-arabic/language-persian/mehran.txt      |  14 +--
+ .../language-urdu/crulp/ligatures/2grams.txt       |   0
+ .../language-urdu/crulp/ligatures/3grams.txt       |   0
+ .../language-urdu/crulp/ligatures/4grams.txt       |   0
+ .../language-urdu/crulp/ligatures/5grams.txt       |   0
+ .../language-urdu/crulp/ligatures/6grams.txt       |   0
+ .../language-urdu/crulp/ligatures/7grams.txt       |   0
+ .../language-urdu/crulp/ligatures/8grams.txt       |   0
+ .../language-urdu/crulp/ligatures/LICENSE          |   0
+ .../language-urdu/crulp/ligatures/README           |   0
+ .../language-urdu/crulp/ligatures/SOURCES          |   0
+ .../script-arabic/misc/diacritics/lam-alef.txt     |   0
+ .../misc/diacritics/language-arabic.txt            |   0
+ .../misc/diacritics/language-persian.txt           |   0
+ .../misc/diacritics/language-urdu.txt              |   0
+ .../misc/diacritics/ligature-components.txt        |   0
+ .../misc/diacritics/ligature-diacritics.txt        |   0
+ .../misc/diacritics/mark-skipping.txt              |   0
+ .../shaper-arabic/script-mongolian/misc/misc.txt   |   0
+ .../script-mongolian/misc/non-joining.txt          |   0
+ .../shaper-arabic/script-mongolian/misc/poem.txt   |   0
+ .../script-mongolian/misc/variation-selectors.txt  |   0
+ .../shaper-arabic/script-nko/misc/misc.txt         |   0
+ .../shaper-arabic/script-phags-pa/misc/misc.txt    |   0
+ .../script-syriac/misc/abbreviation-mark.txt       |  11 +++
+ .../shaper-arabic/script-syriac/misc/alaph.txt     |   0
+ .../shaper-default/script-ethiopic/misc/misc.txt   |   0
+ .../shaper-default/script-han/misc/cjk-compat.txt  |   0
+ .../script-hiragana/misc/kazuraki-liga-lines.txt   |   0
+ .../script-hiragana/misc/kazuraki-liga.txt         |   0
+ .../shaper-default/script-linear-b/misc/misc.txt   |   0
+ .../shaper-default/script-tifinagh/misc/misc.txt   |   1 -
+ .../shaper-hangul/script-hangul/misc/misc.txt      |   0
+ .../script-hebrew/misc/diacritics.txt              |   0
+ .../indic/script-assamese/utrrs/LICENSE            |   0
+ .../indic/script-assamese/utrrs/README             |   0
+ .../indic/script-assamese/utrrs/SOURCES            |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-bengali/misc/misc.txt             |   0
+ .../indic/script-bengali/misc/reph.txt             |   0
+ .../indic/script-bengali/utrrs/LICENSE             |   0
+ .../shaper-indic/indic/script-bengali/utrrs/README |   0
+ .../indic/script-bengali/utrrs/SOURCES             |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-devanagari/misc/dottedcircle.txt  |   0
+ .../indic/script-devanagari/misc/eyelash.txt       |   0
+ .../indic/script-devanagari/misc/joiners.txt       |   0
+ .../indic/script-devanagari/misc/misc.txt          |   0
+ .../script-devanagari/misc/spec-deviations.txt     |   0
+ .../script-devanagari/misc/tricky-reordering.txt   |   0
+ .../indic/script-devanagari/utrrs/LICENSE          |   0
+ .../indic/script-devanagari/utrrs/README           |   0
+ .../indic/script-devanagari/utrrs/SOURCES          |   0
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ ...tFeatureCodepoint-DevnagariSpecificAddition.txt |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...ndicFontFeatureCodepoint-GenericPunctuation.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-gujarati/utrrs/LICENSE            |   0
+ .../indic/script-gujarati/utrrs/README             |   0
+ .../indic/script-gujarati/utrrs/SOURCES            |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-gurmukhi/misc/misc.txt            |   0
+ .../indic/script-gurmukhi/utrrs/LICENSE            |   0
+ .../indic/script-gurmukhi/utrrs/README             |   0
+ .../indic/script-gurmukhi/utrrs/SOURCES            |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ .../IndicFontFeatureCodepoint-GurmukhiSpecific.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-kannada/misc/misc.txt             |   0
+ .../indic/script-kannada/misc/right-matras.txt     |   0
+ .../indic/script-kannada/utrrs/LICENSE             |   0
+ .../shaper-indic/indic/script-kannada/utrrs/README |   0
+ .../indic/script-kannada/utrrs/SOURCES             |   0
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-malayalam/misc/cibu.txt           |   0
+ .../indic/script-malayalam/misc/dot-reph.txt       |   0
+ .../indic/script-malayalam/misc/misc.txt           |   0
+ .../indic/script-malayalam/utrrs/LICENSE           |   0
+ .../indic/script-malayalam/utrrs/README            |   0
+ .../indic/script-malayalam/utrrs/SOURCES           |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../shaper-indic/indic/script-oriya/misc/bindu.txt |   0
+ .../shaper-indic/indic/script-oriya/misc/misc.txt  |   0
+ .../shaper-indic/indic/script-oriya/utrrs/LICENSE  |   0
+ .../shaper-indic/indic/script-oriya/utrrs/README   |   0
+ .../shaper-indic/indic/script-oriya/utrrs/SOURCES  |   0
+ ...icFontFeatureCodepoint-AdditionalConsonants.txt |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-OriyaSpecific.txt    |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../indic/script-sinhala/misc/extensive.txt        |   0
+ .../indic/script-sinhala/misc/misc.txt             |   0
+ .../indic/script-sinhala/misc/reph.txt             |   0
+ .../indic/script-sinhala/misc/split-matras.txt     |   0
+ .../indic/script-sinhala/utrrs/LICENSE             |   0
+ .../shaper-indic/indic/script-sinhala/utrrs/README |   0
+ .../indic/script-sinhala/utrrs/SOURCES             |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Punctuation.txt      |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS.txt            |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt   |   0
+ .../gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt    |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt     |   0
+ .../gsub/IndicFontFeatureGSUB-Special-Cases.txt    |   0
+ .../gsub/IndicFontFeatureGSUB-TouchingLetters.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt    |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../shaper-indic/indic/script-tamil/misc/misc.txt  |   0
+ .../shaper-indic/indic/script-tamil/utrrs/LICENSE  |   0
+ .../shaper-indic/indic/script-tamil/utrrs/README   |   0
+ .../shaper-indic/indic/script-tamil/utrrs/SOURCES  |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-CurrencySymbols.txt  |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Numerics.txt         |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-Symbols.txt          |   0
+ .../IndicFontFeatureCodepoint-TamilSymbol.txt      |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../shaper-indic/indic/script-telugu/misc/misc.txt |   0
+ .../shaper-indic/indic/script-telugu/utrrs/LICENSE |   0
+ .../shaper-indic/indic/script-telugu/utrrs/README  |   0
+ .../shaper-indic/indic/script-telugu/utrrs/SOURCES |   0
+ .../IndicFontFeatureCodepoint-AdditionalVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Consonants.txt       |   0
+ .../IndicFontFeatureCodepoint-DependentVowels.txt  |   0
+ .../codepoint/IndicFontFeatureCodepoint-Digits.txt |   0
+ ...IndicFontFeatureCodepoint-IndependentVowels.txt |   0
+ .../IndicFontFeatureCodepoint-Reserved.txt         |   0
+ .../IndicFontFeatureCodepoint-VariousSigns.txt     |   0
+ .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt  |   0
+ .../utrrs/gsub/IndicFontFeatureGSUB.txt            |   0
+ .../south-east-asian/script-javanese/misc.txt      |   0
+ .../south-east-asian/script-khmer/misc/misc.txt    |   0
+ .../script-khmer/misc/other-marks-invalid.txt      |   0
+ .../script-khmer/misc/other-marks.txt              |   0
+ .../shaper-myanmar/script-myanmar/misc/misc.txt    |   0
+ .../shaper-myanmar/script-myanmar/misc/otspec.txt  |   1 -
+ .../shaper-myanmar/script-myanmar/misc/utn11.txt   |   0
+ .../shaper-thai/script-lao/misc/sara-am.txt        |   0
+ .../shaper-thai/script-thai/misc/misc.txt          |   0
+ .../shaper-thai/script-thai/misc/phinthu.txt       |   0
+ .../shaper-thai/script-thai/misc/pua-shaping.txt   |   0
+ .../shaper-thai/script-thai/misc/sara-am.txt       |   0
+ .../script-tibetan/misc/contractions.txt           |   0
+ .../shaper-tibetan/script-tibetan/misc/misc.txt    |   0
+ .../shaper-use/script-batak/misc.txt               |   0
+ .../shaper-use/script-buginese/misc.txt            |  92
+ +++++++++----------
+ .../shaper-use/script-cham/misc.txt                |   0
+ .../shaper-use/script-kaithi/misc.txt              |   0
+ .../shaper-use/script-kharoshti/misc.txt           |   0
+ .../shaper-use/script-tai-tham/misc.txt            |   0
+ .../shaper-use/script-tai-tham/torture.txt         |   0
+ .../script-syriac/misc/abbreviation-mark.txt       |  11 ---
+ 420 files changed, 573 insertions(+), 590 deletions(-)
+
+commit 9a3ad307ea91794712531dfc688700c11a1ff263
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 21:35:21 2018 +0100
+
+    [test] Remove unused hb-diff-ngrams
+
+ test/shaping/Makefile.am      |  1 -
+ test/shaping/hb-diff-ngrams   |  5 -----
+ test/shaping/hb_test_tools.py | 26 --------------------------
+ 3 files changed, 32 deletions(-)
+
+commit b6b460024d29362914c72cc5f8fbaec215db5b16
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 21:33:38 2018 +0100
+
+    [test] Remove unused manifest stuff
+
+ test/shaping/Makefile.am        | 7 -------
+ test/shaping/hb-manifest-read   | 5 -----
+ test/shaping/hb-manifest-update | 5 -----
+ 3 files changed, 17 deletions(-)
+
+commit ebbee7c2475db789b622250addbf549695da2890
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 18:23:19 2018 +0100
+
+    [test] Move test files around
+
+ test/fuzzing/run-fuzzer-tests.py                   |  2 +-
+ test/shaping/Makefile.am                           | 82
+ +++++++++++-----------
+ .../tests/{ => misc}/arabic-fallback-shaping.tests |  0
+ .../tests/{ => misc}/arabic-feature-order.tests    |  0
+ .../tests/{ => misc}/arabic-like-joining.tests     |  0
+ .../tests/{ => misc}/arabic-mark-order.tests       |  0
+ test/shaping/tests/{ => misc}/arabic-stch.tests    |  0
+ .../tests/{ => misc}/automatic-fractions.tests     |  0
+ test/shaping/tests/{ => misc}/cluster.tests        |  0
+ test/shaping/tests/{ => misc}/color-fonts.tests    |  0
+ .../tests/{ => misc}/context-matching.tests        |  0
+ .../tests/{ => misc}/cursive-positioning.tests     |  0
+ .../tests/{ => misc}/default-ignorables.tests      |  0
+ .../shaping/tests/{ => misc}/emoji-flag-tags.tests |  0
+ .../tests/{ => misc}/fallback-positioning.tests    |  0
+ test/shaping/tests/{ => misc}/fuzzed.tests         |  0
+ test/shaping/tests/{ => misc}/hangul-jamo.tests    |  0
+ test/shaping/tests/{ => misc}/hyphens.tests        |  0
+ .../{ => misc}/indic-consonant-with-stacker.tests  |  0
+ test/shaping/tests/{ => misc}/indic-init.tests     |  0
+ .../{ => misc}/indic-joiner-candrabindu.tests      |  0
+ test/shaping/tests/{ => misc}/indic-joiners.tests  |  0
+ test/shaping/tests/{ => misc}/indic-old-spec.tests |  0
+ .../tests/{ => misc}/indic-pref-blocking.tests     |  0
+ .../tests/{ => misc}/indic-script-extensions.tests |  0
+ .../tests/{ => misc}/indic-special-cases.tests     |  0
+ test/shaping/tests/{ => misc}/indic-syllable.tests |  0
+ test/shaping/tests/{ => misc}/language-tags.tests  |  0
+ test/shaping/tests/{ => misc}/ligature-id.tests    |  0
+ .../shaping/tests/{ => misc}/mark-attachment.tests |  0
+ .../tests/{ => misc}/mark-filtering-sets.tests     |  0
+ .../{ => misc}/mongolian-variation-selector.tests  |  0
+ test/shaping/tests/{ => misc}/simple.tests         |  0
+ test/shaping/tests/{ => misc}/spaces.tests         |  0
+ .../tests/{ => misc}/tibetan-contractions-1.tests  |  0
+ .../tests/{ => misc}/tibetan-contractions-2.tests  |  0
+ test/shaping/tests/{ => misc}/tibetan-vowels.tests |  0
+ test/shaping/tests/{ => misc}/use-marchen.tests    |  0
+ test/shaping/tests/{ => misc}/use-syllable.tests   |  0
+ test/shaping/tests/{ => misc}/use.tests            |  0
+ .../shaping/tests/{ => misc}/variations-rvrn.tests |  0
+ test/shaping/tests/{ => misc}/vertical.tests       |  0
+ .../tests/{ => misc}/zero-width-marks.tests        |  0
+ 43 files changed, 42 insertions(+), 42 deletions(-)
+
+commit 748b989a1fa931b011d6a4e3db39dfdc632946b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 17:55:17 2018 +0100
+
+    [aat/morx] Implement NoncontextualSubtables
+
+    Also makes hb-ot-shape call morx for now instead of GSUB... Just
+    for testing.
+
+ src/hb-aat-layout-common-private.hh | 34 +++++++--------
+ src/hb-aat-layout-morx-table.hh     | 82
+ ++++++++++++++++++++++++++++++++++---
+ src/hb-aat-layout-private.hh        |  3 ++
+ src/hb-aat-layout.cc                | 13 +++++-
+ src/hb-ot-shape.cc                  |  6 +++
+ 5 files changed, 111 insertions(+), 27 deletions(-)
+
+commit 4cf3ab1d8192862f8d3c52fdcaec567735916116
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 16:32:58 2018 +0100
+
+    Minor
+
+ src/hb-ot-shape.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 470fe5b603b409bef136fdd4e9b33d2704dc77b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 15:48:51 2018 +0100
+
+    [aat] Implement Lookup table
+
+    Untested, but compiles.
+
+ src/hb-aat-layout-common-private.hh | 308
+ +++++++++++++++++++++++++++++++++++-
+ src/hb-aat-layout-morx-table.hh     |   9 +-
+ src/hb-aat-layout.cc                |  14 ++
+ src/hb-face.cc                      |   6 +-
+ src/hb-open-type-private.hh         |  16 +-
+ src/hb-ot-cbdt-table.hh             |   4 +-
+ src/hb-ot-cmap-table.hh             |   2 +-
+ src/hb-ot-glyf-table.hh             |   6 +-
+ src/hb-ot-hmtx-table.hh             |   8 +-
+ src/hb-ot-kern-table.hh             |   2 +-
+ src/hb-ot-layout.cc                 |   6 +-
+ src/hb-ot-post-table.hh             |   2 +-
+ src/hb-uniscribe.cc                 |   2 +-
+ 13 files changed, 355 insertions(+), 30 deletions(-)
+
+commit 4646a80a873fa164b9cf09128bc6b6fe2fc5cce2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jan 9 12:06:38 2018 +0100
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 7c7cb42d8125d7e598bfa70f93053cafe38b325a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 8 14:32:55 2018 +0000
+
+    [aat] Update previous commits for rebase on master
+
+ src/hb-aat-layout-common-private.hh | 14 +++++++-------
+ src/hb-aat-layout-morx-table.hh     | 28 ++++++++++++++--------------
+ src/hb-open-type-private.hh         |  5 -----
+ 3 files changed, 21 insertions(+), 26 deletions(-)
+
+commit a0175e75bc40b5496d7fd37afd434cb2000e5b9b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 17 16:55:54 2017 -0700
+
+    [aat] Start implementing common table formats
+
+ src/Makefile.sources                |   2 +
+ src/hb-aat-layout-common-private.hh | 134
+ ++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout-morx-table.hh     |   1 +
+ src/hb-aat-layout-private.hh        |  37 ++++++++++
+ src/hb-aat-layout.cc                |   1 +
+ 5 files changed, 175 insertions(+)
+
+commit c71b55a223d14f8bb7fa355efc586e824b7d4d8f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 14 17:24:36 2017 -0700
+
+    [aat] Start implementing Apple AAT morx table
+
+ src/Makefile.sources            |   2 +
+ src/hb-aat-layout-morx-table.hh | 275
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |  42 ++++++
+ src/hb-open-type-private.hh     |   5 +
+ src/hb-ot-layout-private.hh     |   5 +
+ src/hb-ot-layout.cc             |   2 +
+ 6 files changed, 331 insertions(+)
+
+commit 3c7aeb5c6437b26ad638ab993b724e28376d3ff8
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 9 01:39:42 2018 +0330
+
+    [cmake] Add autotools like feature testing (#683)
+
+ CMakeLists.txt | 22 ++++++++++++++++------
+ 1 file changed, 16 insertions(+), 6 deletions(-)
+
+commit 0473d95e276ae5df722bc7d371733d8202bdbc3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Jan 8 10:07:46 2018 +0000
+
+    [ft] Use FT_Done_MM_Var() if available
+
+ configure.ac | 1 +
+ src/hb-ft.cc | 4 ++++
+ 2 files changed, 5 insertions(+)
+
+commit 66d7beff96d622599e1ee8895f2aa84fe2299f1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 18:09:29 2018 +0000
+
+    [khmer] Relax!
+
+    Apparently we don't use OT_A either.
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit db0207baff358b20fbe9c3498275ba33f69caf87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 18:06:00 2018 +0000
+
+    [khmer] Drop another joiner
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 90affe831f08fabcb2dd5ac837c7b0cfbd14e554
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 18:04:56 2018 +0000
+
+    [khmer] Shuffle
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 65795e3ca246bf65b3cb53e3fe65eca312774e3e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 18:03:00 2018 +0000
+
+    [khmer] Simplify grammar some more
+
+    Numbers down (from 38):
+
+    KHMER: 299090 out of 299124 tests passed. 34 failed (0.0113665%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e13ee937310a7aadd83fd266dae382da40dce4f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 18:01:01 2018 +0000
+
+    [khmer] Clean
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a71c7eb2ca9f8ba90117e1a0c4ce890f0a1640f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:59:43 2018 +0000
+
+    [khmer] Limit number of joiners
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 574e42e1cf6679c8df065d6bb3e8d21bc82395c1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:57:39 2018 +0000
+
+    [khmer] Relax number of consonants / matras allowed
+
+    New numbers (down from 39):
+
+    KHMER: 299086 out of 299124 tests passed. 38 failed (0.0127038%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 80c870bcda2f421e80f5579e71fe17fe8db991b8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:52:24 2018 +0000
+
+    [khmer] Allow Independent Vowels where stacked consonants are allowed
+
+    New numbers (down from 44):
+
+    KHMER: 299085 out of 299124 tests passed. 39 failed (0.0130381%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 ++--
+ src/hb-ot-shape-complex-khmer.cc         | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 9bd486c480b8fd3125ef6b6cc0442a566f669cb8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:47:35 2018 +0000
+
+    [khmer] Drop some more joiners
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5278265853c36400ffc284fd517cc7b7c42ed0e7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:46:49 2018 +0000
+
+    [khmer] Drop some more
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit efefd87f3354d0ae6f599ea30672cb0b74dfcd80
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:45:48 2018 +0000
+
+    [khmer] Drop some more grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 82e6bf8e0c27d2fd16a908eed0c73e95b1a2c0f5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:44:18 2018 +0000
+
+    [khmer] Drop some more from grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 957e8ea8a9f981775ecde7dd1e2bf4023cf79dba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:43:31 2018 +0000
+
+    [khmer] Drop final_halant_group
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit bbfdbbdc5eca96e8c527147e5a78cd185b9f243d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:34:26 2018 +0000
+
+    Minor
+
+ src/hb-ot-shape-complex-indic-machine.rl | 1 -
+ src/hb-ot-shape-complex-khmer-machine.rl | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit f6df2515210e9d828fc40173696b185efa5083e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:27:48 2018 +0000
+
+    [indic] Remove unused OT_VD category
+
+ src/hb-ot-shape-complex-indic-machine.rl | 3 +--
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ src/hb-ot-shape-complex-indic.cc         | 2 +-
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+commit e6618f3bdf79a51f6fb270b468b653dc9cea5b57
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:21:55 2018 +0000
+
+    [khmer] Shave off some more from the grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl |  9 ++-------
+ src/hb-ot-shape-complex-khmer.cc         | 34
+ ++------------------------------
+ 2 files changed, 4 insertions(+), 39 deletions(-)
+
+commit 014494d5c0469fe6b3112db3fdb3f2f262673ba1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:17:02 2018 +0000
+
+    [khmer] Remove unused symbol clusters
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit bbac984b9390a66c6ae5ee931b278b607f2f2a50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:15:31 2018 +0000
+
+    Minor
+
+ src/hb-ot-shape-complex-indic-machine.rl | 1 -
+ src/hb-ot-shape-complex-khmer-machine.rl | 1 -
+ 2 files changed, 2 deletions(-)
+
+commit 185b68946ad67443e8725e77d724128802de5572
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:14:27 2018 +0000
+
+    [khmer] Remove medials from grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit c265dffdf6c4930e271292226d38a8e515b6b0f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:06:29 2018 +0000
+
+    [khmer] Better fix for dangling final Coeng
+
+    This is how 1471cfee3bb2734dc44c58471362851ad27e8bd8 should have
+    been done.
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e3fdf1fc2f399e6b79ea022501526a422d372e64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:05:53 2018 +0000
+
+    [khmer] Remove reph/repha support from grammar
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 12 ++++--------
+ 1 file changed, 4 insertions(+), 8 deletions(-)
+
+commit 0d3a274de1ff8e6a21c7c9857730e2eda402e310
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 17:01:37 2018 +0000
+
+    [khmer] Remove forced_rakar from grammar
+
+    Used by Sinhala only.
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 3 +--
+ src/hb-ot-shape-complex-khmer.cc         | 2 +-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 1471cfee3bb2734dc44c58471362851ad27e8bd8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:34:20 2018 +0000
+
+    [khmer] Allow a dangling final Coeng after matras
+
+    Uniscribe seems to allow that.  New numbers:
+
+    KHMER: 299080 out of 299124 tests passed. 44 failed (0.0147096%)
+
+ src/hb-ot-shape-complex-khmer-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9eaf077ded0306d492de96b223133431f1a6d42b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:28:00 2018 +0000
+
+    [khmer] Remove some more unused code
+
+ src/hb-ot-shape-complex-khmer.cc | 49
+ ++--------------------------------------
+ 1 file changed, 2 insertions(+), 47 deletions(-)
+
+commit bfad6ab897a38aedc82de694ee1a17132f90b25e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:13:09 2018 +0000
+
+    [khmer] Remove features not used by Khmer
+
+ src/hb-ot-shape-complex-khmer.cc | 60
+ ++++------------------------------------
+ 1 file changed, 5 insertions(+), 55 deletions(-)
+
+commit 92a99ce084b19dff32d434de446144f0c4796803
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:08:44 2018 +0000
+
+    [khmer] Remove rphf feature
+
+ src/hb-ot-shape-complex-khmer.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 238b90e77c12674edfd2e03160b8ba2a0298b79d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:06:53 2018 +0000
+
+    [khmer] Remove non-Khmer matra positioning code
+
+ src/hb-ot-shape-complex-khmer.cc | 76
+ +++++++---------------------------------
+ 1 file changed, 12 insertions(+), 64 deletions(-)
+
+commit f8553c898a414298403c335f8d2ed6c588a1189f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:04:02 2018 +0000
+
+    [khmer] Remove indic_config_t
+
+ src/hb-ot-shape-complex-khmer.cc | 28 ----------------------------
+ 1 file changed, 28 deletions(-)
+
+commit a119a8bce57abc440ae4c8b9a1342d428a7c9b6a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:02:27 2018 +0000
+
+    [khmer] Remove indic_config->reph_mode
+
+ src/hb-ot-shape-complex-khmer.cc | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+commit c135324af107d3e33420cd0dca4d5bb12fd3f4a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 16:01:17 2018 +0000
+
+    [khmer] Remove indic_config->reph_pos
+
+ src/hb-ot-shape-complex-khmer.cc | 333
+ ++-------------------------------------
+ 1 file changed, 10 insertions(+), 323 deletions(-)
+
+commit ffcd6c7efd21bf89b41ddbf148b05672a42ecadd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:50:05 2018 +0000
+
+    [khmer] Remove indic_config->base_pos
+
+ src/hb-ot-shape-complex-khmer.cc | 229
+ ++-------------------------------------
+ 1 file changed, 7 insertions(+), 222 deletions(-)
+
+commit 0c91638d48d6fb86d1e30fb94c15785707395b42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:45:30 2018 +0000
+
+    [khmer] Remove other scripts
+
+ src/hb-ot-shape-complex-khmer.cc | 131
+ ++++++++++-----------------------------
+ 1 file changed, 34 insertions(+), 97 deletions(-)
+
+commit 4c0199c573f79be5f40e7d4f8433ef6a1c9c24b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:43:48 2018 +0000
+
+    [khmer] Remove indic_config->script
+
+ src/hb-ot-shape-complex-khmer.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 9b135d9524e51cc1e1f35479e015c746ccd8ca5f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:43:11 2018 +0000
+
+    [khmer] Remove indic_config->virama
+
+ src/hb-ot-shape-complex-khmer.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 7eb3ac29d388432c311981b20b1aa75f47249bfc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:41:31 2018 +0000
+
+    [khmer] Remove indic_config->has_old_spec
+
+ src/hb-ot-shape-complex-khmer.cc | 157
+ ++++++---------------------------------
+ 1 file changed, 21 insertions(+), 136 deletions(-)
+
+commit 961ebf85f1e7d417e056c3927ee73857f6f4cde6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:36:53 2018 +0000
+
+    [khmer] Remove Halant from Khmer shaper
+
+ src/hb-ot-shape-complex-indic-private.hh |  1 -
+ src/hb-ot-shape-complex-khmer-machine.rl |  7 +++----
+ src/hb-ot-shape-complex-khmer.cc         | 32
+ ++++++++++++++++----------------
+ 3 files changed, 19 insertions(+), 21 deletions(-)
+
+commit 9761f9d78214323b9ad58dd0b8ba41851c9e2d54
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:33:11 2018 +0000
+
+    [indic] Remove more Khmer-specific stuff from Indic shaper
+
+    No numbers changed.
+
+ src/hb-ot-shape-complex-indic-machine.rl |  8 ++---
+ src/hb-ot-shape-complex-indic.cc         | 57
+ ++++++++++++--------------------
+ 2 files changed, 25 insertions(+), 40 deletions(-)
+
+commit 075895364435ee88936696bcb5457283c4bb1a29
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 15:08:28 2018 +0000
+
+    [indic] Remove main Khmer stuff
+
+ src/hb-ot-shape-complex-indic.cc | 73
+ ++--------------------------------------
+ 1 file changed, 2 insertions(+), 71 deletions(-)
+
+commit dcf4d95fea45e19fbb3b39f0211b2aa96a907473
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 14:54:31 2018 +0000
+
+    [khmer] Split off Khmer shaper from Indic
+
+    Towards fixing https://github.com/harfbuzz/harfbuzz/issues/667
+    The Khmer spec is different enough from other Indic ones to require
+    its own grammar.
+
+    No change in functionality.  Test numbers are:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366355 out of 366457 tests passed. 102 failed (0.0278341%)
+    GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%)
+    KANNADA: 951300 out of 951913 tests passed. 613 failed (0.0643966%)
+    KHMER: 299071 out of 299124 tests passed. 53 failed (0.0177184%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/Makefile.sources                     |    3 +
+ src/hb-ot-shape-complex-khmer-machine.rl |  130 +++
+ src/hb-ot-shape-complex-khmer.cc         | 1867
+ ++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-private.hh       |    5 +-
+ 4 files changed, 2003 insertions(+), 2 deletions(-)
+
+commit 1e05ea79d057fbae5f680589d4ee7d3c6a971689
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 14:01:37 2018 +0000
+
+    [ot] Short-circuit base instance advance variation
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 54b2b93722c9f067199cd7145dfd065d5b6b2f0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 13:20:21 2018 +0000
+
+    [ot] Fix VariationStore evaluation algorithm
+
+    Ouch!  Missing coords should still be evaluated as coord=0, which
+    most of the time results in a factor of 0.  We were skipping these,
+    which was equivalent to a factor of 1.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/652
+
+ src/hb-ot-layout-common-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit a3afdd1e080bb181ddec126b6233d52438882a13
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 13:17:02 2018 +0000
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cb43bdbc2f3a16061c33596b15b29eb7f9713871
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 13:06:25 2018 +0000
+
+    [ft] If there's no variations set, don't set them on hb-font
+
+ src/hb-ft.cc | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit ed2f458b143327d07e67fdb976ead9d7ff2863f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 12:55:39 2018 +0000
+
+    Add test font for previous commit
+
+ .../sha1sum/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf | Bin 0 ->
+ 4816 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 127bcc6ece4da64e807f652dd84a17c6a8c5e300
+Merge: 72bec1cd 8c0d1916
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 12:50:22 2018 +0000
+
+    Merge remote-tracking branch 'fdo/master'
+
+commit 8c0d1916a41f0fb32340ce5257de780acf598353
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jan 5 12:46:12 2018 +0000
+
+    Improve CGJ skipping logic
+
+    Previously we made CGJ unskippable.  Now, if CGJ did NOT prevent
+    any reordering, allow skipping over it.  To make this work we
+    had to make changes to the Arabic mark reordering algorithm
+    implementation to renumber moved MCM marks.  See comments.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/554
+
+ src/hb-buffer-private.hh                   |  1 +
+ src/hb-ot-layout-private.hh                | 11 ++++++++-
+ src/hb-ot-shape-complex-arabic.cc          | 37
+ ++++++++++++++++++++++--------
+ src/hb-ot-shape-normalize.cc               | 30 +++++++++++++-----------
+ test/shaping/tests/arabic-mark-order.tests |  4 ++++
+ 5 files changed, 58 insertions(+), 25 deletions(-)
+
+commit 72bec1cd09f919f3826345db4832752ec96ff5c5
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jan 5 12:42:20 2018 +0330
+
+    Improve tests (#679)
+
+ .circleci/config.yml        |  2 +-
+ CMakeLists.txt              | 52
+ +++++++++++++++++++++++++++++++++++----------
+ autogen.sh                  |  6 ++++--
+ src/Makefile.am             |  3 +--
+ src/check-defs.sh           |  2 +-
+ src/check-header-guards.sh  |  2 +-
+ src/check-libstdc++.sh      |  2 +-
+ src/check-static-inits.sh   |  2 +-
+ src/check-symbols.sh        |  2 +-
+ test/fuzzing/CMakeLists.txt | 11 +++++++++-
+ 10 files changed, 62 insertions(+), 22 deletions(-)
+
+commit 293e443529d0621b9f94ea15d1425104394f6b9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 4 16:06:25 2018 +0000
+
+    Minor
+
+ src/check-c-linkage-decls.sh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 8a0952db7e521320cd4d8b67b287f7d33c21b6e0
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Thu Jan 4 18:40:10 2018 +0700
+
+    atomics: Favor compiler primitives over macOS APIs. (#676)
+
+    In macOS 10.12, the `OSMemoryBarrier` and related APIs were deprecated
+    in favor of using `std::atomic`. On the way to supporting
+    `std::atomic`,
+    we can favor using the "Intel primitives" which are also available on
+    macOS.
+
+ src/hb-atomic-private.hh | 46
+ +++++++++++++++++++++++-----------------------
+ 1 file changed, 23 insertions(+), 23 deletions(-)
+
+commit 4f80078eb035054db0f6e33cf4f7345c6c85cb12
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Thu Jan 4 18:37:35 2018 +0700
+
+    [cmake] Colorize output when using cmake + ninja. (#674)
+
+    Due to how ninja runs clang and gcc, it doesn't colorize the output
+    like make does. This forces color output in this situation.
+
+ CMakeLists.txt | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 5ed26fc5bdfdab0ff41a8861b54395c0bbbad248
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Jan 4 10:11:34 2018 +0330
+
+    [cmake] Run src/ tests (#675)
+
+ .circleci/config.yml      |  9 ++++-----
+ CMakeLists.txt            | 35 ++++++++++++++++++++++++++++++++---
+ src/Makefile.am           |  1 +
+ src/check-defs.sh         |  3 ++-
+ src/check-libstdc++.sh    |  3 ++-
+ src/check-static-inits.sh |  3 ++-
+ src/check-symbols.sh      |  3 ++-
+ 7 files changed, 45 insertions(+), 12 deletions(-)
+
+commit f8daeef4c4451084a781db3a8a04807c0f0051ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 3 14:27:34 2018 +0000
+
+    [use] Simplify more
+
+ src/gen-use-table.py                 | 11 +------
+ src/hb-ot-shape-complex-use-table.cc | 62
+ +++++++++++++++++++++---------------
+ 2 files changed, 38 insertions(+), 35 deletions(-)
+
+commit 877d15e73c24159b26bb7cc6d2f62045d445d0fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 3 14:24:44 2018 +0000
+
+    [use] Simplify
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/661
+
+ src/gen-use-table.py                 | 2 +-
+ src/hb-ot-shape-complex-use-table.cc | 3 +--
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 308f419215716460479fbde482d66d1687176102
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 3 14:22:07 2018 +0000
+
+    [use] Fix Brahmi Number Joiner 1107F
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/660
+
+ src/gen-indic-table.py                 | 6 +++---
+ src/gen-use-table.py                   | 6 +++---
+ src/hb-ot-shape-complex-indic-table.cc | 4 ++--
+ src/hb-ot-shape-complex-use-table.cc   | 6 +++---
+ 4 files changed, 11 insertions(+), 11 deletions(-)
+
+commit 7b837e20d2b4b6cd7be0b181ac5cdfeb467bd146
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 3 12:46:29 2018 +0000
+
+    [util] Add TODO item
+
+ util/options.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 70807ad274be39d58a5b43e12d4585325cb314c4
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Jan 2 23:52:12 2018 +0330
+
+    Fix make check issue on out-of-tree builds and test it (#672)
+
+ .circleci/config.yml             |  8 ++++----
+ test/fuzzing/Makefile.am         | 18 +-----------------
+ test/fuzzing/run-fuzzer-tests.py |  8 +++++---
+ test/shaping/run-tests.py        |  5 +++++
+ 4 files changed, 15 insertions(+), 24 deletions(-)
+
+commit 85ec6d34439194a88c7dfdd8303369311e08e031
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 3 01:23:23 2018 +0700
+
+    Fix typos.
+
+ docs/usermanual-clusters.xml         | 4 ++--
+ docs/usermanual-install-harfbuzz.xml | 2 +-
+ src/hb-font.h                        | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 4f6754ac0190f04b5f27306b087827b8f2e13046
+Author: Bruce Mitchener <bruce.mitchener@gmail.com>
+Date:   Wed Jan 3 00:15:18 2018 +0700
+
+    Improve Markdown usage in BUILD.md.
+
+ BUILD.md | 36 +++++++++++++++++++++++-------------
+ 1 file changed, 23 insertions(+), 13 deletions(-)
+
+commit 3db1d34264d9405c7356668aa3c8ed3ab103da3c
+Author: Romain Ouabdelkader <rouabdelkader@gopro.com>
+Date:   Thu Dec 21 14:39:34 2017 +0100
+
+    link with CoreFoundation when using CoreText
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4e3cf91af29ff654eca91e43c0af1c1a7171b9fa
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jan 1 11:17:51 2018 +0330
+
+    [cmake] Run rest of the tests on Windows (#668)
+
+ appveyor.yml                     |  6 +++---
+ test/CMakeLists.txt              |  5 +----
+ test/fuzzing/CMakeLists.txt      | 12 ++++++------
+ test/fuzzing/Makefile.am         |  5 +----
+ test/fuzzing/run-fuzzer-tests.py | 12 +++++++++---
+ test/shaping/CMakeLists.txt      |  9 ++++-----
+ test/shaping/run-tests.py        | 10 +++++++++-
+ 7 files changed, 33 insertions(+), 26 deletions(-)
+
+commit 2dbdeb14214487acd0ff011386c49263ce800813
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Dec 29 23:13:29 2017 +0330
+
+    [cmake] Run fuzzing and shaping tests (#666)
+
+ .circleci/config.yml             |  2 +-
+ CMakeLists.txt                   | 59
+ ++++++++++++++++++++++++----------------
+ appveyor.yml                     |  4 +--
+ test/CMakeLists.txt              |  5 ++++
+ test/api/CMakeLists.txt          | 48 +++++++++++++-------------------
+ test/fuzzing/CMakeLists.txt      |  9 ++++++
+ test/fuzzing/Makefile.am         | 18 ++++++++++++
+ test/fuzzing/run-fuzzer-tests.py | 28 +++++++++++++++++++
+ test/shaping/CMakeLists.txt      | 11 ++++++++
+ test/shaping/Makefile.am         |  3 +-
+ test/shaping/run-tests.py        |  3 +-
+ 11 files changed, 132 insertions(+), 58 deletions(-)
+
+commit 24b30faa2a285c6e4e46a18c346def2183fc2793
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Dec 25 22:01:28 2017 +0330
+
+    [cmake] Use GNUInstallDirs values (#665)
+
+ CMakeLists.txt | 170
+ ++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 85 insertions(+), 85 deletions(-)
+
+commit 7d397c5d5ca684fae824a61dabf5bc422d0a516b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 24 17:53:32 2017 -0500
+
+    Add Coverity badge
+
+ README | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 50163976d2a5fb34e0b4c011408d581b33aaa255
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Dec 25 01:55:48 2017 +0330
+
+    [cmake] Enable cmake tests on distribution and test it (#664)
+
+ .circleci/config.yml | 3 ++-
+ test/Makefile.am     | 6 ++++++
+ test/api/Makefile.am | 1 +
+ 3 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 7bfdf1a94192dd83ab55202d259703f36ed060e5
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Nov 22 16:32:52 2017 -0500
+
+    Forbid Batak killers after vowel signs
+
+ src/gen-use-table.py                                     |   3 +++
+ src/hb-ot-shape-complex-use-table.cc                     |   2 +-
+ .../sha1sum/59a585a63b3df608fbeef00956c8c108deec7de6.ttf | Bin 0 ->
+ 1164 bytes
+ test/shaping/tests/use-syllable.tests                    |   1 +
+ 4 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 9890782736b9ce708c1fedd1cbb3db45cfef4c69
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Dec 25 01:32:46 2017 +0330
+
+    [ci] Add -Wno-attributes to djgpp, add alpine, format (#663)
+
+ .circleci/config.yml | 40 ++++++++++++++++++++++++++++++----------
+ 1 file changed, 30 insertions(+), 10 deletions(-)
+
+commit 72ecaae0ad4c9f1685f7d524990e92a26fcd5611
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 24 16:05:07 2017 -0500
+
+    [use] Allow ZWJ before/after Halant
+
+    https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729
+
+ src/hb-ot-shape-complex-use-machine.rl | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit bc92245b681098f0bfa712217851a5ba3dabeaf3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 20 13:19:33 2017 -0500
+
+    Minor
+
+ src/main.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 81dfc29d2dbc755301e702ea5427829d02abc693
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu Dec 21 20:15:37 2017 +0330
+
+    [ci] Add a DOS/djgpp compiler (#659)
+
+ .circleci/config.yml | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 007a2a4317227b8fb4c764c590203c85fc3da5fd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 20 12:09:00 2017 -0500
+
+    1.7.4
+
+ NEWS         | 7 +++++++
+ configure.ac | 2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+commit a9432bde7e61894056a42ea24d56fd7fd908a1ce
+Author: Volker H. Simonis <volker.simonis@gmail.com>
+Date:   Tue Dec 19 11:33:25 2017 +0100
+
+    HarfBuzz 1.7.1 and later don't compile on AIX with xlC (#655)
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2fe5f885b6f66f2665292b93e07baaae0aa46da8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 19 14:48:26 2017 -0500
+
+    [set] Handle nil set in add_range() / add_sorted_array()
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/657
+
+ src/hb-set-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit b5bbb791d32467b91caf6f1bf7ccee7cb2ca8c52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 18 09:18:51 2017 -0500
+
+    1.7.3
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 1245395a60ab6b04fc4653c448a97bb6ffee672c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Dec 17 12:32:33 2017 -0500
+
+    [coretext] In hb_coretext_font_create() set ptem
+
+    Otherwise setting the CTFont was ineffective as it would have been
+    recreated anyway unless font size was set to 18 CSS points.
+
+ src/hb-coretext.cc | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit 493a005d9527b6075f3c1ca4b41c22d7805f975c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 11:49:39 2017 -0500
+
+    [set] In add_sorted_array(), bail if data is not sorted
+
+ src/hb-set-private.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit a7bd6d7a4c53ff61d7d8286a594aaa0a0e15b1a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 11:11:18 2017 -0500
+
+    [collect_glyphs] Bail if input data looks like garbage
+
+    Specificaly, when a range or sorted array has unexpected order,
+    we take that as
+    font data being garbage and bail out.  This fixes significant slowdown
+    on a bad
+    version of Chandas font which has a 600KB GPOS with garbage inside.
+
+    Later on, I like to add a maximum-work counter for collect_glyphs
+    to protect
+    against malicious fonts as well.
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=794896
+
+ src/hb-ot-layout-common-private.hh | 14 +++++++-------
+ src/hb-set-private.hh              |  4 ++--
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 1ce7d6e215ef9d5386010bcdbbca79ef01811596
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 11:36:16 2017 -0500
+
+    [set] Optimize add_array() / add_sorted_array()
+
+    Does page lookup as needed.
+
+ src/hb-set-private.hh | 54
+ ++++++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 38 insertions(+), 16 deletions(-)
+
+commit 71e6adf1e2d65eb905a0ba247672fe36169955ef
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 11:07:37 2017 -0500
+
+    [collect_glyphs] handle ClassDef better
+
+ src/hb-ot-layout-common-private.hh   | 63
+ ++++++++++++++++++++++++++++++------
+ src/hb-ot-layout-gdef-table.hh       |  2 +-
+ src/hb-ot-layout-gpos-table.hh       |  5 +--
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ 4 files changed, 56 insertions(+), 16 deletions(-)
+
+commit 87cc5a65cb4b98a3a857b5846085ef0814b392a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 06:18:07 2017 -0800
+
+    [collect_glyphs] In PairPosFornat2 do not collect classDef1
+
+    The coverage already covered that.
+
+ src/hb-ot-layout-gpos-table.hh | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+commit 81f27df4d9db1bfc1dd04593cbd121397b86e9a6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 16 06:12:06 2017 -0800
+
+    More work towards improving collect_glyphs() against bad input
+
+    The three "XXXXX"'s should be switched to false.  Doing that
+    separately for ease
+    of bisecting...
+
+ src/hb-ot-layout-common-private.hh |  7 +++----
+ src/hb-ot-layout-gpos-table.hh     | 25 ++++++++++---------------
+ src/hb-ot-layout-gsub-table.hh     | 35
+ +++++++++++++----------------------
+ src/hb-set-digest-private.hh       |  6 ++++--
+ src/hb-set-private.hh              | 36
+ ++++++++++++++++++------------------
+ 5 files changed, 48 insertions(+), 61 deletions(-)
+
+commit 5d02572034e3dafbe87000fd0aa34b858bd95075
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 14 19:33:55 2017 -0800
+
+    [set] Add add_sorted_array()
+
+    Not optimized to use sortedness yet.  Also start putting in place
+    infra
+    to faster reject bad data.
+
+    A version of Chandas.ttf found on some Chrome bots has 660kb of GPOS,
+    mostly junk.  That is causing 48 million of set->add() calls in
+    collect_glyphs(), which is insane.
+
+    In the upcoming commits, I'll be speeding that up by optimizing
+    add_sorted_array(), while also reducing work by rejecting out-of-sort
+    arrays quickly and propagate the rejection.
+
+    Part of https://bugs.chromium.org/p/chromium/issues/detail?id=794896
+
+ src/hb-ot-layout-common-private.hh   | 51
+ +++++++++++++++++++++++-------------
+ src/hb-ot-layout-gdef-table.hh       |  2 +-
+ src/hb-ot-layout-gpos-table.hh       | 10 +++----
+ src/hb-ot-layout-gsubgpos-private.hh |  2 +-
+ src/hb-set-digest-private.hh         | 31 ++++++++++++++++++----
+ src/hb-set-private.hh                | 21 +++++++++++++--
+ 6 files changed, 84 insertions(+), 33 deletions(-)
+
+commit 9d6511a7343ba150e8072e5fe91732db54a92309
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 14 19:04:55 2017 -0800
+
+    [set] Reduce number of preallocated pages from 8 to 1
+
+    Now that pagesize is 8192, this feels better.
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ae2e2b068e1ab68d1f814165cb86fa38deef1f5b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 14 18:15:14 2017 -0800
+
+    Fix partial tracing debug builds
+
+ src/hb-debug.hh | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit 9daa88cd790b80a8bc7eaae2e7eec6f2f9fc60cf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 14 13:37:48 2017 -0800
+
+    Minor
+
+ src/hb-set-private.hh | 11 +++++++++++
+ src/hb-set.cc         |  6 ++----
+ 2 files changed, 13 insertions(+), 4 deletions(-)
+
+commit f424a342233ae32bbfabbdeadf59c82420b0880b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Dec 14 13:30:38 2017 -0800
+
+    [set] Change pagesize from 512 bits to 8192 bits
+
+    Fixes perf regression on some heavy fonts in Chrome's FT+HB
+    interaction.
+
+    See:
+    https://bugs.chromium.org/p/chromium/issues/detail?id=782220
+
+    More work to be done:
+    https://bugs.chromium.org/p/chromium/issues/detail?id=794896
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0fe62c1f333200523e10663f47a58b82e3f22154
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Dec 13 13:12:20 2017 -0800
+
+    [set] Add add_array()
+
+    To be used to optimize adding a whole bunch of (sorted) items at
+    the same time,
+    as in CoverageFormat1.
+
+ src/hb-ot-layout-common-private.hh |  4 +---
+ src/hb-set-digest-private.hh       | 12 ++++++++++++
+ src/hb-set-private.hh              |  6 ++++++
+ 3 files changed, 19 insertions(+), 3 deletions(-)
+
+commit 20e69c950d431391f92335f8845e5d4291aca8f3
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Dec 7 12:24:12 2017 +0330
+
+    [test] print commented line, like the original script (#649)
+
+ test/shaping/run-tests.py | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 71ad2777c52aeb0842038881899499a49cb895f2
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Dec 7 11:35:36 2017 +0330
+
+    [ci] Add an after distribution test runner (#648)
+
+ .circleci/config.yml | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 5f061d27d5289c7608a6579dca668b1f5be7f4e8
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Dec 7 11:22:55 2017 +0330
+
+    Rewrite run-tests in python (#647)
+
+ test/shaping/Makefile.am  |   4 +-
+ test/shaping/run-tests.py | 115
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ test/shaping/run-tests.sh |  65 --------------------------
+ 3 files changed, 117 insertions(+), 67 deletions(-)
+
+commit 3ce6c7bd96296a44950110e84ade76c7c1df06e4
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 6 21:08:20 2017 +0200
+
+    [ci] Sort out Travis configuration
+
+    Use a matrix to avoid a gazillion if's.
+
+ .ci/deploy-docs.sh   |  2 ++
+ .ci/run-coveralls.sh | 14 +++++++++++
+ .travis.yml          | 69
+ ++++++++++++++++++++++++++++++++--------------------
+ 3 files changed, 58 insertions(+), 27 deletions(-)
+
+commit 5a6d2b986a02fc47fa9dcbb330e6949af8e375ff
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Dec 6 18:27:27 2017 +0330
+
+    [ci] minor improvements (#644)
+
+ .circleci/config.yml | 3 +++
+ appveyor.yml         | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 840a32e3f3ed0a85bfa84e69efaeb504d92d1aa7
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 6 00:49:25 2017 +0200
+
+    Run cmake tests on CI builds
+
+ .circleci/config.yml | 6 ++++--
+ appveyor.yml         | 2 +-
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit c8609551485cfca6f9629c565b9dd5f02aa14f3e
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Dec 6 00:43:28 2017 +0200
+
+    Add API tests to cmake build
+
+ CMakeLists.txt          |  5 +++++
+ test/CMakeLists.txt     |  1 +
+ test/api/CMakeLists.txt | 39 +++++++++++++++++++++++++++++++++++++++
+ test/api/hb-test.h      |  2 ++
+ test/api/test-c.c       |  2 ++
+ 5 files changed, 49 insertions(+)
+
+commit f19126dd35b03f6e05a67cbc406b3ce4a3e35022
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Tue Dec 5 22:52:54 2017 +0200
+
+    We are already inside “if HAVE_GLIB” check
+
+ test/api/Makefile.am | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 7af48a3f37abac0aa1a1ad79c98399a9a71bd903
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Dec 6 14:22:19 2017 +0330
+
+    [ci] Don't cache msys2 folder
+
+ appveyor.yml | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit b6f505c7164e302d2990cf056b73e918a641e976
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Dec 6 13:51:04 2017 +0330
+
+    [ci] Enable glib and freetype on appveyor cmake (#643)
+
+ appveyor.yml | 29 +++++++++++++++++++++--------
+ 1 file changed, 21 insertions(+), 8 deletions(-)
+
+commit 03b7a221f701a9b003890878e730ad175c3fdd86
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 5 13:12:11 2017 -0800
+
+    [debug] Use %p to print pointers
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/640
+
+ src/hb-debug.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 353cc6fbf09d16aad18b48a3a46ec7dd348aedc6
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Dec 6 00:04:30 2017 +0330
+
+    [ci] Fix appveyor badge
+
+ README | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0dc03ef75724376927a7d63b991508c2901fcdf9
+Author: Nathan Willis <nwillis@glyphography.com>
+Date:   Tue Dec 5 17:43:09 2017 +0000
+
+    Indic: always hyphenate pre-base-reordering, for clarity.
+
+ src/hb-ot-shape-complex-indic.cc | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit be59f3cbf4e3269ea05d5a707cdae04a32e097ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Dec 5 09:01:28 2017 -0800
+
+    Silence unused-variables warning on MSVC
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/635
+
+ src/hb-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 80c1b01f054c5d65ca96a568aaf1c28ffe97215b
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Dec 5 08:28:42 2017 -0500
+
+    Allow digits in language system tags
+
+ src/hb-ot-tag.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 85bb89a88bdfae02fb7c27c7b994f4f22723442a
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Dec 4 15:15:27 2017 -0500
+
+    Fix string matching in parse_bool
+
+ src/hb-common.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0fd89dc61c6a26253aa9bb85e8dfd9faded11440
+Author: Olivier Blin <olivier.blin@softathome.com>
+Date:   Mon Dec 4 18:58:41 2017 +0100
+
+    [hb-ft] Fix build when Multiple Master font support is disabled
+    in freetype
+
+    FT_Set_Var_Blend_Coordinates() is not available when "Multiple Master
+    font interface" is disabled in freetype's modules.cfg
+
+ configure.ac         | 1 +
+ src/hb-ft.cc         | 2 ++
+ util/helper-cairo.cc | 2 ++
+ 3 files changed, 5 insertions(+)
+
+commit 843f7f70355f62511a5d8be3b905c853bf362629
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Dec 4 08:52:39 2017 -0800
+
+    1.7.2
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit eeb26d21d493183f54704487754d53a127b017ae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 2 15:22:04 2017 -0800
+
+    [set] Actually commit fixes mentioned in previous commit!
+
+ src/hb-set-private.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 20b4672754baf9751642bb37344a6ff4e224dc37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 2 15:14:26 2017 -0800
+
+    [set] Fix recent changes
+
+    Ouch!
+
+    Add tests.
+
+ test/api/test-set.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 0744149cdabd85d632822ff810d3994787bca4b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Dec 2 15:06:15 2017 -0800
+
+    [set] Protect against bad input in hb_set_add_range()
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d5e29303db47a1868fa9b044ca61e146f882179c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 28 23:11:34 2017 -0800
+
+    [coretext] Add hb_coretext_font_create()
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/628
+
+    New API:
+    hb_coretext_font_create()
+
+ src/hb-coretext.cc | 55
+ ++++++++++++++++++++++++++++++++++--------------------
+ src/hb-coretext.h  |  3 +++
+ 2 files changed, 38 insertions(+), 20 deletions(-)
+
+commit 9d0194b3a8e0c562249337fa0cf4d72e89334263
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 1 13:56:06 2017 -0800
+
+    [set] Optimize add_range() some more
+
+    It's as good as it gets, and seems to be on par with previous set
+    implementation
+    in my benchmark.
+
+    Would be great if someone can double-check my bitops.
+
+ src/hb-set-private.hh | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit 438c325a256f040c6be840924ed42dcbcd8a049a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 1 13:34:14 2017 -0800
+
+    [set] Optimize add_range()
+
+    With new set implementation, this became really costy.  Optimize it.
+    There's more to be done, but this shaves off most of the fat.
+
+    Part of fixing
+    https://bugs.chromium.org/p/chromium/issues/detail?id=782220
+
+ src/hb-set-private.hh | 56
+ +++++++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 41 insertions(+), 15 deletions(-)
+
+commit be9e307a889e04d198042ad39949d3971232ab26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Dec 1 12:36:26 2017 -0800
+
+    [ot] Ensure layout in hb_ot_layout_table_get_lookup_count()
+
+ src/hb-ot-layout.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d9066afd6bc260d2f2ad5cd5b3e8b196e944d3d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 29 16:18:18 2017 -0800
+
+    Add another test for previous commit
+
+    From https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4273
+
+ .../sha1sum/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf  | Bin 0 ->
+ 204 bytes
+ test/shaping/tests/fuzzed.tests                           |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 16fba5b2158a0e093e6df32637eba5058942e299
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 29 16:08:11 2017 -0800
+
+    [ot] Fix Extension type recurse to disallow recursing to another
+    Extension
+
+    Particularly hazardous if the second layer mixes forward and backward
+    lookups.
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4336
+
+ src/hb-ot-layout-gsub-table.hh                           |   6 ++++--
+ .../sha1sum/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf | Bin 0 ->
+ 4545 bytes
+ .../sha1sum/ef2511f215aa3ca847cbfffbf861793b42170875.ttf | Bin 0 ->
+ 1152 bytes
+ test/shaping/tests/fuzzed.tests                          |   2 ++
+ 4 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 7ab49de987b856312d7ad1d02639f7306aa0ad2f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 29 14:20:09 2017 -0800
+
+    Try fixing Mac build with 10.12
+
+    Related
+    https://github.com/harfbuzz/harfbuzz/issues/345
+    https://github.com/harfbuzz/harfbuzz/pull/629
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d672bcf9d72bb473f5f53089c8af595c4047bc99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 28 22:20:57 2017 -0800
+
+    Minor
+
+ docs/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 23ade70783a17ed6822d13e7a910544de2ef181f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 21 16:36:07 2017 -0800
+
+    [doc] Optimize HarfBuzz.png; add HarfBuzz.svg
+
+    SVG is unused. Just keeping it here.
+
+ docs/HarfBuzz.png | Bin 14203 -> 8814 bytes
+ docs/HarfBuzz.svg | 277
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 277 insertions(+)
+
+commit 77efdecadddbd68bbbc0ff85ac84e24976ad4d4f
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 22 00:14:29 2017 +0200
+
+    Improve the docs commit message a bit
+
+ .ci/deploy-docs.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a13c0748c59a92812469ada762d57bce3b02fe34
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Tue Nov 21 09:52:18 2017 +0330
+
+    Move gh-pages docs to harfbuzz.github.io
+
+ .ci/deploy-docs.sh |  10 +++++-----
+ README             |   2 ++
+ docs/HarfBuzz.png  | Bin 12710 -> 14203 bytes
+ docs/circle.yml    |   3 ---
+ 4 files changed, 7 insertions(+), 8 deletions(-)
+
+commit 9f259769a61f17b47701bbad79e1865571338417
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Nov 21 14:16:10 2017 -0500
+
+    Categorize U+A8B4 as Consonant_Medial
+
+ src/gen-use-table.py                                     |   3 +++
+ src/hb-ot-shape-complex-use-table.cc                     |   2 +-
+ .../sha1sum/373e67bf41ca264e260a9716162b71a23549e885.ttf | Bin 0 ->
+ 1164 bytes
+ test/shaping/tests/use-syllable.tests                    |   1 +
+ 4 files changed, 5 insertions(+), 1 deletion(-)
+
+commit cd8c62fd41ca824c5db3c55fd1faa20318ca0bf9
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Tue Nov 21 01:07:26 2017 -0500
+
+    [ci] Add Oracle Developer Studio (former Sun Studio) based compiler
+    (#621)
+
+ .circleci/config.yml | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+commit 8d55340593ce32e55cfbd86a17c0be8750e8fb72
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 20 19:43:22 2017 -0800
+
+    Fix fallback positioning of double diacritic marks
+
+    Fixes https://bugzilla.gnome.org/show_bug.cgi?id=787284
+
+ src/hb-ot-shape-fallback.cc                               |   4 ++--
+ .../sha1sum/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf  | Bin 0 ->
+ 892 bytes
+ test/shaping/tests/fallback-positioning.tests             |   1 +
+ 3 files changed, 3 insertions(+), 2 deletions(-)
+
+commit bb7cc4eada06839a3892cea5919f0c310cbaf7c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 20 19:39:47 2017 -0800
+
+    Minor
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a0ad0d5bb8260cb297ff114adca7c8d05b6128bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 20 15:07:48 2017 -0800
+
+    [docs] s/Harfbuzz/HarfBuzz/g
+
+ docs/harfbuzz-docs.xml                             |  2 +-
+ ...anual-buffers-language-script-and-direction.xml | 10 +++----
+ docs/usermanual-fonts-and-faces.xml                |  2 +-
+ docs/usermanual-hello-harfbuzz.xml                 | 34
+ +++++++++++-----------
+ docs/usermanual-install-harfbuzz.xml               |  2 +-
+ docs/usermanual-what-is-harfbuzz.xml               | 20 ++++++-------
+ 6 files changed, 35 insertions(+), 35 deletions(-)
+
+commit 87d74605f5f9db685bef7329f498437b4d868e6f
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Nov 20 13:19:34 2017 -0500
+
+    Categorize U+0C80 as Consonant_Placeholder
+
+ src/hb-ot-shape-complex-indic.cc                         |   1 +
+ .../sha1sum/81c368a33816fb20e9f647e8f24e2180f4720263.ttf | Bin 0 ->
+ 1152 bytes
+ test/shaping/tests/indic-syllable.tests                  |   1 +
+ 3 files changed, 2 insertions(+)
+
+commit 7c6937e7c7b62602fef10ac4b2e164d0c67c932b
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Nov 20 14:49:22 2017 -0500
+
+    Move all references of old url to the new address (#622)
+
+ .travis.yml                              |   2 +-
+ BUILD.md                                 |   2 +-
+ CMakeLists.txt                           |   2 +-
+ NEWS                                     |  20 ++++++++++----------
+ README                                   |   8 ++++----
+ RELEASING.md                             |   2 +-
+ configure.ac                             |   2 +-
+ docs/HarfBuzz.png                        | Bin 3419 -> 12710 bytes
+ docs/harfbuzz-docs.xml                   |   2 +-
+ docs/usermanual-install-harfbuzz.xml     |   2 +-
+ harfbuzz.doap                            |   2 +-
+ src/gen-use-table.py                     |   4 ++--
+ src/hb-coretext.cc                       |   2 +-
+ src/hb-debug.hh                          |   2 +-
+ src/hb-ot-layout-gsub-table.hh           |  22 +++++++++++-----------
+ src/hb-ot-layout-gsubgpos-private.hh     |   2 +-
+ src/hb-ot-layout-private.hh              |   8 ++++----
+ src/hb-ot-shape-complex-arabic.cc        |   4 ++--
+ src/hb-ot-shape-complex-hebrew.cc        |   2 +-
+ src/hb-ot-shape-complex-indic-private.hh |   2 +-
+ src/hb-ot-shape-complex-indic.cc         |   8 ++++----
+ src/hb-ot-shape-complex-use-machine.rl   |   2 +-
+ src/hb-ot-shape.cc                       |   2 +-
+ src/hb-private.hh                        |   2 +-
+ src/hb-unicode-private.hh                |   2 +-
+ src/sample.py                            |   2 +-
+ test/api/test-set.c                      |   2 +-
+ test/fuzzing/README                      |   2 +-
+ 28 files changed, 57 insertions(+), 57 deletions(-)
+
+commit baf7779d2d6e4810168a8f036bbf8f9e6493dd1a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 21:53:48 2017 -0800
+
+    Limit how much recursion GSUB/GPOS does
+
+    This only counts recursions right now.  Good start.
+
+    Hopefully...
+    Fixes https://github.com/behdad/harfbuzz/issues/429
+
+ src/Makefile.am                      |  5 ++++-
+ src/hb-buffer-private.hh             | 15 +++++++++++++--
+ src/hb-buffer.cc                     |  2 ++
+ src/hb-ot-layout-gsubgpos-private.hh |  5 ++++-
+ src/hb-ot-shape.cc                   | 10 ++++++++--
+ test/shaping/tests/fuzzed.tests      |  2 +-
+ 6 files changed, 32 insertions(+), 7 deletions(-)
+
+commit 173dab6300d9b492f2d1c68f9e8f7817211a3462
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 21:27:24 2017 -0800
+
+    Minor move
+
+ src/hb-buffer-private.hh | 26 ++++++++++++++------------
+ 1 file changed, 14 insertions(+), 12 deletions(-)
+
+commit c6173a392cfaa3d339c768836e8cddf3ae4adc53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 21:09:03 2017 -0800
+
+    Add Offset16 and Offset32
+
+ src/hb-open-type-private.hh        | 5 ++++-
+ src/hb-ot-layout-common-private.hh | 4 ++--
+ src/hb-ot-name-table.hh            | 2 +-
+ src/hb-ot-var-fvar-table.hh        | 2 +-
+ 4 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 6f335ed1e52c6161fa0b0295776856fc07f7f46f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 21:06:07 2017 -0800
+
+    Replace USHORT/SHORT/ULONG/etc with UINT16/INT16/UINT32/etc
+
+ src/hb-open-file-private.hh               |   6 +-
+ src/hb-open-type-private.hh               |  67 ++++++------
+ src/hb-ot-cbdt-table.hh                   |  78 +++++++-------
+ src/hb-ot-cmap-table.hh                   |  90 ++++++++--------
+ src/hb-ot-glyf-table.hh                   |  10 +-
+ src/hb-ot-head-table.hh                   |  28 ++---
+ src/hb-ot-hhea-table.hh                   |  18 ++--
+ src/hb-ot-kern-table.hh                   |  36 +++----
+ src/hb-ot-layout-common-private.hh        | 118 ++++++++++----------
+ src/hb-ot-layout-gdef-table.hh            |  22 ++--
+ src/hb-ot-layout-gpos-table.hh            |  94 ++++++++--------
+ src/hb-ot-layout-gsub-table.hh            |  30 +++---
+ src/hb-ot-layout-gsubgpos-private.hh      | 172
+ +++++++++++++++---------------
+ src/hb-ot-math-table.hh                   |  26 ++---
+ src/hb-ot-maxp-table.hh                   |   2 +-
+ src/hb-ot-name-table.hh                   |  16 +--
+ src/hb-ot-os2-table.hh                    |  70 ++++++------
+ src/hb-ot-post-table.hh                   |  16 +--
+ src/hb-ot-shape-complex-arabic-win1256.hh |  32 +++---
+ src/hb-ot-var-avar-table.hh               |   4 +-
+ src/hb-ot-var-fvar-table.hh               |  20 ++--
+ src/hb-ot-var-hvar-table.hh               |   8 +-
+ src/hb-ot-var-mvar-table.hh               |  10 +-
+ 23 files changed, 486 insertions(+), 487 deletions(-)
+
+commit a130ee6df50a50f541d0e8018deea9cee8c6738a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:30:03 2017 -0800
+
+    Remove a couple of unused consts
+
+ src/hb-ot-hhea-table.hh              | 5 -----
+ src/hb-ot-layout-gsubgpos-private.hh | 3 ---
+ src/main.cc                          | 4 ++--
+ 3 files changed, 2 insertions(+), 10 deletions(-)
+
+commit e20e47eaa1b7dd33ac63ab0eaa8f5ea1bf7775c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:25:29 2017 -0800
+
+    [glyf] Try fixing undefined-behavior
+
+    Might fix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1463
+
+ src/hb-ot-glyf-table.hh | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+commit 7b40876a58d331200e1d7cda1dec72578139ff9c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:22:05 2017 -0800
+
+    [ot] Remove unneeded TODO item
+
+    Looks like hb-ot-font is complete after all!
+
+    CFF font names and CFF glyph metrics don't work though...
+
+ src/hb-ot-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eab4feb5e221b8219c071ea882de79405aca4e84
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:16:45 2017 -0800
+
+    [hmtx] Use curiously recurring template pattern
+
+    https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
+
+ src/hb-ot-font.cc       | 11 ++++-------
+ src/hb-ot-hmtx-table.hh | 29 +++++++++++++++--------------
+ 2 files changed, 19 insertions(+), 21 deletions(-)
+
+commit 977ddff1f1e0f0f71a46c60ba713d160b96f5a3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:06:19 2017 -0800
+
+    [ot] Move hb_ot_face_cmap_accelerator_t
+
+ src/hb-ot-cmap-table.hh | 149
+ +++++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-font.cc       | 130 +-----------------------------------------
+ 2 files changed, 142 insertions(+), 137 deletions(-)
+
+commit a7f15959b5e6e14e5241a3155c413ff70e7d1eb3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:02:24 2017 -0800
+
+    Shuffle
+
+ src/hb-ot-hmtx-table.hh | 76
+ ++++++++++++++++++++++++-------------------------
+ 1 file changed, 38 insertions(+), 38 deletions(-)
+
+commit a85d7ead04aff81d2f9df9110316892dbbefe1c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 20:00:34 2017 -0800
+
+    [ot] Move hb_ot_face_metrics_accelerator_t
+
+ src/hb-ot-font.cc       | 108
+ +-----------------------------------------------
+ src/hb-ot-hmtx-table.hh | 108
+ +++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 109 insertions(+), 107 deletions(-)
+
+commit f00a94e1ec73c08d4bde1f50bff57d2dc9583ca8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 19:54:48 2017 -0800
+
+    Adjust privacy for recent changes
+
+ src/hb-ot-cbdt-table.hh | 6 ++++--
+ src/hb-ot-glyf-table.hh | 6 ++++--
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 7e2839c438beea216c7c8a3881e88961940e67be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 19:52:09 2017 -0800
+
+    [ot] Move hb_ot_face_glyf_accelerator_t
+
+ src/hb-ot-font.cc       |  75 +----------------------------------
+ src/hb-ot-glyf-table.hh | 103
+ +++++++++++++++++++++++++++++++++++++++++-------
+ 2 files changed, 90 insertions(+), 88 deletions(-)
+
+commit c4e18e54dc5ffecac7b327bde9f52dd0927d6a08
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 19:47:31 2017 -0800
+
+    [ot] Move hb_ot_face_cbdt_accelerator_t
+
+ src/hb-ot-cbdt-table.hh | 85
+ +++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-font.cc       | 87
+ +------------------------------------------------
+ src/hb-ot-post-table.hh |  1 +
+ 3 files changed, 87 insertions(+), 86 deletions(-)
+
+commit 9b04b0384fe746bdb1885c57e1ce73c4c6cae9e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 19:31:50 2017 -0800
+
+    [ot] Fold hb_ot_face_post_accelerator_t
+
+ src/hb-ot-font.cc       | 35 +----------------------------------
+ src/hb-ot-post-table.hh |  9 +++++++--
+ 2 files changed, 8 insertions(+), 36 deletions(-)
+
+commit 702d86ba6b4a2e41cbee46fea18b3f8eb8986dc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 19:25:38 2017 -0800
+
+    [ot] Fold hb_ot_face_kern_accelerator_t
+
+ src/hb-ot-font.cc       | 23 +----------------------
+ src/hb-ot-kern-table.hh | 13 +++++++++----
+ 2 files changed, 10 insertions(+), 26 deletions(-)
+
+commit 909de95a112ffe4d05ddcfed97a235763e8af068
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 16:22:52 2017 -0800
+
+    Minor build fix
+
+ src/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit b9c96b5d7cce80ef75cbdf0f0c47d1db62797c55
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 15:56:21 2017 -0800
+
+    Add test for previous commit
+
+    At some point we should run tests under valgrind...
+
+ .../sha1sum/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf | Bin 0 ->
+ 2786 bytes
+ test/shaping/tests/fuzzed.tests                          |   3 ++-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit e5930722d485207ca158612a2b08816337fed7e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 15:47:55 2017 -0800
+
+    Fix invalid buffer access in OOM times
+
+    Hopefully fully fixes
+    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1856
+
+ src/hb-ot-layout-gsubgpos-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit fcd6c338ff4968a0d7fc297da1c6d8058823aaa1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 14:40:21 2017 -0800
+
+    Fix more compiler warnings
+
+ src/hb-debug.hh | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit 7fdf16b2ceb709b78654f99e6513fa878cd4d575
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 14:40:11 2017 -0800
+
+    Fix compiler warning
+
+ src/hb-string-array.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 87f0ad183c489ef3208cf454d43c448638316092
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Nov 2 10:59:25 2017 -0400
+
+    Allow U+20F0 in USE clusters
+
+ src/gen-use-table.py                               |   4 +++
+ src/hb-ot-shape-complex-use-table.cc               |  34
+ +++++++++++++--------
+ .../074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf   | Bin 0 -> 2296 bytes
+ test/shaping/tests/use-syllable.tests              |   1 +
+ 4 files changed, 26 insertions(+), 13 deletions(-)
+
+commit f93c6f8bfa228e95311d8d6d02dcc64b603c6e36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 11:09:19 2017 -0800
+
+    1.7.1
+
+ NEWS         | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 93f7c1652a05e806c2e3ac7edf498d2f4a508a3a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Nov 14 10:59:54 2017 -0800
+
+    Revert "[glib/ucdn/icu/ft/ot] Make returned funcs inert"
+
+    This reverts commit 5daf3bd4494cce6b4fb074533be9e99c4d9e0edd.
+
+    If other atexit callbacks try to destruct the objects we destruct
+    in atexit callbacks, bad things will happen.
+
+    I'll come up with some other way to catch premature destruction
+    of HB-owned objects.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/618
+
+ src/hb-ft.cc             |  3 ---
+ src/hb-glib.cc           |  3 ---
+ src/hb-icu.cc            |  3 ---
+ src/hb-object-private.hh | 37 ++++++-------------------------------
+ src/hb-ot-font.cc        |  3 ---
+ src/hb-ucdn.cc           |  3 ---
+ 6 files changed, 6 insertions(+), 46 deletions(-)
+
+commit c48475f33ab88be6664d41b039f7be7c3e56a5a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 13 20:26:29 2017 -0800
+
+    Whitespace
+
+ src/hb-open-type-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 83d68027360ff655d3b59371fb606fc9e40df4ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 13 20:25:02 2017 -0800
+
+    Clean up GlyphID
+
+    After 4a27c17ea0234dfe33e62f5830d9f92c26d48d30 we do not need
+    the special GlyphID.cmp(hb_codepoint_t), so just make GlyphID
+    a typedef.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/612
+
+ src/hb-open-type-private.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 7f39f576148643b4790fd70361e328b4b4da3149
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 13 15:04:13 2017 -0800
+
+    Implement strtod_l() on MSVC
+
+    Patch from Jean Ghali on mailing list.
+
+ src/hb-common.cc | 21 +++++++++++++++------
+ 1 file changed, 15 insertions(+), 6 deletions(-)
+
+commit e5d709889200571b62a611e0f44a410591983f8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 13 09:42:37 2017 -0800
+
+    1.7.0
+
+ NEWS         | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit e4da38020021a92afa4062ed676f286945070dc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 10 17:14:27 2017 -0800
+
+    [coretext/uniscribe/directwrite/graphite/fallback] Update for
+    unsafe-to-break
+
+    Fixes https://github.com/behdad/harfbuzz/issues/615
+
+    We'll see which bots I broke.
+
+ src/hb-buffer-private.hh | 17 +++++++++++++++--
+ src/hb-coretext.cc       |  2 ++
+ src/hb-directwrite.cc    |  3 +--
+ src/hb-fallback-shape.cc |  2 ++
+ src/hb-graphite2.cc      |  2 ++
+ src/hb-uniscribe.cc      |  2 ++
+ 6 files changed, 24 insertions(+), 4 deletions(-)
+
+commit 4de03a1585cf735e3ac09847af761ff85fca5a02
+Author: Martin Hosken <martin_hosken@sil.org>
+Date:   Fri Nov 10 13:47:38 2017 +0700
+
+    Fix graphite intergration reordered clusters problem
+
+ src/hb-graphite2.cc | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 8eed9cb11e28728a58e265fde5c13f519ccbdb4e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Nov 9 18:09:40 2017 -0800
+
+    [kern] Fix invalid memory access if offset is zero
+
+    If offset is zero, we return Null() object.  Wasn't prepared for that.
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4088
+
+ src/hb-ot-kern-table.hh                                   |   9 +++++----
+ .../sha1sum/243798dd281c1c77c065958e1ff467420faa9bde.ttf  | Bin 0 ->
+ 225 bytes
+ test/shaping/tests/fuzzed.tests                           |   1 +
+ 3 files changed, 6 insertions(+), 4 deletions(-)
+
+commit b68fba4dc81ce2e7552c5d50a93013281889a65b
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Fri Nov 3 14:27:33 2017 +0200
+
+    [test] Use glyph ids instead of forcing ft funcs
+
+    We were using ft funcs because these are CFF fonts, but we can avoid
+    glyph names instead and keep testing both ot and ft.
+
+ test/shaping/tests/indic-consonant-with-stacker.tests | 8 ++++----
+ test/shaping/tests/indic-script-extensions.tests      | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 2fcfbcf8052bba0db7590a5f057730075fdbd5e1
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Nov 2 09:45:06 2017 +0200
+
+    [test] Fix another instance of component rounding
+
+    See https://github.com/behdad/harfbuzz/pull/590#issuecomment-341194673
+
+ .../sha1sum/7ef276fc886ea502a03b9b0e5c8b547d5dc2b61c.ttf  | Bin 784 ->
+ 0 bytes
+ .../sha1sum/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf  | Bin 0 ->
+ 784 bytes
+ test/shaping/tests/fallback-positioning.tests             |   3 +--
+ 3 files changed, 1 insertion(+), 2 deletions(-)
+
+commit c4f4c0a2faab0635dd2ab3078243994ad3066287
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 8 17:04:31 2017 -0800
+
+    Fix indexing in unsafe-to-break marking for 'stch' feature
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4099
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 822035ce73931ccd5d2455584aad603037892498
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 8 17:03:55 2017 -0800
+
+    [tests/arabic-stch.tests] Don't show flags
+
+    We don't need to test the actual flag values.  For unsafe-to-break,
+    the --verify in run-tests.sh checks what we are interested in.
+
+ test/shaping/tests/arabic-stch.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 53f0c27ddca92af1af27b6ffa9dcd0949afed664
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 8 17:02:54 2017 -0800
+
+    Minor
+
+ test/shaping/run-tests.sh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 5a9cba9744876dfc56bdc9aed805f571bd0d4b0a
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Nov 8 13:15:27 2017 -0500
+
+    Mark non-initial left matras as unsafe to break
+
+ src/hb-ot-shape-complex-indic.cc                         |  14
+ +++++++++-----
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf | Bin 0 ->
+ 1380 bytes
+ test/shaping/tests/indic-init.tests                      |   1 +
+ 4 files changed, 11 insertions(+), 5 deletions(-)
+
+commit a6150306838b168475a9aa661ad569b0405c9f91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 6 15:40:07 2017 -0500
+
+    [kern] Implement format-2 kern subtable
+
+ src/hb-ot-kern-table.hh | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+commit 82a38d1f7a65537a4ef540af08c489512d6297ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Nov 6 15:28:24 2017 -0500
+
+    [kern] Allow subtables longer than 64kb
+
+    Apparently calibri.ttf does this:
+    https://github.com/fonttools/fonttools/pull/1094#discussion_r148933791
+
+ src/hb-ot-font.cc       | 23 ++++++++++++++++++++++-
+ src/hb-ot-kern-table.hh | 41 +++++++++++++++++++++++++++++------------
+ 2 files changed, 51 insertions(+), 13 deletions(-)
+
+commit 625ae08fcee747fbdc33a3a6865fb3aa425662ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Nov 4 12:01:11 2017 -0400
+
+    [kern] Towards implementing format-2
+
+ src/hb-open-type-private.hh |  4 +--
+ src/hb-ot-kern-table.hh     | 69
+ +++++++++++++++++++++++++++------------------
+ 2 files changed, 42 insertions(+), 31 deletions(-)
+
+commit 74e82adaea08ced18493e3341823dbd5b6cd493e
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Mon Nov 6 14:41:55 2017 -0500
+
+    Mark glyphs involved in 'stch' as unsafe to break
+
+ src/hb-ot-shape-complex-arabic.cc                        |   1 +
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf | Bin 0 ->
+ 1420 bytes
+ test/shaping/tests/arabic-stch.tests                     |   1 +
+ 4 files changed, 3 insertions(+)
+
+commit 601126ad401d05b9c7fe4a34e870f1d1a1b057c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 3 20:34:11 2017 -0400
+
+    [configure] Fix gobject default value in help output
+
+    Fixes https://github.com/behdad/harfbuzz/issues/607
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5aad81943329df199501e9473e2cc39f9d4421a1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 3 17:16:26 2017 -0400
+
+    Simplify tracing code when tracing is disabled
+
+    Fixes https://github.com/behdad/harfbuzz/pull/605
+
+ src/hb-debug.hh                      | 58
+ +++++++++++++++++++++++++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh | 10 +++----
+ 2 files changed, 52 insertions(+), 16 deletions(-)
+
+commit 40ec3bbb55b8af1668bb3d5f6232a85b15cff136
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 3 16:57:30 2017 -0400
+
+    Consolidate debug stuff into hb-debug.hh
+
+    Part of fixing https://github.com/behdad/harfbuzz/pull/605
+
+ src/Makefile.sources                 |   1 +
+ src/hb-blob.cc                       |   7 +-
+ src/hb-coretext.cc                   |   8 +-
+ src/hb-debug.hh                      | 383
+ +++++++++++++++++++++++++++++++++++
+ src/hb-directwrite.cc                |   6 +-
+ src/hb-ft.cc                         |   7 +-
+ src/hb-object-private.hh             |   8 +-
+ src/hb-open-type-private.hh          |  21 +-
+ src/hb-ot-layout-common-private.hh   |   8 +-
+ src/hb-ot-layout-gsubgpos-private.hh |  46 +----
+ src/hb-ot-shape-complex-arabic.cc    |   7 +-
+ src/hb-private.hh                    | 260 +-----------------------
+ src/hb-shape-plan.cc                 |   7 +-
+ src/hb-uniscribe.cc                  |   7 +-
+ 14 files changed, 404 insertions(+), 372 deletions(-)
+
+commit 384862d7ee2e27e6678844feafab69f03f77ac9a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Nov 3 16:31:47 2017 -0400
+
+    Remove NO_COPY()
+
+ src/hb-ot-shape-private.hh | 4 +++-
+ src/hb-private.hh          | 8 --------
+ 2 files changed, 3 insertions(+), 9 deletions(-)
+
+commit 97145df2496f90e1ea4a41784f3224c60e973fd4
+Author: Unknown <kunda@scribus.net>
+Date:   Fri Nov 3 09:05:00 2017 -0400
+
+    Trivial typos
+
+    Found using `codespell -i 3 -w -I '../harf-whitelist.txt'`
+    whereas the whitelist contents were:
+    ```
+    beng
+    iff
+    pres
+    ot
+    te
+    teh
+    ```
+
+ NEWS                             | 2 +-
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ src/hb-ot-shape-fallback.cc      | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 4a591a0e515f5c15c807fe648c073d249820e5ec
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Nov 2 09:33:12 2017 -0700
+
+    [ci] Add ArchLinux (#604)
+
+ .circleci/config.yml | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+commit d18ee5afe8b1992d234402cd71f809cd904113a5
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Nov 2 07:56:25 2017 -0700
+
+    Copy dummy docs/circle.yml to gh-pages branch (#603)
+
+ .ci/deploy-docs.sh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1955cbecc98ee88ba8a62df1d8c77a09ed5d2c75
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Nov 2 04:55:46 2017 -0700
+
+    Add a dummy CircleCI config to gh-pages branch (#602)
+
+ docs/circle.yml | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 4b3278ef8dc71ad4f744d763068d9a2e02d3d75d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 19:41:29 2017 -0600
+
+    [ot] Hook up horizontal kerning to kern table
+
+    Seems to work.  Yay!
+
+    Still to do: run kerning if GPOS doesn't have 'kern' feature.
+
+ src/hb-ot-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 77acc1106e6d984ee74ec606e145f455e6e55509
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 19:33:09 2017 -0600
+
+    [kern] More...
+
+    Almost there.
+
+ src/hb-ot-font.cc       | 14 +++++++++
+ src/hb-ot-kern-table.hh | 75
+ ++++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 88 insertions(+), 1 deletion(-)
+
+commit 49c0f35580946c74bc64dae2d2c65c7834e46ab2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 18:16:07 2017 -0600
+
+    [kern] See if this helps with making VS bot happy
+
+ src/hb-ot-kern-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 2c439210c9734cd21b08beba07d21147a6eb6d8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 18:13:35 2017 -0600
+
+    [uniscribe] Fix a couple of VS warnings
+
+ src/hb-uniscribe.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4c43a23bf479b42d42192bab56df6075c8ae0090
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 18:12:26 2017 -0600
+
+    [kern] Implement Format0
+
+ src/hb-ot-kern-table.hh | 51
+ +++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 45 insertions(+), 6 deletions(-)
+
+commit ac3d937c6cb0e2c7e019aa391b02da25aa6970de
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 17:54:56 2017 -0600
+
+    [kern] Implement some more
+
+ src/hb-ot-kern-table.hh | 98
+ ++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 77 insertions(+), 21 deletions(-)
+
+commit 2a16f647ae4c5115a356ba82245c77e0d01fcebf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 17:31:29 2017 -0600
+
+    [kern] Start implementing kern table
+
+    Pushing this out early to catch bot errors since I'm using template
+    tricks
+    we were not using in HarfBuzz before.
+
+ src/Makefile.sources    |   1 +
+ src/hb-ot-font.cc       |   1 +
+ src/hb-ot-kern-table.hh | 184
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 186 insertions(+)
+
+commit 292ef2675edb2cb579210183e77ac30335318a21
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Nov 1 16:24:46 2017 -0700
+
+    [ci] minor cleanup (#600)
+
+ .circleci/config.yml | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 260246a279699d313a45583c6a61e4bab717f739
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Nov 1 14:10:55 2017 -0700
+
+    [ci] Add Fedora builder (#598)
+
+ .circleci/config.yml | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 0e63cbed9cceb1d0238974ddfa9bc68d25d9c616
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 1 20:49:42 2017 +0200
+
+    [test] Fix difference between ft and ot font funcs
+
+    See
+    https://github.com/behdad/harfbuzz/pull/590#issuecomment-341194673.
+
+    I simply removed the composite glyph and use the referenced simple
+    glyph directly.
+
+ .../sha1sum/4fac3929fc3332834e93673780ec0fe94342d193.ttf  | Bin 0 ->
+ 804 bytes
+ .../sha1sum/6466d38c62e73a39202435a4f73bf5d6acbb73c0.ttf  | Bin 824 ->
+ 0 bytes
+ test/shaping/tests/cluster.tests                          |   2 +-
+ 3 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 0b8f8dd869212ed2889cbdb79c4c4b639b8eff7a
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 1 20:33:43 2017 +0200
+
+    Revert "[test] We don’t care about glyph positions here"
+
+    This reverts commit 70137e2b4b46918d9608f824a4b4b5cef2819158.
+
+ test/shaping/tests/cluster.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f1245013bf7e9d490b43d9b8bebd467b2c1d14cc
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 1 12:06:59 2017 +0200
+
+    [test] Run shaping tests with both ot and ft funcs
+
+ test/shaping/run-tests.sh | 21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+commit 70137e2b4b46918d9608f824a4b4b5cef2819158
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 1 12:03:39 2017 +0200
+
+    [test] We don’t care about glyph positions here
+
+    Freetype and OT font functions give different positions for some
+    glyphs
+    in this font (OT seems to be correct), but that is not what we are
+    interested in in this test.
+
+    See
+    https://github.com/behdad/harfbuzz/pull/590#issuecomment-341045223.
+
+ test/shaping/tests/cluster.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9234b364b178d44a11148d5c613169731667a2ae
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Nov 1 10:34:36 2017 +0200
+
+    [test] Use ft functions for this test
+
+    https://github.com/behdad/harfbuzz/pull/590#issuecomment-340967271
+
+ test/shaping/tests/vertical.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit afbfb9279cbebcd0a85ab2fcc822a3fdbb035272
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Oct 30 22:02:50 2017 +0200
+
+    [test] Always use ft font funcs for these tests
+
+    These are CFF fonts and ot functions don’t support CFF glyph
+    names yet.
+    The next commit will run all tests with ot functions.
+
+ test/shaping/tests/indic-consonant-with-stacker.tests | 8 ++++----
+ test/shaping/tests/indic-script-extensions.tests      | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 33e62636f739680ffbc1875391f05e80039a3259
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Nov 1 03:05:46 2017 -0700
+
+    [ci] Add FreeBSD9 (gcc4) (#595)
+
+ .circleci/config.yml | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+commit 102f5ead493ad2eac6c11c3fc8f2e793d3d57058
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Wed Nov 1 02:10:18 2017 -0700
+
+    Enable PSVita (arm-none-eabi) compile again and add it to CI (#594)
+
+ .circleci/config.yml        | 17 ++++++++++++++---
+ src/hb-buffer-private.hh    |  2 +-
+ src/hb-buffer.cc            |  4 ++--
+ src/hb-open-file-private.hh |  2 +-
+ 4 files changed, 18 insertions(+), 7 deletions(-)
+
+commit 65d4e5bcda543c17e09867418365ba44b441d5d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Nov 1 01:15:27 2017 -0600
+
+    [CircleCI] Ignore gh-pages branch
+
+    https://github.com/behdad/harfbuzz/pull/592
+
+ .circleci/config.yml | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 92bb5086424d7454d666732e39117a7d32490646
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 22:58:03 2017 -0600
+
+    [indic] Use mutable for virama_glyph
+
+ src/hb-ot-shape-complex-indic.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6c04dcb28dcafc7d97799c80c0bc714c76d51d1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 20:11:00 2017 -0600
+
+    Use bsearch() for large SFNT table directories
+
+ src/hb-open-file-private.hh | 21 +++++++++------------
+ 1 file changed, 9 insertions(+), 12 deletions(-)
+
+commit b0e33da02d062200dd41e4503ecc21fb4bd636e6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 20:05:37 2017 -0600
+
+    Add BinSearchArrayOf<>
+
+ src/hb-open-file-private.hh | 25 +++++++++++--------------
+ src/hb-open-type-private.hh | 33 ++++++++++++++++++++++++++++++++-
+ src/hb-ot-font.cc           |  2 +-
+ 3 files changed, 44 insertions(+), 16 deletions(-)
+
+commit aca378f51ecf682ea1454071f671bbc7eef808bd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 18:11:10 2017 -0600
+
+    Sanitize (Headless)ArrayOf()::len to ensure it doesn't use offsets
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5f047113142349ecf0dd6d00384f7ef7b3d1a85e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 18:10:40 2017 -0600
+
+    Fix HeadlessArrayOf::sanitize_shallow()
+
+ src/hb-open-type-private.hh | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 7ce9f397d1e5fe68c49375ad904d4fce2c7ccc0a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 15:34:01 2017 -0600
+
+    Rename hb-sort-r.hh -> hb-dsalgs.hh
+
+ src/Makefile.sources               |  2 +-
+ src/{hb-sort-r.hh => hb-dsalgs.hh} | 14 +++++++-------
+ src/hb-ot-post-table.hh            |  2 +-
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 8eaff980fc6d15856fa853479454b58668809c7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 15:30:06 2017 -0600
+
+    Remove HB_TAG_CHAR4
+
+ src/hb-common.cc  | 2 +-
+ src/hb-ot-tag.cc  | 2 +-
+ src/hb-private.hh | 5 -----
+ 3 files changed, 2 insertions(+), 7 deletions(-)
+
+commit d016c5bdb94704e726b104c318262b47c6a4b7c8
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Fri Oct 27 12:14:00 2017 -0400
+
+    Categorize Grantha candrabindu for use in Tamil
+
+ src/hb-ot-shape-complex-indic.cc                         |   2 +-
+ .../sha1sum/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf | Bin 0 ->
+ 1120 bytes
+ test/shaping/tests/indic-script-extensions.tests         |   1 +
+ 3 files changed, 2 insertions(+), 1 deletion(-)
+
+commit b902605133ef4a411afdaa8abda194e81facf525
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 14:25:46 2017 -0600
+
+    [CircleCI] Fix build
+
+    Fixes https://github.com/behdad/harfbuzz/issues/589
+
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 0f78d78aae604cb8e61bd21785adb915da74626e
+Merge: b7982c9e 0feff4ba
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 14:13:31 2017 -0600
+
+    Merge commit '0feff4ba7b16501341c575e06b4c98a6e1bd2809'
+
+commit 0feff4ba7b16501341c575e06b4c98a6e1bd2809
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 14:02:32 2017 -0600
+
+    Simplify hb-sort-r.hh
+
+    See https://github.com/behdad/harfbuzz/pull/592
+
+ src/hb-sort-r.hh | 147
+ ++++++-------------------------------------------------
+ 1 file changed, 14 insertions(+), 133 deletions(-)
+
+commit b7982c9e65e0b58616cc8264dd52cac37753ef79
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Tue Oct 31 12:42:08 2017 -0700
+
+    [ci] Add CircleCI for cross-compiling (#592)
+
+ .circleci/config.yml | 61
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ README               |  1 +
+ 2 files changed, 62 insertions(+)
+
+commit c290ba5b7d4e9e4a5f02340a22e6c9c46564906b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 13:18:21 2017 -0600
+
+    Define _GNU_SOURCE
+
+    Might help with https://github.com/behdad/harfbuzz/pull/592
+    Ie. bringing in qsort_r() prototype always.
+
+ src/hb-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 98acdde3c6bd0745c3cbfb510e82fbd87ebd1a33
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 31 11:17:43 2017 -0600
+
+    [coretext/uniscribe] Fix build
+
+    https://travis-ci.org/behdad/harfbuzz/jobs/295039536#L3468
+    https://ci.appveyor.com/project/behdad/harfbuzz/build/1.0.697/job/dr1ujlntxafeqbej#L142
+
+ src/hb-coretext.cc  | 8 ++++++--
+ src/hb-uniscribe.cc | 8 ++++++--
+ 2 files changed, 12 insertions(+), 4 deletions(-)
+
+commit ec86cc5e552e9e8d64101feb1f540a9dc94a9025
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 14:11:59 2017 -0600
+
+    Fix Windows build
+
+    (And prevent it from happening in the future.)
+
+ src/hb-ot-layout.cc     | 1 +
+ src/hb-ot-name-table.hh | 4 +++-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit e35a763c07b60da6e5fbdb6edd9d25f575cd3d8b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 13:15:05 2017 -0600
+
+    [post] Implement glyph_from_name()
+
+    This concludes https://github.com/behdad/harfbuzz/pull/568
+
+ src/hb-ot-post-table.hh | 119
+ ++++++++++++++++++++++++++++++++++++------------
+ src/hb-private.hh       |  10 ++--
+ src/hb-sort-r.hh        |   2 +-
+ 3 files changed, 96 insertions(+), 35 deletions(-)
+
+commit 6c738f353ec4ab5974414fbb8ff1fb9383c4bde6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 12:21:44 2017 -0600
+
+    Make string-array return hb_string_t
+
+ src/hb-ot-post-table.hh | 17 ++---------------
+ src/hb-string-array.hh  | 11 +++++++++--
+ 2 files changed, 11 insertions(+), 17 deletions(-)
+
+commit e1a37f3db4f2364e98ff057209a94aa9b23e5c9d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 11:42:28 2017 -0600
+
+    Add hb_string_t
+
+ src/hb-ot-post-table.hh | 25 ++++++++-----------------
+ src/hb-private.hh       | 27 +++++++++++++++++++++++++++
+ 2 files changed, 35 insertions(+), 17 deletions(-)
+
+commit 21ac5678583259e673d961a26fadaad2bf33f1f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 09:48:09 2017 -0600
+
+    Fix tests
+
+ src/check-includes.sh |  2 +-
+ src/hb-sort-r.hh      | 32 ++++++++++++++++++++++++++++++--
+ 2 files changed, 31 insertions(+), 3 deletions(-)
+
+commit 0f8b5aa1bc2c831044a35fc8e52df58652cec86b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 30 09:46:36 2017 -0600
+
+    [post] Minor; towards implementing get_glyph_from_name()
+
+ src/hb-ot-post-table.hh | 56
+ +++++++++++++++++++++++++++----------------------
+ 1 file changed, 31 insertions(+), 25 deletions(-)
+
+commit 977679f229a10868dc668294082bd82125e4fe48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 29 17:33:32 2017 -0600
+
+    Add hb_bsearch_r()
+
+ src/hb-ot-post-table.hh |  1 +
+ src/hb-sort-r.hh        | 25 +++++++++++++++++++++++++
+ 2 files changed, 26 insertions(+)
+
+commit 0712e915b4814e350aa1d833c1dee5010cdbd8f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 29 17:01:47 2017 -0600
+
+    Remove hb_compare_func_t
+
+ src/hb-ot-map-private.hh    | 18 +++++++++++++-----
+ src/hb-ot-name-table.hh     |  2 +-
+ src/hb-ot-tag.cc            |  8 +++++---
+ src/hb-ot-var-mvar-table.hh | 10 +++++++---
+ src/hb-private.hh           |  9 ++-------
+ 5 files changed, 28 insertions(+), 19 deletions(-)
+
+commit 538da7496d70c86b41070ecf52592e52920d8808
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 29 16:38:58 2017 -0600
+
+    Add hb-sort-r, a portable qsort_r() replacement
+
+ src/Makefile.sources |   1 +
+ src/hb-sort-r.hh     | 227
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 228 insertions(+)
+
+commit 923a8f520addba095384b975ba8934e5a18fb696
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 29 15:00:54 2017 -0600
+
+    Fix up 5de83fab947e23cc729d69f8d44a28311298af9d
+
+ src/hb-ot-post-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b98c7c3f1fc8581ce9a0f40ae25aee5e1b2b3106
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 29 14:52:52 2017 -0600
+
+    [post] Minor
+
+ src/hb-ot-post-table.hh | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit 5de83fab947e23cc729d69f8d44a28311298af9d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 28 19:54:04 2017 -0600
+
+    [ot] Speed up get_glyph_name()
+
+    get_glyph_from_name() coming soon.
+
+ src/hb-ot-font.cc            |  13 ++--
+ src/hb-ot-post-table.hh      | 160
+ +++++++++++++++++++------------------------
+ src/test-buffer-serialize.cc |   4 +-
+ 3 files changed, 81 insertions(+), 96 deletions(-)
+
+commit feadee079e09e43e5f712a66816605e19155594e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 28 16:58:56 2017 -0600
+
+    [post] Refactor a bit, use our data types
+
+ src/hb-ot-post-table.hh | 25 ++++++++++---------------
+ 1 file changed, 10 insertions(+), 15 deletions(-)
+
+commit 5014c60afaab51a7a4813cf427a3d6053458279b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 28 12:00:49 2017 -0600
+
+    More nullptr fix
+
+    Fixes https://github.com/behdad/harfbuzz/issues/585
+
+ src/test.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 5daf3bd4494cce6b4fb074533be9e99c4d9e0edd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 16:34:01 2017 -0600
+
+    [glib/ucdn/icu/ft/ot] Make returned funcs inert
+
+    Such that client cannot accidentally destroy them, even though that
+    will be a bug in their code...
+
+ src/hb-ft.cc             |  3 +++
+ src/hb-glib.cc           |  3 +++
+ src/hb-icu.cc            |  3 +++
+ src/hb-object-private.hh | 37 +++++++++++++++++++++++++++++++------
+ src/hb-ot-font.cc        |  3 +++
+ src/hb-ucdn.cc           |  3 +++
+ 6 files changed, 46 insertions(+), 6 deletions(-)
+
+commit bfa7f37a73508ca185cf2f3e06755db8c8258ddf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 16:03:51 2017 -0600
+
+    Fix previous commit
+
+    Oops.
+
+ src/hb-glib.cc | 2 +-
+ src/hb-icu.cc  | 2 +-
+ src/hb-ucdn.cc | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 8864864b624590d95ae5dca61956695cbff1269a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 15:26:45 2017 -0600
+
+    [glib/icu/ucdn] Make the funcs object allocated on demand
+
+ src/hb-glib.cc | 36 +++++++++++++++++++++++++++++-------
+ src/hb-icu.cc  | 51 +++++++++++++++++++++++++++++++++++++--------------
+ src/hb-ucdn.cc | 37 +++++++++++++++++++++++++++++--------
+ 3 files changed, 95 insertions(+), 29 deletions(-)
+
+commit af3f72f9eb7d7b80ea827976a3303390b5deae8d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 15:13:50 2017 -0600
+
+    Correctly mark NullPool const
+
+    Saves some more code size as well!
+
+ src/hb-open-type-private.hh | 2 +-
+ src/hb-ot-layout.cc         | 2 +-
+ src/main.cc                 | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 51f4d4d5cd5a0dd1a581bee5b55b3cc0a74cbea3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 15:09:22 2017 -0600
+
+    Reduce prealloced number of user-data items from 2 to 1
+
+    Even 1 is too many but putting 0 breaks compile.  Saves 3k in .so
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3205de7906abab9d12e614e86e2c182a41420698
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 15:01:40 2017 -0600
+
+    Make the NullPool HB_INTERNAL shared
+
+    Saves 2k of .bss section.
+
+ src/hb-open-type-private.hh | 10 ++++++----
+ src/hb-ot-layout.cc         |  3 +++
+ src/main.cc                 |  1 +
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 7036f1d22c4001b79d3205c16aac3fefbfcaae24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 14:42:59 2017 -0600
+
+    [ot] Remove shaper name
+
+    In ten years we never used them...
+
+ src/hb-ot-shape-complex-arabic.cc  | 1 -
+ src/hb-ot-shape-complex-default.cc | 1 -
+ src/hb-ot-shape-complex-hangul.cc  | 1 -
+ src/hb-ot-shape-complex-hebrew.cc  | 1 -
+ src/hb-ot-shape-complex-indic.cc   | 1 -
+ src/hb-ot-shape-complex-myanmar.cc | 2 --
+ src/hb-ot-shape-complex-private.hh | 2 --
+ src/hb-ot-shape-complex-thai.cc    | 1 -
+ src/hb-ot-shape-complex-tibetan.cc | 1 -
+ src/hb-ot-shape-complex-use.cc     | 1 -
+ 10 files changed, 12 deletions(-)
+
+commit 4a27c17ea0234dfe33e62f5830d9f92c26d48d30
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 14:29:12 2017 -0600
+
+    Fix IntType.cmp() to avoid narrowing down integer types
+
+    Fixes https://github.com/behdad/harfbuzz/issues/571
+
+ src/hb-open-type-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 919b4b76a7b1f9dd7c71310a729982242f9060a5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 10:29:25 2017 -0600
+
+    Make c++11 optional
+
+    Fixes https://github.com/behdad/harfbuzz/issues/585
+
+ configure.ac                |   4 +-
+ m4/ax_cxx_compile_stdcxx.m4 | 982
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 983 insertions(+), 3 deletions(-)
+
+commit 6c4689704071a76c49be819b8034feaf93e26a42
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 10:24:58 2017 -0600
+
+    [m4] Update ax_pthread.m4
+
+ m4/ax_pthread.m4 | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 2e025507634e54a64fa5d0cbfefc4b65177c06c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 10:23:01 2017 -0600
+
+    [git.mk] Update
+
+ git.mk | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 55 insertions(+), 2 deletions(-)
+
+commit 62e312ead808cec055049592b0d40aa3a8882bc9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 09:29:20 2017 -0600
+
+    Use NULL instead of polyfill, if nullptr is not available
+
+    Part of fixing https://github.com/behdad/harfbuzz/issues/585
+
+ src/hb-private.hh | 22 +++-------------------
+ 1 file changed, 3 insertions(+), 19 deletions(-)
+
+commit 17f40b7cad240eadeccdf23eb11da7ed52252ca2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 09:22:30 2017 -0600
+
+    Include hb-private.hh more consistently
+
+    Part of fixing https://github.com/behdad/harfbuzz/issues/585
+
+ src/test-buffer-serialize.cc |  4 +---
+ src/test-size-params.cc      |  4 +---
+ src/test-would-substitute.cc |  4 +---
+ util/ansi-print.hh           |  1 +
+ util/helper-cairo-ansi.hh    |  5 +++--
+ util/helper-cairo.hh         |  7 ++++---
+ util/main-font-text.hh       |  5 +++--
+ util/options.hh              | 11 +----------
+ util/shape-consumer.hh       |  5 +++--
+ util/view-cairo.hh           |  7 ++++---
+ 10 files changed, 22 insertions(+), 31 deletions(-)
+
+commit 42d518513c683fd5e932898ceec891c3003d75e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 27 00:25:11 2017 -0600
+
+    Towards compiling with pre-C++11 compilers and nullptr fallback
+
+    https://github.com/behdad/harfbuzz/issues/585
+
+ src/hb-atomic-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0e9256984e76f055f1868ecc497724977caba11d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 26 20:34:04 2017 -0600
+
+    [post] Make format1 names array avoid relocations
+
+ src/Makefile.sources       |   1 +
+ src/hb-ot-post-macroman.hh | 294
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-post-table.hh    |  55 ++-------
+ 3 files changed, 305 insertions(+), 45 deletions(-)
+
+commit 2a749680441bbe6b4aa8134bb6ce9f21a8b1bc3c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 26 19:48:33 2017 -0600
+
+    Add hb-string-array.hh
+
+    Used to build static string arrays that use no relocation.
+
+ src/Makefile.sources   |  1 +
+ src/hb-private.hh      |  6 ++--
+ src/hb-string-array.hh | 74
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 79 insertions(+), 2 deletions(-)
+
+commit 6f08b12bc38166dee2f9740d396d617b32e887a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 26 18:23:03 2017 -0600
+
+    Minor
+
+ src/hb-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 223686d64f5e149ba8aa334a2a54bd5b22017d9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 26 12:52:02 2017 -0600
+
+    1.6.3
+
+ NEWS         | 9 +++++++++
+ configure.ac | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 729c9e13355eefafdc0fdef9aa68bd792ca4dba4
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Thu Oct 26 10:29:28 2017 -0400
+
+    Include all relevant glyphs in the subsetted font
+
+ test/shaping/record-test.sh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit cb6c6b0c425e560f32b297c15dc6775e297d5b1d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 26 11:43:33 2017 -0600
+
+    Fix warning
+
+    https://github.com/behdad/harfbuzz/commit/49a41dc75931cc2d2f7e74b7801f8cc327039e8e#commitcomment-25203194
+
+ test/api/test-set.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit dfd234a97d2e2f9908eaf0598de765f76ba86c82
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Oct 26 16:59:50 2017 +0100
+
+    [set] Fix page_map[] indexing in backward loop.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/579.
+
+ src/hb-set-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7339926525416620aa7922371775ed65eed4eae4
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Oct 26 12:55:36 2017 +0100
+
+    [test] Extend hb_set test for issue 579 (currently failing)
+
+ test/api/test-set.c | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 3d6f7df42a87ef366197581cb4696c5f30c3bcbb
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Oct 26 17:54:55 2017 +0100
+
+    [test] Additional coverage in test_set_iter.
+
+    This adds a couple extra entries to the set used, such that iteration
+    would fail in 1.6.2 due to the bug in hb_set_t::page_t::next().
+
+ test/api/test-set.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit d511cfb5577a58e31d8dd4214750b0ad4efa625a
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Thu Oct 26 15:08:29 2017 +0100
+
+    [set] Bugfix for hb_set_next
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 92bac64bd2d5fffe70229790be27d335aa6c6de3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 25 18:22:47 2017 -0600
+
+    [post] Oops!
+
+    https://ci.appveyor.com/project/behdad/harfbuzz/build/1.0.668/job/ikfj8peowgrp059t
+
+ src/hb-ot-post-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 543bd58d7a4fbe285ec9304ff3223a728dbdbb76
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 25 17:40:50 2017 -0600
+
+    [post] Touch up and fixes
+
+    The get_glyph_from_name() is incorrect; needs fixing.
+
+ src/hb-ot-font.cc       |   9 ++--
+ src/hb-ot-post-table.hh | 139
+ +++++++++++++++++++++++++++---------------------
+ 2 files changed, 81 insertions(+), 67 deletions(-)
+
+commit d9e166f74c3ba3128c9ef3ccd8d7799e67f14eab
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed Oct 18 20:49:16 2017 +0200
+
+    [ot-font] Implement hb_ot_get_glyph_from_name
+
+ src/hb-ot-font.cc       | 22 ++++++++++++++++++-
+ src/hb-ot-post-table.hh | 58
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 79 insertions(+), 1 deletion(-)
+
+commit 9d4d2fb9af446d5d41058fbb1da8117b3af048d3
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Oct 16 10:05:42 2017 +0200
+
+    [ot-font] Implement hb_ot_get_glyph_name
+
+    Turns out we already have support for “post” table, it just
+    needed to be
+    activated and put in use.
+
+ src/hb-ot-font.cc                             | 46 ++++++++++++-
+ src/hb-ot-post-table.hh                       | 96
+ +++++++++++++++++++++++++++
+ test/shaping/tests/fallback-positioning.tests |  2 +-
+ test/shaping/tests/indic-syllable.tests       |  2 +-
+ test/shaping/tests/use.tests                  |  2 +-
+ 5 files changed, 143 insertions(+), 5 deletions(-)
+
+commit bf133497e53e8b1dcd22df62080d33e7f3d85b68
+Merge: fd786c76 49a41dc7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 25 17:23:20 2017 -0600
+
+    Merge commit '49a41dc75931cc2d2f7e74b7801f8cc327039e8e'
+
+commit 49a41dc75931cc2d2f7e74b7801f8cc327039e8e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 25 16:17:45 2017 -0600
+
+    [test] Add more hb-set tests
+
+    https://github.com/behdad/harfbuzz/issues/579
+
+ test/api/test-set.c | 40 ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+
+commit fd786c768f838ab61090004dd46b8cefeb270dfd
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Oct 25 14:31:22 2017 -0400
+
+    Use `mktemp -d` instead of `mktemp --directory`
+
+ test/shaping/record-test.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c4944920c0c11d6424d600ebc9130c9055382f80
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Oct 25 16:06:40 2017 -0400
+
+    Fix and run indic-script-extensions.tests
+
+ test/shaping/Makefile.am                         | 1 +
+ test/shaping/tests/indic-script-extensions.tests | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit d8df714251c61e13d7d12eb3f7393dd3a75a3719
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Wed Oct 25 16:06:01 2017 -0400
+
+    Fix code point iteration in narrow Python
+
+ test/shaping/hb_test_tools.py | 27 ++++++++++++++++++++++++++-
+ 1 file changed, 26 insertions(+), 1 deletion(-)
+
+commit 33ca3b67bfb5d9ae4e490c796c93793a7e03ef2c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 25 12:09:11 2017 -0400
+
+    Check for headers in builddir first, in check-*.sh
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=103346
+
+ src/check-c-linkage-decls.sh | 4 ++--
+ src/check-externs.sh         | 2 +-
+ src/check-header-guards.sh   | 2 +-
+ src/check-includes.sh        | 4 ++--
+ 4 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 9ac2e5c6c01db3ebe419e3aa07f4d1a3777d2bb6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 24 10:06:25 2017 -0400
+
+    check-externs.sh: Make output more verbose
+
+    Trying to figure out why this is failing on some Debian bots:
+    https://bugs.freedesktop.org/show_bug.cgi?id=103346
+
+    Maybe I should check for GNU grep specifically now that I'm using
+    -n as well.
+
+ src/check-externs.sh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3b7388aab6889b5d1fc602b5780a7b29da84e100
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 14:35:16 2017 -0400
+
+    1.6.2
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 30a591e3cef67818ef1ffec92c6a022b5a5f5e77
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 14:28:35 2017 -0400
+
+    [set] Rewrite another way :P
+
+ src/hb-set-private.hh | 25 +++++++++++++------------
+ 1 file changed, 13 insertions(+), 12 deletions(-)
+
+commit 8170801d78a5bf9480d8c06ade849b30bc4e2956
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 14:26:48 2017 -0400
+
+    [set] Fix crash
+
+    Ouch!  That's what happens when one plays with increment/decrement
+    operators!
+
+    Fixes https://github.com/behdad/harfbuzz/issues/578
+
+ src/hb-set-private.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 61d1c60a1c555c58205964df4e449ee57125a739
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 13:10:21 2017 -0400
+
+    [RELEASING] Format
+
+ RELEASING.md | 67
+ +++++++++++++++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 48 insertions(+), 19 deletions(-)
+
+commit 6a2e1649debd992211bf96ef80d075d2d04a49ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 13:01:34 2017 -0400
+
+    [doap] Switch to github issues
+
+    https://github.com/behdad/harfbuzz/pull/575#issuecomment-338514596
+
+ harfbuzz.doap | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8a898c1929cf7ffc9b0011461b34281ecc98705c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 13:00:36 2017 -0400
+
+    [RELEASING] Minor
+
+    https://github.com/behdad/harfbuzz/pull/575
+
+ RELEASING.md | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2ee710e02fad1a8a4b94589bb6f0b90e2aeb7121
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 08:37:48 2017 -0400
+
+    Minor
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dd33e4e96b9345a6b1a9051a6aa4b7d114c74f1e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 08:36:40 2017 -0400
+
+    [set] Don't use major()
+
+    Fixes https://github.com/behdad/harfbuzz/issues/577
+
+ src/hb-set-private.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit d0f0ff85b9fe959ef4b90f8daf58be73fca49dd0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 23 08:34:30 2017 -0400
+
+    [set] Don't use PAGE_SIZE
+
+    Fixes https://github.com/behdad/harfbuzz/issues/576
+
+ src/hb-set-private.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 57cf978fa314bd87405a2b133e58fcb116e574a6
+Merge: ce979454 6cc49762
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 18:24:59 2017 -0400
+
+    Merge commit '6cc49762c4fdfd0e2770a84d1b1f055acf42376f'
+
+commit ce979454400c3870717ba40b1065a2f3727cfb93
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 18:23:38 2017 -0400
+
+    [icu] Fix error check
+
+ src/hb-icu.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6cc49762c4fdfd0e2770a84d1b1f055acf42376f
+Merge: 8b9d9b71 19923279
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Oct 23 01:48:22 2017 +0330
+
+    Merge pull request #575 from behdad/releasing-edit
+
+    Clarify the last step of release
+
+commit 19923279abd4c7615e8b02e05a02ba18f5c0b298
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Mon Oct 23 01:47:51 2017 +0330
+
+    Clarify the last step of release
+
+ RELEASING.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8b9d9b71b04c9d5698ec146658b31381060c700d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:48:06 2017 -0400
+
+    Fix set initialization issues
+
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++------
+ src/hb-ot-shape.cc                   | 17 +++++++++--------
+ src/hb-set-private.hh                |  9 ---------
+ src/hb-set.cc                        |  6 ++++--
+ 4 files changed, 19 insertions(+), 25 deletions(-)
+
+commit 0ca915efc3734111a57ff71f05d9cbf0e8af3de9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:38:33 2017 -0400
+
+    1.6.1
+
+ NEWS         | 13 +++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit d59d5dc7d339deb45cc84cffd084b52752765a08
+Merge: ced86da7 3ee15a60
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:08:29 2017 -0400
+
+    Merge commit '3ee15a60358f4d894bbf2431d7a7df38b7acc4ce'
+
+commit ced86da7ddbbd0d64f8ba1290b8e67600b1db2d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:03:36 2017 -0400
+
+    Another try at fixing mingw32 build bot fail
+
+ src/hb-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bc1183aa6ba45a527084d391d6e7f801d6196060
+Merge: d45a2138 bfe0faf1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:06:00 2017 -0400
+
+    Merge commit 'bfe0faf1a2d39302129a7202994456afd96694ca'
+
+commit 3ee15a60358f4d894bbf2431d7a7df38b7acc4ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 17:03:36 2017 -0400
+
+    Another try at fixing mingw32 build bot fail
+
+ src/hb-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bfe0faf1a2d39302129a7202994456afd96694ca
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 22 15:54:50 2017 -0400
+
+    [docs] Deprecate hb_set_invert()
+
+ docs/harfbuzz-sections.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d45a2138d9d54eab158046d6503f1bb104efce25
+Merge: d8adaa97 41b18251
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Sat Oct 21 10:19:55 2017 +0330
+
+    Merge pull request #572 from fanc999/master.msvc
+
+    builds: Support HarfBuzz-GObject and introspection in CMake builds
+
+commit d8adaa97fbf33071b8a4b5c05c3f2f15f2fd22ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 20 13:57:43 2017 -0400
+
+    Another try at fixing build bots
+
+    hb-ot-shape.cc:287:18: error: comparison of constant 32 with
+    expression of type 'hb_unicode_general_category_t' is always true
+    [-Werror,-Wtautological-constant-out-of-range-compare]
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6058f98825e8f134893a1bbfb402e45d85b56ff0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 19 11:39:52 2017 -0700
+
+    Remove FLAG_SAFE()
+
+    No flag is safe, over time... See previous commit.
+
+ src/hb-ot-shape-complex-arabic.cc |  4 ++--
+ src/hb-ot-shape-complex-indic.cc  | 12 ++++++------
+ src/hb-ot-shape-complex-use.cc    |  2 +-
+ src/hb-private.hh                 |  5 ++---
+ src/hb-unicode-private.hh         |  4 ++--
+ 5 files changed, 13 insertions(+), 14 deletions(-)
+
+commit 7c561dacc3c5fb9306db8bda27b7289331bd523f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 19 11:35:51 2017 -0700
+
+    [myanmar] Fix unsafe usage of FLAG_SAFE()
+
+    The commit f559c633073f63b9d87cb2440048b4413cfa1c05 caused
+    "undefined-shift" errors in Myanmar shaper as we changed the
+    numeric value of type D from 19 to 32 there, making the
+    "FLAG_SAFE (info.myanmar_category())" wrong.
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3546
+
+ src/hb-ot-shape-complex-myanmar.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 41b1825196235d4337c76f97e09f0b7c6d6c56ae
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Thu Oct 19 18:36:32 2017 +0800
+
+    CMake builds: Support introspection builds
+
+    This adds support for introspection builds on Windows that is
+    enabled by
+    the HB_HAVE_INTROSPECTION option, which will also enable
+    HB_HAVE_GOBJECT
+    (and so HB_HAVE_GLIB) as they are required for introspection.
+
+    In order for this to work one must ensure that the Python installation
+    listed in PYTHON_EXECUTABLE is the same Python release series that was
+    used to build _giscanner.pyd (the Python module that is used by
+    g-ir-scanner), with the same architecture.  PKG_CONFIG_PATH and PATH
+    must be set correctly if $(PREFIX)\bin and/or $(PREFIX)\lib\pkgconfig
+    are not in the standard PATH and PKG_CONFIG_PATH, which is actually
+    in-line with the *NIX builds.
+
+ CMakeLists.txt | 161
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 154 insertions(+), 7 deletions(-)
+
+commit 53db221259b5eea4d2244321b2fe96beb39aef7d
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Oct 18 15:43:57 2017 +0800
+
+    CMake: Support building HarfBuzz-GObject
+
+    This adds support to the CMake build files to support building
+    HarfBuzz-GObject, which is actually a little bit complicated,
+    as we need to:
+
+    -Run glib-mkenums, which is a Python (for newer GLib/GObject) or PERL
+     (for older, pre 2.53.4, GLib/GObject) script.  This matters more for
+     Visual Studio builds as shebang lines are not supported, so we
+     need to
+     test-run it with PERL or Python to determine which is the correct
+     interpretor to use.
+
+    -Next, we need to replace strings in the sources that we obtain from
+     running glib-mkenums.  So, the solution here is to use a small
+     utility
+     CMake script for our purposes here, to maintain maximum
+     compatibility.
+
+    -Ensure that things do work in the Visual Studio IDE builds.
+
+ CMakeLists.txt             | 128
+ +++++++++++++++++++++++++++++++++++++++++++++
+ Makefile.am                |   1 +
+ replace-enum-strings.cmake |  21 ++++++++
+ 3 files changed, 150 insertions(+)
+
+commit 162575f2c69f519aae1b18ff1c501e7e4c2cdd4b
+Author: Chun-wei Fan <fanchunwei@src.gnome.org>
+Date:   Wed Oct 18 22:27:28 2017 +0800
+
+    CMake builds: Fix builds
+
+    Include the fallback sources in the build, and update
+    src/Makefile.sources so that it can be read by the CMake build files.
+
+    Fix a typo in the DirectWrite configure option so that we can properly
+    enable DirectWrite builds.
+
+    Also, when building the utility program, install them as well.
+
+ CMakeLists.txt       | 21 ++++++++++++++++++++-
+ src/Makefile.sources |  4 +++-
+ 2 files changed, 23 insertions(+), 2 deletions(-)
+
+commit d6f612fac800c31989c298b5101845baed2297b1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 17 16:32:12 2017 -0700
+
+    [bsearch] Micro-optimization
+
+ src/hb-open-type-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 41b1984be946cc2f53313dd48eac392cc8a3ad2b
+Author: Fredrik Roubert <fredrik@roubert.name>
+Date:   Tue Oct 17 15:06:31 2017 -0700
+
+    Switch from ICU deprecated unorm_normalize to unorm2_normalize. (#569)
+
+    The new unorm2_normalize has been public API since ICU 4.4, while
+    the old unorm_normalize has been deprecated since ICU 56.
+
+    Now, beginning with ICU 60, unorm_normalize will also be annotated
+    U_DEPRECATED and trigger the compiler -Wdeprecated-declarations
+    warning.
+
+ src/hb-icu.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit b98adefbb9ee45fc1e800a52f701bf4224e9bb81
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 17 12:00:34 2017 -0700
+
+    Update docs symbols
+
+ docs/harfbuzz-sections.txt | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ba8b56960733b25bbb88fbdb60e7e244127d6e0c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 17 11:16:36 2017 -0700
+
+    Try fixing build on VC
+
+    c:\projects\harfbuzz\src\hb-set-private.hh(151): error C2327:
+    'hb_set_t::page_t::v': is not a type name, static, or enumerator
+    [C:\projects\harfbuzz\build\harfbuzz.vcxproj]
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 80cc0a7e3e05fb7fcfbdc0188cb60b115ad47d04
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 17 11:14:48 2017 -0700
+
+    [coretext] Fix build
+
+    error: static_assert expression is not an integral constant expression
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a11249ee93439856ea2410524b993ac1f1379961
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 16 01:33:32 2017 -0400
+
+    [set] Fix merge logic
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ab8f327eb47184409d9e9208ca46b631d1afd0d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 18:21:35 2017 -0400
+
+    Ouch.
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bb9917913f735855aea54f41f10e0c7be3632e88
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 18:20:25 2017 -0400
+
+    [set] Disable vectorization
+
+    Fixes clang "non-const reference cannot bind to vector element" error.
+
+ src/hb-set-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 221ce6c18f2a1e878b68eb0a97f235efa4c044d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 17:58:58 2017 -0400
+
+    Fix bots
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0cf7d957b7ffb17c4cec75b631c9829327ab5d52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 17:01:31 2017 -0400
+
+    [set] Remove TODO items not worth pursuing
+
+ src/hb-set-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 10d43658e7655b36cb86e674dde8af4036b7cc52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:56:05 2017 -0400
+
+    [set] Speed up intersects()
+
+ src/hb-set-private.hh | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+commit 56ef4e0c52d5b474518bf0c1e4adba80f2ae6946
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:38:29 2017 -0400
+
+    Simplify hb_prealloced_array_t initialization
+
+ src/hb-private.hh | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 7737e87ac4582d57945f3ffbbae1012f62c6b482
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:21:03 2017 -0400
+
+    Properly detect vector_size attribute and use fallback otherwise
+
+ src/hb-private.hh     | 67
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-set-private.hh | 62
+ ++---------------------------------------------
+ 2 files changed, 69 insertions(+), 60 deletions(-)
+
+commit f8a0ec50e23264fdfe9e3a5a2e0453a87f415b3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:10:35 2017 -0400
+
+    [set] Add fallback implementation of int-vector type
+
+ src/hb-set-private.hh | 64
+ ++++++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 45 insertions(+), 19 deletions(-)
+
+commit deed4a48d15d4a475f8695aa3269547adf63867a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:53:09 2017 +0200
+
+    Faster hb_set_t
+
+    Fixes https://github.com/behdad/harfbuzz/pull/23
+
+ src/hb-private.hh     |  56 ++++---
+ src/hb-set-private.hh | 431
+ +++++++++++++++++++++++++++++++++++++++++---------
+ test/api/test-set.c   |   6 -
+ 3 files changed, 391 insertions(+), 102 deletions(-)
+
+commit 1d3971200be5b1c949d3eca185654e48584a0868
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:15:24 2017 +0200
+
+    Deprecate hb_set_invert()
+
+ src/hb-deprecated.h | 4 ++++
+ src/hb-set.cc       | 3 ++-
+ src/hb-set.h        | 3 ---
+ 3 files changed, 6 insertions(+), 4 deletions(-)
+
+commit 5e74044b6bd78c495561eb7d2981415d2c3336f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:15:06 2017 +0200
+
+    Add bfind() to prealloaced_array_t
+
+ src/hb-private.hh | 31 ++++++++++++++++---------------
+ 1 file changed, 16 insertions(+), 15 deletions(-)
+
+commit db5f7ef18916abb0907bc8b569a65c9c6bbd4015
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:00:22 2017 +0200
+
+    Inline another bsearch()
+
+ src/hb-ot-map-private.hh |  4 ++--
+ src/hb-private.hh        | 32 ++++++++++++++++++++++++++++----
+ 2 files changed, 30 insertions(+), 6 deletions(-)
+
+commit 6fb4ac73f94636d19fcac143472b84f9d91985c9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 16:00:09 2017 +0200
+
+    Add popcount for 64bit ints
+
+ src/hb-private.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 473b17af4d421f4ce7ac18c769731bb2aa4088f8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 14:10:34 2017 +0200
+
+    Remove unused hb_cache_t
+
+ src/Makefile.sources    |  1 -
+ src/hb-cache-private.hh | 74
+ -------------------------------------------------
+ src/hb-ft.cc            |  2 --
+ 3 files changed, 77 deletions(-)
+
+commit a433e60a43c4594c41a82c3741d3f870f6eec247
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 14:09:46 2017 +0200
+
+    Remove unused hb_frozen_set_t
+
+ src/hb-set-private.hh | 55
+ ---------------------------------------------------
+ 1 file changed, 55 deletions(-)
+
+commit 826a1daf2f2075459ff25a20ed8abec030d95c52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 14:09:05 2017 +0200
+
+    Move set-digests into their own header file
+
+ src/Makefile.sources         |   1 +
+ src/hb-ot-layout-private.hh  |   2 +-
+ src/hb-set-digest-private.hh | 144
+ +++++++++++++++++++++++++++++++++++++++++++
+ src/hb-set-private.hh        | 113 ---------------------------------
+ 4 files changed, 146 insertions(+), 114 deletions(-)
+
+commit 3c13e153fe89d559d33027c0a5b30a19a6de1bad
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 14:02:58 2017 +0200
+
+    Try fixing AppVeyor bots
+
+ src/hb-private.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7e3015a315afe2312134ac33b9cb2d73689a044f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 12:13:19 2017 +0200
+
+    Fix warnings
+
+ src/hb-font.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2075008f3e0b1cfbd7006f1d8c1fa22ac014f4bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 12:12:10 2017 +0200
+
+    Use C++11
+
+ configure.ac | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit dbdbfe3d7b36613d893832dcb1884c756c20bfda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 12:11:08 2017 +0200
+
+    Use nullptr instead of NULL
+
+ src/hb-blob.cc                             |  12 ++--
+ src/hb-buffer-serialize.cc                 |  16 ++---
+ src/hb-buffer.cc                           |  10 +--
+ src/hb-common.cc                           |  18 ++---
+ src/hb-coretext.cc                         |  66 ++++++++---------
+ src/hb-directwrite.cc                      |  28 ++++----
+ src/hb-face.cc                             |  10 +--
+ src/hb-font.cc                             |  32 ++++-----
+ src/hb-ft.cc                               |  56 +++++++--------
+ src/hb-glib.cc                             |   2 +-
+ src/hb-gobject-structs.cc                  |   2 +-
+ src/hb-graphite2.cc                        |  26 +++----
+ src/hb-icu.cc                              |   4 +-
+ src/hb-mutex-private.hh                    |   2 +-
+ src/hb-object-private.hh                   |   2 +-
+ src/hb-open-type-private.hh                |  32 ++++-----
+ src/hb-ot-cbdt-table.hh                    |   4 +-
+ src/hb-ot-cmap-table.hh                    |   2 +-
+ src/hb-ot-font.cc                          |  42 +++++------
+ src/hb-ot-layout-common-private.hh         |  14 ++--
+ src/hb-ot-layout-gsub-table.hh             |   2 +-
+ src/hb-ot-layout-gsubgpos-private.hh       |  54 +++++++-------
+ src/hb-ot-layout-jstf-table.hh             |   4 +-
+ src/hb-ot-layout.cc                        |  30 ++++----
+ src/hb-ot-map-private.hh                   |   6 +-
+ src/hb-ot-map.cc                           |   4 +-
+ src/hb-ot-math-table.hh                    |   8 +--
+ src/hb-ot-shape-complex-arabic-fallback.hh |   8 +--
+ src/hb-ot-shape-complex-arabic.cc          |  32 ++++-----
+ src/hb-ot-shape-complex-default.cc         |  22 +++---
+ src/hb-ot-shape-complex-hangul.cc          |  12 ++--
+ src/hb-ot-shape-complex-hebrew.cc          |  18 ++---
+ src/hb-ot-shape-complex-indic.cc           |  12 ++--
+ src/hb-ot-shape-complex-myanmar.cc         |  40 +++++------
+ src/hb-ot-shape-complex-private.hh         |  26 +++----
+ src/hb-ot-shape-complex-thai.cc            |  22 +++---
+ src/hb-ot-shape-complex-tibetan.cc         |  20 +++---
+ src/hb-ot-shape-complex-use.cc             |  16 ++---
+ src/hb-ot-shape-private.hh                 |   2 +-
+ src/hb-ot-shape.cc                         |   8 +--
+ src/hb-ot-tag.cc                           |   2 +-
+ src/hb-ot-var.cc                           |   2 +-
+ src/hb-private.hh                          |  37 +++++-----
+ src/hb-set-private.hh                      |   2 +-
+ src/hb-shape-plan.cc                       |  24 +++----
+ src/hb-shape.cc                            |   8 +--
+ src/hb-shaper-private.hh                   |   6 +-
+ src/hb-shaper.cc                           |   6 +-
+ src/hb-ucdn.cc                             |   2 +-
+ src/hb-unicode.cc                          |   4 +-
+ src/hb-uniscribe.cc                        |  50 ++++++-------
+ src/main.cc                                |   4 +-
+ src/test-buffer-serialize.cc               |   8 +--
+ src/test-size-params.cc                    |   6 +-
+ src/test-would-substitute.cc               |   8 +--
+ src/test.cc                                |  12 ++--
+ util/ansi-print.cc                         |   2 +-
+ util/hb-fc.cc                              |   6 +-
+ util/hb-ot-shape-closure.cc                |  10 +--
+ util/hb-shape.cc                           |  14 ++--
+ util/helper-cairo.cc                       |  12 ++--
+ util/main-font-text.hh                     |   4 +-
+ util/options.cc                            | 110
+ ++++++++++++++---------------
+ util/options.hh                            |  56 +++++++--------
+ util/shape-consumer.hh                     |  10 +--
+ 65 files changed, 563 insertions(+), 568 deletions(-)
+
+commit fbb937b6807597c9ae002280c6a6278a97b701f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 12:04:16 2017 +0200
+
+    Don't use NULL in public headers
+
+ src/hb-buffer.h | 4 ++--
+ src/hb-common.h | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit c3448e8d21963eb7fc357a37a7a426a4bf130ef3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 12:02:00 2017 +0200
+
+    Use static_assert instead of custom ASSERT_STATIC
+
+ src/hb-buffer-private.hh                   |  4 ++--
+ src/hb-buffer.cc                           |  2 +-
+ src/hb-cache-private.hh                    |  4 ++--
+ src/hb-coretext.cc                         |  2 +-
+ src/hb-open-type-private.hh                |  6 +++---
+ src/hb-ot-layout-common-private.hh         |  2 +-
+ src/hb-ot-layout-gdef-table.hh             |  6 +++---
+ src/hb-ot-layout.cc                        | 14 ++++++------
+ src/hb-ot-map.cc                           |  2 +-
+ src/hb-ot-math-table.hh                    |  4 ++--
+ src/hb-ot-shape-complex-arabic-fallback.hh |  6 +++---
+ src/hb-ot-shape-complex-indic.cc           |  2 +-
+ src/hb-ot-shape-complex-use.cc             |  2 +-
+ src/hb-private.hh                          | 34
+ +++++++++++++-----------------
+ src/hb-set-private.hh                      |  8 +++----
+ src/hb-uniscribe.cc                        |  2 +-
+ util/options.cc                            |  3 ++-
+ 17 files changed, 50 insertions(+), 53 deletions(-)
+
+commit 76dcbf8b23475b25f8f1918f982bfd8f0dd3456e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 11:24:35 2017 +0200
+
+    Add polyfill for static_assert and nullptr
+
+    Also fix hb_assert_constant_t.
+
+ src/hb-private.hh | 38 ++++++++++++++++++++++++++++++++++----
+ 1 file changed, 34 insertions(+), 4 deletions(-)
+
+commit dad431e75bf998dcb09cff795c0f1083b3bd5449
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 10:55:32 2017 +0200
+
+    [util] Include hb-private.hh
+
+    Simplifies compatibility issues by centralizing all boilerplate code
+    in hb-private.hh.
+
+ util/options.hh | 31 +++++--------------------------
+ 1 file changed, 5 insertions(+), 26 deletions(-)
+
+commit 81e2b9b8a959cb7d7503f58fca70761238697fc1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 15 10:48:19 2017 +0200
+
+    Never skip over CGJ
+
+    We might want to tweak this some more.  For now, never skipping over
+    it is better behavior than always skipping.
+
+    Part of https://github.com/behdad/harfbuzz/issues/554
+
+ src/hb-ot-layout-private.hh                          |  19
+ +++++++++++--------
+ .../bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf     | Bin 0 ->
+ 2468 bytes
+ test/shaping/tests/default-ignorables.tests          |   1 +
+ 3 files changed, 12 insertions(+), 8 deletions(-)
+
+commit 25846cc39fb8a9516b8de4333f909851d471156f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 13 16:30:33 2017 +0200
+
+    1.6.0
+
+ NEWS                   | 35 +++++++++++++++++++++++++++++++++++
+ configure.ac           |  2 +-
+ docs/harfbuzz-docs.xml |  4 ++++
+ 3 files changed, 40 insertions(+), 1 deletion(-)
+
+commit 74f1b88e3720103562552780af7058131c5492d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 13 11:01:55 2017 +0200
+
+    [ucdn] Fix compiler warnings
+
+ src/hb-ucdn.cc | 21 +++++++++++++--------
+ 1 file changed, 13 insertions(+), 8 deletions(-)
+
+commit c2cf68dbdffcbf45297dd161b4b6b2de667b5ae4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 13 10:30:19 2017 +0200
+
+    [coretext] Fix build
+
+ src/hb-coretext.cc | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 95883fc5d486ecd194253bb223802f930de73e28
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Oct 13 10:21:07 2017 +0200
+
+    [coretext] Pass correct font size to CoreText
+
+    CoreText "point"s are not typographic points, but CSS pixels.  Ie.
+    they are 96 per inch, not 72 per inch.
+
+ src/hb-coretext.cc | 18 +++++++++++-------
+ 1 file changed, 11 insertions(+), 7 deletions(-)
+
+commit 4f9a83ec2109b754a75c962e88117d063e6fed43
+Merge: fa48ccbe 40b05d7b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 12 14:08:58 2017 +0200
+
+    Merge remote-tracking branch 'origin/master'
+
+commit fa48ccbe127a2e61ab316f3638e4056940964dae
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 12 14:07:37 2017 +0200
+
+    [indic] Special-case Kannada Ra,H,ZWJ sequence
+
+    Fixes https://github.com/behdad/harfbuzz/issues/435
+
+ src/hb-ot-shape-complex-indic.cc                         |  15
+ +++++++++++++++
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf | Bin 0 ->
+ 2984 bytes
+ test/shaping/tests/indic-special-cases.tests             |   3 +++
+ 4 files changed, 19 insertions(+)
+
+commit 40b05d7b770b8045f176f66231c412b32482d874
+Author: n8willis <n8willis@users.noreply.github.com>
+Date:   Thu Oct 12 12:48:48 2017 +0100
+
+    Replacing 'cluster' with 'syllable' when comments describe certain
+    Indic shaping behavior (#563)
+
+    * Clarified wording of syllable/cluster behavior in Uniscribe in
+    final_reordering; changed one other probable typo.
+
+    * Additional syllable/cluster swap in comments for final reordering
+    and for initial-reordering matra decomposition.
+
+ src/hb-ot-shape-complex-indic.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 6bac4ac2bebb612debecc8ec10b845e977c0afe1
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Oct 12 15:15:49 2017 +0330
+
+    Minor BUILD.md fix (#565)
+
+ BUILD.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8923033eb2dab75e9361e9ea1333deb1213393ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 12 12:01:48 2017 +0200
+
+    [coretext] Use fabs() to silence compiler warning
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit dd4b321b4a429c6e6a28441ea9ae52f8f9dd1dad
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Thu Oct 12 11:49:37 2017 +0200
+
+    [coretext] Activate tracking for system fonts
+
+    Another attempt at fully fixing
+    https://github.com/behdad/harfbuzz/issues/360
+
+ src/hb-coretext.cc | 28 +++++++++++++++++++++++++++-
+ 1 file changed, 27 insertions(+), 1 deletion(-)
+
+commit 6760021d6f4beef852c6560607b32090bcfa5acb
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Oct 12 12:05:08 2017 +0300
+
+    CMakelists.txt fix for Freetype builds (#564)
+
+    Instead of searching for freetype using pkg-config, use the
+    FindFreetype
+    feature of CMake. This allows for better integration with other
+    projects
+    that make use of CMake.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/518
+
+ CMakeLists.txt | 24 +++++++-----------------
+ 1 file changed, 7 insertions(+), 17 deletions(-)
+
+commit 6a2cbc6ef51680309eb3970ed9c66ff766dc8040
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 12 10:46:09 2017 +0200
+
+    [coretext] Use fabsf() instead of abs()
+
+    Fixes bots.
+
+    Link libharfbuzz.so with -lm.  Surprising that we survived without
+    it so far!
+
+ src/Makefile.am    | 2 +-
+ src/harfbuzz.pc.in | 2 +-
+ src/hb-coretext.cc | 5 +++--
+ 3 files changed, 5 insertions(+), 4 deletions(-)
+
+commit dfeccd073a5e78f6a2c630355c04121b70d2b4aa
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Thu Oct 12 12:11:47 2017 +0330
+
+    Remove nmake port of harfbuzz (#562)
+
+ BUILD.md                        |  12 ++-
+ Makefile.am                     |   2 +-
+ appveyor.yml                    |  30 ------
+ configure.ac                    |   2 -
+ win32/Makefile.am               |  18 ----
+ win32/Makefile.vc               |  67 ------------
+ win32/README.txt                |  97 -----------------
+ win32/build-rules-msvc.mak      | 130 -----------------------
+ win32/config-msvc.mak           | 230
+ ----------------------------------------
+ win32/config.h.win32.in         | 158 ---------------------------
+ win32/create-lists-msvc.mak     | 147 -------------------------
+ win32/create-lists.bat          |  42 --------
+ win32/detectenv-msvc.mak        | 146 -------------------------
+ win32/generate-msvc.mak         |  39 -------
+ win32/hb-introspection-msvc.mak |  42 --------
+ win32/info-msvc.mak             | 162 ----------------------------
+ win32/install.mak               |  25 -----
+ win32/introspection-msvc.mak    |  73 -------------
+ win32/pc_base.py                | 124 ----------------------
+ win32/replace.py                | 115 --------------------
+ win32/sed-enums-srcs.py         |  36 -------
+ win32/setup.py                  |  62 -----------
+ 22 files changed, 9 insertions(+), 1750 deletions(-)
+
+commit 4e4781319b36bba154f3e5d4eb678945d8f6b4fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Oct 12 10:33:16 2017 +0200
+
+    [ft] Add hb_ft_font_changed()
+
+    When the font size or variations settings on underlying FT_Face
+    change,
+    one can call hb_ft_font_changed() and continue using hb_font
+    created using
+    hb_ft_font_create().
+
+    Fixes https://github.com/behdad/harfbuzz/issues/559
+
+    New API:
+    hb_ft_font_changed()
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-ft.cc               | 15 +++++++++++++--
+ src/hb-ft.h                |  8 +++++++-
+ 3 files changed, 21 insertions(+), 3 deletions(-)
+
+commit 94b3cafc3a042aea69ee7040227557fe98a21d87
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 17:22:44 2017 +0200
+
+    Add hb_face_get_table_tags()
+
+    New API:
+    hb_face_get_table_tags()
+
+    Fixes https://github.com/behdad/harfbuzz/issues/560
+
+ src/hb-face.cc              | 29 +++++++++++++++++++++++++++++
+ src/hb-face.h               |  5 +++++
+ src/hb-open-file-private.hh | 18 ++++++++++++++++++
+ 3 files changed, 52 insertions(+)
+
+commit e1b6d923021f68713784e2fd68f631c053ef3497
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:51:31 2017 +0200
+
+    Remove cast of functions to (hb_destroy_func_t)
+
+    Fixes https://github.com/behdad/harfbuzz/issues/474
+
+ src/hb-blob.cc     |  8 +++++++-
+ src/hb-coretext.cc | 10 ++++++++--
+ src/hb-face.cc     |  6 ++++--
+ src/hb-ft.cc       | 20 +++++++++++---------
+ src/hb-glib.cc     |  9 ++++++++-
+ src/hb-ot-font.cc  |  6 ++++--
+ 6 files changed, 42 insertions(+), 17 deletions(-)
+
+commit 717fcb51dd051ca27d8537e5cf3a32d0447f78b5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:38:21 2017 +0200
+
+    [coretext] Minor
+
+ src/hb-coretext.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 374bb48d902025e8b8d8acbe525ff43540daee36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:37:50 2017 +0200
+
+    Change ptem API to make 0 mean unset
+
+ src/hb-font.cc | 5 ++---
+ src/hb-font.h  | 2 +-
+ 2 files changed, 3 insertions(+), 4 deletions(-)
+
+commit 06c14225b20aa43ae88d362be2de577f6cf3f7b9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:29:53 2017 +0200
+
+    [coretext] Minor
+
+ src/hb-coretext.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a4b46212c5e76494cfde5af6f299e08902aff0d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:29:22 2017 +0200
+
+    [coretext] Adjust font size check for 0
+
+ src/hb-coretext.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 269cf1ca82c34c6f6ea126e7333743e5c381453b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:24:22 2017 +0200
+
+    Correctly initialize ptem
+
+ src/hb-font.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 84686bf4c75c001e7cfb2eabdf391b2e76cae335
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 15:02:48 2017 +0200
+
+    [coretext-aat] Also pass through CoreText if font has kerx table
+
+    SFNSText has kerx table which apparently is applied.
+
+ src/hb-coretext.cc | 20 +++++++++-----------
+ src/hb-coretext.h  |  1 +
+ 2 files changed, 10 insertions(+), 11 deletions(-)
+
+commit 296d0134c9d04c82cc0bffd545b0fd9a308a2530
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 14:09:30 2017 +0200
+
+    [coretext] Change default point size to 12
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7b23c286a71883ac3e5777a2dee262af48c76854
+Merge: 8d450dd1 a5ebe1d4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 13:35:32 2017 +0200
+
+    Merge branch 'coretext-optical-sizing'
+
+    Should fix https://github.com/behdad/harfbuzz/issues/360
+
+commit a5ebe1d4aec41bc5e289a7969e5e5f7bb57733b6
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Wed Oct 11 13:32:38 2017 +0200
+
+    [coretext] Recreate CTFont if pt size changed
+
+    Attempt at fixing #360
+
+ src/hb-coretext.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit db7a73ce0781d1fec0235e419ac448565dcfc8ca
+Author: Dominik Röttsches <drott@chromium.org>
+Date:   Wed Oct 11 13:24:39 2017 +0200
+
+    [coretext] Fix build
+
+ src/hb-coretext.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit f33413075655e6383cd16bc31f0bf804dcec1c64
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 13:17:46 2017 +0200
+
+    [coretext] Another try
+
+ src/hb-coretext.cc | 32 +++++++++++++-------------------
+ 1 file changed, 13 insertions(+), 19 deletions(-)
+
+commit a8e466c3c12a3499028cb576721e5f85ff4cbf2d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 13:05:59 2017 +0200
+
+    [coretext] Move CT_Font to font data
+
+    Towards implementing optical sizing.  Untested; won't compile.
+
+    https://github.com/behdad/harfbuzz/issues/360
+
+ src/hb-coretext.cc | 85
+ ++++++++++++++++++++++++------------------------------
+ 1 file changed, 37 insertions(+), 48 deletions(-)
+
+commit f9b4c6570a4725eec5393f86e6468a189ac8c6be
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 12:51:25 2017 +0200
+
+    [coretext] Move font size to a macro
+
+ src/hb-coretext.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 8d450dd188dea2d63a03f74d903a76741de8a217
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 12:43:46 2017 +0200
+
+    Infrastructure for creating CTFont with correct font size
+
+    https://github.com/behdad/harfbuzz/issues/360
+
+ src/hb-shaper-private.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 16d02a58cf187dbcecc1c796acdc5d3a70ca288e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 12:28:06 2017 +0200
+
+    [coretext] Change default font size from 36 to 18
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c0c2dbc871667c32ac8eedb11de64078ef24a429
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 12:23:35 2017 +0200
+
+    Remove dirty tracking
+
+    Turns out I don't need this to resolve CoreText optical sizing
+    issue after all.
+
+    https://github.com/behdad/harfbuzz/issues/360
+
+ src/hb-face-private.hh |  9 ---------
+ src/hb-face.cc         | 17 -----------------
+ src/hb-font-private.hh | 13 -------------
+ src/hb-font.cc         | 39 ---------------------------------------
+ 4 files changed, 78 deletions(-)
+
+commit b57f18da700837a57df9606290160ea6e96accc8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 11:47:47 2017 +0200
+
+    Add hb_font_[sg]et_ptem() to set/get point size on font
+
+    New API:
+    hb_font_set_ptem()
+    hb_font_get_ptem()
+
+    Needed for hb-coretext optical sizing:
+    https://github.com/behdad/harfbuzz/issues/360
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-font-private.hh     |  5 ++++-
+ src/hb-font.cc             | 41 +++++++++++++++++++++++++++++++++++++++++
+ src/hb-font.h              | 10 ++++++++++
+ 4 files changed, 57 insertions(+), 1 deletion(-)
+
+commit 3f9370d9e5051b1abf2fc94be2e10a39c8069f75
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 11 11:34:53 2017 +0200
+
+    Fix TODO item
+
+ src/hb-font.cc | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit 5f50f8837f918ca1d176355d1538e0e6c9703f41
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 7 13:17:33 2017 +0200
+
+    [arabic] Fix cluster merging
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c2545b921523538e8237ff6a2591f6cb75ee79f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Oct 7 12:56:53 2017 +0200
+
+    Add check for HB_EXTERNs
+
+    https://github.com/behdad/harfbuzz/pull/555
+
+ src/Makefile.am      |  1 +
+ src/check-externs.sh | 21 +++++++++++++++++++++
+ 2 files changed, 22 insertions(+)
+
+commit 48a9406839f086735a05a2f1a07987b8a6bd6d33
+Author: fanc999 <fanc999@yahoo.com.tw>
+Date:   Sat Oct 7 18:57:14 2017 +0800
+
+    Fix build of HarfBuzz tools and HarfBuzz-GObject on Visual Studio
+    (#555)
+
+    * hb-buffer.h: Mark hb_buffer_diff() for export
+
+    This will fix the tools builds on Visual Studio, as the symbol is used
+    by the tools.
+
+    * build: Adapt NMake Makefiles for GLib 2.53.4 or later
+
+    glib-mkenums was ported from a PERL script to a Python script, so we
+    need to update how we generate the enum sources for HarfBuzz-GObject
+    in
+    the NMake builds.  Let this be known in the build documentation
+    for MSVC
+    builds.
+
+    One of the problems with the underlying cmd.exe that the NMake
+    Makefiles
+    run on is that shebang lines are not recognized, so we need to to test
+    run the script with Python and see whether it succeeded by outputing a
+    source file that is larger than 0 in file size (since running the PERL
+    version of the script will clearly fail and cause an empty file to be
+    created).
+
+    If it succeeds, we then run a small Python utility script that
+    makes the
+    necessary string replacements, and we are done.  If that fails,
+    then we
+    run the glib-mkenums script with PERL, and do the replacements
+    with the
+    PERL one-liners as we did before.
+
+    We need to make replace.py use latin-1 encoding when using Python
+    3.x to
+    cope with the copyright sign that is in the generated enum sources.
+
+ src/hb-buffer.h         |  2 +-
+ win32/Makefile.am       |  4 +++-
+ win32/README.txt        |  5 +++--
+ win32/generate-msvc.mak | 17 ++++++++++++-----
+ win32/info-msvc.mak     |  5 ++++-
+ win32/replace.py        |  2 +-
+ win32/sed-enums-srcs.py | 36 ++++++++++++++++++++++++++++++++++++
+ 7 files changed, 60 insertions(+), 11 deletions(-)
+
+commit c9e2cf6f55c7682b8e7020654945ddd074ebfd24
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 16:59:22 2017 +0200
+
+    [ot] Remove 'mal' and 'gle' lang tags
+
+    Fixes https://github.com/behdad/harfbuzz/issues/477
+
+ src/hb-ot-tag.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 621c49cb8657a79ee6897c4d313d0e825b2b228f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 15:06:48 2017 +0200
+
+    Improve performance of ligature component matching
+
+    This O(N^2) was introduced in
+    8b2c94c43fd335b944d5e5487265706b8e0f9041.
+    Make it O(N).
+
+ src/hb-ot-layout-gsubgpos-private.hh | 37
+ +++++++++++++++++++++++-------------
+ 1 file changed, 24 insertions(+), 13 deletions(-)
+
+commit ab8d70ec7023e51ba6fd7267d2b41c5f95ef0787
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 14:47:10 2017 +0200
+
+    [arabic] Implement Unicode Arabic Mark Ordering Algorithm UTR#53
+
+    Fixes https://github.com/behdad/harfbuzz/issues/509
+
+ src/hb-ot-shape-complex-arabic.cc                  |  75
+ +++++++++++++++++++++
+ src/hb-ot-shape-complex-default.cc                 |   1 +
+ src/hb-ot-shape-complex-hangul.cc                  |   1 +
+ src/hb-ot-shape-complex-hebrew.cc                  |   1 +
+ src/hb-ot-shape-complex-indic.cc                   |   1 +
+ src/hb-ot-shape-complex-myanmar.cc                 |   2 +
+ src/hb-ot-shape-complex-private.hh                 |  12 ++++
+ src/hb-ot-shape-complex-thai.cc                    |   1 +
+ src/hb-ot-shape-complex-tibetan.cc                 |   1 +
+ src/hb-ot-shape-complex-use.cc                     |   1 +
+ src/hb-ot-shape-normalize.cc                       |   8 ++-
+ test/shaping/Makefile.am                           |   1 +
+ .../24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf   | Bin 0 -> 7160 bytes
+ .../94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf   | Bin 0 -> 6816 bytes
+ test/shaping/record-test.sh                        |   2 +-
+ test/shaping/tests/arabic-mark-order.tests         |   2 +
+ 16 files changed, 106 insertions(+), 3 deletions(-)
+
+commit b6fe0ab636ffac0a246e160b3508cc4841cb1823
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 13:37:08 2017 +0200
+
+    Add info_cc() convenience macro
+
+ src/hb-ot-layout-private.hh  | 2 ++
+ src/hb-ot-shape-normalize.cc | 6 +++---
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit 7f9e7f8689e1d260596f5256947dfbd474afb1ec
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 13:20:33 2017 +0200
+
+    Adjust normalizer for out-of-order marks
+
+    We are going to implement Unicode Arabic Mark Ordering Algorithm:
+
+      http://www.unicode.org/reports/tr53/tr53-1.pdf
+
+    which will reorder marks out of their sorted ccc order.  Adjust
+    normalizer to stop combining as soon as dangerous ordering is
+    detected.
+
+ src/hb-ot-shape-normalize.cc | 62
+ ++++++++++++++++++++++++++------------------
+ 1 file changed, 37 insertions(+), 25 deletions(-)
+
+commit a252ad61f077c3b7bbfd8335e1b105a57beb58ce
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 13:07:08 2017 +0200
+
+    Minor
+
+ src/hb-unicode-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4c05a405acc25c4ef0d70a97c0ae59013abca2df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 13:06:51 2017 +0200
+
+    Revert "Treat HAMZA ABOVE similar to SHADD for sorting purposes"
+
+    This reverts commit 5a330575768f5a213072230b9ec8faabac9c5737.
+
+    Proper fix coming soon.
+
+ src/hb-unicode-private.hh | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit d695cacbf4dd5f77b5e7134cf60553775c515ef1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 11:33:47 2017 +0200
+
+    Shorthand format controls should not be ignored
+
+    Fixes https://github.com/behdad/harfbuzz/issues/503
+
+ src/hb-unicode-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 50e95229d79bd258ad1d3f6392bfffa128f6df2a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Oct 4 11:28:04 2017 +0200
+
+    Add Chinantec language tags
+
+    Fixes https://github.com/behdad/harfbuzz/issues/516
+
+ src/hb-ot-tag.cc | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 9786fcd8fdc0adbe8b6269ddd174ee2818d6fa9e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 17:22:43 2017 +0200
+
+    Fix GPOS v_origin ordering
+
+    This should affect mark attachment in vertical text.  I have no font
+    to test,
+    but this sounds the right order.
+
+    Noticed while debugging https://github.com/behdad/harfbuzz/issues/532
+
+ src/hb-ot-shape.cc | 44 ++++++++++++++++++++------------------------
+ 1 file changed, 20 insertions(+), 24 deletions(-)
+
+commit 63db692fa9efcd760f2e90f93f4e1428d79a3433
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 16:00:18 2017 +0200
+
+    [indic] Fix shaping of U+0AFB GUJARATI SIGN SHADDA
+
+    Fixes https://github.com/behdad/harfbuzz/issues/552
+
+ src/hb-ot-shape-complex-indic-private.hh | 2 +-
+ src/hb-ot-shape-complex-indic.cc         | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit f559c633073f63b9d87cb2440048b4413cfa1c05
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 15:20:07 2017 +0200
+
+    [indic] Implement Consonent_With_Stacker
+
+    Fixes https://github.com/behdad/harfbuzz/issues/528
+
+ src/hb-ot-shape-complex-indic-machine.rl   | 5 +++--
+ src/hb-ot-shape-complex-indic-private.hh   | 7 ++++---
+ src/hb-ot-shape-complex-myanmar-machine.rl | 5 +++--
+ src/hb-ot-shape-complex-myanmar.cc         | 6 +++---
+ 4 files changed, 13 insertions(+), 10 deletions(-)
+
+commit e07669fc43c0e23d337ad984aa128c3a08c9c1bb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 14:57:14 2017 +0200
+
+    [use] Implement Consonant_With_Stacker
+
+    Related to https://github.com/behdad/harfbuzz/issues/528
+
+ src/gen-use-table.py                   | 7 ++++---
+ src/hb-ot-shape-complex-use-machine.rl | 5 +++--
+ src/hb-ot-shape-complex-use-private.hh | 3 ++-
+ src/hb-ot-shape-complex-use-table.cc   | 6 ++++--
+ 4 files changed, 13 insertions(+), 8 deletions(-)
+
+commit 3ca9c92aa68956889642690e176c9161ff52edfe
+Author: David Corbett <corbett.dav@husky.neu.edu>
+Date:   Tue Oct 3 08:07:02 2017 -0400
+
+    Test Consonant_With_Stacker in Kannada (#530)
+
+ test/shaping/Makefile.am                           |   1 +
+ test/shaping/fonts/COPYING                         | 100
+ +++++++++++++++++++++
+ .../341421e629668b1a1242245d39238ca48432d35d.ttf   | Bin 0 -> 1084 bytes
+ .../55c88ebbe938680b08f92c3de20713183e0c7481.ttf   | Bin 0 -> 3300 bytes
+ .../663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf   | Bin 0 -> 1204 bytes
+ .../a014549f766436cf55b2ceb40e462038938ee899.ttf   | Bin 0 -> 2720 bytes
+ .../tests/indic-consonant-with-stacker.tests       |   4 +
+ 7 files changed, 105 insertions(+)
+
+commit 5d98de1f382254a8a21fd9a04b642268a21be16f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 13:46:25 2017 +0200
+
+    Tweak mark-base attachment
+
+    Apparently a base glyph can also become an attached component of a
+    ligature if the ligature-forming lookup used IgnoreBase.  This was
+    being confused with a non-first component of a MultipleSubst and
+    hence not matched for mark-attachment.  Tweak test to fix.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/543
+
+ src/hb-ot-layout-gpos-table.hh                           |   4 +++-
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/98b7887cff91f722b92a8ff800120954606354f9.ttf | Bin 0 ->
+ 1168 bytes
+ test/shaping/tests/mark-attachment.tests                 |   1 +
+ 4 files changed, 5 insertions(+), 1 deletion(-)
+
+commit ea772932d2430ebc7ea712a8c46ec2500966225d
+Merge: 771970ef c44657a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 13:25:44 2017 +0200
+
+    Merge commit 'c44657a05d565ec5f2c32ac15d4ecfbee00ac5f7'
+
+commit 771970efa15fc0b77841b7f0a3e266cdcf51246e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 13:23:31 2017 +0200
+
+    Minor
+
+ .travis.yml  | 2 +-
+ appveyor.yml | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 09cbeb2246217dce61ccc0638edb6211facca4b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 13:22:07 2017 +0200
+
+    Make bots happy
+
+    Fixes https://github.com/behdad/harfbuzz/issues/551
+
+ test/shaping/tests/indic-syllable.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c44657a05d565ec5f2c32ac15d4ecfbee00ac5f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Oct 3 13:14:17 2017 +0200
+
+    Tweak input matching some more
+
+    Followup to 8b2c94c43fd335b944d5e5487265706b8e0f9041
+
+    Allow matching sequences of marks attached to different ligatures,
+    as supposedly the base of the subsequent marks were already jumped
+    over.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit bbe94777c94637da1bcf944124b5079662618a1e
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Mon Oct 2 22:36:14 2017 +0200
+
+    Print test-suite.log when CI builds fail
+
+ .travis.yml  | 2 +-
+ appveyor.yml | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 1633513996f902e95642fcaf9205dded55f509ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 20:28:56 2017 +0200
+
+    Add test for U+0A51
+
+    New Indic numbers are:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366355 out of 366457 tests passed. 102 failed (0.0278341%)
+    GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%)
+    KANNADA: 951201 out of 951913 tests passed. 712 failed (0.0747968%)
+    KHMER: 299071 out of 299124 tests passed. 53 failed (0.0177184%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+    Before 71c0a1429db7c7e7e32507be248c9457e1cbfc7d GURMUKHI used to be
+    at 15,
+    because Uniscribe seems to allow this character standalone, but
+    that looks
+    wrong.
+
+ .../sha1sum/1735326da89f0818cd8c51a0600e9789812c0f94.ttf | Bin 0 ->
+ 1008 bytes
+ test/shaping/tests/indic-syllable.tests                  |   2 ++
+ 2 files changed, 2 insertions(+)
+
+commit 8b2c94c43fd335b944d5e5487265706b8e0f9041
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 20:02:45 2017 +0200
+
+    Tweak ligature component matching for ligature formation
+
+    If two marks want to ligate and they belong to different components
+    of the
+    same ligature glyph, and said ligature glyph is to be ignored
+    according to
+    mark-filtering rules, then allow.
+
+    Example Burmese senquence:
+
+      U+1004,U+103A,U+1039,U+101B,U+103D,U+102D
+
+    Test font provided by Norbert Lindenberg.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/545
+
+ src/hb-ot-layout-gsubgpos-private.hh               |  59
+ +++++++++++++++++----
+ .../a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf   | Bin 0 -> 1384 bytes
+ test/shaping/tests/ligature-id.tests               |   1 +
+ 3 files changed, 51 insertions(+), 9 deletions(-)
+
+commit 71c0a1429db7c7e7e32507be248c9457e1cbfc7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:56:10 2017 +0200
+
+    [indic] Fix shaping of U+0A51
+
+    Mark it as matra below to allow the sequence U+0A15, U+0A51, U+0A47.
+    Oh well...
+
+    Fixes https://github.com/behdad/harfbuzz/issues/524
+
+ src/hb-ot-shape-complex-indic.cc                         |   6 ++++++
+ .../sha1sum/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf | Bin 0 ->
+ 1224 bytes
+ test/shaping/tests/indic-syllable.tests                  |   1 +
+ 3 files changed, 7 insertions(+)
+
+commit 6eb8950e6265b23d88ba35daab1cff4fc3fe8753
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:30:05 2017 +0200
+
+    [ucdn] Oops!
+
+ src/hb-ucdn/{unicodedata_db.h => ucdn_db.h} | 4324
+ ++++++++++++++-------------
+ 1 file changed, 2175 insertions(+), 2149 deletions(-)
+
+commit cbec0cd65e1787b20ea55dd5583a7444938bd381
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:26:52 2017 +0200
+
+    Remove some really old cruft
+
+ src/hb-common.h    | 14 --------------
+ src/hb-ucdn/ucdn.h | 14 --------------
+ 2 files changed, 28 deletions(-)
+
+commit b3dff7720c1fac8ca9bdd7087ac368a0af4349e8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:22:51 2017 +0200
+
+    [ucdn] Update README
+
+ src/hb-ucdn/README | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 57c55ef8341c760145170dedd002c5afb380e6c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:21:27 2017 +0200
+
+    [ot] Improve shaper selection heuristic
+
+ src/hb-ot-shape-complex-private.hh | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 5680ef884cf31ab9b42c587ffa260e390c88b8eb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 18:20:51 2017 +0200
+
+    [use] Hack to fix shaping of U+1A7F
+
+    Fixes https://github.com/behdad/harfbuzz/issues/525
+
+ src/gen-use-table.py                 | 3 +++
+ src/hb-ot-shape-complex-use-table.cc | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 0faa16a25349906ee0ab98b73d9a3d96327a0955
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 17:15:46 2017 +0200
+
+    [ucdn] Update to Unicode 10
+
+    Update to commit c000ebf79c095a7d58cf90090bde5715592c4834
+    plus this bug-fix: https://github.com/grigorig/ucdn/issues/18
+
+ src/hb-ucdn.cc               |  4 +++
+ src/hb-ucdn/Makefile.sources |  2 +-
+ src/hb-ucdn/ucdn.c           | 69
+ ++++++++++++++++++++++----------------------
+ src/hb-ucdn/ucdn.h           |  7 +++++
+ 4 files changed, 47 insertions(+), 35 deletions(-)
+
+commit ea535a1dfa63f82280607273cd282a6134c334da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 17:02:39 2017 +0200
+
+    [use] Update to Unicode 10
+
+ src/gen-use-table.py                 |  5 +--
+ src/hb-ot-shape-complex-use-table.cc | 69
+ ++++++++++++++++++++++++++----------
+ 2 files changed, 54 insertions(+), 20 deletions(-)
+
+commit 29c244aff6e3c359796bb033496c14ad5537dbe0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 16:36:21 2017 +0200
+
+    Minor
+
+ src/gen-use-table.py | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 1535f8c67216e8559fa48691fe6d9c2726c08973
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 16:12:18 2017 +0200
+
+    Add Unicode 10 scripts
+
+ src/hb-common.h                    | 8 ++++++++
+ src/hb-ot-shape-complex-private.hh | 5 +++++
+ 2 files changed, 13 insertions(+)
+
+commit bdbe974f525d33b8c735fb5d7fd76c236c4dd0ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 10:00:31 2017 -0400
+
+    [indic] Update table to Unicode 10
+
+ src/hb-ot-shape-complex-indic-table.cc | 70
+ +++++++++++++++++-----------------
+ 1 file changed, 36 insertions(+), 34 deletions(-)
+
+commit cc79b666bc4a81a0342ed1e706dd7db109739dc5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 09:19:15 2017 -0400
+
+    [indic] Add test for 1a0a356a0f2b2932581e4fd0437c01c058f4f6d1
+
+    https://github.com/behdad/harfbuzz/issues/538
+
+ .../sha1sum/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf | Bin 0 ->
+ 1000 bytes
+ test/shaping/tests/indic-syllable.tests                  |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 819cc360499a5f136325b5a1a18098ebc2aee081
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 09:03:16 2017 -0400
+
+    [indic] Move manual code out of generated table
+
+ src/hb-ot-shape-complex-indic-table.cc | 7 -------
+ src/hb-ot-shape-complex-indic.cc       | 5 +++++
+ 2 files changed, 5 insertions(+), 7 deletions(-)
+
+commit da4866f7177a4e2836cc70b844e2e64ab671761f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 08:57:06 2017 -0400
+
+    [arabic] Update table to Unicode 10 data
+
+ src/hb-ot-shape-complex-arabic-table.hh | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 1a0a356a0f2b2932581e4fd0437c01c058f4f6d1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Oct 2 08:49:23 2017 -0400
+
+    [indic] Categorize U+0980 BENGALI ANJI as placeholder
+
+    Fixes https://github.com/behdad/harfbuzz/issues/538
+
+ src/hb-ot-shape-complex-indic.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 19e77e01bc13f44138e1d50533327d314dd0a018
+Author: jfkthame <jfkthame@gmail.com>
+Date:   Mon Oct 2 13:08:49 2017 +0100
+
+    [shape-plan] Don't look for a cached plan if variation coords are
+    specified. Fixes #549. (#550)
+
+    This is a temporary hack just to avoid incorrect shaping results,
+    pending proper support
+    for caching shape-plans with variation coordinates.
+
+ src/hb-shape-plan.cc | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit db446cce4ef4cd1a4f1652e3aa3e5e5ed1881d39
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Oct 1 12:06:00 2017 -0400
+
+    Add RELEASING.md to dist
+
+ Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 933a81d74fee0d5856fc7b15b58a16e0e0168e48
+Author: ebraminio <ebrahim@gnu.org>
+Date:   Sun Oct 1 19:35:24 2017 +0330
+
+    Add release checklist (#529)
+
+ RELEASING.md | 96
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 96 insertions(+)
+
+commit 66128d3cfb12705530141b5a4bd2706f0cbb9fc5
+Author: mhosken <mhosken@users.noreply.github.com>
+Date:   Wed Sep 27 01:29:45 2017 +0700
+
+    Fix missing xscale in rtl graphite unpacking (#541)
+
+    * Fix missing xscale in rtl graphite unpacking
+
+    * Oops didn't need to mess with yscale
+
+ src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3ca69c8c32b8408dd9f8e6e866cd07e58c0d79b7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Sep 14 20:50:35 2017 -0400
+
+    Use strtod_l() to correctly parse decimal numbers in French &
+    other locales
+
+    Test with, eg.:
+    $ LC_ALL=fr_FR.utf-8 ./hb-view NotoSansArabic-VF.ttf بهداد
+    --variations wght=1.2
+
+ configure.ac     |  4 ++--
+ src/hb-common.cc | 53
+ +++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 53 insertions(+), 4 deletions(-)
+
+commit 9355218f582a6c2425cadcb868204f81b17d5767
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Sep 9 11:21:07 2017 -0700
+
+    [util] Add a few shorthand forms for commandline options
+
+    -o, -O, -u, -v, -V
+
+ util/options.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit a984e0c4d921a6dff82cc1b5c686cc957215bc7e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Sep 5 11:18:35 2017 -0700
+
+    1.5.1
+
+ NEWS         | 13 +++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+commit d03f11f246efec13e48fd68a9ce136db771b22bf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 4 20:14:13 2017 -0700
+
+    Fix buffer_diff for empty buffers
+
+    If buffers are empty, content type should be ignored.
+
+    This fixes last of the failing tests: fuzzed.tests.  Green again!
+
+ src/hb-buffer.cc | 2 +-
+ src/hb-buffer.h  | 4 ++--
+ util/options.hh  | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 7cc348041d0b026ca6d2c240134e8f9100600e99
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 4 20:04:59 2017 -0700
+
+    [unsafe-to-break] Fix unsafe-to-break for cluster-level=1
+
+    Fixes tests/shaping/tests/cluster.tests
+
+ src/hb-ot-shape.cc | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+commit 61a9d7e6d0e6df7b48f58fa1679f0f93407993b2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Sep 4 19:48:52 2017 -0700
+
+    Minor
+
+ test/shaping/run-tests.sh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 03a5a6f873e5a50011f1c2418f5ceab86d9c2931
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 1 19:09:54 2017 -0700
+
+    [util] Add --unicodes to hb-view / hb-shape
+
+    Fixes https://github.com/behdad/harfbuzz/issues/154
+
+ test/shaping/hb_test_tools.py |  2 +-
+ util/options.cc               | 65
+ ++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 65 insertions(+), 2 deletions(-)
+
+commit 0e5b475d98dd67e927534508fe2cd8dc9765e24e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 1 18:28:47 2017 -0700
+
+    Minor
+
+ test/shaping/run-tests.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3e1fc6d18ba0019bbeede78b95070a6e7156c314
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 1 10:46:48 2017 -0700
+
+    Minor
+
+ test/shaping/run-tests.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 04f009f84891b513087830c7aa1b755addd016d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 1 10:38:25 2017 -0700
+
+    Add test accidentally removed in previous commit
+
+ test/shaping/tests/indic-syllable.tests | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 06cb162cd79cc922b572e5f532ca867223b6dc4c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Sep 1 10:34:21 2017 -0700
+
+    [indic] Treat Consonant_With_Stacker as consonant
+
+    Fixes https://github.com/behdad/harfbuzz/issues/528
+    "Kannada JIHVAMULIYA and UPADHMANIYA insert dotted circles"
+
+ src/hb-ot-shape-complex-indic-private.hh                  |   2 +-
+ .../sha1sum/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf  | Bin 0 ->
+ 988 bytes
+ test/shaping/tests/indic-syllable.tests                   |   3 ++-
+ 3 files changed, 3 insertions(+), 2 deletions(-)
+
+commit c449d2d8c9e27502380faa0b568a374c838ac9a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 30 17:28:22 2017 -0700
+
+    [unsafe-to-break] Mark during fraction-slash formation
+
+    Fixes tests/automatic-fractions.tests
+
+ src/hb-ot-shape.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b262ebcc9c9539076d17751e9bae06a8fd5001ff
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 30 17:25:10 2017 -0700
+
+    [util] Fix cluster sweeping during --verify
+
+    If *I* get this wrong in 2017, I have no idea how others get their
+    head around
+    cluster math...
+
+    Fixes tests/arabic-fallback-shaping.tests
+
+ util/options.hh | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 69d701b02e5ebc3597b0d0576dbab8e1ece51944
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 30 17:07:29 2017 -0700
+
+    [util] When --verify fails, return reconstructed shape results
+
+ util/options.hh    | 8 +++-----
+ util/view-cairo.hh | 2 +-
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+commit 099472e08bf81d6dd8ca1647999592df6b7fdfb9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 30 16:45:06 2017 -0700
+
+    hb_buffer_diff() tweak
+
+    I like to have a mode where CONTAINS_NOTDEF and CONTAINS_DOTTEDCIRCLE
+    are not
+    returned.  Abused a value of -1 for that.  hb-shape now uses it.
+    Fixes two
+    of the six tests failing with --verify in test/shaping/run-tests.sh.
+
+ src/hb-buffer.cc          | 16 ++++++++--------
+ test/shaping/run-tests.sh |  4 ++--
+ util/options.hh           |  2 +-
+ 3 files changed, 11 insertions(+), 11 deletions(-)
+
+commit e8b364b86023731e0416ab4eb433467c4b7a0ec2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 23 15:00:45 2017 -0700
+
+    1.5.0
+
+ NEWS         | 44 ++++++++++++++++++++++++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 45 insertions(+), 1 deletion(-)
+
+commit 224d20e4e1c62416ff842a81188dfeff069f895b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 23 14:41:48 2017 -0700
+
+    [docs] Minor
+
+ docs/harfbuzz-docs.xml     | 12 ++++++++++++
+ docs/harfbuzz-sections.txt | 10 ++++++++++
+ src/hb-buffer.cc           |  8 +++++++-
+ 3 files changed, 29 insertions(+), 1 deletion(-)
+
+commit 4387b059a0603b17024de48d57bee6a3b5e9e56c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 23 14:35:58 2017 -0700
+
+    [test] Add --verify to hb-shape
+
+    Disabled for now.  Will enable and fix failures after next release.
+
+ test/shaping/run-tests.sh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit b2dd0c1c32ba30714355baca1857d64c1608b4c2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 23 13:12:54 2017 -0700
+
+    Add hb_glyph_info_get_glyph_flags()
+
+    New API.
+
+ src/hb-buffer.cc | 17 +++++++++++++++++
+ src/hb-buffer.h  |  9 ++++++++-
+ 2 files changed, 25 insertions(+), 1 deletion(-)
+
+commit 3e8f4f145255a905029c6b5cb8f40e6dcca096f3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 22 17:56:25 2017 -0700
+
+    Rename HB_BUFFER_DIFF_FLAG_MASK_MISMATCH to
+    HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH
+
+ src/hb-buffer.cc | 2 +-
+ src/hb-buffer.h  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit a9e52a1af4c039bc53090a9c1e4c1136fc542605
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 15 17:30:18 2017 -0700
+
+    [util] Prefix trace lines with "trace:", and error lines with "error:"
+
+ util/hb-shape.cc | 12 ++++++------
+ util/options.cc  |  4 ++--
+ util/options.hh  |  1 +
+ 3 files changed, 9 insertions(+), 8 deletions(-)
+
+commit 7ea10c35a34c894e87ee6576d6d4ba3e78535a27
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 15 17:12:28 2017 -0700
+
+    [util] Respect eot/bot in safe-to-break test; hook up hb_buffer_diff()
+
+ util/options.hh | 38 ++++++++++++++++++++++++++------------
+ 1 file changed, 26 insertions(+), 12 deletions(-)
+
+commit 8820ba29dfd2e1302377da62a0527939a0d7d9fb
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 15 17:12:21 2017 -0700
+
+    Fix warning about "may be used uninitialized"
+
+ src/hb-ot-layout-common-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 91770e1c567d87fc513e8d39576e51c3853b1f23
+Author: Emil A Eklund (eae) <eae@eae.net>
+Date:   Tue Aug 15 16:25:18 2017 -0700
+
+    Fix signed/unsigned warning (#522)
+
+    Change hb_buffer_diff to explicitly cast result of abs to unsigned
+    when
+    comparing with position_fuzz to avoid unsafe signed/unsigned
+    comparions
+    warnings on windows.
+
+ src/hb-buffer.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 587f15ece316df7c86f386518aba48a6a44c061d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 14 15:23:10 2017 -0700
+
+    Minor
+
+ src/hb-face-private.hh |  8 ++++----
+ src/hb-face.cc         |  8 ++++----
+ src/hb-font-private.hh | 14 +++++++-------
+ src/hb-font.cc         | 14 +++++++-------
+ 4 files changed, 22 insertions(+), 22 deletions(-)
+
+commit a88e2a73f34067381a81577c3f60bc5c2a6f2eea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 14 14:49:21 2017 -0700
+
+    [util] Fix leaks
+
+ util/options.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 338e61ad1b40110a70c4fb497b117bcb07548467
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 14 12:36:38 2017 -0700
+
+    Fix typo
+
+ src/hb-buffer.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 331d66c7fe27a7649454486000827f0c36d6eb36
+Author: Jonathan Kew <jfkthame@gmail.com>
+Date:   Sat Jul 19 23:09:09 2014 +0100
+
+    Add function to compare two buffers
+
+    Based on patch from Jonathan Kew.
+
+    Needs more cleaning up and documentation.
+
+    New API:
+    hb_buffer_diff_flags_t
+    hb_buffer_diff()
+
+ src/hb-buffer-private.hh   |  1 +
+ src/hb-buffer-serialize.cc |  4 +--
+ src/hb-buffer.cc           | 82
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h            | 39 ++++++++++++++++++++++
+ 4 files changed, 124 insertions(+), 2 deletions(-)
+
+commit 219af509ef8269e51f1396b18521c75b000d8dda
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 13 15:10:26 2017 -0700
+
+    [graphite2] Fix warning
+
+ src/hb-graphite2.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 239119a631fee7701be4d444adeda808b915863a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Aug 13 15:08:34 2017 -0700
+
+    [unsafe-to-break] Mark all positions as unsafe in alternative shapers
+
+ src/hb-coretext.cc    | 6 ++++++
+ src/hb-directwrite.cc | 2 ++
+ src/hb-graphite2.cc   | 1 +
+ src/hb-uniscribe.cc   | 2 ++
+ 4 files changed, 11 insertions(+)
+
+commit 05fabbd03eae7b84ebbce7abbdc55c1d67ceacf9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 19:51:06 2017 -0700
+
+    [unsafe-to-break] Towards verifying unsafe-to-break in --verify
+
+    We break and shape fragments and reconstruct shape result from them.
+    Remains to compare to original buffer.  Going to add some buffer
+    comparison API and use here, instead of open-coding.
+
+ src/hb-buffer.cc |   5 ++-
+ util/options.hh  | 131
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 133 insertions(+), 3 deletions(-)
+
+commit 6ce25f57c663f86326262a5ff7a42288f358ed51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 19:31:05 2017 -0700
+
+    Fix hb_buffer_append()
+
+    Ouch!
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1c17c2bde5bdf74a652b78d71b64e3aaa75ec43d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 19:06:07 2017 -0700
+
+    [unsafe-to-break] Copy flag to all glyphs in a cluster
+
+    Makes consumption easier.
+
+ src/hb-buffer-private.hh    | 46
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.cc            | 28 ++++++---------------------
+ src/hb-ot-layout-private.hh |  3 +--
+ src/hb-ot-shape.cc          | 27 ++++++++++++++++++++++++++
+ 4 files changed, 80 insertions(+), 24 deletions(-)
+
+commit ec104e5912417c0fdc8c7cb004c684aea26eb1dc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 18:24:27 2017 -0700
+
+    [unsafe-to-break] Mark unsafe is cluster merging is disabled
+
+    We were relying on cluster merges not requiring unsafe flagging
+    because
+    they get merged.  If cluster level requests no merging, then we flag
+    unsafe when merge would have happened.
+
+ src/hb-buffer.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 39a97494304a7e6b8999e59a92ce4d24ba9b881a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 15:52:06 2017 -0700
+
+    New API: hb_buffer_append()
+
+ src/hb-buffer.cc | 52
+ +++++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-buffer.h  |  6 ++++++
+ 2 files changed, 57 insertions(+), 1 deletion(-)
+
+commit d2052278f24b3279503d5fa215a7834c2d21f91c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 15:12:25 2017 -0700
+
+    [util] Add --verify to hb-shape / hb-view that verifies shape results
+
+    Right now it checks for monotone cluster values.  Other checks to
+    be added.
+
+ util/hb-shape.cc       |  7 ++-----
+ util/options.cc        |  2 ++
+ util/options.hh        | 42 +++++++++++++++++++++++++++++++++++++++---
+ util/shape-consumer.hh | 12 ++++++++----
+ util/view-cairo.hh     |  7 ++-----
+ 5 files changed, 53 insertions(+), 17 deletions(-)
+
+commit 14a639ea592cba971e5548f0942dd395c602c7a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Aug 11 11:30:39 2017 -0700
+
+    [unsafe-to-break] Fix Use-of-uninitialized-value in
+    unsafe_to_break_set_mask
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3011
+
+ src/hb-ot-shape-complex-hangul.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e43aad55524cc1d4008ce337c2863a8546706d2e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:54:15 2017 -0700
+
+    [unsafe-to-break] Flag in Thai PUA shaping
+
+ src/hb-ot-shape-complex-thai.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit eae009602b5503c53a7f8ab053912563a97bbfa4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:50:48 2017 -0700
+
+    [unsafe-to-break] Flag in Hangul shaper
+
+ src/hb-ot-shape-complex-hangul.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit b65aa1cd4778e0103a2a1ed0e1b1012a09cf1f48
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:32:02 2017 -0700
+
+    [unsafe-to-break] Flag during mark attachment
+
+ src/hb-ot-layout-gpos-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c4712f8e372ee42749cda56cc7c28dc110a07ea9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:27:21 2017 -0700
+
+    Fix test
+
+ test/api/test-buffer.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 882ebdadd6b3420ef2d3f296cd7416c76ee9901f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:23:17 2017 -0700
+
+    [unsafe-to-break] Flag during cursive positioning
+
+ src/hb-ot-layout-gpos-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2d158ca37673f2b262f2381854559d6872d8fb45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:19:15 2017 -0700
+
+    [unsafe-to-break] Flag during kerning
+
+ src/hb-ot-layout-gpos-table.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit a7c4972ccefaaf48dfd6f0f4588df0c785aa33d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:16:15 2017 -0700
+
+    [unsafe-to-break] Flag during fallback positioning
+
+ src/hb-ot-shape-fallback.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit e2a2b5b229c92f1de3b9c3ea111cd1ffa75b18fc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 20:10:12 2017 -0700
+
+    [unsafe-to-break] Be careful with flag propagation when merging
+    clusters
+
+ src/hb-buffer-private.hh | 13 +++++++++++++
+ src/hb-buffer.cc         | 17 ++++++++++-------
+ src/hb-ot-shape.cc       |  3 ++-
+ 3 files changed, 25 insertions(+), 8 deletions(-)
+
+commit f2868c200896a96a34fc1bba4d43eddc03789da2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 19:58:05 2017 -0700
+
+    Set mask to 0, instead of 1, by default
+
+    This shouldn't matter.
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9e005c5d86cd4c19383093f76a237cc8f5f12fb7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 18:45:33 2017 -0700
+
+    [unsafe-to-break] Mark Indic-like clusters as unsafe-to-break
+
+ src/hb-ot-shape-complex-indic.cc   | 2 ++
+ src/hb-ot-shape-complex-myanmar.cc | 2 ++
+ src/hb-ot-shape-complex-use.cc     | 2 ++
+ 3 files changed, 6 insertions(+)
+
+commit 5287ccc935c86b6f5e6867592b64bc2461384f45
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 10 14:25:53 2017 -0700
+
+    [unsafe-to-break] Allocate public bits from 0
+
+ src/hb-buffer.h  |  5 +++--
+ src/hb-ot-map.cc | 15 +++++++++------
+ 2 files changed, 12 insertions(+), 8 deletions(-)
+
+commit 91ce0c45d6782057a2736f7b76a3c49cadbea070
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu May 5 16:13:03 2016 +0100
+
+    [safe-to-break] Fix logic when there is no out-buffer
+
+ src/hb-buffer.cc | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit a043c99f778ffdde15d212fe23468cb9f51036bc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed May 4 19:51:22 2016 +0200
+
+    [unsafe-to-break] Simplify logic
+
+    Always use the algorithm for non-monotone case.  It's more robust.
+
+ src/hb-buffer.cc | 57
+ +++++++++++++-------------------------------------------
+ 1 file changed, 13 insertions(+), 44 deletions(-)
+
+commit 40bd7e9a1cf422b17f15d0f66547bde9098e6ef3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon May 2 14:47:45 2016 +0200
+
+    [unsafe-to-break] Add UNSAFE_TO_BREAK flag
+
+    Not all shapers code is updated to set this properly.
+    GSUB and Arabic shaper are updated.
+    GPOS and other shapers are NOT.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/224
+
+ src/hb-buffer-private.hh             | 26 ++++++++------
+ src/hb-buffer-serialize.cc           | 24 +++++++++----
+ src/hb-buffer.cc                     | 67
+ ++++++++++++++++++++++++++++++++++++
+ src/hb-buffer.h                      | 10 ++++--
+ src/hb-ot-layout-gsub-table.hh       |  7 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 27 ++++++++++-----
+ src/hb-ot-map.cc                     |  2 ++
+ src/hb-ot-shape-complex-arabic.cc    |  3 ++
+ util/hb-shape.cc                     |  2 ++
+ util/options.cc                      |  1 +
+ util/options.hh                      |  2 ++
+ 11 files changed, 142 insertions(+), 29 deletions(-)
+
+commit 3e44748ebe1524aef6feb01c42d342e8a2d77d34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 9 22:09:01 2017 -0700
+
+    [util] Fix two other Coverity warnings
+
+ util/options.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 356f93b64b6005f44bcfc329f6f9e150ec32fc26
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 9 22:06:53 2017 -0700
+
+    [util] Fix warning
+
+ util/shape-consumer.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ac8c4e56d8b8c2e7a8f4802f83deb935bd6bbbd3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 9 22:05:08 2017 -0700
+
+    [ft] Fix theoretical leak
+
+ src/hb-ft.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5a330575768f5a213072230b9ec8faabac9c5737
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 9 17:23:28 2017 -0700
+
+    Treat HAMZA ABOVE similar to SHADD for sorting purposes
+
+    Part of https://github.com/behdad/harfbuzz/issues/509
+
+ src/hb-unicode-private.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 68af14d5cc666ebf0596766cbed87cc9404fd50f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Aug 9 17:09:21 2017 -0700
+
+    Protect against div-by-zero in CBDT extent code
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1452#c5
+
+    CC https://github.com/behdad/harfbuzz/issues/139
+
+ src/hb-ft.cc         | 4 ++--
+ src/hb-ot-font.cc    | 6 +++---
+ src/hb-shape-plan.cc | 4 ++--
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 3b54d0337e6119a4397573f5589b771a68b2ecd9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 8 18:37:03 2017 -0700
+
+    Add tests for 'avar' fix 5dc30451b80f6bb0079424a130875c10486e4d34
+
+ test/shaping/Makefile.am                           |   1 +
+ .../d23d76ea0909c14972796937ba072b5a40c1e257.ttf   | Bin 0 -> 1812 bytes
+ test/shaping/record-test.sh                        |   1 +
+ test/shaping/tests/variations-rvrn.tests           | 100
+ +++++++++++++++++++++
+ 4 files changed, 102 insertions(+)
+
+commit 7917792f01603f91b703d12e12d8baced655a615
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Aug 8 13:17:03 2017 -0700
+
+    1.4.8
+
+ NEWS         | 9 +++++++++
+ configure.ac | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+commit 5dc30451b80f6bb0079424a130875c10486e4d34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Aug 7 21:37:07 2017 -0700
+
+    Two fixes to avar mapping
+
+    1. Handle segment with two entries correctly,
+
+    2. Fix rounding math.  Ouch!
+
+    Fixes https://github.com/behdad/harfbuzz/issues/521
+
+ src/hb-ot-var-avar-table.hh | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+commit dc2c418e397bf251faf03d824fc780ac19bb1dee
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Aug 3 12:34:15 2017 +0100
+
+    [check-defs/symbols.sh] Drop empty-symbol lines
+
+    Fixes https://github.com/behdad/harfbuzz/issues/510
+
+ src/check-defs.sh    | 2 +-
+ src/check-symbols.sh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 6f38845d9c6852812eb1963a1fd7e5ec771e5ce3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jul 19 17:20:55 2017 -0700
+
+    [hb-shape] Rename --show-messages to --trace
+
+    https://github.com/behdad/harfbuzz/issues/506
+
+ util/hb-shape.cc | 2 +-
+ util/options.cc  | 2 +-
+ util/options.hh  | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit e60350551addbd945491f662e98464c9e3e9fec5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 18 19:14:19 2017 -0700
+
+    [hb-shape] Improve shaping-debug output
+
+    Before, that was printed using --debug (and in both hb-shape and
+    hb-view).
+    Changed it, now hb-shape has a new command-line argument called
+    --show-messages.
+    When invoked, it also respects other output formatting options.
+    The messages
+    are better formatted and printed to te same place that hb-shape
+    output is
+    directed to.  Previously they were written to stderr.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/506
+
+ util/hb-ot-shape-closure.cc | 10 +++++++---
+ util/hb-shape.cc            | 33 +++++++++++++++++++++++++++++++--
+ util/main-font-text.hh      | 27 ++++-----------------------
+ util/options.cc             | 10 +++++++---
+ util/options.hh             |  2 ++
+ util/shape-consumer.hh      | 18 ++++++++++++------
+ util/view-cairo.hh          |  4 ++--
+ 7 files changed, 65 insertions(+), 39 deletions(-)
+
+commit 65f64d14005e4d0808e818b3c97bd3d600628011
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Wed Jul 19 02:42:53 2017 +0430
+
+    Unbreak arm-none-eabi build again (#514)
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fc15e60eadfc89aca5b8815262b8ee888f285169
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Jul 18 11:24:42 2017 -0700
+
+    1.4.7
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit c1432bce3cfc1156d19b21892d4083afa8838d94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 17:34:47 2017 +0100
+
+    [arabic] Adjust feature order again
+
+    Fixes https://github.com/behdad/harfbuzz/issues/505
+
+ src/hb-ot-shape-complex-arabic.cc                        |   7 ++++++-
+ .../sha1sum/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf | Bin 0 ->
+ 7312 bytes
+ test/shaping/tests/arabic-feature-order.tests            |   1 +
+ 3 files changed, 7 insertions(+), 1 deletion(-)
+
+commit 9813be3d1212eef5a525d64978e0bb2032cd44d9
+Author: Cosimo Lupo <cosimo@anthrotype.com>
+Date:   Fri Jul 14 17:11:46 2017 +0100
+
+    [coretext] Allow to disable kern (#508)
+
+    * Minor
+
+    * [coretext] Fix leak
+
+    * [coretext] Do not reset num_features
+
+    * [coretext] allow to disable kern; re-enabling doesn't seem to
+    be working
+
+ src/hb-coretext.cc | 41 ++++++++++++++++++++++++++++++++---------
+ 1 file changed, 32 insertions(+), 9 deletions(-)
+
+commit 9dd29c681e8e856c139f20f405d7c0e04928aa70
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 17:01:27 2017 +0100
+
+    [use] Allow up to two medial-below letters
+
+    Fixes https://github.com/behdad/harfbuzz/issues/376
+
+ src/hb-ot-shape-complex-use-machine.rl                   |   3 ++-
+ .../sha1sum/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf | Bin 0 ->
+ 2192 bytes
+ test/shaping/tests/use-syllable.tests                    |   3 +++
+ 3 files changed, 5 insertions(+), 1 deletion(-)
+
+commit 216b003c914d2209a6846b1ce61fe7a3421c789c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 16:38:51 2017 +0100
+
+    [use] Fix shaping of U+AA29 CHAM VOWEL SIGN AA
+
+    Part of https://github.com/behdad/harfbuzz/issues/376
+    Also see https://github.com/roozbehp/unicode-data/issues/6
+
+    Test added, using NotoSansCham built from Noto Phase III sources.
+
+ src/gen-arabic-table.py                                  |   2 +-
+ src/gen-indic-table.py                                   |   2 +-
+ src/gen-use-table.py                                     |   8 +++++---
+ src/hb-ot-shape-complex-use-table.cc                     |   4 ++--
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf | Bin 0 ->
+ 1368 bytes
+ test/shaping/tests/use-syllable.tests                    |   1 +
+ 7 files changed, 11 insertions(+), 7 deletions(-)
+
+commit f1cd7ca89306ff252816e9747177d8dab00524f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 15:59:40 2017 +0100
+
+    [indic] Add github URL
+
+ src/hb-ot-shape-complex-indic.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3cc84f45b995b243fca82ce18481f11d69846eb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 15:50:22 2017 +0100
+
+    [indic] Fix https://github.com/behdad/harfbuzz/issues/478
+
+ src/hb-ot-shape-complex-indic-private.hh                 |   2 +-
+ src/hb-ot-shape-complex-indic.cc                         |   8 ++++++++
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf | Bin 0 ->
+ 1352 bytes
+ test/shaping/tests/indic-syllable.tests                  |   1 +
+ 5 files changed, 11 insertions(+), 1 deletion(-)
+
+commit e359a4b8f57bbc778843f233c4f5d6fb07ff11d9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 14:14:35 2017 +0100
+
+    [indic] Disable automatic ZWNJ handling for Indic features
+
+    Fixes https://github.com/behdad/harfbuzz/issues/294
+
+    Also fixes a bunch of other Indic issues.  Test results after:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366355 out of 366457 tests passed. 102 failed (0.0278341%)
+    GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
+    KANNADA: 951201 out of 951913 tests passed. 712 failed (0.0747968%)
+    KHMER: 299071 out of 299124 tests passed. 53 failed (0.0177184%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+    Before:
+
+    BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%)
+    DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%)
+    GUJARATI: 366349 out of 366457 tests passed. 108 failed (0.0294714%)
+    GURMUKHI: 60732 out of 60747 tests passed. 15 failed (0.0246926%)
+    KANNADA: 951190 out of 951913 tests passed. 723 failed (0.0759523%)
+    KHMER: 299070 out of 299124 tests passed. 54 failed (0.0180527%)
+    MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed
+    (0.0188871%)
+    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
+    SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%)
+    TAMIL: 1091753 out of 1091754 tests passed. 1 failed (9.15957e-05%)
+    TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%)
+
+ src/hb-ot-shape-complex-indic.cc                         |   4 ++--
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf | Bin 0 ->
+ 3972 bytes
+ test/shaping/tests/indic-joiners.tests                   |   2 ++
+ 4 files changed, 5 insertions(+), 2 deletions(-)
+
+commit cdf1fd0627c5517c948ca05d2e9427c3e441adf9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Jul 14 12:43:34 2017 +0100
+
+    [indic] Add infrastructure to disable ZWNJ-skipping in
+    context-matching
+
+    Not used yet.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 45
+ ++++++++++++++++++++----------------
+ src/hb-ot-layout.cc                  |  1 +
+ src/hb-ot-map-private.hh             | 10 +++++---
+ src/hb-ot-map.cc                     |  8 +++++--
+ 4 files changed, 39 insertions(+), 25 deletions(-)
+
+commit 3a73e0d5e17b87ac7e307d855c2cb43d040bd195
+Author: Dominik Schlösser <dominik.schloesser@gmail.com>
+Date:   Fri Jul 14 13:14:55 2017 +0200
+
+    Shaping tests for Tibetan vowels (#446)
+
+    * Shaping tests for Tibetan vowels
+
+    * Test-cases for the Dzongkha contractions with multiple vowel-signs
+    added.
+
+    * going to be removed
+
+    * Extended contraction-test-cases to all test cases in
+    contractions.txt that actually use multiple-vowels (113 cases)
+
+ test/shaping/Makefile.am                           |   3 ++
+ .../2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf   | Bin 0 -> 125256
+ bytes
+ .../82f4f3b57bb55344e72e70231380202a52af5805.ttf   | Bin 0 -> 11116 bytes
+ .../a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf   | Bin 0 -> 106096
+ bytes
+ test/shaping/tests/tibetan-contractions-1.tests    |  60
+ +++++++++++++++++++++
+ test/shaping/tests/tibetan-contractions-2.tests    |  53
+ ++++++++++++++++++
+ test/shaping/tests/tibetan-vowels.tests            |  11 ++++
+ 7 files changed, 127 insertions(+)
+
+commit 4e21ec546932c2a982aa52fce718c1a0d90a71d6
+Author: Dominik Schlösser <dominik.schloesser@gmail.com>
+Date:   Fri Jul 14 13:14:23 2017 +0200
+
+    Fix for reordering of Tibetan vowel u (#443)
+
+    * Undone change for Tibetan vowel u
+
+    * removed comment on reordering that became invalid with roll-back
+
+    * Support for Dzongkha contractions with multiple vowel-signs
+
+    * Removed non-functional and unnecessary defines for
+    HB_MODIFIED_COMBINING_CLASS_CCC138,140
+
+ src/hb-unicode-private.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit ad52e044bcf733bcc6c0373bafcd78a8c0beb400
+Author: fanc999 <fanc999@yahoo.com.tw>
+Date:   Wed Jun 21 22:19:57 2017 +0800
+
+    Win32/NMake builds: Support builds from GIT (#498)
+
+    Add Python scripts to generate the full win32/config.h.win32 and
+    src/hb-version.h which can be used to build directly from a GIT
+    checkout.  Since the scripts are currently intended for building
+    from a
+    GIT checkout, these are not distributed in the release tarballs.
+
+    Also, support the re-build of Ragel-generated .hh headers using
+    the NMake
+    build system, and allow one to specify the path of the Ragel
+    executable
+    if a suitable one cannot be found in the PATH.
+
+    Update the Win32/NMake build documentation to let people know
+    about how
+    these mechanisms can be utilized.
+
+ win32/README.txt            |  20 ++++++-
+ win32/build-rules-msvc.mak  |   5 +-
+ win32/config-msvc.mak       |   7 +++
+ win32/create-lists-msvc.mak |   9 ++++
+ win32/generate-msvc.mak     |   6 +++
+ win32/info-msvc.mak         |   8 ++-
+ win32/pc_base.py            | 124
+ ++++++++++++++++++++++++++++++++++++++++++++
+ win32/replace.py            | 115
+ ++++++++++++++++++++++++++++++++++++++++
+ win32/setup.py              |  62 ++++++++++++++++++++++
+ 9 files changed, 353 insertions(+), 3 deletions(-)
+
+commit 3b0e47ca006b8fe6a24ace72dd931e3649bb8e6f
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Mon Jun 19 14:47:09 2017 +0430
+
+    Fix arm-none-eabi build (fixes #451) (#496)
+
+ CMakeLists.txt                          |  4 ++--
+ src/hb-buffer.cc                        |  4 ++--
+ src/hb-common.cc                        | 28 ++++++++++++++++++++--
+ src/hb-ot-font.cc                       |  2 +-
+ src/hb-ot-layout.cc                     |  2 +-
+ src/hb-ot-shape-complex-arabic-table.hh | 14 +++++------
+ src/hb-ot-shape-complex-arabic.cc       |  2 +-
+ src/hb-ot-shape-complex-hangul.cc       | 16 ++++++-------
+ src/hb-ot-shape-complex-indic-table.cc  | 22 ++++++++---------
+ src/hb-ot-shape-complex-indic.cc        | 12 +++++-----
+ src/hb-ot-shape-complex-myanmar.cc      |  2 +-
+ src/hb-ot-shape-complex-thai.cc         | 12 +++++-----
+ src/hb-ot-shape-complex-use-table.cc    | 42
+ ++++++++++++++++-----------------
+ src/hb-unicode-private.hh               | 16 ++++++-------
+ src/hb-utf-private.hh                   | 18 +++++++-------
+ 15 files changed, 110 insertions(+), 86 deletions(-)
+
+commit 76c4873e8cad2871d2d547318d371b9a89d8c806
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Fri Jun 2 21:53:10 2017 +0430
+
+    Support branch prediction helpers on clang compiles (#491)
+
+ src/hb-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 7dba30639a6f62803dfc21706bc7c654799f373e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jun 1 11:44:42 2017 -0400
+
+    Handle allocation failure in hb-language code
+
+ src/hb-common.cc | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+commit 92e2c4baafa0401cb8d7dd2bbd70acfaeaf2aabf
+Author: Sebastian Rasmussen <sebras@gmail.com>
+Date:   Mon May 29 12:53:30 2017 -0500
+
+    Avoid using strdup inside library. (#488)
+
+    If an application provides a malloc replacement through
+    hb_malloc_impl() it is important that it is used to allocate
+    everything, but the use of strdup() circumvents this and
+    causes system malloc() to be called instead. This pairs
+    badly with the custom hb_free_impl() being called later.
+
+ src/hb-common.cc  | 8 +++++++-
+ src/hb-private.hh | 4 ----
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit 06cfe3f7369684fc05fa16da7f6778350f8bcba5
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Wed May 17 21:32:47 2017 +0300
+
+    Do not skip TAG characters in glyph substitution (#487)
+
+    Hide them like Mongolian Free Variation Selectors instead.
+
+    Fixes https://github.com/behdad/harfbuzz/issues/463
+
+ src/hb-ot-layout-gsubgpos-private.hh                     |   2 +-
+ src/hb-ot-layout-private.hh                              |  13
+ +++++++++----
+ test/shaping/Makefile.am                                 |   1 +
+ .../sha1sum/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf | Bin 0 ->
+ 5044 bytes
+ test/shaping/tests/emoji-flag-tags.tests                 |   2 ++
+ 5 files changed, 13 insertions(+), 5 deletions(-)
+
+commit 1817221620dce713aae67352568ebcc231ab9512
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue May 16 14:26:28 2017 -0700
+
+    Minor
+
+ src/hb-atomic-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 152736981d5bb9e098c1a8b86fcf8fe577a4a9ec
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Sat May 13 21:32:56 2017 +0430
+
+    [cmake] Add framework build support (#484)
+
+ CMakeLists.txt | 46 +++++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 39 insertions(+), 7 deletions(-)
+
+commit bf50ddaf2b416bd80ae8849593bc745b578193d9
+Author: Ebrahim Byagowi <ebrahim@gnu.org>
+Date:   Thu May 4 20:31:42 2017 +0430
+
+    [cmake] minor (#482)
+
+ CMakeLists.txt | 30 +++++++++++++++++++-----------
+ 1 file changed, 19 insertions(+), 11 deletions(-)
+
+commit 141b33de9a141248e2f034d55f48460159536cb9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sun Apr 23 16:19:13 2017 -0700
+
+    1.4.6
+
+ NEWS         | 9 +++++++++
+ configure.ac | 2 +-
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
 commit 74b99ef2249107e7cd01bd1ee522a5d9ce61e05f
 Author: mhosken <mhosken@users.noreply.github.com>
 Date:   Thu Apr 20 19:13:22 2017 +0100
 commit 74b99ef2249107e7cd01bd1ee522a5d9ce61e05f
 Author: mhosken <mhosken@users.noreply.github.com>
 Date:   Thu Apr 20 19:13:22 2017 +0100
@@ -391,6 +13850,30 @@ Date:   Sun Mar 5 13:51:01 2017 -0800
  src/hb-ot-layout-gsubgpos-private.hh | 24 +++++++++++++++++++++++-
  1 file changed, 23 insertions(+), 1 deletion(-)
 
  src/hb-ot-layout-gsubgpos-private.hh | 24 +++++++++++++++++++++++-
  1 file changed, 23 insertions(+), 1 deletion(-)
 
+commit 3ebcd5a381e2de27a0cfb5af3359331f0b7e7108
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Mar 5 16:26:01 2017 +0100
+
+    first working version!
+
+ src/hb-ot-layout.cc | 2 ++
+ src/hb-ot.h         | 1 +
+ 2 files changed, 3 insertions(+)
+
+commit e65aaaa00a3b5ac811b5c73b5186cd7d65731f7b
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Mar 5 14:53:39 2017 +0100
+
+    BASE: start api
+
+ src/Makefile.sources           |  2 ++
+ src/hb-ot-base.cc              | 58
+ ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-base.h               | 56
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-base-table.hh | 15 ++---------
+ 4 files changed, 118 insertions(+), 13 deletions(-)
+
 commit 5aec2fb8d0a4db52ae414d980b66018ca5ce1e9c
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu Mar 2 11:46:33 2017 -0800
 commit 5aec2fb8d0a4db52ae414d980b66018ca5ce1e9c
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Thu Mar 2 11:46:33 2017 -0800
@@ -415,6 +13898,25 @@ Date:   Wed Mar 1 14:27:23 2017 -0800
  test/shaping/tests/context-matching.tests                |   1 +
  3 files changed, 4 insertions(+), 4 deletions(-)
 
  test/shaping/tests/context-matching.tests                |   1 +
  3 files changed, 4 insertions(+), 4 deletions(-)
 
+commit f72726c52b104a71ebf5b39fa1e3eb9febd446fc
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Feb 26 15:08:43 2017 +0100
+
+    BASE: add function in main BASE object
+
+ src/hb-ot-layout-base-table.hh | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 3963315f1b2eae2504bc683760245c827cd1ef16
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Feb 26 15:07:53 2017 +0100
+
+    BASE: first complete version
+
+ src/hb-ot-layout-base-table.hh | 444
+ +++++++++++++++++++++++++++++------------
+ 1 file changed, 317 insertions(+), 127 deletions(-)
+
 commit a11501444cfc4854bfe2b1d3ce0fc5a957e959d8
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Feb 25 13:37:54 2017 -0800
 commit a11501444cfc4854bfe2b1d3ce0fc5a957e959d8
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Feb 25 13:37:54 2017 -0800
@@ -448,6 +13950,16 @@ Date:   Sat Feb 25 13:30:38 2017 -0800
  src/hb-ot-shape-complex-indic.cc | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
  src/hb-ot-shape-complex-indic.cc | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
+commit d34e35b47457e757781b1769a1fbaf107ec6e32f
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 25 20:41:05 2017 +0100
+
+    BASE: WIP: more access functions
+
+ src/hb-ot-layout-base-table.hh | 212
+ +++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 191 insertions(+), 21 deletions(-)
+
 commit 6685d281d6f50bf046bbfef4a5263e15d15f2f02
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Feb 25 11:35:05 2017 -0800
 commit 6685d281d6f50bf046bbfef4a5263e15d15f2f02
 Author: Behdad Esfahbod <behdad@behdad.org>
 Date:   Sat Feb 25 11:35:05 2017 -0800
@@ -458,6 +13970,45 @@ Date:   Sat Feb 25 11:35:05 2017 -0800
  configure.ac |  2 +-
  2 files changed, 13 insertions(+), 1 deletion(-)
 
  configure.ac |  2 +-
  2 files changed, 13 insertions(+), 1 deletion(-)
 
+commit bd15567ed6a3667e6f8332b7374aece6a6f2361b
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 25 17:08:01 2017 +0100
+
+    BASE: align member's names
+
+ src/hb-ot-layout-base-table.hh | 70
+ +++++++++++++++++++++---------------------
+ 1 file changed, 35 insertions(+), 35 deletions(-)
+
+commit 499b4bef2a5b6d49374ab4977509d1fbf7bd6038
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 25 16:48:22 2017 +0100
+
+    BASE: more consistent naming (with spec and Harfbuzz code base)
+
+ src/hb-ot-layout-base-table.hh | 44
+ +++++++++++++++++++++---------------------
+ 1 file changed, 22 insertions(+), 22 deletions(-)
+
+commit a0bdd546c584eb7c7ea3ca7e19a178723e6fe77f
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 25 16:34:58 2017 +0100
+
+    factorize horiz+vertAxis
+
+ src/hb-ot-layout-base-table.hh | 31 +++++--------------------------
+ 1 file changed, 5 insertions(+), 26 deletions(-)
+
+commit 1d30c6d935535743c73b2d18abcc6ae86a1cfc5b
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 25 16:19:35 2017 +0100
+
+    BASE: sanitize
+
+ src/hb-ot-layout-base-table.hh | 151
+ ++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 148 insertions(+), 3 deletions(-)
+
 commit a657f23ca31237d652b5c101ed24194b6aeadaf8
 Author: Dominik Röttsches <d-r@roettsches.de>
 Date:   Mon Feb 20 21:52:07 2017 +0200
 commit a657f23ca31237d652b5c101ed24194b6aeadaf8
 Author: Dominik Röttsches <d-r@roettsches.de>
 Date:   Mon Feb 20 21:52:07 2017 +0200
@@ -472,6 +14023,45 @@ Date:   Mon Feb 20 21:52:07 2017 +0200
  src/hb-ot-layout.cc | 3 +++
  1 file changed, 3 insertions(+)
 
  src/hb-ot-layout.cc | 3 +++
  1 file changed, 3 insertions(+)
 
+commit f131f00b1779b44633223915e17cbce358ad063a
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Feb 19 10:12:22 2017 +0100
+
+    compile, move into hb-ot-layout.cc
+
+ src/hb-ot-font.cc              |  1 -
+ src/hb-ot-layout-base-table.hh | 57
+ +++++++++++++++++++++++++++++++-----------
+ src/hb-ot-layout.cc            |  1 +
+ 3 files changed, 43 insertions(+), 16 deletions(-)
+
+commit d0b97353e930d9b258f42f1cc1ac1a75306b76a8
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sun Feb 19 08:48:22 2017 +0100
+
+    hb-ot-base-table.hh -> hb-ot-layout-base-table.hh
+
+    per
+    https://github.com/behdad/harfbuzz/issues/418#issuecomment-280873811
+
+ src/Makefile.sources                                    | 2 +-
+ src/hb-ot-font.cc                                       | 2 +-
+ src/{hb-ot-base-table.hh => hb-ot-layout-base-table.hh} | 0
+ 3 files changed, 2 insertions(+), 2 deletions(-)
+
+commit f748e11645a3361f94d6fb10ce59febbaa5ba8ca
+Author: Elie Roux <elie.roux@telecom-bretagne.eu>
+Date:   Sat Feb 18 19:54:33 2017 +0100
+
+    bootstraping structure
+
+ src/Makefile.sources        |   1 +
+ src/hb-ot-base-table.hh     | 238
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-font.cc           |   1 +
+ src/hb-ot-layout-private.hh |   2 +
+ 4 files changed, 242 insertions(+)
+
 commit 70202983f57fe85b2d3b56a9c205effeee66222d
 Author: ebraminio <ebrahim@gnu.org>
 Date:   Sat Feb 18 10:37:36 2017 +0330
 commit 70202983f57fe85b2d3b56a9c205effeee66222d
 Author: ebraminio <ebrahim@gnu.org>
 Date:   Sat Feb 18 10:37:36 2017 +0330
@@ -3596,6 +17186,23 @@ Date:   Mon Jun 27 03:54:15 2016 +0430
  src/hb-directwrite.cc | 15 ++++++---------
  1 file changed, 6 insertions(+), 9 deletions(-)
 
  src/hb-directwrite.cc | 15 ++++++---------
  1 file changed, 6 insertions(+), 9 deletions(-)
 
+commit 5967eaba728ca3e4f5026142c25d455fa3a59764
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Fri Jun 24 16:42:27 2016 +0200
+
+    [CPAL] Return 0xFFFF as name id for unnamed palettes
+
+    The name id 0 is used as Copyright notice. It's quite unlikely that a
+    font supplies a color palette with the exact same name as the font's
+    copyright notice, but the API should not prevent this.
+
+    Also, try to fix a problem with GObject introspection, where the
+    auto-generated Python bindings could not return palette colors.
+
+ src/hb-ot-color.cc       | 13 ++++++-------
+ test/api/test-ot-color.c | 14 +++++++-------
+ 2 files changed, 13 insertions(+), 14 deletions(-)
+
 commit 07b724f3419a28c479cd8a75ae0eecb841a6d2f3
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Fri Jun 24 12:23:25 2016 +0430
 commit 07b724f3419a28c479cd8a75ae0eecb841a6d2f3
 Author: Ebrahim Byagowi <ebrahim@gnu.org>
 Date:   Fri Jun 24 12:23:25 2016 +0430
@@ -3653,6 +17260,29 @@ Date:   Mon Jun 20 10:25:43 2016 +0300
 
     Merge branch 'master' into conflictingFontFix
 
 
     Merge branch 'master' into conflictingFontFix
 
+commit d34d3ac985a6c8c848ae49635b648a72e0c8f30d
+Author: Sascha Brawer <sascha@brawer.ch>
+Date:   Mon Apr 25 18:20:57 2016 +0200
+
+    Support CPAL table
+
+ NEWS                                               |   6 +-
+ src/Makefile.am                                    |   3 +
+ src/Makefile.sources                               |   3 +
+ src/hb-ot-color.cc                                 | 213 ++++++++++++++
+ src/hb-ot-color.h                                  |  99 +++++++
+ src/hb-ot-cpal-table.hh                            | 121 ++++++++
+ src/hb-ot-layout-private.hh                        |   3 +
+ src/hb-ot-layout.cc                                |   7 +
+ src/hb-ot.h                                        |   1 +
+ test/api/Makefile.am                               |   1 +
+ test/api/hb-test.h                                 |  30 ++
+ test/api/test-ot-color.c                           | 318
+ +++++++++++++++++++++
+ .../319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf   | Bin 0 -> 2128 bytes
+ .../e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf   | Bin 0 -> 1948 bytes
+ 14 files changed, 804 insertions(+), 1 deletion(-)
+
 commit 07461d06d242cd5cfda7ccb891189f074a89b460
 Author: Kelvin <kelvinsthirteen@gmail.com>
 Date:   Sat Jun 18 22:46:38 2016 +0000
 commit 07461d06d242cd5cfda7ccb891189f074a89b460
 Author: Kelvin <kelvinsthirteen@gmail.com>
 Date:   Sat Jun 18 22:46:38 2016 +0000
diff --git a/INSTALL b/INSTALL
index 2099840..8865734 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,8 +1,8 @@
 Installation Instructions
 *************************
 
 Installation Instructions
 *************************
 
-Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
-Inc.
+   Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
+Foundation, Inc.
 
    Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
 
    Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
@@ -12,97 +12,96 @@ without warranty of any kind.
 Basic Installation
 ==================
 
 Basic Installation
 ==================
 
-   Briefly, the shell command `./configure && make && make install'
+   Briefly, the shell command './configure && make && make install'
 should configure, build, and install this package.  The following
 should configure, build, and install this package.  The following
-more-detailed instructions are generic; see the `README' file for
+more-detailed instructions are generic; see the 'README' file for
 instructions specific to this package.  Some packages provide this
 instructions specific to this package.  Some packages provide this
-`INSTALL' file but do not implement all of the features documented
+'INSTALL' file but do not implement all of the features documented
 below.  The lack of an optional feature in a given package is not
 necessarily a bug.  More recommendations for GNU packages can be found
 in *note Makefile Conventions: (standards)Makefile Conventions.
 
 below.  The lack of an optional feature in a given package is not
 necessarily a bug.  More recommendations for GNU packages can be found
 in *note Makefile Conventions: (standards)Makefile Conventions.
 
-   The `configure' shell script attempts to guess correct values for
+   The 'configure' shell script attempts to guess correct values for
 various system-dependent variables used during compilation.  It uses
 various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
+those values to create a 'Makefile' in each directory of the package.
+It may also create one or more '.h' files containing system-dependent
+definitions.  Finally, it creates a shell script 'config.status' that
 you can run in the future to recreate the current configuration, and a
 you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
+file 'config.log' containing compiler output (useful mainly for
+debugging 'configure').
 
 
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
+   It can also use an optional file (typically called 'config.cache' and
+enabled with '--cache-file=config.cache' or simply '-C') that saves the
+results of its tests to speed up reconfiguring.  Caching is disabled by
+default to prevent problems with accidental use of stale cache files.
 
    If you need to do unusual things to compile the package, please try
 
    If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
+to figure out how 'configure' could check whether to do them, and mail
+diffs or instructions to the address given in the 'README' so they can
 be considered for the next release.  If you are using the cache, and at
 be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
+some point 'config.cache' contains results you don't want to keep, you
 may remove or edit it.
 
 may remove or edit it.
 
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
+   The file 'configure.ac' (or 'configure.in') is used to create
+'configure' by a program called 'autoconf'.  You need 'configure.ac' if
+you want to change it or regenerate 'configure' using a newer version of
+'autoconf'.
 
    The simplest way to compile this package is:
 
 
    The simplest way to compile this package is:
 
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.
+  1. 'cd' to the directory containing the package's source code and type
+     './configure' to configure the package for your system.
 
 
-     Running `configure' might take a while.  While running, it prints
+     Running 'configure' might take a while.  While running, it prints
      some messages telling which features it is checking for.
 
      some messages telling which features it is checking for.
 
-  2. Type `make' to compile the package.
+  2. Type 'make' to compile the package.
 
 
-  3. Optionally, type `make check' to run any self-tests that come with
+  3. Optionally, type 'make check' to run any self-tests that come with
      the package, generally using the just-built uninstalled binaries.
 
      the package, generally using the just-built uninstalled binaries.
 
-  4. Type `make install' to install the programs and any data files and
+  4. Type 'make install' to install the programs and any data files and
      documentation.  When installing into a prefix owned by root, it is
      recommended that the package be configured and built as a regular
      documentation.  When installing into a prefix owned by root, it is
      recommended that the package be configured and built as a regular
-     user, and only the `make install' phase executed with root
+     user, and only the 'make install' phase executed with root
      privileges.
 
      privileges.
 
-  5. Optionally, type `make installcheck' to repeat any self-tests, but
+  5. Optionally, type 'make installcheck' to repeat any self-tests, but
      this time using the binaries in their final installed location.
      This target does not install anything.  Running this target as a
      this time using the binaries in their final installed location.
      This target does not install anything.  Running this target as a
-     regular user, particularly if the prior `make install' required
+     regular user, particularly if the prior 'make install' required
      root privileges, verifies that the installation completed
      correctly.
 
   6. You can remove the program binaries and object files from the
      root privileges, verifies that the installation completed
      correctly.
 
   6. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
+     source code directory by typing 'make clean'.  To also remove the
+     files that 'configure' created (so you can compile the package for
+     a different kind of computer), type 'make distclean'.  There is
+     also a 'make maintainer-clean' target, but that is intended mainly
      for the package's developers.  If you use it, you may have to get
      all sorts of other programs in order to regenerate files that came
      with the distribution.
 
      for the package's developers.  If you use it, you may have to get
      all sorts of other programs in order to regenerate files that came
      with the distribution.
 
-  7. Often, you can also type `make uninstall' to remove the installed
+  7. Often, you can also type 'make uninstall' to remove the installed
      files again.  In practice, not all packages have tested that
      uninstallation works correctly, even though it is required by the
      GNU Coding Standards.
 
      files again.  In practice, not all packages have tested that
      uninstallation works correctly, even though it is required by the
      GNU Coding Standards.
 
-  8. Some packages, particularly those that use Automake, provide `make
+  8. Some packages, particularly those that use Automake, provide 'make
      distcheck', which can by used by developers to test that all other
      distcheck', which can by used by developers to test that all other
-     targets like `make install' and `make uninstall' work correctly.
+     targets like 'make install' and 'make uninstall' work correctly.
      This target is generally not run by end users.
 
 Compilers and Options
 =====================
 
    Some systems require unusual options for compilation or linking that
      This target is generally not run by end users.
 
 Compilers and Options
 =====================
 
    Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  Run `./configure --help'
+the 'configure' script does not know about.  Run './configure --help'
 for details on some of the pertinent environment variables.
 
 for details on some of the pertinent environment variables.
 
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
+   You can give 'configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here is
+an example:
 
      ./configure CC=c99 CFLAGS=-g LIBS=-lposix
 
 
      ./configure CC=c99 CFLAGS=-g LIBS=-lposix
 
@@ -113,21 +112,21 @@ Compiling For Multiple Architectures
 
    You can compile the package for more than one kind of computer at the
 same time, by placing the object files for each architecture in their
 
    You can compile the package for more than one kind of computer at the
 same time, by placing the object files for each architecture in their
-own directory.  To do this, you can use GNU `make'.  `cd' to the
+own directory.  To do this, you can use GNU 'make'.  'cd' to the
 directory where you want the object files and executables to go and run
 directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.  This
-is known as a "VPATH" build.
+the 'configure' script.  'configure' automatically checks for the source
+code in the directory that 'configure' is in and in '..'.  This is known
+as a "VPATH" build.
 
 
-   With a non-GNU `make', it is safer to compile the package for one
+   With a non-GNU 'make', it is safer to compile the package for one
 architecture at a time in the source code directory.  After you have
 architecture at a time in the source code directory.  After you have
-installed the package for one architecture, use `make distclean' before
+installed the package for one architecture, use 'make distclean' before
 reconfiguring for another architecture.
 
    On MacOS X 10.5 and later systems, you can create libraries and
 executables that work on multiple system types--known as "fat" or
 reconfiguring for another architecture.
 
    On MacOS X 10.5 and later systems, you can create libraries and
 executables that work on multiple system types--known as "fat" or
-"universal" binaries--by specifying multiple `-arch' options to the
-compiler but only a single `-arch' option to the preprocessor.  Like
+"universal" binaries--by specifying multiple '-arch' options to the
+compiler but only a single '-arch' option to the preprocessor.  Like
 this:
 
      ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
 this:
 
      ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
@@ -136,105 +135,104 @@ this:
 
    This is not guaranteed to produce working output in all cases, you
 may have to build one architecture at a time and combine the results
 
    This is not guaranteed to produce working output in all cases, you
 may have to build one architecture at a time and combine the results
-using the `lipo' tool if you have problems.
+using the 'lipo' tool if you have problems.
 
 Installation Names
 ==================
 
 
 Installation Names
 ==================
 
-   By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc.  You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX', where PREFIX must be an
+   By default, 'make install' installs the package's commands under
+'/usr/local/bin', include files under '/usr/local/include', etc.  You
+can specify an installation prefix other than '/usr/local' by giving
+'configure' the option '--prefix=PREFIX', where PREFIX must be an
 absolute file name.
 
    You can specify separate installation prefixes for
 architecture-specific files and architecture-independent files.  If you
 absolute file name.
 
    You can specify separate installation prefixes for
 architecture-specific files and architecture-independent files.  If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
 PREFIX as the prefix for installing programs and libraries.
 Documentation and other data files still use the regular prefix.
 
    In addition, if you use an unusual directory layout you can give
 PREFIX as the prefix for installing programs and libraries.
 Documentation and other data files still use the regular prefix.
 
    In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.  In general, the
-default for these options is expressed in terms of `${prefix}', so that
-specifying just `--prefix' will affect all of the other directory
+options like '--bindir=DIR' to specify different values for particular
+kinds of files.  Run 'configure --help' for a list of the directories
+you can set and what kinds of files go in them.  In general, the default
+for these options is expressed in terms of '${prefix}', so that
+specifying just '--prefix' will affect all of the other directory
 specifications that were not explicitly provided.
 
    The most portable way to affect installation locations is to pass the
 specifications that were not explicitly provided.
 
    The most portable way to affect installation locations is to pass the
-correct locations to `configure'; however, many packages provide one or
+correct locations to 'configure'; however, many packages provide one or
 both of the following shortcuts of passing variable assignments to the
 both of the following shortcuts of passing variable assignments to the
-`make install' command line to change installation locations without
+'make install' command line to change installation locations without
 having to reconfigure or recompile.
 
    The first method involves providing an override variable for each
 having to reconfigure or recompile.
 
    The first method involves providing an override variable for each
-affected directory.  For example, `make install
+affected directory.  For example, 'make install
 prefix=/alternate/directory' will choose an alternate location for all
 directory configuration variables that were expressed in terms of
 prefix=/alternate/directory' will choose an alternate location for all
 directory configuration variables that were expressed in terms of
-`${prefix}'.  Any directories that were specified during `configure',
-but not in terms of `${prefix}', must each be overridden at install
-time for the entire installation to be relocated.  The approach of
-makefile variable overrides for each directory variable is required by
-the GNU Coding Standards, and ideally causes no recompilation.
-However, some platforms have known limitations with the semantics of
-shared libraries that end up requiring recompilation when using this
-method, particularly noticeable in packages that use GNU Libtool.
-
-   The second method involves providing the `DESTDIR' variable.  For
-example, `make install DESTDIR=/alternate/directory' will prepend
-`/alternate/directory' before all installation names.  The approach of
-`DESTDIR' overrides is not required by the GNU Coding Standards, and
+'${prefix}'.  Any directories that were specified during 'configure',
+but not in terms of '${prefix}', must each be overridden at install time
+for the entire installation to be relocated.  The approach of makefile
+variable overrides for each directory variable is required by the GNU
+Coding Standards, and ideally causes no recompilation.  However, some
+platforms have known limitations with the semantics of shared libraries
+that end up requiring recompilation when using this method, particularly
+noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the 'DESTDIR' variable.  For
+example, 'make install DESTDIR=/alternate/directory' will prepend
+'/alternate/directory' before all installation names.  The approach of
+'DESTDIR' overrides is not required by the GNU Coding Standards, and
 does not work on platforms that have drive letters.  On the other hand,
 it does better at avoiding recompilation issues, and works well even
 does not work on platforms that have drive letters.  On the other hand,
 it does better at avoiding recompilation issues, and works well even
-when some directory options were not specified in terms of `${prefix}'
-at `configure' time.
+when some directory options were not specified in terms of '${prefix}'
+at 'configure' time.
 
 Optional Features
 =================
 
    If the package supports it, you can cause programs to be installed
 
 Optional Features
 =================
 
    If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-   Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
+with an extra prefix or suffix on their names by giving 'configure' the
+option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
+
+   Some packages pay attention to '--enable-FEATURE' options to
+'configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to '--with-PACKAGE' options, where PACKAGE
+is something like 'gnu-as' or 'x' (for the X Window System).  The
+'README' should mention any '--enable-' and '--with-' options that the
 package recognizes.
 
 package recognizes.
 
-   For packages that use the X Window System, `configure' can usually
+   For packages that use the X Window System, 'configure' can usually
 find the X include and library files automatically, but if it doesn't,
 find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
+you can use the 'configure' options '--x-includes=DIR' and
+'--x-libraries=DIR' to specify their locations.
 
    Some packages offer the ability to configure how verbose the
 
    Some packages offer the ability to configure how verbose the
-execution of `make' will be.  For these packages, running `./configure
+execution of 'make' will be.  For these packages, running './configure
 --enable-silent-rules' sets the default to minimal output, which can be
 --enable-silent-rules' sets the default to minimal output, which can be
-overridden with `make V=1'; while running `./configure
+overridden with 'make V=1'; while running './configure
 --disable-silent-rules' sets the default to verbose, which can be
 --disable-silent-rules' sets the default to verbose, which can be
-overridden with `make V=0'.
+overridden with 'make V=0'.
 
 Particular systems
 ==================
 
 
 Particular systems
 ==================
 
-   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
-CC is not installed, it is recommended to use the following options in
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU CC
+is not installed, it is recommended to use the following options in
 order to use an ANSI C compiler:
 
      ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
 
 and if that doesn't work, install pre-built binaries of GCC for HP-UX.
 
 order to use an ANSI C compiler:
 
      ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
 
 and if that doesn't work, install pre-built binaries of GCC for HP-UX.
 
-   HP-UX `make' updates targets which have the same time stamps as
-their prerequisites, which makes it generally unusable when shipped
-generated files such as `configure' are involved.  Use GNU `make'
-instead.
+   HP-UX 'make' updates targets which have the same time stamps as their
+prerequisites, which makes it generally unusable when shipped generated
+files such as 'configure' are involved.  Use GNU 'make' instead.
 
    On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
 
    On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
-parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
-a workaround.  If GNU CC is not installed, it is therefore recommended
-to try
+parse its '<wchar.h>' header file.  The option '-nodtk' can be used as a
+workaround.  If GNU CC is not installed, it is therefore recommended to
+try
 
      ./configure CC="cc"
 
 
      ./configure CC="cc"
 
@@ -242,26 +240,26 @@ and if that doesn't work, try
 
      ./configure CC="cc -nodtk"
 
 
      ./configure CC="cc -nodtk"
 
-   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
+   On Solaris, don't put '/usr/ucb' early in your 'PATH'.  This
 directory contains several dysfunctional programs; working variants of
 directory contains several dysfunctional programs; working variants of
-these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
-in your `PATH', put it _after_ `/usr/bin'.
+these programs are available in '/usr/bin'.  So, if you need '/usr/ucb'
+in your 'PATH', put it _after_ '/usr/bin'.
 
 
-   On Haiku, software installed for all users goes in `/boot/common',
-not `/usr/local'.  It is recommended to use the following options:
+   On Haiku, software installed for all users goes in '/boot/common',
+not '/usr/local'.  It is recommended to use the following options:
 
      ./configure --prefix=/boot/common
 
 Specifying the System Type
 ==========================
 
 
      ./configure --prefix=/boot/common
 
 Specifying the System Type
 ==========================
 
-   There may be some features `configure' cannot figure out
+   There may be some features 'configure' cannot figure out
 automatically, but needs to determine by the type of machine the package
 will run on.  Usually, assuming the package is built to be run on the
 automatically, but needs to determine by the type of machine the package
 will run on.  Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
+_same_ architectures, 'configure' can figure that out, but if it prints
 a message saying it cannot guess the machine type, give it the
 a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
+'--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as 'sun4', or a canonical name which has the form:
 
      CPU-COMPANY-SYSTEM
 
 
      CPU-COMPANY-SYSTEM
 
@@ -270,101 +268,101 @@ where SYSTEM can have one of these forms:
      OS
      KERNEL-OS
 
      OS
      KERNEL-OS
 
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
+   See the file 'config.sub' for the possible values of each field.  If
+'config.sub' isn't included in this package, then this package doesn't
 need to know the machine type.
 
    If you are _building_ compiler tools for cross-compiling, you should
 need to know the machine type.
 
    If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
+use the option '--target=TYPE' to select the type of system they will
 produce code for.
 
    If you want to _use_ a cross compiler, that generates code for a
 platform different from the build platform, you should specify the
 "host" platform (i.e., that on which the generated programs will
 produce code for.
 
    If you want to _use_ a cross compiler, that generates code for a
 platform different from the build platform, you should specify the
 "host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
+eventually be run) with '--host=TYPE'.
 
 Sharing Defaults
 ================
 
 
 Sharing Defaults
 ================
 
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
+   If you want to set default values for 'configure' scripts to share,
+you can create a site shell script called 'config.site' that gives
+default values for variables like 'CC', 'cache_file', and 'prefix'.
+'configure' looks for 'PREFIX/share/config.site' if it exists, then
+'PREFIX/etc/config.site' if it exists.  Or, you can set the
+'CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all 'configure' scripts look for a site script.
 
 Defining Variables
 ==================
 
    Variables not defined in a site shell script can be set in the
 
 Defining Variables
 ==================
 
    Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
+environment passed to 'configure'.  However, some packages may run
 configure again during the build, and the customized values of these
 variables may be lost.  In order to avoid this problem, you should set
 configure again during the build, and the customized values of these
 variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
+them in the 'configure' command line, using 'VAR=value'.  For example:
 
      ./configure CC=/usr/local2/bin/gcc
 
 
      ./configure CC=/usr/local2/bin/gcc
 
-causes the specified `gcc' to be used as the C compiler (unless it is
+causes the specified 'gcc' to be used as the C compiler (unless it is
 overridden in the site shell script).
 
 overridden in the site shell script).
 
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf limitation.  Until the limitation is lifted, you can use
-this workaround:
+Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
+Autoconf limitation.  Until the limitation is lifted, you can use this
+workaround:
 
      CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
 
 
      CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
 
-`configure' Invocation
+'configure' Invocation
 ======================
 
 ======================
 
-   `configure' recognizes the following options to control how it
+   'configure' recognizes the following options to control how it
 operates.
 
 operates.
 
-`--help'
-`-h'
-     Print a summary of all of the options to `configure', and exit.
+'--help'
+'-h'
+     Print a summary of all of the options to 'configure', and exit.
 
 
-`--help=short'
-`--help=recursive'
+'--help=short'
+'--help=recursive'
      Print a summary of the options unique to this package's
      Print a summary of the options unique to this package's
-     `configure', and exit.  The `short' variant lists options used
-     only in the top level, while the `recursive' variant lists options
-     also present in any nested packages.
+     'configure', and exit.  The 'short' variant lists options used only
+     in the top level, while the 'recursive' variant lists options also
+     present in any nested packages.
 
 
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
+'--version'
+'-V'
+     Print the version of Autoconf used to generate the 'configure'
      script, and exit.
 
      script, and exit.
 
-`--cache-file=FILE'
+'--cache-file=FILE'
      Enable the cache: use and save the results of the tests in FILE,
      Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     traditionally 'config.cache'.  FILE defaults to '/dev/null' to
      disable caching.
 
      disable caching.
 
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
+'--config-cache'
+'-C'
+     Alias for '--cache-file=config.cache'.
 
 
-`--quiet'
-`--silent'
-`-q'
+'--quiet'
+'--silent'
+'-q'
      Do not print messages saying which checks are being made.  To
      Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
+     suppress all normal output, redirect it to '/dev/null' (any error
      messages will still be shown).
 
      messages will still be shown).
 
-`--srcdir=DIR'
+'--srcdir=DIR'
      Look for the package's source code in directory DIR.  Usually
      Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
+     'configure' can determine that directory automatically.
 
 
-`--prefix=DIR'
-     Use DIR as the installation prefix.  *note Installation Names::
-     for more details, including other options available for fine-tuning
-     the installation locations.
+'--prefix=DIR'
+     Use DIR as the installation prefix.  *note Installation Names:: for
+     more details, including other options available for fine-tuning the
+     installation locations.
 
 
-`--no-create'
-`-n'
+'--no-create'
+'-n'
      Run the configure checks, but stop before creating any output
      files.
 
      Run the configure checks, but stop before creating any output
      files.
 
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
+'configure' also accepts some other, not widely useful, options.  Run
+'configure --help' for more details.
index 1d8f2e7..fde5256 100644 (file)
@@ -4,14 +4,16 @@ NULL =
 
 ACLOCAL_AMFLAGS = -I m4
 
 
 ACLOCAL_AMFLAGS = -I m4
 
-SUBDIRS = src util test docs win32
+SUBDIRS = src util test docs
 
 EXTRA_DIST = \
        autogen.sh \
        harfbuzz.doap \
        README.python \
        BUILD.md \
 
 EXTRA_DIST = \
        autogen.sh \
        harfbuzz.doap \
        README.python \
        BUILD.md \
+       RELEASING.md \
        CMakeLists.txt \
        CMakeLists.txt \
+       replace-enum-strings.cmake \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
index 138a0de..420fb67 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # Process this file with automake to produce Makefile.in
 VPATH = @srcdir@
 
 # Process this file with automake to produce Makefile.in
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -80,19 +90,17 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = .
 build_triplet = @build@
 host_triplet = @host@
 subdir = .
-DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog THANKS \
-       $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-       $(top_srcdir)/configure $(am__configure_deps) \
-       $(srcdir)/config.h.in COPYING TODO ar-lib compile config.guess \
-       config.sub depcomp install-sh missing ltmain.sh
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-       $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+       $(am__configure_deps) $(am__DIST_COMMON)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(install_sh) -d
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(install_sh) -d
@@ -156,6 +164,10 @@ ETAGS = etags
 CTAGS = ctags
 CSCOPE = cscope
 DIST_SUBDIRS = $(SUBDIRS)
 CTAGS = ctags
 CSCOPE = cscope
 DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \
+       COPYING ChangeLog INSTALL NEWS README THANKS TODO ar-lib \
+       compile config.guess config.sub depcomp install-sh ltmain.sh \
+       missing
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -213,6 +225,12 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
@@ -240,6 +258,8 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
@@ -279,6 +299,7 @@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -287,6 +308,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -343,6 +365,7 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -363,6 +386,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -373,13 +397,15 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
 ACLOCAL_AMFLAGS = -I m4
 top_srcdir = @top_srcdir@
 NULL = 
 ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = src util test docs win32
+SUBDIRS = src util test docs
 EXTRA_DIST = \
        autogen.sh \
        harfbuzz.doap \
        README.python \
        BUILD.md \
 EXTRA_DIST = \
        autogen.sh \
        harfbuzz.doap \
        README.python \
        BUILD.md \
+       RELEASING.md \
        CMakeLists.txt \
        CMakeLists.txt \
+       replace-enum-strings.cmake \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
@@ -435,7 +461,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits Makefile
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -659,7 +684,7 @@ distdir: $(DISTFILES)
          ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
        || chmod -R a+r "$(distdir)"
 dist-gzip: distdir
          ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
        || chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
        $(am__post_remove_distdir)
 dist-bzip2: distdir
        tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
        $(am__post_remove_distdir)
 dist-bzip2: distdir
        tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
@@ -674,17 +699,17 @@ dist-xz: distdir
        $(am__post_remove_distdir)
 
 dist-tarZ: distdir
        $(am__post_remove_distdir)
 
 dist-tarZ: distdir
-       @echo WARNING: "Support for shar distribution archives is" \
-                      "deprecated." >&2
+       @echo WARNING: "Support for distribution archives compressed with" \
+                      "legacy program 'compress' is deprecated." >&2
        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
        tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
        $(am__post_remove_distdir)
 
 dist-shar: distdir
        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
        tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
        $(am__post_remove_distdir)
 
 dist-shar: distdir
-       @echo WARNING: "Support for distribution archives compressed with" \
-                      "legacy program 'compress' is deprecated." >&2
+       @echo WARNING: "Support for shar distribution archives is" \
+                      "deprecated." >&2
        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
        $(am__post_remove_distdir)
 
 dist-zip: distdir
        $(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -702,7 +727,7 @@ dist dist-all:
 distcheck: dist
        case '$(DIST_ARCHIVES)' in \
        *.tar.gz*) \
 distcheck: dist
        case '$(DIST_ARCHIVES)' in \
        *.tar.gz*) \
-         GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+         eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
        *.tar.bz2*) \
          bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
        *.tar.lz*) \
        *.tar.bz2*) \
          bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
        *.tar.lz*) \
@@ -712,23 +737,23 @@ distcheck: dist
        *.tar.Z*) \
          uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
        *.shar.gz*) \
        *.tar.Z*) \
          uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
        *.shar.gz*) \
-         GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+         eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
        chmod -R a-w $(distdir)
        chmod u+w $(distdir)
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
        chmod -R a-w $(distdir)
        chmod u+w $(distdir)
-       mkdir $(distdir)/_build $(distdir)/_inst
+       mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
        chmod a-w $(distdir)
        test -d $(distdir)/_build || exit 0; \
        dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
          && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
          && am__cwd=`pwd` \
        chmod a-w $(distdir)
        test -d $(distdir)/_build || exit 0; \
        dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
          && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
          && am__cwd=`pwd` \
-         && $(am__cd) $(distdir)/_build \
-         && ../configure \
+         && $(am__cd) $(distdir)/_build/sub \
+         && ../../configure \
            $(AM_DISTCHECK_CONFIGURE_FLAGS) \
            $(DISTCHECK_CONFIGURE_FLAGS) \
            $(AM_DISTCHECK_CONFIGURE_FLAGS) \
            $(DISTCHECK_CONFIGURE_FLAGS) \
-           --srcdir=.. --prefix="$$dc_install_base" \
+           --srcdir=../.. --prefix="$$dc_install_base" \
          && $(MAKE) $(AM_MAKEFLAGS) \
          && $(MAKE) $(AM_MAKEFLAGS) dvi \
          && $(MAKE) $(AM_MAKEFLAGS) check \
          && $(MAKE) $(AM_MAKEFLAGS) \
          && $(MAKE) $(AM_MAKEFLAGS) dvi \
          && $(MAKE) $(AM_MAKEFLAGS) check \
@@ -906,6 +931,8 @@ uninstall-am:
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
        tags tags-am uninstall uninstall-am
 
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
        tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 ChangeLog: $(srcdir)/ChangeLog
 $(srcdir)/ChangeLog:
        $(AM_V_GEN) if test -d "$(top_srcdir)/.git"; then \
 ChangeLog: $(srcdir)/ChangeLog
 $(srcdir)/ChangeLog:
        $(AM_V_GEN) if test -d "$(top_srcdir)/.git"; then \
diff --git a/NEWS b/NEWS
index 9c7e7d3..fe09ab1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,217 @@
+Overview of changes leading to 1.7.6
+Wednesday, March 7, 2018
+====================================
+
+- Fix to hb_set_t binary operations. Ouch.
+- New experimental harfbuzz-subset library. All of hb-subset.h
+  is experimental right now and API WILL change.
+
+- New API:
+hb_blob_copy_writable_or_fail()
+HB_OT_TAG_BASE
+hb_set_previous()
+hb_set_previous_range()
+
+
+Overview of changes leading to 1.7.5
+Tuesday, January 30, 2018
+====================================
+
+- Separate Khmer shaper from Indic.
+- First stab at AAT morx. Not hooked up.
+- Misc bug fixes.
+
+
+Overview of changes leading to 1.7.4
+Wednesday, December 20, 2017
+====================================
+
+- Fix collect_glyphs() regression caused by hb_set_t changes.
+
+
+Overview of changes leading to 1.7.3
+Monday, December 18, 2017
+====================================
+
+- hb_set_t performance tuning and optimizations.
+- Speed up collect_glyphs() and reject garbage data.
+- In hb_coretext_font_create() set font point-size (ptem).
+- Misc fixes.
+
+
+Overview of changes leading to 1.7.2
+Monday, December 4, 2017
+====================================
+
+- Optimize hb_set_add_range().
+- Misc fixes.
+- New API:
+hb_coretext_font_create()
+
+
+Overview of changes leading to 1.7.1
+Tuesday, November 14, 2017
+====================================
+
+- Fix atexit object destruction regression.
+- Fix minor integer-overflow.
+
+
+Overview of changes leading to 1.7.0
+Monday, November 13, 2017
+====================================
+
+- Minor Indic fixes.
+- Implement kerning and glyph names in hb-ot-font.
+- Various DSO optimization re .data and .bss sizes.
+- Make C++11 optional; build fixes.
+- Mark all other backends "unsafe-to-break".
+- Graphite fix.
+
+
+Overview of changes leading to 1.6.3
+Thursday, October 26th, 2017
+====================================
+
+- Fix hb_set_t some more.  Should be solid now.
+- Implement get_glyph_name() for hb-ot-font.
+- Misc fixes.
+
+
+Overview of changes leading to 1.6.2
+Monday, October 23nd, 2017
+====================================
+
+- Yesterday's release had a bad crasher; don't use it.  That's what
+  happens when one works on Sunday...
+  https://github.com/harfbuzz/harfbuzz/issues/578
+- Build fixes for FreeBSD and Chrome Android.
+
+
+Overview of changes leading to 1.6.1
+Sunday, October 22nd, 2017
+====================================
+
+- Don't skip over COMBINING GRAPHEME JOINER when ligating, etc.
+  To be refined: https://github.com/harfbuzz/harfbuzz/issues/554
+- Faster hb_set_t implementation.
+- Don't use deprecated ICU API.
+- Fix undefined-behavior in Myanmar shaper, introduced in 1.6.0
+- Deprecated API:
+  hb_set_invert()
+
+
+Overview of changes leading to 1.6.0
+Friday, October the 13th, 2017
+====================================
+
+- Update to Unicode 10.
+
+- Various Indic and Universal Shaping Engine fixes as a result of
+  HarfBuzz Hackfest with Jonathan Kew at Web Engines Hackfest at
+  the Igalia offices in A Coruña, Spain.  Thanks Igalia for having
+  us!
+
+- Implement Unicode Arabic Mark Ordering Algorithm UTR#53.
+
+- Implement optical sizing / tracking in CoreText backend, using
+  new API hb_font_set_ptem().
+
+- Allow notifying hb_font_t that underlying FT_Face changed sizing,
+  using new API hb_ft_font_changed().
+
+- More Graphite backend RTL fixes.
+
+- Fix caching of variable font shaping plans.
+
+- hb-view / hb-shape now accept following new arguments:
+
+  o --unicodes: takes a list of hex numbers that represent Unicode
+    codepoints.
+
+New API:
++hb_face_get_table_tags()
++hb_font_set_ptem()
++hb_font_get_ptem()
++hb_ft_font_changed()
+
+
+Overview of changes leading to 1.5.1
+Tuesday, September 5, 2017
+====================================
+
+- Fix "unsafe-to-break" in fallback shaping and other corner cases.
+  All our tests pass with --verify now, meaning unsafe-to-break API
+  works as expected.
+- Add --unicodes to hb-view / hb-shape.
+- [indic] Treat Consonant_With_Stacker as consonant.  This will need
+  further tweaking.
+- hb_buffer_diff() tweaks.
+
+
+Overview of changes leading to 1.5.0
+Wednesday, August 23, 2017
+====================================
+
+- Misc new API, for appending a buffer to another, and for comparing
+  contents of two buffers for types of differences.
+
+- New "unsafe-to-break" API.  Can be used to speed up reshaping
+  in line-breaking situations.  Essentially, after shaping, it returns
+  positions in the input string (some of the cluster boundaries) that
+  are "safe to break" in that if the text is segmented at that position
+  and two sides reshaped and concatenated, the shaping result is
+  exactly the same as shaping the text in one piece.
+
+  hb-view and hb-shape and hb-shape now take --verify, which verifies
+  the above property.
+
+  Some corner cases of the implementation are still not quite working.
+  Those will be fixed in subsequent releases.
+
+- New API:
+
+hb_buffer_append()
+
+hb_glyph_flags_t
+HB_GLYPH_FLAG_UNSAFE_TO_BREAK
+HB_GLYPH_FLAG_DEFINED
+hb_glyph_info_get_glyph_flags()
+
+HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS
+
+hb_buffer_diff_flags_t
+HB_BUFFER_DIFF_FLAG_EQUAL
+HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH
+HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH
+HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT
+HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
+HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH
+HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH
+HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH
+HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH
+hb_buffer_diff
+
+
+Overview of changes leading to 1.4.8
+Tuesday, August 8, 2017
+====================================
+
+- Major fix to avar table handling.
+- Rename hb-shape --show-message to --trace.
+- Build fixes.
+
+
+Overview of changes leading to 1.4.7
+Tuesday, July 18, 2017
+====================================
+
+- Multiple Indic, Tibetan, and Cham fixes.
+- CoreText: Allow disabling kerning.
+- Adjust Arabic feature order again.
+- Misc build fixes.
+
+
 Overview of changes leading to 1.4.6
 Sunday, April 23, 2017
 ====================================
 Overview of changes leading to 1.4.6
 Sunday, April 23, 2017
 ====================================
@@ -280,7 +494,7 @@ Tuesday, February 23, 2016
 - CoreText: Drastically speed up font initialization.
 - CoreText: Fix tiny leak.
 - Group ZWJ/ZWNJ with previous syllable under cluster-level=0.
 - CoreText: Drastically speed up font initialization.
 - CoreText: Fix tiny leak.
 - Group ZWJ/ZWNJ with previous syllable under cluster-level=0.
-  https://github.com/behdad/harfbuzz/issues/217
+  https://github.com/harfbuzz/harfbuzz/issues/217
 - Add test/shaping/README.md about how to add tests to the suite.
 
 
 - Add test/shaping/README.md about how to add tests to the suite.
 
 
@@ -296,8 +510,8 @@ Friday, February 19, 2016
 - Allow GPOS cursive connection on marks, and fix the interaction with
   mark attachment.  This work resulted in some changes to how mark
   attachments work.  See:
 - Allow GPOS cursive connection on marks, and fix the interaction with
   mark attachment.  This work resulted in some changes to how mark
   attachments work.  See:
-  https://github.com/behdad/harfbuzz/issues/211
-  https://github.com/behdad/harfbuzz/commit/86c68c7a2c971efe8e35b1f1bd99401dc8b688d2
+  https://github.com/harfbuzz/harfbuzz/issues/211
+  https://github.com/harfbuzz/harfbuzz/commit/86c68c7a2c971efe8e35b1f1bd99401dc8b688d2
 - Graphite2 shaper: improved negative advance handling (eg. Nastaliq).
 - Add nmake-based build system for Windows.
 - Minor speedup.
 - Graphite2 shaper: improved negative advance handling (eg. Nastaliq).
 - Add nmake-based build system for Windows.
 - Minor speedup.
@@ -338,7 +552,7 @@ Wednesday, November 26, 2015
 ====================================
 
 - Fix badly-broken fallback shaper that affected terminology.
 ====================================
 
 - Fix badly-broken fallback shaper that affected terminology.
-  https://github.com/behdad/harfbuzz/issues/187
+  https://github.com/harfbuzz/harfbuzz/issues/187
 - Fix y_scaling in Graphite shaper.
 - API changes:
   * An unset glyph_h_origin() function in font-funcs now (sensibly)
 - Fix y_scaling in Graphite shaper.
 - API changes:
   * An unset glyph_h_origin() function in font-funcs now (sensibly)
@@ -360,11 +574,11 @@ Wednesday, November 18, 2015
 ====================================
 
 - Implement 'stch' stretch feature for Syriac Abbreviation Mark.
 ====================================
 
 - Implement 'stch' stretch feature for Syriac Abbreviation Mark.
-  https://github.com/behdad/harfbuzz/issues/141
+  https://github.com/harfbuzz/harfbuzz/issues/141
 - Disable use of decompose_compatibility() callback.
 - Implement "shaping" of various Unicode space characters, even
   if the font does not support them.
 - Disable use of decompose_compatibility() callback.
 - Implement "shaping" of various Unicode space characters, even
   if the font does not support them.
-  https://github.com/behdad/harfbuzz/issues/153
+  https://github.com/harfbuzz/harfbuzz/issues/153
 - If font does not support U+2011 NO-BREAK HYPHEN, fallback to
   U+2010 HYPHEN.
 - Changes resulting from libFuzzer continuous fuzzing:
 - If font does not support U+2011 NO-BREAK HYPHEN, fallback to
   U+2010 HYPHEN.
 - Changes resulting from libFuzzer continuous fuzzing:
@@ -387,7 +601,7 @@ Thursday, October 15, 2015
 - Revert default load-flags of fonts created using hb_ft_font_create()
   back to FT_LOAD_DEFAULT|FT_LOAD_NO_HINTING.  This was changed in
   last release (1.0.5), but caused major issues, so revert.
 - Revert default load-flags of fonts created using hb_ft_font_create()
   back to FT_LOAD_DEFAULT|FT_LOAD_NO_HINTING.  This was changed in
   last release (1.0.5), but caused major issues, so revert.
-  https://github.com/behdad/harfbuzz/issues/143
+  https://github.com/harfbuzz/harfbuzz/issues/143
 
 
 Overview of changes leading to 1.0.5
 
 
 Overview of changes leading to 1.0.5
@@ -395,7 +609,7 @@ Tuesday, October 13, 2015
 ====================================
 
 - Fix multiple memory access bugs discovered using libFuzzer.
 ====================================
 
 - Fix multiple memory access bugs discovered using libFuzzer.
-  https://github.com/behdad/harfbuzz/issues/139
+  https://github.com/harfbuzz/harfbuzz/issues/139
   Everyone should upgrade to this version as soon as possible.
   We now have continuous fuzzing set up, to avoid issues like
   these creeping in again.
   Everyone should upgrade to this version as soon as possible.
   We now have continuous fuzzing set up, to avoid issues like
   these creeping in again.
@@ -666,7 +880,7 @@ Wednesday, July 16, 2014
   U+FFFD REPLACEMENT CHARACTER now.
 - With all changes in this release, the buffer will contain fully
   valid Unicode after hb_buffer_add_utf8/16/32 no matter how
   U+FFFD REPLACEMENT CHARACTER now.
 - With all changes in this release, the buffer will contain fully
   valid Unicode after hb_buffer_add_utf8/16/32 no matter how
-  broken the input is.  This can be overriden though.  See below.
+  broken the input is.  This can be overridden though.  See below.
 - Fix Mongolian Variation Selectors for fonts without GDEF.
 - Fix minor invalid buffer access.
 - Accept zh-Hant and zh-Hans language tags.  hb_ot_tag_to_language()
 - Fix Mongolian Variation Selectors for fonts without GDEF.
 - Fix minor invalid buffer access.
 - Accept zh-Hant and zh-Hans language tags.  hb_ot_tag_to_language()
diff --git a/README b/README
index 69a1bdd..6e21322 100644 (file)
--- a/README
+++ b/README
@@ -1,6 +1,8 @@
-[![Build Status](https://travis-ci.org/behdad/harfbuzz.svg)](https://travis-ci.org/behdad/harfbuzz)
-[![Build Status](https://ci.appveyor.com/api/projects/status/4oaq58ns2h0m2soa?svg=true)](https://ci.appveyor.com/project/behdad/harfbuzz)
-[![Coverage Status](https://img.shields.io/coveralls/behdad/harfbuzz.svg)](https://coveralls.io/r/behdad/harfbuzz)
+[![Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg)](https://travis-ci.org/harfbuzz/harfbuzz)
+[![Build status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true)](https://ci.appveyor.com/project/harfbuzz/harfbuzz)
+[![CircleCI](https://circleci.com/gh/harfbuzz/harfbuzz.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz)
+[![Coverity](https://img.shields.io/coverity/scan/5450.svg)](https://scan.coverity.com/projects/behdad-harfbuzz)
+[![Coverage Status](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz)
 [ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/)
 
 This is HarfBuzz, a text shaping library.
 [ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/)
 
 This is HarfBuzz, a text shaping library.
@@ -10,3 +12,5 @@ For bug reports, mailing list, and other information please visit:
   http://harfbuzz.org/
 
 For license information, see the file COPYING.
   http://harfbuzz.org/
 
 For license information, see the file COPYING.
+
+Documentation: https://harfbuzz.github.io
diff --git a/RELEASING.md b/RELEASING.md
new file mode 100644 (file)
index 0000000..dedcca8
--- /dev/null
@@ -0,0 +1,99 @@
+HarfBuzz release walk-through checklist:
+
+1. Open gitk and review changes since last release.
+
+   * `git diff $(git describe | sed 's/-.*//').. src/*.h` prints all public API
+     changes.
+
+     Document them in NEWS.  All API and API semantic changes should be clearly
+     marked as API additions, API changes, or API deletions.  Document
+     deprecations.
+
+     If there's a backward-incompatible API change (including deletions for API
+     used anywhere), that's a release blocker.  Do NOT release.
+
+2. Based on severity of changes, decide whether it's a minor or micro release
+   number bump,
+
+3. Make sure you have correct date and new version at the top of NEWS file,
+
+4. Bump version in configure.ac line 3,
+
+5. Do "make distcheck", if it passes, you get a tarball.
+   Otherwise, fix things and commit them separately before making release,
+
+6. "make release-files".  Enter your GPG password.  This creates a sha256 hash
+   and signs it.
+
+7. Now that you have release files built, commit NEWS and configure.ac changes.
+   The commit message is simply the release number.  Eg. "1.4.7"
+
+8. Tag the release and sign it: Eg. "git tag -s 1.4.7 -m 1.4.7".  Enter your
+   GPG password again.
+
+9. Build win32 bundle.
+
+   a. Put contents of [this](https://drive.google.com/open?id=0B3_fQkxDZZXXbWltRGd5bjVrUDQ) on your `~/.local/i686-w64-mingw32`,
+
+   b. Run `../mingw32.sh --with-uniscribe` script (available below) to configure harfbuzz with mingw in a subdirector (eg. winbuild/),
+
+   c. make
+
+   d. Back in the parent directory, run `./UPDATE.sh` (available below) to build win32 bundle.
+
+10. 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.bz2
+-rw-r--r--  1 behdad eng      89 Jul 18 11:34 harfbuzz-1.4.7.tar.bz2.sha256
+-rw-r--r--  1 behdad eng     339 Jul 18 11:34 harfbuzz-1.4.7.tar.bz2.sha256.asc
+-rw-r--r--  1 behdad eng 2895619 Jul 18 11:34 harfbuzz-1.4.7-win32.zip
+```
+
+11. While doing that, quickly double-check the size of the .tar.bz2 and .zip
+    files against their previous releases to make sure nothing bad happened.
+    They should be in the ballpark, perhaps slightly larger.  Sometimes they
+    do shrink, that's not by itself a stopper.
+
+12. Push the commit and tag out: "git push --follow-tags".  Make sure it's
+    pushed both to freedesktop repo and github.
+
+13. Go to GitHub release page [here](https://github.com/harfbuzz/harfbuzz/releases),
+    edit the tag, upload artefacts and NEWS entry and save.
+
+
+## UPDATE.sh
+```bash
+#!/bin/bash
+
+v=$1
+
+if test "x$v" = x; then
+       echo "usage: UPDATE.sh micro-version"
+       exit 1
+fi
+
+dir_prefix=harfbuzz-1.4.
+dir_suffix=-win32
+dir=$dir_prefix$v$dir_suffix
+dir_old=$dir_prefix$((v-1))$dir_suffix
+if test -d "$dir"; then
+       echo "New dir $dir exists; not overwriting"
+       exit 1
+fi
+if ! test -d "$dir_old"; then
+       echo "Old dir $dir_old does NOT exist; aborting"
+       exit 1
+fi
+set -ex
+cp -a "$dir_old" "$dir.tmp"
+rm -f "$dir.tmp"/GDX32.dll
+rm -f "$dir.tmp"/usp10.dll
+cp ../winbuild/src/.libs/libharfbuzz-0.dll{,.def} $dir.tmp/
+cp ../winbuild/util/.libs/hb-{shape,view}.exe $dir.tmp/
+i686-w64-mingw32-strip $dir.tmp/{hb-shape.exe,hb-view.exe,libharfbuzz-0.dll}
+mv $dir.tmp $dir
+zip -r $dir.zip $dir
+echo Bundle $dir.zip ready
+```
diff --git a/TODO b/TODO
index 4f37f60..53ffbe9 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,24 +1,14 @@
 General fixes:
 =============
 
 General fixes:
 =============
 
-- AAT 'morx' implementation.
-
-- Return "safe-to-break" bit from shaping.
-
 - Implement 'rand' feature.
 
 - Implement 'rand' feature.
 
-- mask propagation? (when ligation, "or" the masks).
-
 
 API issues:
 ===========
 
 - API to accept a list of languages?
 
 
 API issues:
 ===========
 
 - API to accept a list of languages?
 
-- Add init_func to font_funcs.  Adjust ft.
-
-- 'const' for getter APIs? (use mutable internally)
-
 - Remove hb_ot_shape_glyphs_closure()?
 
 
 - Remove hb_ot_shape_glyphs_closure()?
 
 
@@ -39,7 +29,7 @@ API additions
 
 - Add query / enumeration API for aalt-like features?
 
 
 - Add query / enumeration API for aalt-like features?
 
-- SFNT api? get_num_faces? get_table_tags? (there's something in stash)
+- SFNT api? get_num_faces?
 
 - Add segmentation API
 
 
 - Add segmentation API
 
@@ -50,20 +40,3 @@ hb-view / hb-shape enhancements:
 ===============================
 
 - Add --width, --height, --auto-size, --ink-box, --align, etc?
 ===============================
 
 - Add --width, --height, --auto-size, --ink-box, --align, etc?
-
-
-Tests to write:
-==============
-
-- ot-layout enumeration API (needs font)
-
-- Finish test-shape.c, grep for TODO
-
-- Finish test-unicode.c, grep for TODO
-
-- GObject, FreeType, etc
-
-- hb_cache_t and relatives
-
-- hb_feature_to/from_string
-- hb_buffer_[sg]et_contents
index c0e8135..31c76e3 100644 (file)
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
 
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -117,7 +117,7 @@ AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE],
   _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require])
 ])
 
   _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require])
 ])
 
-# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -129,10 +129,10 @@ AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE],
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.14'
+[am__api_version='1.15'
 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.
 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.14.1], [],
+m4_if([$1], [1.15.1], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -148,12 +148,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],
 # 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.14.1])dnl
+[AM_AUTOMAKE_VERSION([1.15.1])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 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-2013 Free Software Foundation, Inc.
+# Copyright (C) 2011-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -215,7 +215,7 @@ AC_SUBST([AR])dnl
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -260,15 +260,14 @@ AC_SUBST([AR])dnl
 # configured tree to be moved without reconfiguration.
 
 AC_DEFUN([AM_AUX_DIR_EXPAND],
 # configured tree to be moved without reconfiguration.
 
 AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 ])
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
 ])
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -299,7 +298,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -490,7 +489,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -566,7 +565,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -656,8 +655,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([AC_PROG_MAKE_SET])dnl
 AC_REQUIRE([AM_SET_LEADING_DOT])dnl
 AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([AC_PROG_MAKE_SET])dnl
 AC_REQUIRE([AM_SET_LEADING_DOT])dnl
@@ -730,7 +729,11 @@ to "yes", and re-run configure.
 END
     AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
   fi
 END
     AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
   fi
-fi])
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
 
 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
 
 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
@@ -759,7 +762,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -770,7 +773,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\    *)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
   case $am_aux_dir in
   *\ * | *\    *)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -780,7 +783,7 @@ if test x"${install_sh}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2013 Free Software Foundation, Inc.
+# Copyright (C) 2003-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -801,7 +804,7 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
 
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -851,7 +854,7 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -890,7 +893,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -919,7 +922,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -966,7 +969,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -985,7 +988,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1066,7 +1069,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+# Copyright (C) 2009-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1126,7 +1129,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1154,7 +1157,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2013 Free Software Foundation, Inc.
+# Copyright (C) 2006-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1173,7 +1176,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2013 Free Software Foundation, Inc.
+# Copyright (C) 2004-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1304,6 +1307,7 @@ AC_SUBST([am__tar])
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
 
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
 
+m4_include([m4/ax_code_coverage.m4])
 m4_include([m4/ax_pthread.m4])
 m4_include([m4/gtk-doc.m4])
 m4_include([m4/libtool.m4])
 m4_include([m4/ax_pthread.m4])
 m4_include([m4/gtk-doc.m4])
 m4_include([m4/libtool.m4])
diff --git a/ar-lib b/ar-lib
index fe2301e..05094d3 100755 (executable)
--- a/ar-lib
+++ b/ar-lib
@@ -4,7 +4,7 @@
 me=ar-lib
 scriptversion=2012-03-01.08; # UTC
 
 me=ar-lib
 scriptversion=2012-03-01.08; # UTC
 
-# Copyright (C) 2010-2013 Free Software Foundation, Inc.
+# Copyright (C) 2010-2017 Free Software Foundation, Inc.
 # Written by Peter Rosin <peda@lysator.liu.se>.
 #
 # This program is free software; you can redistribute it and/or modify
 # Written by Peter Rosin <peda@lysator.liu.se>.
 #
 # This program is free software; you can redistribute it and/or modify
index ff1b0c0..fd5c198 100755 (executable)
@@ -7,11 +7,11 @@ test -n "$srcdir" || srcdir=.
 olddir=`pwd`
 cd $srcdir
 
 olddir=`pwd`
 cd $srcdir
 
-echo -n "checking for ragel... "
-which ragel || {
-       echo "You need to install ragel... See http://www.complang.org/ragel/"
-       exit 1
-}
+#echo -n "checking for ragel... "
+#which ragel || {
+#      echo "You need to install ragel... See http://www.complang.org/ragel/"
+#      exit 1
+#}
 
 echo -n "checking for pkg-config... "
 which pkg-config || {
 
 echo -n "checking for pkg-config... "
 which pkg-config || {
@@ -42,5 +42,7 @@ echo "running autoreconf --force --install --verbose"
 autoreconf --force --install --verbose || exit $?
 
 cd $olddir
 autoreconf --force --install --verbose || exit $?
 
 cd $olddir
-echo "running configure $@"
-test -n "$NOCONFIGURE" || "$srcdir/configure" "$@"
+test -n "$NOCONFIGURE" || {
+       echo "running configure $@"
+       "$srcdir/configure" "$@"
+}
diff --git a/compile b/compile
index 531136b..a85b723 100755 (executable)
--- a/compile
+++ b/compile
@@ -3,7 +3,7 @@
 
 scriptversion=2012-10-14.11; # UTC
 
 
 scriptversion=2012-10-14.11; # UTC
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey@cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
 # Written by Tom Tromey <tromey@cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
index b79252d..2e9ad7f 100755 (executable)
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2016 Free Software Foundation, Inc.
 
 
-timestamp='2013-06-10'
+timestamp='2016-10-02'
 
 # 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
 
 # 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
@@ -24,12 +24,12 @@ timestamp='2013-06-10'
 # program.  This Exception is an additional permission under section 7
 # of the GNU General Public License, version 3 ("GPLv3").
 #
 # program.  This Exception is an additional permission under section 7
 # of the GNU General Public License, version 3 ("GPLv3").
 #
-# Originally written by Per Bothner.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
 #
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 #
 #
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+# Please send patches to <config-patches@gnu.org>.
 
 
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 
 me=`echo "$0" | sed -e 's,.*/,,'`
@@ -50,7 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2016 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 is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -149,7 +149,7 @@ Linux|GNU|GNU/*)
        LIBC=gnu
        #endif
        EOF
        LIBC=gnu
        #endif
        EOF
-       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
        ;;
 esac
 
        ;;
 esac
 
@@ -168,19 +168,29 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        # Note: NetBSD doesn't particularly care about the vendor
        # portion of the name.  We always set it to "unknown".
        sysctl="sysctl -n hw.machine_arch"
        # Note: NetBSD doesn't particularly care about the vendor
        # portion of the name.  We always set it to "unknown".
        sysctl="sysctl -n hw.machine_arch"
-       UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+           /sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || \
+           echo unknown)`
        case "${UNAME_MACHINE_ARCH}" in
            armeb) machine=armeb-unknown ;;
            arm*) machine=arm-unknown ;;
            sh3el) machine=shl-unknown ;;
            sh3eb) machine=sh-unknown ;;
            sh5el) machine=sh5le-unknown ;;
        case "${UNAME_MACHINE_ARCH}" in
            armeb) machine=armeb-unknown ;;
            arm*) machine=arm-unknown ;;
            sh3el) machine=shl-unknown ;;
            sh3eb) machine=sh-unknown ;;
            sh5el) machine=sh5le-unknown ;;
+           earmv*)
+               arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+               endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+               machine=${arch}${endian}-unknown
+               ;;
            *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
        esac
        # The Operating System including object format, if it has switched
            *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
        esac
        # The Operating System including object format, if it has switched
-       # to ELF recently, or will in the future.
+       # to ELF recently (or will in the future) and ABI.
        case "${UNAME_MACHINE_ARCH}" in
        case "${UNAME_MACHINE_ARCH}" in
+           earm*)
+               os=netbsdelf
+               ;;
            arm*|i386|m68k|ns32k|sh3*|sparc|vax)
                eval $set_cc_for_build
                if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
            arm*|i386|m68k|ns32k|sh3*|sparc|vax)
                eval $set_cc_for_build
                if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
@@ -197,6 +207,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
                os=netbsd
                ;;
        esac
                os=netbsd
                ;;
        esac
+       # Determine ABI tags.
+       case "${UNAME_MACHINE_ARCH}" in
+           earm*)
+               expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+               abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+               ;;
+       esac
        # The OS release
        # Debian GNU/NetBSD machines have a different userland, and
        # thus, need a distinct triplet. However, they do not need
        # The OS release
        # Debian GNU/NetBSD machines have a different userland, and
        # thus, need a distinct triplet. However, they do not need
@@ -207,13 +224,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
                release='-gnu'
                ;;
            *)
                release='-gnu'
                ;;
            *)
-               release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+               release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
                ;;
        esac
        # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
        # contains redundant information, the shorter form:
        # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
                ;;
        esac
        # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
        # contains redundant information, the shorter form:
        # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-       echo "${machine}-${os}${release}"
+       echo "${machine}-${os}${release}${abi}"
        exit ;;
     *:Bitrig:*:*)
        UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
        exit ;;
     *:Bitrig:*:*)
        UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -223,6 +240,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
        echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
        exit ;;
        UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
        echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
        exit ;;
+    *:LibertyBSD:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+       echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+       exit ;;
     *:ekkoBSD:*:*)
        echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
        exit ;;
     *:ekkoBSD:*:*)
        echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
        exit ;;
@@ -235,6 +256,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:MirBSD:*:*)
        echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
        exit ;;
     *:MirBSD:*:*)
        echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
        exit ;;
+    *:Sortix:*:*)
+       echo ${UNAME_MACHINE}-unknown-sortix
+       exit ;;
     alpha:OSF1:*:*)
        case $UNAME_RELEASE in
        *4.0)
     alpha:OSF1:*:*)
        case $UNAME_RELEASE in
        *4.0)
@@ -251,42 +275,42 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
        case "$ALPHA_CPU_TYPE" in
            "EV4 (21064)")
        ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
        case "$ALPHA_CPU_TYPE" in
            "EV4 (21064)")
-               UNAME_MACHINE="alpha" ;;
+               UNAME_MACHINE=alpha ;;
            "EV4.5 (21064)")
            "EV4.5 (21064)")
-               UNAME_MACHINE="alpha" ;;
+               UNAME_MACHINE=alpha ;;
            "LCA4 (21066/21068)")
            "LCA4 (21066/21068)")
-               UNAME_MACHINE="alpha" ;;
+               UNAME_MACHINE=alpha ;;
            "EV5 (21164)")
            "EV5 (21164)")
-               UNAME_MACHINE="alphaev5" ;;
+               UNAME_MACHINE=alphaev5 ;;
            "EV5.6 (21164A)")
            "EV5.6 (21164A)")
-               UNAME_MACHINE="alphaev56" ;;
+               UNAME_MACHINE=alphaev56 ;;
            "EV5.6 (21164PC)")
            "EV5.6 (21164PC)")
-               UNAME_MACHINE="alphapca56" ;;
+               UNAME_MACHINE=alphapca56 ;;
            "EV5.7 (21164PC)")
            "EV5.7 (21164PC)")
-               UNAME_MACHINE="alphapca57" ;;
+               UNAME_MACHINE=alphapca57 ;;
            "EV6 (21264)")
            "EV6 (21264)")
-               UNAME_MACHINE="alphaev6" ;;
+               UNAME_MACHINE=alphaev6 ;;
            "EV6.7 (21264A)")
            "EV6.7 (21264A)")
-               UNAME_MACHINE="alphaev67" ;;
+               UNAME_MACHINE=alphaev67 ;;
            "EV6.8CB (21264C)")
            "EV6.8CB (21264C)")
-               UNAME_MACHINE="alphaev68" ;;
+               UNAME_MACHINE=alphaev68 ;;
            "EV6.8AL (21264B)")
            "EV6.8AL (21264B)")
-               UNAME_MACHINE="alphaev68" ;;
+               UNAME_MACHINE=alphaev68 ;;
            "EV6.8CX (21264D)")
            "EV6.8CX (21264D)")
-               UNAME_MACHINE="alphaev68" ;;
+               UNAME_MACHINE=alphaev68 ;;
            "EV6.9A (21264/EV69A)")
            "EV6.9A (21264/EV69A)")
-               UNAME_MACHINE="alphaev69" ;;
+               UNAME_MACHINE=alphaev69 ;;
            "EV7 (21364)")
            "EV7 (21364)")
-               UNAME_MACHINE="alphaev7" ;;
+               UNAME_MACHINE=alphaev7 ;;
            "EV7.9 (21364A)")
            "EV7.9 (21364A)")
-               UNAME_MACHINE="alphaev79" ;;
+               UNAME_MACHINE=alphaev79 ;;
        esac
        # A Pn.n version is a patched version.
        # A Vn.n version is a released version.
        # A Tn.n version is a released field test version.
        # A Xn.n version is an unreleased experimental baselevel.
        # 1.2 uses "1.2" for uname -r.
        esac
        # A Pn.n version is a patched version.
        # A Vn.n version is a released version.
        # A Tn.n version is a released field test version.
        # A Xn.n version is an unreleased experimental baselevel.
        # 1.2 uses "1.2" for uname -r.
-       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
        # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
        exitcode=$?
        trap '' 0
        # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
        exitcode=$?
        trap '' 0
@@ -359,16 +383,16 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
        eval $set_cc_for_build
        exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
        eval $set_cc_for_build
-       SUN_ARCH="i386"
+       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.
        # This test works for both compilers.
        # 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.
        # This test works for both compilers.
-       if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+       if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
            if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
            if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-               (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+               (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
                grep IS_64BIT_ARCH >/dev/null
            then
                grep IS_64BIT_ARCH >/dev/null
            then
-               SUN_ARCH="x86_64"
+               SUN_ARCH=x86_64
            fi
        fi
        echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
            fi
        fi
        echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
@@ -393,7 +417,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        exit ;;
     sun*:*:4.2BSD:*)
        UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
        exit ;;
     sun*:*:4.2BSD:*)
        UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
        case "`/bin/arch`" in
            sun3)
                echo m68k-sun-sunos${UNAME_RELEASE}
        case "`/bin/arch`" in
            sun3)
                echo m68k-sun-sunos${UNAME_RELEASE}
@@ -579,8 +603,9 @@ EOF
        else
                IBM_ARCH=powerpc
        fi
        else
                IBM_ARCH=powerpc
        fi
-       if [ -x /usr/bin/oslevel ] ; then
-               IBM_REV=`/usr/bin/oslevel`
+       if [ -x /usr/bin/lslpp ] ; then
+               IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+                          awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
        else
                IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
        fi
        else
                IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
        fi
@@ -617,13 +642,13 @@ EOF
                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
                    case "${sc_cpu_version}" in
                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
                    case "${sc_cpu_version}" in
-                     523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                     528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                     523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+                     528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
                      532)                      # CPU_PA_RISC2_0
                        case "${sc_kernel_bits}" in
                      532)                      # CPU_PA_RISC2_0
                        case "${sc_kernel_bits}" in
-                         32) HP_ARCH="hppa2.0n" ;;
-                         64) HP_ARCH="hppa2.0w" ;;
-                         '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                         32) HP_ARCH=hppa2.0n ;;
+                         64) HP_ARCH=hppa2.0w ;;
+                         '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
                        esac ;;
                    esac
                fi
                        esac ;;
                    esac
                fi
@@ -662,11 +687,11 @@ EOF
                    exit (0);
                }
 EOF
                    exit (0);
                }
 EOF
-                   (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+                   (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
                    test -z "$HP_ARCH" && HP_ARCH=hppa
                fi ;;
        esac
                    test -z "$HP_ARCH" && HP_ARCH=hppa
                fi ;;
        esac
-       if [ ${HP_ARCH} = "hppa2.0w" ]
+       if [ ${HP_ARCH} = hppa2.0w ]
        then
            eval $set_cc_for_build
 
        then
            eval $set_cc_for_build
 
@@ -679,12 +704,12 @@ EOF
            # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
            # => hppa64-hp-hpux11.23
 
            # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
            # => hppa64-hp-hpux11.23
 
-           if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+           if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
                grep -q __LP64__
            then
                grep -q __LP64__
            then
-               HP_ARCH="hppa2.0w"
+               HP_ARCH=hppa2.0w
            else
            else
-               HP_ARCH="hppa64"
+               HP_ARCH=hppa64
            fi
        fi
        echo ${HP_ARCH}-hp-hpux${HPUX_REV}
            fi
        fi
        echo ${HP_ARCH}-hp-hpux${HPUX_REV}
@@ -789,14 +814,14 @@ EOF
        echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
        exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
        echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
        exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+       FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+       FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
        exit ;;
     5000:UNIX_System_V:4.*:*)
        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
        exit ;;
     5000:UNIX_System_V:4.*:*)
-       FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-       FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+       FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+       FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
        exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
        exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
@@ -826,7 +851,7 @@ EOF
     *:MINGW*:*)
        echo ${UNAME_MACHINE}-pc-mingw32
        exit ;;
     *:MINGW*:*)
        echo ${UNAME_MACHINE}-pc-mingw32
        exit ;;
-    i*:MSYS*:*)
+    *:MSYS*:*)
        echo ${UNAME_MACHINE}-pc-msys
        exit ;;
     i*:windows32*:*)
        echo ${UNAME_MACHINE}-pc-msys
        exit ;;
     i*:windows32*:*)
@@ -878,7 +903,7 @@ EOF
        exit ;;
     *:GNU/*:*:*)
        # other systems with GNU libc and userland
        exit ;;
     *:GNU/*:*:*)
        # other systems with GNU libc and userland
-       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+       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
        exit ;;
     i*86:Minix:*:*)
        echo ${UNAME_MACHINE}-pc-minix
@@ -901,7 +926,7 @@ EOF
          EV68*) UNAME_MACHINE=alphaev68 ;;
        esac
        objdump --private-headers /bin/sh | grep -q ld.so.1
          EV68*) UNAME_MACHINE=alphaev68 ;;
        esac
        objdump --private-headers /bin/sh | grep -q ld.so.1
-       if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+       if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     arc:Linux:*:* | arceb:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     arc:Linux:*:* | arceb:Linux:*:*)
@@ -932,6 +957,9 @@ EOF
     crisv32:Linux:*:*)
        echo ${UNAME_MACHINE}-axis-linux-${LIBC}
        exit ;;
     crisv32:Linux:*:*)
        echo ${UNAME_MACHINE}-axis-linux-${LIBC}
        exit ;;
+    e2k:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
     frv:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     frv:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
@@ -944,6 +972,9 @@ EOF
     ia64:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     ia64:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
+    k1om:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
     m32r*:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     m32r*:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
@@ -969,10 +1000,13 @@ 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'`
        test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
        ;;
-    or1k:Linux:*:*)
+    mips64el:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
-    or32:Linux:*:*)
+    openrisc*:Linux:*:*)
+       echo or1k-unknown-linux-${LIBC}
+       exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     padre:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     padre:Linux:*:*)
@@ -1001,6 +1035,9 @@ EOF
     ppcle:Linux:*:*)
        echo powerpcle-unknown-linux-${LIBC}
        exit ;;
     ppcle:Linux:*:*)
        echo powerpcle-unknown-linux-${LIBC}
        exit ;;
+    riscv32:Linux:*:* | riscv64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
        echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
        exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
        echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
        exit ;;
@@ -1020,7 +1057,7 @@ EOF
        echo ${UNAME_MACHINE}-dec-linux-${LIBC}
        exit ;;
     x86_64:Linux:*:*)
        echo ${UNAME_MACHINE}-dec-linux-${LIBC}
        exit ;;
     x86_64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+       echo ${UNAME_MACHINE}-pc-linux-${LIBC}
        exit ;;
     xtensa*:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
        exit ;;
     xtensa*:Linux:*:*)
        echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
@@ -1099,7 +1136,7 @@ EOF
        # uname -m prints for DJGPP always 'pc', but it prints nothing about
        # the processor, so we play safe by assuming i586.
        # Note: whatever this is, it MUST be the same as what config.sub
        # uname -m prints for DJGPP always 'pc', but it prints nothing about
        # the processor, so we play safe by assuming i586.
        # Note: whatever this is, it MUST be the same as what config.sub
-       # prints for the "djgpp" host, or else GDB configury will decide that
+       # prints for the "djgpp" host, or else GDB configure will decide that
        # this is a cross-build.
        echo i586-pc-msdosdjgpp
        exit ;;
        # this is a cross-build.
        echo i586-pc-msdosdjgpp
        exit ;;
@@ -1248,6 +1285,9 @@ EOF
     SX-8R:SUPER-UX:*:*)
        echo sx8r-nec-superux${UNAME_RELEASE}
        exit ;;
     SX-8R:SUPER-UX:*:*)
        echo sx8r-nec-superux${UNAME_RELEASE}
        exit ;;
+    SX-ACE:SUPER-UX:*:*)
+       echo sxace-nec-superux${UNAME_RELEASE}
+       exit ;;
     Power*:Rhapsody:*:*)
        echo powerpc-apple-rhapsody${UNAME_RELEASE}
        exit ;;
     Power*:Rhapsody:*:*)
        echo powerpc-apple-rhapsody${UNAME_RELEASE}
        exit ;;
@@ -1260,22 +1300,32 @@ EOF
        if test "$UNAME_PROCESSOR" = unknown ; then
            UNAME_PROCESSOR=powerpc
        fi
        if test "$UNAME_PROCESSOR" = unknown ; then
            UNAME_PROCESSOR=powerpc
        fi
-       if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-           if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-               (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-               grep IS_64BIT_ARCH >/dev/null
-           then
-               case $UNAME_PROCESSOR in
-                   i386) UNAME_PROCESSOR=x86_64 ;;
-                   powerpc) UNAME_PROCESSOR=powerpc64 ;;
-               esac
+       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
            fi
            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
        fi
        echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
        exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
        UNAME_PROCESSOR=`uname -p`
        fi
        echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
        exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
        UNAME_PROCESSOR=`uname -p`
-       if test "$UNAME_PROCESSOR" = "x86"; then
+       if test "$UNAME_PROCESSOR" = x86; then
                UNAME_PROCESSOR=i386
                UNAME_MACHINE=pc
        fi
                UNAME_PROCESSOR=i386
                UNAME_MACHINE=pc
        fi
@@ -1306,7 +1356,7 @@ EOF
        # "uname -m" is not consistent, so use $cputype instead. 386
        # is converted to i386 for consistency with other x86
        # operating systems.
        # "uname -m" is not consistent, so use $cputype instead. 386
        # is converted to i386 for consistency with other x86
        # operating systems.
-       if test "$cputype" = "386"; then
+       if test "$cputype" = 386; then
            UNAME_MACHINE=i386
        else
            UNAME_MACHINE="$cputype"
            UNAME_MACHINE=i386
        else
            UNAME_MACHINE="$cputype"
@@ -1348,7 +1398,7 @@ EOF
        echo i386-pc-xenix
        exit ;;
     i*86:skyos:*:*)
        echo i386-pc-xenix
        exit ;;
     i*86:skyos:*:*)
-       echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+       echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
        exit ;;
     i*86:rdos:*:*)
        echo ${UNAME_MACHINE}-pc-rdos
        exit ;;
     i*86:rdos:*:*)
        echo ${UNAME_MACHINE}-pc-rdos
@@ -1359,171 +1409,25 @@ EOF
     x86_64:VMkernel:*:*)
        echo ${UNAME_MACHINE}-unknown-esx
        exit ;;
     x86_64:VMkernel:*:*)
        echo ${UNAME_MACHINE}-unknown-esx
        exit ;;
-esac
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#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 (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#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
-    printf ("vax-dec-ultrix\n"); exit (0);
-# 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; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-       echo c1-convex-bsd
-       exit ;;
-    c2*)
-       if getsysinfo -f scalar_acc
-       then echo c32-convex-bsd
-       else echo c2-convex-bsd
-       fi
-       exit ;;
-    c34*)
-       echo c34-convex-bsd
-       exit ;;
-    c38*)
-       echo c38-convex-bsd
-       exit ;;
-    c4*)
-       echo c4-convex-bsd
+    amd64:Isilon\ OneFS:*:*)
+       echo x86_64-unknown-onefs
        exit ;;
        exit ;;
-    esac
-fi
+esac
 
 cat >&2 <<EOF
 $0: unable to guess system type
 
 
 cat >&2 <<EOF
 $0: unable to guess system type
 
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite
+config.guess and config.sub with the latest versions from:
 
 
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 and
 and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
 
 config.guess timestamp = $timestamp
 
 
 config.guess timestamp = $timestamp
 
index 0e85859..1515f81 100644 (file)
 /* Have FreeType 2 library */
 #undef HAVE_FREETYPE
 
 /* Have FreeType 2 library */
 #undef HAVE_FREETYPE
 
+/* Define to 1 if you have the `FT_Done_MM_Var' function. */
+#undef HAVE_FT_DONE_MM_VAR
+
 /* Define to 1 if you have the `FT_Get_Var_Blend_Coordinates' function. */
 #undef HAVE_FT_GET_VAR_BLEND_COORDINATES
 
 /* Define to 1 if you have the `FT_Get_Var_Blend_Coordinates' function. */
 #undef HAVE_FT_GET_VAR_BLEND_COORDINATES
 
+/* Define to 1 if you have the `FT_Set_Var_Blend_Coordinates' function. */
+#undef HAVE_FT_SET_VAR_BLEND_COORDINATES
+
 /* Define to 1 if you have the `getpagesize' function. */
 #undef HAVE_GETPAGESIZE
 
 /* Define to 1 if you have the `getpagesize' function. */
 #undef HAVE_GETPAGESIZE
 
@@ -72,6 +78,9 @@
 /* Define to 1 if you have the `mprotect' function. */
 #undef HAVE_MPROTECT
 
 /* 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 native OpenType Layout backend */
 #undef HAVE_OT
 
 /* Have native OpenType Layout backend */
 #undef HAVE_OT
 
@@ -87,6 +96,9 @@
 /* Have sched_yield */
 #undef HAVE_SCHED_YIELD
 
 /* Have sched_yield */
 #undef HAVE_SCHED_YIELD
 
+/* Define to 1 if you have the `setlinebuf' function. */
+#undef HAVE_SETLINEBUF
+
 /* Have Solaris __machine_*_barrier and atomic_* operations */
 #undef HAVE_SOLARIS_ATOMIC_OPS
 
 /* Have Solaris __machine_*_barrier and atomic_* operations */
 #undef HAVE_SOLARIS_ATOMIC_OPS
 
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
 
 /* 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 `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 <windows.h> header file. */
 #undef HAVE_WINDOWS_H
 
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
+/* 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
 
 /* Define to the address where bug reports for this package should be sent. */
 #undef LT_OBJDIR
 
 /* Define to the address where bug reports for this package should be sent. */
index 9633db7..dd2ca93 100755 (executable)
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2016 Free Software Foundation, Inc.
 
 
-timestamp='2013-08-10'
+timestamp='2016-11-04'
 
 # 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
 
 # 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
@@ -25,7 +25,7 @@ timestamp='2013-08-10'
 # of the GNU General Public License, version 3 ("GPLv3").
 
 
 # of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+# Please send patches to <config-patches@gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -33,7 +33,7 @@ timestamp='2013-08-10'
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -53,8 +53,7 @@ timestamp='2013-08-10'
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 
 Canonicalize a configuration name.
 
 
 Canonicalize a configuration name.
 
@@ -68,7 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2016 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 is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -117,8 +116,8 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
   linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
   linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+  kopensolaris*-gnu* | cloudabi*-eabi* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
@@ -255,16 +254,18 @@ case $basic_machine in
        | arc | arceb \
        | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
        | avr | avr32 \
        | arc | arceb \
        | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
        | avr | avr32 \
+       | ba \
        | be32 | be64 \
        | bfin \
        | c4x | c8051 | clipper \
        | d10v | d30v | dlx | dsp16xx \
        | be32 | be64 \
        | bfin \
        | c4x | c8051 | clipper \
        | d10v | d30v | dlx | dsp16xx \
-       | epiphany \
-       | fido | fr30 | frv \
+       | e2k | epiphany \
+       | fido | fr30 | frv | ft32 \
        | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
        | hexagon \
        | i370 | i860 | i960 | ia64 \
        | ip2k | iq2000 \
        | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
        | hexagon \
        | i370 | i860 | i960 | ia64 \
        | ip2k | iq2000 \
+       | k1om \
        | le32 | le64 \
        | lm32 \
        | m32c | m32r | m32rle | m68000 | m68k | m88k \
        | le32 | le64 \
        | lm32 \
        | m32c | m32r | m32rle | m68000 | m68k | m88k \
@@ -282,8 +283,10 @@ case $basic_machine in
        | mips64vr5900 | mips64vr5900el \
        | mipsisa32 | mipsisa32el \
        | mipsisa32r2 | mipsisa32r2el \
        | mips64vr5900 | mips64vr5900el \
        | mipsisa32 | mipsisa32el \
        | mipsisa32r2 | mipsisa32r2el \
+       | mipsisa32r6 | mipsisa32r6el \
        | mipsisa64 | mipsisa64el \
        | mipsisa64r2 | mipsisa64r2el \
        | mipsisa64 | mipsisa64el \
        | mipsisa64r2 | mipsisa64r2el \
+       | mipsisa64r6 | mipsisa64r6el \
        | mipsisa64sb1 | mipsisa64sb1el \
        | mipsisa64sr71k | mipsisa64sr71kel \
        | mipsr5900 | mipsr5900el \
        | mipsisa64sb1 | mipsisa64sb1el \
        | mipsisa64sr71k | mipsisa64sr71kel \
        | mipsr5900 | mipsr5900el \
@@ -295,14 +298,15 @@ case $basic_machine in
        | nds32 | nds32le | nds32be \
        | nios | nios2 | nios2eb | nios2el \
        | ns16k | ns32k \
        | nds32 | nds32le | nds32be \
        | nios | nios2 | nios2eb | nios2el \
        | ns16k | ns32k \
-       | open8 \
-       | or1k | or32 \
+       | open8 | or1k | or1knd | or32 \
        | pdp10 | pdp11 | pj | pjl \
        | powerpc | powerpc64 | powerpc64le | powerpcle \
        | pdp10 | pdp11 | pj | pjl \
        | powerpc | powerpc64 | powerpc64le | powerpcle \
+       | pru \
        | pyramid \
        | pyramid \
+       | riscv32 | riscv64 \
        | rl78 | rx \
        | score \
        | rl78 | rx \
        | score \
-       | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+       | 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 \
        | sh64 | sh64le \
        | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
        | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -310,6 +314,7 @@ case $basic_machine in
        | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
        | ubicom32 \
        | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
        | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
        | ubicom32 \
        | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+       | visium \
        | we32k \
        | x86 | xc16x | xstormy16 | xtensa \
        | z8k | z80)
        | we32k \
        | x86 | xc16x | xstormy16 | xtensa \
        | z8k | z80)
@@ -324,7 +329,10 @@ case $basic_machine in
        c6x)
                basic_machine=tic6x-unknown
                ;;
        c6x)
                basic_machine=tic6x-unknown
                ;;
-       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+       leon|leon[3-9])
+               basic_machine=sparc-$basic_machine
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
                basic_machine=$basic_machine-unknown
                os=-none
                ;;
                basic_machine=$basic_machine-unknown
                os=-none
                ;;
@@ -369,18 +377,20 @@ case $basic_machine in
        | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
        | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
        | avr-* | avr32-* \
        | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
        | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
        | avr-* | avr32-* \
+       | ba-* \
        | be32-* | be64-* \
        | bfin-* | bs2000-* \
        | c[123]* | c30-* | [cjt]90-* | c4x-* \
        | c8051-* | clipper-* | craynv-* | cydra-* \
        | d10v-* | d30v-* | dlx-* \
        | be32-* | be64-* \
        | bfin-* | bs2000-* \
        | c[123]* | c30-* | [cjt]90-* | c4x-* \
        | c8051-* | clipper-* | craynv-* | cydra-* \
        | d10v-* | d30v-* | dlx-* \
-       | elxsi-* \
+       | 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-* | ia64-* \
        | ip2k-* | iq2000-* \
        | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
        | h8300-* | h8500-* \
        | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
        | hexagon-* \
        | i*86-* | i860-* | i960-* | ia64-* \
        | ip2k-* | iq2000-* \
+       | k1om-* \
        | le32-* | le64-* \
        | lm32-* \
        | m32c-* | m32r-* | m32rle-* \
        | le32-* | le64-* \
        | lm32-* \
        | m32c-* | m32r-* | m32rle-* \
@@ -400,8 +410,10 @@ case $basic_machine in
        | mips64vr5900-* | mips64vr5900el-* \
        | mipsisa32-* | mipsisa32el-* \
        | mipsisa32r2-* | mipsisa32r2el-* \
        | mips64vr5900-* | mips64vr5900el-* \
        | mipsisa32-* | mipsisa32el-* \
        | mipsisa32r2-* | mipsisa32r2el-* \
+       | mipsisa32r6-* | mipsisa32r6el-* \
        | mipsisa64-* | mipsisa64el-* \
        | mipsisa64r2-* | mipsisa64r2el-* \
        | mipsisa64-* | mipsisa64el-* \
        | mipsisa64r2-* | mipsisa64r2el-* \
+       | mipsisa64r6-* | mipsisa64r6el-* \
        | mipsisa64sb1-* | mipsisa64sb1el-* \
        | mipsisa64sr71k-* | mipsisa64sr71kel-* \
        | mipsr5900-* | mipsr5900el-* \
        | mipsisa64sb1-* | mipsisa64sb1el-* \
        | mipsisa64sr71k-* | mipsisa64sr71kel-* \
        | mipsr5900-* | mipsr5900el-* \
@@ -413,16 +425,19 @@ case $basic_machine in
        | nios-* | nios2-* | nios2eb-* | nios2el-* \
        | none-* | np1-* | ns16k-* | ns32k-* \
        | open8-* \
        | nios-* | nios2-* | nios2eb-* | nios2el-* \
        | none-* | np1-* | ns16k-* | ns32k-* \
        | open8-* \
+       | or1k*-* \
        | orion-* \
        | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
        | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
        | orion-* \
        | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
        | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+       | pru-* \
        | pyramid-* \
        | 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-* \
        | 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?-* \
+       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
        | tahoe-* \
        | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
        | tile*-* \
        | tahoe-* \
        | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
        | tile*-* \
@@ -430,6 +445,7 @@ case $basic_machine in
        | ubicom32-* \
        | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
        | vax-* \
        | ubicom32-* \
        | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
        | vax-* \
+       | visium-* \
        | we32k-* \
        | x86-* | x86_64-* | xc16x-* | xps100-* \
        | xstormy16-* | xtensa*-* \
        | we32k-* \
        | x86-* | x86_64-* | xc16x-* | xps100-* \
        | xstormy16-* | xtensa*-* \
@@ -506,6 +522,9 @@ case $basic_machine in
                basic_machine=i386-pc
                os=-aros
                ;;
                basic_machine=i386-pc
                os=-aros
                ;;
+       asmjs)
+               basic_machine=asmjs-unknown
+               ;;
        aux)
                basic_machine=m68k-apple
                os=-aux
        aux)
                basic_machine=m68k-apple
                os=-aux
@@ -626,6 +645,14 @@ case $basic_machine in
                basic_machine=m68k-bull
                os=-sysv3
                ;;
                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
        ebmon29k)
                basic_machine=a29k-amd
                os=-ebmon
@@ -767,6 +794,9 @@ case $basic_machine in
                basic_machine=m68k-isi
                os=-sysv
                ;;
                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-unknown
                os=-linux
@@ -822,6 +852,10 @@ case $basic_machine in
                basic_machine=powerpc-unknown
                os=-morphos
                ;;
                basic_machine=powerpc-unknown
                os=-morphos
                ;;
+       moxiebox)
+               basic_machine=moxie-unknown
+               os=-moxiebox
+               ;;
        msdos)
                basic_machine=i386-pc
                os=-msdos
        msdos)
                basic_machine=i386-pc
                os=-msdos
@@ -998,7 +1032,7 @@ case $basic_machine in
        ppc-* | ppcbe-*)
                basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
        ppc-* | ppcbe-*)
                basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
-       ppcle | powerpclittle | ppc-le | powerpc-little)
+       ppcle | powerpclittle)
                basic_machine=powerpcle-unknown
                ;;
        ppcle-* | powerpclittle-*)
                basic_machine=powerpcle-unknown
                ;;
        ppcle-* | powerpclittle-*)
@@ -1008,7 +1042,7 @@ case $basic_machine in
                ;;
        ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
                ;;
        ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
-       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+       ppc64le | powerpc64little)
                basic_machine=powerpc64le-unknown
                ;;
        ppc64le-* | powerpc64little-*)
                basic_machine=powerpc64le-unknown
                ;;
        ppc64le-* | powerpc64little-*)
@@ -1354,27 +1388,28 @@ case $os in
              | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
              | -sym* | -kopensolaris* | -plan9* \
              | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
              | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
              | -sym* | -kopensolaris* | -plan9* \
              | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-             | -aos* | -aros* \
+             | -aos* | -aros* | -cloudabi* | -sortix* \
              | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
              | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
              | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
              | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
              | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
              | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-             | -bitrig* | -openbsd* | -solidbsd* \
+             | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
              | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
              | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
              | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
              | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
              | -chorusos* | -chorusrdb* | -cegcc* \
              | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
              | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
              | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
              | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
              | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
              | -chorusos* | -chorusrdb* | -cegcc* \
              | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-             | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+             | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
              | -linux-newlib* | -linux-musl* | -linux-uclibc* \
              | -linux-newlib* | -linux-musl* | -linux-uclibc* \
-             | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
              | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
              | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
              | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
              | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
              | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
              | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
              | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
              | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
              | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
              | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
              | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
              | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+             | -onefs* | -tirtos* | -phoenix* | -fuchsia*)
        # Remember, each alternative MUST END IN *, to match a version number.
                ;;
        -qnx*)
        # Remember, each alternative MUST END IN *, to match a version number.
                ;;
        -qnx*)
@@ -1506,6 +1541,8 @@ case $os in
                ;;
        -nacl*)
                ;;
                ;;
        -nacl*)
                ;;
+       -ios)
+               ;;
        -none)
                ;;
        *)
        -none)
                ;;
        *)
@@ -1592,9 +1629,6 @@ case $basic_machine in
        mips*-*)
                os=-elf
                ;;
        mips*-*)
                os=-elf
                ;;
-       or1k-*)
-               os=-elf
-               ;;
        or32-*)
                os=-coff
                ;;
        or32-*)
                os=-coff
                ;;
index ab93f6c..21e02f7 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for HarfBuzz 1.4.6.
+# Generated by GNU Autoconf 2.69 for HarfBuzz 1.7.6.
 #
 #
-# Report bugs to <https://github.com/behdad/harfbuzz/issues/new>.
+# Report bugs to <https://github.com/harfbuzz/harfbuzz/issues/new>.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -198,6 +198,7 @@ test -x / || exit 1"
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
   test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
   test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1
 
   test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
     ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
 
   test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
     ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
@@ -205,8 +206,7 @@ test -x / || exit 1"
     ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
     PATH=/empty FPATH=/empty; export PATH FPATH
     test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
     ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
     PATH=/empty FPATH=/empty; export PATH FPATH
     test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
-      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
   if (eval "$as_required") 2>/dev/null; then :
   as_have_required=yes
 else
   if (eval "$as_required") 2>/dev/null; then :
   as_have_required=yes
 else
@@ -275,7 +275,7 @@ fi
     $as_echo "$0: be upgraded to zsh 4.3.4 or later."
   else
     $as_echo "$0: Please tell bug-autoconf@gnu.org and
     $as_echo "$0: be upgraded to zsh 4.3.4 or later."
   else
     $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: https://github.com/behdad/harfbuzz/issues/new about
+$0: https://github.com/harfbuzz/harfbuzz/issues/new about
 $0: your system, including any error possibly output before
 $0: this message. Then install a modern shell, or manually
 $0: run the script under such a shell if you do have one."
 $0: your system, including any error possibly output before
 $0: this message. Then install a modern shell, or manually
 $0: run the script under such a shell if you do have one."
@@ -590,9 +590,9 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='HarfBuzz'
 PACKAGE_TARNAME='harfbuzz'
 # Identity of this package.
 PACKAGE_NAME='HarfBuzz'
 PACKAGE_TARNAME='harfbuzz'
-PACKAGE_VERSION='1.4.6'
-PACKAGE_STRING='HarfBuzz 1.4.6'
-PACKAGE_BUGREPORT='https://github.com/behdad/harfbuzz/issues/new'
+PACKAGE_VERSION='1.7.6'
+PACKAGE_STRING='HarfBuzz 1.7.6'
+PACKAGE_BUGREPORT='https://github.com/harfbuzz/harfbuzz/issues/new'
 PACKAGE_URL='http://harfbuzz.org/'
 
 ac_unique_file="src/harfbuzz.pc.in"
 PACKAGE_URL='http://harfbuzz.org/'
 
 ac_unique_file="src/harfbuzz.pc.in"
@@ -689,6 +689,7 @@ INTROSPECTION_GIRDIR
 INTROSPECTION_GENERATE
 INTROSPECTION_COMPILER
 INTROSPECTION_SCANNER
 INTROSPECTION_GENERATE
 INTROSPECTION_COMPILER
 INTROSPECTION_SCANNER
+have_gobject
 HAVE_GOBJECT_FALSE
 HAVE_GOBJECT_TRUE
 GLIB_MKENUMS
 HAVE_GOBJECT_FALSE
 HAVE_GOBJECT_TRUE
 GLIB_MKENUMS
@@ -732,6 +733,8 @@ GTKDOC_MKPDF
 GTKDOC_REBASE
 GTKDOC_CHECK_PATH
 GTKDOC_CHECK
 GTKDOC_REBASE
 GTKDOC_CHECK_PATH
 GTKDOC_CHECK
+WITH_LIBSTDCXX_FALSE
+WITH_LIBSTDCXX_TRUE
 HB_LIBTOOL_VERSION_INFO
 HB_VERSION
 HB_VERSION_MICRO
 HB_LIBTOOL_VERSION_INFO
 HB_VERSION
 HB_VERSION_MICRO
@@ -748,6 +751,7 @@ ac_ct_CXX
 CXXFLAGS
 CXX
 CPP
 CXXFLAGS
 CXX
 CPP
+LT_SYS_LIBRARY_PATH
 OTOOL64
 OTOOL
 LIPO
 OTOOL64
 OTOOL
 LIPO
@@ -765,7 +769,6 @@ LD
 FGREP
 EGREP
 GREP
 FGREP
 EGREP
 GREP
-SED
 host_os
 host_vendor
 host_cpu
 host_os
 host_vendor
 host_cpu
@@ -794,8 +797,19 @@ CFLAGS
 CC
 ac_ct_AR
 AR
 CC
 ac_ct_AR
 AR
-AUTOMAKE_OLDER_THAN_1_13_FALSE
-AUTOMAKE_OLDER_THAN_1_13_TRUE
+CODE_COVERAGE_RULES
+CODE_COVERAGE_LDFLAGS
+CODE_COVERAGE_LIBS
+CODE_COVERAGE_CXXFLAGS
+CODE_COVERAGE_CFLAGS
+CODE_COVERAGE_CPPFLAGS
+GENHTML
+LCOV
+GCOV
+CODE_COVERAGE_ENABLED
+CODE_COVERAGE_ENABLED_FALSE
+CODE_COVERAGE_ENABLED_TRUE
+SED
 AM_BACKSLASH
 AM_DEFAULT_VERBOSITY
 AM_DEFAULT_V
 AM_BACKSLASH
 AM_DEFAULT_VERBOSITY
 AM_DEFAULT_V
@@ -842,6 +856,7 @@ infodir
 docdir
 oldincludedir
 includedir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -865,15 +880,19 @@ ac_subst_files=''
 ac_user_opts='
 enable_option_checking
 enable_silent_rules
 ac_user_opts='
 enable_option_checking
 enable_silent_rules
+with_gcov
+enable_code_coverage
 enable_dependency_tracking
 enable_static
 enable_shared
 with_pic
 enable_fast_install
 enable_dependency_tracking
 enable_static
 enable_shared
 with_pic
 enable_fast_install
+with_aix_soname
 with_gnu_ld
 with_sysroot
 enable_libtool_lock
 enable_largefile
 with_gnu_ld
 with_sysroot
 enable_libtool_lock
 enable_largefile
+with_libstdc__
 with_html_dir
 enable_gtk_doc
 enable_gtk_doc_html
 with_html_dir
 enable_gtk_doc
 enable_gtk_doc_html
@@ -899,6 +918,7 @@ CFLAGS
 LDFLAGS
 LIBS
 CPPFLAGS
 LDFLAGS
 LIBS
 CPPFLAGS
+LT_SYS_LIBRARY_PATH
 CPP
 CXX
 CXXFLAGS
 CPP
 CXX
 CXXFLAGS
@@ -961,6 +981,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1213,6 +1234,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1350,7 +1380,7 @@ fi
 for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
                datadir sysconfdir sharedstatedir localstatedir includedir \
                oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
 for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
                datadir sysconfdir sharedstatedir localstatedir includedir \
                oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-               libdir localedir mandir
+               libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1463,7 +1493,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
   # 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 1.4.6 to adapt to many kinds of systems.
+\`configure' configures HarfBuzz 1.7.6 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1503,6 +1533,7 @@ Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1533,7 +1564,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of HarfBuzz 1.4.6:";;
+     short | recursive ) echo "Configuration of HarfBuzz 1.7.6:";;
    esac
   cat <<\_ACEOF
 
    esac
   cat <<\_ACEOF
 
@@ -1543,6 +1574,7 @@ Optional Features:
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --enable-silent-rules   less verbose build output (undo: "make V=1")
   --disable-silent-rules  verbose build output (undo: "make V=0")
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --enable-silent-rules   less verbose build output (undo: "make V=1")
   --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-code-coverage  Whether to enable code coverage support
   --enable-dependency-tracking
                           do not reject slow dependency extractors
   --disable-dependency-tracking
   --enable-dependency-tracking
                           do not reject slow dependency extractors
   --disable-dependency-tracking
@@ -1562,16 +1594,22 @@ Optional Features:
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-gcov=GCOV        use given GCOV for coverage (GCOV=gcov).
   --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                           both]
   --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                           both]
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX, [default=aix].
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-sysroot=DIR Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).
+  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
+                          compiler's sysroot if not specified).
+  --with-libstdc++=[yes/no]
+                          Allow linking with libstdc++ [default=no]
   --with-html-dir=PATH    path to installed docs
   --with-glib=[yes/no/auto]
                           Use glib [default=auto]
   --with-gobject=[yes/no/auto]
   --with-html-dir=PATH    path to installed docs
   --with-glib=[yes/no/auto]
                           Use glib [default=auto]
   --with-gobject=[yes/no/auto]
-                          Use gobject [default=auto]
+                          Use gobject [default=no]
   --with-cairo=[yes/no/auto]
                           Use cairo [default=auto]
   --with-fontconfig=[yes/no/auto]
   --with-cairo=[yes/no/auto]
                           Use cairo [default=auto]
   --with-fontconfig=[yes/no/auto]
@@ -1599,6 +1637,8 @@ Some influential environment variables:
   LIBS        libraries to pass to the linker, e.g. -l<library>
   CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
               you have headers in a nonstandard directory <include dir>
   LIBS        libraries to pass to the linker, e.g. -l<library>
   CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
               you have headers in a nonstandard directory <include dir>
+  LT_SYS_LIBRARY_PATH
+              User-defined run-time library search path.
   CPP         C preprocessor
   CXX         C++ compiler command
   CXXFLAGS    C++ compiler flags
   CPP         C preprocessor
   CXX         C++ compiler command
   CXXFLAGS    C++ compiler flags
@@ -1639,7 +1679,7 @@ Some influential environment variables:
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
-Report bugs to <https://github.com/behdad/harfbuzz/issues/new>.
+Report bugs to <https://github.com/harfbuzz/harfbuzz/issues/new>.
 HarfBuzz home page: <http://harfbuzz.org/>.
 _ACEOF
 ac_status=$?
 HarfBuzz home page: <http://harfbuzz.org/>.
 _ACEOF
 ac_status=$?
@@ -1703,7 +1743,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-HarfBuzz configure 1.4.6
+HarfBuzz configure 1.7.6
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2048,9 +2088,9 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
 $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
 $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------------------------------------ ##
-## Report this to https://github.com/behdad/harfbuzz/issues/new ##
-## ------------------------------------------------------------ ##"
+( $as_echo "## -------------------------------------------------------------- ##
+## Report this to https://github.com/harfbuzz/harfbuzz/issues/new ##
+## -------------------------------------------------------------- ##"
      ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
      ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
@@ -2443,9 +2483,9 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
 $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
 $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------------------------------------ ##
-## Report this to https://github.com/behdad/harfbuzz/issues/new ##
-## ------------------------------------------------------------ ##"
+( $as_echo "## -------------------------------------------------------------- ##
+## Report this to https://github.com/harfbuzz/harfbuzz/issues/new ##
+## -------------------------------------------------------------- ##"
      ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
      ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
@@ -2521,7 +2561,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
 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 1.4.6, which was
+It was created by HarfBuzz $as_me 1.7.6, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2875,7 +2915,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 ac_config_headers="$ac_config_headers config.h"
 
 
 ac_config_headers="$ac_config_headers config.h"
 
 
-am__api_version='1.14'
+am__api_version='1.15'
 
 ac_aux_dir=
 for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
 
 ac_aux_dir=
 for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
@@ -3076,8 +3116,8 @@ test "$program_suffix" != NONE &&
 ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
 program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
 
 ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
 program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
 
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 if test x"${MISSING+set}" != xset; then
   case $am_aux_dir in
 
 if test x"${MISSING+set}" != xset; then
   case $am_aux_dir in
@@ -3096,7 +3136,7 @@ else
 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\    *)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
   case $am_aux_dir in
   *\ * | *\    *)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -3390,7 +3430,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='harfbuzz'
 
 # Define the identity of the package.
  PACKAGE='harfbuzz'
- VERSION='1.4.6'
+ VERSION='1.7.6'
 
 
 # Some tools Automake needs.
 
 
 # Some tools Automake needs.
@@ -3415,8 +3455,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 mkdir_p='$(MKDIR_P)'
 
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 mkdir_p='$(MKDIR_P)'
 
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 # Always define AMTAR for backward compatibility.  Yes, it's still used
 # in the wild :-(  We should find a proper way to deprecate it ...
 AMTAR='$${TAR-tar}'
 # Always define AMTAR for backward compatibility.  Yes, it's still used
 # in the wild :-(  We should find a proper way to deprecate it ...
 AMTAR='$${TAR-tar}'
@@ -3589,13 +3629,6 @@ END
     as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
   fi
 fi
     as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
   fi
 fi
- if test $am__api_version = 1.11 -o $am__api_version = 1.12; then
-  AUTOMAKE_OLDER_THAN_1_13_TRUE=
-  AUTOMAKE_OLDER_THAN_1_13_FALSE='#'
-else
-  AUTOMAKE_OLDER_THAN_1_13_TRUE='#'
-  AUTOMAKE_OLDER_THAN_1_13_FALSE=
-fi
 
 # Check whether --enable-silent-rules was given.
 if test "${enable_silent_rules+set}" = set; then :
 
 # Check whether --enable-silent-rules was given.
 if test "${enable_silent_rules+set}" = set; then :
@@ -3636,6 +3669,445 @@ else
 fi
 AM_BACKSLASH='\'
 
 fi
 AM_BACKSLASH='\'
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+
+
+
+       # allow to override gcov location
+
+# Check whether --with-gcov was given.
+if test "${with_gcov+set}" = set; then :
+  withval=$with_gcov; _AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov
+else
+  _AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov
+fi
+
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with code coverage support" >&5
+$as_echo_n "checking whether to build with code coverage support... " >&6; }
+       # Check whether --enable-code-coverage was given.
+if test "${enable_code_coverage+set}" = set; then :
+  enableval=$enable_code_coverage;
+else
+  enable_code_coverage=no
+fi
+
+
+        if test x$enable_code_coverage = xyes; then
+  CODE_COVERAGE_ENABLED_TRUE=
+  CODE_COVERAGE_ENABLED_FALSE='#'
+else
+  CODE_COVERAGE_ENABLED_TRUE='#'
+  CODE_COVERAGE_ENABLED_FALSE=
+fi
+
+       CODE_COVERAGE_ENABLED=$enable_code_coverage
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_code_coverage" >&5
+$as_echo "$enable_code_coverage" >&6; }
+
+       if  test "$enable_code_coverage" = "yes" ; then :
+
+               # check for gcov
+               if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args.
+set dummy ${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GCOV+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$GCOV"; then
+  ac_cv_prog_GCOV="$GCOV" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_GCOV="${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+GCOV=$ac_cv_prog_GCOV
+if test -n "$GCOV"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCOV" >&5
+$as_echo "$GCOV" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_GCOV"; then
+  ac_ct_GCOV=$GCOV
+  # Extract the first word of "$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args.
+set dummy $_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_GCOV+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_GCOV"; then
+  ac_cv_prog_ac_ct_GCOV="$ac_ct_GCOV" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_GCOV="$_AX_CODE_COVERAGE_GCOV_PROG_WITH"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_GCOV=$ac_cv_prog_ac_ct_GCOV
+if test -n "$ac_ct_GCOV"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GCOV" >&5
+$as_echo "$ac_ct_GCOV" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_GCOV" = x; then
+    GCOV=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    GCOV=$ac_ct_GCOV
+  fi
+else
+  GCOV="$ac_cv_prog_GCOV"
+fi
+
+               if test "X$GCOV" = "X:"; then :
+  as_fn_error $? "gcov is needed to do coverage" "$LINENO" 5
+fi
+
+
+                               if  test "$GCC" = "no" ; then :
+
+                       as_fn_error $? "not compiling with gcc, which is required for gcov code coverage" "$LINENO" 5
+
+fi
+
+               # Extract the first word of "lcov", so it can be a program name with args.
+set dummy lcov; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LCOV+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LCOV"; then
+  ac_cv_prog_LCOV="$LCOV" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LCOV="lcov"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LCOV=$ac_cv_prog_LCOV
+if test -n "$LCOV"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LCOV" >&5
+$as_echo "$LCOV" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+               # Extract the first word of "genhtml", so it can be a program name with args.
+set dummy genhtml; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GENHTML+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$GENHTML"; then
+  ac_cv_prog_GENHTML="$GENHTML" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_GENHTML="genhtml"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+GENHTML=$ac_cv_prog_GENHTML
+if test -n "$GENHTML"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GENHTML" >&5
+$as_echo "$GENHTML" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+               if  test -z "$LCOV" ; then :
+
+                       as_fn_error $? "To enable code coverage reporting you must have lcov installed" "$LINENO" 5
+
+fi
+
+               if  test -z "$GENHTML" ; then :
+
+                       as_fn_error $? "Could not find genhtml from the lcov package" "$LINENO" 5
+
+fi
+
+                                               CODE_COVERAGE_CPPFLAGS="-DNDEBUG"
+               CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
+               CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
+               CODE_COVERAGE_LIBS="-lgcov"
+               CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS"
+
+
+
+
+
+
+
+               CODE_COVERAGE_RULES_CHECK='
+       -$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check
+       $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture
+'
+               CODE_COVERAGE_RULES_CAPTURE='
+       $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS)
+       $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS)
+       -@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp
+       $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS)
+       @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html"
+'
+               CODE_COVERAGE_RULES_CLEAN='
+clean: code-coverage-clean
+distclean: code-coverage-clean
+code-coverage-clean:
+       -$(LCOV) --directory $(top_builddir) -z
+       -rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY)
+       -find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete
+'
+
+else
+
+               CODE_COVERAGE_RULES_CHECK='
+       @echo "Need to reconfigure with --enable-code-coverage"
+'
+               CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK"
+               CODE_COVERAGE_RULES_CLEAN=''
+
+fi
+
+CODE_COVERAGE_RULES='
+# Code coverage
+#
+# Optional:
+#  - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting.
+#    Multiple directories may be specified, separated by whitespace.
+#    (Default: $(top_builddir))
+#  - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated
+#    by lcov for code coverage. (Default:
+#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info)
+#  - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage
+#    reports to be created. (Default:
+#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage)
+#  - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage,
+#    set to 0 to disable it and leave empty to stay with the default.
+#    (Default: empty)
+#  - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov
+#    instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
+#  - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov
+#    instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+#  - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov
+#  - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the
+#    collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
+#  - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov
+#    instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+#  - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering
+#    lcov instance. (Default: empty)
+#  - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov
+#    instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+#  - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the
+#    genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
+#  - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml
+#    instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
+#  - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore
+#
+# The generated report will be titled using the $(PACKAGE_NAME) and
+# $(PACKAGE_VERSION). In order to add the current git hash to the title,
+# use the git-version-gen script, available online.
+
+# Optional variables
+CODE_COVERAGE_DIRECTORY ?= $(top_builddir)
+CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info
+CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage
+CODE_COVERAGE_BRANCH_COVERAGE ?=
+CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
+--rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
+CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)"
+CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
+CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?=
+CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\
+$(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
+--rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
+CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
+CODE_COVERAGE_IGNORE_PATTERN ?=
+
+GITIGNOREFILES ?=
+GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY)
+
+code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V))
+code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_lcov_cap_0 = @echo "  LCOV   --capture"\
+ $(CODE_COVERAGE_OUTPUT_FILE);
+code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V))
+code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_lcov_ign_0 = @echo "  LCOV   --remove /tmp/*"\
+ $(CODE_COVERAGE_IGNORE_PATTERN);
+code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V))
+code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_genhtml_0 = @echo "  GEN   " $(CODE_COVERAGE_OUTPUT_DIRECTORY);
+code_coverage_quiet = $(code_coverage_quiet_$(V))
+code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY))
+code_coverage_quiet_0 = --quiet
+
+# sanitizes the test-name: replaces with underscores: dashes and dots
+code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1)))
+
+# Use recursive makes in order to ignore errors during check
+check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"'
+
+# Capture code coverage data
+code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"'
+
+# Hook rule executed before code-coverage-capture, overridable by the user
+code-coverage-capture-hook:
+
+'"$CODE_COVERAGE_RULES_CLEAN"'
+
+A''M_DISTCHECK_CONFIGURE_FLAGS ?=
+A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage
+
+.PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean
+'
+
+
+
+
 
 # Initialize libtool
 DEPDIR="${am__leading_dot}deps"
 
 # Initialize libtool
 DEPDIR="${am__leading_dot}deps"
@@ -4858,8 +5330,8 @@ esac
 
 
 
 
 
 
-macro_version='2.4.2'
-macro_revision='1.3337'
+macro_version='2.4.6'
+macro_revision='2.4.6'
 
 
 
 
 
 
@@ -4873,7 +5345,7 @@ macro_revision='1.3337'
 
 
 
 
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 # Make sure we can run config.sub.
 $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
 
 # Make sure we can run config.sub.
 $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
@@ -4993,7 +5465,7 @@ func_echo_all ()
     $ECHO ""
 }
 
     $ECHO ""
 }
 
-case "$ECHO" in
+case $ECHO in
   printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
 $as_echo "printf" >&6; } ;;
   print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
   printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
 $as_echo "printf" >&6; } ;;
   print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
@@ -5316,19 +5788,19 @@ test -z "$GREP" && GREP=grep
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -5342,7 +5814,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
        ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
        ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -5353,7 +5825,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
     with_gnu_ld=unknown
     ;;
   esac
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
@@ -5364,32 +5836,32 @@ if ${lt_cv_path_LD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-       test "$with_gnu_ld" != no && break
+       test no != "$with_gnu_ld" && break
        ;;
       *)
        ;;
       *)
-       test "$with_gnu_ld" != yes && break
+       test yes != "$with_gnu_ld" && break
        ;;
       esac
     fi
   done
        ;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi
 fi
 
 fi
 fi
 
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
@@ -5432,33 +5904,38 @@ if ${lt_cv_path_NM+:} false; then :
 else
   if test -n "$NM"; then
   # Let the user override the test.
 else
   if test -n "$NM"; then
   # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  lt_cv_path_NM=$NM
 else
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
+  lt_nm_to_check=${ac_tool_prefix}nm
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       test -z "$ac_dir" && ac_dir=.
       test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
        # Check to see if the nm accepts a BSD-compat flag.
        # Check to see if the nm accepts a BSD-compat flag.
-       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+       # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
        #   nm: unknown option "B" ignored
        # Tru64's nm complains that /dev/null is an invalid object file
        #   nm: unknown option "B" ignored
        # Tru64's nm complains that /dev/null is an invalid object file
-       case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-       */dev/null* | *'Invalid file or object type'*)
+       # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+       case $build_os in
+       mingw*) lt_bad_file=conftest.nm/nofile ;;
+       *) lt_bad_file=/dev/null ;;
+       esac
+       case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+       *$lt_bad_file* | *'Invalid file or object type'*)
          lt_cv_path_NM="$tmp_nm -B"
          lt_cv_path_NM="$tmp_nm -B"
-         break
+         break 2
          ;;
        *)
          case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
          */dev/null*)
            lt_cv_path_NM="$tmp_nm -p"
          ;;
        *)
          case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
          */dev/null*)
            lt_cv_path_NM="$tmp_nm -p"
-           break
+           break 2
            ;;
          *)
            lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
            ;;
          *)
            lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -5469,15 +5946,15 @@ else
        esac
       fi
     done
        esac
       fi
     done
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
   done
   : ${lt_cv_path_NM=no}
 fi
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
 $as_echo "$lt_cv_path_NM" >&6; }
   done
   : ${lt_cv_path_NM=no}
 fi
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
 $as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
@@ -5583,9 +6060,9 @@ esac
   fi
 fi
 
   fi
 fi
 
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
     *COFF*)
     *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
+      DUMPBIN="$DUMPBIN -symbols -headers"
       ;;
     *)
       DUMPBIN=:
       ;;
     *)
       DUMPBIN=:
@@ -5593,8 +6070,8 @@ fi
     esac
   fi
 
     esac
   fi
 
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
   fi
 fi
 test -z "$NM" && NM=nm
   fi
 fi
 test -z "$NM" && NM=nm
@@ -5645,7 +6122,7 @@ if ${lt_cv_sys_max_cmd_len+:} false; then :
   $as_echo_n "(cached) " >&6
 else
     i=0
   $as_echo_n "(cached) " >&6
 else
     i=0
-  teststring="ABCD"
+  teststring=ABCD
 
   case $build_os in
   msdosdjgpp*)
 
   case $build_os in
   msdosdjgpp*)
@@ -5685,7 +6162,7 @@ else
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -5736,22 +6213,22 @@ else
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
     if test -n "$lt_cv_sys_max_cmd_len" && \
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
     if test -n "$lt_cv_sys_max_cmd_len" && \
-       test undefined != "$lt_cv_sys_max_cmd_len"; then
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
+      for i in 1 2 3 4 5 6 7 8; do
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
                 = "X$teststring$teststring"; } >/dev/null 2>&1 &&
                 = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-             test $i != 17 # 1/2 MB should be enough
+             test 17 != "$i" # 1/2 MB should be enough
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
@@ -5769,7 +6246,7 @@ else
 
 fi
 
 
 fi
 
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
 $as_echo "$lt_cv_sys_max_cmd_len" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
 $as_echo "$lt_cv_sys_max_cmd_len" >&6; }
 else
@@ -5787,30 +6264,6 @@ max_cmd_len=$lt_cv_sys_max_cmd_len
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
@@ -5933,13 +6386,13 @@ esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       reload_cmds=false
     fi
     ;;
   darwin*)
       reload_cmds=false
     fi
     ;;
   darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
@@ -6067,13 +6520,13 @@ lt_cv_deplibs_check_method='unknown'
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
 
 case $host_os in
 aix[4-9]*)
 
 case $host_os in
 aix[4-9]*)
@@ -6100,8 +6553,7 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+  if ( file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
@@ -6197,8 +6649,8 @@ newos6*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
@@ -6251,6 +6703,9 @@ sysv4 | sysv4.3*)
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 esac
 
 fi
 esac
 
 fi
@@ -6408,8 +6863,8 @@ else
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -6421,7 +6876,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   ;;
 *)
   # fallback: assume linklib IS sharedlib
   ;;
 *)
   # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
   ;;
 esac
 
   ;;
 esac
 
@@ -6575,7 +7030,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-      if test "$ac_status" -eq 0; then
+      if test 0 -eq "$ac_status"; then
        # Ensure the archiver fails upon bogus file names.
        rm -f conftest.$ac_objext libconftest.a
        { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
        # Ensure the archiver fails upon bogus file names.
        rm -f conftest.$ac_objext libconftest.a
        { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
@@ -6583,7 +7038,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-       if test "$ac_status" -ne 0; then
+       if test 0 -ne "$ac_status"; then
           lt_cv_ar_at_file=@
         fi
       fi
           lt_cv_ar_at_file=@
         fi
       fi
@@ -6596,7 +7051,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
 $as_echo "$lt_cv_ar_at_file" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
 $as_echo "$lt_cv_ar_at_file" >&6; }
 
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
@@ -6813,7 +7268,7 @@ old_postuninstall_cmds=
 
 if test -n "$RANLIB"; then
   case $host_os in
 
 if test -n "$RANLIB"; then
   case $host_os in
-  openbsd*)
+  bitrig* | openbsd*)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
@@ -6903,7 +7358,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   symcode='[ABCDGISTW]'
   ;;
 hpux*)
   symcode='[ABCDGISTW]'
   ;;
 hpux*)
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     symcode='[ABCDEGRST]'
   fi
   ;;
     symcode='[ABCDEGRST]'
   fi
   ;;
@@ -6936,14 +7391,44 @@ case `$NM -V 2>&1` in
   symcode='[ABCDGIRSTW]' ;;
 esac
 
   symcode='[ABCDGIRSTW]' ;;
 esac
 
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -6961,21 +7446,24 @@ for ac_symprfx in "" "_"; do
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
+    # 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++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK '"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
     # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK '"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
 "     ' prfx=^$ac_symprfx"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[     ]\($symcode$symcode*\)[         ][      ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
 "     ' prfx=^$ac_symprfx"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[     ]\($symcode$symcode*\)[         ][      ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -7023,11 +7511,11 @@ _LT_EOF
        if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
          cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
        if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
          cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
@@ -7053,7 +7541,7 @@ lt__PROGRAM__LTX_preloaded_symbols[] =
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
-         $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+         $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
          cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
          cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
@@ -7073,13 +7561,13 @@ _LT_EOF
          mv conftest.$ac_objext conftstm.$ac_objext
          lt_globsym_save_LIBS=$LIBS
          lt_globsym_save_CFLAGS=$CFLAGS
          mv conftest.$ac_objext conftstm.$ac_objext
          lt_globsym_save_LIBS=$LIBS
          lt_globsym_save_CFLAGS=$CFLAGS
-         LIBS="conftstm.$ac_objext"
+         LIBS=conftstm.$ac_objext
          CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
          if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
          CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
          if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
            pipe_works=yes
          fi
          LIBS=$lt_globsym_save_LIBS
            pipe_works=yes
          fi
          LIBS=$lt_globsym_save_LIBS
@@ -7100,7 +7588,7 @@ _LT_EOF
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
+  if test yes = "$pipe_works"; then
     break
   else
     lt_cv_sys_global_symbol_pipe=
     break
   else
     lt_cv_sys_global_symbol_pipe=
@@ -7153,6 +7641,16 @@ fi
 
 
 
 
 
 
+
+
+
+
+
+
+
+
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
 $as_echo_n "checking for sysroot... " >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
 $as_echo_n "checking for sysroot... " >&6; }
 
@@ -7165,9 +7663,9 @@ fi
 
 
 lt_sysroot=
 
 
 lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
  yes)
  yes)
-   if test "$GCC" = yes; then
+   if test yes = "$GCC"; then
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
@@ -7177,8 +7675,8 @@ case ${with_sysroot} in #(
  no|'')
    ;; #(
  *)
  no|'')
    ;; #(
  *)
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
    as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
    ;;
 esac
    as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
    ;;
 esac
@@ -7190,18 +7688,99 @@ $as_echo "${lt_sysroot:-no}" >&6; }
 
 
 
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+  ac_path_lt_DD_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in dd; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+      $ac_path_lt_DD_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_lt_DD"; then
+    :
+  fi
+else
+  ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
 # Check whether --enable-libtool-lock was given.
 if test "${enable_libtool_lock+set}" = set; then :
   enableval=$enable_libtool_lock;
 fi
 
 # Check whether --enable-libtool-lock was given.
 if test "${enable_libtool_lock+set}" = set; then :
   enableval=$enable_libtool_lock;
 fi
 
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -7210,24 +7789,25 @@ ia64-*-hpux*)
   test $ac_status = 0; }; then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
   test $ac_status = 0; }; then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
-       HPUX_IA64_MODE="32"
+       HPUX_IA64_MODE=32
        ;;
       *ELF-64*)
        ;;
       *ELF-64*)
-       HPUX_IA64_MODE="64"
+       HPUX_IA64_MODE=64
        ;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
        ;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo '#line '$LINENO' "configure"' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
   echo '#line '$LINENO' "configure"' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
       case `/usr/bin/file conftest.$ac_objext` in
        *32-bit*)
          LD="${LD-ld} -melf32bsmip"
       case `/usr/bin/file conftest.$ac_objext` in
        *32-bit*)
          LD="${LD-ld} -melf32bsmip"
@@ -7256,9 +7836,50 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
   rm -rf conftest*
   ;;
 
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+       emul="${emul}32"
+       ;;
+      *64-bit*)
+       emul="${emul}64"
+       ;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+       emul="${emul}btsmip"
+       ;;
+      *LSB*)
+       emul="${emul}ltsmip"
+       ;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+       emul="${emul}n32"
+       ;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
 x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -7281,10 +7902,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
                ;;
            esac
            ;;
                ;;
            esac
            ;;
-         powerpc64le-*)
+         powerpc64le-*linux*)
            LD="${LD-ld} -m elf32lppclinux"
            ;;
            LD="${LD-ld} -m elf32lppclinux"
            ;;
-         powerpc64-*)
+         powerpc64-*linux*)
            LD="${LD-ld} -m elf32ppclinux"
            ;;
          s390x-*linux*)
            LD="${LD-ld} -m elf32ppclinux"
            ;;
          s390x-*linux*)
@@ -7303,10 +7924,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
          x86_64-*linux*)
            LD="${LD-ld} -m elf_x86_64"
            ;;
          x86_64-*linux*)
            LD="${LD-ld} -m elf_x86_64"
            ;;
-         powerpcle-*)
+         powerpcle-*linux*)
            LD="${LD-ld} -m elf64lppc"
            ;;
            LD="${LD-ld} -m elf64lppc"
            ;;
-         powerpc-*)
+         powerpc-*linux*)
            LD="${LD-ld} -m elf64ppc"
            ;;
          s390*-*linux*|s390*-*tpf*)
            LD="${LD-ld} -m elf64ppc"
            ;;
          s390*-*linux*|s390*-*tpf*)
@@ -7324,7 +7945,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
+  SAVE_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -belf"
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
 $as_echo_n "checking whether the C compiler needs -belf... " >&6; }
   CFLAGS="$CFLAGS -belf"
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
 $as_echo_n "checking whether the C compiler needs -belf... " >&6; }
@@ -7364,13 +7985,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
 $as_echo "$lt_cv_cc_needs_belf" >&6; }
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
 $as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+  if test yes != "$lt_cv_cc_needs_belf"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
+    CFLAGS=$SAVE_CFLAGS
   fi
   ;;
 *-*solaris*)
   fi
   ;;
 *-*solaris*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -7382,7 +8004,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris*|x86_64-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
@@ -7391,7 +8013,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
+          LD=${LD-ld}_sol2
         fi
         ;;
       *)
         fi
         ;;
       *)
@@ -7407,7 +8029,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
   ;;
 esac
 
   ;;
 esac
 
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
 
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
 
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
@@ -7518,7 +8140,7 @@ else
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
 $as_echo "$lt_cv_path_mainfest_tool" >&6; }
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
 $as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
   MANIFEST_TOOL=:
 fi
 
   MANIFEST_TOOL=:
 fi
 
@@ -8021,7 +8643,7 @@ if ${lt_cv_apple_cc_single_mod+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_apple_cc_single_mod=no
   $as_echo_n "(cached) " >&6
 else
   lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
+      if test -z "$LT_MULTI_MODULE"; then
        # By default we will add the -single_module flag. You can override
        # by either setting the environment variable LT_MULTI_MODULE
        # non-empty at configure time, or by adding -multi_module to the
        # By default we will add the -single_module flag. You can override
        # by either setting the environment variable LT_MULTI_MODULE
        # non-empty at configure time, or by adding -multi_module to the
@@ -8039,7 +8661,7 @@ else
          cat conftest.err >&5
        # Otherwise, if the output was created with a 0 exit code from
        # the compiler, it worked.
          cat conftest.err >&5
        # Otherwise, if the output was created with a 0 exit code from
        # the compiler, it worked.
-       elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+       elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
          lt_cv_apple_cc_single_mod=yes
        else
          cat conftest.err >&5
          lt_cv_apple_cc_single_mod=yes
        else
          cat conftest.err >&5
@@ -8078,7 +8700,7 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-       LDFLAGS="$save_LDFLAGS"
+       LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
@@ -8107,7 +8729,7 @@ _LT_EOF
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
        cat conftest.err >&5
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
        cat conftest.err >&5
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
        lt_cv_ld_force_load=yes
       else
        cat conftest.err >&5
        lt_cv_ld_force_load=yes
       else
        cat conftest.err >&5
@@ -8120,32 +8742,32 @@ fi
 $as_echo "$lt_cv_ld_force_load" >&6; }
     case $host_os in
     rhapsody* | darwin1.[012])
 $as_echo "$lt_cv_ld_force_load" >&6; }
     case $host_os in
     rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
     darwin1.*)
     darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
        10.0,*86*-darwin8*|10.0,*-darwin[91]*)
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
        10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-       10.[012]*)
-         _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+         _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+       10.[012][,.]*)
+         _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
        10.*)
        10.*)
-         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+         _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
       esac
     ;;
   esac
       esac
     ;;
   esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
       _lt_dar_single_mod='$single_module'
     fi
       _lt_dar_single_mod='$single_module'
     fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
     else
     else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
     fi
     fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -8153,6 +8775,41 @@ $as_echo "$lt_cv_ld_force_load" >&6; }
     ;;
   esac
 
     ;;
   esac
 
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -8447,14 +9104,14 @@ if test "${enable_static+set}" = set; then :
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
       for pkg in $enableval; do
-       IFS="$lt_save_ifs"
+       IFS=$lt_save_ifs
        if test "X$pkg" = "X$p"; then
          enable_static=yes
        fi
       done
        if test "X$pkg" = "X$p"; then
          enable_static=yes
        fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
       ;;
     esac
 else
@@ -8485,14 +9142,14 @@ if test "${enable_shared+set}" = set; then :
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
       for pkg in $enableval; do
-       IFS="$lt_save_ifs"
+       IFS=$lt_save_ifs
        if test "X$pkg" = "X$p"; then
          enable_shared=yes
        fi
       done
        if test "X$pkg" = "X$p"; then
          enable_shared=yes
        fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
       ;;
     esac
 else
@@ -8517,14 +9174,14 @@ if test "${with_pic+set}" = set; then :
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for lt_pkg in $withval; do
       for lt_pkg in $withval; do
-       IFS="$lt_save_ifs"
+       IFS=$lt_save_ifs
        if test "X$lt_pkg" = "X$lt_p"; then
          pic_mode=yes
        fi
       done
        if test "X$lt_pkg" = "X$lt_p"; then
          pic_mode=yes
        fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
       ;;
     esac
 else
@@ -8532,8 +9189,6 @@ else
 fi
 
 
 fi
 
 
-test -z "$pic_mode" && pic_mode=default
-
 
 
 
 
 
 
@@ -8549,14 +9204,14 @@ if test "${enable_fast_install+set}" = set; then :
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
       for pkg in $enableval; do
-       IFS="$lt_save_ifs"
+       IFS=$lt_save_ifs
        if test "X$pkg" = "X$p"; then
          enable_fast_install=yes
        fi
       done
        if test "X$pkg" = "X$p"; then
          enable_fast_install=yes
        fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
       ;;
     esac
 else
@@ -8570,11 +9225,63 @@ fi
 
 
 
 
 
 
+  shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname
+else
+  if ${lt_cv_with_aix_soname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_with_aix_soname=aix
+fi
+
+    with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+
+
+
+
+
+
 
 
 
 # This can be used to rebuild libtool when needed
 
 
 
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -8623,7 +9330,7 @@ test -z "$LN_S" && LN_S="ln -s"
 
 
 
 
 
 
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
    setopt NO_GLOB_SUBST
 fi
 
@@ -8662,7 +9369,7 @@ aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
+  if test set != "${COLLECT_NAMES+set}"; then
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
@@ -8673,14 +9380,14 @@ esac
 ofile=libtool
 can_build_shared=yes
 
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 
 # which needs '.lib').
 libext=a
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
@@ -8689,15 +9396,8 @@ test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
 test -z "$LD" && LD=ld
 test -z "$ac_objext" && ac_objext=o
 
 test -z "$LD" && LD=ld
 test -z "$ac_objext" && ac_objext=o
 
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
 
 
 # Only perform the check for file, if the check method requires it
 
 
 # Only perform the check for file, if the check method requires it
@@ -8712,22 +9412,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+    if test -f "$ac_dir/${ac_tool_prefix}file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
       if test -n "$file_magic_test_file"; then
        case $deplibs_check_method in
        "file_magic "*)
          file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
       if test -n "$file_magic_test_file"; then
        case $deplibs_check_method in
        "file_magic "*)
          file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         MAGIC_CMD=$lt_cv_path_MAGIC_CMD
          if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
            $EGREP "$file_magic_regex" > /dev/null; then
            :
          if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
            $EGREP "$file_magic_regex" > /dev/null; then
            :
@@ -8750,13 +9450,13 @@ _LT_EOF
       break
     fi
   done
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac
 fi
 
   ;;
 esac
 fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
@@ -8778,22 +9478,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+    if test -f "$ac_dir/file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
       if test -n "$file_magic_test_file"; then
        case $deplibs_check_method in
        "file_magic "*)
          file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
       if test -n "$file_magic_test_file"; then
        case $deplibs_check_method in
        "file_magic "*)
          file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         MAGIC_CMD=$lt_cv_path_MAGIC_CMD
          if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
            $EGREP "$file_magic_regex" > /dev/null; then
            :
          if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
            $EGREP "$file_magic_regex" > /dev/null; then
            :
@@ -8816,13 +9516,13 @@ _LT_EOF
       break
     fi
   done
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac
 fi
 
   ;;
 esac
 fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
@@ -8843,7 +9543,7 @@ esac
 
 # Use C for the default configuration in the libtool script
 
 
 # Use C for the default configuration in the libtool script
 
-lt_save_CC="$CC"
+lt_save_CC=$CC
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -8905,7 +9605,7 @@ if test -n "$compiler"; then
 
 lt_prog_compiler_no_builtin_flag=
 
 
 lt_prog_compiler_no_builtin_flag=
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $cc_basename in
   nvcc*)
     lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
   case $cc_basename in
   nvcc*)
     lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
@@ -8921,7 +9621,7 @@ else
   lt_cv_prog_compiler_rtti_exceptions=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   lt_cv_prog_compiler_rtti_exceptions=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -8951,7 +9651,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
     lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
 else
     :
     lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
 else
     :
@@ -8969,17 +9669,18 @@ lt_prog_compiler_pic=
 lt_prog_compiler_static=
 
 
 lt_prog_compiler_static=
 
 
-  if test "$GCC" = yes; then
+  if test yes = "$GCC"; then
     lt_prog_compiler_wl='-Wl,'
     lt_prog_compiler_static='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
     lt_prog_compiler_wl='-Wl,'
     lt_prog_compiler_static='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
        # AIX 5 now supports IA64 processor
        lt_prog_compiler_static='-Bstatic'
       fi
        # AIX 5 now supports IA64 processor
        lt_prog_compiler_static='-Bstatic'
       fi
+      lt_prog_compiler_pic='-fPIC'
       ;;
 
     amigaos*)
       ;;
 
     amigaos*)
@@ -8990,8 +9691,8 @@ lt_prog_compiler_static=
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
             lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -9007,6 +9708,11 @@ lt_prog_compiler_static=
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic='-DDLL_EXPORT'
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+       lt_prog_compiler_static='$wl-static'
+       ;;
+      esac
       ;;
 
     darwin* | rhapsody*)
       ;;
 
     darwin* | rhapsody*)
@@ -9077,7 +9783,7 @@ lt_prog_compiler_static=
     case $host_os in
     aix*)
       lt_prog_compiler_wl='-Wl,'
     case $host_os in
     aix*)
       lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
        # AIX 5 now supports IA64 processor
        lt_prog_compiler_static='-Bstatic'
       else
        # AIX 5 now supports IA64 processor
        lt_prog_compiler_static='-Bstatic'
       else
@@ -9085,10 +9791,29 @@ lt_prog_compiler_static=
       fi
       ;;
 
       fi
       ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl='-Wl,-Wl,,'
+        lt_prog_compiler_pic='-PIC'
+        lt_prog_compiler_static='-Bstatic'
+        ;;
+      esac
+      ;;
+
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       lt_prog_compiler_pic='-DDLL_EXPORT'
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+       lt_prog_compiler_static='$wl-static'
+       ;;
+      esac
       ;;
 
     hpux9* | hpux10* | hpux11*)
       ;;
 
     hpux9* | hpux10* | hpux11*)
@@ -9104,7 +9829,7 @@ lt_prog_compiler_static=
        ;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
        ;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      lt_prog_compiler_static='$wl-a ${wl}archive'
       ;;
 
     irix5* | irix6* | nonstopux*)
       ;;
 
     irix5* | irix6* | nonstopux*)
@@ -9115,7 +9840,7 @@ lt_prog_compiler_static=
 
     linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
 
     linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
+      # old Intel for x86_64, which still supported -KPIC.
       ecc*)
        lt_prog_compiler_wl='-Wl,'
        lt_prog_compiler_pic='-KPIC'
       ecc*)
        lt_prog_compiler_wl='-Wl,'
        lt_prog_compiler_pic='-KPIC'
@@ -9140,6 +9865,12 @@ lt_prog_compiler_static=
        lt_prog_compiler_pic='-PIC'
        lt_prog_compiler_static='-Bstatic'
        ;;
        lt_prog_compiler_pic='-PIC'
        lt_prog_compiler_static='-Bstatic'
        ;;
+      tcc*)
+       # Fabrice Bellard et al's Tiny C Compiler
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-fPIC'
+       lt_prog_compiler_static='-static'
+       ;;
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
        # which looks to be a dead project)
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
        # which looks to be a dead project)
@@ -9237,7 +9968,7 @@ lt_prog_compiler_static=
       ;;
 
     sysv4*MP*)
       ;;
 
     sysv4*MP*)
-      if test -d /usr/nec ;then
+      if test -d /usr/necthen
        lt_prog_compiler_pic='-Kconform_pic'
        lt_prog_compiler_static='-Bstatic'
       fi
        lt_prog_compiler_pic='-Kconform_pic'
        lt_prog_compiler_static='-Bstatic'
       fi
@@ -9266,7 +9997,7 @@ lt_prog_compiler_static=
   fi
 
 case $host_os in
   fi
 
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     lt_prog_compiler_pic=
     ;;
   *djgpp*)
     lt_prog_compiler_pic=
     ;;
@@ -9298,7 +10029,7 @@ else
   lt_cv_prog_compiler_pic_works=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   lt_cv_prog_compiler_pic_works=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -9328,7 +10059,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
     case $lt_prog_compiler_pic in
      "" | " "*) ;;
      *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
     case $lt_prog_compiler_pic in
      "" | " "*) ;;
      *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
@@ -9360,7 +10091,7 @@ if ${lt_cv_prog_compiler_static_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works=no
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -9379,13 +10110,13 @@ else
      fi
    fi
    $RM -r conftest*
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
 $as_echo "$lt_cv_prog_compiler_static_works" >&6; }
 
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
 $as_echo "$lt_cv_prog_compiler_static_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_static_works"; then
     :
 else
     lt_prog_compiler_static=
     :
 else
     lt_prog_compiler_static=
@@ -9505,8 +10236,8 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
 
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
@@ -9518,9 +10249,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
     need_locks=warn
   fi
 else
     need_locks=warn
   fi
 else
@@ -9563,9 +10294,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   # included in the symbol list
   include_expsyms=
   # exclude_expsyms can be an extended regexp of symbols to exclude
   # included in the symbol list
   include_expsyms=
   # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
   exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
   exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
@@ -9580,7 +10311,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
       with_gnu_ld=no
     fi
     ;;
@@ -9588,7 +10319,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
-  openbsd*)
+  openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
   linux* | k*bsd*-gnu | gnu*)
     with_gnu_ld=no
     ;;
   linux* | k*bsd*-gnu | gnu*)
@@ -9601,7 +10332,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     case $host_os in
       aix*)
        # The AIX port of GNU ld has always aspired to compatibility
     case $host_os in
       aix*)
        # The AIX port of GNU ld has always aspired to compatibility
@@ -9623,24 +10354,24 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     esac
   fi
 
     esac
   fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
+  if test yes = "$lt_use_gnu_ld_interface"; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
     # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+    wlarc='$wl'
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
+    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec='$wl--export-dynamic'
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
     else
       whole_archive_flag_spec=
     fi
     supports_anon_versioning=no
     else
       whole_archive_flag_spec=
     fi
     supports_anon_versioning=no
-    case `$LD -v 2>&1` in
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -9653,7 +10384,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     case $host_os in
     aix[3-9]*)
       # On AIX/PPC, the GNU linker is very broken
     case $host_os in
     aix[3-9]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
+      if test ia64 != "$host_cpu"; then
        ld_shlibs=no
        cat <<_LT_EOF 1>&2
 
        ld_shlibs=no
        cat <<_LT_EOF 1>&2
 
@@ -9672,7 +10403,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             archive_expsym_cmds=''
         ;;
       m68k)
             archive_expsym_cmds=''
         ;;
       m68k)
@@ -9688,7 +10419,7 @@ _LT_EOF
        allow_undefined_flag=unsupported
        # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
        # support --undefined.  This deserves some investigation.  FIXME
        allow_undefined_flag=unsupported
        # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
        # support --undefined.  This deserves some investigation.  FIXME
-       archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       else
        ld_shlibs=no
       fi
       else
        ld_shlibs=no
       fi
@@ -9698,7 +10429,7 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
       # as there is no search path for DLLs.
       hardcode_libdir_flag_spec='-L$libdir'
       # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
       # as there is no search path for DLLs.
       hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      export_dynamic_flag_spec='$wl--export-all-symbols'
       allow_undefined_flag=unsupported
       always_export_symbols=no
       enable_shared_with_static_runtimes=yes
       allow_undefined_flag=unsupported
       always_export_symbols=no
       enable_shared_with_static_runtimes=yes
@@ -9706,61 +10437,89 @@ _LT_EOF
       exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
       exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-       # If the export-symbols file already is a .def file (1st line
-       # is EXPORTS), use it as is; otherwise, prepend...
-       archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-         cp $export_symbols $output_objdir/$soname.def;
-       else
-         echo EXPORTS > $output_objdir/$soname.def;
-         cat $export_symbols >> $output_objdir/$soname.def;
-       fi~
-       $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+       # If the export-symbols file already is a .def file, use it as
+       # is; otherwise, prepend EXPORTS...
+       archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[   ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([     ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
        ld_shlibs=no
       fi
       ;;
 
     haiku*)
       else
        ld_shlibs=no
       fi
       ;;
 
     haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       link_all_deplibs=yes
       ;;
 
       link_all_deplibs=yes
       ;;
 
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+       $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+       $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+       $ECHO EXPORTS >> $output_objdir/$libname.def~
+       emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+       $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+       emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+       $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+       $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+       $ECHO EXPORTS >> $output_objdir/$libname.def~
+       prefix_cmds="$SED"~
+       if test EXPORTS = "`$SED 1q $export_symbols`"; then
+         prefix_cmds="$prefix_cmds -e 1d";
+       fi~
+       prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+       cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+       $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+       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
+      ;;
+
     interix[3-9]*)
       hardcode_direct=no
       hardcode_shlibpath_var=no
     interix[3-9]*)
       hardcode_direct=no
       hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
+      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+      export_dynamic_flag_spec='$wl-E'
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
+      if test linux-dietlibc = "$host_os"; then
        case $cc_basename in
          diet\ *) tmp_diet=yes;;       # linux-dietlibc with static linking (!diet-dyn)
        esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
        case $cc_basename in
          diet\ *) tmp_diet=yes;;       # linux-dietlibc with static linking (!diet-dyn)
        esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-        && test "$tmp_diet" = no
+        && test no = "$tmp_diet"
       then
        tmp_addflag=' $pic_flag'
        tmp_sharedflag='-shared'
        case $cc_basename,$host_cpu in
         pgcc*)                         # Portland Group C compiler
       then
        tmp_addflag=' $pic_flag'
        tmp_sharedflag='-shared'
        case $cc_basename,$host_cpu in
         pgcc*)                         # Portland Group C compiler
-         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
          tmp_addflag=' $pic_flag'
          ;;
        pgf77* | pgf90* | pgf95* | pgfortran*)
                                        # Portland Group f77 and f90 compilers
          tmp_addflag=' $pic_flag'
          ;;
        pgf77* | pgf90* | pgf95* | pgfortran*)
                                        # Portland Group f77 and f90 compilers
-         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
          tmp_addflag=' $pic_flag -Mnomain' ;;
        ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
          tmp_addflag=' -i_dynamic' ;;
          tmp_addflag=' $pic_flag -Mnomain' ;;
        ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
          tmp_addflag=' -i_dynamic' ;;
@@ -9771,42 +10530,47 @@ _LT_EOF
        lf95*)                          # Lahey Fortran 8.1
          whole_archive_flag_spec=
          tmp_sharedflag='--shared' ;;
        lf95*)                          # Lahey Fortran 8.1
          whole_archive_flag_spec=
          tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
        xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
          tmp_sharedflag='-qmkshrobj'
          tmp_addflag= ;;
        nvcc*)  # Cuda Compiler Driver 2.2
        xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
          tmp_sharedflag='-qmkshrobj'
          tmp_addflag= ;;
        nvcc*)  # Cuda Compiler Driver 2.2
-         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
          compiler_needs_object=yes
          ;;
        esac
        case `$CC -V 2>&1 | sed 5q` in
        *Sun\ C*)                       # Sun C 5.9
          compiler_needs_object=yes
          ;;
        esac
        case `$CC -V 2>&1 | sed 5q` in
        *Sun\ C*)                       # Sun C 5.9
-         whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
          compiler_needs_object=yes
          tmp_sharedflag='-G' ;;
        *Sun\ F*)                       # Sun Fortran 8.3
          tmp_sharedflag='-G' ;;
        esac
          compiler_needs_object=yes
          tmp_sharedflag='-G' ;;
        *Sun\ F*)                       # Sun Fortran 8.3
          tmp_sharedflag='-G' ;;
        esac
-       archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 
 
-        if test "x$supports_anon_versioning" = xyes; then
+        if test yes = "$supports_anon_versioning"; then
           archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
           archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-           cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-           echo "local: *; };" >> $output_objdir/$libname.ver~
-           $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
         fi
 
        case $cc_basename in
         fi
 
        case $cc_basename in
+       tcc*)
+         export_dynamic_flag_spec='-rdynamic'
+         ;;
        xlf* | bgf* | bgxlf* | mpixlf*)
          # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
          whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
        xlf* | bgf* | bgxlf* | mpixlf*)
          # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
          whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-         hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+         hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
          archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
          archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-         if test "x$supports_anon_versioning" = xyes; then
+         if test yes = "$supports_anon_versioning"; then
            archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
            archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-             cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-             echo "local: *; };" >> $output_objdir/$libname.ver~
-             $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
          fi
          ;;
        esac
          fi
          ;;
        esac
@@ -9820,8 +10584,8 @@ _LT_EOF
        archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
       else
        archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
       else
-       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
       fi
       ;;
 
@@ -9839,8 +10603,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
        ld_shlibs=no
       fi
       else
        ld_shlibs=no
       fi
@@ -9852,7 +10616,7 @@ _LT_EOF
        ld_shlibs=no
        cat <<_LT_EOF 1>&2
 
        ld_shlibs=no
        cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
@@ -9867,9 +10631,9 @@ _LT_EOF
          # DT_RUNPATH tag from executables and libraries.  But doing so
          # requires that you compile everything twice, which is a pain.
          if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
          # DT_RUNPATH tag from executables and libraries.  But doing so
          # requires that you compile everything twice, which is a pain.
          if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-           hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-           archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-           archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+           hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+           archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+           archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
          else
            ld_shlibs=no
          fi
          else
            ld_shlibs=no
          fi
@@ -9886,15 +10650,15 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
        ld_shlibs=no
       fi
       ;;
     esac
 
       else
        ld_shlibs=no
       fi
       ;;
     esac
 
-    if test "$ld_shlibs" = no; then
+    if test no = "$ld_shlibs"; then
       runpath_var=
       hardcode_libdir_flag_spec=
       export_dynamic_flag_spec=
       runpath_var=
       hardcode_libdir_flag_spec=
       export_dynamic_flag_spec=
@@ -9910,7 +10674,7 @@ _LT_EOF
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       hardcode_minus_L=yes
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
        # Neither direct hardcoding nor static linking is supported with a
        # broken collect2.
        hardcode_direct=unsupported
        # Neither direct hardcoding nor static linking is supported with a
        # broken collect2.
        hardcode_direct=unsupported
@@ -9918,34 +10682,57 @@ _LT_EOF
       ;;
 
     aix[4-9]*)
       ;;
 
     aix[4-9]*)
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
        # On IA64, the linker does run time linking by default, so we don't
        # have to do anything special.
        aix_use_runtimelinking=no
        exp_sym_flag='-Bexport'
        # On IA64, the linker does run time linking by default, so we don't
        # have to do anything special.
        aix_use_runtimelinking=no
        exp_sym_flag='-Bexport'
-       no_entry_flag=""
+       no_entry_flag=
       else
        # If we're using GNU nm, then we don't want the "-C" option.
       else
        # If we're using GNU nm, then we don't want the "-C" option.
-       # -C means demangle to AIX nm, but means don't demangle with GNU nm
-       # Also, AIX nm treats weak defined symbols like other global
-       # defined symbols, whereas GNU nm marks them as "W".
+       # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+       # Without the "-l" option, or with the "-B" option, AIX nm treats
+       # weak defined symbols like other global defined symbols, whereas
+       # GNU nm marks them as "W".
+       # While the 'weak' keyword is ignored in the Export File, we need
+       # it in the Import File for the 'aix-soname' feature, so we have
+       # to replace the "-B" option with "-P" for AIX nm.
        if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
        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) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+         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
        else
-         export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+         export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
        fi
        aix_use_runtimelinking=no
 
        # Test if we are trying to use run time linking or normal
        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
        fi
        aix_use_runtimelinking=no
 
        # Test if we are trying to use run time linking or normal
        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-       # need to do runtime linking.
+       # have runtime linking enabled, and use it for executables.
+       # For shared libraries, we enable/disable runtime linking
+       # depending on the kind of the shared library created -
+       # when "with_aix_soname,aix_use_runtimelinking" is:
+       # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+       # "aix,yes"  lib.so          shared, rtl:yes, for executables
+       #            lib.a           static archive
+       # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+       #            lib.a(lib.so.V) shared, rtl:no,  for executables
+       # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+       #            lib.a(lib.so.V) shared, rtl:no
+       # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+       #            lib.a           static archive
        case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
          for ld_flag in $LDFLAGS; do
        case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
          for ld_flag in $LDFLAGS; do
-         if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+         if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
            aix_use_runtimelinking=yes
            break
          fi
          done
            aix_use_runtimelinking=yes
            break
          fi
          done
+         if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+           # With aix-soname=svr4, we create the lib.so.V shared archives only,
+           # so we don't have lib.a shared libs to link our executables.
+           # We have to force runtime linking in this case.
+           aix_use_runtimelinking=yes
+           LDFLAGS="$LDFLAGS -Wl,-brtl"
+         fi
          ;;
        esac
 
          ;;
        esac
 
@@ -9964,13 +10751,21 @@ _LT_EOF
       hardcode_direct_absolute=yes
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
       hardcode_direct_absolute=yes
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
+      file_list_spec='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+       # The Import File defines what to hardcode.
+       hardcode_direct=no
+       hardcode_direct_absolute=no
+       ;;
+      esac
 
 
-      if test "$GCC" = yes; then
+      if test yes = "$GCC"; then
        case $host_os in aix4.[012]|aix4.[012].*)
        # We only want to do this on AIX 4.2 and lower, the check
        # below for broken collect2 doesn't work under 4.3+
        case $host_os in aix4.[012]|aix4.[012].*)
        # We only want to do this on AIX 4.2 and lower, the check
        # below for broken collect2 doesn't work under 4.3+
-         collect2name=`${CC} -print-prog-name=collect2`
+         collect2name=`$CC -print-prog-name=collect2`
          if test -f "$collect2name" &&
           strings "$collect2name" | $GREP resolve_lib_name >/dev/null
          then
          if test -f "$collect2name" &&
           strings "$collect2name" | $GREP resolve_lib_name >/dev/null
          then
@@ -9989,36 +10784,42 @@ _LT_EOF
          ;;
        esac
        shared_flag='-shared'
          ;;
        esac
        shared_flag='-shared'
-       if test "$aix_use_runtimelinking" = yes; then
-         shared_flag="$shared_flag "'${wl}-G'
+       if test yes = "$aix_use_runtimelinking"; then
+         shared_flag="$shared_flag "'$wl-G'
        fi
        fi
-       link_all_deplibs=no
+       # Need to ensure runtime linking is disabled for the traditional
+       # shared library, or the linker may eventually find shared libraries
+       # /with/ Import File - we do not want to mix them.
+       shared_flag_aix='-shared'
+       shared_flag_svr4='-shared $wl-G'
       else
        # not using gcc
       else
        # not using gcc
-       if test "$host_cpu" = ia64; then
+       if test ia64 = "$host_cpu"; then
        # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
        # chokes on -Wl,-G. The following line is correct:
          shared_flag='-G'
        else
        # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
        # chokes on -Wl,-G. The following line is correct:
          shared_flag='-G'
        else
-         if test "$aix_use_runtimelinking" = yes; then
-           shared_flag='${wl}-G'
+         if test yes = "$aix_use_runtimelinking"; then
+           shared_flag='$wl-G'
          else
          else
-           shared_flag='${wl}-bM:SRE'
+           shared_flag='$wl-bM:SRE'
          fi
          fi
+         shared_flag_aix='$wl-bM:SRE'
+         shared_flag_svr4='$wl-G'
        fi
       fi
 
        fi
       fi
 
-      export_dynamic_flag_spec='${wl}-bexpall'
+      export_dynamic_flag_spec='$wl-bexpall'
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       always_export_symbols=yes
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
        # Warning - without using the other runtime loading flags (-brtl),
        # -berok will link without error, but may produce a broken library.
        allow_undefined_flag='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
        # Warning - without using the other runtime loading flags (-brtl),
        # -berok will link without error, but may produce a broken library.
        allow_undefined_flag='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
-        if test "${lt_cv_aix_libpath+set}" = set; then
+        if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
@@ -10053,7 +10854,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
+    lt_cv_aix_libpath_=/usr/lib:/lib
   fi
 
 fi
   fi
 
 fi
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
       else
       else
-       if test "$host_cpu" = ia64; then
-         hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+       if test ia64 = "$host_cpu"; then
+         hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
          allow_undefined_flag="-z nodefs"
          allow_undefined_flag="-z nodefs"
-         archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+         archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
        else
         # Determine the default libpath from the value encoded in an
         # empty executable.
        else
         # Determine the default libpath from the value encoded in an
         # empty executable.
-        if test "${lt_cv_aix_libpath+set}" = set; then
+        if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
@@ -10106,7 +10907,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
+    lt_cv_aix_libpath_=/usr/lib:/lib
   fi
 
 fi
   fi
 
 fi
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
          # Warning - without using the other run time loading flags,
          # -berok will link without error, but may produce a broken library.
          # Warning - without using the other run time loading flags,
          # -berok will link without error, but may produce a broken library.
-         no_undefined_flag=' ${wl}-bernotok'
-         allow_undefined_flag=' ${wl}-berok'
-         if test "$with_gnu_ld" = yes; then
+         no_undefined_flag=' $wl-bernotok'
+         allow_undefined_flag=' $wl-berok'
+         if test yes = "$with_gnu_ld"; then
            # We only use this code for GNU lds that support --whole-archive.
            # We only use this code for GNU lds that support --whole-archive.
-           whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
          else
            # Exported symbols can be pulled into shared objects from archives
            whole_archive_flag_spec='$convenience'
          fi
          archive_cmds_need_lc=yes
          else
            # Exported symbols can be pulled into shared objects from archives
            whole_archive_flag_spec='$convenience'
          fi
          archive_cmds_need_lc=yes
-         # This is similar to how AIX traditionally builds its shared libraries.
-         archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+         archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+         # -brtl affects multiple linker settings, -berok does not and is overridden later
+         compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+         if test svr4 != "$with_aix_soname"; then
+           # This is similar to how AIX traditionally builds its shared libraries.
+           archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+         fi
+         if test aix != "$with_aix_soname"; then
+           archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+         else
+           # used by -dlpreopen to get the symbols
+           archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+         fi
+         archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
        fi
       fi
       ;;
        fi
       fi
       ;;
@@ -10137,7 +10950,7 @@ fi
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             archive_expsym_cmds=''
         ;;
       m68k)
             archive_expsym_cmds=''
         ;;
       m68k)
        # Tell ltmain to make .lib files, not .a files.
        libext=lib
        # Tell ltmain to make .dll files, not .so files.
        # Tell ltmain to make .lib files, not .a files.
        libext=lib
        # Tell ltmain to make .dll files, not .so files.
-       shrext_cmds=".dll"
+       shrext_cmds=.dll
        # FIXME: Setting linknames here is a bad hack.
        # FIXME: Setting linknames here is a bad hack.
-       archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-       archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-           sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-         else
-           sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-         fi~
-         $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-         linknames='
+       archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+       archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[   ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([     ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
        # The linker will not automatically build a static lib if we build a DLL.
        # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
        enable_shared_with_static_runtimes=yes
        # The linker will not automatically build a static lib if we build a DLL.
        # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
        enable_shared_with_static_runtimes=yes
        # Don't use ranlib
        old_postinstall_cmds='chmod 644 $oldlib'
        postlink_cmds='lt_outputfile="@OUTPUT@"~
        # Don't use ranlib
        old_postinstall_cmds='chmod 644 $oldlib'
        postlink_cmds='lt_outputfile="@OUTPUT@"~
-         lt_tool_outputfile="@TOOL_OUTPUT@"~
-         case $lt_outputfile in
-           *.exe|*.EXE) ;;
-           *)
-             lt_outputfile="$lt_outputfile.exe"
-             lt_tool_outputfile="$lt_tool_outputfile.exe"
-             ;;
-         esac~
-         if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-           $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-           $RM "$lt_outputfile.manifest";
-         fi'
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
        ;;
       *)
        # Assume MSVC wrapper
        ;;
       *)
        # Assume MSVC wrapper
@@ -10205,7 +11019,7 @@ fi
        # Tell ltmain to make .lib files, not .a files.
        libext=lib
        # Tell ltmain to make .dll files, not .so files.
        # Tell ltmain to make .lib files, not .a files.
        libext=lib
        # Tell ltmain to make .dll files, not .so files.
-       shrext_cmds=".dll"
+       shrext_cmds=.dll
        # FIXME: Setting linknames here is a bad hack.
        archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
        # The linker will automatically build a .lib file if we build a DLL.
        # FIXME: Setting linknames here is a bad hack.
        archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
        # The linker will automatically build a .lib file if we build a DLL.
   hardcode_direct=no
   hardcode_automatic=yes
   hardcode_shlibpath_var=unsupported
   hardcode_direct=no
   hardcode_automatic=yes
   hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
   else
     whole_archive_flag_spec=''
   fi
   link_all_deplibs=yes
 
   else
     whole_archive_flag_spec=''
   fi
   link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
+  allow_undefined_flag=$_lt_dar_allow_undefined
   case $cc_basename in
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
     output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
 
   else
   ld_shlibs=no
 
   else
   ld_shlibs=no
       ;;
 
     hpux9*)
       ;;
 
     hpux9*)
-      if test "$GCC" = yes; then
-       archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      if test yes = "$GCC"; then
+       archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       else
       else
-       archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+       archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       fi
       fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
       hardcode_libdir_separator=:
       hardcode_direct=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       hardcode_minus_L=yes
       hardcode_libdir_separator=:
       hardcode_direct=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
+      export_dynamic_flag_spec='$wl-E'
       ;;
 
     hpux10*)
       ;;
 
     hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-       archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+       archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
        archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
       else
        archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
-      if test "$with_gnu_ld" = no; then
-       hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+       hardcode_libdir_flag_spec='$wl+b $wl$libdir'
        hardcode_libdir_separator=:
        hardcode_direct=yes
        hardcode_direct_absolute=yes
        hardcode_libdir_separator=:
        hardcode_direct=yes
        hardcode_direct_absolute=yes
-       export_dynamic_flag_spec='${wl}-E'
+       export_dynamic_flag_spec='$wl-E'
        # hardcode_minus_L: Not really in the search PATH,
        # but as the default location of the library.
        hardcode_minus_L=yes
        # hardcode_minus_L: Not really in the search PATH,
        # but as the default location of the library.
        hardcode_minus_L=yes
       ;;
 
     hpux11*)
       ;;
 
     hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+      if test yes,no = "$GCC,$with_gnu_ld"; then
        case $host_cpu in
        hppa*64*)
        case $host_cpu in
        hppa*64*)
-         archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        ia64*)
          ;;
        ia64*)
-         archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        *)
          ;;
        *)
-         archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+         archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        esac
       else
        case $host_cpu in
        hppa*64*)
          ;;
        esac
       else
        case $host_cpu in
        hppa*64*)
-         archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        ia64*)
          ;;
        ia64*)
-         archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        *)
 
          ;;
        *)
 
@@ -10347,7 +11161,7 @@ if ${lt_cv_prog_compiler__b+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler__b=no
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS -b"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
    LDFLAGS="$LDFLAGS -b"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -10366,14 +11180,14 @@ else
      fi
    fi
    $RM -r conftest*
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
 $as_echo "$lt_cv_prog_compiler__b" >&6; }
 
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
 $as_echo "$lt_cv_prog_compiler__b" >&6; }
 
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+if test yes = "$lt_cv_prog_compiler__b"; then
+    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 else
     archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
 fi
 else
     archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
 fi
@@ -10381,8 +11195,8 @@ fi
          ;;
        esac
       fi
          ;;
        esac
       fi
-      if test "$with_gnu_ld" = no; then
-       hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+       hardcode_libdir_flag_spec='$wl+b $wl$libdir'
        hardcode_libdir_separator=:
 
        case $host_cpu in
        hardcode_libdir_separator=:
 
        case $host_cpu in
@@ -10393,7 +11207,7 @@ fi
        *)
          hardcode_direct=yes
          hardcode_direct_absolute=yes
        *)
          hardcode_direct=yes
          hardcode_direct_absolute=yes
-         export_dynamic_flag_spec='${wl}-E'
+         export_dynamic_flag_spec='$wl-E'
 
          # hardcode_minus_L: Not really in the search PATH,
          # but as the default location of the library.
 
          # hardcode_minus_L: Not really in the search PATH,
          # but as the default location of the library.
@@ -10404,8 +11218,8 @@ fi
       ;;
 
     irix5* | irix6* | nonstopux*)
       ;;
 
     irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+       archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
        # Try to use the -exported_symbol ld option, if it does not
        # work, assume that -exports_file does not work either and
        # implicitly export all symbols.
        # Try to use the -exported_symbol ld option, if it does not
        # work, assume that -exports_file does not work either and
        # implicitly export all symbols.
@@ -10415,8 +11229,8 @@ $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >
 if ${lt_cv_irix_exported_symbol+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 if ${lt_cv_irix_exported_symbol+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  save_LDFLAGS="$LDFLAGS"
-          LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+  save_LDFLAGS=$LDFLAGS
+          LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 int foo (void) { return 0; }
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 int foo (void) { return 0; }
@@ -10428,24 +11242,35 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-           LDFLAGS="$save_LDFLAGS"
+           LDFLAGS=$save_LDFLAGS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
 $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
 $as_echo "$lt_cv_irix_exported_symbol" >&6; }
-       if test "$lt_cv_irix_exported_symbol" = yes; then
-          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+       if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
        fi
        fi
+       link_all_deplibs=no
       else
       else
-       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
       fi
       archive_cmds_need_lc='no'
       fi
       archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       inherit_rpath=yes
       link_all_deplibs=yes
       ;;
 
       hardcode_libdir_separator=:
       inherit_rpath=yes
       link_all_deplibs=yes
       ;;
 
+    linux*)
+      case $cc_basename in
+      tcc*)
+       # Fabrice Bellard et al's Tiny C Compiler
+       ld_shlibs=yes
+       archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+       ;;
+      esac
+      ;;
+
     netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
     netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
@@ -10460,7 +11285,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
     newsos6)
       archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       hardcode_direct=yes
     newsos6)
       archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       hardcode_shlibpath_var=no
       ;;
       hardcode_libdir_separator=:
       hardcode_shlibpath_var=no
       ;;
@@ -10468,27 +11293,19 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
     *nto* | *qnx*)
       ;;
 
     *nto* | *qnx*)
       ;;
 
-    openbsd*)
+    openbsd* | bitrig*)
       if test -f /usr/libexec/ld.so; then
        hardcode_direct=yes
        hardcode_shlibpath_var=no
        hardcode_direct_absolute=yes
       if test -f /usr/libexec/ld.so; then
        hardcode_direct=yes
        hardcode_shlibpath_var=no
        hardcode_direct_absolute=yes
-       if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+       if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
          archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
          archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-         archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-         hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-         export_dynamic_flag_spec='${wl}-E'
+         archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+         hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+         export_dynamic_flag_spec='$wl-E'
        else
        else
-         case $host_os in
-          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-            archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-            hardcode_libdir_flag_spec='-R$libdir'
-            ;;
-          *)
-            archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-            ;;
-         esac
+         archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+         hardcode_libdir_flag_spec='$wl-rpath,$libdir'
        fi
       else
        ld_shlibs=no
        fi
       else
        ld_shlibs=no
@@ -10499,33 +11316,53 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       hardcode_libdir_flag_spec='-L$libdir'
       hardcode_minus_L=yes
       allow_undefined_flag=unsupported
       hardcode_libdir_flag_spec='-L$libdir'
       hardcode_minus_L=yes
       allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+       $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+       $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+       $ECHO EXPORTS >> $output_objdir/$libname.def~
+       emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+       $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+       emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+       $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+       $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+       $ECHO EXPORTS >> $output_objdir/$libname.def~
+       prefix_cmds="$SED"~
+       if test EXPORTS = "`$SED 1q $export_symbols`"; then
+         prefix_cmds="$prefix_cmds -e 1d";
+       fi~
+       prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+       cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+       $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+       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
       ;;
 
     osf3*)
       ;;
 
     osf3*)
-      if test "$GCC" = yes; then
-       allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+       allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+       archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
       else
        allow_undefined_flag=' -expect_unresolved \*'
       else
        allow_undefined_flag=' -expect_unresolved \*'
-       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
       fi
       archive_cmds_need_lc='no'
       fi
       archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       ;;
 
     osf4* | osf5*)     # as osf3* with the addition of -msym flag
       hardcode_libdir_separator=:
       ;;
 
     osf4* | osf5*)     # as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-       allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-       archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-       hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      if test yes = "$GCC"; then
+       allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+       archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+       hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       else
        allow_undefined_flag=' -expect_unresolved \*'
       else
        allow_undefined_flag=' -expect_unresolved \*'
-       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
        archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
        archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
 
        # Both c and cxx compiler support -rpath directly
        hardcode_libdir_flag_spec='-rpath $libdir'
 
        # Both c and cxx compiler support -rpath directly
        hardcode_libdir_flag_spec='-rpath $libdir'
@@ -10536,24 +11373,24 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 
     solaris*)
       no_undefined_flag=' -z defs'
 
     solaris*)
       no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-       wlarc='${wl}'
-       archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+       wlarc='$wl'
+       archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
        archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
        archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-         $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
        case `$CC -V 2>&1` in
        *"Compilers 5.0"*)
          wlarc=''
       else
        case `$CC -V 2>&1` in
        *"Compilers 5.0"*)
          wlarc=''
-         archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
          archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
          archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-         $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
          ;;
        *)
          ;;
        *)
-         wlarc='${wl}'
-         archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+         wlarc='$wl'
+         archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
          archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
          archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-         $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
          ;;
        esac
       fi
          ;;
        esac
       fi
@@ -10563,11 +11400,11 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       solaris2.[0-5] | solaris2.[0-5].*) ;;
       *)
        # The compiler driver will combine and reorder linker options,
       solaris2.[0-5] | solaris2.[0-5].*) ;;
       *)
        # The compiler driver will combine and reorder linker options,
-       # but understands `-z linker_flag'.  GCC discards it without `$wl',
+       # but understands '-z linker_flag'.  GCC discards it without '$wl',
        # but is careful enough not to reorder.
        # Supported since Solaris 2.6 (maybe 2.5.1?)
        # but is careful enough not to reorder.
        # Supported since Solaris 2.6 (maybe 2.5.1?)
-       if test "$GCC" = yes; then
-         whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+       if test yes = "$GCC"; then
+         whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
        else
          whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
        fi
        else
          whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
        fi
@@ -10577,10 +11414,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
 
     sunos4*)
       ;;
 
     sunos4*)
-      if test "x$host_vendor" = xsequent; then
+      if test sequent = "$host_vendor"; then
        # Use $CC to link under sequent, because it throws in some extra .o
        # files that make .init and .fini sections work.
        # Use $CC to link under sequent, because it throws in some extra .o
        # files that make .init and .fini sections work.
-       archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
       else
        archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
       else
        archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
@@ -10629,43 +11466,43 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
+      no_undefined_flag='$wl-z,text'
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
       runpath_var='LD_RUN_PATH'
 
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-       archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-       archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+       archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
       else
-       archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-       archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
+      # Note: We CANNOT use -z defs as we might desire, because we do not
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
+      no_undefined_flag='$wl-z,text'
+      allow_undefined_flag='$wl-z,nodefs'
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_flag_spec='$wl-R,$libdir'
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
+      export_dynamic_flag_spec='$wl-Bexport'
       runpath_var='LD_RUN_PATH'
 
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-       archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-       archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+       archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
       else
-       archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-       archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
       fi
       ;;
 
@@ -10680,10 +11517,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
     esac
 
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
+    if test sni = "$host_vendor"; then
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-       export_dynamic_flag_spec='${wl}-Blargedynsym'
+       export_dynamic_flag_spec='$wl-Blargedynsym'
        ;;
       esac
     fi
        ;;
       esac
     fi
@@ -10691,7 +11528,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
 $as_echo "$ld_shlibs" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
 $as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
+test no = "$ld_shlibs" && can_build_shared=no
 
 with_gnu_ld=$with_gnu_ld
 
 
 with_gnu_ld=$with_gnu_ld
 
@@ -10717,7 +11554,7 @@ x|xyes)
   # Assume -lc should be added
   archive_cmds_need_lc=yes
 
   # Assume -lc should be added
   archive_cmds_need_lc=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $archive_cmds in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
     case $archive_cmds in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -10932,14 +11769,14 @@ esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
 $as_echo_n "checking dynamic linker characteristics... " >&6; }
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
 $as_echo_n "checking dynamic linker characteristics... " >&6; }
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $host_os in
   case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
   esac
   case $host_os in
   esac
   case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
@@ -10955,28 +11792,35 @@ if test "$GCC" = yes; then
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
+  # and add multilib dir if necessary...
   lt_tmp_lt_search_path_spec=
   lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
   for lt_sys_path in $lt_search_path_spec; do
   for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
       test -d "$lt_sys_path" && \
        lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
       test -d "$lt_sys_path" && \
        lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
+          lt_foo = "/" $lt_i lt_foo;
         } else {
           lt_count--;
         }
         } else {
           lt_count--;
         }
@@ -10990,7 +11834,7 @@ BEGIN {RS=" "; FS="/|\n";} {
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
@@ -10999,7 +11843,7 @@ fi
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -11016,14 +11860,16 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
 # flags to be left without arguments
 need_version=unknown
 
+
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[4-9]*)
   ;;
 
 aix[4-9]*)
@@ -11031,41 +11877,91 @@ aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
           echo ' yes '
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
           echo ' yes '
-          echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+          echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
        :
       else
        can_build_shared=no
       fi
       ;;
     esac
        :
       else
        can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -11075,18 +11971,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -11094,8 +11990,8 @@ beos*)
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -11107,7 +12003,7 @@ bsdi[45]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
   need_version=no
   need_lib_prefix=no
 
@@ -11116,8 +12012,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -11133,17 +12029,17 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
 
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
 
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -11152,8 +12048,8 @@ cygwin* | mingw* | pw32* | cegcc*)
   *,cl*)
     # Native MSVC
     libname_spec='$name'
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
 
     case $build_os in
     mingw*)
@@ -11180,7 +12076,7 @@ cygwin* | mingw* | pw32* | cegcc*)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -11193,8 +12089,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -11207,7 +12103,7 @@ cygwin* | mingw* | pw32* | cegcc*)
 
   *)
     # Assume MSVC wrapper
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -11220,8 +12116,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -11234,8 +12130,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -11253,12 +12149,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
       need_version=yes
       ;;
   esac
@@ -11288,10 +12185,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -11309,14 +12206,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -11324,8 +12222,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -11334,8 +12232,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -11348,8 +12246,8 @@ interix[3-9]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -11360,7 +12258,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-       if test "$lt_cv_prog_gnu_ld" = yes; then
+       if test yes = "$lt_cv_prog_gnu_ld"; then
                version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
                version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
@@ -11368,8 +12266,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -11388,8 +12286,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
   hardcode_into_libs=yes
   ;;
 
@@ -11398,13 +12296,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   # before this can be enabled.
   hardcode_into_libs=yes
 
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # 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
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # 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="/lib /usr/lib $lt_ld_extra"
   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="/lib /usr/lib $lt_ld_extra"
@@ -11480,12 +12403,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -11495,7 +12418,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -11504,58 +12427,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-       shlibpath_overrides_runpath=no
-       ;;
-      *)
-       shlibpath_overrides_runpath=yes
-       ;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
   ;;
 
 rdos*)
@@ -11566,8 +12499,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -11577,11 +12510,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
     need_lib_prefix=no
   fi
   need_version=yes
@@ -11589,8 +12522,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -11611,24 +12544,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/necthen
     version_type=linux # correct to gnu/linux during the next big refactor
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -11646,7 +12579,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -11654,8 +12587,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -11665,20 +12598,35 @@ uts4*)
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
 
 
 
 
 
 
@@ -11775,15 +12723,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action=
 if test -n "$hardcode_libdir_flag_spec" ||
    test -n "$runpath_var" ||
 hardcode_action=
 if test -n "$hardcode_libdir_flag_spec" ||
    test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
+   test yes = "$hardcode_automatic"; then
 
   # We can hardcode non-existent directories.
 
   # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
+  if test no != "$hardcode_direct" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+     test no != "$hardcode_minus_L"; then
     # Linking always hardcodes the temporary library directory.
     hardcode_action=relink
   else
     # Linking always hardcodes the temporary library directory.
     hardcode_action=relink
   else
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
 $as_echo "$hardcode_action" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
 $as_echo "$hardcode_action" >&6; }
 
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
+if test relink = "$hardcode_action" ||
+   test yes = "$inherit_rpath"; then
   # Fast installation is not supported
   enable_fast_install=no
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -11813,7 +12761,7 @@ fi
 
 
 
 
 
 
-  if test "x$enable_dlopen" != xyes; then
+  if test yes != "$enable_dlopen"; then
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
@@ -11823,23 +12771,23 @@ else
 
   case $host_os in
   beos*)
 
   case $host_os in
   beos*)
-    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen=load_add_on
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen=LoadLibrary
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
-    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen=dlopen
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
-  # if libdl is installed we need to link against it
+    # if libdl is installed we need to link against it
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
 if ${ac_cv_lib_dl_dlopen+:} false; then :
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
 if ${ac_cv_lib_dl_dlopen+:} false; then :
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
 else
 
 else
 
-    lt_cv_dlopen="dyld"
+    lt_cv_dlopen=dyld
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
 
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
 
 
     ;;
 
 
     ;;
 
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
   *)
     ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
 if test "x$ac_cv_func_shl_load" = xyes; then :
   *)
     ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
 if test "x$ac_cv_func_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load"
+  lt_cv_dlopen=shl_load
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
 $as_echo_n "checking for shl_load in -ldld... " >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
 $as_echo_n "checking for shl_load in -ldld... " >&6; }
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
 $as_echo "$ac_cv_lib_dld_shl_load" >&6; }
 if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
 $as_echo "$ac_cv_lib_dld_shl_load" >&6; }
 if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
 else
   ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
 if test "x$ac_cv_func_dlopen" = xyes; then :
 else
   ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
 if test "x$ac_cv_func_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen"
+  lt_cv_dlopen=dlopen
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
@@ -11973,7 +12929,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
 $as_echo_n "checking for dlopen in -lsvld... " >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
 $as_echo_n "checking for dlopen in -lsvld... " >&6; }
@@ -12012,7 +12968,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
 $as_echo "$ac_cv_lib_svld_dlopen" >&6; }
 if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
 $as_echo "$ac_cv_lib_svld_dlopen" >&6; }
 if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
 $as_echo_n "checking for dld_link in -ldld... " >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
 $as_echo_n "checking for dld_link in -ldld... " >&6; }
@@ -12051,7 +13007,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
 $as_echo "$ac_cv_lib_dld_dld_link" >&6; }
 if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
 $as_echo "$ac_cv_lib_dld_dld_link" >&6; }
 if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
 fi
 
 
 fi
 
 
     ;;
   esac
 
     ;;
   esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
+  if test no = "$lt_cv_dlopen"; then
     enable_dlopen=no
     enable_dlopen=no
+  else
+    enable_dlopen=yes
   fi
 
   case $lt_cv_dlopen in
   dlopen)
   fi
 
   case $lt_cv_dlopen in
   dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
 
-    save_LDFLAGS="$LDFLAGS"
+    save_LDFLAGS=$LDFLAGS
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
+    save_LIBS=$LIBS
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
@@ -12094,7 +13050,7 @@ $as_echo_n "checking whether a program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 if ${lt_cv_dlopen_self+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-         if test "$cross_compiling" = yes; then :
+         if test yes = "$cross_compiling"; then :
   lt_cv_dlopen_self=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_cv_dlopen_self=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -12141,9 +13097,9 @@ else
 #  endif
 #endif
 
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -12173,7 +13129,7 @@ _LT_EOF
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
 $as_echo "$lt_cv_dlopen_self" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
 $as_echo "$lt_cv_dlopen_self" >&6; }
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
+    if test yes = "$lt_cv_dlopen_self"; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self_static+:} false; then :
   $as_echo_n "(cached) " >&6
 else
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self_static+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-         if test "$cross_compiling" = yes; then :
+         if test yes = "$cross_compiling"; then :
   lt_cv_dlopen_self_static=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_cv_dlopen_self_static=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -12247,9 +13203,9 @@ else
 #  endif
 #endif
 
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -12279,7 +13235,7 @@ _LT_EOF
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -12300,9 +13256,9 @@ fi
 $as_echo "$lt_cv_dlopen_self_static" >&6; }
     fi
 
 $as_echo "$lt_cv_dlopen_self_static" >&6; }
     fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
     ;;
   esac
 
     ;;
   esac
 
@@ -12346,7 +13302,7 @@ else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
-    if test -n "$STRIP" ; then
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -12374,7 +13330,7 @@ fi
 
 
 
 
 
 
-  # Report which library types will actually be built
+  # Report what library types will actually be built
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
 $as_echo_n "checking if libtool supports shared libraries... " >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
 $as_echo_n "checking if libtool supports shared libraries... " >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
@@ -12382,13 +13338,13 @@ $as_echo "$can_build_shared" >&6; }
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
 $as_echo_n "checking whether to build shared libraries... " >&6; }
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
 $as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
+  test no = "$can_build_shared" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
-    test "$enable_shared" = yes && enable_static=no
+    test yes = "$enable_shared" && enable_static=no
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
@@ -12396,8 +13352,12 @@ $as_echo_n "checking whether to build shared libraries... " >&6; }
     ;;
 
   aix[4-9]*)
     ;;
 
   aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;                  # shared object as lib.so file only
+      yes,svr4,*) ;;                   # shared object as lib.so archive member only
+      yes,*) enable_static=no ;;       # shared object in lib.a archive as well
+      esac
     fi
     ;;
   esac
     fi
     ;;
   esac
@@ -12407,7 +13367,7 @@ $as_echo "$enable_shared" >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
 $as_echo_n "checking whether to build static libraries... " >&6; }
   # Make sure either enable_shared or enable_static is yes.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
 $as_echo_n "checking whether to build static libraries... " >&6; }
   # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
+  test yes = "$enable_shared" || enable_static=yes
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
 $as_echo "$enable_static" >&6; }
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
 $as_echo "$enable_static" >&6; }
 
@@ -12421,7 +13381,7 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-CC="$lt_save_CC"
+CC=$lt_save_CC
 
 
 
 
 
 
@@ -13234,6 +14194,183 @@ else
 fi
 
 
 fi
 
 
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if ${ac_cv_prog_cc_c99+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+  your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str;
+  int number;
+  float fnumber;
+
+  while (*format)
+    {
+      switch (*format++)
+       {
+       case 's': // string
+         str = va_arg (args_copy, const char *);
+         break;
+       case 'd': // int
+         number = va_arg (args_copy, int);
+         break;
+       case 'f': // float
+         fnumber = va_arg (args_copy, double);
+         break;
+       default:
+         break;
+       }
+    }
+  va_end (args_copy);
+  va_end (args);
+}
+
+int
+main ()
+{
+
+  // Check bool.
+  _Bool success = false;
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  test_varargs ("s, d' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+         || dynamic_array[ni.number - 1] != 543);
+
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c99"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then :
+
+fi
+
+
 
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 
 func_stripname_cnf ()
 {
 
 func_stripname_cnf ()
 {
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  case $2 in
+  .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
   esac
 } # func_stripname_cnf
 
   esac
 } # func_stripname_cnf
 
-      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
+      if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
   ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
   ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -13811,7 +14948,7 @@ objext_CXX=$objext
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
+if test yes != "$_lt_caught_CXX_error"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
@@ -13872,46 +15009,39 @@ $RM -r conftest*
   CFLAGS=$CXXFLAGS
   compiler=$CC
   compiler_CXX=$CC
   CFLAGS=$CXXFLAGS
   compiler=$CC
   compiler_CXX=$CC
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+  func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
 
 
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
 
 
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
     else
       lt_prog_compiler_no_builtin_flag_CXX=
     fi
 
       lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
     else
       lt_prog_compiler_no_builtin_flag_CXX=
     fi
 
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       # Set up default GNU C++ configuration
 
 
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
       # Set up default GNU C++ configuration
 
 
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -13925,7 +15055,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
        ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
        ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -13936,7 +15066,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
     with_gnu_ld=unknown
     ;;
   esac
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
@@ -13947,32 +15077,32 @@ if ${lt_cv_path_LD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-       test "$with_gnu_ld" != no && break
+       test no != "$with_gnu_ld" && break
        ;;
       *)
        ;;
       *)
-       test "$with_gnu_ld" != yes && break
+       test yes != "$with_gnu_ld" && break
        ;;
       esac
     fi
   done
        ;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi
 fi
 
 fi
 fi
 
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
@@ -14008,22 +15138,22 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      if test yes = "$with_gnu_ld"; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 
 
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+        export_dynamic_flag_spec_CXX='$wl--export-dynamic'
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
+        wlarc='$wl'
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
          $GREP 'no-whole-archive' > /dev/null; then
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
          $GREP 'no-whole-archive' > /dev/null; then
-          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+          whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
         else
           whole_archive_flag_spec_CXX=
         fi
         else
           whole_archive_flag_spec_CXX=
         fi
@@ -14060,18 +15190,30 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
         ld_shlibs_CXX=no
         ;;
       aix[4-9]*)
         ld_shlibs_CXX=no
         ;;
       aix[4-9]*)
-        if test "$host_cpu" = ia64; then
+        if test ia64 = "$host_cpu"; then
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
-          no_entry_flag=""
+          no_entry_flag=
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
           case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
            for ld_flag in $LDFLAGS; do
              case $ld_flag in
           case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
            for ld_flag in $LDFLAGS; do
              case $ld_flag in
@@ -14081,6 +15223,13 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
                ;;
              esac
            done
                ;;
              esac
            done
+           if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+             # With aix-soname=svr4, we create the lib.so.V shared archives only,
+             # so we don't have lib.a shared libs to link our executables.
+             # We have to force runtime linking in this case.
+             aix_use_runtimelinking=yes
+             LDFLAGS="$LDFLAGS -Wl,-brtl"
+           fi
            ;;
           esac
 
            ;;
           esac
 
@@ -14099,13 +15248,21 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
         hardcode_direct_absolute_CXX=yes
         hardcode_libdir_separator_CXX=':'
         link_all_deplibs_CXX=yes
         hardcode_direct_absolute_CXX=yes
         hardcode_libdir_separator_CXX=':'
         link_all_deplibs_CXX=yes
-        file_list_spec_CXX='${wl}-f,'
+        file_list_spec_CXX='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;      # no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          hardcode_direct_CXX=no
+          hardcode_direct_absolute_CXX=no
+          ;;
+        esac
 
 
-        if test "$GXX" = yes; then
+        if test yes = "$GXX"; then
           case $host_os in aix4.[012]|aix4.[012].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
           case $host_os in aix4.[012]|aix4.[012].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
-         collect2name=`${CC} -print-prog-name=collect2`
+         collect2name=`$CC -print-prog-name=collect2`
          if test -f "$collect2name" &&
             strings "$collect2name" | $GREP resolve_lib_name >/dev/null
          then
          if test -f "$collect2name" &&
             strings "$collect2name" | $GREP resolve_lib_name >/dev/null
          then
@@ -14123,36 +15280,44 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
          fi
           esac
           shared_flag='-shared'
          fi
           esac
           shared_flag='-shared'
-         if test "$aix_use_runtimelinking" = yes; then
-           shared_flag="$shared_flag "'${wl}-G'
+         if test yes = "$aix_use_runtimelinking"; then
+           shared_flag=$shared_flag' $wl-G'
          fi
          fi
+         # Need to ensure runtime linking is disabled for the traditional
+         # shared library, or the linker may eventually find shared libraries
+         # /with/ Import File - we do not want to mix them.
+         shared_flag_aix='-shared'
+         shared_flag_svr4='-shared $wl-G'
         else
           # not using gcc
         else
           # not using gcc
-          if test "$host_cpu" = ia64; then
+          if test ia64 = "$host_cpu"; then
          # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
          # chokes on -Wl,-G. The following line is correct:
          shared_flag='-G'
           else
          # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
          # chokes on -Wl,-G. The following line is correct:
          shared_flag='-G'
           else
-           if test "$aix_use_runtimelinking" = yes; then
-             shared_flag='${wl}-G'
+           if test yes = "$aix_use_runtimelinking"; then
+             shared_flag='$wl-G'
            else
            else
-             shared_flag='${wl}-bM:SRE'
+             shared_flag='$wl-bM:SRE'
            fi
            fi
+           shared_flag_aix='$wl-bM:SRE'
+           shared_flag_svr4='$wl-G'
           fi
         fi
 
           fi
         fi
 
-        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        export_dynamic_flag_spec_CXX='$wl-bexpall'
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
        # export.
         always_export_symbols_CXX=yes
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
        # export.
         always_export_symbols_CXX=yes
-        if test "$aix_use_runtimelinking" = yes; then
+       if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
-          allow_undefined_flag_CXX='-berok'
+          # The "-G" linker flag allows undefined symbols.
+          no_undefined_flag_CXX='-bernotok'
           # Determine the default libpath from the value encoded in an empty
           # executable.
           # Determine the default libpath from the value encoded in an empty
           # executable.
-          if test "${lt_cv_aix_libpath+set}" = set; then
+          if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath__CXX+:} false; then :
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath__CXX+:} false; then :
@@ -14187,7 +15352,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath__CXX"; then
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
   fi
 
 fi
   fi
 
 fi
   aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
   aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
-          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+          hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
 
 
-          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
         else
         else
-          if test "$host_cpu" = ia64; then
-           hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+          if test ia64 = "$host_cpu"; then
+           hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
            allow_undefined_flag_CXX="-z nodefs"
            allow_undefined_flag_CXX="-z nodefs"
-           archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+           archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
           else
            # Determine the default libpath from the value encoded in an
            # empty executable.
           else
            # Determine the default libpath from the value encoded in an
            # empty executable.
-           if test "${lt_cv_aix_libpath+set}" = set; then
+           if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath__CXX+:} false; then :
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath__CXX+:} false; then :
@@ -14241,7 +15406,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath__CXX"; then
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
   fi
 
 fi
   fi
 
 fi
   aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
   aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
-           hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+           hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
            # Warning - without using the other run time loading flags,
            # -berok will link without error, but may produce a broken library.
            # Warning - without using the other run time loading flags,
            # -berok will link without error, but may produce a broken library.
-           no_undefined_flag_CXX=' ${wl}-bernotok'
-           allow_undefined_flag_CXX=' ${wl}-berok'
-           if test "$with_gnu_ld" = yes; then
+           no_undefined_flag_CXX=' $wl-bernotok'
+           allow_undefined_flag_CXX=' $wl-berok'
+           if test yes = "$with_gnu_ld"; then
              # We only use this code for GNU lds that support --whole-archive.
              # We only use this code for GNU lds that support --whole-archive.
-             whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+             whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
            else
              # Exported symbols can be pulled into shared objects from archives
              whole_archive_flag_spec_CXX='$convenience'
            fi
            archive_cmds_need_lc_CXX=yes
            else
              # Exported symbols can be pulled into shared objects from archives
              whole_archive_flag_spec_CXX='$convenience'
            fi
            archive_cmds_need_lc_CXX=yes
-           # This is similar to how AIX traditionally builds its shared
-           # libraries.
-           archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+           archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+           # -brtl affects multiple linker settings, -berok does not and is overridden later
+           compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+           if test svr4 != "$with_aix_soname"; then
+             # This is similar to how AIX traditionally builds its shared
+             # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+             archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+           fi
+           if test aix != "$with_aix_soname"; then
+             archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+           else
+             # used by -dlpreopen to get the symbols
+             archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+           fi
+           archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
           fi
         fi
         ;;
           fi
         fi
         ;;
@@ -14274,7 +15451,7 @@ fi
          allow_undefined_flag_CXX=unsupported
          # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
          # support --undefined.  This deserves some investigation.  FIXME
          allow_undefined_flag_CXX=unsupported
          # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
          # support --undefined.  This deserves some investigation.  FIXME
-         archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+         archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
        else
          ld_shlibs_CXX=no
        fi
        else
          ld_shlibs_CXX=no
        fi
          # Tell ltmain to make .lib files, not .a files.
          libext=lib
          # Tell ltmain to make .dll files, not .so files.
          # Tell ltmain to make .lib files, not .a files.
          libext=lib
          # Tell ltmain to make .dll files, not .so files.
-         shrext_cmds=".dll"
+         shrext_cmds=.dll
          # FIXME: Setting linknames here is a bad hack.
          # FIXME: Setting linknames here is a bad hack.
-         archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-         archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-             $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-           else
-             $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-           fi~
-           $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-           linknames='
+         archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+         archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[     ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([     ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
          # The linker will not automatically build a static lib if we build a DLL.
          # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
          enable_shared_with_static_runtimes_CXX=yes
          # Don't use ranlib
          old_postinstall_cmds_CXX='chmod 644 $oldlib'
          postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
          # The linker will not automatically build a static lib if we build a DLL.
          # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
          enable_shared_with_static_runtimes_CXX=yes
          # Don't use ranlib
          old_postinstall_cmds_CXX='chmod 644 $oldlib'
          postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
-           lt_tool_outputfile="@TOOL_OUTPUT@"~
-           case $lt_outputfile in
-             *.exe|*.EXE) ;;
-             *)
-               lt_outputfile="$lt_outputfile.exe"
-               lt_tool_outputfile="$lt_tool_outputfile.exe"
-               ;;
-           esac~
-           func_to_tool_file "$lt_outputfile"~
-           if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-             $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-             $RM "$lt_outputfile.manifest";
-           fi'
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
          ;;
        *)
          # g++
          # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
          # as there is no search path for DLLs.
          hardcode_libdir_flag_spec_CXX='-L$libdir'
          ;;
        *)
          # g++
          # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
          # as there is no search path for DLLs.
          hardcode_libdir_flag_spec_CXX='-L$libdir'
-         export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+         export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
          allow_undefined_flag_CXX=unsupported
          always_export_symbols_CXX=no
          enable_shared_with_static_runtimes_CXX=yes
 
          if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
          allow_undefined_flag_CXX=unsupported
          always_export_symbols_CXX=no
          enable_shared_with_static_runtimes_CXX=yes
 
          if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-           archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-           # If the export-symbols file already is a .def file (1st line
-           # is EXPORTS), use it as is; otherwise, prepend...
-           archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-             cp $export_symbols $output_objdir/$soname.def;
-           else
-             echo EXPORTS > $output_objdir/$soname.def;
-             cat $export_symbols >> $output_objdir/$soname.def;
-           fi~
-           $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+           archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+           # If the export-symbols file already is a .def file, use it as
+           # is; otherwise, prepend EXPORTS...
+           archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[   ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([     ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
          else
            ld_shlibs_CXX=no
          fi
          else
            ld_shlibs_CXX=no
          fi
   hardcode_direct_CXX=no
   hardcode_automatic_CXX=yes
   hardcode_shlibpath_var_CXX=unsupported
   hardcode_direct_CXX=no
   hardcode_automatic_CXX=yes
   hardcode_shlibpath_var_CXX=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
   else
     whole_archive_flag_spec_CXX=''
   fi
   link_all_deplibs_CXX=yes
 
   else
     whole_archive_flag_spec_CXX=''
   fi
   link_all_deplibs_CXX=yes
-  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  allow_undefined_flag_CXX=$_lt_dar_allow_undefined
   case $cc_basename in
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
     output_verbose_link_cmd=func_echo_all
-    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+       if test yes != "$lt_cv_apple_cc_single_mod"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
     fi
 
   else
     fi
 
   else
 
        ;;
 
 
        ;;
 
+      os2*)
+       hardcode_libdir_flag_spec_CXX='-L$libdir'
+       hardcode_minus_L_CXX=yes
+       allow_undefined_flag_CXX=unsupported
+       shrext_cmds=.dll
+       archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+         $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+         $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+         $ECHO EXPORTS >> $output_objdir/$libname.def~
+         emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+         $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+         emximp -o $lib $output_objdir/$libname.def'
+       archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+         $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+         $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+         $ECHO EXPORTS >> $output_objdir/$libname.def~
+         prefix_cmds="$SED"~
+         if test EXPORTS = "`$SED 1q $export_symbols`"; then
+           prefix_cmds="$prefix_cmds -e 1d";
+         fi~
+         prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+         cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+         $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+         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
+       ;;
+
       dgux*)
         case $cc_basename in
           ec++*)
       dgux*)
         case $cc_basename in
           ec++*)
         ;;
 
       haiku*)
         ;;
 
       haiku*)
-        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
         link_all_deplibs_CXX=yes
         ;;
 
       hpux9*)
         link_all_deplibs_CXX=yes
         ;;
 
       hpux9*)
-        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
         hardcode_libdir_separator_CXX=:
         hardcode_libdir_separator_CXX=:
-        export_dynamic_flag_spec_CXX='${wl}-E'
+        export_dynamic_flag_spec_CXX='$wl-E'
         hardcode_direct_CXX=yes
         hardcode_minus_L_CXX=yes # Not in the search PATH,
                                             # but as the default
         hardcode_direct_CXX=yes
         hardcode_minus_L_CXX=yes # Not in the search PATH,
                                             # but as the default
@@ -14449,7 +15655,7 @@ fi
             ld_shlibs_CXX=no
             ;;
           aCC*)
             ld_shlibs_CXX=no
             ;;
           aCC*)
-            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
             ;;
           *)
-            if test "$GXX" = yes; then
-              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            if test yes = "$GXX"; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             else
               # FIXME: insert proper C++ library support
               ld_shlibs_CXX=no
             else
               # FIXME: insert proper C++ library support
               ld_shlibs_CXX=no
         ;;
 
       hpux10*|hpux11*)
         ;;
 
       hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-         hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        if test no = "$with_gnu_ld"; then
+         hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
          hardcode_libdir_separator_CXX=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
          hardcode_libdir_separator_CXX=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
-             export_dynamic_flag_spec_CXX='${wl}-E'
+             export_dynamic_flag_spec_CXX='$wl-E'
               ;;
           esac
         fi
               ;;
           esac
         fi
           aCC*)
            case $host_cpu in
              hppa*64*)
           aCC*)
            case $host_cpu in
              hppa*64*)
-               archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                ;;
              ia64*)
                ;;
              ia64*)
-               archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                ;;
              *)
                ;;
              *)
-               archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                ;;
            esac
            # Commands to make compiler produce verbose output that lists
                ;;
            esac
            # Commands to make compiler produce verbose output that lists
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
            ;;
           *)
            ;;
           *)
-           if test "$GXX" = yes; then
-             if test $with_gnu_ld = no; then
+           if test yes = "$GXX"; then
+             if test no = "$with_gnu_ld"; then
                case $host_cpu in
                  hppa*64*)
                case $host_cpu in
                  hppa*64*)
-                   archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                    ;;
                  ia64*)
                    ;;
                  ia64*)
-                   archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                    ;;
                  *)
                    ;;
                  *)
-                   archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                    ;;
                esac
              fi
                    ;;
                esac
              fi
       interix[3-9]*)
        hardcode_direct_CXX=no
        hardcode_shlibpath_var_CXX=no
       interix[3-9]*)
        hardcode_direct_CXX=no
        hardcode_shlibpath_var_CXX=no
-       hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-       export_dynamic_flag_spec_CXX='${wl}-E'
+       hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+       export_dynamic_flag_spec_CXX='$wl-E'
        # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
        # Instead, shared libraries are loaded at an image base (0x10000000 by
        # default) and relocated if they conflict, which is a slow very memory
        # consuming and fragmenting process.  To avoid this, we pick a random,
        # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
        # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
        # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
        # Instead, shared libraries are loaded at an image base (0x10000000 by
        # default) and relocated if they conflict, which is a slow very memory
        # consuming and fragmenting process.  To avoid this, we pick a random,
        # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
        # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-       archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-       archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
        ;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
            # SGI C++
        ;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
            # SGI C++
-           archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+           archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 
            # Archives containing C++ object files must be created using
            # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
 
            # Archives containing C++ object files must be created using
            # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
            old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
            ;;
           *)
            old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
            ;;
           *)
-           if test "$GXX" = yes; then
-             if test "$with_gnu_ld" = no; then
-               archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+           if test yes = "$GXX"; then
+             if test no = "$with_gnu_ld"; then
+               archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
              else
              else
-               archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+               archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
              fi
            fi
            link_all_deplibs_CXX=yes
            ;;
         esac
              fi
            fi
            link_all_deplibs_CXX=yes
            ;;
         esac
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
         hardcode_libdir_separator_CXX=:
         inherit_rpath_CXX=yes
         ;;
         hardcode_libdir_separator_CXX=:
         inherit_rpath_CXX=yes
         ;;
@@ -14598,8 +15804,8 @@ fi
            # KCC will only create a shared library if the output file
            # ends with ".so" (or ".sl" for HP-UX), so rename the library
            # to its proper name (with version) after linking.
            # KCC will only create a shared library if the output file
            # ends with ".so" (or ".sl" for HP-UX), so rename the library
            # to its proper name (with version) after linking.
-           archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-           archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+           archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+           archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
            # Commands to make compiler produce verbose output that lists
            # what "hidden" libraries, object files and flags are used when
            # linking a shared library.
            # Commands to make compiler produce verbose output that lists
            # what "hidden" libraries, object files and flags are used when
            # linking a shared library.
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 
 
-           hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+           hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+           export_dynamic_flag_spec_CXX='$wl--export-dynamic'
 
            # Archives containing C++ object files must be created using
            # "CC -Bstatic", where "CC" is the KAI C++ compiler.
 
            # Archives containing C++ object files must be created using
            # "CC -Bstatic", where "CC" is the KAI C++ compiler.
            # earlier do not add the objects themselves.
            case `$CC -V 2>&1` in
              *"Version 7."*)
            # earlier do not add the objects themselves.
            case `$CC -V 2>&1` in
              *"Version 7."*)
-               archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-               archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+               archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
                ;;
              *)  # Version 8.0 or newer
                tmp_idyn=
                case $host_cpu in
                  ia64*) tmp_idyn=' -i_dynamic';;
                esac
                ;;
              *)  # Version 8.0 or newer
                tmp_idyn=
                case $host_cpu in
                  ia64*) tmp_idyn=' -i_dynamic';;
                esac
-               archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-               archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+               archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
                ;;
            esac
            archive_cmds_need_lc_CXX=no
                ;;
            esac
            archive_cmds_need_lc_CXX=no
-           hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-           whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+           export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+           whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
            ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
            case `$CC -V` in
            *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
              prelink_cmds_CXX='tpldir=Template.dir~
            ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
            case `$CC -V` in
            *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
              prelink_cmds_CXX='tpldir=Template.dir~
-               rm -rf $tpldir~
-               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
              old_archive_cmds_CXX='tpldir=Template.dir~
              old_archive_cmds_CXX='tpldir=Template.dir~
-               rm -rf $tpldir~
-               $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-               $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-               $RANLIB $oldlib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
              archive_cmds_CXX='tpldir=Template.dir~
              archive_cmds_CXX='tpldir=Template.dir~
-               rm -rf $tpldir~
-               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
              archive_expsym_cmds_CXX='tpldir=Template.dir~
              archive_expsym_cmds_CXX='tpldir=Template.dir~
-               rm -rf $tpldir~
-               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
              ;;
            *) # Version 6 and above use weak symbols
              ;;
            *) # Version 6 and above use weak symbols
-             archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-             archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+             archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+             archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
              ;;
            esac
 
              ;;
            esac
 
-           hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-           whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+           hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+           export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+           whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
             ;;
          cxx*)
            # Compaq C++
             ;;
          cxx*)
            # Compaq C++
-           archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-           archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+           archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+           archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
 
            runpath_var=LD_RUN_PATH
            hardcode_libdir_flag_spec_CXX='-rpath $libdir'
 
            runpath_var=LD_RUN_PATH
            hardcode_libdir_flag_spec_CXX='-rpath $libdir'
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
            ;;
          xl* | mpixl* | bgxl*)
            # IBM XL 8.0 on PPC, with GNU ld
            ;;
          xl* | mpixl* | bgxl*)
            # IBM XL 8.0 on PPC, with GNU ld
-           hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-           archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-           if test "x$supports_anon_versioning" = xyes; then
+           hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+           export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+           archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+           if test yes = "$supports_anon_versioning"; then
              archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
              archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
-               cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-               echo "local: *; };" >> $output_objdir/$libname.ver~
-               $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
            fi
            ;;
          *)
            fi
            ;;
          *)
            *Sun\ C*)
              # Sun C++ 5.9
              no_undefined_flag_CXX=' -zdefs'
            *Sun\ C*)
              # Sun C++ 5.9
              no_undefined_flag_CXX=' -zdefs'
-             archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-             archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+             archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+             archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
              hardcode_libdir_flag_spec_CXX='-R$libdir'
              hardcode_libdir_flag_spec_CXX='-R$libdir'
-             whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+             whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
              compiler_needs_object_CXX=yes
 
              # Not sure whether something based on
              compiler_needs_object_CXX=yes
 
              # Not sure whether something based on
         ld_shlibs_CXX=yes
        ;;
 
         ld_shlibs_CXX=yes
        ;;
 
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-       ld_shlibs_CXX=no
-       ;;
-
-      openbsd*)
+      openbsd* | bitrig*)
        if test -f /usr/libexec/ld.so; then
          hardcode_direct_CXX=yes
          hardcode_shlibpath_var_CXX=no
          hardcode_direct_absolute_CXX=yes
          archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
        if test -f /usr/libexec/ld.so; then
          hardcode_direct_CXX=yes
          hardcode_shlibpath_var_CXX=no
          hardcode_direct_absolute_CXX=yes
          archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-         hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-         if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-           archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-           export_dynamic_flag_spec_CXX='${wl}-E'
-           whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+         hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+         if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+           archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+           export_dynamic_flag_spec_CXX='$wl-E'
+           whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
          fi
          output_verbose_link_cmd=func_echo_all
        else
          fi
          output_verbose_link_cmd=func_echo_all
        else
@@ -14802,9 +16003,9 @@ fi
            # KCC will only create a shared library if the output file
            # ends with ".so" (or ".sl" for HP-UX), so rename the library
            # to its proper name (with version) after linking.
            # KCC will only create a shared library if the output file
            # ends with ".so" (or ".sl" for HP-UX), so rename the library
            # to its proper name (with version) after linking.
-           archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+           archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
 
 
-           hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+           hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
            hardcode_libdir_separator_CXX=:
 
            # Archives containing C++ object files must be created using
            hardcode_libdir_separator_CXX=:
 
            # Archives containing C++ object files must be created using
           cxx*)
            case $host in
              osf3*)
           cxx*)
            case $host in
              osf3*)
-               allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-               archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-               hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+               allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+               archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+               hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
                ;;
              *)
                allow_undefined_flag_CXX=' -expect_unresolved \*'
                ;;
              *)
                allow_undefined_flag_CXX=' -expect_unresolved \*'
-               archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+               archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
                archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
                archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-                 echo "-hidden">> $lib.exp~
-                 $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-                 $RM $lib.exp'
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
                hardcode_libdir_flag_spec_CXX='-rpath $libdir'
                ;;
            esac
                hardcode_libdir_flag_spec_CXX='-rpath $libdir'
                ;;
            esac
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
            ;;
          *)
            ;;
          *)
-           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-             allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+           if test yes,no = "$GXX,$with_gnu_ld"; then
+             allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
              case $host in
                osf3*)
              case $host in
                osf3*)
-                 archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
                  ;;
                *)
                  ;;
                *)
-                 archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
                  ;;
              esac
 
                  ;;
              esac
 
-             hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+             hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
              hardcode_libdir_separator_CXX=:
 
              # Commands to make compiler produce verbose output that lists
              hardcode_libdir_separator_CXX=:
 
              # Commands to make compiler produce verbose output that lists
@@ -14907,9 +16108,9 @@ fi
            # Sun C++ 4.2, 5.x and Centerline C++
             archive_cmds_need_lc_CXX=yes
            no_undefined_flag_CXX=' -zdefs'
            # Sun C++ 4.2, 5.x and Centerline C++
             archive_cmds_need_lc_CXX=yes
            no_undefined_flag_CXX=' -zdefs'
-           archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+           archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
            archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
            archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-             $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
            hardcode_libdir_flag_spec_CXX='-R$libdir'
            hardcode_shlibpath_var_CXX=no
 
            hardcode_libdir_flag_spec_CXX='-R$libdir'
            hardcode_shlibpath_var_CXX=no
@@ -14917,7 +16118,7 @@ fi
              solaris2.[0-5] | solaris2.[0-5].*) ;;
              *)
                # The compiler driver will combine and reorder linker options,
              solaris2.[0-5] | solaris2.[0-5].*) ;;
              *)
                # The compiler driver will combine and reorder linker options,
-               # but understands `-z linker_flag'.
+               # but understands '-z linker_flag'.
                # Supported since Solaris 2.6 (maybe 2.5.1?)
                whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
                ;;
                # Supported since Solaris 2.6 (maybe 2.5.1?)
                whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
                ;;
            ;;
           gcx*)
            # Green Hills C++ Compiler
            ;;
           gcx*)
            # Green Hills C++ Compiler
-           archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+           archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 
            # The C++ compiler must be used to create the archive.
            old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
            ;;
           *)
            # GNU C++ compiler with Solaris linker
 
            # The C++ compiler must be used to create the archive.
            old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
            ;;
           *)
            # GNU C++ compiler with Solaris linker
-           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-             no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+           if test yes,no = "$GXX,$with_gnu_ld"; then
+             no_undefined_flag_CXX=' $wl-z ${wl}defs'
              if $CC --version | $GREP -v '^2\.7' > /dev/null; then
              if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-               archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
                archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
                archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-                 $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                # linking a shared library.
                output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
              else
 
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                # linking a shared library.
                output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
              else
-               # g++ 2.7 appears to require `-G' NOT `-shared' on this
+               # g++ 2.7 appears to require '-G' NOT '-shared' on this
                # platform.
                # platform.
-               archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
                archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
                archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-                 $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
 
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
              fi
 
                output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
              fi
 
-             hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+             hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
              case $host_os in
                solaris2.[0-5] | solaris2.[0-5].*) ;;
                *)
              case $host_os in
                solaris2.[0-5] | solaris2.[0-5].*) ;;
                *)
-                 whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+                 whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
                  ;;
              esac
            fi
                  ;;
              esac
            fi
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_CXX='${wl}-z,text'
+      no_undefined_flag_CXX='$wl-z,text'
       archive_cmds_need_lc_CXX=no
       hardcode_shlibpath_var_CXX=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
       archive_cmds_need_lc_CXX=no
       hardcode_shlibpath_var_CXX=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
-         archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-         archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        *)
          ;;
        *)
-         archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-         archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
          ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
          ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
-       # Note: We can NOT use -z defs as we might desire, because we do not
+       # Note: We CANNOT use -z defs as we might desire, because we do not
        # link with -lc, and that would cause any symbols used from libc to
        # always be unresolved, which means just about no library would
        # ever link correctly.  If we're not using GNU ld we use -z text
        # though, which does catch some bad symbols but isn't as heavy-handed
        # as -z defs.
        # link with -lc, and that would cause any symbols used from libc to
        # always be unresolved, which means just about no library would
        # ever link correctly.  If we're not using GNU ld we use -z text
        # though, which does catch some bad symbols but isn't as heavy-handed
        # as -z defs.
-       no_undefined_flag_CXX='${wl}-z,text'
-       allow_undefined_flag_CXX='${wl}-z,nodefs'
+       no_undefined_flag_CXX='$wl-z,text'
+       allow_undefined_flag_CXX='$wl-z,nodefs'
        archive_cmds_need_lc_CXX=no
        hardcode_shlibpath_var_CXX=no
        archive_cmds_need_lc_CXX=no
        hardcode_shlibpath_var_CXX=no
-       hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+       hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
        hardcode_libdir_separator_CXX=':'
        link_all_deplibs_CXX=yes
        hardcode_libdir_separator_CXX=':'
        link_all_deplibs_CXX=yes
-       export_dynamic_flag_spec_CXX='${wl}-Bexport'
+       export_dynamic_flag_spec_CXX='$wl-Bexport'
        runpath_var='LD_RUN_PATH'
 
        case $cc_basename in
           CC*)
        runpath_var='LD_RUN_PATH'
 
        case $cc_basename in
           CC*)
-           archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-           archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
            old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
            old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
-             '"$old_archive_cmds_CXX"
+              '"$old_archive_cmds_CXX"
            reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
            reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
-             '"$reload_cmds_CXX"
+              '"$reload_cmds_CXX"
            ;;
          *)
            ;;
          *)
-           archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-           archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
            ;;
        esac
       ;;
            ;;
        esac
       ;;
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
 $as_echo "$ld_shlibs_CXX" >&6; }
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
 $as_echo "$ld_shlibs_CXX" >&6; }
-    test "$ld_shlibs_CXX" = no && can_build_shared=no
+    test no = "$ld_shlibs_CXX" && can_build_shared=no
 
 
-    GCC_CXX="$GXX"
-    LD_CXX="$LD"
+    GCC_CXX=$GXX
+    LD_CXX=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -15102,13 +16303,13 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
+    case $prev$p in
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
         prev=$p
         continue
        fi
         prev=$p
         continue
        fi
@@ -15124,16 +16325,16 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
-       if test "$pre_test_object_deps_done" = no; then
-        case ${prev} in
+       if test no = "$pre_test_object_deps_done"; then
+        case $prev in
         -L | -R)
           # Internal compiler library paths should come after those
           # provided the user.  The postdeps already come after the
           # user supplied libs so there is no need to process them.
           if test -z "$compiler_lib_search_path_CXX"; then
         -L | -R)
           # Internal compiler library paths should come after those
           # provided the user.  The postdeps already come after the
           # user supplied libs so there is no need to process them.
           if test -z "$compiler_lib_search_path_CXX"; then
-            compiler_lib_search_path_CXX="${prev}${p}"
+            compiler_lib_search_path_CXX=$prev$p
           else
           else
-            compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+            compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
           fi
           ;;
         # The "-l" case would never come before the object being
           fi
           ;;
         # The "-l" case would never come before the object being
@@ -15141,9 +16342,9 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
         esac
        else
         if test -z "$postdeps_CXX"; then
         esac
        else
         if test -z "$postdeps_CXX"; then
-          postdeps_CXX="${prev}${p}"
+          postdeps_CXX=$prev$p
         else
         else
-          postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+          postdeps_CXX="${postdeps_CXX} $prev$p"
         fi
        fi
        prev=
         fi
        fi
        prev=
@@ -15158,15 +16359,15 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
         continue
        fi
 
         continue
        fi
 
-       if test "$pre_test_object_deps_done" = no; then
+       if test no = "$pre_test_object_deps_done"; then
         if test -z "$predep_objects_CXX"; then
         if test -z "$predep_objects_CXX"; then
-          predep_objects_CXX="$p"
+          predep_objects_CXX=$p
         else
           predep_objects_CXX="$predep_objects_CXX $p"
         fi
        else
         if test -z "$postdep_objects_CXX"; then
         else
           predep_objects_CXX="$predep_objects_CXX $p"
         fi
        else
         if test -z "$postdep_objects_CXX"; then
-          postdep_objects_CXX="$p"
+          postdep_objects_CXX=$p
         else
           postdep_objects_CXX="$postdep_objects_CXX $p"
         fi
         else
           postdep_objects_CXX="$postdep_objects_CXX $p"
         fi
@@ -15196,51 +16397,6 @@ interix[3-9]*)
   postdep_objects_CXX=
   postdeps_CXX=
   ;;
   postdep_objects_CXX=
   postdeps_CXX=
   ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
 esac
 
 
 esac
 
 
@@ -15249,7 +16405,7 @@ case " $postdeps_CXX " in
 esac
  compiler_lib_search_dirs_CXX=
 if test -n "${compiler_lib_search_path_CXX}"; then
 esac
  compiler_lib_search_dirs_CXX=
 if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
 fi
 
 
 fi
 
 
@@ -15288,17 +16444,18 @@ lt_prog_compiler_static_CXX=
 
 
   # C++ specific cases for pic, static, wl, etc.
 
 
   # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
+  if test yes = "$GXX"; then
     lt_prog_compiler_wl_CXX='-Wl,'
     lt_prog_compiler_static_CXX='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
     lt_prog_compiler_wl_CXX='-Wl,'
     lt_prog_compiler_static_CXX='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
        # AIX 5 now supports IA64 processor
        lt_prog_compiler_static_CXX='-Bstatic'
       fi
        # AIX 5 now supports IA64 processor
        lt_prog_compiler_static_CXX='-Bstatic'
       fi
+      lt_prog_compiler_pic_CXX='-fPIC'
       ;;
 
     amigaos*)
       ;;
 
     amigaos*)
@@ -15309,8 +16466,8 @@ lt_prog_compiler_static_CXX=
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
             lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -15325,6 +16482,11 @@ lt_prog_compiler_static_CXX=
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+       lt_prog_compiler_static_CXX='$wl-static'
+       ;;
+      esac
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
@@ -15374,7 +16536,7 @@ lt_prog_compiler_static_CXX=
     case $host_os in
       aix[4-9]*)
        # All AIX code is PIC.
     case $host_os in
       aix[4-9]*)
        # All AIX code is PIC.
-       if test "$host_cpu" = ia64; then
+       if test ia64 = "$host_cpu"; then
          # AIX 5 now supports IA64 processor
          lt_prog_compiler_static_CXX='-Bstatic'
        else
          # AIX 5 now supports IA64 processor
          lt_prog_compiler_static_CXX='-Bstatic'
        else
@@ -15414,14 +16576,14 @@ lt_prog_compiler_static_CXX=
        case $cc_basename in
          CC*)
            lt_prog_compiler_wl_CXX='-Wl,'
        case $cc_basename in
          CC*)
            lt_prog_compiler_wl_CXX='-Wl,'
-           lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-           if test "$host_cpu" != ia64; then
+           lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+           if test ia64 != "$host_cpu"; then
              lt_prog_compiler_pic_CXX='+Z'
            fi
            ;;
          aCC*)
            lt_prog_compiler_wl_CXX='-Wl,'
              lt_prog_compiler_pic_CXX='+Z'
            fi
            ;;
          aCC*)
            lt_prog_compiler_wl_CXX='-Wl,'
-           lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+           lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
            case $host_cpu in
            hppa*64*|ia64*)
              # +Z the default
            case $host_cpu in
            hppa*64*|ia64*)
              # +Z the default
@@ -15458,7 +16620,7 @@ lt_prog_compiler_static_CXX=
            lt_prog_compiler_pic_CXX='-fPIC'
            ;;
          ecpc* )
            lt_prog_compiler_pic_CXX='-fPIC'
            ;;
          ecpc* )
-           # old Intel C++ for x86_64 which still supported -KPIC.
+           # old Intel C++ for x86_64, which still supported -KPIC.
            lt_prog_compiler_wl_CXX='-Wl,'
            lt_prog_compiler_pic_CXX='-KPIC'
            lt_prog_compiler_static_CXX='-static'
            lt_prog_compiler_wl_CXX='-Wl,'
            lt_prog_compiler_pic_CXX='-KPIC'
            lt_prog_compiler_static_CXX='-static'
@@ -15603,7 +16765,7 @@ lt_prog_compiler_static_CXX=
   fi
 
 case $host_os in
   fi
 
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     lt_prog_compiler_pic_CXX=
     ;;
   *djgpp*)
     lt_prog_compiler_pic_CXX=
     ;;
@@ -15635,7 +16797,7 @@ else
   lt_cv_prog_compiler_pic_works_CXX=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   lt_cv_prog_compiler_pic_works_CXX=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -15665,7 +16827,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
 
-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
     case $lt_prog_compiler_pic_CXX in
      "" | " "*) ;;
      *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
     case $lt_prog_compiler_pic_CXX in
      "" | " "*) ;;
      *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
@@ -15691,7 +16853,7 @@ if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works_CXX=no
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works_CXX=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -15710,13 +16872,13 @@ else
      fi
    fi
    $RM -r conftest*
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
 
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
 
-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
     :
 else
     lt_prog_compiler_static_CXX=
     :
 else
     lt_prog_compiler_static_CXX=
@@ -15830,8 +16992,8 @@ $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
 
 
 
 
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
@@ -15843,9 +17005,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
     need_locks=warn
   fi
 else
     need_locks=warn
   fi
 else
@@ -15862,17 +17024,21 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   case $host_os in
   aix[4-9]*)
     # If we're using GNU nm, then we don't want the "-C" option.
   case $host_os in
   aix[4-9]*)
     # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
     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) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      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
     else
-      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
     fi
     ;;
   pw32*)
-    export_symbols_cmds_CXX="$ltdll_cmds"
+    export_symbols_cmds_CXX=$ltdll_cmds
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
@@ -15895,7 +17061,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
 $as_echo "$ld_shlibs_CXX" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
 $as_echo "$ld_shlibs_CXX" >&6; }
-test "$ld_shlibs_CXX" = no && can_build_shared=no
+test no = "$ld_shlibs_CXX" && can_build_shared=no
 
 with_gnu_ld_CXX=$with_gnu_ld
 
 
 with_gnu_ld_CXX=$with_gnu_ld
 
@@ -15912,7 +17078,7 @@ x|xyes)
   # Assume -lc should be added
   archive_cmds_need_lc_CXX=yes
 
   # Assume -lc should be added
   archive_cmds_need_lc_CXX=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $archive_cmds_CXX in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
     case $archive_cmds_CXX in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -16040,7 +17206,7 @@ $as_echo_n "checking dynamic linker characteristics... " >&6; }
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -16057,14 +17223,16 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
 # flags to be left without arguments
 need_version=unknown
 
+
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[4-9]*)
   ;;
 
 aix[4-9]*)
@@ -16072,41 +17240,91 @@ aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
           echo ' yes '
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
           echo ' yes '
-          echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+          echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
        :
       else
        can_build_shared=no
       fi
       ;;
     esac
        :
       else
        can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -16116,18 +17334,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -16135,8 +17353,8 @@ beos*)
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -16148,7 +17366,7 @@ bsdi[45]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
   need_version=no
   need_lib_prefix=no
 
@@ -16157,8 +17375,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -16174,16 +17392,16 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
 
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
 
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -16192,8 +17410,8 @@ cygwin* | mingw* | pw32* | cegcc*)
   *,cl*)
     # Native MSVC
     libname_spec='$name'
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
 
     case $build_os in
     mingw*)
@@ -16220,7 +17438,7 @@ cygwin* | mingw* | pw32* | cegcc*)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -16233,8 +17451,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -16247,7 +17465,7 @@ cygwin* | mingw* | pw32* | cegcc*)
 
   *)
     # Assume MSVC wrapper
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -16260,8 +17478,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -16273,8 +17491,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -16292,12 +17510,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
       need_version=yes
       ;;
   esac
@@ -16327,10 +17546,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -16348,14 +17567,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -16363,8 +17583,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -16373,8 +17593,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -16387,8 +17607,8 @@ interix[3-9]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -16399,7 +17619,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-       if test "$lt_cv_prog_gnu_ld" = yes; then
+       if test yes = "$lt_cv_prog_gnu_ld"; then
                version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
                version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
@@ -16407,8 +17627,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -16427,8 +17647,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
   hardcode_into_libs=yes
   ;;
 
@@ -16437,13 +17657,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec_CXX='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   # before this can be enabled.
   hardcode_into_libs=yes
 
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # 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
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # 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="/lib /usr/lib $lt_ld_extra"
   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="/lib /usr/lib $lt_ld_extra"
@@ -16519,12 +17764,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -16534,7 +17779,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -16543,58 +17788,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-       shlibpath_overrides_runpath=no
-       ;;
-      *)
-       shlibpath_overrides_runpath=yes
-       ;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
   ;;
 
 rdos*)
@@ -16605,8 +17860,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -16616,11 +17871,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
     need_lib_prefix=no
   fi
   need_version=yes
@@ -16628,8 +17883,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -16650,24 +17905,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/necthen
     version_type=linux # correct to gnu/linux during the next big refactor
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -16685,7 +17940,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -16693,8 +17948,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -16704,20 +17959,32 @@ uts4*)
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
 
 
 
 
 
 
@@ -16760,15 +18027,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action_CXX=
 if test -n "$hardcode_libdir_flag_spec_CXX" ||
    test -n "$runpath_var_CXX" ||
 hardcode_action_CXX=
 if test -n "$hardcode_libdir_flag_spec_CXX" ||
    test -n "$runpath_var_CXX" ||
-   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+   test yes = "$hardcode_automatic_CXX"; then
 
   # We can hardcode non-existent directories.
 
   # We can hardcode non-existent directories.
-  if test "$hardcode_direct_CXX" != no &&
+  if test no != "$hardcode_direct_CXX" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
-     test "$hardcode_minus_L_CXX" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+     test no != "$hardcode_minus_L_CXX"; then
     # Linking always hardcodes the temporary library directory.
     hardcode_action_CXX=relink
   else
     # Linking always hardcodes the temporary library directory.
     hardcode_action_CXX=relink
   else
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
 $as_echo "$hardcode_action_CXX" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
 $as_echo "$hardcode_action_CXX" >&6; }
 
-if test "$hardcode_action_CXX" = relink ||
-   test "$inherit_rpath_CXX" = yes; then
+if test relink = "$hardcode_action_CXX" ||
+   test yes = "$inherit_rpath_CXX"; then
   # Fast installation is not supported
   enable_fast_install=no
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -16811,7 +18078,7 @@ fi
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
+fi # test yes != "$_lt_caught_CXX_error"
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -17149,9 +18416,9 @@ GIT=${GIT-"${am_missing_run}git"}
 
 
 HB_VERSION_MAJOR=1
 
 
 HB_VERSION_MAJOR=1
-HB_VERSION_MINOR=4
+HB_VERSION_MINOR=7
 HB_VERSION_MICRO=6
 HB_VERSION_MICRO=6
-HB_VERSION=1.4.6
+HB_VERSION=1.7.6
 
 
 
 
 
 
@@ -17162,7 +18429,24 @@ HB_VERSION=1.4.6
 
 
 
 
 
 
-HB_LIBTOOL_VERSION_INFO=10400:6:10400
+HB_LIBTOOL_VERSION_INFO=10706:0:10706
+
+
+
+# Check whether --with-libstdc++ was given.
+if test "${with_libstdc__+set}" = set; then :
+  withval=$with_libstdc__; with_libstdcxx=$withval
+else
+  with_libstdcxx=no
+fi
+
+ if test "x$with_libstdcxx" = "xyes"; then
+  WITH_LIBSTDCXX_TRUE=
+  WITH_LIBSTDCXX_FALSE='#'
+else
+  WITH_LIBSTDCXX_TRUE='#'
+  WITH_LIBSTDCXX_FALSE=
+fi
 
 
 # Documentation
 
 
 # Documentation
@@ -17543,8 +18827,8 @@ fi
        fi
 
 
        fi
 
 
-# Functions and headers
-for ac_func in atexit mprotect sysconf getpagesize mmap isatty
+# Functions, and headers
+for ac_func in atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l setlinebuf
 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"
 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"
@@ -17556,7 +18840,7 @@ _ACEOF
 fi
 done
 
 fi
 done
 
-for ac_header in unistd.h sys/mman.h
+for ac_header in unistd.h sys/mman.h xlocale.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
 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"
@@ -17612,9 +18896,6 @@ if test "x$GCC" = "xyes"; then
        # Make symbols link locally
        LDFLAGS="$LDFLAGS -Bsymbolic-functions"
 
        # Make symbols link locally
        LDFLAGS="$LDFLAGS -Bsymbolic-functions"
 
-       # Make sure we don't link to libstdc++
-       CXXFLAGS="$CXXFLAGS -fno-rtti -fno-exceptions"
-
        # Assorted warnings
        CXXFLAGS="$CXXFLAGS -Wcast-align"
 
        # Assorted warnings
        CXXFLAGS="$CXXFLAGS -Wcast-align"
 
@@ -18558,6 +19839,7 @@ fi
 
 
 
 
 
 
+
 # Gobject-Introspection
 have_introspection=false
 
 # Gobject-Introspection
 have_introspection=false
 
@@ -19427,12 +20709,13 @@ $as_echo "#define HAVE_FREETYPE 1" >>confdefs.h
 
        save_libs=$LIBS
        LIBS="$LIBS $FREETYPE_LIBS"
 
        save_libs=$LIBS
        LIBS="$LIBS $FREETYPE_LIBS"
-       for ac_func in FT_Get_Var_Blend_Coordinates
+       for ac_func in FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var
 do :
 do :
-  ac_fn_c_check_func "$LINENO" "FT_Get_Var_Blend_Coordinates" "ac_cv_func_FT_Get_Var_Blend_Coordinates"
-if test "x$ac_cv_func_FT_Get_Var_Blend_Coordinates" = xyes; then :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
   cat >>confdefs.h <<_ACEOF
-#define HAVE_FT_GET_VAR_BLEND_COORDINATES 1
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
 
 fi
 _ACEOF
 
 fi
@@ -19590,7 +20873,7 @@ fi
 
                if $have_coretext; then
                        CORETEXT_CFLAGS=
 
                if $have_coretext; then
                        CORETEXT_CFLAGS=
-                       CORETEXT_LIBS="-framework CoreText -framework CoreGraphics"
+                       CORETEXT_LIBS="-framework CoreText -framework CoreGraphics -framework CoreFoundation"
 
 
                fi
 
 
                fi
@@ -19769,7 +21052,7 @@ fi
 fi
 
 
 fi
 
 
-ac_config_files="$ac_config_files Makefile src/Makefile src/hb-version.h src/hb-ucdn/Makefile util/Makefile test/Makefile test/api/Makefile test/fuzzing/Makefile test/shaping/Makefile docs/Makefile docs/version.xml win32/Makefile win32/config.h.win32"
+ac_config_files="$ac_config_files Makefile src/Makefile src/hb-version.h src/harfbuzz-config.cmake src/hb-ucdn/Makefile util/Makefile test/Makefile test/api/Makefile test/fuzzing/Makefile test/shaping/Makefile test/shaping/data/Makefile test/shaping/data/in-house/Makefile test/shaping/data/text-rendering-tests/Makefile test/subset/Makefile test/subset/data/Makefile docs/Makefile docs/version.xml"
 
 
 cat >confcache <<\_ACEOF
 
 
 cat >confcache <<\_ACEOF
@@ -19897,8 +21180,8 @@ else
   am__EXEEXT_FALSE=
 fi
 
   am__EXEEXT_FALSE=
 fi
 
-if test -z "${AUTOMAKE_OLDER_THAN_1_13_TRUE}" && test -z "${AUTOMAKE_OLDER_THAN_1_13_FALSE}"; then
-  as_fn_error $? "conditional \"AUTOMAKE_OLDER_THAN_1_13\" was never defined.
+if test -z "${CODE_COVERAGE_ENABLED_TRUE}" && test -z "${CODE_COVERAGE_ENABLED_FALSE}"; then
+  as_fn_error $? "conditional \"CODE_COVERAGE_ENABLED\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
@@ -19917,6 +21200,10 @@ if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
   as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${WITH_LIBSTDCXX_TRUE}" && test -z "${WITH_LIBSTDCXX_FALSE}"; then
+  as_fn_error $? "conditional \"WITH_LIBSTDCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_GTK_DOC_TRUE}" && test -z "${HAVE_GTK_DOC_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_GTK_DOC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 if test -z "${HAVE_GTK_DOC_TRUE}" && test -z "${HAVE_GTK_DOC_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_GTK_DOC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -20418,7 +21705,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="
 # 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 1.4.6, which was
+This file was extended by HarfBuzz $as_me 1.7.6, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -20478,14 +21765,14 @@ $config_headers
 Configuration commands:
 $config_commands
 
 Configuration commands:
 $config_commands
 
-Report bugs to <https://github.com/behdad/harfbuzz/issues/new>.
+Report bugs to <https://github.com/harfbuzz/harfbuzz/issues/new>.
 HarfBuzz home page: <http://harfbuzz.org/>."
 
 _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 home page: <http://harfbuzz.org/>."
 
 _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 1.4.6
+HarfBuzz config.status 1.7.6
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -20620,6 +21907,7 @@ enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
 enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
 pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
 enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
 enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
 pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
 enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
 SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
 ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
 PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
 SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
 ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
 PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
@@ -20669,10 +21957,13 @@ compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
 GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
 GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
 nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
 lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
 nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
 lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
 objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
 MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
 lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
 objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
 MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
 lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
@@ -20737,7 +22028,8 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
 finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
 hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
 sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
 finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
 hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
 sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
 hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
 enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
 enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
 hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
 enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
 enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
@@ -20842,9 +22134,12 @@ CFLAGS \
 compiler \
 lt_cv_sys_global_symbol_pipe \
 lt_cv_sys_global_symbol_to_cdecl \
 compiler \
 lt_cv_sys_global_symbol_pipe \
 lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
 lt_cv_sys_global_symbol_to_c_name_address \
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
 lt_cv_sys_global_symbol_to_c_name_address \
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
 nm_file_list_spec \
 nm_file_list_spec \
+lt_cv_truncate_bin \
 lt_prog_compiler_no_builtin_flag \
 lt_prog_compiler_pic \
 lt_prog_compiler_wl \
 lt_prog_compiler_no_builtin_flag \
 lt_prog_compiler_pic \
 lt_prog_compiler_wl \
@@ -20910,7 +22205,7 @@ postdeps_CXX \
 compiler_lib_search_path_CXX; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
 compiler_lib_search_path_CXX; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -20937,7 +22232,8 @@ postinstall_cmds \
 postuninstall_cmds \
 finish_cmds \
 sys_lib_search_path_spec \
 postuninstall_cmds \
 finish_cmds \
 sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
 reload_cmds_CXX \
 old_archive_cmds_CXX \
 old_archive_from_new_cmds_CXX \
 reload_cmds_CXX \
 old_archive_cmds_CXX \
 old_archive_from_new_cmds_CXX \
@@ -20951,7 +22247,7 @@ prelink_cmds_CXX \
 postlink_cmds_CXX; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
 postlink_cmds_CXX; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -20960,19 +22256,16 @@ postlink_cmds_CXX; do
 done
 
 ac_aux_dir='$ac_aux_dir'
 done
 
 ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
 
 
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
 
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
    setopt NO_GLOB_SUBST
 fi
 
 
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'
 
     RM='$RM'
     ofile='$ofile'
 
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
     "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
     "src/hb-version.h") CONFIG_FILES="$CONFIG_FILES src/hb-version.h" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
     "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
     "src/hb-version.h") CONFIG_FILES="$CONFIG_FILES src/hb-version.h" ;;
+    "src/harfbuzz-config.cmake") CONFIG_FILES="$CONFIG_FILES src/harfbuzz-config.cmake" ;;
     "src/hb-ucdn/Makefile") CONFIG_FILES="$CONFIG_FILES src/hb-ucdn/Makefile" ;;
     "util/Makefile") CONFIG_FILES="$CONFIG_FILES util/Makefile" ;;
     "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
     "test/api/Makefile") CONFIG_FILES="$CONFIG_FILES test/api/Makefile" ;;
     "test/fuzzing/Makefile") CONFIG_FILES="$CONFIG_FILES test/fuzzing/Makefile" ;;
     "test/shaping/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/Makefile" ;;
     "src/hb-ucdn/Makefile") CONFIG_FILES="$CONFIG_FILES src/hb-ucdn/Makefile" ;;
     "util/Makefile") CONFIG_FILES="$CONFIG_FILES util/Makefile" ;;
     "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
     "test/api/Makefile") CONFIG_FILES="$CONFIG_FILES test/api/Makefile" ;;
     "test/fuzzing/Makefile") CONFIG_FILES="$CONFIG_FILES test/fuzzing/Makefile" ;;
     "test/shaping/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/Makefile" ;;
+    "test/shaping/data/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/Makefile" ;;
+    "test/shaping/data/in-house/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/in-house/Makefile" ;;
+    "test/shaping/data/text-rendering-tests/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/text-rendering-tests/Makefile" ;;
+    "test/subset/Makefile") CONFIG_FILES="$CONFIG_FILES test/subset/Makefile" ;;
+    "test/subset/data/Makefile") CONFIG_FILES="$CONFIG_FILES test/subset/data/Makefile" ;;
     "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
     "docs/version.xml") CONFIG_FILES="$CONFIG_FILES docs/version.xml" ;;
     "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
     "docs/version.xml") CONFIG_FILES="$CONFIG_FILES docs/version.xml" ;;
-    "win32/Makefile") CONFIG_FILES="$CONFIG_FILES win32/Makefile" ;;
-    "win32/config.h.win32") CONFIG_FILES="$CONFIG_FILES win32/config.h.win32" ;;
 
   *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
   esac
 
   *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
   esac
@@ -21695,55 +22992,52 @@ $as_echo X"$file" |
  ;;
     "libtool":C)
 
  ;;
     "libtool":C)
 
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 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.
+
+# GNU Libtool 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 2 of of the License, or
+# (at your option) any later version.
 #
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool 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 2 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.
+# 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.
 #
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool 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.
 #
 # You should have received a copy of the GNU General Public License
 # MERCHANTABILITY or FITNESS 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 GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 # The names of the tagged configurations supported by this script.
 
 
 # The names of the tagged configurations supported by this script.
-available_tags="CXX "
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
 
 # ### BEGIN LIBTOOL CONFIG
 
 
 # ### BEGIN LIBTOOL CONFIG
 
@@ -21763,6 +23057,9 @@ pic_mode=$pic_mode
 # Whether or not to optimize for fast installation.
 fast_install=$enable_fast_install
 
 # Whether or not to optimize for fast installation.
 fast_install=$enable_fast_install
 
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
 # Shell to use when invoking shell scripts.
 SHELL=$lt_SHELL
 
 # Shell to use when invoking shell scripts.
 SHELL=$lt_SHELL
 
@@ -21880,18 +23177,27 @@ global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 # Transform the output of nm in a proper C declaration.
 global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
 # Transform the output of nm in a proper C declaration.
 global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
 # Transform the output of nm in a C name address pair.
 global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
 # Transform the output of nm in a C name address pair when lib prefix is needed.
 global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
 
 # Transform the output of nm in a C name address pair.
 global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
 # Transform the output of nm in a C name address pair when lib prefix is needed.
 global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
 
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
 # Specify filename containing input files for \$NM.
 nm_file_list_spec=$lt_nm_file_list_spec
 
 # Specify filename containing input files for \$NM.
 nm_file_list_spec=$lt_nm_file_list_spec
 
-# The root where to search for dependent libraries,and in which our libraries should be installed.
+# The root where to search for dependent libraries,and where our libraries should be installed.
 lt_sysroot=$lt_sysroot
 
 lt_sysroot=$lt_sysroot
 
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
 # The name of the directory that contains temporary libtool files.
 objdir=$objdir
 
 # The name of the directory that contains temporary libtool files.
 objdir=$objdir
 
@@ -21982,8 +23288,11 @@ hardcode_into_libs=$hardcode_into_libs
 # Compile-time system search path for libraries.
 sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
 # Compile-time system search path for libraries.
 sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
 
 # Whether dlopen is supported.
 dlopen_support=$enable_dlopen
 
 # Whether dlopen is supported.
 dlopen_support=$enable_dlopen
@@ -22076,13 +23385,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator
 
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct
 
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary and the resulting library dependency is
 # DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute
 
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute
 
@@ -22148,13 +23457,72 @@ compiler_lib_search_path=$lt_compiler_lib_search_path
 
 _LT_EOF
 
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -22163,7 +23531,7 @@ _LT_EOF
   esac
 
 
   esac
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 
   # We use sed instead of cat because bash on DJGPP gets confused if
 
 
   # We use sed instead of cat because bash on DJGPP gets confused if
@@ -22173,165 +23541,6 @@ ltmain="$ac_aux_dir/ltmain.sh"
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  if test x"$xsi_shell" = xyes; then
-  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\    # positional parameters, so assign one to ordinary parameter first.\
-\    func_stripname_result=${3}\
-\    func_stripname_result=${func_stripname_result#"${1}"}\
-\    func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\    func_split_long_opt_name=${1%%=*}\
-\    func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\    func_split_short_opt_arg=${1#??}\
-\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\    case ${1} in\
-\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\      *)    func_lo2o_result=${1} ;;\
-\    esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
-    func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
-    func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
-    func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
-    eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\    func_quote_for_eval "${2}"\
-\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
@@ -22418,13 +23627,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
 
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct_CXX
 
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct_CXX
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary and the resulting library dependency is
 # DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute_CXX
 
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute_CXX
 
@@ -22538,14 +23747,14 @@ Unicode callbacks (you want at least one):
        Glib:                   ${have_glib}
        ICU:                    ${have_icu}
 
        Glib:                   ${have_glib}
        ICU:                    ${have_icu}
 
-Font callbacks (the more the better):
+Font callbacks (the more the merrier):
        FreeType:               ${have_freetype}
 
 Tools used for command-line utilities:
        Cairo:                  ${have_cairo}
        Fontconfig:             ${have_fontconfig}
 
        FreeType:               ${have_freetype}
 
 Tools used for command-line utilities:
        Cairo:                  ${have_cairo}
        Fontconfig:             ${have_fontconfig}
 
-Additional shapers (the more the better):
+Additional shapers (the more the merrier):
        Graphite2:              ${have_graphite2}
 
 Platform shapers (not normally needed):
        Graphite2:              ${have_graphite2}
 
 Platform shapers (not normally needed):
@@ -22554,7 +23763,7 @@ Platform shapers (not normally needed):
        DirectWrite:            ${have_directwrite}
 
 Other features:
        DirectWrite:            ${have_directwrite}
 
 Other features:
-       Documentation:          ${have_gtk_doc}
+       Documentation:          ${enable_gtk_doc}
        GObject bindings:       ${have_gobject}
        Introspection:          ${have_introspection}
 " >&5
        GObject bindings:       ${have_gobject}
        Introspection:          ${have_introspection}
 " >&5
@@ -22567,14 +23776,14 @@ Unicode callbacks (you want at least one):
        Glib:                   ${have_glib}
        ICU:                    ${have_icu}
 
        Glib:                   ${have_glib}
        ICU:                    ${have_icu}
 
-Font callbacks (the more the better):
+Font callbacks (the more the merrier):
        FreeType:               ${have_freetype}
 
 Tools used for command-line utilities:
        Cairo:                  ${have_cairo}
        Fontconfig:             ${have_fontconfig}
 
        FreeType:               ${have_freetype}
 
 Tools used for command-line utilities:
        Cairo:                  ${have_cairo}
        Fontconfig:             ${have_fontconfig}
 
-Additional shapers (the more the better):
+Additional shapers (the more the merrier):
        Graphite2:              ${have_graphite2}
 
 Platform shapers (not normally needed):
        Graphite2:              ${have_graphite2}
 
 Platform shapers (not normally needed):
@@ -22583,7 +23792,7 @@ Platform shapers (not normally needed):
        DirectWrite:            ${have_directwrite}
 
 Other features:
        DirectWrite:            ${have_directwrite}
 
 Other features:
-       Documentation:          ${have_gtk_doc}
+       Documentation:          ${enable_gtk_doc}
        GObject bindings:       ${have_gobject}
        Introspection:          ${have_introspection}
 " >&6;}
        GObject bindings:       ${have_gobject}
        Introspection:          ${have_introspection}
 " >&6;}
index 6d14455..1fb8a10 100644 (file)
@@ -1,7 +1,7 @@
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
-        [1.4.6],
-        [https://github.com/behdad/harfbuzz/issues/new],
+        [1.7.6],
+        [https://github.com/harfbuzz/harfbuzz/issues/new],
         [harfbuzz],
         [http://harfbuzz.org/])
 
         [harfbuzz],
         [http://harfbuzz.org/])
 
@@ -9,9 +9,9 @@ AC_CONFIG_MACRO_DIR([m4])
 AC_CONFIG_SRCDIR([src/harfbuzz.pc.in])
 AC_CONFIG_HEADERS([config.h])
 
 AC_CONFIG_SRCDIR([src/harfbuzz.pc.in])
 AC_CONFIG_HEADERS([config.h])
 
-AM_INIT_AUTOMAKE([1.11.1 gnits tar-ustar dist-bzip2 no-dist-gzip -Wall no-define color-tests -Wno-portability])
-AM_CONDITIONAL(AUTOMAKE_OLDER_THAN_1_13, test $am__api_version = 1.11 -o $am__api_version = 1.12)
+AM_INIT_AUTOMAKE([1.13.0 gnits tar-ustar dist-bzip2 no-dist-gzip -Wall no-define color-tests -Wno-portability])
 AM_SILENT_RULES([yes])
 AM_SILENT_RULES([yes])
+AX_CODE_COVERAGE
 
 # Initialize libtool
 m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
 
 # Initialize libtool
 m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
@@ -21,8 +21,10 @@ LT_INIT([disable-static])
 # Check for programs
 AC_USE_SYSTEM_EXTENSIONS
 AC_PROG_CC
 # Check for programs
 AC_USE_SYSTEM_EXTENSIONS
 AC_PROG_CC
+AC_PROG_CC_C99
 AM_PROG_CC_C_O
 AC_PROG_CXX
 AM_PROG_CC_C_O
 AC_PROG_CXX
+dnl AX_CXX_COMPILE_STDCXX(11, noext, optional)
 AC_SYS_LARGEFILE
 PKG_PROG_PKG_CONFIG([0.20])
 AM_MISSING_PROG([RAGEL], [ragel])
 AC_SYS_LARGEFILE
 PKG_PROG_PKG_CONFIG([0.20])
 AM_MISSING_PROG([RAGEL], [ragel])
@@ -57,6 +59,13 @@ m4_define([hb_libtool_current],
 HB_LIBTOOL_VERSION_INFO=hb_libtool_current:hb_libtool_revision:hb_libtool_age
 AC_SUBST(HB_LIBTOOL_VERSION_INFO)
 
 HB_LIBTOOL_VERSION_INFO=hb_libtool_current:hb_libtool_revision:hb_libtool_age
 AC_SUBST(HB_LIBTOOL_VERSION_INFO)
 
+AC_ARG_WITH([libstdc++],
+       [AS_HELP_STRING([--with-libstdc++=@<:@yes/no@:>@],
+                       [Allow linking with libstdc++ @<:@default=no@:>@])],
+       [with_libstdcxx=$withval],
+       [with_libstdcxx=no])
+AM_CONDITIONAL(WITH_LIBSTDCXX, [test "x$with_libstdcxx" = "xyes"])
+
 # Documentation
 have_gtk_doc=false
 m4_ifdef([GTK_DOC_CHECK], [
 # Documentation
 have_gtk_doc=false
 m4_ifdef([GTK_DOC_CHECK], [
@@ -68,9 +77,9 @@ GTK_DOC_CHECK([1.15],[--flavour no-tmpl])
        AM_CONDITIONAL([ENABLE_GTK_DOC], false)
 ])
 
        AM_CONDITIONAL([ENABLE_GTK_DOC], false)
 ])
 
-# Functions and headers
-AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty)
-AC_CHECK_HEADERS(unistd.h sys/mman.h)
+# Functions, and headers
+AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l setlinebuf)
+AC_CHECK_HEADERS(unistd.h sys/mman.h xlocale.h)
 
 # Compiler flags
 AC_CANONICAL_HOST
 
 # Compiler flags
 AC_CANONICAL_HOST
@@ -80,9 +89,6 @@ if test "x$GCC" = "xyes"; then
        # Make symbols link locally
        LDFLAGS="$LDFLAGS -Bsymbolic-functions"
 
        # Make symbols link locally
        LDFLAGS="$LDFLAGS -Bsymbolic-functions"
 
-       # Make sure we don't link to libstdc++
-       CXXFLAGS="$CXXFLAGS -fno-rtti -fno-exceptions"
-
        # Assorted warnings
        CXXFLAGS="$CXXFLAGS -Wcast-align"
 
        # Assorted warnings
        CXXFLAGS="$CXXFLAGS -Wcast-align"
 
@@ -164,7 +170,7 @@ dnl ===========================================================================
 
 AC_ARG_WITH(gobject,
        [AS_HELP_STRING([--with-gobject=@<:@yes/no/auto@:>@],
 
 AC_ARG_WITH(gobject,
        [AS_HELP_STRING([--with-gobject=@<:@yes/no/auto@:>@],
-                       [Use gobject @<:@default=auto@:>@])],,
+                       [Use gobject @<:@default=no@:>@])],,
        [with_gobject=no])
 have_gobject=false
 if test "x$with_gobject" = "xyes" -o "x$with_gobject" = "xauto"; then
        [with_gobject=no])
 have_gobject=false
 if test "x$with_gobject" = "xyes" -o "x$with_gobject" = "xauto"; then
@@ -179,6 +185,7 @@ if $have_gobject; then
        AC_SUBST(GLIB_MKENUMS)
 fi
 AM_CONDITIONAL(HAVE_GOBJECT, $have_gobject)
        AC_SUBST(GLIB_MKENUMS)
 fi
 AM_CONDITIONAL(HAVE_GOBJECT, $have_gobject)
+AC_SUBST(have_gobject)
 
 dnl ===========================================================================
 
 
 dnl ===========================================================================
 
@@ -352,7 +359,7 @@ if $have_freetype; then
        AC_DEFINE(HAVE_FREETYPE, 1, [Have FreeType 2 library])
        save_libs=$LIBS
        LIBS="$LIBS $FREETYPE_LIBS"
        AC_DEFINE(HAVE_FREETYPE, 1, [Have FreeType 2 library])
        save_libs=$LIBS
        LIBS="$LIBS $FREETYPE_LIBS"
-       AC_CHECK_FUNCS(FT_Get_Var_Blend_Coordinates)
+       AC_CHECK_FUNCS(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var)
        LIBS=$save_libs
 fi
 AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype)
        LIBS=$save_libs
 fi
 AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype)
@@ -427,7 +434,7 @@ if test "x$with_coretext" = "xyes" -o "x$with_coretext" = "xauto"; then
 
                if $have_coretext; then
                        CORETEXT_CFLAGS=
 
                if $have_coretext; then
                        CORETEXT_CFLAGS=
-                       CORETEXT_LIBS="-framework CoreText -framework CoreGraphics"
+                       CORETEXT_LIBS="-framework CoreText -framework CoreGraphics -framework CoreFoundation"
                        AC_SUBST(CORETEXT_CFLAGS)
                        AC_SUBST(CORETEXT_LIBS)
                fi
                        AC_SUBST(CORETEXT_CFLAGS)
                        AC_SUBST(CORETEXT_LIBS)
                fi
@@ -486,16 +493,20 @@ AC_CONFIG_FILES([
 Makefile
 src/Makefile
 src/hb-version.h
 Makefile
 src/Makefile
 src/hb-version.h
+src/harfbuzz-config.cmake
 src/hb-ucdn/Makefile
 util/Makefile
 test/Makefile
 test/api/Makefile
 test/fuzzing/Makefile
 test/shaping/Makefile
 src/hb-ucdn/Makefile
 util/Makefile
 test/Makefile
 test/api/Makefile
 test/fuzzing/Makefile
 test/shaping/Makefile
+test/shaping/data/Makefile
+test/shaping/data/in-house/Makefile
+test/shaping/data/text-rendering-tests/Makefile
+test/subset/Makefile
+test/subset/data/Makefile
 docs/Makefile
 docs/version.xml
 docs/Makefile
 docs/version.xml
-win32/Makefile
-win32/config.h.win32
 ])
 
 AC_OUTPUT
 ])
 
 AC_OUTPUT
@@ -509,14 +520,14 @@ Unicode callbacks (you want at least one):
        Glib:                   ${have_glib}
        ICU:                    ${have_icu}
 
        Glib:                   ${have_glib}
        ICU:                    ${have_icu}
 
-Font callbacks (the more the better):
+Font callbacks (the more the merrier):
        FreeType:               ${have_freetype}
 
 Tools used for command-line utilities:
        Cairo:                  ${have_cairo}
        Fontconfig:             ${have_fontconfig}
 
        FreeType:               ${have_freetype}
 
 Tools used for command-line utilities:
        Cairo:                  ${have_cairo}
        Fontconfig:             ${have_fontconfig}
 
-Additional shapers (the more the better):
+Additional shapers (the more the merrier):
        Graphite2:              ${have_graphite2}
 
 Platform shapers (not normally needed):
        Graphite2:              ${have_graphite2}
 
 Platform shapers (not normally needed):
@@ -525,7 +536,7 @@ Platform shapers (not normally needed):
        DirectWrite:            ${have_directwrite}
 
 Other features:
        DirectWrite:            ${have_directwrite}
 
 Other features:
-       Documentation:          ${have_gtk_doc}
+       Documentation:          ${enable_gtk_doc}
        GObject bindings:       ${have_gobject}
        Introspection:          ${have_introspection}
 ])
        GObject bindings:       ${have_gobject}
        Introspection:          ${have_introspection}
 ])
diff --git a/depcomp b/depcomp
index 4ebd5b3..b39f98f 100755 (executable)
--- a/depcomp
+++ b/depcomp
@@ -1,9 +1,9 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2013-05-30.07; # UTC
+scriptversion=2016-01-11.22; # UTC
 
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 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
 
 # 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
@@ -786,6 +786,6 @@ exit 0
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
 # time-stamp-end: "; # UTC"
 # End:
 # time-stamp-end: "; # UTC"
 # End:
index d58d9fc..771d955 100644 (file)
Binary files a/docs/HarfBuzz.png and b/docs/HarfBuzz.png differ
diff --git a/docs/HarfBuzz.svg b/docs/HarfBuzz.svg
new file mode 100644 (file)
index 0000000..4e2df25
--- /dev/null
@@ -0,0 +1,277 @@
+<?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>
index 3916801..a993538 100644 (file)
@@ -67,7 +67,8 @@ EXTRA_HFILES=$(top_builddir)/src/hb-version.h
 # Images to copy into HTML directory.
 # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
 HTML_IMAGES=  \
 # Images to copy into HTML directory.
 # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
 HTML_IMAGES=  \
-       HarfBuzz.png
+       HarfBuzz.png \
+       HarfBuzz.svg
 
 # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
 # e.g. content_files=running.sgml building.sgml changes-2.0.sgml
 
 # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
 # e.g. content_files=running.sgml building.sgml changes-2.0.sgml
@@ -110,7 +111,7 @@ EXTRA_DIST += version.xml.in
 # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
 #DISTCLEANFILES +=
 
 # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
 #DISTCLEANFILES +=
 
-# Comment this out if you want 'make check' to test you doc status
+# Comment this out if you don't want 'make check' to test you doc status
 # and run some sanity checks
 if ENABLE_GTK_DOC
 TESTS_ENVIRONMENT = cd $(srcdir) && \
 # and run some sanity checks
 if ENABLE_GTK_DOC
 TESTS_ENVIRONMENT = cd $(srcdir) && \
index 04b9a15..2039ee1 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # Everything below here is generic #
 ####################################
 VPATH = @srcdir@
 # Everything below here is generic #
 ####################################
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -87,17 +97,17 @@ build_triplet = @build@
 host_triplet = @host@
 @HAVE_GOBJECT_FALSE@am__append_1 = hb-gobject.h hb-gobject-enums.h hb-gobject-structs.h
 @HAVE_GOBJECT_TRUE@am__append_2 = $(top_builddir)/src/libharfbuzz-gobject.la
 host_triplet = @host@
 @HAVE_GOBJECT_FALSE@am__append_1 = hb-gobject.h hb-gobject-enums.h hb-gobject-structs.h
 @HAVE_GOBJECT_TRUE@am__append_2 = $(top_builddir)/src/libharfbuzz-gobject.la
-DIST_COMMON = $(top_srcdir)/gtk-doc.make $(srcdir)/Makefile.in \
-       $(srcdir)/Makefile.am $(srcdir)/version.xml.in
 subdir = docs
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 subdir = docs
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-       $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES = version.xml
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES = version.xml
@@ -122,6 +132,8 @@ am__can_run_installinfo = \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/version.xml.in \
+       $(top_srcdir)/gtk-doc.make
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
@@ -138,6 +150,12 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
@@ -165,6 +183,8 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
@@ -204,6 +224,7 @@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -212,6 +233,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -268,6 +290,7 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -288,6 +311,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -362,7 +386,8 @@ EXTRA_HFILES = $(top_builddir)/src/hb-version.h
 # Images to copy into HTML directory.
 # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
 HTML_IMAGES = \
 # Images to copy into HTML directory.
 # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
 HTML_IMAGES = \
-       HarfBuzz.png
+       HarfBuzz.png \
+       HarfBuzz.svg
 
 
 # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
 
 
 # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
@@ -407,6 +432,7 @@ GPATH = $(srcdir)
 TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
 SETUP_FILES = \
        $(content_files)                \
 TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
 SETUP_FILES = \
        $(content_files)                \
+       $(expand_content_files)         \
        $(DOC_MAIN_SGML_FILE)           \
        $(DOC_MODULE)-sections.txt      \
        $(DOC_MODULE)-overrides.txt
        $(DOC_MAIN_SGML_FILE)           \
        $(DOC_MODULE)-sections.txt      \
        $(DOC_MODULE)-overrides.txt
@@ -475,7 +501,7 @@ GTK_DOC_V_PDF_0 = @echo "  DOC   Building PDF";
 # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
 #DISTCLEANFILES +=
 
 # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
 #DISTCLEANFILES +=
 
-# Comment this out if you want 'make check' to test you doc status
+# Comment this out if you don't want 'make check' to test you doc status
 # and run some sanity checks
 @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \
 @ENABLE_GTK_DOC_TRUE@  DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
 # and run some sanity checks
 @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \
 @ENABLE_GTK_DOC_TRUE@  DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
@@ -496,7 +522,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__c
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits docs/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits docs/Makefile
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits docs/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits docs/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -505,7 +530,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
-$(top_srcdir)/gtk-doc.make:
+$(top_srcdir)/gtk-doc.make $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -682,6 +707,8 @@ uninstall-am: uninstall-local
        mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
        uninstall-am uninstall-local
 
        mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
        uninstall-am uninstall-local
 
+.PRECIOUS: Makefile
+
 
 gtkdoc-check.test: Makefile
        $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \
 
 gtkdoc-check.test: Makefile
        $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \
@@ -699,7 +726,7 @@ $(REPORT_FILES): sgml-build.stamp
 
 setup-build.stamp:
        -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
 
 setup-build.stamp:
        -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
-           files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+           files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \
            if test "x$$files" != "x" ; then \
                for file in $$files ; do \
                    destdir=`dirname $(abs_builddir)/$$file`; \
            if test "x$$files" != "x" ; then \
                for file in $$files ; do \
                    destdir=`dirname $(abs_builddir)/$$file`; \
@@ -720,7 +747,7 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
        $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
            scanobj_options=""; \
            gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
        $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
            scanobj_options=""; \
            gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
-           if test "$(?)" = "0"; then \
+           if test "$$?" = "0"; then \
                if test "x$(V)" = "x1"; then \
                    scanobj_options="--verbose"; \
                fi; \
                if test "x$(V)" = "x1"; then \
                    scanobj_options="--verbose"; \
                fi; \
@@ -737,7 +764,7 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
 $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
        @true
 
 $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
        @true
 
-sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent
        $(GTK_DOC_V_XML)_source_dir='' ; \
        for i in $(DOC_SOURCE_DIR) ; do \
            _source_dir="$${_source_dir} --source-dir=$$i" ; \
        $(GTK_DOC_V_XML)_source_dir='' ; \
        for i in $(DOC_SOURCE_DIR) ; do \
            _source_dir="$${_source_dir} --source-dir=$$i" ; \
@@ -748,17 +775,28 @@ sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DO
 sgml.stamp: sgml-build.stamp
        @true
 
 sgml.stamp: sgml-build.stamp
        @true
 
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+xml/gtkdocentities.ent: Makefile
+       $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \
+               echo "<!ENTITY package \"$(PACKAGE)\">"; \
+               echo "<!ENTITY package_bugreport \"$(PACKAGE_BUGREPORT)\">"; \
+               echo "<!ENTITY package_name \"$(PACKAGE_NAME)\">"; \
+               echo "<!ENTITY package_string \"$(PACKAGE_STRING)\">"; \
+               echo "<!ENTITY package_tarname \"$(PACKAGE_TARNAME)\">"; \
+               echo "<!ENTITY package_url \"$(PACKAGE_URL)\">"; \
+               echo "<!ENTITY package_version \"$(PACKAGE_VERSION)\">"; \
+       ) > $@
+
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
        $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
        mkhtml_options=""; \
        gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
        $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
        mkhtml_options=""; \
        gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
-       if test "$(?)" = "0"; then \
+       if test "$$?" = "0"; then \
          if test "x$(V)" = "x1"; then \
            mkhtml_options="$$mkhtml_options --verbose"; \
          fi; \
        fi; \
        gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
          if test "x$(V)" = "x1"; then \
            mkhtml_options="$$mkhtml_options --verbose"; \
          fi; \
        fi; \
        gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
-       if test "$(?)" = "0"; then \
+       if test "$$?" = "0"; then \
          mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
        fi; \
        cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
          mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
        fi; \
        cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
@@ -774,11 +812,11 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
        $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
        $(AM_V_at)touch html-build.stamp
 
        $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
        $(AM_V_at)touch html-build.stamp
 
-pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
        $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
        mkpdf_options=""; \
        gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
        $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
        mkpdf_options=""; \
        gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
-       if test "$(?)" = "0"; then \
+       if test "$$?" = "0"; then \
          if test "x$(V)" = "x1"; then \
            mkpdf_options="$$mkpdf_options --verbose"; \
          fi; \
          if test "x$(V)" = "x1"; then \
            mkpdf_options="$$mkpdf_options --verbose"; \
          fi; \
@@ -803,12 +841,15 @@ clean-local:
        @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
          rm -f $(DOC_MODULE).types; \
        fi
        @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
          rm -f $(DOC_MODULE).types; \
        fi
+       @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \
+         rm -f $(DOC_MODULE)-sections.txt; \
+       fi
 
 distclean-local:
        @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
            $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
        @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
 
 distclean-local:
        @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
            $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
        @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
-           rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
+           rm -f $(SETUP_FILES) $(DOC_MODULE).types; \
        fi
 
 maintainer-clean-local:
        fi
 
 maintainer-clean-local:
index 00113e9..9452a92 100644 (file)
@@ -22,7 +22,7 @@
         source tree is available
         <ulink url="http://cgit.freedesktop.org/harfbuzz/">here</ulink>.
         Also available on
         source tree is available
         <ulink url="http://cgit.freedesktop.org/harfbuzz/">here</ulink>.
         Also available on
-        <ulink url="https://github.com/behdad/harfbuzz">github</ulink>.
+        <ulink url="https://github.com/harfbuzz/harfbuzz">github</ulink>.
         See <xref linkend="download" endterm="download.title"/> for release tarballs.
       </para>
       <para>
         See <xref linkend="download" endterm="download.title"/> for release tarballs.
       </para>
       <para>
@@ -60,7 +60,7 @@
     </partinfo>
     <title>Reference manual</title>
       <chapter>
     </partinfo>
     <title>Reference manual</title>
       <chapter>
-        <title>Harfbuzz API</title>
+        <title>HarfBuzz API</title>
         <xi:include href="xml/hb.xml"/>
         <xi:include href="xml/hb-common.xml"/>
         <xi:include href="xml/hb-unicode.xml"/>
         <xi:include href="xml/hb.xml"/>
         <xi:include href="xml/hb-common.xml"/>
         <xi:include href="xml/hb-unicode.xml"/>
         <title>Index of new symbols in 1.3.3</title>
         <xi:include href="xml/api-index-1.3.3.xml"><xi:fallback /></xi:include>
       </index>
         <title>Index of new symbols in 1.3.3</title>
         <xi:include href="xml/api-index-1.3.3.xml"><xi:fallback /></xi:include>
       </index>
+      <index id="api-index-1-4-2" role="1.4.2">
+        <title>Index of new symbols in 1.4.2</title>
+        <xi:include href="xml/api-index-1.4.2.xml"><xi:fallback /></xi:include>
+      </index>
+      <index id="api-index-1-4-3" role="1.4.3">
+        <title>Index of new symbols in 1.4.3</title>
+        <xi:include href="xml/api-index-1.4.3.xml"><xi:fallback /></xi:include>
+      </index>
+      <index id="api-index-1-5-0" role="1.5.0">
+        <title>Index of new symbols in 1.5.0</title>
+        <xi:include href="xml/api-index-1.5.0.xml"><xi:fallback /></xi:include>
+      </index>
+      <index id="api-index-1-6-0" role="1.6.0">
+        <title>Index of new symbols in 1.6.0</title>
+        <xi:include href="xml/api-index-1.6.0.xml"><xi:fallback /></xi:include>
+      </index>
       <index id="deprecated-api-index" role="deprecated">
         <title>Index of deprecated API</title>
         <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
       <index id="deprecated-api-index" role="deprecated">
         <title>Index of deprecated API</title>
         <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
index fcf4e52..91faa0b 100644 (file)
@@ -9,6 +9,7 @@ HB_EXTERN
 <FILE>hb-blob</FILE>
 hb_blob_create
 hb_blob_create_sub_blob
 <FILE>hb-blob</FILE>
 hb_blob_create
 hb_blob_create_sub_blob
+hb_blob_copy_writable_or_fail
 hb_blob_destroy
 hb_blob_get_data
 hb_blob_get_data_writable
 hb_blob_destroy
 hb_blob_get_data
 hb_blob_get_data_writable
@@ -41,6 +42,7 @@ hb_buffer_add_utf32
 hb_buffer_add_utf16
 hb_buffer_add_utf8
 hb_buffer_add_latin1
 hb_buffer_add_utf16
 hb_buffer_add_utf8
 hb_buffer_add_latin1
+hb_buffer_append
 hb_buffer_set_content_type
 hb_buffer_get_content_type
 hb_buffer_set_direction
 hb_buffer_set_content_type
 hb_buffer_get_content_type
 hb_buffer_set_direction
@@ -77,9 +79,12 @@ hb_buffer_serialize_format_to_string
 hb_buffer_serialize_list_formats
 hb_segment_properties_equal
 hb_segment_properties_hash
 hb_buffer_serialize_list_formats
 hb_segment_properties_equal
 hb_segment_properties_hash
+hb_buffer_diff
 hb_buffer_set_message_func
 hb_buffer_t
 hb_buffer_set_message_func
 hb_buffer_t
+hb_glyph_info_get_glyph_flags
 hb_glyph_info_t
 hb_glyph_info_t
+hb_glyph_flags_t
 hb_glyph_position_t
 hb_buffer_content_type_t
 hb_buffer_flags_t
 hb_glyph_position_t
 hb_buffer_content_type_t
 hb_buffer_flags_t
@@ -87,6 +92,7 @@ hb_buffer_cluster_level_t
 hb_segment_properties_t
 hb_buffer_serialize_format_t
 hb_buffer_serialize_flags_t
 hb_segment_properties_t
 hb_buffer_serialize_format_t
 hb_buffer_serialize_flags_t
+hb_buffer_diff_flags_t
 hb_buffer_message_func_t
 </SECTION>
 
 hb_buffer_message_func_t
 </SECTION>
 
@@ -146,13 +152,16 @@ HB_BUFFER_SERIALIZE_FLAGS_DEFAULT
 HB_SCRIPT_CANADIAN_ABORIGINAL
 hb_font_funcs_set_glyph_func
 hb_font_get_glyph_func_t
 HB_SCRIPT_CANADIAN_ABORIGINAL
 hb_font_funcs_set_glyph_func
 hb_font_get_glyph_func_t
+hb_set_invert
 </SECTION>
 
 <SECTION>
 <FILE>hb-coretext</FILE>
 </SECTION>
 
 <SECTION>
 <FILE>hb-coretext</FILE>
+HB_CORETEXT_TAG_KERX
 HB_CORETEXT_TAG_MORT
 HB_CORETEXT_TAG_MORX
 hb_coretext_face_create
 HB_CORETEXT_TAG_MORT
 HB_CORETEXT_TAG_MORX
 hb_coretext_face_create
+hb_coretext_font_create
 hb_coretext_face_get_cg_font
 hb_coretext_font_get_ct_font
 </SECTION>
 hb_coretext_face_get_cg_font
 hb_coretext_font_get_ct_font
 </SECTION>
@@ -163,6 +172,7 @@ hb_face_create
 hb_face_create_for_tables
 hb_face_destroy
 hb_face_get_empty
 hb_face_create_for_tables
 hb_face_destroy
 hb_face_get_empty
+hb_face_get_table_tags
 hb_face_get_glyph_count
 hb_face_get_index
 hb_face_get_upem
 hb_face_get_glyph_count
 hb_face_get_index
 hb_face_get_upem
@@ -241,6 +251,7 @@ hb_font_get_nominal_glyph
 hb_font_get_nominal_glyph_func_t
 hb_font_get_parent
 hb_font_get_ppem
 hb_font_get_nominal_glyph_func_t
 hb_font_get_parent
 hb_font_get_ppem
+hb_font_get_ptem
 hb_font_get_scale
 hb_font_get_user_data
 hb_font_get_variation_glyph
 hb_font_get_scale
 hb_font_get_user_data
 hb_font_get_variation_glyph
@@ -251,10 +262,12 @@ hb_font_glyph_to_string
 hb_font_is_immutable
 hb_font_make_immutable
 hb_font_reference
 hb_font_is_immutable
 hb_font_make_immutable
 hb_font_reference
+hb_font_set_face
 hb_font_set_funcs
 hb_font_set_funcs_data
 hb_font_set_parent
 hb_font_set_ppem
 hb_font_set_funcs
 hb_font_set_funcs_data
 hb_font_set_parent
 hb_font_set_ppem
+hb_font_set_ptem
 hb_font_set_scale
 hb_font_set_user_data
 hb_variation_t
 hb_font_set_scale
 hb_font_set_user_data
 hb_variation_t
@@ -283,6 +296,7 @@ hb_ft_face_create_cached
 hb_ft_face_create_referenced
 hb_ft_font_create
 hb_ft_font_create_referenced
 hb_ft_face_create_referenced
 hb_ft_font_create
 hb_ft_font_create_referenced
+hb_ft_font_changed
 hb_ft_font_get_face
 hb_ft_font_set_load_flags
 hb_ft_font_get_load_flags
 hb_ft_font_get_face
 hb_ft_font_set_load_flags
 hb_ft_font_get_load_flags
@@ -302,6 +316,7 @@ hb_glib_blob_create
 HB_GOBJECT_TYPE_BLOB
 HB_GOBJECT_TYPE_BUFFER
 HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE
 HB_GOBJECT_TYPE_BLOB
 HB_GOBJECT_TYPE_BUFFER
 HB_GOBJECT_TYPE_BUFFER_CONTENT_TYPE
+HB_GOBJECT_TYPE_BUFFER_DIFF_FLAGS
 HB_GOBJECT_TYPE_BUFFER_FLAGS
 HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS
 HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT
 HB_GOBJECT_TYPE_BUFFER_FLAGS
 HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FLAGS
 HB_GOBJECT_TYPE_BUFFER_SERIALIZE_FORMAT
@@ -309,10 +324,13 @@ HB_GOBJECT_TYPE_DIRECTION
 HB_GOBJECT_TYPE_FACE
 HB_GOBJECT_TYPE_FONT
 HB_GOBJECT_TYPE_FONT_FUNCS
 HB_GOBJECT_TYPE_FACE
 HB_GOBJECT_TYPE_FONT
 HB_GOBJECT_TYPE_FONT_FUNCS
+HB_GOBJECT_TYPE_GLYPH_FLAGS
 HB_GOBJECT_TYPE_MEMORY_MODE
 HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS
 HB_GOBJECT_TYPE_OT_MATH_CONSTANT
 HB_GOBJECT_TYPE_MEMORY_MODE
 HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS
 HB_GOBJECT_TYPE_OT_MATH_CONSTANT
+HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART
 HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS
 HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART_FLAGS
+HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT
 HB_GOBJECT_TYPE_OT_MATH_KERN
 HB_GOBJECT_TYPE_SCRIPT
 HB_GOBJECT_TYPE_SHAPE_PLAN
 HB_GOBJECT_TYPE_OT_MATH_KERN
 HB_GOBJECT_TYPE_SCRIPT
 HB_GOBJECT_TYPE_SHAPE_PLAN
@@ -328,6 +346,7 @@ HB_GOBJECT_TYPE_SET
 HB_GOBJECT_TYPE_USER_DATA_KEY
 hb_gobject_blob_get_type
 hb_gobject_buffer_content_type_get_type
 HB_GOBJECT_TYPE_USER_DATA_KEY
 hb_gobject_blob_get_type
 hb_gobject_buffer_content_type_get_type
+hb_gobject_buffer_diff_flags_get_type
 hb_gobject_buffer_flags_get_type
 hb_gobject_buffer_get_type
 hb_gobject_buffer_serialize_flags_get_type
 hb_gobject_buffer_flags_get_type
 hb_gobject_buffer_get_type
 hb_gobject_buffer_serialize_flags_get_type
@@ -336,10 +355,13 @@ hb_gobject_direction_get_type
 hb_gobject_face_get_type
 hb_gobject_font_funcs_get_type
 hb_gobject_font_get_type
 hb_gobject_face_get_type
 hb_gobject_font_funcs_get_type
 hb_gobject_font_get_type
+hb_gobject_glyph_flags_get_type
 hb_gobject_memory_mode_get_type
 hb_gobject_ot_layout_glyph_class_get_type
 hb_gobject_ot_math_constant_get_type
 hb_gobject_memory_mode_get_type
 hb_gobject_ot_layout_glyph_class_get_type
 hb_gobject_ot_math_constant_get_type
+hb_gobject_ot_math_glyph_part_get_type
 hb_gobject_ot_math_glyph_part_flags_get_type
 hb_gobject_ot_math_glyph_part_flags_get_type
+hb_gobject_ot_math_glyph_variant_get_type
 hb_gobject_ot_math_kern_get_type
 hb_gobject_script_get_type
 hb_gobject_shape_plan_get_type
 hb_gobject_ot_math_kern_get_type
 hb_gobject_script_get_type
 hb_gobject_shape_plan_get_type
@@ -440,8 +462,11 @@ Xhb_ot_layout_lookup_substitute
 
 <SECTION>
 <FILE>hb-ot-var</FILE>
 
 <SECTION>
 <FILE>hb-ot-var</FILE>
-HB_OT_TAG_avar
-HB_OT_TAG_fvar
+HB_OT_TAG_VAR_AXIS_ITALIC
+HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE
+HB_OT_TAG_VAR_AXIS_SLANT
+HB_OT_TAG_VAR_AXIS_WEIGHT
+HB_OT_TAG_VAR_AXIS_WIDTH
 HB_OT_VAR_NO_AXIS_INDEX
 hb_ot_var_axis_t
 hb_ot_var_has_data
 HB_OT_VAR_NO_AXIS_INDEX
 hb_ot_var_axis_t
 hb_ot_var_has_data
@@ -500,11 +525,12 @@ hb_set_get_population
 hb_set_get_user_data
 hb_set_has
 hb_set_intersect
 hb_set_get_user_data
 hb_set_has
 hb_set_intersect
-hb_set_invert
 hb_set_is_empty
 hb_set_is_equal
 hb_set_next
 hb_set_is_empty
 hb_set_is_equal
 hb_set_next
+hb_set_previous
 hb_set_next_range
 hb_set_next_range
+hb_set_previous_range
 hb_set_reference
 hb_set_set
 hb_set_set_user_data
 hb_set_reference
 hb_set_set
 hb_set_set_user_data
@@ -584,6 +610,8 @@ hb_unicode_script_func_t
 <FILE>hb-uniscribe</FILE>
 hb_uniscribe_font_get_hfont
 hb_uniscribe_font_get_logfontw
 <FILE>hb-uniscribe</FILE>
 hb_uniscribe_font_get_hfont
 hb_uniscribe_font_get_logfontw
+<SUBSECTION Private>
+hb_directwrite_shape_experimental_width
 </SECTION>
 
 <SECTION>
 </SECTION>
 
 <SECTION>
index 0494e23..462211c 100644 (file)
@@ -1,6 +1,7 @@
 hb_gobject_blob_get_type
 hb_gobject_buffer_cluster_level_get_type
 hb_gobject_buffer_content_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_flags_get_type
 hb_gobject_buffer_get_type
 hb_gobject_buffer_serialize_flags_get_type
@@ -10,12 +11,15 @@ hb_gobject_face_get_type
 hb_gobject_feature_get_type
 hb_gobject_font_funcs_get_type
 hb_gobject_font_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_memory_mode_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_glyph_info_get_type
 hb_gobject_glyph_position_get_type
 hb_gobject_memory_mode_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_script_get_type
 hb_gobject_segment_properties_get_type
 hb_gobject_ot_math_kern_get_type
 hb_gobject_script_get_type
 hb_gobject_segment_properties_get_type
index d58d9fc..771d955 100644 (file)
Binary files a/docs/html/HarfBuzz.png and b/docs/html/HarfBuzz.png differ
diff --git a/docs/html/HarfBuzz.svg b/docs/html/HarfBuzz.svg
new file mode 100644 (file)
index 0000000..4e2df25
--- /dev/null
@@ -0,0 +1,277 @@
+<?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>
index 6e5a20e..2d953d3 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>A clustering example for levels 0 and 1: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>A clustering example for levels 0 and 1: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="">
 <link rel="prev" href="clusters.html" title="">
 <link rel="next" href="reordering-in-levels-0-and-1.html" title="Reordering in levels 0 and 1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="">
 <link rel="prev" href="clusters.html" title="">
 <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.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -76,6 +76,6 @@
   </p>
 </div>
 <div class="footer">
   </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 1f82756..dac5fa1 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Adding text to the buffer: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Adding text to the buffer: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="next" href="setting-buffer-properties.html" title="Setting buffer properties">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="next" href="setting-buffer-properties.html" title="Setting buffer properties">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <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="adding-text-to-the-buffer"></a>Adding text to the buffer</h2></div></div></div>
 <p>
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
 <a name="adding-text-to-the-buffer"></a>Adding text to the buffer</h2></div></div></div>
 <p>
-      Now we have a brand new Harfbuzz buffer. Let's start filling it
-      with text! From Harfbuzz's perspective, a buffer is just a stream
+      Now we have a brand new HarfBuzz buffer. Let's start filling it
+      with text! From HarfBuzz's perspective, a buffer is just a stream
       of Unicode codepoints, but your input string is probably in one of
       the standard Unicode character encodings (UTF-8, UTF-16, UTF-32)
     </p>
 </div>
 <div class="footer">
       of Unicode codepoints, but your input string is probably in one of
       the standard Unicode character encodings (UTF-8, UTF-16, UTF-32)
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 46ac722..452944b 100644 (file)
@@ -3,11 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Annotation Glossary: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Annotation Glossary: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="deprecated-api-index.html" title="Index of deprecated API">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="deprecated-api-index.html" title="Index of deprecated API">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <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 @@
 <dd class="glossdef"><p>Don't free data after the code is done.</p></dd>
 </div>
 <div class="footer">
 <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.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 49ac07f..8e20a6e 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.10: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.10: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-8.html" title="Index of new symbols in 0.9.8">
 <link rel="next" href="api-index-0-9-11.html" title="Index of new symbols in 0.9.11">
 <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-8.html" title="Index of new symbols in 0.9.8">
 <link rel="next" href="api-index-0-9-11.html" title="Index of new symbols in 0.9.11">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <dd></dd>
 <a name="idxS"></a><h3 class="title">S</h3>
 <dt>
 <dd></dd>
 <a name="idxS"></a><h3 class="title">S</h3>
 <dt>
-<a class="link" href="harfbuzz-hb-set.html#hb-set-invert" title="hb_set_invert ()">hb_set_invert</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-set-invert" title="hb_set_invert ()">hb_set_invert</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
 </dt>
 <dd></dd>
 </div>
 <div class="footer">
 </dt>
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 2395975..93491db 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.11: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.11: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-10.html" title="Index of new symbols in 0.9.10">
 <link rel="next" href="api-index-0-9-20.html" title="Index of new symbols in 0.9.20">
 <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-10.html" title="Index of new symbols in 0.9.10">
 <link rel="next" href="api-index-0-9-20.html" title="Index of new symbols in 0.9.20">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -29,6 +29,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 63b09e1..b6c781d 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.2: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.2: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-full.html" title="API Index">
 <link rel="next" href="api-index-0-9-5.html" title="Index of new symbols in 0.9.5">
 <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-full.html" title="API Index">
 <link rel="next" href="api-index-0-9-5.html" title="Index of new symbols in 0.9.5">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <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>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ptem" title="hb_font_get_ptem ()">hb_font_get_ptem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-get-scale" title="hb_font_get_scale ()">hb_font_get_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-get-scale" title="hb_font_get_scale ()">hb_font_get_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index d99be33..5e237d7 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.20: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.20: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-11.html" title="Index of new symbols in 0.9.11">
 <link rel="next" href="api-index-0-9-22.html" title="Index of new symbols in 0.9.22">
 <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-11.html" title="Index of new symbols in 0.9.11">
 <link rel="next" href="api-index-0-9-22.html" title="Index of new symbols in 0.9.22">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <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 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 5622d2d..68ce10b 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.22: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.22: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-20.html" title="Index of new symbols in 0.9.20">
 <link rel="next" href="api-index-0-9-28.html" title="Index of new symbols in 0.9.28">
 <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-20.html" title="Index of new symbols in 0.9.20">
 <link rel="next" href="api-index-0-9-28.html" title="Index of new symbols in 0.9.28">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -29,6 +29,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 99487fd..bff8406 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.28: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.28: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-22.html" title="Index of new symbols in 0.9.22">
 <link rel="next" href="api-index-0-9-30.html" title="Index of new symbols in 0.9.30">
 <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-22.html" title="Index of new symbols in 0.9.22">
 <link rel="next" href="api-index-0-9-30.html" title="Index of new symbols in 0.9.30">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -29,6 +29,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 7218a0d..96983c9 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.30: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.30: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-28.html" title="Index of new symbols in 0.9.28">
 <link rel="next" href="api-index-0-9-31.html" title="Index of new symbols in 0.9.31">
 <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-28.html" title="Index of new symbols in 0.9.28">
 <link rel="next" href="api-index-0-9-31.html" title="Index of new symbols in 0.9.31">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -36,6 +36,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index ddfa666..b169c5a 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.31: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.31: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-30.html" title="Index of new symbols in 0.9.30">
 <link rel="next" href="api-index-0-9-38.html" title="Index of new symbols in 0.9.38">
 <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-30.html" title="Index of new symbols in 0.9.30">
 <link rel="next" href="api-index-0-9-38.html" title="Index of new symbols in 0.9.38">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -41,6 +41,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 73297b7..d992efc 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.38: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.38: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-31.html" title="Index of new symbols in 0.9.31">
 <link rel="next" href="api-index-0-9-39.html" title="Index of new symbols in 0.9.39">
 <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-31.html" title="Index of new symbols in 0.9.31">
 <link rel="next" href="api-index-0-9-39.html" title="Index of new symbols in 0.9.39">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <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 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index e93c0fc..af17300 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.39: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.39: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-38.html" title="Index of new symbols in 0.9.38">
 <link rel="next" href="api-index-0-9-41.html" title="Index of new symbols in 0.9.41">
 <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-38.html" title="Index of new symbols in 0.9.38">
 <link rel="next" href="api-index-0-9-41.html" title="Index of new symbols in 0.9.41">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -29,6 +29,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 334bc77..92a80e0 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.41: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.41: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-39.html" title="Index of new symbols in 0.9.39">
 <link rel="next" href="api-index-0-9-42.html" title="Index of new symbols in 0.9.42">
 <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-39.html" title="Index of new symbols in 0.9.39">
 <link rel="next" href="api-index-0-9-42.html" title="Index of new symbols in 0.9.42">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -29,6 +29,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 9ff9faa..fe8cd8c 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.42: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.42: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-41.html" title="Index of new symbols in 0.9.41">
 <link rel="next" href="api-index-1-0-5.html" title="Index of new symbols in 1.0.5">
 <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-41.html" title="Index of new symbols in 0.9.41">
 <link rel="next" href="api-index-1-0-5.html" title="Index of new symbols in 1.0.5">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <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 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 3a1ca0f..f1801c5 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.5: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.5: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-2.html" title="Index of new symbols in 0.9.2">
 <link rel="next" href="api-index-0-9-7.html" title="Index of new symbols in 0.9.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">
 <link rel="next" href="api-index-0-9-7.html" title="Index of new symbols in 0.9.7">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -51,6 +51,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index c5726d0..e6b8ee2 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.7: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.7: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-5.html" title="Index of new symbols in 0.9.5">
 <link rel="next" href="api-index-0-9-8.html" title="Index of new symbols in 0.9.8">
 <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-5.html" title="Index of new symbols in 0.9.5">
 <link rel="next" href="api-index-0-9-8.html" title="Index of new symbols in 0.9.8">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index afd2059..bf22b18 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.8: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 0.9.8: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-7.html" title="Index of new symbols in 0.9.7">
 <link rel="next" href="api-index-0-9-10.html" title="Index of new symbols in 0.9.10">
 <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-7.html" title="Index of new symbols in 0.9.7">
 <link rel="next" href="api-index-0-9-10.html" title="Index of new symbols in 0.9.10">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -29,6 +29,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 8dc856f..805ef95 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 1.0.5: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 1.0.5: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-0-9-42.html" title="Index of new symbols in 0.9.42">
 <link rel="next" href="api-index-1-1-2.html" title="Index of new symbols in 1.1.2">
 <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-42.html" title="Index of new symbols in 0.9.42">
 <link rel="next" href="api-index-1-1-2.html" title="Index of new symbols in 1.1.2">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -37,6 +37,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 2a6df8b..0b57389 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 1.1.2: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 1.1.2: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-1-0-5.html" title="Index of new symbols in 1.0.5">
 <link rel="next" href="api-index-1-1-3.html" title="Index of new symbols in 1.1.3">
 <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-1-0-5.html" title="Index of new symbols in 1.0.5">
 <link rel="next" href="api-index-1-1-3.html" title="Index of new symbols in 1.1.3">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <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 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 4613fc4..6ac7520 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 1.1.3: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 1.1.3: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-1-1-2.html" title="Index of new symbols in 1.1.2">
 <link rel="next" href="api-index-1-2-3.html" title="Index of new symbols in 1.2.3">
 <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-1-1-2.html" title="Index of new symbols in 1.1.2">
 <link rel="next" href="api-index-1-2-3.html" title="Index of new symbols in 1.2.3">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -44,6 +44,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index ac06343..0da0a7b 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 1.2.3: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 1.2.3: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-1-1-3.html" title="Index of new symbols in 1.1.3">
 <link rel="next" href="api-index-1-3-3.html" title="Index of new symbols in 1.3.3">
 <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-1-1-3.html" title="Index of new symbols in 1.1.3">
 <link rel="next" href="api-index-1-3-3.html" title="Index of new symbols in 1.3.3">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -41,6 +41,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 53361a9..c10e208 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 1.3.3: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of new symbols in 1.3.3: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="api-index-1-2-3.html" title="Index of new symbols in 1.2.3">
 <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-1-2-3.html" title="Index of new symbols in 1.2.3">
-<link rel="next" href="deprecated-api-index.html" title="Index of deprecated API">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<link rel="next" href="api-index-1-4-2.html" title="Index of new symbols in 1.4.2">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <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="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="api-index-1-2-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="api-index-1-2-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="deprecated-api-index.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="api-index-1-4-2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="index">
 <div class="titlepage"><div><div><h2 class="title">
 </tr></table>
 <div class="index">
 <div class="titlepage"><div><div><h2 class="title">
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t" title="hb_ot_math_glyph_part_t">hb_ot_math_glyph_part_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+<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>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t" title="hb_ot_math_glyph_variant_t">hb_ot_math_glyph_variant_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+<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>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
@@ -81,6 +81,6 @@
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-4-2.html b/docs/html/api-index-1-4-2.html
new file mode 100644 (file)
index 0000000..facfc1e
--- /dev/null
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.4.2: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-3-3.html" title="Index of new symbols in 1.3.3">
+<link rel="next" href="api-index-1-4-3.html" title="Index of new symbols in 1.4.3">
+<meta name="generator" content="GTK-Doc V1.27.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"><span id="nav_index"><a class="shortcut" href="#idxF">F</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxO">O</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxV">V</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-3-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-4-3.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-4-2"></a>Index of new symbols in 1.4.2</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-var-coords-normalized" title="hb_font_get_var_coords_normalized ()">hb_font_get_var_coords_normalized</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-variations" title="hb_font_set_variations ()">hb_font_set_variations</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-coords-design" title="hb_font_set_var_coords_design ()">hb_font_set_var_coords_design</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-var-coords-normalized" title="hb_font_set_var_coords_normalized ()">hb_font_set_var_coords_normalized</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+hb_ot_var_axis_t, struct in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+hb_ot_var_find_axis, function in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+hb_ot_var_get_axes, function in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+hb_ot_var_get_axis_count, function in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+hb_ot_var_has_data, function in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+hb_ot_var_normalize_coords, function in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+hb_ot_var_normalize_variations, function in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-from-string" title="hb_variation_from_string ()">hb_variation_from_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t">hb_variation_t</a>, struct in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-variation-to-string" title="hb_variation_to_string ()">hb_variation_to_string</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.27.1</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-4-3.html b/docs/html/api-index-1-4-3.html
new file mode 100644 (file)
index 0000000..0cf5823
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.4.3: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-4-2.html" title="Index of new symbols in 1.4.2">
+<link rel="next" href="api-index-1-5-0.html" title="Index of new symbols in 1.5.0">
+<meta name="generator" content="GTK-Doc V1.27.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"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-4-2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-5-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-4-3"></a>Index of new symbols in 1.4.3</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-face" title="hb_font_set_face ()">hb_font_set_face</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.27.1</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-5-0.html b/docs/html/api-index-1-5-0.html
new file mode 100644 (file)
index 0000000..5fb0943
--- /dev/null
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.5.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-4-3.html" title="Index of new symbols in 1.4.3">
+<link rel="next" href="api-index-1-6-0.html" title="Index of new symbols in 1.6.0">
+<meta name="generator" content="GTK-Doc V1.27.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"><span id="nav_index"><a class="shortcut" href="#idxB">B</a>
+                     <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxG">G</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-4-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="api-index-1-6-0.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-5-0"></a>Index of new symbols in 1.5.0</h2></div></div></div>
+<a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="harfbuzz-Buffers.html#hb-buffer-append" title="hb_buffer_append ()">hb_buffer_append</a>, function in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-Buffers.html#hb-buffer-diff" title="hb_buffer_diff ()">hb_buffer_diff</a>, function in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-get-glyph-flags" title="hb_glyph_info_get_glyph_flags ()">hb_glyph_info_get_glyph_flags</a>, function in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.27.1</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/api-index-1-6-0.html b/docs/html/api-index-1-6-0.html
new file mode 100644 (file)
index 0000000..585a60a
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Index of new symbols in 1.6.0: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
+<link rel="home" href="index.html" title="HarfBuzz Manual">
+<link rel="up" href="pt02.html" title="Part II. Reference manual">
+<link rel="prev" href="api-index-1-5-0.html" title="Index of new symbols in 1.5.0">
+<link rel="next" href="deprecated-api-index.html" title="Index of deprecated API">
+<meta name="generator" content="GTK-Doc V1.27.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"><span id="nav_index"><a class="shortcut" href="#idxF">F</a></span></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="api-index-1-5-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="deprecated-api-index.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-1-6-0"></a>Index of new symbols in 1.6.0</h2></div></div></div>
+<a name="idx"></a><a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-table-tags" title="hb_face_get_table_tags ()">hb_face_get_table_tags</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ptem" title="hb_font_set_ptem ()">hb_font_set_ptem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.27.1</div>
+</body>
+</html>
\ No newline at end of file
index d828a66..311bad1 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>API Index: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>API Index: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="object-tree.html" title="Object Hierarchy">
 <link rel="next" href="api-index-0-9-2.html" title="Index of new symbols in 0.9.2">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="object-tree.html" title="Object Hierarchy">
 <link rel="next" href="api-index-0-9-2.html" title="Index of new symbols in 0.9.2">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <a name="api-index-full"></a>API Index</h2></div></div></div>
 <a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
 <dt>
 <a name="api-index-full"></a>API Index</h2></div></div></div>
 <a name="idx"></a><a name="idxB"></a><h3 class="title">B</h3>
 <dt>
+<a class="link" href="harfbuzz-hb-blob.html#hb-blob-copy-writable-or-fail" title="hb_blob_copy_writable_or_fail ()">hb_blob_copy_writable_or_fail</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-blob.html#hb-blob-create" title="hb_blob_create ()">hb_blob_create</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-blob.html#hb-blob-create" title="hb_blob_create ()">hb_blob_create</a>, function in <a class="link" href="harfbuzz-hb-blob.html" title="hb-blob">hb-blob</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-Buffers.html#hb-buffer-append" title="hb_buffer_append ()">hb_buffer_append</a>, function in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-Buffers.html#hb-buffer-clear-contents" title="hb_buffer_clear_contents ()">hb_buffer_clear_contents</a>, function in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-Buffers.html#hb-buffer-clear-contents" title="hb_buffer_clear_contents ()">hb_buffer_clear_contents</a>, function in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-Buffers.html#hb-buffer-diff" title="hb_buffer_diff ()">hb_buffer_diff</a>, function in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-Buffers.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t">hb_buffer_diff_flags_t</a>, enum in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_FLAGS_DEFAULT">HB_BUFFER_FLAGS_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" title="HB_BUFFER_FLAGS_DEFAULT">HB_BUFFER_FLAGS_DEFAULT</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-font-create" title="hb_coretext_font_create ()">hb_coretext_font_create</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-font-get-ct-font" title="hb_coretext_font_get_ct_font ()">hb_coretext_font_get_ct_font</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
 </dt>
 <dd></dd>
 <dt>
 <a class="link" href="harfbuzz-hb-coretext.html#hb-coretext-font-get-ct-font" title="hb_coretext_font_get_ct_font ()">hb_coretext_font_get_ct_font</a>, function in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-KERX:CAPS" title="HB_CORETEXT_TAG_KERX">HB_CORETEXT_TAG_KERX</a>, macro in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORT:CAPS" title="HB_CORETEXT_TAG_MORT">HB_CORETEXT_TAG_MORT</a>, macro in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORT:CAPS" title="HB_CORETEXT_TAG_MORT">HB_CORETEXT_TAG_MORT</a>, macro in <a class="link" href="harfbuzz-hb-coretext.html" title="hb-coretext">hb-coretext</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-table-tags" title="hb_face_get_table_tags ()">hb_face_get_table_tags</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-face.html#hb-face-get-upem" title="hb_face_get_upem ()">hb_face_get_upem</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-face.html#hb-face-get-upem" title="hb_face_get_upem ()">hb_face_get_upem</a>, function in <a class="link" href="harfbuzz-hb-face.html" title="hb-face">hb-face</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ptem" title="hb_font_get_ptem ()">hb_font_get_ptem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-get-scale" title="hb_font_get_scale ()">hb_font_get_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-get-scale" title="hb_font_get_scale ()">hb_font_get_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-face" title="hb_font_set_face ()">hb_font_set_face</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs" title="hb_font_set_funcs ()">hb_font_set_funcs</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs" title="hb_font_set_funcs ()">hb_font_set_funcs</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ptem" title="hb_font_set_ptem ()">hb_font_set_ptem</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-set-scale" title="hb_font_set_scale ()">hb_font_set_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-set-scale" title="hb_font_set_scale ()">hb_font_set_scale</a>, function in <a class="link" href="harfbuzz-hb-font.html" title="hb-font">hb-font</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-changed" title="hb_ft_font_changed ()">hb_ft_font_changed</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create" title="hb_ft_font_create ()">hb_ft_font_create</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-ft.html#hb-ft-font-create" title="hb_ft_font_create ()">hb_ft_font_create</a>, function in <a class="link" href="harfbuzz-hb-ft.html" title="hb-ft">hb-ft</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-Buffers.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t">hb_glyph_flags_t</a>, enum in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-get-glyph-flags" title="hb_glyph_info_get_glyph_flags ()">hb_glyph_info_get_glyph_flags</a>, function in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-t-struct" title="hb_glyph_info_t">hb_glyph_info_t</a>, struct in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-t-struct" title="hb_glyph_info_t">hb_glyph_info_t</a>, struct in <a class="link" href="harfbuzz-Buffers.html" title="Buffers">Buffers</a>
 </dt>
 <dd></dd>
 </dt>
 <dd></dd>
 <dt>
 </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>
 <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>
 <dd></dd>
 <dt>
 </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>
 <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>
 <dd></dd>
 <dt>
 </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>
 <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>
 <dd></dd>
 <dt>
 </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>
 <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>
 <dd></dd>
 <dt>
 </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>
 <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>
 <dd></dd>
 <dt>
 </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-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>
 <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>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t" title="hb_ot_math_glyph_part_t">hb_ot_math_glyph_part_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+<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>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t" title="hb_ot_math_glyph_variant_t">hb_ot_math_glyph_variant_t</a>, struct in <a class="link" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">hb-ot-math</a>
+<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>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+HB_OT_TAG_VAR_AXIS_ITALIC, macro in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE, macro in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+HB_OT_TAG_VAR_AXIS_SLANT, macro in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+HB_OT_TAG_VAR_AXIS_WEIGHT, macro in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
+HB_OT_TAG_VAR_AXIS_WIDTH, macro in hb-ot-var
+</dt>
+<dd></dd>
+<dt>
 hb_ot_var_axis_t, struct in hb-ot-var
 </dt>
 <dd></dd>
 hb_ot_var_axis_t, struct in hb-ot-var
 </dt>
 <dd></dd>
@@ -1583,7 +1687,7 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="harfbuzz-hb-set.html#hb-set-invert" title="hb_set_invert ()">hb_set_invert</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-set-invert" title="hb_set_invert ()">hb_set_invert</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
@@ -1603,6 +1707,14 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
 </dt>
 <dd></dd>
 <dt>
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous" title="hb_set_previous ()">hb_set_previous</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous-range" title="hb_set_previous_range ()">hb_set_previous_range</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="harfbuzz-hb-set.html#hb-set-reference" title="hb_set_reference ()">hb_set_reference</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-set.html#hb-set-reference" title="hb_set_reference ()">hb_set_reference</a>, function in <a class="link" href="harfbuzz-hb-set.html" title="hb-set">hb-set</a>
 </dt>
 <dd></dd>
@@ -1935,6 +2047,6 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
 <dd></dd>
 </div>
 <div class="footer">
 <dd></dd>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 013239c..c5309a6 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Buffers, language, script and direction: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Buffers, language, script and direction: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt01.html" title="Part I. User's manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt01.html" title="Part I. User's manual">
-<link rel="prev" href="hello-harfbuzz.html" title="Hello, Harfbuzz">
+<link rel="prev" href="hello-harfbuzz.html" title="Hello, HarfBuzz">
 <link rel="next" href="adding-text-to-the-buffer.html" title="Adding text to the buffer">
 <link rel="next" href="adding-text-to-the-buffer.html" title="Adding text to the buffer">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -30,7 +30,7 @@
 <dt><span class="section"><a href="customizing-unicode-functions.html">Customizing Unicode functions</a></span></dt>
 </dl></div>
 <p>
 <dt><span class="section"><a href="customizing-unicode-functions.html">Customizing Unicode functions</a></span></dt>
 </dl></div>
 <p>
-    The input to Harfbuzz is a series of Unicode characters, stored in a
+    The input to HarfBuzz is a series of Unicode characters, stored in a
     buffer. In this chapter, we'll look at how to set up a buffer with
     the text that we want and then customize the properties of the
     buffer.
     buffer. In this chapter, we'll look at how to set up a buffer with
     the text that we want and then customize the properties of the
     buffer.
@@ -45,7 +45,7 @@
       default values and ready to accept your Unicode strings.
     </p>
 <p>
       default values and ready to accept your Unicode strings.
     </p>
 <p>
-      Harfbuzz manages the memory of objects that it creates (such as
+      HarfBuzz manages the memory of objects that it creates (such as
       buffers), so you don't have to. When you have finished working on
       a buffer, you can call <code class="literal">hb_buffer_destroy()</code>:
     </p>
       buffers), so you don't have to. When you have finished working on
       a buffer, you can call <code class="literal">hb_buffer_destroy()</code>:
     </p>
@@ -57,7 +57,7 @@
 <p>
       This will destroy the object and free its associated memory -
       unless some other part of the program holds a reference to this
 <p>
       This will destroy the object and free its associated memory -
       unless some other part of the program holds a reference to this
-      buffer. If you acquire a Harfbuzz buffer from another subsystem
+      buffer. If you acquire a HarfBuzz buffer from another subsystem
       and want to ensure that it is not garbage collected by someone
       else destroying it, you should increase its reference count:
     </p>
       and want to ensure that it is not garbage collected by someone
       else destroying it, you should increase its reference count:
     </p>
@@ -82,6 +82,6 @@ void somefunc(hb_buffer_t *buffer) {
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 3173586..ea051f9 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Building: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Building: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="install-harfbuzz.html" title="Install Harfbuzz">
-<link rel="prev" href="install-harfbuzz.html" title="Install Harfbuzz">
-<link rel="next" href="hello-harfbuzz.html" title="Hello, Harfbuzz">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<link rel="up" href="install-harfbuzz.html" title="Install HarfBuzz">
+<link rel="prev" href="install-harfbuzz.html" title="Install HarfBuzz">
+<link rel="next" href="hello-harfbuzz.html" title="Hello, HarfBuzz">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -51,7 +51,7 @@
       and hb-shape under <code class="filename">util/</code>.
     </p>
 <p>
       and hb-shape under <code class="filename">util/</code>.
     </p>
 <p>
-      If you are bootstraping from git, you need a few more tools before you
+      If you are bootstrapping from git, you need a few more tools before you
       can run <code class="filename">autogen.sh</code> for the first time. Namely,
       pkg-config and <a class="ulink" href="http://www.complang.org/ragel/" target="_top">ragel</a>.
       Again, on Ubuntu / Debian:
       can run <code class="filename">autogen.sh</code> for the first time. Namely,
       pkg-config and <a class="ulink" href="http://www.complang.org/ragel/" target="_top">ragel</a>.
       Again, on Ubuntu / Debian:
@@ -75,6 +75,6 @@
     </p>
 </div>
 <div class="footer">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 883a101..2de5896 100644 (file)
@@ -2,13 +2,13 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Harfbuzz API: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<title>HarfBuzz API: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="pt02.html" title="Part II. Reference manual">
 <link rel="next" href="harfbuzz-hb.html" title="hb">
 <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.html" title="hb">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -21,7 +21,7 @@
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
-<a name="id-1.3.3"></a>Harfbuzz API</h2></div></div></div>
+<a name="id-1.3.3"></a>HarfBuzz API</h2></div></div></div>
 <div class="toc"><dl class="toc">
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb.html">hb</a></span><span class="refpurpose"></span>
 <div class="toc"><dl class="toc">
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb.html">hb</a></span><span class="refpurpose"></span>
 </dl></div>
 </div>
 <div class="footer">
 </dl></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 7f92278..2b3078f 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt01.html" title="Part I. User's manual">
 <link rel="prev" href="using-your-own-font-functions.html" title="Using your own font functions">
 <link rel="next" href="a-clustering-example-for-levels-0-and-1.html" title="A clustering example for levels 0 and 1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt01.html" title="Part I. User's manual">
 <link rel="prev" href="using-your-own-font-functions.html" title="Using your own font functions">
 <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.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <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 @@
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 103747c..2167383 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Customizing Unicode functions: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Customizing Unicode functions: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="what-about-the-other-scripts.html" title="What about the other scripts?">
 <link rel="next" href="fonts-and-faces.html" title="Fonts and faces">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="what-about-the-other-scripts.html" title="What about the other scripts?">
 <link rel="next" href="fonts-and-faces.html" title="Fonts and faces">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -26,6 +26,6 @@
     </p>
 </div>
 <div class="footer">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 79571bd..fb043a8 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of deprecated API: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Index of deprecated API: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
-<link rel="prev" href="api-index-1-3-3.html" title="Index of new symbols in 1.3.3">
+<link rel="prev" href="api-index-1-6-0.html" title="Index of new symbols in 1.6.0">
 <link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
 <link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -22,7 +22,7 @@
                   <a class="shortcut" href="#idxS">S</a></span></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
                   <a class="shortcut" href="#idxS">S</a></span></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="pt02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="api-index-1-3-3.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="api-index-1-6-0.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="annotation-glossary.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="index">
 <td><a accesskey="n" href="annotation-glossary.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="index">
 <a class="link" href="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" title="HB_SCRIPT_CANADIAN_ABORIGINAL">HB_SCRIPT_CANADIAN_ABORIGINAL</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
 </dt>
 <dd></dd>
 <a class="link" href="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" title="HB_SCRIPT_CANADIAN_ABORIGINAL">HB_SCRIPT_CANADIAN_ABORIGINAL</a>, macro in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
 </dt>
 <dd></dd>
+<dt>
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-set-invert" title="hb_set_invert ()">hb_set_invert</a>, function in <a class="link" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">hb-deprecated</a>
+</dt>
+<dd></dd>
 </div>
 <div class="footer">
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 80488d3..a7abf0e 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Fonts and faces: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Fonts and faces: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt01.html" title="Part I. User's manual">
 <link rel="prev" href="customizing-unicode-functions.html" title="Customizing Unicode functions">
 <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="customizing-unicode-functions.html" title="Customizing Unicode functions">
-<link rel="next" href="using-harfbuzzs-native-opentype-implementation.html" title="Using Harfbuzz's native OpenType implementation">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<link rel="next" href="using-harfbuzzs-native-opentype-implementation.html" title="Using HarfBuzz's native OpenType implementation">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -24,7 +24,7 @@
 <a name="fonts-and-faces"></a>Fonts and faces</h2></div></div></div>
 <div class="toc"><dl class="toc">
 <dt><span class="section"><a href="fonts-and-faces.html#using-freetype">Using FreeType</a></span></dt>
 <a name="fonts-and-faces"></a>Fonts and faces</h2></div></div></div>
 <div class="toc"><dl class="toc">
 <dt><span class="section"><a href="fonts-and-faces.html#using-freetype">Using FreeType</a></span></dt>
-<dt><span class="section"><a href="using-harfbuzzs-native-opentype-implementation.html">Using Harfbuzz's native OpenType implementation</a></span></dt>
+<dt><span class="section"><a href="using-harfbuzzs-native-opentype-implementation.html">Using HarfBuzz's native OpenType implementation</a></span></dt>
 <dt><span class="section"><a href="using-your-own-font-functions.html">Using your own font functions</a></span></dt>
 </dl></div>
 <div class="section">
 <dt><span class="section"><a href="using-your-own-font-functions.html">Using your own font functions</a></span></dt>
 </dl></div>
 <div class="section">
@@ -35,6 +35,6 @@
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index ac633bc..387fa36 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Buffers: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Buffers: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-unicode.html" title="hb-unicode">
 <link rel="next" href="harfbuzz-hb-blob.html" title="hb-blob">
 <link rel="prev" href="harfbuzz-hb-unicode.html" title="hb-unicode">
 <link rel="next" href="harfbuzz-hb-blob.html" title="hb-blob">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-Buffers.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-Buffers.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
+<a class="link" href="harfbuzz-Buffers.html#hb-buffer-append" title="hb_buffer_append ()">hb_buffer_append</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-Buffers.html#hb-buffer-set-content-type" title="hb_buffer_set_content_type ()">hb_buffer_set_content_type</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <a class="link" href="harfbuzz-Buffers.html#hb-buffer-set-content-type" title="hb_buffer_set_content_type ()">hb_buffer_set_content_type</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 </tr>
 <tr>
 <td class="function_type">
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="harfbuzz-Buffers.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t"><span class="returnvalue">hb_buffer_diff_flags_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-Buffers.html#hb-buffer-diff" title="hb_buffer_diff ()">hb_buffer_diff</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 </tr>
 <tr>
 <td class="function_type">
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="harfbuzz-Buffers.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t"><span class="returnvalue">hb_glyph_flags_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-get-glyph-flags" title="hb_glyph_info_get_glyph_flags ()">hb_glyph_info_get_glyph_flags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
 </div>
 <a name="hb-buffer-t"></a><a name="hb-glyph-info-t"></a><a name="hb-glyph-position-t"></a><a name="hb-segment-properties-t"></a><div class="refsect1">
 <a name="harfbuzz-Buffers.other"></a><h2>Types and Values</h2>
 </div>
 <a name="hb-buffer-t"></a><a name="hb-glyph-info-t"></a><a name="hb-glyph-position-t"></a><a name="hb-segment-properties-t"></a><div class="refsect1">
 <a name="harfbuzz-Buffers.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <td class="function_name"><a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-t-struct" title="hb_glyph_info_t">hb_glyph_info_t</a></td>
 </tr>
 <tr>
 <td class="function_name"><a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-t-struct" title="hb_glyph_info_t">hb_glyph_info_t</a></td>
 </tr>
 <tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-Buffers.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t">hb_glyph_flags_t</a></td>
+</tr>
+<tr>
 <td class="datatype_keyword"> </td>
 <td class="function_name"><a class="link" href="harfbuzz-Buffers.html#hb-glyph-position-t-struct" title="hb_glyph_position_t">hb_glyph_position_t</a></td>
 </tr>
 <td class="datatype_keyword"> </td>
 <td class="function_name"><a class="link" href="harfbuzz-Buffers.html#hb-glyph-position-t-struct" title="hb_glyph_position_t">hb_glyph_position_t</a></td>
 </tr>
 <td class="datatype_keyword">enum</td>
 <td class="function_name"><a class="link" href="harfbuzz-Buffers.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t">hb_buffer_serialize_flags_t</a></td>
 </tr>
 <td class="datatype_keyword">enum</td>
 <td class="function_name"><a class="link" href="harfbuzz-Buffers.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t">hb_buffer_serialize_flags_t</a></td>
 </tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="harfbuzz-Buffers.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t">hb_buffer_diff_flags_t</a></td>
+</tr>
 </tbody>
 </table></div>
 </div>
 </tbody>
 </table></div>
 </div>
     <span class="lineart">├──</span> hb_buffer_content_type_t
     <span class="lineart">╰──</span> hb_buffer_serialize_format_t
     <a href="/home/behdad/.local/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
     <span class="lineart">├──</span> hb_buffer_content_type_t
     <span class="lineart">╰──</span> hb_buffer_serialize_format_t
     <a href="/home/behdad/.local/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_flags_t
-    <span class="lineart">╰──</span> hb_buffer_serialize_flags_t
+    <span class="lineart">├──</span> hb_buffer_serialize_flags_t
+    <span class="lineart">╰──</span> hb_glyph_flags_t
 </pre>
 </div>
 <div class="refsect1">
 </pre>
 </div>
 <div class="refsect1">
@@ -566,7 +600,7 @@ being destroyed until a matching call to <a class="link" href="harfbuzz-Buffers.
 <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-reference.parameters"></a><h4>Parameters</h4>
 <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-reference.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -612,7 +646,7 @@ Decreases the reference count on <em class="parameter"><code>buffer</code></em>
 <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-destroy.parameters"></a><h4>Parameters</h4>
 <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-destroy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -636,7 +670,7 @@ hb_buffer_reset (<em class="parameter"><code><a class="link" href="harfbuzz-Buff
 with <a class="link" href="harfbuzz-Buffers.html#hb-buffer-create" title="hb_buffer_create ()"><code class="function">hb_buffer_create()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-reset.parameters"></a><h4>Parameters</h4>
 with <a class="link" href="harfbuzz-Buffers.html#hb-buffer-create" title="hb_buffer_create ()"><code class="function">hb_buffer_create()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-reset.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -660,7 +694,7 @@ hb_buffer_clear_contents (<em class="parameter"><code><a class="link" href="harf
 the replacement code point.</p>
 <div class="refsect3">
 <a name="hb-buffer-clear-contents.parameters"></a><h4>Parameters</h4>
 the replacement code point.</p>
 <div class="refsect3">
 <a name="hb-buffer-clear-contents.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -686,7 +720,7 @@ hb_buffer_pre_allocate (<em class="parameter"><code><a class="link" href="harfbu
  number of items.</p>
 <div class="refsect3">
 <a name="hb-buffer-pre-allocate.parameters"></a><h4>Parameters</h4>
  number of items.</p>
 <div class="refsect3">
 <a name="hb-buffer-pre-allocate.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -721,7 +755,7 @@ hb_buffer_allocation_successful (<em class="parameter"><code><a class="link" hre
 <p>Check if allocating memory for the buffer succeeded.</p>
 <div class="refsect3">
 <a name="hb-buffer-allocation-successful.parameters"></a><h4>Parameters</h4>
 <p>Check if allocating memory for the buffer succeeded.</p>
 <div class="refsect3">
 <a name="hb-buffer-allocation-successful.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -761,7 +795,7 @@ character in the input text stream and are output in
 caller to ensure it is a valid Unicode code point.</p>
 <div class="refsect3">
 <a name="hb-buffer-add.parameters"></a><h4>Parameters</h4>
 caller to ensure it is a valid Unicode code point.</p>
 <div class="refsect3">
 <a name="hb-buffer-add.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -819,7 +853,7 @@ marks at stat of run.</p>
 to ensure it contains a valid Unicode code points.</p>
 <div class="refsect3">
 <a name="hb-buffer-add-codepoints.parameters"></a><h4>Parameters</h4>
 to ensure it contains a valid Unicode code points.</p>
 <div class="refsect3">
 <a name="hb-buffer-add-codepoints.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -833,7 +867,7 @@ to ensure it contains a valid Unicode code points.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
-<td class="parameter_description"><p> an array of Unicode code points to append. </p></td>
+<td class="parameter_description"><p>an array of Unicode code points to append. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
 </tr>
 <tr>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
 </tr>
 <tr>
@@ -876,7 +910,7 @@ hb_buffer_add_utf32 (<em class="parameter"><code><a class="link" href="harfbuzz-
 see <a class="link" href="harfbuzz-Buffers.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-add-utf32.parameters"></a><h4>Parameters</h4>
 see <a class="link" href="harfbuzz-Buffers.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-add-utf32.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -890,7 +924,7 @@ see <a class="link" href="harfbuzz-Buffers.html#hb-buffer-set-replacement-codepo
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
-<td class="parameter_description"><p> an array of UTF-32 characters to append. </p></td>
+<td class="parameter_description"><p>an array of UTF-32 characters to append. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
 </tr>
 <tr>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
 </tr>
 <tr>
@@ -933,7 +967,7 @@ hb_buffer_add_utf16 (<em class="parameter"><code><a class="link" href="harfbuzz-
 see <a class="link" href="harfbuzz-Buffers.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-add-utf16.parameters"></a><h4>Parameters</h4>
 see <a class="link" href="harfbuzz-Buffers.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-add-utf16.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -947,7 +981,7 @@ see <a class="link" href="harfbuzz-Buffers.html#hb-buffer-set-replacement-codepo
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
-<td class="parameter_description"><p> an array of UTF-16 characters to append. </p></td>
+<td class="parameter_description"><p>an array of UTF-16 characters to append. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
 </tr>
 <tr>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></td>
 </tr>
 <tr>
@@ -990,7 +1024,7 @@ hb_buffer_add_utf8 (<em class="parameter"><code><a class="link" href="harfbuzz-B
 see <a class="link" href="harfbuzz-Buffers.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-add-utf8.parameters"></a><h4>Parameters</h4>
 see <a class="link" href="harfbuzz-Buffers.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-add-utf8.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1004,7 +1038,7 @@ see <a class="link" href="harfbuzz-Buffers.html#hb-buffer-set-replacement-codepo
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
-<td class="parameter_description"><p> an array of UTF-8
+<td class="parameter_description"><p>an array of UTF-8
 characters to append. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
 characters to append. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
@@ -1047,7 +1081,7 @@ Unicode code points that can fit in 8-bit strings.</p>
 <div class="note">Has nothing to do with non-Unicode Latin-1 encoding.</div>
 <div class="refsect3">
 <a name="hb-buffer-add-latin1.parameters"></a><h4>Parameters</h4>
 <div class="note">Has nothing to do with non-Unicode Latin-1 encoding.</div>
 <div class="refsect3">
 <a name="hb-buffer-add-latin1.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1061,7 +1095,7 @@ Unicode code points that can fit in 8-bit strings.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>text</p></td>
-<td class="parameter_description"><p> an array of UTF-8
+<td class="parameter_description"><p>an array of UTF-8
 characters to append. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
 characters to append. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
@@ -1092,6 +1126,49 @@ end of <em class="parameter"><code>text</code></em>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <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-Buffers.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                  <em class="parameter"><code><a class="link" href="harfbuzz-Buffers.html#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>
+<div class="refsect3">
+<a name="hb-buffer-append.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>an <a class="link" href="harfbuzz-Buffers.html#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-Buffers.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>start</p></td>
+<td class="parameter_description"><p>start index into source buffer to copy.  Use 0 to copy from start of buffer.</p></td>
+<td class="parameter_annotations"> </td>
+</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_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-5-0.html#api-index-1.5.0">1.5.0</a></p>
+</div>
+<hr>
+<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-Buffers.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
 <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-Buffers.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
@@ -1101,7 +1178,7 @@ hb_buffer_set_content_type (<em class="parameter"><code><a class="link" href="ha
 characters (before shaping) or glyphs (the result of shaping).</p>
 <div class="refsect3">
 <a name="hb-buffer-set-content-type.parameters"></a><h4>Parameters</h4>
 characters (before shaping) or glyphs (the result of shaping).</p>
 <div class="refsect3">
 <a name="hb-buffer-set-content-type.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1131,7 +1208,7 @@ hb_buffer_get_content_type (<em class="parameter"><code><a class="link" href="ha
 <p>see <a class="link" href="harfbuzz-Buffers.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>
 <p>see <a class="link" href="harfbuzz-Buffers.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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1167,7 +1244,7 @@ the same as keeping the text in logical order and shaping with RTL
 direction.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-direction.parameters"></a><h4>Parameters</h4>
 direction.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-direction.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1198,7 +1275,7 @@ hb_buffer_get_direction (<em class="parameter"><code><a class="link" href="harfb
 <p>See <a class="link" href="harfbuzz-Buffers.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>
 <p>See <a class="link" href="harfbuzz-Buffers.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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1235,7 +1312,7 @@ to be applied.</p>
 corresponding script from an ISO 15924 script tag.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-script.parameters"></a><h4>Parameters</h4>
 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 width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1265,7 +1342,7 @@ hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz
 <p>See <a class="link" href="harfbuzz-Buffers.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>
 <p>See <a class="link" href="harfbuzz-Buffers.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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1302,7 +1379,7 @@ different concepts and should not be confused with each other.</p>
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1332,7 +1409,7 @@ hb_buffer_get_language (<em class="parameter"><code><a class="link" href="harfbu
 <p>See <a class="link" href="harfbuzz-Buffers.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>
 <p>See <a class="link" href="harfbuzz-Buffers.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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1363,7 +1440,7 @@ hb_buffer_set_flags (<em class="parameter"><code><a class="link" href="harfbuzz-
 . See <a class="link" href="harfbuzz-Buffers.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="type">hb_buffer_flags_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-flags.parameters"></a><h4>Parameters</h4>
 . See <a class="link" href="harfbuzz-Buffers.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="type">hb_buffer_flags_t</span></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-flags.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1393,7 +1470,7 @@ hb_buffer_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-
 <p>See <a class="link" href="harfbuzz-Buffers.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>
 <p>See <a class="link" href="harfbuzz-Buffers.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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1421,7 +1498,7 @@ hb_buffer_set_cluster_level (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><a class="link" href="harfbuzz-Buffers.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>
                              <em class="parameter"><code><a class="link" href="harfbuzz-Buffers.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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1443,7 +1520,7 @@ hb_buffer_set_cluster_level (<em class="parameter"><code><a class="link" href="h
 hb_buffer_get_cluster_level (<em class="parameter"><code><a class="link" href="harfbuzz-Buffers.html#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>
 hb_buffer_get_cluster_level (<em class="parameter"><code><a class="link" href="harfbuzz-Buffers.html#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 width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1468,7 +1545,7 @@ hb_buffer_set_length (<em class="parameter"><code><a class="link" href="harfbuzz
 end.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-length.parameters"></a><h4>Parameters</h4>
 end.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-length.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1504,7 +1581,7 @@ hb_buffer_get_length (<em class="parameter"><code><a class="link" href="harfbuzz
 <p>Returns the number of items in the buffer.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-length.parameters"></a><h4>Parameters</h4>
 <p>Returns the number of items in the buffer.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-length.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1536,7 +1613,7 @@ hb_buffer_set_segment_properties (<em class="parameter"><code><a class="link" hr
 <a class="link" href="harfbuzz-Buffers.html#hb-buffer-set-language" title="hb_buffer_set_language ()"><code class="function">hb_buffer_set_language()</code></a> individually.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-segment-properties.parameters"></a><h4>Parameters</h4>
 <a class="link" href="harfbuzz-Buffers.html#hb-buffer-set-language" title="hb_buffer_set_language ()"><code class="function">hb_buffer_set_language()</code></a> individually.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-segment-properties.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1569,7 +1646,7 @@ hb_buffer_get_segment_properties (<em class="parameter"><code><a class="link" hr
 .</p>
 <div class="refsect3">
 <a name="hb-buffer-get-segment-properties.parameters"></a><h4>Parameters</h4>
 .</p>
 <div class="refsect3">
 <a name="hb-buffer-get-segment-properties.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1583,7 +1660,7 @@ hb_buffer_get_segment_properties (<em class="parameter"><code><a class="link" hr
 </tr>
 <tr>
 <td class="parameter_name"><p>props</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>props</p></td>
-<td class="parameter_description"><p> the output <a class="link" href="harfbuzz-Buffers.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-Buffers.html#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>
 <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>
@@ -1601,8 +1678,8 @@ contents.  If buffer is not empty, it must have content type
 <a class="link" href="harfbuzz-Buffers.html#HB-BUFFER-CONTENT-TYPE-UNICODE:CAPS"><code class="literal">HB_BUFFER_CONTENT_TYPE_UNICODE</code></a>.</p>
 <p>If buffer script is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-INVALID:CAPS"><code class="literal">HB_SCRIPT_INVALID</code></a>), it
 will be set to the Unicode script of the first character in
 <a class="link" href="harfbuzz-Buffers.html#HB-BUFFER-CONTENT-TYPE-UNICODE:CAPS"><code class="literal">HB_BUFFER_CONTENT_TYPE_UNICODE</code></a>.</p>
 <p>If buffer script is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-INVALID:CAPS"><code class="literal">HB_SCRIPT_INVALID</code></a>), it
 will be set to the Unicode script of the first character in
-the buffer that has a script other than <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-COMMON:CAPS"><code class="literal">HB_SCRIPT_COMMON</code></a>,
-<a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-INHERITED:CAPS"><code class="literal">HB_SCRIPT_INHERITED</code></a>, and <a class="link" href="harfbuzz-hb-common.html#HB-SCRIPT-UNKNOWN:CAPS"><code class="literal">HB_SCRIPT_UNKNOWN</code></a>.</p>
+the buffer that has a script other than <a href="harfbuzz-hb-common.html#HB-SCRIPT-COMMON:CAPS"><code class="literal">HB_SCRIPT_COMMON</code></a>,
+<a href="harfbuzz-hb-common.html#HB-SCRIPT-INHERITED:CAPS"><code class="literal">HB_SCRIPT_INHERITED</code></a>, and <a href="harfbuzz-hb-common.html#HB-SCRIPT-UNKNOWN:CAPS"><code class="literal">HB_SCRIPT_UNKNOWN</code></a>.</p>
 <p>Next, if buffer direction is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"><code class="literal">HB_DIRECTION_INVALID</code></a>),
 it will be set to the natural horizontal direction of the
 buffer script as returned by <a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()"><code class="function">hb_script_get_horizontal_direction()</code></a>.</p>
 <p>Next, if buffer direction is not set (ie. is <a class="link" href="harfbuzz-hb-common.html#HB-DIRECTION-INVALID:CAPS"><code class="literal">HB_DIRECTION_INVALID</code></a>),
 it will be set to the natural horizontal direction of the
 buffer script as returned by <a class="link" href="harfbuzz-hb-common.html#hb-script-get-horizontal-direction" title="hb_script_get_horizontal_direction ()"><code class="function">hb_script_get_horizontal_direction()</code></a>.</p>
@@ -1612,7 +1689,7 @@ it will be set to the process's default language as returned by
 taking buffer script into consideration when choosing a language.</p>
 <div class="refsect3">
 <a name="hb-buffer-guess-segment-properties.parameters"></a><h4>Parameters</h4>
 taking buffer script into consideration when choosing a language.</p>
 <div class="refsect3">
 <a name="hb-buffer-guess-segment-properties.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1635,7 +1712,7 @@ hb_buffer_set_unicode_funcs (<em class="parameter"><code><a class="link" href="h
                              <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>
 <div class="refsect3">
 <a name="hb-buffer-set-unicode-funcs.parameters"></a><h4>Parameters</h4>
                              <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>
 <div class="refsect3">
 <a name="hb-buffer-set-unicode-funcs.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1657,7 +1734,7 @@ hb_buffer_set_unicode_funcs (<em class="parameter"><code><a class="link" href="h
 hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-Buffers.html#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>
 hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-Buffers.html#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 width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1684,7 +1761,7 @@ hb_buffer_set_user_data (<em class="parameter"><code><a class="link" href="harfb
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-buffer-set-user-data.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-buffer-set-user-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1708,7 +1785,7 @@ hb_buffer_get_user_data (<em class="parameter"><code><a class="link" href="harfb
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1735,7 +1812,7 @@ is valid as long as <em class="parameter"><code>buffer</code></em>
  contents are not modified.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-glyph-infos.parameters"></a><h4>Parameters</h4>
  contents are not modified.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-glyph-infos.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1749,7 +1826,7 @@ is valid as long as <em class="parameter"><code>buffer</code></em>
 </tr>
 <tr>
 <td class="parameter_name"><p>length</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>length</p></td>
-<td class="parameter_description"><p> output array length. </p></td>
+<td class="parameter_description"><p>output array length. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 <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>
@@ -1776,7 +1853,7 @@ is valid as long as <em class="parameter"><code>buffer</code></em>
  contents are not modified.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-glyph-positions.parameters"></a><h4>Parameters</h4>
  contents are not modified.</p>
 <div class="refsect3">
 <a name="hb-buffer-get-glyph-positions.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1790,7 +1867,7 @@ is valid as long as <em class="parameter"><code>buffer</code></em>
 </tr>
 <tr>
 <td class="parameter_name"><p>length</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>length</p></td>
-<td class="parameter_description"><p> output length. </p></td>
+<td class="parameter_description"><p>output length. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 <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>
@@ -1817,7 +1894,7 @@ when adding text to <em class="parameter"><code>buffer</code></em>
 <p>Default is <a class="link" href="harfbuzz-Buffers.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" title="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT"><code class="literal">HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-replacement-codepoint.parameters"></a><h4>Parameters</h4>
 <p>Default is <a class="link" href="harfbuzz-Buffers.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" title="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT"><code class="literal">HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-set-replacement-codepoint.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1847,7 +1924,7 @@ hb_buffer_get_replacement_codepoint (<em class="parameter"><code><a class="link"
 <p>See <a class="link" href="harfbuzz-Buffers.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>
 <p>See <a class="link" href="harfbuzz-Buffers.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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1877,7 +1954,7 @@ The resulting clusters should behave identical to pre-reordering clusters.</p>
 <div class="note">This has nothing to do with Unicode normalization.</div>
 <div class="refsect3">
 <a name="hb-buffer-normalize-glyphs.parameters"></a><h4>Parameters</h4>
 <div class="note">This has nothing to do with Unicode normalization.</div>
 <div class="refsect3">
 <a name="hb-buffer-normalize-glyphs.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1900,7 +1977,7 @@ hb_buffer_reverse (<em class="parameter"><code><a class="link" href="harfbuzz-Bu
 <p>Reverses buffer contents.</p>
 <div class="refsect3">
 <a name="hb-buffer-reverse.parameters"></a><h4>Parameters</h4>
 <p>Reverses buffer contents.</p>
 <div class="refsect3">
 <a name="hb-buffer-reverse.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1925,7 +2002,7 @@ hb_buffer_reverse_range (<em class="parameter"><code><a class="link" href="harfb
 <p>Reverses buffer contents between start to end.</p>
 <div class="refsect3">
 <a name="hb-buffer-reverse-range.parameters"></a><h4>Parameters</h4>
 <p>Reverses buffer contents between start to end.</p>
 <div class="refsect3">
 <a name="hb-buffer-reverse-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1962,7 +2039,7 @@ reversed, then each cluster (consecutive items having the
 same cluster number) are reversed again.</p>
 <div class="refsect3">
 <a name="hb-buffer-reverse-clusters.parameters"></a><h4>Parameters</h4>
 same cluster number) are reversed again.</p>
 <div class="refsect3">
 <a name="hb-buffer-reverse-clusters.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1995,7 +2072,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">
 useful for showing the contents of the buffer, for example during debugging.
 There are currently two supported serialization formats:</p>
 <div class="refsect3">
-<a name="id-1.3.3.5.12.45.5"></a><h4>text</h4>
+<a name="id-1.3.3.5.12.46.5"></a><h4>text</h4>
 <p>A human-readable, plain text format.
 The serialized glyphs will look something like:</p>
 <p><code class="literal">
 <p>A human-readable, plain text format.
 The serialized glyphs will look something like:</p>
 <p><code class="literal">
@@ -2018,18 +2095,18 @@ The serialized glyphs will look something like:</p>
 </li>
 <li class="listitem"><p>If <a class="link" href="harfbuzz-Buffers.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-EXTENTS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS</span></a> is set, the
 <span class="type">hb_glyph_extents_t</span> in the format
 </li>
 <li class="listitem"><p>If <a class="link" href="harfbuzz-Buffers.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-EXTENTS:CAPS"><span class="type">HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS</span></a> is set, the
 <span class="type">hb_glyph_extents_t</span> in the format
-<code class="literal">&lt;x_bearing,y_bearing,width,height&gt;</code></p></li>
+<code class="literal">&amp;lt;x_bearing,y_bearing,width,height&amp;gt;</code></p></li>
 </ul></div>
 </li>
 </ul></div>
 </div>
 <div class="refsect3">
 </ul></div>
 </li>
 </ul></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.3.5.12.45.6"></a><h4>json</h4>
+<a name="id-1.3.3.5.12.46.6"></a><h4>json</h4>
 <p>TODO.</p>
 </div>
 <div class="refsect3">
 <a name="hb-buffer-serialize-glyphs.parameters"></a><h4>Parameters</h4>
 <p>TODO.</p>
 </div>
 <div class="refsect3">
 <a name="hb-buffer-serialize-glyphs.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2055,7 +2132,7 @@ to serialize.</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>buf</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>buf</p></td>
-<td class="parameter_description"><p> output string to
+<td class="parameter_description"><p>output string to
 write serialized buffer into. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=buf_size][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
 write serialized buffer into. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=buf_size][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
@@ -2067,13 +2144,13 @@ write serialized buffer into. </p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>buf_consumed</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 <code class="literal">NULL</code>, will be set to the number of byes written into <em class="parameter"><code>buf</code></em>
 . </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>font</p></td>
 . </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL 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
+<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_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>
 read glyph names and extents. If <code class="literal">NULL</code>, and empty font will be used. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
@@ -2109,7 +2186,7 @@ hb_buffer_deserialize_glyphs (<em class="parameter"><code><a class="link" href="
                               <em class="parameter"><code><a class="link" href="harfbuzz-Buffers.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>
                               <em class="parameter"><code><a class="link" href="harfbuzz-Buffers.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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2149,7 +2226,7 @@ hb_buffer_serialize_format_from_string
 <a class="link" href="harfbuzz-Buffers.html#hb-buffer-serialize-list-formats" title="hb_buffer_serialize_list_formats ()"><code class="function">hb_buffer_serialize_list_formats()</code></a> to get the list of supported formats.</p>
 <div class="refsect3">
 <a name="hb-buffer-serialize-format-from-string.parameters"></a><h4>Parameters</h4>
 <a class="link" href="harfbuzz-Buffers.html#hb-buffer-serialize-list-formats" title="hb_buffer_serialize_list_formats ()"><code class="function">hb_buffer_serialize_list_formats()</code></a> to get the list of supported formats.</p>
 <div class="refsect3">
 <a name="hb-buffer-serialize-format-from-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2158,7 +2235,7 @@ hb_buffer_serialize_format_from_string
 <tbody>
 <tr>
 <td class="parameter_name"><p>str</p></td>
 <tbody>
 <tr>
 <td class="parameter_name"><p>str</p></td>
-<td class="parameter_description"><p> a string to parse. </p></td>
+<td class="parameter_description"><p>a string to parse. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
 <tr>
 <td class="parameter_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>
@@ -2186,7 +2263,7 @@ hb_buffer_serialize_format_to_string (<em class="parameter"><code><a class="link
 <a class="link" href="harfbuzz-Buffers.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>
 <a class="link" href="harfbuzz-Buffers.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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2229,7 +2306,7 @@ hb_segment_properties_equal (<em class="parameter"><code>const <a class="link" h
 <p>Checks the equality of two <a class="link" href="harfbuzz-Buffers.html#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>
 <p>Checks the equality of two <a class="link" href="harfbuzz-Buffers.html#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 width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2266,7 +2343,7 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 .</p>
 <div class="refsect3">
 <a name="hb-segment-properties-hash.parameters"></a><h4>Parameters</h4>
 .</p>
 <div class="refsect3">
 <a name="hb-segment-properties-hash.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2288,6 +2365,19 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-buffer-diff"></a><h3>hb_buffer_diff ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-Buffers.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-Buffers.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
+                <em class="parameter"><code><a class="link" href="harfbuzz-Buffers.html#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-Buffers.html#HB-BUFFER-DIFF-FLAG-DOTTED-CIRCLE-PRESENT:CAPS"><code class="literal">HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT</code></a>
+and <a class="link" href="harfbuzz-Buffers.html#HB-BUFFER-DIFF-FLAG-NOTDEF-PRESENT:CAPS"><code class="literal">HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT</code></a> are never returned.  This should be used by most
+callers if just comparing two buffers is needed.</p>
+<p class="since">Since: <a class="link" href="api-index-1-5-0.html#api-index-1.5.0">1.5.0</a></p>
+</div>
+<hr>
+<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-Buffers.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
 <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-Buffers.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
@@ -2296,7 +2386,7 @@ hb_buffer_set_message_func (<em class="parameter"><code><a class="link" href="ha
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-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">
 <a name="hb-buffer-set-message-func.parameters"></a><h4>Parameters</h4>
                             <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">
 <a name="hb-buffer-set-message-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2320,6 +2410,34 @@ hb_buffer_set_message_func (<em class="parameter"><code><a class="link" href="ha
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-glyph-info-get-glyph-flags"></a><h3>hb_glyph_info_get_glyph_flags ()</h3>
+<pre class="programlisting"><a class="link" href="harfbuzz-Buffers.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t"><span class="returnvalue">hb_glyph_flags_t</span></a>
+hb_glyph_info_get_glyph_flags (<em class="parameter"><code>const <a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-t"><span class="type">hb_glyph_info_t</span></a> *info</code></em>);</pre>
+<p>Returns glyph flags encoded within a <a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-t"><span class="type">hb_glyph_info_t</span></a>.</p>
+<div class="refsect3">
+<a name="hb-glyph-info-get-glyph-flags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<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>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-t"><span class="type">hb_glyph_info_t</span></a>.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-glyph-info-get-glyph-flags.returns"></a><h4>Returns</h4>
+<p>The <a class="link" href="harfbuzz-Buffers.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t"><span class="type">hb_glyph_flags_t</span></a> encoded within <em class="parameter"><code>info</code></em>
+.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-5-0.html#api-index-1.5.0">1.5.0</a></p>
+</div>
+<hr>
+<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-Buffers.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
 <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-Buffers.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
@@ -2356,7 +2474,7 @@ and output glyphs and their information after shaping.</p>
 <a name="hb-glyph-info-t-struct"></a><h3>hb_glyph_info_t</h3>
 <pre class="programlisting">typedef struct {
   hb_codepoint_t codepoint;
 <a name="hb-glyph-info-t-struct"></a><h3>hb_glyph_info_t</h3>
 <pre class="programlisting">typedef struct {
   hb_codepoint_t codepoint;
-  hb_mask_t      mask;
+  hb_mask_t      mask; /* Holds hb_glyph_flags_t after hb_shape(), plus other things. */
   uint32_t       cluster;
 } hb_glyph_info_t;
 </pre>
   uint32_t       cluster;
 } hb_glyph_info_t;
 </pre>
@@ -2364,7 +2482,7 @@ and output glyphs and their information after shaping.</p>
 glyphs and their relation to input text.</p>
 <div class="refsect3">
 <a name="hb-glyph-info-t.members"></a><h4>Members</h4>
 glyphs and their relation to input text.</p>
 <div class="refsect3">
 <a name="hb-glyph-info-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -2404,6 +2522,48 @@ allow selecting more fine-grained cluster handling.</p></td>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
+<a name="hb-glyph-flags-t"></a><h3>enum hb_glyph_flags_t</h3>
+<div class="refsect3">
+<a name="hb-glyph-flags-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-GLYPH-FLAG-UNSAFE-TO-BREAK:CAPS"></a>HB_GLYPH_FLAG_UNSAFE_TO_BREAK</p></td>
+<td class="enum_member_description">
+<p>Indicates that if input text is broken at the
+                                  beginning of the cluster this glyph is part of,
+                                  then both sides need to be re-shaped, as the
+                                  result might be different.  On the flip side,
+                                  it means that when this flag is not present,
+                                  then it's safe to break the glyph-run at the
+                                  beginning of this cluster, and the two sides
+                                  represent the exact same result one would get
+                                  if breaking input text at the beginning of
+                                  this cluster and shaping the two sides
+                                  separately.  This can be used to optimize
+                                  paragraph layout, by avoiding re-shaping
+                                  of each line after line-breaking, or limiting
+                                  the reshaping to a small piece around the
+                                  breaking point only.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-GLYPH-FLAG-DEFINED:CAPS"></a>HB_GLYPH_FLAG_DEFINED</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-glyph-position-t-struct"></a><h3>hb_glyph_position_t</h3>
 <pre class="programlisting">typedef struct {
   hb_position_t  x_advance;
 <a name="hb-glyph-position-t-struct"></a><h3>hb_glyph_position_t</h3>
 <pre class="programlisting">typedef struct {
   hb_position_t  x_advance;
@@ -2417,7 +2577,7 @@ glyph in both horizontal and vertical directions. All positions in
 <a class="link" href="harfbuzz-Buffers.html#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>
 <a class="link" href="harfbuzz-Buffers.html#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 width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -2457,7 +2617,7 @@ should not affect how much the line advances.</p></td>
 <a name="hb-buffer-content-type-t"></a><h3>enum hb_buffer_content_type_t</h3>
 <div class="refsect3">
 <a name="hb-buffer-content-type-t.members"></a><h4>Members</h4>
 <a name="hb-buffer-content-type-t"></a><h3>enum hb_buffer_content_type_t</h3>
 <div class="refsect3">
 <a name="hb-buffer-content-type-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -2494,7 +2654,7 @@ should not affect how much the line advances.</p></td>
 <a name="hb-buffer-flags-t"></a><h3>enum hb_buffer_flags_t</h3>
 <div class="refsect3">
 <a name="hb-buffer-flags-t.members"></a><h4>Members</h4>
 <a name="hb-buffer-flags-t"></a><h3>enum hb_buffer_flags_t</h3>
 <div class="refsect3">
 <a name="hb-buffer-flags-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -2523,7 +2683,7 @@ should not affect how much the line advances.</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
 <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_EOT</code></em>
+                     <em class="parameter"><code>HB_BUFFER_FLAG_BOT</code></em>
 .</p>
 </td>
 <td class="enum_member_annotations"> </td>
 .</p>
 </td>
 <td class="enum_member_annotations"> </td>
@@ -2533,9 +2693,24 @@ should not affect how much the line advances.</p></td>
 <td class="enum_member_description">
 <p>                     flag indication that character with Default_Ignorable
                      Unicode property should use the corresponding glyph
 <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 (currently done
-                     by replacing them with the space glyph and zeroing the
-                     advance width.)</p>
+                     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>
+</tr>
+<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>
+ takes
+                     precedence over this flag. Since: 1.8.0</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
@@ -2549,7 +2724,7 @@ should not affect how much the line advances.</p></td>
 <a name="hb-buffer-cluster-level-t"></a><h3>enum hb_buffer_cluster_level_t</h3>
 <div class="refsect3">
 <a name="hb-buffer-cluster-level-t.members"></a><h4>Members</h4>
 <a name="hb-buffer-cluster-level-t"></a><h3>enum hb_buffer_cluster_level_t</h3>
 <div class="refsect3">
 <a name="hb-buffer-cluster-level-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -2594,7 +2769,7 @@ set and retrieved using <a class="link" href="harfbuzz-Buffers.html#hb-buffer-se
 <a class="link" href="harfbuzz-Buffers.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">
 <a name="hb-segment-properties-t.members"></a><h4>Members</h4>
 <a class="link" href="harfbuzz-Buffers.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">
 <a name="hb-segment-properties-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
 <colgroup>
 <col width="300px" class="struct_members_name">
 <col class="struct_members_description">
@@ -2627,7 +2802,7 @@ set and retrieved using <a class="link" href="harfbuzz-Buffers.html#hb-buffer-se
 <a class="link" href="harfbuzz-Buffers.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()"><code class="function">hb_buffer_serialize_glyphs()</code></a> and <a class="link" href="harfbuzz-Buffers.html#hb-buffer-deserialize-glyphs" title="hb_buffer_deserialize_glyphs ()"><code class="function">hb_buffer_deserialize_glyphs()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-serialize-format-t.members"></a><h4>Members</h4>
 <a class="link" href="harfbuzz-Buffers.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()"><code class="function">hb_buffer_serialize_glyphs()</code></a> and <a class="link" href="harfbuzz-Buffers.html#hb-buffer-deserialize-glyphs" title="hb_buffer_deserialize_glyphs ()"><code class="function">hb_buffer_deserialize_glyphs()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-serialize-format-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -2666,7 +2841,7 @@ set and retrieved using <a class="link" href="harfbuzz-Buffers.html#hb-buffer-se
 <p>Flags that control what glyph information are serialized in <a class="link" href="harfbuzz-Buffers.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()"><code class="function">hb_buffer_serialize_glyphs()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-serialize-flags-t.members"></a><h4>Members</h4>
 <p>Flags that control what glyph information are serialized in <a class="link" href="harfbuzz-Buffers.html#hb-buffer-serialize-glyphs" title="hb_buffer_serialize_glyphs ()"><code class="function">hb_buffer_serialize_glyphs()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-buffer-serialize-flags-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -2708,14 +2883,90 @@ set and retrieved using <a class="link" href="harfbuzz-Buffers.html#hb-buffer-se
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-SERIALIZE-FLAG-GLYPH-FLAGS:CAPS"></a>HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS</p></td>
+<td class="enum_member_description">
+<p>serialize glyph flags. Since: 1.5.0</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<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>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
 </tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-20.html#api-index-0.9.20">0.9.20</a></p>
 </div>
 </tbody>
 </table></div>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-20.html#api-index-0.9.20">0.9.20</a></p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="hb-buffer-diff-flags-t"></a><h3>enum hb_buffer_diff_flags_t</h3>
+<div class="refsect3">
+<a name="hb-buffer-diff-flags-t.members"></a><h4>Members</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-EQUAL:CAPS"></a>HB_BUFFER_DIFF_FLAG_EQUAL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-CONTENT-TYPE-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-LENGTH-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-NOTDEF-PRESENT:CAPS"></a>HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-DOTTED-CIRCLE-PRESENT:CAPS"></a>HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-CODEPOINT-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-CLUSTER-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-GLYPH-FLAGS-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="HB-BUFFER-DIFF-FLAG-POSITION-MISMATCH:CAPS"></a>HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index abb5356..a50c761 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Shaping: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Shaping: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-font.html" title="hb-font">
 <link rel="next" href="harfbuzz-hb-version.html" title="hb-version">
 <link rel="prev" href="harfbuzz-hb-font.html" title="hb-font">
 <link rel="next" href="harfbuzz-hb-version.html" title="hb-version">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-Shaping.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-Shaping.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -84,7 +84,7 @@
 </div>
 <a name="hb-feature-t"></a><div class="refsect1">
 <a name="harfbuzz-Shaping.other"></a><h2>Types and Values</h2>
 </div>
 <a name="hb-feature-t"></a><div class="refsect1">
 <a name="harfbuzz-Shaping.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -125,7 +125,7 @@ hb_feature_from_string (<em class="parameter"><code>const <span class="type">cha
 <p>TODO: document the syntax here.</p>
 <div class="refsect3">
 <a name="hb-feature-from-string.parameters"></a><h4>Parameters</h4>
 <p>TODO: document the syntax here.</p>
 <div class="refsect3">
 <a name="hb-feature-from-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -134,7 +134,7 @@ hb_feature_from_string (<em class="parameter"><code>const <span class="type">cha
 <tbody>
 <tr>
 <td class="parameter_name"><p>str</p></td>
 <tbody>
 <tr>
 <td class="parameter_name"><p>str</p></td>
-<td class="parameter_description"><p> a string to parse. </p></td>
+<td class="parameter_description"><p>a string to parse. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
 <tr>
 <td class="parameter_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>
@@ -145,7 +145,7 @@ hb_feature_from_string (<em class="parameter"><code>const <span class="type">cha
 </tr>
 <tr>
 <td class="parameter_name"><p>feature</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>feature</p></td>
-<td class="parameter_description"><p> the <a class="link" href="harfbuzz-Shaping.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-Shaping.html#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>
 <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>
@@ -171,7 +171,7 @@ allocating big enough size for <em class="parameter"><code>buf</code></em>
 , 128 bytes is more than enough.</p>
 <div class="refsect3">
 <a name="hb-feature-to-string.parameters"></a><h4>Parameters</h4>
 , 128 bytes is more than enough.</p>
 <div class="refsect3">
 <a name="hb-feature-to-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -185,7 +185,7 @@ allocating big enough size for <em class="parameter"><code>buf</code></em>
 </tr>
 <tr>
 <td class="parameter_name"><p>buf</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>buf</p></td>
-<td class="parameter_description"><p> output string. </p></td>
+<td class="parameter_description"><p>output string. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size][<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size][<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
@@ -215,7 +215,7 @@ positioned glyphs. If <em class="parameter"><code>features</code></em>
 features applied during shaping.</p>
 <div class="refsect3">
 <a name="hb-shape.parameters"></a><h4>Parameters</h4>
 features applied during shaping.</p>
 <div class="refsect3">
 <a name="hb-shape.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -234,7 +234,7 @@ features applied during shaping.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>features</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>features</p></td>
-<td class="parameter_description"><p> an array of user
+<td class="parameter_description"><p>an array of user
 specified <a class="link" href="harfbuzz-Shaping.html#hb-feature-t"><span class="type">hb_feature_t</span></a> or <code class="literal">NULL</code>. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
 specified <a class="link" href="harfbuzz-Shaping.html#hb-feature-t"><span class="type">hb_feature_t</span></a> or <code class="literal">NULL</code>. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
@@ -264,7 +264,7 @@ shapers will be used in the given order, otherwise the default shapers list
 will be used.</p>
 <div class="refsect3">
 <a name="hb-shape-full.parameters"></a><h4>Parameters</h4>
 will be used.</p>
 <div class="refsect3">
 <a name="hb-shape-full.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -283,7 +283,7 @@ will be used.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>features</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>features</p></td>
-<td class="parameter_description"><p> an array of user
+<td class="parameter_description"><p>an array of user
 specified <a class="link" href="harfbuzz-Shaping.html#hb-feature-t"><span class="type">hb_feature_t</span></a> or <code class="literal">NULL</code>. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
 specified <a class="link" href="harfbuzz-Shaping.html#hb-feature-t"><span class="type">hb_feature_t</span></a> or <code class="literal">NULL</code>. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=num_features][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
@@ -295,7 +295,7 @@ array</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>shaper_list</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
+<td class="parameter_description"><p>a <code class="literal">NULL</code>-terminated
 array of shapers to use or <code class="literal">NULL</code>. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
 array of shapers to use or <code class="literal">NULL</code>. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
@@ -316,7 +316,7 @@ hb_shape_list_shapers (<em class="parameter"><code><span class="type">void</span
 <p>Retrieves the list of shapers supported by HarfBuzz.</p>
 <div class="refsect3">
 <a name="hb-shape-list-shapers.returns"></a><h4>Returns</h4>
 <p>Retrieves the list of shapers supported by HarfBuzz.</p>
 <div class="refsect3">
 <a name="hb-shape-list-shapers.returns"></a><h4>Returns</h4>
-<p> an array of
+<p>an array of
 constant strings. </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> zero-terminated=1]</span></p>
 </div>
 constant strings. </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> zero-terminated=1]</span></p>
 </div>
@@ -338,6 +338,6 @@ constant strings. </p>
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 6d67692..75a4901 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-blob: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-blob: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-Buffers.html" title="Buffers">
 <link rel="next" href="harfbuzz-hb-face.html" title="hb-face">
 <link rel="prev" href="harfbuzz-Buffers.html" title="Buffers">
 <link rel="next" href="harfbuzz-hb-face.html" title="hb-face">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-blob.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-blob.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 </tr>
 <tr>
 <td class="function_type">
 </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> *
+</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>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 </div>
 <a name="hb-blob-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-blob.other"></a><h2>Types and Values</h2>
 </div>
 <a name="hb-blob-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-blob.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -185,7 +193,7 @@ to negotiate ownership and lifecycle of <em class="parameter"><code>data</code><
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-blob-create.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-blob-create.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -249,7 +257,7 @@ is.</p>
  immutable.</p>
 <div class="refsect3">
 <a name="hb-blob-create-sub-blob.parameters"></a><h4>Parameters</h4>
  immutable.</p>
 <div class="refsect3">
 <a name="hb-blob-create-sub-blob.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -288,10 +296,38 @@ with <a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy" title="hb_blob
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <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>
+<p>Makes a writable copy of <em class="parameter"><code>blob</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-blob-copy-writable-or-fail.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>blob</p></td>
+<td class="parameter_description"><p>A blob.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-blob-copy-writable-or-fail.returns"></a><h4>Returns</h4>
+<p> New blob, or nullptr if allocation failed.</p>
+</div>
+<p class="since">Since: 1.8.0</p>
+</div>
+<hr>
+<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>
 <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>
-<p>Descreases the reference count on <em class="parameter"><code>blob</code></em>
+<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>
 , freeing all memory, possibly calling the destroy-callback the blob
 , and if it reaches zero, destroys
 <em class="parameter"><code>blob</code></em>
 , freeing all memory, possibly calling the destroy-callback the blob
@@ -300,7 +336,7 @@ was created for if it has not been called already.</p>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-blob-destroy.parameters"></a><h4>Parameters</h4>
 <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-destroy.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -323,7 +359,7 @@ hb_blob_get_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
                   <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>
                   <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -362,7 +398,7 @@ return pointer to data.</p>
 fails.</p>
 <div class="refsect3">
 <a name="hb-blob-get-data-writable.parameters"></a><h4>Parameters</h4>
 fails.</p>
 <div class="refsect3">
 <a name="hb-blob-get-data-writable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -376,7 +412,7 @@ fails.</p>
 </tr>
 <tr>
 <td class="parameter_name"><p>length</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>length</p></td>
-<td class="parameter_description"><p> output length of the writable data. </p></td>
+<td class="parameter_description"><p>output length of the writable data. </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>
 <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>
@@ -384,7 +420,7 @@ fails.</p>
 </div>
 <div class="refsect3">
 <a name="hb-blob-get-data-writable.returns"></a><h4>Returns</h4>
 </div>
 <div class="refsect3">
 <a name="hb-blob-get-data-writable.returns"></a><h4>Returns</h4>
-<p> Writable blob data,
+<p>Writable blob data,
 or <code class="literal">NULL</code> if failed. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
 </div>
 or <code class="literal">NULL</code> if failed. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
 </div>
@@ -399,7 +435,7 @@ hb_blob_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <p>See TODO:link object types for more information.</p>
 <div class="refsect3">
 <a name="hb-blob-get-empty.returns"></a><h4>Returns</h4>
 <p>See TODO:link object types for more information.</p>
 <div class="refsect3">
 <a name="hb-blob-get-empty.returns"></a><h4>Returns</h4>
-<p> the empty blob. </p>
+<p>the empty blob. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
 <p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
 <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>
@@ -411,7 +447,7 @@ hb_blob_get_empty (<em class="parameter"><code><span class="type">void</span></c
 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>
 <div class="refsect3">
 <a name="hb-blob-get-length.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-blob-get-length.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -439,7 +475,7 @@ hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -473,7 +509,7 @@ hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 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>
 <div class="refsect3">
 <a name="hb-blob-is-immutable.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-blob-is-immutable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -499,7 +535,7 @@ hb_blob_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 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>
 <div class="refsect3">
 <a name="hb-blob-make-immutable.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-blob-make-immutable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -525,7 +561,7 @@ hb_blob_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <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-reference.parameters"></a><h4>Parameters</h4>
 <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-reference.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -557,7 +593,7 @@ hb_blob_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-blob-set-user-data.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-blob-set-user-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -608,7 +644,7 @@ is not needed anymore.</p></td>
 <a name="hb-memory-mode-t"></a><h3>enum hb_memory_mode_t</h3>
 <div class="refsect3">
 <a name="hb-memory-mode-t.members"></a><h4>Members</h4>
 <a name="hb-memory-mode-t"></a><h3>enum hb_memory_mode_t</h3>
 <div class="refsect3">
 <a name="hb-memory-mode-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -642,6 +678,6 @@ is not needed anymore.</p></td>
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 30a03de..091fc62 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-common: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-common: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb.html" title="hb">
 <link rel="next" href="harfbuzz-hb-unicode.html" title="hb-unicode">
 <link rel="prev" href="harfbuzz-hb.html" title="hb">
 <link rel="next" href="harfbuzz-hb-unicode.html" title="hb-unicode">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-common.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-common.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 </div>
 <a name="hb-user-data-key-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-common.other"></a><h2>Types and Values</h2>
 </div>
 <a name="hb-user-data-key-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-common.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -273,7 +273,7 @@ hb_tag_from_string (<em class="parameter"><code>const <span class="type">char</s
                     <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-tag-from-string.parameters"></a><h4>Parameters</h4>
                     <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-tag-from-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -296,7 +296,7 @@ hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
                   <em class="parameter"><code><span class="type">char</span> *buf</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-tag-to-string.parameters"></a><h4>Parameters</h4>
                   <em class="parameter"><code><span class="type">char</span> *buf</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-tag-to-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -319,7 +319,7 @@ hb_direction_from_string (<em class="parameter"><code>const <span class="type">c
                           <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-direction-from-string.parameters"></a><h4>Parameters</h4>
                           <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-direction-from-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -354,7 +354,7 @@ hb_script_from_iso15924_tag (<em class="parameter"><code><a class="link" href="h
 <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>
 <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 width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -385,7 +385,7 @@ corresponding <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="
 <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">
 <a name="hb-script-from-string.parameters"></a><h4>Parameters</h4>
 <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">
 <a name="hb-script-from-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -394,7 +394,7 @@ corresponding <a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="
 <tbody>
 <tr>
 <td class="parameter_name"><p>str</p></td>
 <tbody>
 <tr>
 <td class="parameter_name"><p>str</p></td>
-<td class="parameter_description"><p> a string representing an
+<td class="parameter_description"><p>a string representing an
 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>
 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>
@@ -421,7 +421,7 @@ hb_script_to_iso15924_tag (<em class="parameter"><code><a class="link" href="har
 <p>See <a class="link" href="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" title="hb_script_from_iso15924_tag ()"><code class="function">hb_script_from_iso15924_tag()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-script-to-iso15924-tag.parameters"></a><h4>Parameters</h4>
 <p>See <a class="link" href="harfbuzz-hb-common.html#hb-script-from-iso15924-tag" title="hb_script_from_iso15924_tag ()"><code class="function">hb_script_from_iso15924_tag()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-script-to-iso15924-tag.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -458,7 +458,7 @@ hb_language_from_string (<em class="parameter"><code>const <span class="type">ch
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -467,7 +467,7 @@ hb_language_from_string (<em class="parameter"><code>const <span class="type">ch
 <tbody>
 <tr>
 <td class="parameter_name"><p>str</p></td>
 <tbody>
 <tr>
 <td class="parameter_name"><p>str</p></td>
-<td class="parameter_description"><p> a string representing
+<td class="parameter_description"><p>a string representing
 ISO 639 language code. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
 ISO 639 language code. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=len][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> uint8_t]</span></td>
 </tr>
@@ -495,7 +495,7 @@ hb_language_to_string (<em class="parameter"><code><a class="link" href="harfbuz
 <p>See <a class="link" href="harfbuzz-hb-common.html#hb-language-from-string" title="hb_language_from_string ()"><code class="function">hb_language_from_string()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-language-to-string.parameters"></a><h4>Parameters</h4>
 <p>See <a class="link" href="harfbuzz-hb-common.html#hb-language-from-string" title="hb_language_from_string ()"><code class="function">hb_language_from_string()</code></a>.</p>
 <div class="refsect3">
 <a name="hb-language-to-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -602,7 +602,7 @@ hb_language_get_default (<em class="parameter"><code><span class="type">void</sp
 <a name="hb-direction-t"></a><h3>enum hb_direction_t</h3>
 <div class="refsect3">
 <a name="hb-direction-t.members"></a><h4>Members</h4>
 <a name="hb-direction-t"></a><h3>enum hb_direction_t</h3>
 <div class="refsect3">
 <a name="hb-direction-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -677,7 +677,7 @@ hb_language_get_default (<em class="parameter"><code><span class="type">void</sp
 <a name="hb-script-t"></a><h3>enum hb_script_t</h3>
 <div class="refsect3">
 <a name="hb-script-t.members"></a><h4>Members</h4>
 <a name="hb-script-t"></a><h3>enum hb_script_t</h3>
 <div class="refsect3">
 <a name="hb-script-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -685,692 +685,17 @@ hb_language_get_default (<em class="parameter"><code><span class="type">void</sp
 </colgroup>
 <tbody>
 <tr>
 </colgroup>
 <tbody>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-COMMON:CAPS"></a>HB_SCRIPT_COMMON</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-INHERITED:CAPS"></a>HB_SCRIPT_INHERITED</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-UNKNOWN:CAPS"></a>HB_SCRIPT_UNKNOWN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-ARABIC:CAPS"></a>HB_SCRIPT_ARABIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-ARMENIAN:CAPS"></a>HB_SCRIPT_ARMENIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BENGALI:CAPS"></a>HB_SCRIPT_BENGALI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-CYRILLIC:CAPS"></a>HB_SCRIPT_CYRILLIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-DEVANAGARI:CAPS"></a>HB_SCRIPT_DEVANAGARI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-GEORGIAN:CAPS"></a>HB_SCRIPT_GEORGIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-GREEK:CAPS"></a>HB_SCRIPT_GREEK</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-GUJARATI:CAPS"></a>HB_SCRIPT_GUJARATI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-GURMUKHI:CAPS"></a>HB_SCRIPT_GURMUKHI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-HANGUL:CAPS"></a>HB_SCRIPT_HANGUL</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-HAN:CAPS"></a>HB_SCRIPT_HAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-HEBREW:CAPS"></a>HB_SCRIPT_HEBREW</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-HIRAGANA:CAPS"></a>HB_SCRIPT_HIRAGANA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-KANNADA:CAPS"></a>HB_SCRIPT_KANNADA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-KATAKANA:CAPS"></a>HB_SCRIPT_KATAKANA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-LAO:CAPS"></a>HB_SCRIPT_LAO</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-LATIN:CAPS"></a>HB_SCRIPT_LATIN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MALAYALAM:CAPS"></a>HB_SCRIPT_MALAYALAM</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-ORIYA:CAPS"></a>HB_SCRIPT_ORIYA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TAMIL:CAPS"></a>HB_SCRIPT_TAMIL</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TELUGU:CAPS"></a>HB_SCRIPT_TELUGU</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-THAI:CAPS"></a>HB_SCRIPT_THAI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TIBETAN:CAPS"></a>HB_SCRIPT_TIBETAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BOPOMOFO:CAPS"></a>HB_SCRIPT_BOPOMOFO</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BRAILLE:CAPS"></a>HB_SCRIPT_BRAILLE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-CANADIAN-SYLLABICS:CAPS"></a>HB_SCRIPT_CANADIAN_SYLLABICS</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-CHEROKEE:CAPS"></a>HB_SCRIPT_CHEROKEE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-ETHIOPIC:CAPS"></a>HB_SCRIPT_ETHIOPIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-KHMER:CAPS"></a>HB_SCRIPT_KHMER</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MONGOLIAN:CAPS"></a>HB_SCRIPT_MONGOLIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MYANMAR:CAPS"></a>HB_SCRIPT_MYANMAR</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OGHAM:CAPS"></a>HB_SCRIPT_OGHAM</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-RUNIC:CAPS"></a>HB_SCRIPT_RUNIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SINHALA:CAPS"></a>HB_SCRIPT_SINHALA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SYRIAC:CAPS"></a>HB_SCRIPT_SYRIAC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-THAANA:CAPS"></a>HB_SCRIPT_THAANA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-YI:CAPS"></a>HB_SCRIPT_YI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-DESERET:CAPS"></a>HB_SCRIPT_DESERET</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-GOTHIC:CAPS"></a>HB_SCRIPT_GOTHIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-ITALIC:CAPS"></a>HB_SCRIPT_OLD_ITALIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BUHID:CAPS"></a>HB_SCRIPT_BUHID</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-HANUNOO:CAPS"></a>HB_SCRIPT_HANUNOO</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TAGALOG:CAPS"></a>HB_SCRIPT_TAGALOG</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TAGBANWA:CAPS"></a>HB_SCRIPT_TAGBANWA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-CYPRIOT:CAPS"></a>HB_SCRIPT_CYPRIOT</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-LIMBU:CAPS"></a>HB_SCRIPT_LIMBU</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-LINEAR-B:CAPS"></a>HB_SCRIPT_LINEAR_B</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OSMANYA:CAPS"></a>HB_SCRIPT_OSMANYA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SHAVIAN:CAPS"></a>HB_SCRIPT_SHAVIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TAI-LE:CAPS"></a>HB_SCRIPT_TAI_LE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-UGARITIC:CAPS"></a>HB_SCRIPT_UGARITIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BUGINESE:CAPS"></a>HB_SCRIPT_BUGINESE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-COPTIC:CAPS"></a>HB_SCRIPT_COPTIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-GLAGOLITIC:CAPS"></a>HB_SCRIPT_GLAGOLITIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-KHAROSHTHI:CAPS"></a>HB_SCRIPT_KHAROSHTHI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-NEW-TAI-LUE:CAPS"></a>HB_SCRIPT_NEW_TAI_LUE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-PERSIAN:CAPS"></a>HB_SCRIPT_OLD_PERSIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SYLOTI-NAGRI:CAPS"></a>HB_SCRIPT_SYLOTI_NAGRI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TIFINAGH:CAPS"></a>HB_SCRIPT_TIFINAGH</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BALINESE:CAPS"></a>HB_SCRIPT_BALINESE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-CUNEIFORM:CAPS"></a>HB_SCRIPT_CUNEIFORM</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-NKO:CAPS"></a>HB_SCRIPT_NKO</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-PHAGS-PA:CAPS"></a>HB_SCRIPT_PHAGS_PA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-PHOENICIAN:CAPS"></a>HB_SCRIPT_PHOENICIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-CARIAN:CAPS"></a>HB_SCRIPT_CARIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-CHAM:CAPS"></a>HB_SCRIPT_CHAM</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-KAYAH-LI:CAPS"></a>HB_SCRIPT_KAYAH_LI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-LEPCHA:CAPS"></a>HB_SCRIPT_LEPCHA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-LYCIAN:CAPS"></a>HB_SCRIPT_LYCIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-LYDIAN:CAPS"></a>HB_SCRIPT_LYDIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OL-CHIKI:CAPS"></a>HB_SCRIPT_OL_CHIKI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-REJANG:CAPS"></a>HB_SCRIPT_REJANG</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SAURASHTRA:CAPS"></a>HB_SCRIPT_SAURASHTRA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SUNDANESE:CAPS"></a>HB_SCRIPT_SUNDANESE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-VAI:CAPS"></a>HB_SCRIPT_VAI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-AVESTAN:CAPS"></a>HB_SCRIPT_AVESTAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BAMUM:CAPS"></a>HB_SCRIPT_BAMUM</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-EGYPTIAN-HIEROGLYPHS:CAPS"></a>HB_SCRIPT_EGYPTIAN_HIEROGLYPHS</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-IMPERIAL-ARAMAIC:CAPS"></a>HB_SCRIPT_IMPERIAL_ARAMAIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-INSCRIPTIONAL-PAHLAVI:CAPS"></a>HB_SCRIPT_INSCRIPTIONAL_PAHLAVI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-INSCRIPTIONAL-PARTHIAN:CAPS"></a>HB_SCRIPT_INSCRIPTIONAL_PARTHIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-JAVANESE:CAPS"></a>HB_SCRIPT_JAVANESE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-KAITHI:CAPS"></a>HB_SCRIPT_KAITHI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-LISU:CAPS"></a>HB_SCRIPT_LISU</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MEETEI-MAYEK:CAPS"></a>HB_SCRIPT_MEETEI_MAYEK</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-SOUTH-ARABIAN:CAPS"></a>HB_SCRIPT_OLD_SOUTH_ARABIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-TURKIC:CAPS"></a>HB_SCRIPT_OLD_TURKIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SAMARITAN:CAPS"></a>HB_SCRIPT_SAMARITAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TAI-THAM:CAPS"></a>HB_SCRIPT_TAI_THAM</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TAI-VIET:CAPS"></a>HB_SCRIPT_TAI_VIET</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BATAK:CAPS"></a>HB_SCRIPT_BATAK</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BRAHMI:CAPS"></a>HB_SCRIPT_BRAHMI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MANDAIC:CAPS"></a>HB_SCRIPT_MANDAIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-CHAKMA:CAPS"></a>HB_SCRIPT_CHAKMA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MEROITIC-CURSIVE:CAPS"></a>HB_SCRIPT_MEROITIC_CURSIVE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MEROITIC-HIEROGLYPHS:CAPS"></a>HB_SCRIPT_MEROITIC_HIEROGLYPHS</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MIAO:CAPS"></a>HB_SCRIPT_MIAO</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SHARADA:CAPS"></a>HB_SCRIPT_SHARADA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SORA-SOMPENG:CAPS"></a>HB_SCRIPT_SORA_SOMPENG</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TAKRI:CAPS"></a>HB_SCRIPT_TAKRI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
 <td class="enum_member_name"><p><a name="HB-SCRIPT-BASSA-VAH:CAPS"></a>HB_SCRIPT_BASSA_VAH</p></td>
 <td> </td>
 <td> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-SCRIPT-BASSA-VAH:CAPS"></a>HB_SCRIPT_BASSA_VAH</p></td>
 <td> </td>
 <td> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-CAUCASIAN-ALBANIAN:CAPS"></a>HB_SCRIPT_CAUCASIAN_ALBANIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-DUPLOYAN:CAPS"></a>HB_SCRIPT_DUPLOYAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-ELBASAN:CAPS"></a>HB_SCRIPT_ELBASAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-GRANTHA:CAPS"></a>HB_SCRIPT_GRANTHA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-KHOJKI:CAPS"></a>HB_SCRIPT_KHOJKI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-KHUDAWADI:CAPS"></a>HB_SCRIPT_KHUDAWADI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-LINEAR-A:CAPS"></a>HB_SCRIPT_LINEAR_A</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MAHAJANI:CAPS"></a>HB_SCRIPT_MAHAJANI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MANICHAEAN:CAPS"></a>HB_SCRIPT_MANICHAEAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MENDE-KIKAKUI:CAPS"></a>HB_SCRIPT_MENDE_KIKAKUI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MODI:CAPS"></a>HB_SCRIPT_MODI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MRO:CAPS"></a>HB_SCRIPT_MRO</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-NABATAEAN:CAPS"></a>HB_SCRIPT_NABATAEAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-NORTH-ARABIAN:CAPS"></a>HB_SCRIPT_OLD_NORTH_ARABIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-PERMIC:CAPS"></a>HB_SCRIPT_OLD_PERMIC</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-PAHAWH-HMONG:CAPS"></a>HB_SCRIPT_PAHAWH_HMONG</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-PALMYRENE:CAPS"></a>HB_SCRIPT_PALMYRENE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-PAU-CIN-HAU:CAPS"></a>HB_SCRIPT_PAU_CIN_HAU</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-PSALTER-PAHLAVI:CAPS"></a>HB_SCRIPT_PSALTER_PAHLAVI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SIDDHAM:CAPS"></a>HB_SCRIPT_SIDDHAM</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TIRHUTA:CAPS"></a>HB_SCRIPT_TIRHUTA</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-WARANG-CITI:CAPS"></a>HB_SCRIPT_WARANG_CITI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-AHOM:CAPS"></a>HB_SCRIPT_AHOM</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-ANATOLIAN-HIEROGLYPHS:CAPS"></a>HB_SCRIPT_ANATOLIAN_HIEROGLYPHS</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-HATRAN:CAPS"></a>HB_SCRIPT_HATRAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MULTANI:CAPS"></a>HB_SCRIPT_MULTANI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OLD-HUNGARIAN:CAPS"></a>HB_SCRIPT_OLD_HUNGARIAN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-SIGNWRITING:CAPS"></a>HB_SCRIPT_SIGNWRITING</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
 <td class="enum_member_name"><p><a name="HB-SCRIPT-ADLAM:CAPS"></a>HB_SCRIPT_ADLAM</p></td>
 <td> </td>
 <td> </td>
 </tr>
 <tr>
 <td class="enum_member_name"><p><a name="HB-SCRIPT-ADLAM:CAPS"></a>HB_SCRIPT_ADLAM</p></td>
 <td> </td>
 <td> </td>
 </tr>
 <tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-BHAIKSUKI:CAPS"></a>HB_SCRIPT_BHAIKSUKI</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-MARCHEN:CAPS"></a>HB_SCRIPT_MARCHEN</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-OSAGE:CAPS"></a>HB_SCRIPT_OSAGE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-TANGUT:CAPS"></a>HB_SCRIPT_TANGUT</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="HB-SCRIPT-NEWA:CAPS"></a>HB_SCRIPT_NEWA</p></td>
+<td class="enum_member_name"><p><a name="HB-SCRIPT-MASARAM-GONDI:CAPS"></a>HB_SCRIPT_MASARAM_GONDI</p></td>
 <td> </td>
 <td> </td>
 </tr>
 <td> </td>
 <td> </td>
 </tr>
@@ -1425,12 +750,12 @@ hb_language_get_default (<em class="parameter"><code><span class="type">void</sp
 <hr>
 <div class="refsect2">
 <a name="HB-LANGUAGE-INVALID:CAPS"></a><h3>HB_LANGUAGE_INVALID</h3>
 <hr>
 <div class="refsect2">
 <a name="HB-LANGUAGE-INVALID:CAPS"></a><h3>HB_LANGUAGE_INVALID</h3>
-<pre class="programlisting">#define HB_LANGUAGE_INVALID ((hb_language_t) NULL)
+<pre class="programlisting">#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
 </pre>
 </div>
 </div>
 </div>
 <div class="footer">
 </pre>
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index ed3b4b1..24a7e11 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-coretext: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-coretext: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">
 <link rel="next" href="harfbuzz-hb-gobject.html" title="hb-gobject">
 <link rel="prev" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">
 <link rel="next" href="harfbuzz-hb-gobject.html" title="hb-gobject">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-coretext.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-coretext.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 </tr>
 <tr>
 <td class="function_type">
 </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> *
+</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>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">CGFontRef</span>
 </td>
 <td class="function_name">
 <span class="returnvalue">CGFontRef</span>
 </td>
 <td class="function_name">
@@ -68,7 +76,7 @@
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-coretext.other"></a><h2>Types and Values</h2>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-coretext.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <tbody>
 <tr>
 <td class="define_keyword">#define</td>
 <tbody>
 <tr>
 <td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-KERX:CAPS" title="HB_CORETEXT_TAG_KERX">HB_CORETEXT_TAG_KERX</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORT:CAPS" title="HB_CORETEXT_TAG_MORT">HB_CORETEXT_TAG_MORT</a></td>
 </tr>
 <tr>
 <td class="function_name"><a class="link" href="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORT:CAPS" title="HB_CORETEXT_TAG_MORT">HB_CORETEXT_TAG_MORT</a></td>
 </tr>
 <tr>
@@ -97,6 +109,12 @@ hb_coretext_face_create (<em class="parameter"><code><span class="type">CGFontRe
 </div>
 <hr>
 <div class="refsect2">
 </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> *
+hb_coretext_font_create (<em class="parameter"><code><span class="type">CTFontRef</span> ct_font</code></em>);</pre>
+</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>
 <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>
@@ -111,6 +129,12 @@ hb_coretext_font_get_ct_font (<em class="parameter"><code><a class="link" href="
 <div class="refsect1">
 <a name="harfbuzz-hb-coretext.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
 <div class="refsect1">
 <a name="harfbuzz-hb-coretext.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
+<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>
+</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>
 <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>
@@ -124,6 +148,6 @@ hb_coretext_font_get_ct_font (<em class="parameter"><code><a class="link" href="
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 6c574b6..60935e1 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-deprecated: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-deprecated: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-version.html" title="hb-version">
 <link rel="next" href="harfbuzz-hb-set.html" title="hb-set">
 <link rel="prev" href="harfbuzz-hb-version.html" title="hb-version">
 <link rel="next" href="harfbuzz-hb-set.html" title="hb-set">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-deprecated.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-deprecated.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-func-t" title="hb_font_get_glyph_func_t ()">*hb_font_get_glyph_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <span class="c_punctuation">(</span><a class="link" href="harfbuzz-hb-deprecated.html#hb-font-get-glyph-func-t" title="hb_font_get_glyph_func_t ()">*hb_font_get_glyph_func_t</a><span class="c_punctuation">)</span> <span class="c_punctuation">()</span>
 </td>
 </tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-deprecated.html#hb-set-invert" title="hb_set_invert ()">hb_set_invert</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-deprecated.other"></a><h2>Types and Values</h2>
 </tbody>
 </table></div>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-deprecated.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -98,7 +106,7 @@ hb_font_funcs_set_glyph_func (<em class="parameter"><code><a class="link" href="
 <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-variation-glyph-func" title="hb_font_funcs_set_variation_glyph_func ()"><code class="function">hb_font_funcs_set_variation_glyph_func()</code></a> instead.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-func.parameters"></a><h4>Parameters</h4>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-set-variation-glyph-func" title="hb_font_funcs_set_variation_glyph_func ()"><code class="function">hb_font_funcs_set_variation_glyph_func()</code></a> instead.</p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-glyph-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -132,6 +140,29 @@ hb_font_funcs_set_glyph_func (<em class="parameter"><code><a class="link" href="
                              <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
 <div class="warning"><p><code class="literal">hb_font_get_glyph_func_t</code> is deprecated and should not be used in newly-written code.</p></div>
 </div>
                              <em class="parameter"><code><span class="type">void</span> *user_data</code></em>);</pre>
 <div class="warning"><p><code class="literal">hb_font_get_glyph_func_t</code> is deprecated and should not be used in newly-written code.</p></div>
 </div>
+<hr>
+<div class="refsect2">
+<a name="hb-set-invert"></a><h3>hb_set_invert ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+hb_set_invert (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
+<div class="warning"><p><code class="literal">hb_set_invert</code> has been deprecated since version 1.6.1 and should not be used in newly-written code.</p></div>
+<div class="refsect3">
+<a name="hb-set-invert.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</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">
 <a name="harfbuzz-hb-deprecated.other_details"></a><h2>Types and Values</h2>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-deprecated.other_details"></a><h2>Types and Values</h2>
@@ -158,6 +189,6 @@ hb_font_funcs_set_glyph_func (<em class="parameter"><code><a class="link" href="
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 8ff43d5..d4f59cd 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-face: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-face: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-blob.html" title="hb-blob">
 <link rel="next" href="harfbuzz-hb-font.html" title="hb-font">
 <link rel="prev" href="harfbuzz-hb-blob.html" title="hb-blob">
 <link rel="next" href="harfbuzz-hb-font.html" title="hb-font">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-face.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-face.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <td class="function_type">unsigned <span class="returnvalue">int</span>
 </td>
 <td class="function_name">
 <td class="function_type">unsigned <span class="returnvalue">int</span>
 </td>
 <td class="function_name">
+<a class="link" href="harfbuzz-hb-face.html#hb-face-get-table-tags" title="hb_face_get_table_tags ()">hb_face_get_table_tags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">unsigned <span class="returnvalue">int</span>
+</td>
+<td class="function_name">
 <a class="link" href="harfbuzz-hb-face.html#hb-face-get-glyph-count" title="hb_face_get_glyph_count ()">hb_face_get_glyph_count</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <a class="link" href="harfbuzz-hb-face.html#hb-face-get-glyph-count" title="hb_face_get_glyph_count ()">hb_face_get_glyph_count</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 </div>
 <a name="hb-face-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-face.other"></a><h2>Types and Values</h2>
 </div>
 <a name="hb-face-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-face.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -222,7 +229,7 @@ hb_face_create_for_tables (<em class="parameter"><code><a class="link" href="har
                            <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">
 <a name="hb-face-create-for-tables.parameters"></a><h4>Parameters</h4>
                            <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">
 <a name="hb-face-create-for-tables.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -249,7 +256,7 @@ hb_face_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-f
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -277,12 +284,42 @@ hb_face_get_empty (<em class="parameter"><code><span class="type">void</span></c
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <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><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>unsigned <span class="type">int</span> start_offset</code></em>,
+                        <em class="parameter"><code>unsigned <span class="type">int</span> *table_count</code></em>,
+                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> *table_tags</code></em>);</pre>
+<p>Retrieves table tags for a face, if possible.</p>
+<div class="refsect3">
+<a name="hb-face-get-table-tags.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>a face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-face-get-table-tags.returns"></a><h4>Returns</h4>
+<p> total number of tables, or 0 if not possible to list.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-6-0.html#api-index-1.6.0">1.6.0</a></p>
+</div>
+<hr>
+<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><a class="link" href="harfbuzz-hb-face.html#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>
 <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><a class="link" href="harfbuzz-hb-face.html#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 width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -304,7 +341,7 @@ hb_face_get_glyph_count (<em class="parameter"><code><a class="link" href="harfb
 hb_face_get_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>);</pre>
 <div class="refsect3">
 <a name="hb-face-get-index.parameters"></a><h4>Parameters</h4>
 hb_face_get_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>);</pre>
 <div class="refsect3">
 <a name="hb-face-get-index.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -326,7 +363,7 @@ hb_face_get_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 hb_face_get_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>);</pre>
 <div class="refsect3">
 <a name="hb-face-get-upem.parameters"></a><h4>Parameters</h4>
 hb_face_get_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>);</pre>
 <div class="refsect3">
 <a name="hb-face-get-upem.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -350,7 +387,7 @@ hb_face_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -377,7 +414,7 @@ hb_face_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 hb_face_is_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>
 <div class="refsect3">
 <a name="hb-face-is-immutable.parameters"></a><h4>Parameters</h4>
 hb_face_is_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>
 <div class="refsect3">
 <a name="hb-face-is-immutable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -399,7 +436,7 @@ hb_face_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 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>
 <div class="refsect3">
 <a name="hb-face-make-immutable.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-face-make-immutable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -422,7 +459,7 @@ hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -444,7 +481,7 @@ hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 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>
 <div class="refsect3">
 <a name="hb-face-reference-blob.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-face-reference-blob.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -472,7 +509,7 @@ hb_face_reference_table (<em class="parameter"><code><a class="link" href="harfb
                          <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>
                          <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -500,7 +537,7 @@ hb_face_set_glyph_count (<em class="parameter"><code><a class="link" href="harfb
                          <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>
                          <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -523,7 +560,7 @@ hb_face_set_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb
                    <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>
                    <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -546,7 +583,7 @@ hb_face_set_upem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
                   <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>
                   <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -573,7 +610,7 @@ hb_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-face-set-user-data.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-face-set-user-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -599,6 +636,6 @@ hb_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 3cbff83..21e08e2 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-font: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-font: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-face.html" title="hb-face">
 <link rel="next" href="harfbuzz-Shaping.html" title="Shaping">
 <link rel="prev" href="harfbuzz-hb-face.html" title="hb-face">
 <link rel="next" href="harfbuzz-Shaping.html" title="Shaping">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-font.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-font.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 </tr>
 <tr>
 <td class="function_type">
 </tr>
 <tr>
 <td class="function_type">
+<span class="returnvalue">float</span>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-get-ptem" title="hb_font_get_ptem ()">hb_font_get_ptem</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-face" title="hb_font_set_face ()">hb_font_set_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-font.html#hb-font-set-funcs" title="hb_font_set_funcs ()">hb_font_set_funcs</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-set-funcs" title="hb_font_set_funcs ()">hb_font_set_funcs</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
+<a class="link" href="harfbuzz-hb-font.html#hb-font-set-ptem" title="hb_font_set_ptem ()">hb_font_set_ptem</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-font.html#hb-font-set-scale" title="hb_font_set_scale ()">hb_font_set_scale</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <a class="link" href="harfbuzz-hb-font.html#hb-font-set-scale" title="hb_font_set_scale ()">hb_font_set_scale</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 </div>
 <a name="hb-font-funcs-t"></a><a name="hb-font-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-font.other"></a><h2>Types and Values</h2>
 </div>
 <a name="hb-font-funcs-t"></a><a name="hb-font-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-font.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -776,7 +800,7 @@ hb_font_add_glyph_origin_for_direction
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-add-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
                                 <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>
 <div class="refsect3">
 <a name="hb-font-add-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -811,7 +835,7 @@ hb_font_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fa
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-font-create.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-font-create.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -838,7 +862,7 @@ hb_font_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fa
 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>
 <div class="refsect3">
 <a name="hb-font-create-sub-font.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-font-create-sub-font.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -866,7 +890,7 @@ hb_font_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-f
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -902,7 +926,7 @@ hb_font_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuz
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -938,7 +962,7 @@ hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="h
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -965,7 +989,7 @@ hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="h
 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>
 <div class="refsect3">
 <a name="hb-font-funcs-is-immutable.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-font-funcs-is-immutable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -987,7 +1011,7 @@ hb_font_funcs_is_immutable (<em class="parameter"><code><a class="link" href="ha
 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>
 <div class="refsect3">
 <a name="hb-font-funcs-make-immutable.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-font-funcs-make-immutable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1010,7 +1034,7 @@ hb_font_funcs_reference (<em class="parameter"><code><a class="link" href="harfb
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1036,7 +1060,7 @@ hb_font_funcs_set_glyph_contour_point_func
                                 <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">
 <a name="hb-font-funcs-set-glyph-contour-point-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-font-funcs-set-glyph-contour-point-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1068,7 +1092,7 @@ hb_font_funcs_set_glyph_extents_func (<em class="parameter"><code><a class="link
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-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">
 <a name="hb-font-funcs-set-glyph-extents-func.parameters"></a><h4>Parameters</h4>
                                       <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">
 <a name="hb-font-funcs-set-glyph-extents-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1101,7 +1125,7 @@ hb_font_funcs_set_glyph_from_name_func
                                 <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">
 <a name="hb-font-funcs-set-glyph-from-name-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-font-funcs-set-glyph-from-name-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1134,7 +1158,7 @@ hb_font_funcs_set_glyph_h_advance_func
                                 <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">
 <a name="hb-font-funcs-set-glyph-h-advance-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-font-funcs-set-glyph-h-advance-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1167,7 +1191,7 @@ hb_font_funcs_set_glyph_h_kerning_func
                                 <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">
 <a name="hb-font-funcs-set-glyph-h-kerning-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-font-funcs-set-glyph-h-kerning-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1199,7 +1223,7 @@ hb_font_funcs_set_glyph_h_origin_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-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">
 <a name="hb-font-funcs-set-glyph-h-origin-func.parameters"></a><h4>Parameters</h4>
                                        <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">
 <a name="hb-font-funcs-set-glyph-h-origin-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1231,7 +1255,7 @@ hb_font_funcs_set_glyph_name_func (<em class="parameter"><code><a class="link" h
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-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">
 <a name="hb-font-funcs-set-glyph-name-func.parameters"></a><h4>Parameters</h4>
                                    <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">
 <a name="hb-font-funcs-set-glyph-name-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1264,7 +1288,7 @@ hb_font_funcs_set_glyph_v_advance_func
                                 <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">
 <a name="hb-font-funcs-set-glyph-v-advance-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-font-funcs-set-glyph-v-advance-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1297,7 +1321,7 @@ hb_font_funcs_set_glyph_v_kerning_func
                                 <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">
 <a name="hb-font-funcs-set-glyph-v-kerning-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-font-funcs-set-glyph-v-kerning-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1329,7 +1353,7 @@ hb_font_funcs_set_glyph_v_origin_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-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">
 <a name="hb-font-funcs-set-glyph-v-origin-func.parameters"></a><h4>Parameters</h4>
                                        <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">
 <a name="hb-font-funcs-set-glyph-v-origin-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1361,7 +1385,7 @@ hb_font_funcs_set_nominal_glyph_func (<em class="parameter"><code><a class="link
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-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">
 <a name="hb-font-funcs-set-nominal-glyph-func.parameters"></a><h4>Parameters</h4>
                                       <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">
 <a name="hb-font-funcs-set-nominal-glyph-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1395,7 +1419,7 @@ hb_font_funcs_set_user_data (<em class="parameter"><code><a class="link" href="h
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-user-data.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-funcs-set-user-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1421,7 +1445,7 @@ hb_font_funcs_set_variation_glyph_func
                                 <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">
 <a name="hb-font-funcs-set-variation-glyph-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-font-funcs-set-variation-glyph-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1461,7 +1485,7 @@ hb_font_get_empty (<em class="parameter"><code><span class="type">void</span></c
 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>
 <div class="refsect3">
 <a name="hb-font-get-face.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-font-get-face.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1491,7 +1515,7 @@ hb_font_get_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph.parameters"></a><h4>Parameters</h4>
                    <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.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1525,7 +1549,7 @@ hb_font_get_glyph_advance_for_direction
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-advance-for-direction.parameters"></a><h4>Parameters</h4>
                                 <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>
 <div class="refsect3">
 <a name="hb-font-get-glyph-advance-for-direction.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1572,7 +1596,7 @@ hb_font_get_glyph_contour_point (<em class="parameter"><code><a class="link" hre
                                  <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>
 <div class="refsect3">
 <a name="hb-font-get-glyph-contour-point.parameters"></a><h4>Parameters</h4>
                                  <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>
 <div class="refsect3">
 <a name="hb-font-get-glyph-contour-point.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1612,7 +1636,7 @@ hb_font_get_glyph_contour_point_for_origin
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-contour-point-for-origin.parameters"></a><h4>Parameters</h4>
                                 <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>
 <div class="refsect3">
 <a name="hb-font-get-glyph-contour-point-for-origin.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1661,7 +1685,7 @@ hb_font_get_glyph_extents (<em class="parameter"><code><a class="link" href="har
                            <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-extents.parameters"></a><h4>Parameters</h4>
                            <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-extents.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1693,7 +1717,7 @@ hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link
                                       <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-extents-for-origin.parameters"></a><h4>Parameters</h4>
                                       <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-extents-for-origin.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1735,7 +1759,7 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-from-name.parameters"></a><h4>Parameters</h4>
                              <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-from-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1779,7 +1803,7 @@ hb_font_get_glyph_h_advance (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-h-advance.parameters"></a><h4>Parameters</h4>
                              <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1803,7 +1827,7 @@ hb_font_get_glyph_h_kerning (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> right_glyph</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-h-kerning.parameters"></a><h4>Parameters</h4>
                              <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">
 <a name="hb-font-get-glyph-h-kerning.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1828,7 +1852,7 @@ hb_font_get_glyph_h_origin (<em class="parameter"><code><a class="link" href="ha
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-h-origin.parameters"></a><h4>Parameters</h4>
                             <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>
 <div class="refsect3">
 <a name="hb-font-get-glyph-h-origin.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1868,7 +1892,7 @@ hb_font_get_glyph_kerning_for_direction
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-kerning-for-direction.parameters"></a><h4>Parameters</h4>
                                 <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>
 <div class="refsect3">
 <a name="hb-font-get-glyph-kerning-for-direction.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1915,7 +1939,7 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-name.parameters"></a><h4>Parameters</h4>
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-name.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1960,7 +1984,7 @@ hb_font_get_glyph_origin_for_direction
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
                                 <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>
 <div class="refsect3">
 <a name="hb-font-get-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2006,7 +2030,7 @@ hb_font_get_glyph_v_advance (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-v-advance.parameters"></a><h4>Parameters</h4>
                              <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2030,7 +2054,7 @@ hb_font_get_glyph_v_kerning (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> bottom_glyph</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-v-kerning.parameters"></a><h4>Parameters</h4>
                              <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="refsect3">
 <a name="hb-font-get-glyph-v-kerning.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2055,7 +2079,7 @@ hb_font_get_glyph_v_origin (<em class="parameter"><code><a class="link" href="ha
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-glyph-v-origin.parameters"></a><h4>Parameters</h4>
                             <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>
 <div class="refsect3">
 <a name="hb-font-get-glyph-v-origin.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2091,7 +2115,7 @@ hb_font_get_nominal_glyph (<em class="parameter"><code><a class="link" href="har
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-nominal-glyph.parameters"></a><h4>Parameters</h4>
                            <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-nominal-glyph.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2130,7 +2154,7 @@ hb_font_get_nominal_glyph (<em class="parameter"><code><a class="link" href="har
 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>
 <div class="refsect3">
 <a name="hb-font-get-parent.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-font-get-parent.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2159,7 +2183,7 @@ hb_font_get_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
                   <em class="parameter"><code>unsigned <span class="type">int</span> *y_ppem</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-ppem.parameters"></a><h4>Parameters</h4>
                   <em class="parameter"><code>unsigned <span class="type">int</span> *y_ppem</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-ppem.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2188,6 +2212,33 @@ hb_font_get_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <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>
+<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>
+<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 font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-font-get-ptem.returns"></a><h4>Returns</h4>
+<p> Point size.</p>
+</div>
+<p class="since">Since: <a class="link" href="api-index-0-9-2.html#api-index-0.9.2">0.9.2</a></p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="hb-font-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>,
 <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>,
@@ -2195,7 +2246,7 @@ hb_font_get_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb
                    <em class="parameter"><code><span class="type">int</span> *y_scale</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-scale.parameters"></a><h4>Parameters</h4>
                    <em class="parameter"><code><span class="type">int</span> *y_scale</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-scale.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2231,7 +2282,7 @@ hb_font_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2261,7 +2312,7 @@ hb_font_get_variation_glyph (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-variation-glyph.parameters"></a><h4>Parameters</h4>
                              <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-variation-glyph.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2302,7 +2353,7 @@ hb_font_get_var_coords_normalized (<em class="parameter"><code><a class="link" h
                                    <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>
                                    <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: 1.4.2</p>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
@@ -2314,7 +2365,7 @@ hb_font_glyph_from_string (<em class="parameter"><code><a class="link" href="har
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-glyph-from-string.parameters"></a><h4>Parameters</h4>
                            <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-glyph-from-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2351,7 +2402,7 @@ hb_font_glyph_to_string (<em class="parameter"><code><a class="link" href="harfb
                          <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-glyph-to-string.parameters"></a><h4>Parameters</h4>
                          <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-glyph-to-string.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2380,7 +2431,7 @@ hb_font_glyph_to_string (<em class="parameter"><code><a class="link" href="harfb
 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>
 <div class="refsect3">
 <a name="hb-font-is-immutable.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-font-is-immutable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2402,7 +2453,7 @@ hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 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>
 <div class="refsect3">
 <a name="hb-font-make-immutable.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-font-make-immutable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2425,7 +2476,7 @@ hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2447,6 +2498,38 @@ hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <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>
+<p>Sets font-face of <em class="parameter"><code>font</code></em>
+.</p>
+<div class="refsect3">
+<a name="hb-font-set-face.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>font</p></td>
+<td class="parameter_description"><p>a font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>face</p></td>
+<td class="parameter_description"><p>new face.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-4-3.html#api-index-1.4.3">1.4.3</a></p>
+</div>
+<hr>
+<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>,
 <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>,
@@ -2455,7 +2538,7 @@ hb_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb
                    <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">
 <a name="hb-font-set-funcs.parameters"></a><h4>Parameters</h4>
                    <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">
 <a name="hb-font-set-funcs.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2486,7 +2569,7 @@ hb_font_set_funcs_data (<em class="parameter"><code><a class="link" href="harfbu
                         <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">
 <a name="hb-font-set-funcs-data.parameters"></a><h4>Parameters</h4>
                         <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">
 <a name="hb-font-set-funcs-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2518,7 +2601,7 @@ hb_font_set_parent (<em class="parameter"><code><a class="link" href="harfbuzz-h
 .</p>
 <div class="refsect3">
 <a name="hb-font-set-parent.parameters"></a><h4>Parameters</h4>
 .</p>
 <div class="refsect3">
 <a name="hb-font-set-parent.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2549,7 +2632,7 @@ hb_font_set_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
                   <em class="parameter"><code>unsigned <span class="type">int</span> y_ppem</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-set-ppem.parameters"></a><h4>Parameters</h4>
                   <em class="parameter"><code>unsigned <span class="type">int</span> y_ppem</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-set-ppem.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2566,6 +2649,30 @@ hb_font_set_ppem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <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>,
+                  <em class="parameter"><code><span class="type">float</span> ptem</code></em>);</pre>
+<p>Sets "point size" of the font.</p>
+<div class="refsect3">
+<a name="hb-font-set-ptem.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 font.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<p class="since">Since: <a class="link" href="api-index-1-6-0.html#api-index-1.6.0">1.6.0</a></p>
+</div>
+<hr>
+<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>,
 <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>,
@@ -2573,7 +2680,7 @@ hb_font_set_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb
                    <em class="parameter"><code><span class="type">int</span> y_scale</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-set-scale.parameters"></a><h4>Parameters</h4>
                    <em class="parameter"><code><span class="type">int</span> y_scale</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-set-scale.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2600,7 +2707,7 @@ hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-set-user-data.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-font-set-user-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2622,7 +2729,7 @@ hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 hb_variation_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                           <em class="parameter"><code><span class="type">int</span> len</code></em>,
                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variation</code></em>);</pre>
 hb_variation_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                           <em class="parameter"><code><span class="type">int</span> len</code></em>,
                           <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variation</code></em>);</pre>
-<p class="since">Since: 1.4.2</p>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
@@ -2631,7 +2738,7 @@ hb_variation_from_string (<em class="parameter"><code>const <span class="type">c
 hb_variation_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variation</code></em>,
                         <em class="parameter"><code><span class="type">char</span> *buf</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 hb_variation_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-variation-t" title="hb_variation_t"><span class="type">hb_variation_t</span></a> *variation</code></em>,
                         <em class="parameter"><code><span class="type">char</span> *buf</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
-<p class="since">Since: 1.4.2</p>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
@@ -2640,7 +2747,7 @@ hb_variation_to_string (<em class="parameter"><code><a class="link" href="harfbu
 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>,
                         <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-font.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>
 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>,
                         <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-font.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: 1.4.2</p>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
@@ -2649,7 +2756,7 @@ hb_font_set_variations (<em class="parameter"><code><a class="link" href="harfbu
 hb_font_set_var_coords_design (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><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>
 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>,
                                <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: 1.4.2</p>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
@@ -2658,7 +2765,7 @@ hb_font_set_var_coords_design (<em class="parameter"><code><a class="link" href=
 hb_font_set_var_coords_normalized (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><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>
 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>,
                                    <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: 1.4.2</p>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
@@ -2672,7 +2779,7 @@ hb_font_subtract_glyph_origin_for_direction
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-subtract-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
                                 <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>
 <div class="refsect3">
 <a name="hb-font-subtract-glyph-origin-for-direction.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2717,7 +2824,7 @@ hb_font_funcs_set_font_h_extents_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-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">
 <a name="hb-font-funcs-set-font-h-extents-func.parameters"></a><h4>Parameters</h4>
                                        <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">
 <a name="hb-font-funcs-set-font-h-extents-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2749,7 +2856,7 @@ hb_font_funcs_set_font_v_extents_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-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">
 <a name="hb-font-funcs-set-font-v-extents-func.parameters"></a><h4>Parameters</h4>
                                        <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">
 <a name="hb-font-funcs-set-font-v-extents-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2780,7 +2887,7 @@ hb_font_get_extents_for_direction (<em class="parameter"><code><a class="link" h
                                    <em class="parameter"><code><span class="type">hb_font_extents_t</span> *extents</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-extents-for-direction.parameters"></a><h4>Parameters</h4>
                                    <em class="parameter"><code><span class="type">hb_font_extents_t</span> *extents</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-font-get-extents-for-direction.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2812,7 +2919,7 @@ hb_font_get_h_extents (<em class="parameter"><code><a class="link" href="harfbuz
                        <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>
                        <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2842,7 +2949,7 @@ hb_font_get_v_extents (<em class="parameter"><code><a class="link" href="harfbuz
                        <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>
                        <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -2916,7 +3023,7 @@ hb_font_get_v_extents (<em class="parameter"><code><a class="link" href="harfbuz
   float    value;
 } hb_variation_t;
 </pre>
   float    value;
 } hb_variation_t;
 </pre>
-<p class="since">Since: 1.4.2</p>
+<p class="since">Since: <a class="link" href="api-index-1-4-2.html#api-index-1.4.2">1.4.2</a></p>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
@@ -2939,6 +3046,6 @@ hb_font_get_v_extents (<em class="parameter"><code><a class="link" href="harfbuz
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index c8bce1b..c2ad492 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ft: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ft: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-icu.html" title="hb-icu">
 <link rel="next" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">
 <link rel="prev" href="harfbuzz-hb-icu.html" title="hb-icu">
 <link rel="next" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ft.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ft.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 </tr>
 <tr>
 <td class="function_type">
 </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-changed" title="hb_ft_font_changed ()">hb_ft_font_changed</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <span class="returnvalue">FT_Face</span>
 </td>
 <td class="function_name">
 <span class="returnvalue">FT_Face</span>
 </td>
 <td class="function_name">
@@ -126,7 +134,7 @@ hb_ft_face_create (<em class="parameter"><code><span class="type">FT_Face</span>
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-ft-face-create.parameters"></a><h4>Parameters</h4>
                    <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">
 <a name="hb-ft-face-create.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -178,7 +186,7 @@ hb_ft_font_create (<em class="parameter"><code><span class="type">FT_Face</span>
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-ft-font-create.parameters"></a><h4>Parameters</h4>
                    <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">
 <a name="hb-ft-font-create.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -212,6 +220,12 @@ hb_ft_font_create_referenced (<em class="parameter"><code><span class="type">FT_
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <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>
+</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>
 <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>
@@ -243,6 +257,6 @@ hb_ft_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index a138b8b..5db6131 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-glib: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-glib: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">
 <link rel="next" href="harfbuzz-hb-icu.html" title="hb-icu">
 <link rel="prev" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">
 <link rel="next" href="harfbuzz-hb-icu.html" title="hb-icu">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-glib.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-glib.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -109,6 +109,6 @@ hb_glib_blob_create (<em class="parameter"><code><span class="type">GBytes</span
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 1a17aa2..e42ad96 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-gobject: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-gobject: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-coretext.html" title="hb-coretext">
 <link rel="next" href="object-tree.html" title="Object Hierarchy">
 <link rel="prev" href="harfbuzz-hb-coretext.html" title="hb-coretext">
 <link rel="next" href="object-tree.html" title="Object Hierarchy">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-gobject.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-gobject.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <span class="returnvalue">GType</span>
 </td>
 <td class="function_name">
 <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>
 <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>
 <span class="returnvalue">GType</span>
 </td>
 <td class="function_name">
 <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-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>
 <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>
 <span class="returnvalue">GType</span>
 </td>
 <td class="function_name">
 <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>
 <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>
 <span class="returnvalue">GType</span>
 </td>
 <td class="function_name">
 <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>
 <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>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-gobject.other"></a><h2>Types and Values</h2>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-gobject.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 </tr>
 <tr>
 <td class="define_keyword">#define</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="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>
 </tr>
 <tr>
 <td class="define_keyword">#define</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-MEMORY-MODE:CAPS" title="HB_GOBJECT_TYPE_MEMORY_MODE">HB_GOBJECT_TYPE_MEMORY_MODE</a></td>
 </tr>
 <tr>
 <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>
 </tr>
 <tr>
 <td class="define_keyword">#define</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-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="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>
@@ -397,6 +445,12 @@ hb_gobject_buffer_content_type_get_type
 </div>
 <hr>
 <div class="refsect2">
 </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 (<em class="parameter"><code><span class="type">void</span></code></em>);</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 (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <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 (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
@@ -451,6 +505,12 @@ hb_gobject_font_get_type (<em class="parameter"><code><span class="type">void</s
 </div>
 <hr>
 <div class="refsect2">
 </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 (<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 (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <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 (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
@@ -470,6 +530,13 @@ hb_gobject_ot_math_constant_get_type (<em class="parameter"><code><span class="t
 </div>
 <hr>
 <div class="refsect2">
 </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
 <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
@@ -477,6 +544,13 @@ hb_gobject_ot_math_glyph_part_flags_get_type
 </div>
 <hr>
 <div class="refsect2">
 </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 (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <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 (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
@@ -580,6 +654,12 @@ hb_gobject_user_data_key_get_type (<em class="parameter"><code><span class="type
 </div>
 <hr>
 <div class="refsect2">
 </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>
 <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>
@@ -622,6 +702,12 @@ hb_gobject_user_data_key_get_type (<em class="parameter"><code><span class="type
 </div>
 <hr>
 <div class="refsect2">
 </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-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>
 <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>
@@ -640,12 +726,24 @@ hb_gobject_user_data_key_get_type (<em class="parameter"><code><span class="type
 </div>
 <hr>
 <div class="refsect2">
 </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-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>
 <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>
@@ -725,6 +823,6 @@ hb_gobject_user_data_key_get_type (<em class="parameter"><code><span class="type
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 27e6548..88904e5 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-graphite2: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-graphite2: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-ft.html" title="hb-ft">
 <link rel="next" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">
 <link rel="prev" href="harfbuzz-hb-ft.html" title="hb-ft">
 <link rel="next" href="harfbuzz-hb-uniscribe.html" title="hb-uniscribe">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-graphite2.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-graphite2.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -60,7 +60,7 @@
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-graphite2.other"></a><h2>Types and Values</h2>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-graphite2.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -99,6 +99,6 @@ hb_graphite2_font_get_gr_font (<em class="parameter"><code><a class="link" href=
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 3094a2b..25a5cd6 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-icu: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-icu: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-glib.html" title="hb-glib">
 <link rel="next" href="harfbuzz-hb-ft.html" title="hb-ft">
 <link rel="prev" href="harfbuzz-hb-glib.html" title="hb-glib">
 <link rel="next" href="harfbuzz-hb-ft.html" title="hb-ft">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-icu.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-icu.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -94,6 +94,6 @@ hb_icu_script_to_script (<em class="parameter"><code><span class="type">UScriptC
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index ab84fa9..f1254f5 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-font: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-font: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-ot-tag.html" title="hb-ot-tag">
 <link rel="next" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">
 <link rel="prev" href="harfbuzz-hb-ot-tag.html" title="hb-ot-tag">
 <link rel="next" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-font.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-font.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -65,6 +65,6 @@ hb_ot_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 01c3c2a..c9c833a 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-layout: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-layout: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-ot.html" title="hb-ot">
 <link rel="next" href="harfbuzz-hb-ot-tag.html" title="hb-ot-tag">
 <link rel="prev" href="harfbuzz-hb-ot.html" title="hb-ot">
 <link rel="next" href="harfbuzz-hb-ot-tag.html" title="hb-ot-tag">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-layout.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-layout.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-layout.other"></a><h2>Types and Values</h2>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-layout.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -675,7 +675,7 @@ hb_ot_layout_language_get_required_feature_index
 <a name="hb-ot-layout-glyph-class-t"></a><h3>enum hb_ot_layout_glyph_class_t</h3>
 <div class="refsect3">
 <a name="hb-ot-layout-glyph-class-t.members"></a><h4>Members</h4>
 <a name="hb-ot-layout-glyph-class-t"></a><h3>enum hb_ot_layout_glyph_class_t</h3>
 <div class="refsect3">
 <a name="hb-ot-layout-glyph-class-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -714,6 +714,6 @@ hb_ot_layout_language_get_required_feature_index
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 845bf04..0c85bdd 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-math: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-math: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">
 <link rel="next" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">
 <link rel="prev" href="harfbuzz-hb-ot-shape.html" title="hb-ot-shape">
 <link rel="next" href="harfbuzz-hb-shape-plan.html" title="hb-shape-plan">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-math.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-math.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 </tbody>
 </table></div>
 </div>
 </tbody>
 </table></div>
 </div>
-<div class="refsect1">
+<a name="hb-ot-math-glyph-variant-t"></a><a name="hb-ot-math-glyph-part-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-ot-math.other"></a><h2>Types and Values</h2>
 <a name="harfbuzz-hb-ot-math.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 </tr>
 <tr>
 <td class="datatype_keyword"> </td>
 </tr>
 <tr>
 <td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t" title="hb_ot_math_glyph_variant_t">hb_ot_math_glyph_variant_t</a></td>
+<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>
 </tr>
 <tr>
 <td class="datatype_keyword">enum</td>
 </tr>
 <tr>
 <td class="datatype_keyword">enum</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-ot-math.html#hb-ot-math-glyph-part-t" 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-struct" 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>
 </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="/home/behdad/.local/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
+<pre class="screen">    <a href="/home/behdad/.local/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="/home/behdad/.local/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="/home/behdad/.local/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
     <span class="lineart">├──</span> hb_ot_math_constant_t
     <span class="lineart">╰──</span> hb_ot_math_kern_t
     <a href="/home/behdad/.local/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
@@ -174,7 +177,7 @@ hb_ot_math_has_data (<em class="parameter"><code><a class="link" href="harfbuzz-
 face.</p>
 <div class="refsect3">
 <a name="hb-ot-math-has-data.parameters"></a><h4>Parameters</h4>
 face.</p>
 <div class="refsect3">
 <a name="hb-ot-math-has-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -206,7 +209,7 @@ HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN then the return value is
 actually an integer between 0 and 100 representing that percentage.</p>
 <div class="refsect3">
 <a name="hb-ot-math-get-constant.parameters"></a><h4>Parameters</h4>
 actually an integer between 0 and 100 representing that percentage.</p>
 <div class="refsect3">
 <a name="hb-ot-math-get-constant.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -241,7 +244,7 @@ hb_ot_math_get_glyph_italics_correction
                                 <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-ot-math-get-glyph-italics-correction.parameters"></a><h4>Parameters</h4>
                                 <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-ot-math-get-glyph-italics-correction.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -276,7 +279,7 @@ hb_ot_math_get_glyph_top_accent_attachment
                                 <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-ot-math-get-glyph-top-accent-attachment.parameters"></a><h4>Parameters</h4>
                                 <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-ot-math-get-glyph-top-accent-attachment.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -317,7 +320,7 @@ correction_height. If one is found the corresponding value from the list of
 kerns is returned and otherwise the last kern value is returned.</p>
 <div class="refsect3">
 <a name="hb-ot-math-get-glyph-kerning.parameters"></a><h4>Parameters</h4>
 kerns is returned and otherwise the last kern value is returned.</p>
 <div class="refsect3">
 <a name="hb-ot-math-get-glyph-kerning.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -361,7 +364,7 @@ hb_ot_math_is_glyph_extended_shape (<em class="parameter"><code><a class="link"
                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-ot-math-is-glyph-extended-shape.parameters"></a><h4>Parameters</h4>
                                     <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-ot-math-is-glyph-extended-shape.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -396,14 +399,14 @@ hb_ot_math_get_glyph_variants (<em class="parameter"><code><a class="link" href=
                                <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-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" title="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"><span class="type">hb_ot_math_glyph_variant_t</span></a> *variants</code></em>);</pre>
 <p>This function tries to retrieve the MathGlyphConstruction for the specified
 font, glyph and direction. Note that only the value 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 considered. It provides the corresponding list
 of size variants as an array of hb_ot_math_glyph_variant_t structs.</p>
 <div class="refsect3">
 <a name="hb-ot-math-get-glyph-variants.parameters"></a><h4>Parameters</h4>
 <p>This function tries to retrieve the MathGlyphConstruction for the specified
 font, glyph and direction. Note that only the value 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 considered. It provides the corresponding list
 of size variants as an array of hb_ot_math_glyph_variant_t structs.</p>
 <div class="refsect3">
 <a name="hb-ot-math-get-glyph-variants.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -463,7 +466,7 @@ assembly in the specified direction. Note that only the value 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 considered.</p>
 <div class="refsect3">
 <a name="hb-ot-math-get-min-connector-overlap.parameters"></a><h4>Parameters</h4>
 <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 considered.</p>
 <div class="refsect3">
 <a name="hb-ot-math-get-min-connector-overlap.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -498,15 +501,15 @@ hb_ot_math_get_glyph_assembly (<em class="parameter"><code><a class="link" href=
                                <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-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" 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-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-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *italics_correction</code></em>);</pre>
 <p>This function tries to retrieve the GlyphAssembly for the specified font,
 glyph and direction. Note that only the value 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 considered. It provides the information necessary to draw the glyph
                                <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>This function tries to retrieve the GlyphAssembly for the specified font,
 glyph and direction. Note that only the value 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 considered. It provides the information necessary to draw the glyph
-assembly as an array 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>.</p>
+assembly as an array 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>.</p>
 <div class="refsect3">
 <a name="hb-ot-math-get-glyph-assembly.parameters"></a><h4>Parameters</h4>
 <div class="refsect3">
 <a name="hb-ot-math-get-glyph-assembly.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -564,19 +567,21 @@ to store the result</p></td>
 <a name="harfbuzz-hb-ot-math.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
 <a name="HB-OT-TAG-MATH:CAPS"></a><h3>HB_OT_TAG_MATH</h3>
 <a name="harfbuzz-hb-ot-math.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
 <a name="HB-OT-TAG-MATH:CAPS"></a><h3>HB_OT_TAG_MATH</h3>
-<pre class="programlisting">#define             HB_OT_TAG_MATH</pre>
+<pre class="programlisting">#define HB_OT_TAG_MATH HB_TAG('M','A','T','H')
+</pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-MATH-SCRIPT:CAPS"></a><h3>HB_OT_MATH_SCRIPT</h3>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-OT-MATH-SCRIPT:CAPS"></a><h3>HB_OT_MATH_SCRIPT</h3>
-<pre class="programlisting">#define             HB_OT_MATH_SCRIPT</pre>
+<pre class="programlisting">#define HB_OT_MATH_SCRIPT HB_TAG('m','a','t','h')
+</pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ot-math-constant-t"></a><h3>enum hb_ot_math_constant_t</h3>
 <div class="refsect3">
 <a name="hb-ot-math-constant-t.members"></a><h4>Members</h4>
 </div>
 <hr>
 <div class="refsect2">
 <a name="hb-ot-math-constant-t"></a><h3>enum hb_ot_math_constant_t</h3>
 <div class="refsect3">
 <a name="hb-ot-math-constant-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -873,7 +878,7 @@ to store the result</p></td>
 <a name="hb-ot-math-kern-t"></a><h3>enum hb_ot_math_kern_t</h3>
 <div class="refsect3">
 <a name="hb-ot-math-kern-t.members"></a><h4>Members</h4>
 <a name="hb-ot-math-kern-t"></a><h3>enum hb_ot_math_kern_t</h3>
 <div class="refsect3">
 <a name="hb-ot-math-kern-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -907,7 +912,7 @@ to store the result</p></td>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-ot-math-glyph-variant-t"></a><h3>hb_ot_math_glyph_variant_t</h3>
+<a name="hb-ot-math-glyph-variant-t-struct"></a><h3>hb_ot_math_glyph_variant_t</h3>
 <pre class="programlisting">typedef struct {
   hb_codepoint_t glyph;
   hb_position_t advance;
 <pre class="programlisting">typedef struct {
   hb_codepoint_t glyph;
   hb_position_t advance;
@@ -920,7 +925,7 @@ to store the result</p></td>
 <a name="hb-ot-math-glyph-part-flags-t"></a><h3>enum hb_ot_math_glyph_part_flags_t</h3>
 <div class="refsect3">
 <a name="hb-ot-math-glyph-part-flags-t.members"></a><h4>Members</h4>
 <a name="hb-ot-math-glyph-part-flags-t"></a><h3>enum hb_ot_math_glyph_part_flags_t</h3>
 <div class="refsect3">
 <a name="hb-ot-math-glyph-part-flags-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -937,7 +942,7 @@ to store the result</p></td>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-ot-math-glyph-part-t"></a><h3>hb_ot_math_glyph_part_t</h3>
+<a name="hb-ot-math-glyph-part-t-struct"></a><h3>hb_ot_math_glyph_part_t</h3>
 <pre class="programlisting">typedef struct {
   hb_codepoint_t glyph;
   hb_position_t start_connector_length;
 <pre class="programlisting">typedef struct {
   hb_codepoint_t glyph;
   hb_position_t start_connector_length;
@@ -951,6 +956,6 @@ to store the result</p></td>
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index f96da37..f33f2a4 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-shape: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-shape: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz 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">
 <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.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-shape.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-shape.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -69,6 +69,6 @@ hb_ot_shape_glyphs_closure (<em class="parameter"><code><a class="link" href="ha
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index c59ccd3..2ebf67d 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-tag: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot-tag: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">
 <link rel="next" href="harfbuzz-hb-ot-font.html" title="hb-ot-font">
 <link rel="prev" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">
 <link rel="next" href="harfbuzz-hb-ot-font.html" title="hb-ot-font">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-tag.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-tag.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -76,7 +76,7 @@
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-tag.other"></a><h2>Types and Values</h2>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-ot-tag.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -146,6 +146,6 @@ hb_ot_tags_from_script (<em class="parameter"><code><a class="link" href="harfbu
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 3e19070..4af82e6 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-ot: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-set.html" title="hb-set">
 <link rel="next" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">
 <link rel="prev" href="harfbuzz-hb-set.html" title="hb-set">
 <link rel="next" href="harfbuzz-hb-ot-layout.html" title="hb-ot-layout">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -43,6 +43,6 @@
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index ff1f332..7f9db9e 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-set: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-set: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">
 <link rel="next" href="harfbuzz-hb-ot.html" title="hb-ot">
 <link rel="prev" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">
 <link rel="next" href="harfbuzz-hb-ot.html" title="hb-ot">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-set.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-set.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 </tr>
 <tr>
 <td class="function_type">
 </tr>
 <tr>
 <td class="function_type">
-<span class="returnvalue">void</span>
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
 </td>
 <td class="function_name">
-<a class="link" href="harfbuzz-hb-set.html#hb-set-invert" title="hb_set_invert ()">hb_set_invert</a> <span class="c_punctuation">()</span>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-empty" title="hb_set_is_empty ()">hb_set_is_empty</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
 </td>
 </tr>
 <tr>
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
-<a class="link" href="harfbuzz-hb-set.html#hb-set-is-empty" title="hb_set_is_empty ()">hb_set_is_empty</a> <span class="c_punctuation">()</span>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-is-equal" title="hb_set_is_equal ()">hb_set_is_equal</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
 </td>
 </tr>
 <tr>
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
-<a class="link" href="harfbuzz-hb-set.html#hb-set-is-equal" title="hb_set_is_equal ()">hb_set_is_equal</a> <span class="c_punctuation">()</span>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-next" title="hb_set_next ()">hb_set_next</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
 </td>
 </tr>
 <tr>
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 </td>
 <td class="function_name">
-<a class="link" href="harfbuzz-hb-set.html#hb-set-next" title="hb_set_next ()">hb_set_next</a> <span class="c_punctuation">()</span>
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous" title="hb_set_previous ()">hb_set_previous</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
 </td>
 </tr>
 <tr>
 </tr>
 <tr>
 <td class="function_type">
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="harfbuzz-hb-set.html#hb-set-previous-range" title="hb_set_previous_range ()">hb_set_previous_range</a> <span class="c_punctuation">()</span>
+</td>
+</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> *
 </td>
 <td class="function_name">
 <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
 </td>
 <td class="function_name">
 </div>
 <a name="hb-set-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-set.other"></a><h2>Types and Values</h2>
 </div>
 <a name="hb-set-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-set.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -287,7 +295,7 @@ hb_set_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
             <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>
             <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -311,7 +319,7 @@ hb_set_add_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> last</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-set-add-range.parameters"></a><h4>Parameters</h4>
                   <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">
 <a name="hb-set-add-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -333,7 +341,7 @@ hb_set_add_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 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>
 <div class="refsect3">
 <a name="hb-set-allocation-successful.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-set-allocation-successful.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -355,7 +363,7 @@ hb_set_allocation_successful (<em class="parameter"><code>const <a class="link"
 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>
 <div class="refsect3">
 <a name="hb-set-clear.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-set-clear.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -391,7 +399,7 @@ hb_set_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
             <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>
             <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -415,7 +423,7 @@ hb_set_del_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> last</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-set-del-range.parameters"></a><h4>Parameters</h4>
                   <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">
 <a name="hb-set-del-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -438,7 +446,7 @@ hb_set_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-se
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -473,7 +481,7 @@ hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz
 <p>Finds the maximum number in the set.</p>
 <div class="refsect3">
 <a name="hb-set-get-max.parameters"></a><h4>Parameters</h4>
 <p>Finds the maximum number in the set.</p>
 <div class="refsect3">
 <a name="hb-set-get-max.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -500,7 +508,7 @@ hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz
 <p>Finds the minimum number in the set.</p>
 <div class="refsect3">
 <a name="hb-set-get-min.parameters"></a><h4>Parameters</h4>
 <p>Finds the minimum number in the set.</p>
 <div class="refsect3">
 <a name="hb-set-get-min.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -527,7 +535,7 @@ hb_set_get_population (<em class="parameter"><code>const <a class="link" href="h
 <p>Returns the number of numbers in the set.</p>
 <div class="refsect3">
 <a name="hb-set-get-population.parameters"></a><h4>Parameters</h4>
 <p>Returns the number of numbers in the set.</p>
 <div class="refsect3">
 <a name="hb-set-get-population.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -555,7 +563,7 @@ hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -583,7 +591,7 @@ hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> codepoint</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-set-has.parameters"></a><h4>Parameters</h4>
             <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -606,7 +614,7 @@ hb_set_intersect (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
                   <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>
 <div class="refsect3">
 <a name="hb-set-intersect.parameters"></a><h4>Parameters</h4>
                   <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>
 <div class="refsect3">
 <a name="hb-set-intersect.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -623,34 +631,12 @@ hb_set_intersect (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
-<a name="hb-set-invert"></a><h3>hb_set_invert ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-hb_set_invert (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
-<div class="refsect3">
-<a name="hb-set-invert.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody><tr>
-<td class="parameter_name"><p>set</p></td>
-<td class="parameter_description"><p>a set.</p></td>
-<td class="parameter_annotations"> </td>
-</tr></tbody>
-</table></div>
-</div>
-<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-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>
 <div class="refsect3">
 <a name="hb-set-is-empty.parameters"></a><h4>Parameters</h4>
 <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>
 <div class="refsect3">
 <a name="hb-set-is-empty.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -673,7 +659,7 @@ hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuz
                  <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>
 <div class="refsect3">
 <a name="hb-set-is-equal.parameters"></a><h4>Parameters</h4>
                  <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>
 <div class="refsect3">
 <a name="hb-set-is-equal.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -694,9 +680,14 @@ hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuz
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_set_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>,
              <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>
 <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>,
              <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>
+.</p>
+<p>Set <em class="parameter"><code>codepoint</code></em>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
 <div class="refsect3">
 <a name="hb-set-next.parameters"></a><h4>Parameters</h4>
 <div class="refsect3">
 <a name="hb-set-next.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -724,6 +715,45 @@ hb_set_next (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <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>,
+                 <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 slower than current value of <em class="parameter"><code>codepoint</code></em>
+.</p>
+<p>Set <em class="parameter"><code>codepoint</code></em>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
+<div class="refsect3">
+<a name="hb-set-previous.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>codepoint</p></td>
+<td class="parameter_description"><p>. </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>
+<div class="refsect3">
+<a name="hb-set-previous.returns"></a><h4>Returns</h4>
+<p> whether there was a previous value.</p>
+</div>
+<p class="since">Since: 1.8.0</p>
+</div>
+<hr>
+<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>,
 <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>,
@@ -733,9 +763,11 @@ hb_set_next_range (<em class="parameter"><code>const <a class="link" href="harfb
  that
 are greater than current value of <em class="parameter"><code>last</code></em>
 .</p>
  that
 are greater than current value of <em class="parameter"><code>last</code></em>
 .</p>
+<p>Set <em class="parameter"><code>last</code></em>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
 <div class="refsect3">
 <a name="hb-set-next-range.parameters"></a><h4>Parameters</h4>
 <div class="refsect3">
 <a name="hb-set-next-range.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -749,12 +781,12 @@ are greater than current value of <em class="parameter"><code>last</code></em>
 </tr>
 <tr>
 <td class="parameter_name"><p>first</p></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>first</p></td>
-<td class="parameter_description"><p> output first codepoint in the range. </p></td>
+<td class="parameter_description"><p>output first codepoint in the range. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>last</p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>last</p></td>
-<td class="parameter_description"><p> input current last and output last codepoint in the range. </p></td>
+<td class="parameter_description"><p>input current last and output last codepoint in the range. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
 </tr>
 </tbody>
 <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>
@@ -768,13 +800,59 @@ are greater than current value of <em class="parameter"><code>last</code></em>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <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>,
+                       <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>
+ that
+are greater than current value of <em class="parameter"><code>last</code></em>
+.</p>
+<p>Set <em class="parameter"><code>first</code></em>
+ to <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> to get started.</p>
+<div class="refsect3">
+<a name="hb-set-previous-range.parameters"></a><h4>Parameters</h4>
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>set</p></td>
+<td class="parameter_description"><p>a set.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>first</p></td>
+<td class="parameter_description"><p>input current first and output first codepoint in the range. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>last</p></td>
+<td class="parameter_description"><p>output last codepoint in the range. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="hb-set-previous-range.returns"></a><h4>Returns</h4>
+<p> whether there was a previous range.</p>
+</div>
+<p class="since">Since: 1.8.0</p>
+</div>
+<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>
 <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>
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -802,7 +880,7 @@ hb_set_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.ht
             <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>
 <div class="refsect3">
 <a name="hb-set-set.parameters"></a><h4>Parameters</h4>
             <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>
 <div class="refsect3">
 <a name="hb-set-set.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -829,7 +907,7 @@ hb_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-set-set-user-data.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-set-set-user-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -852,7 +930,7 @@ hb_set_subtract (<em class="parameter"><code><a class="link" href="harfbuzz-hb-s
                  <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>
 <div class="refsect3">
 <a name="hb-set-subtract.parameters"></a><h4>Parameters</h4>
                  <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>
 <div class="refsect3">
 <a name="hb-set-subtract.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -875,7 +953,7 @@ hb_set_symmetric_difference (<em class="parameter"><code><a class="link" href="h
                              <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>
 <div class="refsect3">
 <a name="hb-set-symmetric-difference.parameters"></a><h4>Parameters</h4>
                              <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>
 <div class="refsect3">
 <a name="hb-set-symmetric-difference.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -898,7 +976,7 @@ hb_set_union (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.
               <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>
 <div class="refsect3">
 <a name="hb-set-union.parameters"></a><h4>Parameters</h4>
               <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>
 <div class="refsect3">
 <a name="hb-set-union.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -930,6 +1008,6 @@ hb_set_union (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 729a7e8..13f235f 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-shape-plan: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-shape-plan: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">
 <link rel="next" href="harfbuzz-hb-glib.html" title="hb-glib">
 <link rel="prev" href="harfbuzz-hb-ot-math.html" title="hb-ot-math">
 <link rel="next" href="harfbuzz-hb-glib.html" title="hb-glib">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-shape-plan.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-shape-plan.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 </div>
 <a name="hb-shape-plan-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-shape-plan.other"></a><h2>Types and Values</h2>
 </div>
 <a name="hb-shape-plan-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-shape-plan.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -165,7 +165,7 @@ hb_shape_plan_create (<em class="parameter"><code><a class="link" href="harfbuzz
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-shape-plan-create.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-shape-plan-create.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -203,7 +203,7 @@ hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-shape-plan-create-cached.parameters"></a><h4>Parameters</h4>
                              <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-shape-plan-create-cached.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -262,7 +262,7 @@ hb_shape_plan_destroy (<em class="parameter"><code><a class="link" href="harfbuz
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -288,7 +288,7 @@ hb_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuz
                        <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>
                        <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -339,7 +339,7 @@ hb_shape_plan_get_empty (<em class="parameter"><code><span class="type">void</sp
 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>
 <div class="refsect3">
 <a name="hb-shape-plan-get-shaper.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-shape-plan-get-shaper.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -368,7 +368,7 @@ hb_shape_plan_get_user_data (<em class="parameter"><code><a class="link" href="h
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -396,7 +396,7 @@ hb_shape_plan_reference (<em class="parameter"><code><a class="link" href="harfb
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -428,7 +428,7 @@ hb_shape_plan_set_user_data (<em class="parameter"><code><a class="link" href="h
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-shape-plan-set-user-data.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-shape-plan-set-user-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -454,6 +454,6 @@ hb_shape_plan_set_user_data (<em class="parameter"><code><a class="link" href="h
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 3746b0e..e2bc935 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-unicode: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-unicode: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-common.html" title="hb-common">
 <link rel="next" href="harfbuzz-Buffers.html" title="Buffers">
 <link rel="prev" href="harfbuzz-hb-common.html" title="hb-common">
 <link rel="next" href="harfbuzz-Buffers.html" title="Buffers">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,7 +34,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-unicode.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-unicode.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 </div>
 <a name="hb-unicode-funcs-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-unicode.other"></a><h2>Types and Values</h2>
 </div>
 <a name="hb-unicode-funcs-t"></a><div class="refsect1">
 <a name="harfbuzz-hb-unicode.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -363,7 +363,7 @@ hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-h
                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *ab</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-unicode-compose.parameters"></a><h4>Parameters</h4>
                     <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>
 <div class="refsect3">
 <a name="hb-unicode-compose.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -405,7 +405,7 @@ hb_unicode_decompose (<em class="parameter"><code><a class="link" href="harfbuzz
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *b</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-unicode-decompose.parameters"></a><h4>Parameters</h4>
                       <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>
 <div class="refsect3">
 <a name="hb-unicode-decompose.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -441,7 +441,7 @@ hb_unicode_decompose_compatibility (<em class="parameter"><code><a class="link"
                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *decomposed</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-unicode-decompose-compatibility.parameters"></a><h4>Parameters</h4>
                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *decomposed</code></em>);</pre>
 <div class="refsect3">
 <a name="hb-unicode-decompose-compatibility.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -489,7 +489,7 @@ hb_unicode_funcs_create (<em class="parameter"><code><a class="link" href="harfb
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-create.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[Xconstructor]</span></p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-create.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -517,7 +517,7 @@ hb_unicode_funcs_destroy (<em class="parameter"><code><a class="link" href="harf
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -557,7 +557,7 @@ hb_unicode_funcs_get_empty (<em class="parameter"><code><span class="type">void<
 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>
 <div class="refsect3">
 <a name="hb-unicode-funcs-get-parent.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-unicode-funcs-get-parent.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -581,7 +581,7 @@ hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -608,7 +608,7 @@ hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href
 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>
 <div class="refsect3">
 <a name="hb-unicode-funcs-is-immutable.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-unicode-funcs-is-immutable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -630,7 +630,7 @@ hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href=
 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>
 <div class="refsect3">
 <a name="hb-unicode-funcs-make-immutable.parameters"></a><h4>Parameters</h4>
 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>
 <div class="refsect3">
 <a name="hb-unicode-funcs-make-immutable.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -653,7 +653,7 @@ hb_unicode_funcs_reference (<em class="parameter"><code><a class="link" href="ha
 <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>
 <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>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -684,7 +684,7 @@ hb_unicode_funcs_set_combining_class_func
                                 <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">
 <a name="hb-unicode-funcs-set-combining-class-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-unicode-funcs-set-combining-class-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -716,7 +716,7 @@ hb_unicode_funcs_set_compose_func (<em class="parameter"><code><a class="link" h
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-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">
 <a name="hb-unicode-funcs-set-compose-func.parameters"></a><h4>Parameters</h4>
                                    <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">
 <a name="hb-unicode-funcs-set-compose-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -749,7 +749,7 @@ hb_unicode_funcs_set_decompose_compatibility_func
                                 <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">
 <a name="hb-unicode-funcs-set-decompose-compatibility-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-unicode-funcs-set-decompose-compatibility-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -781,7 +781,7 @@ hb_unicode_funcs_set_decompose_func (<em class="parameter"><code><a class="link"
                                      <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">
 <a name="hb-unicode-funcs-set-decompose-func.parameters"></a><h4>Parameters</h4>
                                      <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">
 <a name="hb-unicode-funcs-set-decompose-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -814,7 +814,7 @@ hb_unicode_funcs_set_eastasian_width_func
                                 <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">
 <a name="hb-unicode-funcs-set-eastasian-width-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-unicode-funcs-set-eastasian-width-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -847,7 +847,7 @@ hb_unicode_funcs_set_general_category_func
                                 <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">
 <a name="hb-unicode-funcs-set-general-category-func.parameters"></a><h4>Parameters</h4>
                                 <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">
 <a name="hb-unicode-funcs-set-general-category-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -879,7 +879,7 @@ hb_unicode_funcs_set_mirroring_func (<em class="parameter"><code><a class="link"
                                      <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">
 <a name="hb-unicode-funcs-set-mirroring-func.parameters"></a><h4>Parameters</h4>
                                      <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">
 <a name="hb-unicode-funcs-set-mirroring-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -911,7 +911,7 @@ hb_unicode_funcs_set_script_func (<em class="parameter"><code><a class="link" hr
                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-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">
 <a name="hb-unicode-funcs-set-script-func.parameters"></a><h4>Parameters</h4>
                                   <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">
 <a name="hb-unicode-funcs-set-script-func.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -945,7 +945,7 @@ hb_unicode_funcs_set_user_data (<em class="parameter"><code><a class="link" href
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-set-user-data.parameters"></a><h4>Parameters</h4>
 <p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
 <div class="refsect3">
 <a name="hb-unicode-funcs-set-user-data.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -1021,7 +1021,7 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <a name="hb-unicode-combining-class-t"></a><h3>enum hb_unicode_combining_class_t</h3>
 <div class="refsect3">
 <a name="hb-unicode-combining-class-t.members"></a><h4>Members</h4>
 <a name="hb-unicode-combining-class-t"></a><h3>enum hb_unicode_combining_class_t</h3>
 <div class="refsect3">
 <a name="hb-unicode-combining-class-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1328,7 +1328,7 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <a name="hb-unicode-general-category-t"></a><h3>enum hb_unicode_general_category_t</h3>
 <div class="refsect3">
 <a name="hb-unicode-general-category-t.members"></a><h4>Members</h4>
 <a name="hb-unicode-general-category-t"></a><h3>enum hb_unicode_general_category_t</h3>
 <div class="refsect3">
 <a name="hb-unicode-general-category-t.members"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <col class="enum_members_description">
@@ -1492,6 +1492,6 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index b93855f..3d1d4d0 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-uniscribe: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-uniscribe: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">
 <link rel="next" href="harfbuzz-hb-coretext.html" title="hb-coretext">
 <link rel="prev" href="harfbuzz-hb-graphite2.html" title="hb-graphite2">
 <link rel="next" href="harfbuzz-hb-coretext.html" title="hb-coretext">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-uniscribe.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-uniscribe.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -80,6 +80,6 @@ hb_uniscribe_font_get_logfontw (<em class="parameter"><code><a class="link" href
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index f9ccb3f..3b06755 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-version: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb-version: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
 <link rel="prev" href="harfbuzz-Shaping.html" title="Shaping">
 <link rel="next" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">
 <link rel="prev" href="harfbuzz-Shaping.html" title="Shaping">
 <link rel="next" href="harfbuzz-hb-deprecated.html" title="hb-deprecated">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,7 +33,7 @@
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-version.functions"></a><h2>Functions</h2>
 </tr></table></div>
 <div class="refsect1">
 <a name="harfbuzz-hb-version.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
 <colgroup>
 <col width="150px" class="functions_return">
 <col class="functions_name">
@@ -73,7 +73,7 @@
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-version.other"></a><h2>Types and Values</h2>
 </div>
 <div class="refsect1">
 <a name="harfbuzz-hb-version.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
@@ -117,7 +117,7 @@ hb_version (<em class="parameter"><code>unsigned <span class="type">int</span> *
 <p>Returns library version as three integer components.</p>
 <div class="refsect3">
 <a name="hb-version.parameters"></a><h4>Parameters</h4>
 <p>Returns library version as three integer components.</p>
 <div class="refsect3">
 <a name="hb-version.parameters"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
+<div class="informaltable"><table class="informaltable" width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
 <colgroup>
 <col width="150px" class="parameters_name">
 <col class="parameters_description">
@@ -126,17 +126,17 @@ hb_version (<em class="parameter"><code>unsigned <span class="type">int</span> *
 <tbody>
 <tr>
 <td class="parameter_name"><p>major</p></td>
 <tbody>
 <tr>
 <td class="parameter_name"><p>major</p></td>
-<td class="parameter_description"><p> Library major version component. </p></td>
+<td class="parameter_description"><p>Library major version component. </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>minor</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>minor</p></td>
-<td class="parameter_description"><p> Library minor version component. </p></td>
+<td class="parameter_description"><p>Library minor version component. </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>micro</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>micro</p></td>
-<td class="parameter_description"><p> Library micro version component. </p></td>
+<td class="parameter_description"><p>Library micro version component. </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>
 <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>
@@ -170,30 +170,26 @@ hb_version_string (<em class="parameter"><code><span class="type">void</span></c
 <a name="harfbuzz-hb-version.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
 <a name="HB-VERSION-MAJOR:CAPS"></a><h3>HB_VERSION_MAJOR</h3>
 <a name="harfbuzz-hb-version.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
 <a name="HB-VERSION-MAJOR:CAPS"></a><h3>HB_VERSION_MAJOR</h3>
-<pre class="programlisting">#define HB_VERSION_MAJOR 1
-</pre>
+<pre class="programlisting">#define             HB_VERSION_MAJOR</pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-MICRO:CAPS"></a><h3>HB_VERSION_MICRO</h3>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-MICRO:CAPS"></a><h3>HB_VERSION_MICRO</h3>
-<pre class="programlisting">#define HB_VERSION_MICRO 6
-</pre>
+<pre class="programlisting">#define             HB_VERSION_MICRO</pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-MINOR:CAPS"></a><h3>HB_VERSION_MINOR</h3>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-MINOR:CAPS"></a><h3>HB_VERSION_MINOR</h3>
-<pre class="programlisting">#define HB_VERSION_MINOR 4
-</pre>
+<pre class="programlisting">#define             HB_VERSION_MINOR</pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-STRING:CAPS"></a><h3>HB_VERSION_STRING</h3>
 </div>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-STRING:CAPS"></a><h3>HB_VERSION_STRING</h3>
-<pre class="programlisting">#define HB_VERSION_STRING "1.4.6"
-</pre>
+<pre class="programlisting">#define             HB_VERSION_STRING</pre>
 </div>
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 98446c2..6089a9e 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>hb: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="ch08.html" title="Harfbuzz API">
-<link rel="prev" href="ch08.html" title="Harfbuzz API">
+<link rel="up" href="ch08.html" title="HarfBuzz API">
+<link rel="prev" href="ch08.html" title="HarfBuzz API">
 <link rel="next" href="harfbuzz-hb-common.html" title="hb-common">
 <link rel="next" href="harfbuzz-hb-common.html" title="hb-common">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -43,6 +43,6 @@
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index d6b070c..dff4321 100644 (file)
@@ -2,16 +2,16 @@
 <book xmlns="http://www.devhelp.net/book" title="HarfBuzz Manual" link="index.html" author="" name="harfbuzz" version="2" language="c">
   <chapters>
     <sub name="User's manual" link="pt01.html">
 <book xmlns="http://www.devhelp.net/book" title="HarfBuzz Manual" link="index.html" author="" name="harfbuzz" version="2" language="c">
   <chapters>
     <sub name="User's manual" link="pt01.html">
-      <sub name="What is Harfbuzz?" link="what-is-harfbuzz.html">
+      <sub name="What is HarfBuzz?" link="what-is-harfbuzz.html">
         <sub name="Why do I need it?" link="what-is-harfbuzz.html#why-do-i-need-it"/>
         <sub name="Why do I need it?" link="what-is-harfbuzz.html#why-do-i-need-it"/>
-        <sub name="Why is it called Harfbuzz?" link="why-is-it-called-harfbuzz.html"/>
+        <sub name="Why is it called HarfBuzz?" link="why-is-it-called-harfbuzz.html"/>
       </sub>
       </sub>
-      <sub name="Install Harfbuzz" link="install-harfbuzz.html">
+      <sub name="Install HarfBuzz" link="install-harfbuzz.html">
         <sub name="Download" link="install-harfbuzz.html#download"/>
         <sub name="Building" link="building.html"/>
       </sub>
         <sub name="Download" link="install-harfbuzz.html#download"/>
         <sub name="Building" link="building.html"/>
       </sub>
-      <sub name="Hello, Harfbuzz" link="hello-harfbuzz.html">
-        <sub name="What Harfbuzz doesn't do" link="hello-harfbuzz.html#what-harfbuzz-doesnt-do"/>
+      <sub name="Hello, HarfBuzz" link="hello-harfbuzz.html">
+        <sub name="What HarfBuzz doesn't do" link="hello-harfbuzz.html#what-harfbuzz-doesnt-do"/>
       </sub>
       <sub name="Buffers, language, script and direction" link="buffers-language-script-and-direction.html">
         <sub name="Creating and destroying buffers" link="buffers-language-script-and-direction.html#creating-and-destroying-buffers"/>
       </sub>
       <sub name="Buffers, language, script and direction" link="buffers-language-script-and-direction.html">
         <sub name="Creating and destroying buffers" link="buffers-language-script-and-direction.html#creating-and-destroying-buffers"/>
@@ -22,7 +22,7 @@
       </sub>
       <sub name="Fonts and faces" link="fonts-and-faces.html">
         <sub name="Using FreeType" link="fonts-and-faces.html#using-freetype"/>
       </sub>
       <sub name="Fonts and faces" link="fonts-and-faces.html">
         <sub name="Using FreeType" link="fonts-and-faces.html#using-freetype"/>
-        <sub name="Using Harfbuzz's native OpenType implementation" link="using-harfbuzzs-native-opentype-implementation.html"/>
+        <sub name="Using HarfBuzz's native OpenType implementation" link="using-harfbuzzs-native-opentype-implementation.html"/>
         <sub name="Using your own font functions" link="using-your-own-font-functions.html"/>
       </sub>
       <sub name="" link="clusters.html">
         <sub name="Using your own font functions" link="using-your-own-font-functions.html"/>
       </sub>
       <sub name="" link="clusters.html">
@@ -39,7 +39,7 @@
       <sub name="Glyph information" link="pt01.html#glyph-information"/>
     </sub>
     <sub name="Reference manual" link="pt02.html">
       <sub name="Glyph information" link="pt01.html#glyph-information"/>
     </sub>
     <sub name="Reference manual" link="pt02.html">
-      <sub name="Harfbuzz API" link="ch08.html">
+      <sub name="HarfBuzz API" link="ch08.html">
         <sub name="hb" link="harfbuzz-hb.html"/>
         <sub name="hb-common" link="harfbuzz-hb-common.html"/>
         <sub name="hb-unicode" link="harfbuzz-hb-unicode.html"/>
         <sub name="hb" link="harfbuzz-hb.html"/>
         <sub name="hb-common" link="harfbuzz-hb-common.html"/>
         <sub name="hb-unicode" link="harfbuzz-hb-unicode.html"/>
       <sub name="Index of new symbols in 1.1.3" link="api-index-1-1-3.html"/>
       <sub name="Index of new symbols in 1.2.3" link="api-index-1-2-3.html"/>
       <sub name="Index of new symbols in 1.3.3" link="api-index-1-3-3.html"/>
       <sub name="Index of new symbols in 1.1.3" link="api-index-1-1-3.html"/>
       <sub name="Index of new symbols in 1.2.3" link="api-index-1-2-3.html"/>
       <sub name="Index of new symbols in 1.3.3" link="api-index-1-3-3.html"/>
+      <sub name="Index of new symbols in 1.4.2" link="api-index-1-4-2.html"/>
+      <sub name="Index of new symbols in 1.4.3" link="api-index-1-4-3.html"/>
+      <sub name="Index of new symbols in 1.5.0" link="api-index-1-5-0.html"/>
+      <sub name="Index of new symbols in 1.6.0" link="api-index-1-6-0.html"/>
       <sub name="Index of deprecated API" link="deprecated-api-index.html"/>
       <sub name="Annotation Glossary" link="annotation-glossary.html"/>
     </sub>
       <sub name="Index of deprecated API" link="deprecated-api-index.html"/>
       <sub name="Annotation Glossary" link="annotation-glossary.html"/>
     </sub>
     <keyword type="function" name="hb_buffer_add_utf16 ()" link="harfbuzz-Buffers.html#hb-buffer-add-utf16" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_add_utf8 ()" link="harfbuzz-Buffers.html#hb-buffer-add-utf8" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_add_latin1 ()" link="harfbuzz-Buffers.html#hb-buffer-add-latin1" since="0.9.39"/>
     <keyword type="function" name="hb_buffer_add_utf16 ()" link="harfbuzz-Buffers.html#hb-buffer-add-utf16" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_add_utf8 ()" link="harfbuzz-Buffers.html#hb-buffer-add-utf8" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_add_latin1 ()" link="harfbuzz-Buffers.html#hb-buffer-add-latin1" since="0.9.39"/>
+    <keyword type="function" name="hb_buffer_append ()" link="harfbuzz-Buffers.html#hb-buffer-append" since="1.5.0"/>
     <keyword type="function" name="hb_buffer_set_content_type ()" link="harfbuzz-Buffers.html#hb-buffer-set-content-type" since="0.9.5"/>
     <keyword type="function" name="hb_buffer_get_content_type ()" link="harfbuzz-Buffers.html#hb-buffer-get-content-type" since="0.9.5"/>
     <keyword type="function" name="hb_buffer_set_direction ()" link="harfbuzz-Buffers.html#hb-buffer-set-direction" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_set_content_type ()" link="harfbuzz-Buffers.html#hb-buffer-set-content-type" since="0.9.5"/>
     <keyword type="function" name="hb_buffer_get_content_type ()" link="harfbuzz-Buffers.html#hb-buffer-get-content-type" since="0.9.5"/>
     <keyword type="function" name="hb_buffer_set_direction ()" link="harfbuzz-Buffers.html#hb-buffer-set-direction" since="0.9.2"/>
     <keyword type="function" name="hb_buffer_serialize_list_formats ()" link="harfbuzz-Buffers.html#hb-buffer-serialize-list-formats" since="0.9.7"/>
     <keyword type="function" name="hb_segment_properties_equal ()" link="harfbuzz-Buffers.html#hb-segment-properties-equal" since="0.9.7"/>
     <keyword type="function" name="hb_segment_properties_hash ()" link="harfbuzz-Buffers.html#hb-segment-properties-hash" since="0.9.7"/>
     <keyword type="function" name="hb_buffer_serialize_list_formats ()" link="harfbuzz-Buffers.html#hb-buffer-serialize-list-formats" since="0.9.7"/>
     <keyword type="function" name="hb_segment_properties_equal ()" link="harfbuzz-Buffers.html#hb-segment-properties-equal" since="0.9.7"/>
     <keyword type="function" name="hb_segment_properties_hash ()" link="harfbuzz-Buffers.html#hb-segment-properties-hash" since="0.9.7"/>
+    <keyword type="function" name="hb_buffer_diff ()" link="harfbuzz-Buffers.html#hb-buffer-diff" since="1.5.0"/>
     <keyword type="function" name="hb_buffer_set_message_func ()" link="harfbuzz-Buffers.html#hb-buffer-set-message-func" since="1.1.3"/>
     <keyword type="function" name="hb_buffer_set_message_func ()" link="harfbuzz-Buffers.html#hb-buffer-set-message-func" since="1.1.3"/>
+    <keyword type="function" name="hb_glyph_info_get_glyph_flags ()" link="harfbuzz-Buffers.html#hb-glyph-info-get-glyph-flags" since="1.5.0"/>
     <keyword type="function" name="hb_buffer_message_func_t ()" link="harfbuzz-Buffers.html#hb-buffer-message-func-t"/>
     <keyword type="macro" name="HB_SEGMENT_PROPERTIES_DEFAULT" link="harfbuzz-Buffers.html#HB-SEGMENT-PROPERTIES-DEFAULT:CAPS"/>
     <keyword type="macro" name="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT" link="harfbuzz-Buffers.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" since="0.9.31"/>
     <keyword type="typedef" name="hb_buffer_t" link="harfbuzz-Buffers.html#hb-buffer-t"/>
     <keyword type="struct" name="hb_glyph_info_t" link="harfbuzz-Buffers.html#hb-glyph-info-t-struct"/>
     <keyword type="function" name="hb_buffer_message_func_t ()" link="harfbuzz-Buffers.html#hb-buffer-message-func-t"/>
     <keyword type="macro" name="HB_SEGMENT_PROPERTIES_DEFAULT" link="harfbuzz-Buffers.html#HB-SEGMENT-PROPERTIES-DEFAULT:CAPS"/>
     <keyword type="macro" name="HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT" link="harfbuzz-Buffers.html#HB-BUFFER-REPLACEMENT-CODEPOINT-DEFAULT:CAPS" since="0.9.31"/>
     <keyword type="typedef" name="hb_buffer_t" link="harfbuzz-Buffers.html#hb-buffer-t"/>
     <keyword type="struct" name="hb_glyph_info_t" link="harfbuzz-Buffers.html#hb-glyph-info-t-struct"/>
+    <keyword type="enum" name="enum hb_glyph_flags_t" link="harfbuzz-Buffers.html#hb-glyph-flags-t"/>
     <keyword type="struct" name="hb_glyph_position_t" link="harfbuzz-Buffers.html#hb-glyph-position-t-struct"/>
     <keyword type="enum" name="enum hb_buffer_content_type_t" link="harfbuzz-Buffers.html#hb-buffer-content-type-t"/>
     <keyword type="enum" name="enum hb_buffer_flags_t" link="harfbuzz-Buffers.html#hb-buffer-flags-t" since="0.9.20"/>
     <keyword type="struct" name="hb_glyph_position_t" link="harfbuzz-Buffers.html#hb-glyph-position-t-struct"/>
     <keyword type="enum" name="enum hb_buffer_content_type_t" link="harfbuzz-Buffers.html#hb-buffer-content-type-t"/>
     <keyword type="enum" name="enum hb_buffer_flags_t" link="harfbuzz-Buffers.html#hb-buffer-flags-t" since="0.9.20"/>
     <keyword type="struct" name="hb_segment_properties_t" link="harfbuzz-Buffers.html#hb-segment-properties-t-struct"/>
     <keyword type="enum" name="enum hb_buffer_serialize_format_t" link="harfbuzz-Buffers.html#hb-buffer-serialize-format-t" since="0.9.2"/>
     <keyword type="enum" name="enum hb_buffer_serialize_flags_t" link="harfbuzz-Buffers.html#hb-buffer-serialize-flags-t" since="0.9.20"/>
     <keyword type="struct" name="hb_segment_properties_t" link="harfbuzz-Buffers.html#hb-segment-properties-t-struct"/>
     <keyword type="enum" name="enum hb_buffer_serialize_format_t" link="harfbuzz-Buffers.html#hb-buffer-serialize-format-t" since="0.9.2"/>
     <keyword type="enum" name="enum hb_buffer_serialize_flags_t" link="harfbuzz-Buffers.html#hb-buffer-serialize-flags-t" since="0.9.20"/>
+    <keyword type="enum" name="enum hb_buffer_diff_flags_t" link="harfbuzz-Buffers.html#hb-buffer-diff-flags-t"/>
     <keyword type="function" name="hb_blob_create ()" link="harfbuzz-hb-blob.html#hb-blob-create" since="0.9.2"/>
     <keyword type="function" name="hb_blob_create_sub_blob ()" link="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" since="0.9.2"/>
     <keyword type="function" name="hb_blob_create ()" link="harfbuzz-hb-blob.html#hb-blob-create" since="0.9.2"/>
     <keyword type="function" name="hb_blob_create_sub_blob ()" link="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" since="0.9.2"/>
+    <keyword type="function" name="hb_blob_copy_writable_or_fail ()" link="harfbuzz-hb-blob.html#hb-blob-copy-writable-or-fail" since="1.8.0"/>
     <keyword type="function" name="hb_blob_destroy ()" link="harfbuzz-hb-blob.html#hb-blob-destroy" since="0.9.2"/>
     <keyword type="function" name="hb_blob_get_data ()" link="harfbuzz-hb-blob.html#hb-blob-get-data" since="0.9.2"/>
     <keyword type="function" name="hb_blob_get_data_writable ()" link="harfbuzz-hb-blob.html#hb-blob-get-data-writable" since="0.9.2"/>
     <keyword type="function" name="hb_blob_destroy ()" link="harfbuzz-hb-blob.html#hb-blob-destroy" since="0.9.2"/>
     <keyword type="function" name="hb_blob_get_data ()" link="harfbuzz-hb-blob.html#hb-blob-get-data" since="0.9.2"/>
     <keyword type="function" name="hb_blob_get_data_writable ()" link="harfbuzz-hb-blob.html#hb-blob-get-data-writable" since="0.9.2"/>
     <keyword type="function" name="hb_face_create_for_tables ()" link="harfbuzz-hb-face.html#hb-face-create-for-tables" since="0.9.2"/>
     <keyword type="function" name="hb_face_destroy ()" link="harfbuzz-hb-face.html#hb-face-destroy" since="0.9.2"/>
     <keyword type="function" name="hb_face_get_empty ()" link="harfbuzz-hb-face.html#hb-face-get-empty" since="0.9.2"/>
     <keyword type="function" name="hb_face_create_for_tables ()" link="harfbuzz-hb-face.html#hb-face-create-for-tables" since="0.9.2"/>
     <keyword type="function" name="hb_face_destroy ()" link="harfbuzz-hb-face.html#hb-face-destroy" since="0.9.2"/>
     <keyword type="function" name="hb_face_get_empty ()" link="harfbuzz-hb-face.html#hb-face-get-empty" since="0.9.2"/>
+    <keyword type="function" name="hb_face_get_table_tags ()" link="harfbuzz-hb-face.html#hb-face-get-table-tags" since="1.6.0"/>
     <keyword type="function" name="hb_face_get_glyph_count ()" link="harfbuzz-hb-face.html#hb-face-get-glyph-count" since="0.9.7"/>
     <keyword type="function" name="hb_face_get_index ()" link="harfbuzz-hb-face.html#hb-face-get-index" since="0.9.2"/>
     <keyword type="function" name="hb_face_get_upem ()" link="harfbuzz-hb-face.html#hb-face-get-upem" since="0.9.2"/>
     <keyword type="function" name="hb_face_get_glyph_count ()" link="harfbuzz-hb-face.html#hb-face-get-glyph-count" since="0.9.7"/>
     <keyword type="function" name="hb_face_get_index ()" link="harfbuzz-hb-face.html#hb-face-get-index" since="0.9.2"/>
     <keyword type="function" name="hb_face_get_upem ()" link="harfbuzz-hb-face.html#hb-face-get-upem" since="0.9.2"/>
     <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_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_nominal_glyph_func_t ()" link="harfbuzz-hb-font.html#hb-font-get-nominal-glyph-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_scale ()" link="harfbuzz-hb-font.html#hb-font-get-scale" 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_scale ()" link="harfbuzz-hb-font.html#hb-font-get-scale" 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_is_immutable ()" link="harfbuzz-hb-font.html#hb-font-is-immutable" since="0.9.2"/>
     <keyword type="function" name="hb_font_make_immutable ()" link="harfbuzz-hb-font.html#hb-font-make-immutable" since="0.9.2"/>
     <keyword type="function" name="hb_font_reference ()" link="harfbuzz-hb-font.html#hb-font-reference" since="0.9.2"/>
     <keyword type="function" name="hb_font_is_immutable ()" link="harfbuzz-hb-font.html#hb-font-is-immutable" since="0.9.2"/>
     <keyword type="function" name="hb_font_make_immutable ()" link="harfbuzz-hb-font.html#hb-font-make-immutable" since="0.9.2"/>
     <keyword type="function" name="hb_font_reference ()" link="harfbuzz-hb-font.html#hb-font-reference" since="0.9.2"/>
+    <keyword type="function" name="hb_font_set_face ()" link="harfbuzz-hb-font.html#hb-font-set-face" since="1.4.3"/>
     <keyword type="function" name="hb_font_set_funcs ()" link="harfbuzz-hb-font.html#hb-font-set-funcs" since="0.9.2"/>
     <keyword type="function" name="hb_font_set_funcs_data ()" link="harfbuzz-hb-font.html#hb-font-set-funcs-data" since="0.9.2"/>
     <keyword type="function" name="hb_font_set_parent ()" link="harfbuzz-hb-font.html#hb-font-set-parent" since="1.0.5"/>
     <keyword type="function" name="hb_font_set_ppem ()" link="harfbuzz-hb-font.html#hb-font-set-ppem" since="0.9.2"/>
     <keyword type="function" name="hb_font_set_funcs ()" link="harfbuzz-hb-font.html#hb-font-set-funcs" since="0.9.2"/>
     <keyword type="function" name="hb_font_set_funcs_data ()" link="harfbuzz-hb-font.html#hb-font-set-funcs-data" since="0.9.2"/>
     <keyword type="function" name="hb_font_set_parent ()" link="harfbuzz-hb-font.html#hb-font-set-parent" since="1.0.5"/>
     <keyword type="function" name="hb_font_set_ppem ()" link="harfbuzz-hb-font.html#hb-font-set-ppem" since="0.9.2"/>
+    <keyword type="function" name="hb_font_set_ptem ()" link="harfbuzz-hb-font.html#hb-font-set-ptem" since="1.6.0"/>
     <keyword type="function" name="hb_font_set_scale ()" link="harfbuzz-hb-font.html#hb-font-set-scale" since="0.9.2"/>
     <keyword type="function" name="hb_font_set_user_data ()" link="harfbuzz-hb-font.html#hb-font-set-user-data" since="0.9.2"/>
     <keyword type="function" name="hb_variation_from_string ()" link="harfbuzz-hb-font.html#hb-variation-from-string" since="1.4.2"/>
     <keyword type="function" name="hb_font_set_scale ()" link="harfbuzz-hb-font.html#hb-font-set-scale" since="0.9.2"/>
     <keyword type="function" name="hb_font_set_user_data ()" link="harfbuzz-hb-font.html#hb-font-set-user-data" since="0.9.2"/>
     <keyword type="function" name="hb_variation_from_string ()" link="harfbuzz-hb-font.html#hb-variation-from-string" since="1.4.2"/>
     <keyword type="macro" name="HB_VERSION_STRING" link="harfbuzz-hb-version.html#HB-VERSION-STRING:CAPS"/>
     <keyword type="function" name="hb_font_funcs_set_glyph_func ()" link="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-func" deprecated="1.2.3" since="0.9.2"/>
     <keyword type="function" name="hb_font_get_glyph_func_t ()" link="harfbuzz-hb-deprecated.html#hb-font-get-glyph-func-t" deprecated=""/>
     <keyword type="macro" name="HB_VERSION_STRING" link="harfbuzz-hb-version.html#HB-VERSION-STRING:CAPS"/>
     <keyword type="function" name="hb_font_funcs_set_glyph_func ()" link="harfbuzz-hb-deprecated.html#hb-font-funcs-set-glyph-func" deprecated="1.2.3" since="0.9.2"/>
     <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_set_invert ()" link="harfbuzz-hb-deprecated.html#hb-set-invert" deprecated="1.6.1" since="0.9.10"/>
     <keyword type="macro" name="HB_BUFFER_FLAGS_DEFAULT" link="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" deprecated=""/>
     <keyword type="macro" name="HB_BUFFER_SERIALIZE_FLAGS_DEFAULT" link="harfbuzz-hb-deprecated.html#HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS" deprecated=""/>
     <keyword type="macro" name="HB_SCRIPT_CANADIAN_ABORIGINAL" link="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" deprecated=""/>
     <keyword type="macro" name="HB_BUFFER_FLAGS_DEFAULT" link="harfbuzz-hb-deprecated.html#HB-BUFFER-FLAGS-DEFAULT:CAPS" deprecated=""/>
     <keyword type="macro" name="HB_BUFFER_SERIALIZE_FLAGS_DEFAULT" link="harfbuzz-hb-deprecated.html#HB-BUFFER-SERIALIZE-FLAGS-DEFAULT:CAPS" deprecated=""/>
     <keyword type="macro" name="HB_SCRIPT_CANADIAN_ABORIGINAL" link="harfbuzz-hb-deprecated.html#HB-SCRIPT-CANADIAN-ABORIGINAL:CAPS" deprecated=""/>
     <keyword type="function" name="hb_set_get_user_data ()" link="harfbuzz-hb-set.html#hb-set-get-user-data" since="0.9.2"/>
     <keyword type="function" name="hb_set_has ()" link="harfbuzz-hb-set.html#hb-set-has" since="0.9.2"/>
     <keyword type="function" name="hb_set_intersect ()" link="harfbuzz-hb-set.html#hb-set-intersect" since="0.9.2"/>
     <keyword type="function" name="hb_set_get_user_data ()" link="harfbuzz-hb-set.html#hb-set-get-user-data" since="0.9.2"/>
     <keyword type="function" name="hb_set_has ()" link="harfbuzz-hb-set.html#hb-set-has" since="0.9.2"/>
     <keyword type="function" name="hb_set_intersect ()" link="harfbuzz-hb-set.html#hb-set-intersect" since="0.9.2"/>
-    <keyword type="function" name="hb_set_invert ()" link="harfbuzz-hb-set.html#hb-set-invert" since="0.9.10"/>
     <keyword type="function" name="hb_set_is_empty ()" link="harfbuzz-hb-set.html#hb-set-is-empty" since="0.9.7"/>
     <keyword type="function" name="hb_set_is_equal ()" link="harfbuzz-hb-set.html#hb-set-is-equal" since="0.9.7"/>
     <keyword type="function" name="hb_set_next ()" link="harfbuzz-hb-set.html#hb-set-next" since="0.9.2"/>
     <keyword type="function" name="hb_set_is_empty ()" link="harfbuzz-hb-set.html#hb-set-is-empty" since="0.9.7"/>
     <keyword type="function" name="hb_set_is_equal ()" link="harfbuzz-hb-set.html#hb-set-is-equal" since="0.9.7"/>
     <keyword type="function" name="hb_set_next ()" link="harfbuzz-hb-set.html#hb-set-next" since="0.9.2"/>
+    <keyword type="function" name="hb_set_previous ()" link="harfbuzz-hb-set.html#hb-set-previous" since="1.8.0"/>
     <keyword type="function" name="hb_set_next_range ()" link="harfbuzz-hb-set.html#hb-set-next-range" since="0.9.7"/>
     <keyword type="function" name="hb_set_next_range ()" link="harfbuzz-hb-set.html#hb-set-next-range" since="0.9.7"/>
+    <keyword type="function" name="hb_set_previous_range ()" link="harfbuzz-hb-set.html#hb-set-previous-range" since="1.8.0"/>
     <keyword type="function" name="hb_set_reference ()" link="harfbuzz-hb-set.html#hb-set-reference" since="0.9.2"/>
     <keyword type="function" name="hb_set_set ()" link="harfbuzz-hb-set.html#hb-set-set" since="0.9.2"/>
     <keyword type="function" name="hb_set_set_user_data ()" link="harfbuzz-hb-set.html#hb-set-set-user-data" since="0.9.2"/>
     <keyword type="function" name="hb_set_reference ()" link="harfbuzz-hb-set.html#hb-set-reference" since="0.9.2"/>
     <keyword type="function" name="hb_set_set ()" link="harfbuzz-hb-set.html#hb-set-set" since="0.9.2"/>
     <keyword type="function" name="hb_set_set_user_data ()" link="harfbuzz-hb-set.html#hb-set-set-user-data" since="0.9.2"/>
     <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="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" 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="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="enum" name="enum hb_ot_math_glyph_part_flags_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-flags-t" since="1.3.3"/>
-    <keyword type="struct" name="hb_ot_math_glyph_part_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t" since="1.3.3"/>
+    <keyword type="struct" name="hb_ot_math_glyph_part_t" link="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t-struct"/>
     <keyword type="function" name="hb_shape_plan_create ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create" since="0.9.7"/>
     <keyword type="function" name="hb_shape_plan_create_cached ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached" since="0.9.7"/>
     <keyword type="function" name="hb_shape_plan_create2 ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create2"/>
     <keyword type="function" name="hb_shape_plan_create ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create" since="0.9.7"/>
     <keyword type="function" name="hb_shape_plan_create_cached ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create-cached" since="0.9.7"/>
     <keyword type="function" name="hb_shape_plan_create2 ()" link="harfbuzz-hb-shape-plan.html#hb-shape-plan-create2"/>
     <keyword type="function" name="hb_ft_face_create_referenced ()" link="harfbuzz-hb-ft.html#hb-ft-face-create-referenced" since="0.9.38"/>
     <keyword type="function" name="hb_ft_font_create ()" link="harfbuzz-hb-ft.html#hb-ft-font-create" since="0.9.2"/>
     <keyword type="function" name="hb_ft_font_create_referenced ()" link="harfbuzz-hb-ft.html#hb-ft-font-create-referenced" since="0.9.38"/>
     <keyword type="function" name="hb_ft_face_create_referenced ()" link="harfbuzz-hb-ft.html#hb-ft-face-create-referenced" since="0.9.38"/>
     <keyword type="function" name="hb_ft_font_create ()" link="harfbuzz-hb-ft.html#hb-ft-font-create" since="0.9.2"/>
     <keyword type="function" name="hb_ft_font_create_referenced ()" link="harfbuzz-hb-ft.html#hb-ft-font-create-referenced" since="0.9.38"/>
+    <keyword type="function" name="hb_ft_font_changed ()" link="harfbuzz-hb-ft.html#hb-ft-font-changed"/>
     <keyword type="function" name="hb_ft_font_get_face ()" link="harfbuzz-hb-ft.html#hb-ft-font-get-face"/>
     <keyword type="function" name="hb_ft_font_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_get_face ()" link="harfbuzz-hb-ft.html#hb-ft-font-get-face"/>
     <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_uniscribe_font_get_hfont ()" link="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-hfont"/>
     <keyword type="function" name="hb_uniscribe_font_get_logfontw ()" link="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-logfontw"/>
     <keyword type="function" name="hb_coretext_face_create ()" link="harfbuzz-hb-coretext.html#hb-coretext-face-create"/>
     <keyword type="function" name="hb_uniscribe_font_get_hfont ()" link="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-hfont"/>
     <keyword type="function" name="hb_uniscribe_font_get_logfontw ()" link="harfbuzz-hb-uniscribe.html#hb-uniscribe-font-get-logfontw"/>
     <keyword type="function" name="hb_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_font_get_ct_font ()" link="harfbuzz-hb-coretext.html#hb-coretext-font-get-ct-font"/>
     <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_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="macro" name="HB_CORETEXT_TAG_MORX" link="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORX:CAPS"/>
     <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="macro" name="HB_CORETEXT_TAG_MORT" link="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORT:CAPS"/>
     <keyword type="macro" name="HB_CORETEXT_TAG_MORX" link="harfbuzz-hb-coretext.html#HB-CORETEXT-TAG-MORX:CAPS"/>
     <keyword type="function" name="hb_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_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_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_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_memory_mode_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-memory-mode-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_memory_mode_get_type ()" link="harfbuzz-hb-gobject.html#hb-gobject-memory-mode-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_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_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="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_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_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_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_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_MEMORY_MODE" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MEMORY-MODE: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_MEMORY_MODE" link="harfbuzz-hb-gobject.html#HB-GOBJECT-TYPE-MEMORY-MODE: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_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_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="constant" name="HB_DIRECTION_RTL" link="harfbuzz-hb-common.html#HB-DIRECTION-RTL:CAPS"/>
     <keyword type="constant" name="HB_DIRECTION_TTB" link="harfbuzz-hb-common.html#HB-DIRECTION-TTB:CAPS"/>
     <keyword type="constant" name="HB_DIRECTION_BTT" link="harfbuzz-hb-common.html#HB-DIRECTION-BTT:CAPS"/>
     <keyword type="constant" name="HB_DIRECTION_RTL" link="harfbuzz-hb-common.html#HB-DIRECTION-RTL:CAPS"/>
     <keyword type="constant" name="HB_DIRECTION_TTB" link="harfbuzz-hb-common.html#HB-DIRECTION-TTB:CAPS"/>
     <keyword type="constant" name="HB_DIRECTION_BTT" link="harfbuzz-hb-common.html#HB-DIRECTION-BTT:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_COMMON" link="harfbuzz-hb-common.html#HB-SCRIPT-COMMON:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_INHERITED" link="harfbuzz-hb-common.html#HB-SCRIPT-INHERITED:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_UNKNOWN" link="harfbuzz-hb-common.html#HB-SCRIPT-UNKNOWN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_ARABIC" link="harfbuzz-hb-common.html#HB-SCRIPT-ARABIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_ARMENIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-ARMENIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_BENGALI" link="harfbuzz-hb-common.html#HB-SCRIPT-BENGALI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_CYRILLIC" link="harfbuzz-hb-common.html#HB-SCRIPT-CYRILLIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_DEVANAGARI" link="harfbuzz-hb-common.html#HB-SCRIPT-DEVANAGARI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_GEORGIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-GEORGIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_GREEK" link="harfbuzz-hb-common.html#HB-SCRIPT-GREEK:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_GUJARATI" link="harfbuzz-hb-common.html#HB-SCRIPT-GUJARATI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_GURMUKHI" link="harfbuzz-hb-common.html#HB-SCRIPT-GURMUKHI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_HANGUL" link="harfbuzz-hb-common.html#HB-SCRIPT-HANGUL:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_HAN" link="harfbuzz-hb-common.html#HB-SCRIPT-HAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_HEBREW" link="harfbuzz-hb-common.html#HB-SCRIPT-HEBREW:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_HIRAGANA" link="harfbuzz-hb-common.html#HB-SCRIPT-HIRAGANA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_KANNADA" link="harfbuzz-hb-common.html#HB-SCRIPT-KANNADA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_KATAKANA" link="harfbuzz-hb-common.html#HB-SCRIPT-KATAKANA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_LAO" link="harfbuzz-hb-common.html#HB-SCRIPT-LAO:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_LATIN" link="harfbuzz-hb-common.html#HB-SCRIPT-LATIN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MALAYALAM" link="harfbuzz-hb-common.html#HB-SCRIPT-MALAYALAM:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_ORIYA" link="harfbuzz-hb-common.html#HB-SCRIPT-ORIYA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TAMIL" link="harfbuzz-hb-common.html#HB-SCRIPT-TAMIL:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TELUGU" link="harfbuzz-hb-common.html#HB-SCRIPT-TELUGU:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_THAI" link="harfbuzz-hb-common.html#HB-SCRIPT-THAI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TIBETAN" link="harfbuzz-hb-common.html#HB-SCRIPT-TIBETAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_BOPOMOFO" link="harfbuzz-hb-common.html#HB-SCRIPT-BOPOMOFO:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_BRAILLE" link="harfbuzz-hb-common.html#HB-SCRIPT-BRAILLE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_CANADIAN_SYLLABICS" link="harfbuzz-hb-common.html#HB-SCRIPT-CANADIAN-SYLLABICS:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_CHEROKEE" link="harfbuzz-hb-common.html#HB-SCRIPT-CHEROKEE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_ETHIOPIC" link="harfbuzz-hb-common.html#HB-SCRIPT-ETHIOPIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_KHMER" link="harfbuzz-hb-common.html#HB-SCRIPT-KHMER:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MONGOLIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-MONGOLIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MYANMAR" link="harfbuzz-hb-common.html#HB-SCRIPT-MYANMAR:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OGHAM" link="harfbuzz-hb-common.html#HB-SCRIPT-OGHAM:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_RUNIC" link="harfbuzz-hb-common.html#HB-SCRIPT-RUNIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SINHALA" link="harfbuzz-hb-common.html#HB-SCRIPT-SINHALA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SYRIAC" link="harfbuzz-hb-common.html#HB-SCRIPT-SYRIAC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_THAANA" link="harfbuzz-hb-common.html#HB-SCRIPT-THAANA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_YI" link="harfbuzz-hb-common.html#HB-SCRIPT-YI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_DESERET" link="harfbuzz-hb-common.html#HB-SCRIPT-DESERET:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_GOTHIC" link="harfbuzz-hb-common.html#HB-SCRIPT-GOTHIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OLD_ITALIC" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-ITALIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_BUHID" link="harfbuzz-hb-common.html#HB-SCRIPT-BUHID:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_HANUNOO" link="harfbuzz-hb-common.html#HB-SCRIPT-HANUNOO:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TAGALOG" link="harfbuzz-hb-common.html#HB-SCRIPT-TAGALOG:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TAGBANWA" link="harfbuzz-hb-common.html#HB-SCRIPT-TAGBANWA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_CYPRIOT" link="harfbuzz-hb-common.html#HB-SCRIPT-CYPRIOT:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_LIMBU" link="harfbuzz-hb-common.html#HB-SCRIPT-LIMBU:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_LINEAR_B" link="harfbuzz-hb-common.html#HB-SCRIPT-LINEAR-B:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OSMANYA" link="harfbuzz-hb-common.html#HB-SCRIPT-OSMANYA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SHAVIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-SHAVIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TAI_LE" link="harfbuzz-hb-common.html#HB-SCRIPT-TAI-LE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_UGARITIC" link="harfbuzz-hb-common.html#HB-SCRIPT-UGARITIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_BUGINESE" link="harfbuzz-hb-common.html#HB-SCRIPT-BUGINESE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_COPTIC" link="harfbuzz-hb-common.html#HB-SCRIPT-COPTIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_GLAGOLITIC" link="harfbuzz-hb-common.html#HB-SCRIPT-GLAGOLITIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_KHAROSHTHI" link="harfbuzz-hb-common.html#HB-SCRIPT-KHAROSHTHI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_NEW_TAI_LUE" link="harfbuzz-hb-common.html#HB-SCRIPT-NEW-TAI-LUE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OLD_PERSIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-PERSIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SYLOTI_NAGRI" link="harfbuzz-hb-common.html#HB-SCRIPT-SYLOTI-NAGRI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TIFINAGH" link="harfbuzz-hb-common.html#HB-SCRIPT-TIFINAGH:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_BALINESE" link="harfbuzz-hb-common.html#HB-SCRIPT-BALINESE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_CUNEIFORM" link="harfbuzz-hb-common.html#HB-SCRIPT-CUNEIFORM:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_NKO" link="harfbuzz-hb-common.html#HB-SCRIPT-NKO:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_PHAGS_PA" link="harfbuzz-hb-common.html#HB-SCRIPT-PHAGS-PA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_PHOENICIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-PHOENICIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_CARIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-CARIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_CHAM" link="harfbuzz-hb-common.html#HB-SCRIPT-CHAM:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_KAYAH_LI" link="harfbuzz-hb-common.html#HB-SCRIPT-KAYAH-LI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_LEPCHA" link="harfbuzz-hb-common.html#HB-SCRIPT-LEPCHA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_LYCIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-LYCIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_LYDIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-LYDIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OL_CHIKI" link="harfbuzz-hb-common.html#HB-SCRIPT-OL-CHIKI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_REJANG" link="harfbuzz-hb-common.html#HB-SCRIPT-REJANG:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SAURASHTRA" link="harfbuzz-hb-common.html#HB-SCRIPT-SAURASHTRA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SUNDANESE" link="harfbuzz-hb-common.html#HB-SCRIPT-SUNDANESE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_VAI" link="harfbuzz-hb-common.html#HB-SCRIPT-VAI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_AVESTAN" link="harfbuzz-hb-common.html#HB-SCRIPT-AVESTAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_BAMUM" link="harfbuzz-hb-common.html#HB-SCRIPT-BAMUM:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_EGYPTIAN_HIEROGLYPHS" link="harfbuzz-hb-common.html#HB-SCRIPT-EGYPTIAN-HIEROGLYPHS:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_IMPERIAL_ARAMAIC" link="harfbuzz-hb-common.html#HB-SCRIPT-IMPERIAL-ARAMAIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_INSCRIPTIONAL_PAHLAVI" link="harfbuzz-hb-common.html#HB-SCRIPT-INSCRIPTIONAL-PAHLAVI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_INSCRIPTIONAL_PARTHIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-INSCRIPTIONAL-PARTHIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_JAVANESE" link="harfbuzz-hb-common.html#HB-SCRIPT-JAVANESE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_KAITHI" link="harfbuzz-hb-common.html#HB-SCRIPT-KAITHI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_LISU" link="harfbuzz-hb-common.html#HB-SCRIPT-LISU:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MEETEI_MAYEK" link="harfbuzz-hb-common.html#HB-SCRIPT-MEETEI-MAYEK:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OLD_SOUTH_ARABIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-SOUTH-ARABIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OLD_TURKIC" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-TURKIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SAMARITAN" link="harfbuzz-hb-common.html#HB-SCRIPT-SAMARITAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TAI_THAM" link="harfbuzz-hb-common.html#HB-SCRIPT-TAI-THAM:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TAI_VIET" link="harfbuzz-hb-common.html#HB-SCRIPT-TAI-VIET:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_BATAK" link="harfbuzz-hb-common.html#HB-SCRIPT-BATAK:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_BRAHMI" link="harfbuzz-hb-common.html#HB-SCRIPT-BRAHMI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MANDAIC" link="harfbuzz-hb-common.html#HB-SCRIPT-MANDAIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_CHAKMA" link="harfbuzz-hb-common.html#HB-SCRIPT-CHAKMA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MEROITIC_CURSIVE" link="harfbuzz-hb-common.html#HB-SCRIPT-MEROITIC-CURSIVE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MEROITIC_HIEROGLYPHS" link="harfbuzz-hb-common.html#HB-SCRIPT-MEROITIC-HIEROGLYPHS:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MIAO" link="harfbuzz-hb-common.html#HB-SCRIPT-MIAO:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SHARADA" link="harfbuzz-hb-common.html#HB-SCRIPT-SHARADA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SORA_SOMPENG" link="harfbuzz-hb-common.html#HB-SCRIPT-SORA-SOMPENG:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TAKRI" link="harfbuzz-hb-common.html#HB-SCRIPT-TAKRI:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_BASSA_VAH" link="harfbuzz-hb-common.html#HB-SCRIPT-BASSA-VAH:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_BASSA_VAH" link="harfbuzz-hb-common.html#HB-SCRIPT-BASSA-VAH:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_CAUCASIAN_ALBANIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-CAUCASIAN-ALBANIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_DUPLOYAN" link="harfbuzz-hb-common.html#HB-SCRIPT-DUPLOYAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_ELBASAN" link="harfbuzz-hb-common.html#HB-SCRIPT-ELBASAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_GRANTHA" link="harfbuzz-hb-common.html#HB-SCRIPT-GRANTHA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_KHOJKI" link="harfbuzz-hb-common.html#HB-SCRIPT-KHOJKI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_KHUDAWADI" link="harfbuzz-hb-common.html#HB-SCRIPT-KHUDAWADI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_LINEAR_A" link="harfbuzz-hb-common.html#HB-SCRIPT-LINEAR-A:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MAHAJANI" link="harfbuzz-hb-common.html#HB-SCRIPT-MAHAJANI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MANICHAEAN" link="harfbuzz-hb-common.html#HB-SCRIPT-MANICHAEAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MENDE_KIKAKUI" link="harfbuzz-hb-common.html#HB-SCRIPT-MENDE-KIKAKUI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MODI" link="harfbuzz-hb-common.html#HB-SCRIPT-MODI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MRO" link="harfbuzz-hb-common.html#HB-SCRIPT-MRO:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_NABATAEAN" link="harfbuzz-hb-common.html#HB-SCRIPT-NABATAEAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OLD_NORTH_ARABIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-NORTH-ARABIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OLD_PERMIC" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-PERMIC:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_PAHAWH_HMONG" link="harfbuzz-hb-common.html#HB-SCRIPT-PAHAWH-HMONG:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_PALMYRENE" link="harfbuzz-hb-common.html#HB-SCRIPT-PALMYRENE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_PAU_CIN_HAU" link="harfbuzz-hb-common.html#HB-SCRIPT-PAU-CIN-HAU:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_PSALTER_PAHLAVI" link="harfbuzz-hb-common.html#HB-SCRIPT-PSALTER-PAHLAVI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SIDDHAM" link="harfbuzz-hb-common.html#HB-SCRIPT-SIDDHAM:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TIRHUTA" link="harfbuzz-hb-common.html#HB-SCRIPT-TIRHUTA:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_WARANG_CITI" link="harfbuzz-hb-common.html#HB-SCRIPT-WARANG-CITI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_AHOM" link="harfbuzz-hb-common.html#HB-SCRIPT-AHOM:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_ANATOLIAN_HIEROGLYPHS" link="harfbuzz-hb-common.html#HB-SCRIPT-ANATOLIAN-HIEROGLYPHS:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_HATRAN" link="harfbuzz-hb-common.html#HB-SCRIPT-HATRAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MULTANI" link="harfbuzz-hb-common.html#HB-SCRIPT-MULTANI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OLD_HUNGARIAN" link="harfbuzz-hb-common.html#HB-SCRIPT-OLD-HUNGARIAN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_SIGNWRITING" link="harfbuzz-hb-common.html#HB-SCRIPT-SIGNWRITING:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_ADLAM" link="harfbuzz-hb-common.html#HB-SCRIPT-ADLAM:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_ADLAM" link="harfbuzz-hb-common.html#HB-SCRIPT-ADLAM:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_BHAIKSUKI" link="harfbuzz-hb-common.html#HB-SCRIPT-BHAIKSUKI:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_MARCHEN" link="harfbuzz-hb-common.html#HB-SCRIPT-MARCHEN:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_OSAGE" link="harfbuzz-hb-common.html#HB-SCRIPT-OSAGE:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_TANGUT" link="harfbuzz-hb-common.html#HB-SCRIPT-TANGUT:CAPS"/>
-    <keyword type="constant" name="HB_SCRIPT_NEWA" link="harfbuzz-hb-common.html#HB-SCRIPT-NEWA:CAPS"/>
+    <keyword type="constant" name="HB_SCRIPT_MASARAM_GONDI" link="harfbuzz-hb-common.html#HB-SCRIPT-MASARAM-GONDI:CAPS"/>
     <keyword type="constant" name="HB_SCRIPT_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_SCRIPT_INVALID" link="harfbuzz-hb-common.html#HB-SCRIPT-INVALID:CAPS"/>
     <keyword type="constant" name="_HB_SCRIPT_MAX_VALUE" link="harfbuzz-hb-common.html#HB-SCRIPT-MAX-VALUE:CAPS"/>
     <keyword type="constant" name="_HB_SCRIPT_MAX_VALUE_SIGNED" link="harfbuzz-hb-common.html#HB-SCRIPT-MAX-VALUE-SIGNED:CAPS"/>
     <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-LINE-SEPARATOR:CAPS"/>
     <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-PARAGRAPH-SEPARATOR:CAPS"/>
     <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-SPACE-SEPARATOR:CAPS"/>
     <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-LINE-SEPARATOR:CAPS"/>
     <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-PARAGRAPH-SEPARATOR:CAPS"/>
     <keyword type="constant" name="HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR" link="harfbuzz-hb-unicode.html#HB-UNICODE-GENERAL-CATEGORY-SPACE-SEPARATOR:CAPS"/>
+    <keyword type="constant" name="HB_GLYPH_FLAG_UNSAFE_TO_BREAK" link="harfbuzz-Buffers.html#HB-GLYPH-FLAG-UNSAFE-TO-BREAK:CAPS"/>
+    <keyword type="constant" name="HB_GLYPH_FLAG_DEFINED" link="harfbuzz-Buffers.html#HB-GLYPH-FLAG-DEFINED:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_INVALID" link="harfbuzz-Buffers.html#HB-BUFFER-CONTENT-TYPE-INVALID:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_UNICODE" link="harfbuzz-Buffers.html#HB-BUFFER-CONTENT-TYPE-UNICODE:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_GLYPHS" link="harfbuzz-Buffers.html#HB-BUFFER-CONTENT-TYPE-GLYPHS:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_INVALID" link="harfbuzz-Buffers.html#HB-BUFFER-CONTENT-TYPE-INVALID:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_UNICODE" link="harfbuzz-Buffers.html#HB-BUFFER-CONTENT-TYPE-UNICODE:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CONTENT_TYPE_GLYPHS" link="harfbuzz-Buffers.html#HB-BUFFER-CONTENT-TYPE-GLYPHS:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_FLAG_BOT" link="harfbuzz-Buffers.html#HB-BUFFER-FLAG-BOT:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_FLAG_EOT" link="harfbuzz-Buffers.html#HB-BUFFER-FLAG-EOT:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES" link="harfbuzz-Buffers.html#HB-BUFFER-FLAG-PRESERVE-DEFAULT-IGNORABLES:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_FLAG_BOT" link="harfbuzz-Buffers.html#HB-BUFFER-FLAG-BOT:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_FLAG_EOT" link="harfbuzz-Buffers.html#HB-BUFFER-FLAG-EOT:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES" link="harfbuzz-Buffers.html#HB-BUFFER-FLAG-PRESERVE-DEFAULT-IGNORABLES:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES" link="harfbuzz-Buffers.html#HB-BUFFER-FLAG-REMOVE-DEFAULT-IGNORABLES:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES" link="harfbuzz-Buffers.html#HB-BUFFER-CLUSTER-LEVEL-MONOTONE-GRAPHEMES:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS" link="harfbuzz-Buffers.html#HB-BUFFER-CLUSTER-LEVEL-MONOTONE-CHARACTERS:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_CHARACTERS" link="harfbuzz-Buffers.html#HB-BUFFER-CLUSTER-LEVEL-CHARACTERS:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES" link="harfbuzz-Buffers.html#HB-BUFFER-CLUSTER-LEVEL-MONOTONE-GRAPHEMES:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS" link="harfbuzz-Buffers.html#HB-BUFFER-CLUSTER-LEVEL-MONOTONE-CHARACTERS:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_CLUSTER_LEVEL_CHARACTERS" link="harfbuzz-Buffers.html#HB-BUFFER-CLUSTER-LEVEL-CHARACTERS:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS" link="harfbuzz-Buffers.html#HB-BUFFER-SERIALIZE-FLAG-NO-POSITIONS:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES" link="harfbuzz-Buffers.html#HB-BUFFER-SERIALIZE-FLAG-NO-GLYPH-NAMES:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS" link="harfbuzz-Buffers.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-EXTENTS:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS" link="harfbuzz-Buffers.html#HB-BUFFER-SERIALIZE-FLAG-NO-POSITIONS:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES" link="harfbuzz-Buffers.html#HB-BUFFER-SERIALIZE-FLAG-NO-GLYPH-NAMES:CAPS"/>
     <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS" link="harfbuzz-Buffers.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-EXTENTS:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS" link="harfbuzz-Buffers.html#HB-BUFFER-SERIALIZE-FLAG-GLYPH-FLAGS:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES" link="harfbuzz-Buffers.html#HB-BUFFER-SERIALIZE-FLAG-NO-ADVANCES:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_EQUAL" link="harfbuzz-Buffers.html#HB-BUFFER-DIFF-FLAG-EQUAL:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH" link="harfbuzz-Buffers.html#HB-BUFFER-DIFF-FLAG-CONTENT-TYPE-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH" link="harfbuzz-Buffers.html#HB-BUFFER-DIFF-FLAG-LENGTH-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT" link="harfbuzz-Buffers.html#HB-BUFFER-DIFF-FLAG-NOTDEF-PRESENT:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT" link="harfbuzz-Buffers.html#HB-BUFFER-DIFF-FLAG-DOTTED-CIRCLE-PRESENT:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH" link="harfbuzz-Buffers.html#HB-BUFFER-DIFF-FLAG-CODEPOINT-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH" link="harfbuzz-Buffers.html#HB-BUFFER-DIFF-FLAG-CLUSTER-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH" link="harfbuzz-Buffers.html#HB-BUFFER-DIFF-FLAG-GLYPH-FLAGS-MISMATCH:CAPS"/>
+    <keyword type="constant" name="HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH" link="harfbuzz-Buffers.html#HB-BUFFER-DIFF-FLAG-POSITION-MISMATCH:CAPS"/>
     <keyword type="constant" name="HB_MEMORY_MODE_DUPLICATE" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-DUPLICATE:CAPS"/>
     <keyword type="constant" name="HB_MEMORY_MODE_READONLY" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-READONLY:CAPS"/>
     <keyword type="constant" name="HB_MEMORY_MODE_WRITABLE" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-WRITABLE:CAPS"/>
     <keyword type="constant" name="HB_MEMORY_MODE_DUPLICATE" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-DUPLICATE:CAPS"/>
     <keyword type="constant" name="HB_MEMORY_MODE_READONLY" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-READONLY:CAPS"/>
     <keyword type="constant" name="HB_MEMORY_MODE_WRITABLE" link="harfbuzz-hb-blob.html#HB-MEMORY-MODE-WRITABLE:CAPS"/>
index 0bf8ed5..edc8985 100644 (file)
@@ -2,13 +2,13 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Hello, Harfbuzz: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<title>Hello, HarfBuzz: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt01.html" title="Part I. User's manual">
 <link rel="prev" href="building.html" title="Building">
 <link rel="next" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <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="building.html" title="Building">
 <link rel="next" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
-<a name="hello-harfbuzz"></a>Hello, Harfbuzz</h2></div></div></div>
-<div class="toc"><dl class="toc"><dt><span class="section"><a href="hello-harfbuzz.html#what-harfbuzz-doesnt-do">What Harfbuzz doesn't do</a></span></dt></dl></div>
+<a name="hello-harfbuzz"></a>Hello, HarfBuzz</h2></div></div></div>
+<div class="toc"><dl class="toc"><dt><span class="section"><a href="hello-harfbuzz.html#what-harfbuzz-doesnt-do">What HarfBuzz doesn't do</a></span></dt></dl></div>
 <p>
 <p>
-    Here's the simplest Harfbuzz that can possibly work. We will improve
+    Here's the simplest HarfBuzz that can possibly work. We will improve
     it later.
   </p>
 <div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
     it later.
   </p>
 <div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
 </pre>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
 </pre>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="what-harfbuzz-doesnt-do"></a>What Harfbuzz doesn't do</h2></div></div></div>
+<a name="what-harfbuzz-doesnt-do"></a>What HarfBuzz doesn't do</h2></div></div></div>
 <p>
       The code above will take a UTF8 string, shape it, and give you the
       information required to lay it out correctly on a single
       horizontal (or vertical) line using the font provided. That is the
 <p>
       The code above will take a UTF8 string, shape it, and give you the
       information required to lay it out correctly on a single
       horizontal (or vertical) line using the font provided. That is the
-      extent of Harfbuzz's responsibility.
+      extent of HarfBuzz's responsibility.
     </p>
 <p>
       If you are implementing a text layout engine you may have other
     </p>
 <p>
       If you are implementing a text layout engine you may have other
-      responsibilities, that Harfbuzz will not help you with:
+      responsibilities, that HarfBuzz will not help you with:
     </p>
 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
 <li class="listitem">
 <p>
     </p>
 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
 <li class="listitem">
 <p>
-          Harfbuzz won't help you with bidirectionality. If you want to
+          HarfBuzz won't help you with bidirectionality. If you want to
           lay out text with mixed Hebrew and English, you will need to
           lay out text with mixed Hebrew and English, you will need to
-          ensure that the buffer provided to Harfbuzz has those
+          ensure that the buffer provided to HarfBuzz has those
           characters in the correct layout order. This will be different
           from the logical order in which the Unicode text is stored. In
           other words, the user will hit the keys in the following
           characters in the correct layout order. This will be different
           from the logical order in which the Unicode text is stored. In
           other words, the user will hit the keys in the following
@@ -123,28 +123,28 @@ ABC אבג DEF
           ("bidi" is short for bidirectional), and there's an
           algorithm as an annex to the Unicode Standard which tells you how
           to reorder a string from logical order into presentation order.
           ("bidi" is short for bidirectional), and there's an
           algorithm as an annex to the Unicode Standard which tells you how
           to reorder a string from logical order into presentation order.
-          Before sending your string to Harfbuzz, you may need to apply the
+          Before sending your string to HarfBuzz, you may need to apply the
           bidi algorithm to it. Libraries such as ICU and fribidi can do
           this for you.
         </p>
 </li>
 <li class="listitem"><p>
           bidi algorithm to it. Libraries such as ICU and fribidi can do
           this for you.
         </p>
 </li>
 <li class="listitem"><p>
-          Harfbuzz won't help you with text that contains different font
+          HarfBuzz won't help you with text that contains different font
           properties. For instance, if you have the string "a
           <span class="emphasis"><em>huge</em></span> breakfast", and you expect
           "huge" to be italic, you will need to send three
           properties. For instance, if you have the string "a
           <span class="emphasis"><em>huge</em></span> breakfast", and you expect
           "huge" to be italic, you will need to send three
-          strings to Harfbuzz: <code class="literal">a</code>, in your Roman font;
+          strings to HarfBuzz: <code class="literal">a</code>, in your Roman font;
           <code class="literal">huge</code> using your italic font; and
           <code class="literal">breakfast</code> using your Roman font again.
           Similarly if you change font, font size, script, language or
           direction within your string, you will need to shape each run
           <code class="literal">huge</code> using your italic font; and
           <code class="literal">breakfast</code> using your Roman font again.
           Similarly if you change font, font size, script, language or
           direction within your string, you will need to shape each run
-          independently and then output them independently. Harfbuzz
+          independently and then output them independently. HarfBuzz
           expects to shape a run of characters sharing the same
           properties.
         </p></li>
 <li class="listitem">
 <p>
           expects to shape a run of characters sharing the same
           properties.
         </p></li>
 <li class="listitem">
 <p>
-          Harfbuzz won't help you with line breaking, hyphenation or
+          HarfBuzz won't help you with line breaking, hyphenation or
           justification. As mentioned above, it lays out the string
           along a <span class="emphasis"><em>single line</em></span> of, notionally,
           infinite length. If you want to find out where the potential
           justification. As mentioned above, it lays out the string
           along a <span class="emphasis"><em>single line</em></span> of, notionally,
           infinite length. If you want to find out where the potential
@@ -152,12 +152,12 @@ ABC אבג DEF
           could use the ICU library's break iterator functions.
         </p>
 <p>
           could use the ICU library's break iterator functions.
         </p>
 <p>
-          Harfbuzz can tell you how wide a shaped piece of text is, which is
+          HarfBuzz can tell you how wide a shaped piece of text is, which is
           useful input to a justification algorithm, but it knows nothing
           about paragraphs, lines or line lengths. Nor will it adjust the
           space between words to fit them proportionally into a line. If you
           want to layout text in paragraphs, you will probably want to send
           useful input to a justification algorithm, but it knows nothing
           about paragraphs, lines or line lengths. Nor will it adjust the
           space between words to fit them proportionally into a line. If you
           want to layout text in paragraphs, you will probably want to send
-          each word of your text to Harfbuzz to determine its shaped width
+          each word of your text to HarfBuzz to determine its shaped width
           after glyph substitutions, then work out how many words will fit
           on a line, and then finally output each word of the line separated
           by a space of the correct size to fully justify the paragraph.
           after glyph substitutions, then work out how many words will fit
           on a line, and then finally output each word of the line separated
           by a space of the correct size to fully justify the paragraph.
@@ -165,17 +165,17 @@ ABC אבג DEF
 </li>
 </ul></div>
 <p>
 </li>
 </ul></div>
 <p>
-      As a layout engine implementor, Harfbuzz will help you with the
+      As a layout engine implementor, HarfBuzz will help you with the
       interface between your text and your font, and that's something
       that you'll need - what you then do with the glyphs that your font
       returns is up to you. The example we saw above enough to get us
       interface between your text and your font, and that's something
       that you'll need - what you then do with the glyphs that your font
       returns is up to you. The example we saw above enough to get us
-      started using Harfbuzz. Now we are going to use the remainder of
-      Harfbuzz's API to refine that example and improve our text shaping
+      started using HarfBuzz. Now we are going to use the remainder of
+      HarfBuzz's API to refine that example and improve our text shaping
       capabilities.
     </p>
 </div>
 </div>
 <div class="footer">
       capabilities.
     </p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index a9c8bc2..8f72dcb 100644 (file)
@@ -3,11 +3,11 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>HarfBuzz Manual: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>HarfBuzz Manual: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <meta name="description" content="HarfBuzz  HarfBuzz is an OpenType text shaping engine. The current HarfBuzz codebase, formerly known as harfbuzz-ng, is versioned 1.x.x and is stable and under active maintenance. This is what is used in latest versions of Firefox, GNOME, ChromeOS, Chrome, LibreOffice, XeTeX, Android, and KDE, among other places. The canonical source tree is available here. Also available on github. See for release tarballs. The old HarfBuzz codebase, these days known as harfbuzz-old, was derived from FreeType, Pango, and Qt and is available here. It is not actively developed or maintained, and is extremely buggy. All users are encouraged to switch over to the new HarfBuzz as soon as possible. There are no release tarballs of old HarfBuzz whatsoever.">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="next" href="pt01.html" title="Part I. User's manual">
 <meta name="description" content="HarfBuzz  HarfBuzz is an OpenType text shaping engine. The current HarfBuzz codebase, formerly known as harfbuzz-ng, is versioned 1.x.x and is stable and under active maintenance. This is what is used in latest versions of Firefox, GNOME, ChromeOS, Chrome, LibreOffice, XeTeX, Android, and KDE, among other places. The canonical source tree is available here. Also available on github. See for release tarballs. The old HarfBuzz codebase, these days known as harfbuzz-old, was derived from FreeType, Pango, and Qt and is available here. It is not actively developed or maintained, and is extremely buggy. All users are encouraged to switch over to the new HarfBuzz as soon as possible. There are no release tarballs of old HarfBuzz whatsoever.">
 <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.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -30,7 +30,7 @@
         source tree is available
         <a class="ulink" href="http://cgit.freedesktop.org/harfbuzz/" target="_top">here</a>.
         Also available on
         source tree is available
         <a class="ulink" href="http://cgit.freedesktop.org/harfbuzz/" target="_top">here</a>.
         Also available on
-        <a class="ulink" href="https://github.com/behdad/harfbuzz" target="_top">github</a>.
+        <a class="ulink" href="https://github.com/harfbuzz/harfbuzz" target="_top">github</a>.
         See <a class="xref" href="install-harfbuzz.html#download" title="Download">Download</a> for release tarballs.
       </p>
 <p>
         See <a class="xref" href="install-harfbuzz.html#download" title="Download">Download</a> for release tarballs.
       </p>
 <p>
 <div class="toc"><dl class="toc">
 <dt><span class="part"><a href="pt01.html">I. User's manual</a></span></dt>
 <dd><dl>
 <div class="toc"><dl class="toc">
 <dt><span class="part"><a href="pt01.html">I. User's manual</a></span></dt>
 <dd><dl>
-<dt><span class="chapter"><a href="what-is-harfbuzz.html">What is Harfbuzz?</a></span></dt>
+<dt><span class="chapter"><a href="what-is-harfbuzz.html">What is HarfBuzz?</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="what-is-harfbuzz.html#why-do-i-need-it">Why do I need it?</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="what-is-harfbuzz.html#why-do-i-need-it">Why do I need it?</a></span></dt>
-<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called Harfbuzz?</a></span></dt>
+<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called HarfBuzz?</a></span></dt>
 </dl></dd>
 </dl></dd>
-<dt><span class="chapter"><a href="install-harfbuzz.html">Install Harfbuzz</a></span></dt>
+<dt><span class="chapter"><a href="install-harfbuzz.html">Install HarfBuzz</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="install-harfbuzz.html#download">Download</a></span></dt>
 <dt><span class="section"><a href="building.html">Building</a></span></dt>
 </dl></dd>
 <dd><dl>
 <dt><span class="section"><a href="install-harfbuzz.html#download">Download</a></span></dt>
 <dt><span class="section"><a href="building.html">Building</a></span></dt>
 </dl></dd>
-<dt><span class="chapter"><a href="hello-harfbuzz.html">Hello, Harfbuzz</a></span></dt>
-<dd><dl><dt><span class="section"><a href="hello-harfbuzz.html#what-harfbuzz-doesnt-do">What Harfbuzz doesn't do</a></span></dt></dl></dd>
+<dt><span class="chapter"><a href="hello-harfbuzz.html">Hello, HarfBuzz</a></span></dt>
+<dd><dl><dt><span class="section"><a href="hello-harfbuzz.html#what-harfbuzz-doesnt-do">What HarfBuzz doesn't do</a></span></dt></dl></dd>
 <dt><span class="chapter"><a href="buffers-language-script-and-direction.html">Buffers, language, script and direction</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="buffers-language-script-and-direction.html#creating-and-destroying-buffers">Creating and destroying buffers</a></span></dt>
 <dt><span class="chapter"><a href="buffers-language-script-and-direction.html">Buffers, language, script and direction</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="buffers-language-script-and-direction.html#creating-and-destroying-buffers">Creating and destroying buffers</a></span></dt>
@@ -73,7 +73,7 @@
 <dt><span class="chapter"><a href="fonts-and-faces.html">Fonts and faces</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="fonts-and-faces.html#using-freetype">Using FreeType</a></span></dt>
 <dt><span class="chapter"><a href="fonts-and-faces.html">Fonts and faces</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="fonts-and-faces.html#using-freetype">Using FreeType</a></span></dt>
-<dt><span class="section"><a href="using-harfbuzzs-native-opentype-implementation.html">Using Harfbuzz's native OpenType implementation</a></span></dt>
+<dt><span class="section"><a href="using-harfbuzzs-native-opentype-implementation.html">Using HarfBuzz's native OpenType implementation</a></span></dt>
 <dt><span class="section"><a href="using-your-own-font-functions.html">Using your own font functions</a></span></dt>
 </dl></dd>
 <dt><span class="chapter"><a href="clusters.html"></a></span></dt>
 <dt><span class="section"><a href="using-your-own-font-functions.html">Using your own font functions</a></span></dt>
 </dl></dd>
 <dt><span class="chapter"><a href="clusters.html"></a></span></dt>
@@ -96,7 +96,7 @@
 </dl></dd>
 <dt><span class="part"><a href="pt02.html">II. Reference manual</a></span></dt>
 <dd><dl>
 </dl></dd>
 <dt><span class="part"><a href="pt02.html">II. Reference manual</a></span></dt>
 <dd><dl>
-<dt><span class="chapter"><a href="ch08.html">Harfbuzz API</a></span></dt>
+<dt><span class="chapter"><a href="ch08.html">HarfBuzz API</a></span></dt>
 <dd><dl>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb.html">hb</a></span><span class="refpurpose"></span>
 <dd><dl>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb.html">hb</a></span><span class="refpurpose"></span>
 <dt><span class="index"><a href="api-index-1-1-3.html">Index of new symbols in 1.1.3</a></span></dt>
 <dt><span class="index"><a href="api-index-1-2-3.html">Index of new symbols in 1.2.3</a></span></dt>
 <dt><span class="index"><a href="api-index-1-3-3.html">Index of new symbols in 1.3.3</a></span></dt>
 <dt><span class="index"><a href="api-index-1-1-3.html">Index of new symbols in 1.1.3</a></span></dt>
 <dt><span class="index"><a href="api-index-1-2-3.html">Index of new symbols in 1.2.3</a></span></dt>
 <dt><span class="index"><a href="api-index-1-3-3.html">Index of new symbols in 1.3.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-2.html">Index of new symbols in 1.4.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-3.html">Index of new symbols in 1.4.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-5-0.html">Index of new symbols in 1.5.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-6-0.html">Index of new symbols in 1.6.0</a></span></dt>
 <dt><span class="index"><a href="deprecated-api-index.html">Index of deprecated API</a></span></dt>
 <dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
 </dl></dd>
 </dl></div>
 </div>
 <div class="footer">
 <dt><span class="index"><a href="deprecated-api-index.html">Index of deprecated API</a></span></dt>
 <dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
 </dl></dd>
 </dl></div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 6e76703..019915b 100644 (file)
@@ -2,13 +2,13 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Install Harfbuzz: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<title>Install HarfBuzz: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt01.html" title="Part I. User's manual">
 <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="why-is-it-called-harfbuzz.html" title="Why is it called Harfbuzz?">
+<link rel="prev" href="why-is-it-called-harfbuzz.html" title="Why is it called HarfBuzz?">
 <link rel="next" href="building.html" title="Building">
 <link rel="next" href="building.html" title="Building">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -21,7 +21,7 @@
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
-<a name="install-harfbuzz"></a>Install Harfbuzz</h2></div></div></div>
+<a name="install-harfbuzz"></a>Install HarfBuzz</h2></div></div></div>
 <div class="toc"><dl class="toc">
 <dt><span class="section"><a href="install-harfbuzz.html#download">Download</a></span></dt>
 <dt><span class="section"><a href="building.html">Building</a></span></dt>
 <div class="toc"><dl class="toc">
 <dt><span class="section"><a href="install-harfbuzz.html#download">Download</a></span></dt>
 <dt><span class="section"><a href="building.html">Building</a></span></dt>
@@ -39,7 +39,7 @@
 <p>
       The canonical source tree is available
       <a class="ulink" href="http://cgit.freedesktop.org/harfbuzz/" target="_top">here</a>.
 <p>
       The canonical source tree is available
       <a class="ulink" href="http://cgit.freedesktop.org/harfbuzz/" target="_top">here</a>.
-      Also available on <a class="ulink" href="https://github.com/behdad/harfbuzz" target="_top">github</a>.
+      Also available on <a class="ulink" href="https://github.com/harfbuzz/harfbuzz" target="_top">github</a>.
     </p>
 <p>
       The API that comes with <code class="filename">hb.h</code> will
     </p>
 <p>
       The API that comes with <code class="filename">hb.h</code> will
@@ -54,6 +54,6 @@
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 86a1846..23410dc 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Level 2: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Level 2: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="">
 <link rel="prev" href="the-distinction-between-levels-0-and-1.html" title="The distinction between levels 0 and 1">
 <link rel="next" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="">
 <link rel="prev" href="the-distinction-between-levels-0-and-1.html" title="The distinction between levels 0 and 1">
 <link rel="next" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
   0 ,3,2,4   
 </pre>
 <p>
   0 ,3,2,4   
 </pre>
 <p>
-      There's no way to differentitate between these two scenarios based
+      There's no way to differentiate between these two scenarios based
       on the cluster numbers alone.
     </p>
 <p>
       on the cluster numbers alone.
     </p>
 <p>
-      Another problem appens with ligatures under level 2 if the
+      Another problem happens with ligatures under level 2 if the
       direction of the text is forced to opposite of its natural
       direction (e.g. left-to-right Arabic). But that's too much of a
       corner case to worry about.
       direction of the text is forced to opposite of its natural
       direction (e.g. left-to-right Arabic). But that's too much of a
       corner case to worry about.
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 41f5336..80d35bc 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Object Hierarchy: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Object Hierarchy: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt02.html" title="Part II. Reference manual">
 <link rel="prev" href="harfbuzz-hb-gobject.html" title="hb-gobject">
 <link rel="next" href="api-index-full.html" title="API Index">
 <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-gobject.html" title="hb-gobject">
 <link rel="next" href="api-index-full.html" title="API Index">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -32,6 +32,8 @@
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-hb-font.html#hb-font-t">hb_font_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-t">hb_glyph_info_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-glyph-position-t">hb_glyph_position_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-hb-font.html#hb-font-t">hb_font_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-glyph-info-t">hb_glyph_info_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-glyph-position-t">hb_glyph_position_t</a>
+    <span class="lineart">├──</span> <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-t">hb_ot_math_glyph_part_t</a>
+    <span class="lineart">├──</span> <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-variant-t">hb_ot_math_glyph_variant_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-segment-properties-t">hb_segment_properties_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-hb-set.html#hb-set-t">hb_set_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t">hb_shape_plan_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-segment-properties-t">hb_segment_properties_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-hb-set.html#hb-set-t">hb_set_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t">hb_shape_plan_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t">hb_unicode_combining_class_t</a>
     <span class="lineart">╰──</span> <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t">hb_unicode_general_category_t</a>
     <a href="/home/behdad/.local/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-combining-class-t" title="enum hb_unicode_combining_class_t">hb_unicode_combining_class_t</a>
     <span class="lineart">╰──</span> <a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-general-category-t" title="enum hb_unicode_general_category_t">hb_unicode_general_category_t</a>
     <a href="/home/behdad/.local/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GFlags</a>
+    <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-buffer-diff-flags-t" title="enum hb_buffer_diff_flags_t">hb_buffer_diff_flags_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t">hb_buffer_flags_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t">hb_buffer_serialize_flags_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t">hb_buffer_flags_t</a>
     <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t">hb_buffer_serialize_flags_t</a>
+    <span class="lineart">├──</span> <a class="link" href="harfbuzz-Buffers.html#hb-glyph-flags-t" title="enum hb_glyph_flags_t">hb_glyph_flags_t</a>
     <span class="lineart">╰──</span> <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-flags-t" title="enum hb_ot_math_glyph_part_flags_t">hb_ot_math_glyph_part_flags_t</a>
 </pre>
 </div>
 <div class="footer">
     <span class="lineart">╰──</span> <a class="link" href="harfbuzz-hb-ot-math.html#hb-ot-math-glyph-part-flags-t" title="enum hb_ot_math_glyph_part_flags_t">hb_ot_math_glyph_part_flags_t</a>
 </pre>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index e3574bc..89a9f35 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Plans and caching: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Plans and caching: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
 <link rel="prev" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
 <link rel="next" href="pt02.html" title="Part II. Reference manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
 <link rel="prev" href="shaping-and-shape-plans.html" title="Shaping and shape plans">
 <link rel="next" href="pt02.html" title="Part II. Reference manual">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -26,6 +26,6 @@
     </p>
 </div>
 <div class="footer">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index f74ebd3..5cc9f2c 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Part I. User's manual: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Part I. User's manual: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="index.html" title="HarfBuzz Manual">
 <link rel="prev" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="index.html" title="HarfBuzz Manual">
 <link rel="prev" href="index.html" title="HarfBuzz Manual">
-<link rel="next" href="what-is-harfbuzz.html" title="What is Harfbuzz?">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<link rel="next" href="what-is-harfbuzz.html" title="What is HarfBuzz?">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl class="toc">
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl class="toc">
-<dt><span class="chapter"><a href="what-is-harfbuzz.html">What is Harfbuzz?</a></span></dt>
+<dt><span class="chapter"><a href="what-is-harfbuzz.html">What is HarfBuzz?</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="what-is-harfbuzz.html#why-do-i-need-it">Why do I need it?</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="what-is-harfbuzz.html#why-do-i-need-it">Why do I need it?</a></span></dt>
-<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called Harfbuzz?</a></span></dt>
+<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called HarfBuzz?</a></span></dt>
 </dl></dd>
 </dl></dd>
-<dt><span class="chapter"><a href="install-harfbuzz.html">Install Harfbuzz</a></span></dt>
+<dt><span class="chapter"><a href="install-harfbuzz.html">Install HarfBuzz</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="install-harfbuzz.html#download">Download</a></span></dt>
 <dt><span class="section"><a href="building.html">Building</a></span></dt>
 </dl></dd>
 <dd><dl>
 <dt><span class="section"><a href="install-harfbuzz.html#download">Download</a></span></dt>
 <dt><span class="section"><a href="building.html">Building</a></span></dt>
 </dl></dd>
-<dt><span class="chapter"><a href="hello-harfbuzz.html">Hello, Harfbuzz</a></span></dt>
-<dd><dl><dt><span class="section"><a href="hello-harfbuzz.html#what-harfbuzz-doesnt-do">What Harfbuzz doesn't do</a></span></dt></dl></dd>
+<dt><span class="chapter"><a href="hello-harfbuzz.html">Hello, HarfBuzz</a></span></dt>
+<dd><dl><dt><span class="section"><a href="hello-harfbuzz.html#what-harfbuzz-doesnt-do">What HarfBuzz doesn't do</a></span></dt></dl></dd>
 <dt><span class="chapter"><a href="buffers-language-script-and-direction.html">Buffers, language, script and direction</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="buffers-language-script-and-direction.html#creating-and-destroying-buffers">Creating and destroying buffers</a></span></dt>
 <dt><span class="chapter"><a href="buffers-language-script-and-direction.html">Buffers, language, script and direction</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="buffers-language-script-and-direction.html#creating-and-destroying-buffers">Creating and destroying buffers</a></span></dt>
@@ -48,7 +48,7 @@
 <dt><span class="chapter"><a href="fonts-and-faces.html">Fonts and faces</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="fonts-and-faces.html#using-freetype">Using FreeType</a></span></dt>
 <dt><span class="chapter"><a href="fonts-and-faces.html">Fonts and faces</a></span></dt>
 <dd><dl>
 <dt><span class="section"><a href="fonts-and-faces.html#using-freetype">Using FreeType</a></span></dt>
-<dt><span class="section"><a href="using-harfbuzzs-native-opentype-implementation.html">Using Harfbuzz's native OpenType implementation</a></span></dt>
+<dt><span class="section"><a href="using-harfbuzzs-native-opentype-implementation.html">Using HarfBuzz's native OpenType implementation</a></span></dt>
 <dt><span class="section"><a href="using-your-own-font-functions.html">Using your own font functions</a></span></dt>
 </dl></dd>
 <dt><span class="chapter"><a href="clusters.html"></a></span></dt>
 <dt><span class="section"><a href="using-your-own-font-functions.html">Using your own font functions</a></span></dt>
 </dl></dd>
 <dt><span class="chapter"><a href="clusters.html"></a></span></dt>
@@ -82,6 +82,6 @@
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 52105bd..9bdd8a7 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Part II. Reference manual: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Part II. Reference manual: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="index.html" title="HarfBuzz Manual">
 <link rel="prev" href="plans-and-caching.html" title="Plans and caching">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="index.html" title="HarfBuzz Manual">
 <link rel="prev" href="plans-and-caching.html" title="Plans and caching">
-<link rel="next" href="ch08.html" title="Harfbuzz API">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<link rel="next" href="ch08.html" title="HarfBuzz API">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -24,7 +24,7 @@
 <div><h1 class="title">
 <a name="id-1.3"></a>Part II. Reference manual</h1></div>
 <div><p class="releaseinfo">
 <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 1.4.6
+        This document is for HarfBuzz 1.7.6
 .
         
       </p></div>
 .
         
       </p></div>
@@ -32,7 +32,7 @@
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl class="toc">
 <div class="toc">
 <p><b>Table of Contents</b></p>
 <dl class="toc">
-<dt><span class="chapter"><a href="ch08.html">Harfbuzz API</a></span></dt>
+<dt><span class="chapter"><a href="ch08.html">HarfBuzz API</a></span></dt>
 <dd><dl>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb.html">hb</a></span><span class="refpurpose"></span>
 <dd><dl>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb.html">hb</a></span><span class="refpurpose"></span>
 <dt><span class="index"><a href="api-index-1-1-3.html">Index of new symbols in 1.1.3</a></span></dt>
 <dt><span class="index"><a href="api-index-1-2-3.html">Index of new symbols in 1.2.3</a></span></dt>
 <dt><span class="index"><a href="api-index-1-3-3.html">Index of new symbols in 1.3.3</a></span></dt>
 <dt><span class="index"><a href="api-index-1-1-3.html">Index of new symbols in 1.1.3</a></span></dt>
 <dt><span class="index"><a href="api-index-1-2-3.html">Index of new symbols in 1.2.3</a></span></dt>
 <dt><span class="index"><a href="api-index-1-3-3.html">Index of new symbols in 1.3.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-2.html">Index of new symbols in 1.4.2</a></span></dt>
+<dt><span class="index"><a href="api-index-1-4-3.html">Index of new symbols in 1.4.3</a></span></dt>
+<dt><span class="index"><a href="api-index-1-5-0.html">Index of new symbols in 1.5.0</a></span></dt>
+<dt><span class="index"><a href="api-index-1-6-0.html">Index of new symbols in 1.6.0</a></span></dt>
 <dt><span class="index"><a href="deprecated-api-index.html">Index of deprecated API</a></span></dt>
 <dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
 </dl>
 </div>
 </div>
 <div class="footer">
 <dt><span class="index"><a href="deprecated-api-index.html">Index of deprecated API</a></span></dt>
 <dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
 </dl>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index f07ef69..9b0a47e 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Reordering in levels 0 and 1: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Reordering in levels 0 and 1: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="">
 <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">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="">
 <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.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -48,6 +48,6 @@
   </p>
 </div>
 <div class="footer">
   </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index a9c047c..ecc07ee 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Setting buffer properties: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Setting buffer properties: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="adding-text-to-the-buffer.html" title="Adding text to the buffer">
 <link rel="next" href="what-about-the-other-scripts.html" title="What about the other scripts?">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="adding-text-to-the-buffer.html" title="Adding text to the buffer">
 <link rel="next" href="what-about-the-other-scripts.html" title="What about the other scripts?">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -26,6 +26,6 @@
     </p>
 </div>
 <div class="footer">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 32b697d..c3e2029 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Shaping and shape plans: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Shaping and shape plans: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt01.html" title="Part I. User's manual">
 <link rel="prev" href="level-2.html" title="Level 2">
 <link rel="next" href="plans-and-caching.html" title="Plans and caching">
 <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="level-2.html" title="Level 2">
 <link rel="next" href="plans-and-caching.html" title="Plans and caching">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -34,6 +34,6 @@
 </div>
 </div>
 <div class="footer">
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 3675420..4be4ede 100644 (file)
@@ -30,6 +30,10 @@ body
   vertical-align: top;
 }
 
   vertical-align: top;
 }
 
+span.nowrap {
+  white-space: nowrap;
+}
+
 div.gallery-float
 {
   float: left;
 div.gallery-float
 {
   float: left;
index 2a71910..0365f01 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>The distinction between levels 0 and 1: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>The distinction between levels 0 and 1: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="">
 <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">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="clusters.html" title="">
 <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.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -76,6 +76,6 @@
   </p>
 </div>
 <div class="footer">
   </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 72ed1b6..497e2e6 100644 (file)
@@ -2,13 +2,13 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Using Harfbuzz's native OpenType implementation: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<title>Using HarfBuzz's native OpenType implementation: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="fonts-and-faces.html" title="Fonts and faces">
 <link rel="prev" href="fonts-and-faces.html" title="Fonts and faces">
 <link rel="next" href="using-your-own-font-functions.html" title="Using your own font functions">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="fonts-and-faces.html" title="Fonts and faces">
 <link rel="prev" href="fonts-and-faces.html" title="Fonts and faces">
 <link rel="next" href="using-your-own-font-functions.html" title="Using your own font functions">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 </tr></table>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
 </tr></table>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="using-harfbuzzs-native-opentype-implementation"></a>Using Harfbuzz's native OpenType implementation</h2></div></div></div>
+<a name="using-harfbuzzs-native-opentype-implementation"></a>Using HarfBuzz's native OpenType implementation</h2></div></div></div>
 <p>
     </p>
 </div>
 <div class="footer">
 <p>
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 40b6344..043956c 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Using your own font functions: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Using your own font functions: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="fonts-and-faces.html" title="Fonts and faces">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="fonts-and-faces.html" title="Fonts and faces">
-<link rel="prev" href="using-harfbuzzs-native-opentype-implementation.html" title="Using Harfbuzz's native OpenType implementation">
+<link rel="prev" href="using-harfbuzzs-native-opentype-implementation.html" title="Using HarfBuzz's native OpenType implementation">
 <link rel="next" href="clusters.html" title="">
 <link rel="next" href="clusters.html" title="">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -26,6 +26,6 @@
     </p>
 </div>
 <div class="footer">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 5a0efc6..0f265ce 100644 (file)
@@ -3,12 +3,12 @@
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>What about the other scripts?: HarfBuzz Manual</title>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>What about the other scripts?: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="setting-buffer-properties.html" title="Setting buffer properties">
 <link rel="next" href="customizing-unicode-functions.html" title="Customizing Unicode functions">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="buffers-language-script-and-direction.html" title="Buffers, language, script and direction">
 <link rel="prev" href="setting-buffer-properties.html" title="Setting buffer properties">
 <link rel="next" href="customizing-unicode-functions.html" title="Customizing Unicode functions">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -26,6 +26,6 @@
     </p>
 </div>
 <div class="footer">
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 6e4b0ea..aff2f7d 100644 (file)
@@ -2,13 +2,13 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>What is Harfbuzz?: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<title>What is HarfBuzz?: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt01.html" title="Part I. User's manual">
 <link rel="prev" href="pt01.html" title="Part I. User's manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="up" href="pt01.html" title="Part I. User's manual">
 <link rel="prev" href="pt01.html" title="Part I. User's manual">
-<link rel="next" href="why-is-it-called-harfbuzz.html" title="Why is it called Harfbuzz?">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<link rel="next" href="why-is-it-called-harfbuzz.html" title="Why is it called HarfBuzz?">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
-<a name="what-is-harfbuzz"></a>What is Harfbuzz?</h2></div></div></div>
+<a name="what-is-harfbuzz"></a>What is HarfBuzz?</h2></div></div></div>
 <div class="toc"><dl class="toc">
 <dt><span class="section"><a href="what-is-harfbuzz.html#why-do-i-need-it">Why do I need it?</a></span></dt>
 <div class="toc"><dl class="toc">
 <dt><span class="section"><a href="what-is-harfbuzz.html#why-do-i-need-it">Why do I need it?</a></span></dt>
-<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called Harfbuzz?</a></span></dt>
+<dt><span class="section"><a href="why-is-it-called-harfbuzz.html">Why is it called HarfBuzz?</a></span></dt>
 </dl></div>
 <p>
 </dl></div>
 <p>
-    Harfbuzz is a <span class="emphasis"><em>text shaping engine</em></span>. It solves
+    HarfBuzz is a <span class="emphasis"><em>text shaping engine</em></span>. It solves
     the problem of selecting and positioning glyphs from a font given a
     Unicode string.
   </p>
     the problem of selecting and positioning glyphs from a font given a
     Unicode string.
   </p>
 <a name="why-do-i-need-it"></a>Why do I need it?</h2></div></div></div>
 <p>
       Text shaping is an integral part of preparing text for display. It
 <a name="why-do-i-need-it"></a>Why do I need it?</h2></div></div></div>
 <p>
       Text shaping is an integral part of preparing text for display. It
-      is a fairly low level operation; Harfbuzz is used directly by
+      is a fairly low level operation; HarfBuzz is used directly by
       graphic rendering libraries such as Pango, and the layout engines
       in Firefox, LibreOffice and Chromium. Unless you are
       <span class="emphasis"><em>writing</em></span> one of these layout engines yourself,
       graphic rendering libraries such as Pango, and the layout engines
       in Firefox, LibreOffice and Chromium. Unless you are
       <span class="emphasis"><em>writing</em></span> one of these layout engines yourself,
-      you will probably not need to use Harfbuzz - normally higher level
+      you will probably not need to use HarfBuzz - normally higher level
       libraries will turn text into glyphs for you.
     </p>
 <p>
       However, if you <span class="emphasis"><em>are</em></span> writing a layout engine
       or graphics library yourself, you will need to perform text
       libraries will turn text into glyphs for you.
     </p>
 <p>
       However, if you <span class="emphasis"><em>are</em></span> writing a layout engine
       or graphics library yourself, you will need to perform text
-      shaping, and this is where Harfbuzz can help you. Here are some
+      shaping, and this is where HarfBuzz can help you. Here are some
       reasons why you need it:
     </p>
 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
       reasons why you need it:
     </p>
 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
 <p>
       If this is something that you need to do, then you need a text
       shaping engine: you could use Uniscribe if you are using Windows;
 <p>
       If this is something that you need to do, then you need a text
       shaping engine: you could use Uniscribe if you are using Windows;
-      you could use CoreText on OS X; or you could use Harfbuzz. In the
+      you could use CoreText on OS X; or you could use HarfBuzz. In the
       rest of this manual, we are going to assume that you are the
       implementor of a text layout engine.
     </p>
 </div>
 </div>
 <div class="footer">
       rest of this manual, we are going to assume that you are the
       implementor of a text layout engine.
     </p>
 </div>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 7a34a9a..960d835 100644 (file)
@@ -2,13 +2,13 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Why is it called Harfbuzz?: HarfBuzz Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<title>Why is it called HarfBuzz?: HarfBuzz Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
 <link rel="home" href="index.html" title="HarfBuzz Manual">
-<link rel="up" href="what-is-harfbuzz.html" title="What is Harfbuzz?">
-<link rel="prev" href="what-is-harfbuzz.html" title="What is Harfbuzz?">
-<link rel="next" href="install-harfbuzz.html" title="Install Harfbuzz">
-<meta name="generator" content="GTK-Doc V1.25.1 (XML mode)">
+<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="install-harfbuzz.html" title="Install HarfBuzz">
+<meta name="generator" content="GTK-Doc V1.27.1 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 </tr></table>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
 </tr></table>
 <div class="section">
 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="why-is-it-called-harfbuzz"></a>Why is it called Harfbuzz?</h2></div></div></div>
+<a name="why-is-it-called-harfbuzz"></a>Why is it called HarfBuzz?</h2></div></div></div>
 <p>
 <p>
-      Harfbuzz began its life as text shaping code within the FreeType
+      HarfBuzz began its life as text shaping code within the FreeType
       project, (and you will see references to the FreeType authors
       within the source code copyright declarations) but was then
       abstracted out to its own project. This project is maintained by
       project, (and you will see references to the FreeType authors
       within the source code copyright declarations) but was then
       abstracted out to its own project. This project is maintained by
-      Behdad Esfahbod, and named Harfbuzz. Originally, it was a shaping
-      engine for OpenType fonts - "Harfbuzz" is the Persian
+      Behdad Esfahbod, and named HarfBuzz. Originally, it was a shaping
+      engine for OpenType fonts - "HarfBuzz" is the Persian
       for "open type".
     </p>
 </div>
 <div class="footer">
       for "open type".
     </p>
 </div>
 <div class="footer">
-<hr>Generated by GTK-Doc V1.25.1</div>
+<hr>Generated by GTK-Doc V1.27.1</div>
 </body>
 </html>
\ No newline at end of file
 </body>
 </html>
\ No newline at end of file
index 3a26c55..9eddb71 100644 (file)
@@ -1,7 +1,7 @@
 <chapter id="buffers-language-script-and-direction">
   <title>Buffers, language, script and direction</title>
   <para>
 <chapter id="buffers-language-script-and-direction">
   <title>Buffers, language, script and direction</title>
   <para>
-    The input to Harfbuzz is a series of Unicode characters, stored in a
+    The input to HarfBuzz is a series of Unicode characters, stored in a
     buffer. In this chapter, we'll look at how to set up a buffer with
     the text that we want and then customize the properties of the
     buffer.
     buffer. In this chapter, we'll look at how to set up a buffer with
     the text that we want and then customize the properties of the
     buffer.
@@ -15,7 +15,7 @@
       default values and ready to accept your Unicode strings.
     </para>
     <para>
       default values and ready to accept your Unicode strings.
     </para>
     <para>
-      Harfbuzz manages the memory of objects that it creates (such as
+      HarfBuzz manages the memory of objects that it creates (such as
       buffers), so you don't have to. When you have finished working on
       a buffer, you can call <literal>hb_buffer_destroy()</literal>:
     </para>
       buffers), so you don't have to. When you have finished working on
       a buffer, you can call <literal>hb_buffer_destroy()</literal>:
     </para>
@@ -27,7 +27,7 @@
     <para>
       This will destroy the object and free its associated memory -
       unless some other part of the program holds a reference to this
     <para>
       This will destroy the object and free its associated memory -
       unless some other part of the program holds a reference to this
-      buffer. If you acquire a Harfbuzz buffer from another subsystem
+      buffer. If you acquire a HarfBuzz buffer from another subsystem
       and want to ensure that it is not garbage collected by someone
       else destroying it, you should increase its reference count:
     </para>
       and want to ensure that it is not garbage collected by someone
       else destroying it, you should increase its reference count:
     </para>
@@ -53,8 +53,8 @@ void somefunc(hb_buffer_t *buffer) {
   <section id="adding-text-to-the-buffer">
     <title>Adding text to the buffer</title>
     <para>
   <section id="adding-text-to-the-buffer">
     <title>Adding text to the buffer</title>
     <para>
-      Now we have a brand new Harfbuzz buffer. Let's start filling it
-      with text! From Harfbuzz's perspective, a buffer is just a stream
+      Now we have a brand new HarfBuzz buffer. Let's start filling it
+      with text! From HarfBuzz's perspective, a buffer is just a stream
       of Unicode codepoints, but your input string is probably in one of
       the standard Unicode character encodings (UTF-8, UTF-16, UTF-32)
     </para>
       of Unicode codepoints, but your input string is probably in one of
       the standard Unicode character encodings (UTF-8, UTF-16, UTF-32)
     </para>
index 8b64bde..608371b 100644 (file)
   0 ,3,2,4   
 </programlisting>
     <para>
   0 ,3,2,4   
 </programlisting>
     <para>
-      There's no way to differentitate between these two scenarios based
+      There's no way to differentiate between these two scenarios based
       on the cluster numbers alone.
     </para>
     <para>
       on the cluster numbers alone.
     </para>
     <para>
-      Another problem appens with ligatures under level 2 if the
+      Another problem happens with ligatures under level 2 if the
       direction of the text is forced to opposite of its natural
       direction (e.g. left-to-right Arabic). But that's too much of a
       corner case to worry about.
       direction of the text is forced to opposite of its natural
       direction (e.g. left-to-right Arabic). But that's too much of a
       corner case to worry about.
index 01fcdc9..7de0f05 100644 (file)
@@ -6,7 +6,7 @@
     </para>
   </section>
   <section id="using-harfbuzzs-native-opentype-implementation">
     </para>
   </section>
   <section id="using-harfbuzzs-native-opentype-implementation">
-    <title>Using Harfbuzz's native OpenType implementation</title>
+    <title>Using HarfBuzz's native OpenType implementation</title>
     <para>
     </para>
   </section>
     <para>
     </para>
   </section>
index 34db017..716b2f2 100644 (file)
@@ -1,7 +1,7 @@
 <chapter id="hello-harfbuzz">
 <chapter id="hello-harfbuzz">
-  <title>Hello, Harfbuzz</title>
+  <title>Hello, HarfBuzz</title>
   <para>
   <para>
-    Here's the simplest Harfbuzz that can possibly work. We will improve
+    Here's the simplest HarfBuzz that can possibly work. We will improve
     it later.
   </para>
   <orderedlist numeration="arabic">
     it later.
   </para>
   <orderedlist numeration="arabic">
   hb_font_destroy(hb_ft_font);
 </programlisting>
   <section id="what-harfbuzz-doesnt-do">
   hb_font_destroy(hb_ft_font);
 </programlisting>
   <section id="what-harfbuzz-doesnt-do">
-    <title>What Harfbuzz doesn't do</title>
+    <title>What HarfBuzz doesn't do</title>
     <para>
       The code above will take a UTF8 string, shape it, and give you the
       information required to lay it out correctly on a single
       horizontal (or vertical) line using the font provided. That is the
     <para>
       The code above will take a UTF8 string, shape it, and give you the
       information required to lay it out correctly on a single
       horizontal (or vertical) line using the font provided. That is the
-      extent of Harfbuzz's responsibility.
+      extent of HarfBuzz's responsibility.
     </para>
     <para>
       If you are implementing a text layout engine you may have other
     </para>
     <para>
       If you are implementing a text layout engine you may have other
-      responsibilities, that Harfbuzz will not help you with:
+      responsibilities, that HarfBuzz will not help you with:
     </para>
     <itemizedlist>
       <listitem>
         <para>
     </para>
     <itemizedlist>
       <listitem>
         <para>
-          Harfbuzz won't help you with bidirectionality. If you want to
+          HarfBuzz won't help you with bidirectionality. If you want to
           lay out text with mixed Hebrew and English, you will need to
           lay out text with mixed Hebrew and English, you will need to
-          ensure that the buffer provided to Harfbuzz has those
+          ensure that the buffer provided to HarfBuzz has those
           characters in the correct layout order. This will be different
           from the logical order in which the Unicode text is stored. In
           other words, the user will hit the keys in the following
           characters in the correct layout order. This will be different
           from the logical order in which the Unicode text is stored. In
           other words, the user will hit the keys in the following
@@ -127,30 +127,30 @@ ABC אבג DEF
           (&quot;bidi&quot; is short for bidirectional), and there's an
           algorithm as an annex to the Unicode Standard which tells you how
           to reorder a string from logical order into presentation order.
           (&quot;bidi&quot; is short for bidirectional), and there's an
           algorithm as an annex to the Unicode Standard which tells you how
           to reorder a string from logical order into presentation order.
-          Before sending your string to Harfbuzz, you may need to apply the
+          Before sending your string to HarfBuzz, you may need to apply the
           bidi algorithm to it. Libraries such as ICU and fribidi can do
           this for you.
         </para>
       </listitem>
       <listitem>
         <para>
           bidi algorithm to it. Libraries such as ICU and fribidi can do
           this for you.
         </para>
       </listitem>
       <listitem>
         <para>
-          Harfbuzz won't help you with text that contains different font
+          HarfBuzz won't help you with text that contains different font
           properties. For instance, if you have the string &quot;a
           <emphasis>huge</emphasis> breakfast&quot;, and you expect
           &quot;huge&quot; to be italic, you will need to send three
           properties. For instance, if you have the string &quot;a
           <emphasis>huge</emphasis> breakfast&quot;, and you expect
           &quot;huge&quot; to be italic, you will need to send three
-          strings to Harfbuzz: <literal>a</literal>, in your Roman font;
+          strings to HarfBuzz: <literal>a</literal>, in your Roman font;
           <literal>huge</literal> using your italic font; and
           <literal>breakfast</literal> using your Roman font again.
           Similarly if you change font, font size, script, language or
           direction within your string, you will need to shape each run
           <literal>huge</literal> using your italic font; and
           <literal>breakfast</literal> using your Roman font again.
           Similarly if you change font, font size, script, language or
           direction within your string, you will need to shape each run
-          independently and then output them independently. Harfbuzz
+          independently and then output them independently. HarfBuzz
           expects to shape a run of characters sharing the same
           properties.
         </para>
       </listitem>
       <listitem>
         <para>
           expects to shape a run of characters sharing the same
           properties.
         </para>
       </listitem>
       <listitem>
         <para>
-          Harfbuzz won't help you with line breaking, hyphenation or
+          HarfBuzz won't help you with line breaking, hyphenation or
           justification. As mentioned above, it lays out the string
           along a <emphasis>single line</emphasis> of, notionally,
           infinite length. If you want to find out where the potential
           justification. As mentioned above, it lays out the string
           along a <emphasis>single line</emphasis> of, notionally,
           infinite length. If you want to find out where the potential
@@ -158,12 +158,12 @@ ABC אבג DEF
           could use the ICU library's break iterator functions.
         </para>
         <para>
           could use the ICU library's break iterator functions.
         </para>
         <para>
-          Harfbuzz can tell you how wide a shaped piece of text is, which is
+          HarfBuzz can tell you how wide a shaped piece of text is, which is
           useful input to a justification algorithm, but it knows nothing
           about paragraphs, lines or line lengths. Nor will it adjust the
           space between words to fit them proportionally into a line. If you
           want to layout text in paragraphs, you will probably want to send
           useful input to a justification algorithm, but it knows nothing
           about paragraphs, lines or line lengths. Nor will it adjust the
           space between words to fit them proportionally into a line. If you
           want to layout text in paragraphs, you will probably want to send
-          each word of your text to Harfbuzz to determine its shaped width
+          each word of your text to HarfBuzz to determine its shaped width
           after glyph substitutions, then work out how many words will fit
           on a line, and then finally output each word of the line separated
           by a space of the correct size to fully justify the paragraph.
           after glyph substitutions, then work out how many words will fit
           on a line, and then finally output each word of the line separated
           by a space of the correct size to fully justify the paragraph.
@@ -171,12 +171,12 @@ ABC אבג DEF
       </listitem>
     </itemizedlist>
     <para>
       </listitem>
     </itemizedlist>
     <para>
-      As a layout engine implementor, Harfbuzz will help you with the
+      As a layout engine implementor, HarfBuzz will help you with the
       interface between your text and your font, and that's something
       that you'll need - what you then do with the glyphs that your font
       returns is up to you. The example we saw above enough to get us
       interface between your text and your font, and that's something
       that you'll need - what you then do with the glyphs that your font
       returns is up to you. The example we saw above enough to get us
-      started using Harfbuzz. Now we are going to use the remainder of
-      Harfbuzz's API to refine that example and improve our text shaping
+      started using HarfBuzz. Now we are going to use the remainder of
+      HarfBuzz's API to refine that example and improve our text shaping
       capabilities.
     </para>
   </section>
       capabilities.
     </para>
   </section>
index be8ac8d..899cc5b 100644 (file)
@@ -1,5 +1,5 @@
 <chapter id="install-harfbuzz">
 <chapter id="install-harfbuzz">
-  <title>Install Harfbuzz</title>
+  <title>Install HarfBuzz</title>
   <section id="download">
     <title id="download.title">Download</title>
     <para>
   <section id="download">
     <title id="download.title">Download</title>
     <para>
@@ -12,7 +12,7 @@
     <para>
       The canonical source tree is available
       <ulink url="http://cgit.freedesktop.org/harfbuzz/">here</ulink>.
     <para>
       The canonical source tree is available
       <ulink url="http://cgit.freedesktop.org/harfbuzz/">here</ulink>.
-      Also available on <ulink url="https://github.com/behdad/harfbuzz">github</ulink>.
+      Also available on <ulink url="https://github.com/harfbuzz/harfbuzz">github</ulink>.
     </para>
     <para>
       The API that comes with <filename class='headerfile'>hb.h</filename> will
     </para>
     <para>
       The API that comes with <filename class='headerfile'>hb.h</filename> will
@@ -50,7 +50,7 @@
       and hb-shape under <filename>util/</filename>.
     </para>
     <para>
       and hb-shape under <filename>util/</filename>.
     </para>
     <para>
-      If you are bootstraping from git, you need a few more tools before you
+      If you are bootstrapping from git, you need a few more tools before you
       can run <filename>autogen.sh</filename> for the first time. Namely,
       pkg-config and <ulink url="http://www.complang.org/ragel/">ragel</ulink>.
       Again, on Ubuntu / Debian:
       can run <filename>autogen.sh</filename> for the first time. Namely,
       pkg-config and <ulink url="http://www.complang.org/ragel/">ragel</ulink>.
       Again, on Ubuntu / Debian:
index 3574d75..38f40cf 100644 (file)
@@ -1,7 +1,7 @@
 <chapter id="what-is-harfbuzz">
 <chapter id="what-is-harfbuzz">
-  <title>What is Harfbuzz?</title>
+  <title>What is HarfBuzz?</title>
   <para>
   <para>
-    Harfbuzz is a <emphasis>text shaping engine</emphasis>. It solves
+    HarfBuzz is a <emphasis>text shaping engine</emphasis>. It solves
     the problem of selecting and positioning glyphs from a font given a
     Unicode string.
   </para>
     the problem of selecting and positioning glyphs from a font given a
     Unicode string.
   </para>
@@ -9,17 +9,17 @@
     <title>Why do I need it?</title>
     <para>
       Text shaping is an integral part of preparing text for display. It
     <title>Why do I need it?</title>
     <para>
       Text shaping is an integral part of preparing text for display. It
-      is a fairly low level operation; Harfbuzz is used directly by
+      is a fairly low level operation; HarfBuzz is used directly by
       graphic rendering libraries such as Pango, and the layout engines
       in Firefox, LibreOffice and Chromium. Unless you are
       <emphasis>writing</emphasis> one of these layout engines yourself,
       graphic rendering libraries such as Pango, and the layout engines
       in Firefox, LibreOffice and Chromium. Unless you are
       <emphasis>writing</emphasis> one of these layout engines yourself,
-      you will probably not need to use Harfbuzz - normally higher level
+      you will probably not need to use HarfBuzz - normally higher level
       libraries will turn text into glyphs for you.
     </para>
     <para>
       However, if you <emphasis>are</emphasis> writing a layout engine
       or graphics library yourself, you will need to perform text
       libraries will turn text into glyphs for you.
     </para>
     <para>
       However, if you <emphasis>are</emphasis> writing a layout engine
       or graphics library yourself, you will need to perform text
-      shaping, and this is where Harfbuzz can help you. Here are some
+      shaping, and this is where HarfBuzz can help you. Here are some
       reasons why you need it:
     </para>
     <itemizedlist>
       reasons why you need it:
     </para>
     <itemizedlist>
     <para>
       If this is something that you need to do, then you need a text
       shaping engine: you could use Uniscribe if you are using Windows;
     <para>
       If this is something that you need to do, then you need a text
       shaping engine: you could use Uniscribe if you are using Windows;
-      you could use CoreText on OS X; or you could use Harfbuzz. In the
+      you could use CoreText on OS X; or you could use HarfBuzz. In the
       rest of this manual, we are going to assume that you are the
       implementor of a text layout engine.
     </para>
   </section>
   <section id="why-is-it-called-harfbuzz">
       rest of this manual, we are going to assume that you are the
       implementor of a text layout engine.
     </para>
   </section>
   <section id="why-is-it-called-harfbuzz">
-    <title>Why is it called Harfbuzz?</title>
+    <title>Why is it called HarfBuzz?</title>
     <para>
     <para>
-      Harfbuzz began its life as text shaping code within the FreeType
+      HarfBuzz began its life as text shaping code within the FreeType
       project, (and you will see references to the FreeType authors
       within the source code copyright declarations) but was then
       abstracted out to its own project. This project is maintained by
       project, (and you will see references to the FreeType authors
       within the source code copyright declarations) but was then
       abstracted out to its own project. This project is maintained by
-      Behdad Esfahbod, and named Harfbuzz. Originally, it was a shaping
-      engine for OpenType fonts - &quot;Harfbuzz&quot; is the Persian
+      Behdad Esfahbod, and named HarfBuzz. Originally, it was a shaping
+      engine for OpenType fonts - &quot;HarfBuzz&quot; is the Persian
       for &quot;open type&quot;.
     </para>
   </section>
       for &quot;open type&quot;.
     </para>
   </section>
index c514bd8..de28578 100644 (file)
@@ -1 +1 @@
-1.4.6
+1.7.6
index e791656..e4a12a5 100644 (file)
@@ -25,6 +25,7 @@ TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
 
 SETUP_FILES = \
        $(content_files)                \
 
 SETUP_FILES = \
        $(content_files)                \
+       $(expand_content_files)         \
        $(DOC_MAIN_SGML_FILE)           \
        $(DOC_MODULE)-sections.txt      \
        $(DOC_MODULE)-overrides.txt
        $(DOC_MAIN_SGML_FILE)           \
        $(DOC_MODULE)-sections.txt      \
        $(DOC_MODULE)-overrides.txt
@@ -86,7 +87,7 @@ GTK_DOC_V_SETUP_0=@echo "  DOC   Preparing build";
 
 setup-build.stamp:
        -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
 
 setup-build.stamp:
        -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
-           files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+           files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \
            if test "x$$files" != "x" ; then \
                for file in $$files ; do \
                    destdir=`dirname $(abs_builddir)/$$file`; \
            if test "x$$files" != "x" ; then \
                for file in $$files ; do \
                    destdir=`dirname $(abs_builddir)/$$file`; \
@@ -118,7 +119,7 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
        $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
            scanobj_options=""; \
            gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
        $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
            scanobj_options=""; \
            gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
-           if test "$(?)" = "0"; then \
+           if test "$$?" = "0"; then \
                if test "x$(V)" = "x1"; then \
                    scanobj_options="--verbose"; \
                fi; \
                if test "x$(V)" = "x1"; then \
                    scanobj_options="--verbose"; \
                fi; \
@@ -141,7 +142,7 @@ GTK_DOC_V_XML=$(GTK_DOC_V_XML_$(V))
 GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY))
 GTK_DOC_V_XML_0=@echo "  DOC   Building XML";
 
 GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY))
 GTK_DOC_V_XML_0=@echo "  DOC   Building XML";
 
-sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent
        $(GTK_DOC_V_XML)_source_dir='' ; \
        for i in $(DOC_SOURCE_DIR) ; do \
            _source_dir="$${_source_dir} --source-dir=$$i" ; \
        $(GTK_DOC_V_XML)_source_dir='' ; \
        for i in $(DOC_SOURCE_DIR) ; do \
            _source_dir="$${_source_dir} --source-dir=$$i" ; \
@@ -152,6 +153,17 @@ sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DO
 sgml.stamp: sgml-build.stamp
        @true
 
 sgml.stamp: sgml-build.stamp
        @true
 
+xml/gtkdocentities.ent: Makefile
+       $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \
+               echo "<!ENTITY package \"$(PACKAGE)\">"; \
+               echo "<!ENTITY package_bugreport \"$(PACKAGE_BUGREPORT)\">"; \
+               echo "<!ENTITY package_name \"$(PACKAGE_NAME)\">"; \
+               echo "<!ENTITY package_string \"$(PACKAGE_STRING)\">"; \
+               echo "<!ENTITY package_tarname \"$(PACKAGE_TARNAME)\">"; \
+               echo "<!ENTITY package_url \"$(PACKAGE_URL)\">"; \
+               echo "<!ENTITY package_version \"$(PACKAGE_VERSION)\">"; \
+       ) > $@
+
 #### html ####
 
 GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_$(V))
 #### html ####
 
 GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_$(V))
@@ -162,17 +174,17 @@ GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_$(V))
 GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY))
 GTK_DOC_V_XREF_0=@echo "  DOC   Fixing cross-references";
 
 GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY))
 GTK_DOC_V_XREF_0=@echo "  DOC   Fixing cross-references";
 
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
        $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
        mkhtml_options=""; \
        gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
        $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
        mkhtml_options=""; \
        gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
-       if test "$(?)" = "0"; then \
+       if test "$$?" = "0"; then \
          if test "x$(V)" = "x1"; then \
            mkhtml_options="$$mkhtml_options --verbose"; \
          fi; \
        fi; \
        gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
          if test "x$(V)" = "x1"; then \
            mkhtml_options="$$mkhtml_options --verbose"; \
          fi; \
        fi; \
        gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
-       if test "$(?)" = "0"; then \
+       if test "$$?" = "0"; then \
          mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
        fi; \
        cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
          mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
        fi; \
        cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
@@ -194,11 +206,11 @@ GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_$(V))
 GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY))
 GTK_DOC_V_PDF_0=@echo "  DOC   Building PDF";
 
 GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY))
 GTK_DOC_V_PDF_0=@echo "  DOC   Building PDF";
 
-pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
        $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
        mkpdf_options=""; \
        gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
        $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
        mkpdf_options=""; \
        gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
-       if test "$(?)" = "0"; then \
+       if test "$$?" = "0"; then \
          if test "x$(V)" = "x1"; then \
            mkpdf_options="$$mkpdf_options --verbose"; \
          fi; \
          if test "x$(V)" = "x1"; then \
            mkpdf_options="$$mkpdf_options --verbose"; \
          fi; \
@@ -223,12 +235,15 @@ clean-local:
        @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
          rm -f $(DOC_MODULE).types; \
        fi
        @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
          rm -f $(DOC_MODULE).types; \
        fi
+       @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \
+         rm -f $(DOC_MODULE)-sections.txt; \
+       fi
 
 distclean-local:
        @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
            $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
        @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
 
 distclean-local:
        @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
            $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
        @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
-           rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
+           rm -f $(SETUP_FILES) $(DOC_MODULE).types; \
        fi
 
 maintainer-clean-local:
        fi
 
 maintainer-clean-local:
index d2896eb..0769969 100644 (file)
@@ -13,7 +13,7 @@
   <!--download-page
   rdf:resource=""/-->
   <bug-database
   <!--download-page
   rdf:resource=""/-->
   <bug-database
-  rdf:resource="http://bugs.freedesktop.org/enter_bug.cgi?product=harfbuzz"/>
+  rdf:resource="https://github.com/harfbuzz/harfbuzz/issues" />
 
   <maintainer>
     <foaf:Person>
 
   <maintainer>
     <foaf:Person>
index 377bb86..59990a1 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2011-11-20.07; # UTC
+scriptversion=2014-09-12.12; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
+tab='  '
 nl='
 '
 nl='
 '
-IFS=" ""       $nl"
+IFS=" $tab$nl"
 
 
-# set DOITPROG to echo to test this script
+# Set DOITPROG to "echo" to test this script.
 
 
-# Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
 doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
+doit_exec=${doit:-exec}
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
@@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
 posix_mkdir=
 
 # Desired mode of installed file.
 posix_mkdir=
 
 # Desired mode of installed file.
@@ -97,7 +82,7 @@ dir_arg=
 dst_arg=
 
 copy_on_change=false
 dst_arg=
 
 copy_on_change=false
-no_target_directory=
+is_target_a_directory=possibly
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -137,46 +122,57 @@ while test $# -ne 0; do
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-       shift;;
+        shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-       case $mode in
-         *' '* | *'    '* | *'
-'*       | *'*'* | *'?'* | *'['*)
-           echo "$0: invalid mode: $mode" >&2
-           exit 1;;
-       esac
-       shift;;
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
 
     -o) chowncmd="$chownprog $2"
 
     -o) chowncmd="$chownprog $2"
-       shift;;
+        shift;;
 
     -s) stripcmd=$stripprog;;
 
 
     -s) stripcmd=$stripprog;;
 
-    -t) dst_arg=$2
-       # Protect names problematic for 'test' and other utilities.
-       case $dst_arg in
-         -* | [=\(\)!]) dst_arg=./$dst_arg;;
-       esac
-       shift;;
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
 
 
-    -T) no_target_directory=true;;
+    -T) is_target_a_directory=never;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --)        shift
-       break;;
+    --) shift
+        break;;
 
 
-    -*)        echo "$0: invalid option: $1" >&2
-       exit 1;;
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
 
     *)  break;;
   esac
   shift
 done
 
 
     *)  break;;
   esac
   shift
 done
 
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -208,6 +204,15 @@ if test $# -eq 0; then
 fi
 
 if test -z "$dir_arg"; then
 fi
 
 if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
   do_exit='(exit $ret); exit $ret'
   trap "ret=129; $do_exit" 1
   trap "ret=130; $do_exit" 2
   do_exit='(exit $ret); exit $ret'
   trap "ret=129; $do_exit" 1
   trap "ret=130; $do_exit" 2
@@ -223,16 +228,16 @@ if test -z "$dir_arg"; then
 
     *[0-7])
       if test -z "$stripcmd"; then
 
     *[0-7])
       if test -z "$stripcmd"; then
-       u_plus_rw=
+        u_plus_rw=
       else
       else
-       u_plus_rw='% 200'
+        u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-       u_plus_rw=
+        u_plus_rw=
       else
       else
-       u_plus_rw=,u+rw
+        u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -269,41 +274,15 @@ do
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
     if test -d "$dst"; then
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
     if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-       echo "$0: $dst_arg: Is a directory" >&2
-       exit 1
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
       fi
       dstdir=$dst
       dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
       fi
       dstdir=$dst
       dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-       (dirname "$dst") 2>/dev/null ||
-       expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-            X"$dst" : 'X\(//\)[^/]' \| \
-            X"$dst" : 'X\(//\)$' \| \
-            X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-       echo X"$dst" |
-           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-                  s//\1/
-                  q
-                }
-                /^X\(\/\/\)[^/].*/{
-                  s//\1/
-                  q
-                }
-                /^X\(\/\/\)$/{
-                  s//\1/
-                  q
-                }
-                /^X\(\/\).*/{
-                  s//\1/
-                  q
-                }
-                s/.*/./; q'
-      `
-
+      dstdir=`dirname "$dst"`
       test -d "$dstdir"
       dstdir_status=$?
     fi
       test -d "$dstdir"
       dstdir_status=$?
     fi
@@ -314,74 +293,81 @@ do
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-       # Create intermediate dirs using mode 755 as modified by the umask.
-       # This is like FreeBSD 'install' as of 1997-10-28.
-       umask=`umask`
-       case $stripcmd.$umask in
-         # Optimize common cases.
-         *[2367][2367]) mkdir_umask=$umask;;
-         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-         *[0-7])
-           mkdir_umask=`expr $umask + 22 \
-             - $umask % 100 % 40 + $umask % 20 \
-             - $umask % 10 % 4 + $umask % 2
-           `;;
-         *) mkdir_umask=$umask,go-w;;
-       esac
-
-       # With -d, create the new directory with the user-specified mode.
-       # Otherwise, rely on $mkdir_umask.
-       if test -n "$dir_arg"; then
-         mkdir_mode=-m$mode
-       else
-         mkdir_mode=
-       fi
-
-       posix_mkdir=false
-       case $umask in
-         *[123567][0-7][0-7])
-           # POSIX mkdir -p sets u+wx bits regardless of umask, which
-           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-           ;;
-         *)
-           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-           trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-           if (umask $mkdir_umask &&
-               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-           then
-             if test -z "$dir_arg" || {
-                  # Check for POSIX incompatibilities with -m.
-                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                  # other-writable bit of parent directory when it shouldn't.
-                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-                  ls_ld_tmpdir=`ls -ld "$tmpdir"`
-                  case $ls_ld_tmpdir in
-                    d????-?r-*) different_mode=700;;
-                    d????-?--*) different_mode=755;;
-                    *) false;;
-                  esac &&
-                  $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-                    ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-                  }
-                }
-             then posix_mkdir=:
-             fi
-             rmdir "$tmpdir/d" "$tmpdir"
-           else
-             # Remove any dirs left behind by ancient mkdir implementations.
-             rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-           fi
-           trap '' 0;;
-       esac;;
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # $RANDOM is not portable (e.g. dash);  use it when possible to
+            # lower collision chance
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
+            # create the $tmpdir first (and fail if unsuccessful) to make sure
+            # that nobody tries to guess the $tmpdir name.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
     esac
 
     if
       $posix_mkdir && (
     esac
 
     if
       $posix_mkdir && (
-       umask $mkdir_umask &&
-       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
       )
     then :
     else
@@ -391,53 +377,51 @@ do
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-       /*) prefix='/';;
-       [-=\(\)!]*) prefix='./';;
-       *)  prefix='';;
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
       esac
 
       esac
 
-      eval "$initialize_posix_glob"
-
       oIFS=$IFS
       IFS=/
       oIFS=$IFS
       IFS=/
-      $posix_glob set -f
+      set -f
       set fnord $dstdir
       shift
       set fnord $dstdir
       shift
-      $posix_glob set +f
+      set +f
       IFS=$oIFS
 
       prefixes=
 
       for d
       do
       IFS=$oIFS
 
       prefixes=
 
       for d
       do
-       test X"$d" = X && continue
-
-       prefix=$prefix$d
-       if test -d "$prefix"; then
-         prefixes=
-       else
-         if $posix_mkdir; then
-           (umask=$mkdir_umask &&
-            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-           # Don't fail if two instances are running concurrently.
-           test -d "$prefix" || exit 1
-         else
-           case $prefix in
-             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-             *) qprefix=$prefix;;
-           esac
-           prefixes="$prefixes '$qprefix'"
-         fi
-       fi
-       prefix=$prefix/
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
       done
 
       if test -n "$prefixes"; then
-       # Don't fail if two instances are running concurrently.
-       (umask $mkdir_umask &&
-        eval "\$doit_exec \$mkdirprog $prefixes") ||
-         test -d "$dstdir" || exit 1
-       obsolete_mkdir_used=true
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
       fi
     fi
   fi
       fi
     fi
   fi
@@ -472,15 +456,12 @@ do
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
+       set +f &&
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
@@ -493,24 +474,24 @@ do
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-       # Now remove or move aside any old file at destination location.
-       # We try this two ways since rm can't unlink itself on some
-       # systems and the destination file might be busy for other
-       # reasons.  In this case, the final cleanup might fail but the new
-       # file should still install successfully.
-       {
-         test ! -f "$dst" ||
-         $doit $rmcmd -f "$dst" 2>/dev/null ||
-         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-         } ||
-         { echo "$0: cannot unlink or rename $dst" >&2
-           (exit 1); exit 1
-         }
-       } &&
-
-       # Now rename the file to the real destination.
-       $doit $mvcmd "$dsttmp" "$dst"
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
       }
     fi || exit 1
 
index a356aca..a736cf9 100644 (file)
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -1,9 +1,12 @@
+#! /bin/sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+##               by inline-source v2014-01-03.01
 
 
-# libtool (GNU libtool) 2.4.2
+# libtool (GNU libtool) 2.4.6
+# Provide generalized library-building support services.
 # Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
 
 # Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
 # This is free software; see the source for copying conditions.  There is NO
 # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 # This is free software; see the source for copying conditions.  There is NO
 # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --no-warn            don't display warning messages
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:        $host
-#         shell:               $SHELL
-#         compiler:            $LTCC
-#         compiler flags:              $LTCFLAGS
-#         linker:              $LD (gnu? $with_gnu_ld)
-#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1
-#         automake:    $automake_version
-#         autoconf:    $autoconf_version
-#
-# Report bugs to <bug-libtool@gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
 
 PROGRAM=libtool
 PACKAGE=libtool
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION="2.4.2 Debian-2.4.2-1.7ubuntu1"
-TIMESTAMP=""
-package_revision=1.3337
+VERSION="2.4.6 Debian-2.4.6-2"
+package_revision=2.4.6
 
 
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2015-01-20.17; # 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/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+#   . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
   NULLCMD=:
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
 else
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
 else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
 fi
 fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
 
 
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
 do
 do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-         export $lt_var
-         lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-         lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+  eval "if test set = \"\${$_G_var+set}\"; then
+          save_$_G_var=\$$_G_var
+          $_G_var=C
+         export $_G_var
+         _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+         _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
        fi"
 done
        fi"
 done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
 
 
-$lt_unset CDPATH
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
 
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp       $nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
 
 
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
 
 
 
 
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+
+
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+    test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+    _G_progs_list=$1
+    _G_check_func=$2
+    _G_PATH=${3-"$PATH"}
+
+    _G_path_prog_max=0
+    _G_path_prog_found=false
+    _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+    for _G_dir in $_G_PATH; do
+      IFS=$_G_save_IFS
+      test -z "$_G_dir" && _G_dir=.
+      for _G_prog_name in $_G_progs_list; do
+        for _exeext in '' .EXE; do
+          _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+          func_executable_p "$_G_path_prog" || continue
+          case `"$_G_path_prog" --version 2>&1` in
+            *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+            *)     $_G_check_func $_G_path_prog
+                  func_path_progs_result=$func_check_prog_result
+                  ;;
+          esac
+          $_G_path_prog_found && break 3
+        done
+      done
+    done
+    IFS=$_G_save_IFS
+    test -z "$func_path_progs_result" && {
+      echo "no acceptable sed could be found in \$PATH" >&2
+      exit 1
+    }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+  _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+  for _G_i in 1 2 3 4 5 6 7; do
+    _G_sed_script=$_G_sed_script$nl$_G_sed_script
+  done
+  echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+  _G_sed_script=
+
+  func_check_prog_sed ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo '' >> conftest.nl
+      "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+  rm -f conftest.sed
+  SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+  func_check_prog_grep ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    _G_path_prog_max=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo 'GREP' >> conftest.nl
+      "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+  GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables.  These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
 
 : ${CP="cp -f"}
 
 : ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
+: ${LN_S="ln -s"}
 : ${MAKE="make"}
 : ${MKDIR="mkdir"}
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 : ${SHELL="${CONFIG_SHELL-/bin/sh}"}
 : ${MAKE="make"}
 : ${MKDIR="mkdir"}
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 : ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77     # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS="  $lt_nl"
 
 
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
 
 
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-} # func_dirname may be replaced by extended shell implementation
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
 
 
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
 
 
-# func_basename file
-func_basename ()
-{
-    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-} # func_basename may be replaced by extended shell implementation
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
 
 
+# Same as above, but do not quote variable references.
+sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
 
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-    # Extract subdirectory from the argument.
-    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-} # func_dirname_and_basename may be replaced by extended shell implementation
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
 
 
+# Sed substitution that converts a w32 file name or path
+# that contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same.  If an odd number of '\' preceded a
+# '$' in input to sed_double_quote_subst, that '$' was protected from
+# expansion.  Since each input '\' is now two '\'s, look for any number
+# of runs of four '\'s followed by two '\'s and then a '$'.  '\' that '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+  s/$_G_bs4/&\\
+/g
+  s/^$_G_bs2$_G_dollar/$_G_bs&/
+  s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+  s/\n//g"
 
 
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-    case ${2} in
-      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-    esac
-} # func_stripname may be replaced by extended shell implementation
 
 
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
 
 
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-               s@/\./@/@g
-               t dotsl
-               s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
 
 
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77     # $? = 77 is used to indicate a skipped test to automake.
 
 
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+#    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
 
 
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
+# By convention, finish your script with:
+#
+#    exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
 
 
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath=$0
 
 
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
 
 
-# Make sure we have an absolute path for reexecution:
+# Make sure we have an absolute progpath for reexecution:
 case $progpath in
   [\\/]*|[A-Za-z]:\\*) ;;
   *[\\/]*)
 case $progpath in
   [\\/]*|[A-Za-z]:\\*) ;;
   *[\\/]*)
-     progdir=$func_dirname_result
+     progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
      progdir=`cd "$progdir" && pwd`
      progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
+     progpath=$progdir/$progname
      ;;
   *)
      ;;
   *)
-     save_IFS="$IFS"
+     _G_IFS=$IFS
      IFS=${PATH_SEPARATOR-:}
      for progdir in $PATH; do
      IFS=${PATH_SEPARATOR-:}
      for progdir in $PATH; do
-       IFS="$save_IFS"
+       IFS=$_G_IFS
        test -x "$progdir/$progname" && break
      done
        test -x "$progdir/$progname" && break
      done
-     IFS="$save_IFS"
+     IFS=$_G_IFS
      test -n "$progdir" || progdir=`pwd`
      test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
+     progpath=$progdir/$progname
      ;;
 esac
 
      ;;
 esac
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
 
-# Sed substitution that turns a string into a regex matching for the
-# string literally.
-sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
 
 
-# Sed substitution that converts a w32 file name or path
-# which contains forward slashes, into one that contains
-# (escaped) backslashes.  A very naive implementation.
-lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
 
 
-# Standard options:
 opt_dry_run=false
 opt_dry_run=false
-opt_help=false
 opt_quiet=false
 opt_verbose=false
 opt_quiet=false
 opt_verbose=false
-opt_warning=:
 
 
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
-}
+# Categories 'all' and 'none' are always available.  Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
 
 
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
+# By default, display warnings according to 'opt_warning_types'.  Set
+# 'warning_func'  to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
 
 
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
 
 
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
 
 
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
-}
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
 
 
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
 
 
-    # bash bug again:
-    :
-}
 
 
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
 {
 {
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
+    $debug_cmd
+
+    test -t 1 && {
+      # COLORTERM and USE_ANSI_COLORS environment variables take
+      # precedence, because most terminfo databases neglect to describe
+      # whether color sequences are supported.
+      test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+      if test 1 = "$USE_ANSI_COLORS"; then
+        # Standard ANSI escape sequences
+        tc_reset='\e[0m'
+        tc_bold='\e[1m';   tc_standout='\e[7m'
+        tc_red='\e[31m';   tc_green='\e[32m'
+        tc_blue='\e[34m';  tc_cyan='\e[36m'
+      else
+        # Otherwise trust the terminfo database after all.
+        test -n "`tput sgr0 2>/dev/null`" && {
+          tc_reset=`tput sgr0`
+          test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+          tc_standout=$tc_bold
+          test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+          test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+          test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+          test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+          test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+        }
+      fi
+    }
 
 
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
+    require_term_colors=:
 }
 }
-help="Try \`$progname --help' for more information."  ## default
 
 
 
 
-# func_grep expression filename
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+  # We should try to minimise forks, especially on Windows where they are
+  # unreasonably slow, so skip the feature probes when bash or zsh are
+  # being used:
+  if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+    : ${_G_HAVE_ARITH_OP="yes"}
+    : ${_G_HAVE_XSI_OPS="yes"}
+    # The += operator was introduced in bash 3.1
+    case $BASH_VERSION in
+      [12].* | 3.0 | 3.0*) ;;
+      *)
+        : ${_G_HAVE_PLUSEQ_OP="yes"}
+        ;;
+    esac
+  fi
+
+  # _G_HAVE_PLUSEQ_OP
+  # Can be empty, in which case the shell is probed, "yes" if += is
+  # useable or anything else if it does not work.
+  test -z "$_G_HAVE_PLUSEQ_OP" \
+    && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+    && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_append ()
+  {
+    $debug_cmd
+
+    eval "$1+=\$2"
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_append ()
+  {
+    $debug_cmd
+
+    eval "$1=\$$1\$2"
+  }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+  eval 'func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1+=\\ \$func_quote_for_eval_result"
+  }'
+else
+  func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1=\$$1\\ \$func_quote_for_eval_result"
+  }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE.  For example:
+#
+#   func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
+{
+    $debug_cmd
+
+    eval _G_current_value='`$ECHO $'$1'`'
+    _G_delim=`expr "$2" : '\(.\)'`
+
+    case $_G_delim$_G_current_value$_G_delim in
+      *"$2$_G_delim"*) ;;
+      *) func_append "$@" ;;
+    esac
+}
+
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+  test -z "$_G_HAVE_ARITH_OP" \
+    && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+    && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+  eval 'func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=$(( $* ))
+  }'
+else
+  func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=`expr "$@"`
+  }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  # If this shell supports suffix pattern removal, then use it to avoid
+  # forking. Hide the definitions single quotes in case the shell chokes
+  # on unsupported syntax...
+  _b='func_basename_result=${1##*/}'
+  _d='case $1 in
+        */*) func_dirname_result=${1%/*}$2 ;;
+        *  ) func_dirname_result=$3        ;;
+      esac'
+
+else
+  # ...otherwise fall back to using sed.
+  _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+  _d='func_dirname_result=`$ECHO "$1"  |$SED "$sed_dirname"`
+      if test "X$func_dirname_result" = "X$1"; then
+        func_dirname_result=$3
+      else
+        func_append func_dirname_result "$2"
+      fi'
+fi
+
+eval 'func_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+    $debug_cmd
+
+    '"$_d"'
+}'
+
+
+# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
+# --------------------------------------------------------
+# Perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+    '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    _G_infix=$1; shift
+    _G_indent=$_G_infix
+    _G_prefix="$progname: $_G_infix: "
+    _G_message=$*
+
+    # Strip color escape sequences before counting printable length
+    for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+    do
+      test -n "$_G_tc" && {
+        _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+        _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+      }
+    done
+    _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`"  " ## exclude from sc_prohibit_nested_quotes
+
+    func_echo_infix_1_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_infix_1_IFS
+      $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+      _G_prefix=$_G_indent
+    done
+    IFS=$func_echo_infix_1_IFS
+}
+
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "  $tc_standout${tc_red}error$tc_reset" "$*" >&2
+}
+
+
+# func_fatal_error ARG...
+# -----------------------
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    $debug_cmd
+
+    func_error "$*"
+    exit $EXIT_FAILURE
+}
+
+
+# func_grep EXPRESSION FILENAME
+# -----------------------------
 # Check whether EXPRESSION matches any line of FILENAME, without output.
 func_grep ()
 {
 # Check whether EXPRESSION matches any line of FILENAME, without output.
 func_grep ()
 {
+    $debug_cmd
+
     $GREP "$1" "$2" >/dev/null 2>&1
 }
 
 
     $GREP "$1" "$2" >/dev/null 2>&1
 }
 
 
-# func_mkdir_p directory-path
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+  test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=${#1}
+  }'
+else
+  func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+  }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
 # Make sure the entire path to DIRECTORY-PATH is available.
 func_mkdir_p ()
 {
 # Make sure the entire path to DIRECTORY-PATH is available.
 func_mkdir_p ()
 {
-    my_directory_path="$1"
-    my_dir_list=
+    $debug_cmd
 
 
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+    _G_directory_path=$1
+    _G_dir_list=
 
 
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
+    if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
+
+      # Protect directory names starting with '-'
+      case $_G_directory_path in
+        -*) _G_directory_path=./$_G_directory_path ;;
       esac
 
       # While some portion of DIR does not yet exist...
       esac
 
       # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
+      while test ! -d "$_G_directory_path"; do
         # ...make a list in topmost first order.  Use a colon delimited
        # list incase some portion of path contains whitespace.
         # ...make a list in topmost first order.  Use a colon delimited
        # list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
+        _G_dir_list=$_G_directory_path:$_G_dir_list
 
         # If the last portion added has no slash in it, the list is done
 
         # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
+        case $_G_directory_path in */*) ;; *) break ;; esac
 
         # ...otherwise throw away the child directory and loop
 
         # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+        _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
       done
       done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+      _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
 
 
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-       IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
+      func_mkdir_p_IFS=$IFS; IFS=:
+      for _G_dir in $_G_dir_list; do
+       IFS=$func_mkdir_p_IFS
+        # mkdir can fail with a 'File exist' error if two processes
         # try to create one of the directories concurrently.  Don't
         # stop in that case!
         # try to create one of the directories concurrently.  Don't
         # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
+        $MKDIR "$_G_dir" 2>/dev/null || :
       done
       done
-      IFS="$save_mkdir_p_IFS"
+      IFS=$func_mkdir_p_IFS
 
       # Bail out if we (or some other process) failed to create a directory.
 
       # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
+      test -d "$_G_directory_path" || \
+        func_fatal_error "Failed to create '$1'"
     fi
 }
 
 
     fi
 }
 
 
-# func_mktempdir [string]
+# func_mktempdir [BASENAME]
+# -------------------------
 # Make a temporary directory that won't clash with other running
 # libtool processes, and avoids race conditions if possible.  If
 # Make a temporary directory that won't clash with other running
 # libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
+# given, BASENAME is the basename for that directory.
 func_mktempdir ()
 {
 func_mktempdir ()
 {
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
+    $debug_cmd
+
+    _G_template=${TMPDIR-/tmp}/${1-$progname}
 
 
-    if test "$opt_dry_run" = ":"; then
+    if test : = "$opt_dry_run"; then
       # Return a directory name, but don't create it in dry-run mode
       # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
+      _G_tmpdir=$_G_template-$$
     else
 
       # If mktemp works, use that first and foremost
     else
 
       # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+      _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
 
 
-      if test ! -d "$my_tmpdir"; then
+      if test ! -d "$_G_tmpdir"; then
         # Failing that, at least try and use $RANDOM to avoid a race
         # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
+        _G_tmpdir=$_G_template-${RANDOM-0}$$
 
 
-        save_mktempdir_umask=`umask`
+        func_mktempdir_umask=`umask`
         umask 0077
         umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
+        $MKDIR "$_G_tmpdir"
+        umask $func_mktempdir_umask
       fi
 
       # If we're not in dry-run mode, bomb out on failure
       fi
 
       # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+      test -d "$_G_tmpdir" || \
+        func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
+    fi
+
+    $ECHO "$_G_tmpdir"
+}
+
+
+# func_normal_abspath PATH
+# ------------------------
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+func_normal_abspath ()
+{
+    $debug_cmd
+
+    # These SED scripts presuppose an absolute path with a trailing slash.
+    _G_pathcar='s|^/\([^/]*\).*$|\1|'
+    _G_pathcdr='s|^/[^/]*||'
+    _G_removedotparts=':dotsl
+               s|/\./|/|g
+               t dotsl
+               s|/\.$|/|'
+    _G_collapseslashes='s|/\{1,\}|/|g'
+    _G_finalslash='s|/*$|/|'
+
+    # Start from root dir and reassemble the path.
+    func_normal_abspath_result=
+    func_normal_abspath_tpath=$1
+    func_normal_abspath_altnamespace=
+    case $func_normal_abspath_tpath in
+      "")
+        # Empty path, that just means $cwd.
+        func_stripname '' '/' "`pwd`"
+        func_normal_abspath_result=$func_stripname_result
+        return
+        ;;
+      # The next three entries are used to spot a run of precisely
+      # two leading slashes without using negated character classes;
+      # we take advantage of case's first-match behaviour.
+      ///*)
+        # Unusual form of absolute path, do nothing.
+        ;;
+      //*)
+        # Not necessarily an ordinary path; POSIX reserves leading '//'
+        # and for example Cygwin uses it to access remote file shares
+        # over CIFS/SMB, so we conserve a leading double slash if found.
+        func_normal_abspath_altnamespace=/
+        ;;
+      /*)
+        # Absolute path, do nothing.
+        ;;
+      *)
+        # Relative path, prepend $cwd.
+        func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+        ;;
+    esac
+
+    # Cancel out all the simple stuff to save iterations.  We also want
+    # the path to end with a slash for ease of parsing, so make sure
+    # there is one (and only one) here.
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
+    while :; do
+      # Processed it all yet?
+      if test / = "$func_normal_abspath_tpath"; then
+        # If we ascended to the root using ".." the result may be empty now.
+        if test -z "$func_normal_abspath_result"; then
+          func_normal_abspath_result=/
+        fi
+        break
+      fi
+      func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcar"`
+      func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcdr"`
+      # Figure out what to do with it
+      case $func_normal_abspath_tcomponent in
+        "")
+          # Trailing empty path component, ignore it.
+          ;;
+        ..)
+          # Parent dir; strip last assembled component from result.
+          func_dirname "$func_normal_abspath_result"
+          func_normal_abspath_result=$func_dirname_result
+          ;;
+        *)
+          # Actual path component, append it.
+          func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
+          ;;
+      esac
+    done
+    # Restore leading double-slash if one was found on entry.
+    func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+
+# func_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+    $debug_cmd
+
+    $opt_quiet || func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+
+# func_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+    $debug_cmd
+
+    func_relative_path_result=
+    func_normal_abspath "$1"
+    func_relative_path_tlibdir=$func_normal_abspath_result
+    func_normal_abspath "$2"
+    func_relative_path_tbindir=$func_normal_abspath_result
+
+    # Ascend the tree starting from libdir
+    while :; do
+      # check if we have found a prefix of bindir
+      case $func_relative_path_tbindir in
+        $func_relative_path_tlibdir)
+          # found an exact match
+          func_relative_path_tcancelled=
+          break
+          ;;
+        $func_relative_path_tlibdir*)
+          # found a matching prefix
+          func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+          func_relative_path_tcancelled=$func_stripname_result
+          if test -z "$func_relative_path_result"; then
+            func_relative_path_result=.
+          fi
+          break
+          ;;
+        *)
+          func_dirname $func_relative_path_tlibdir
+          func_relative_path_tlibdir=$func_dirname_result
+          if test -z "$func_relative_path_tlibdir"; then
+            # Have to descend all the way to the root!
+            func_relative_path_result=../$func_relative_path_result
+            func_relative_path_tcancelled=$func_relative_path_tbindir
+            break
+          fi
+          func_relative_path_result=../$func_relative_path_result
+          ;;
+      esac
+    done
+
+    # Now calculate path; take care to avoid doubling-up slashes.
+    func_stripname '' '/' "$func_relative_path_result"
+    func_relative_path_result=$func_stripname_result
+    func_stripname '/' '/' "$func_relative_path_tcancelled"
+    if test -n "$func_stripname_result"; then
+      func_append func_relative_path_result "/$func_stripname_result"
+    fi
+
+    # Normalisation. If bindir is libdir, return '.' else relative path.
+    if test -n "$func_relative_path_result"; then
+      func_stripname './' '' "$func_relative_path_result"
+      func_relative_path_result=$func_stripname_result
     fi
 
     fi
 
-    $ECHO "$my_tmpdir"
+    test -n "$func_relative_path_result" || func_relative_path_result=.
+
+    :
+}
+
+
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+#   i) func_quote_for_eval_result
+#      double-quoted, suitable for a subsequent eval
+#  ii) func_quote_for_eval_unquoted_result
+#      has all characters that are still active within double
+#      quotes backslashified.
+func_quote_for_eval ()
+{
+    $debug_cmd
+
+    func_quote_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"
+      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\"
+          ;;
+        *)
+          _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
+    done
+}
+
+
+# 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
+
+    case $1 in
+      *[\\\`\"]*)
+       _G_arg=`$ECHO "$1" | $SED \
+           -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        _G_arg=$1 ;;
+    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\"
+        ;;
+    esac
+
+    func_quote_for_expand_result=$_G_arg
+}
+
+
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_stripname ()
+  {
+    $debug_cmd
+
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary variable first.
+    func_stripname_result=$3
+    func_stripname_result=${func_stripname_result#"$1"}
+    func_stripname_result=${func_stripname_result%"$2"}
+  }'
+else
+  func_stripname ()
+  {
+    $debug_cmd
+
+    case $2 in
+      .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+      *)  func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+    esac
+  }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    func_quote_for_expand "$_G_cmd"
+    eval "func_notquiet $func_quote_for_expand_result"
+
+    $opt_dry_run || {
+      eval "$_G_cmd"
+      _G_status=$?
+      if test 0 -ne "$_G_status"; then
+       eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    $opt_quiet || {
+      func_quote_for_expand "$_G_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    $opt_dry_run || {
+      eval "$_G_user_locale
+           $_G_cmd"
+      _G_status=$?
+      eval "$_G_safe_locale"
+      if test 0 -ne "$_G_status"; then
+       eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_tr_sh
+# ----------
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+    $debug_cmd
+
+    case $1 in
+    [0-9]* | *[!a-zA-Z0-9_]*)
+      func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+      ;;
+    * )
+      func_tr_sh_result=$1
+      ;;
+    esac
+}
+
+
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $debug_cmd
+
+    $opt_verbose && func_echo "$*"
+
+    :
+}
+
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+    $debug_cmd
+
+    # CATEGORY must be in the warning_categories list!
+    case " $warning_categories " in
+      *" $1 "*) ;;
+      *) func_internal_error "invalid warning category '$1'" ;;
+    esac
+
+    _G_category=$1
+    shift
+
+    case " $opt_warning_types " in
+      *" $_G_category "*) $warning_func ${1+"$@"} ;;
+    esac
+}
+
+
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+    $debug_cmd
+
+    printf '%s\n%s\n' "$1" "$2" \
+      | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false.  Use it like this:
+#
+#  func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+    $debug_cmd
+
+    test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# 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-time-zone: "UTC"
+# 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.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+#   #!/bin/sh
+#   . relative/path/to/funclib.sh
+#   . relative/path/to/options-parser
+#   scriptversion=1.0
+#   func_options ${1+"$@"}
+#   eval set dummy "$func_options_result"; shift
+#   ...rest of your script...
+#
+# 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; '.
+#
+# 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
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'.  Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+       --debug        enable verbose shell tracing
+   -W, --warnings=CATEGORY
+                      report the warnings falling in CATEGORY [all]
+   -v, --verbose      verbosely report processing
+       --version      print version information and exit
+   -h, --help         print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+       'all'          show all warnings
+       'none'         turn off all the warnings
+       'error'        warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# 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.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+    $debug_cmd
+
+    func_append hookable_fns " $1"
+}
+
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not accept hook functions." ;;
+    esac
+
+    eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+func_remove_hook ()
+{
+    $debug_cmd
+
+    eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# 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
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+    esac
+
+    eval _G_hook_fns=\$$1_hooks; shift
+
+    for _G_hook in $_G_hook_fns; do
+      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
+    done
+
+    func_quote_for_eval ${1+"$@"}
+    func_run_hooks_result=$func_quote_for_eval_result
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# 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:
+#
+#    my_options_prep ()
+#    {
+#        $debug_cmd
+#
+#        # Extend the existing usage message.
+#        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
+#    }
+#    func_add_hook func_options_prep my_options_prep
+#
+#
+#    my_silent_option ()
+#    {
+#        $debug_cmd
+#
+#        # 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=: ;;
+#            # 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
+#                         ;;
+#            *)            set dummy "$_G_opt" "$*"; shift; break ;;
+#          esac
+#        done
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_silent_option_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_parse_options my_silent_option
+#
+#
+#    my_option_validation ()
+#    {
+#        $debug_cmd
+#
+#        $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
+# options you parse.  It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+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"}
+
+    eval func_run_hooks func_options \
+        ${func_validate_options_result+"$func_validate_options_result"}
+
+    # save modified positional parameters for caller
+    func_options_result=$func_run_hooks_result
 }
 
 
 }
 
 
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
+# func_options_prep [ARG]...
+# --------------------------
+# 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.
+func_hookable func_options_prep
+func_options_prep ()
 {
 {
-    case $1 in
-      *[\\\`\"\$]*)
-       func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
+    $debug_cmd
 
 
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and 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_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
+    # Option defaults:
+    opt_verbose=false
+    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_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
 {
 {
-    case $1 in
-      *[\\\`\"]*)
-       my_arg=`$ECHO "$1" | $SED \
-           -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
+    $debug_cmd
 
 
-    case $my_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.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
+    func_parse_options_result=
 
 
-    func_quote_for_expand_result="$my_arg"
-}
+    # 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_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
+      # Break out of the loop if we already parsed every option.
+      test $# -gt 0 || break
 
 
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --debug|-x)   debug_cmd='set -x'
+                      func_echo "enabling shell trace mode"
+                      $debug_cmd
+                      ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                      set dummy --warnings none ${1+"$@"}
+                      shift
+                     ;;
 
 
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-       eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
+        --warnings|--warning|-W)
+                      test $# = 0 && func_missing_arg $_G_opt && break
+                      case " $warning_categories $1" in
+                        *" $1 "*)
+                          # trailing space prevents matching last $1 above
+                          func_append_uniq opt_warning_types " $1"
+                          ;;
+                        *all)
+                          opt_warning_types=$warning_categories
+                          ;;
+                        *none)
+                          opt_warning_types=none
+                          warning_func=:
+                          ;;
+                        *error)
+                          opt_warning_types=$warning_categories
+                          warning_func=func_fatal_error
+                          ;;
+                        *)
+                          func_fatal_error \
+                             "unsupported warning category: '$1'"
+                          ;;
+                      esac
+                      shift
+                      ;;
+
+        --verbose|-v) opt_verbose=: ;;
+        --version)    func_version ;;
+        -\?|-h)       func_usage ;;
+        --help)       func_help ;;
+
+       # Separate optargs to long options (plugins may need this):
+       --*=*)        func_split_equals "$_G_opt"
+                     set dummy "$func_split_equals_lhs" \
+                          "$func_split_equals_rhs" ${1+"$@"}
+                      shift
+                      ;;
+
+       # Separate optargs to short options:
+        -W*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        # Separate non-argument short options:
+        -\?*|-h*|-v*|-x*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "-$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        --)           break ;;
+        -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
+        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+      esac
+    done
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    func_parse_options_result=$func_quote_for_eval_result
 }
 
 
 }
 
 
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
 {
 {
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
+    $debug_cmd
 
 
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
+    # Display all warnings if -W was not given.
+    test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
 
 
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-           $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-       eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
+    func_run_hooks func_validate_options ${1+"$@"}
 
 
-# func_tr_sh
-# Turn $1 into a string suitable for a shell variable name.
-# Result is stored in $func_tr_sh_result.  All characters
-# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
-# if $1 begins with a digit, a '_' is prepended as well.
-func_tr_sh ()
-{
-  case $1 in
-  [0-9]* | *[!a-zA-Z0-9_]*)
-    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
-    ;;
-  * )
-    func_tr_sh_result=$1
-    ;;
-  esac
+    # Bail if the options were screwed!
+    $exit_cmd $EXIT_FAILURE
+
+    # save modified positional parameters for caller
+    func_validate_options_result=$func_run_hooks_result
 }
 
 
 }
 
 
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $opt_debug
 
 
-    $SED -n '/(C)/!b go
-       :more
-       /\./!{
-         N
-         s/\n# / /
-         b more
-       }
-       :go
-       /^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-       s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
 
 
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
 {
 {
-    $opt_debug
+    $debug_cmd
 
 
-    $SED -n '/^# Usage:/,/^#  *.*--help/ {
-        s/^# //
-       s/^# *$//
-       s/\$progname/'$progname'/
-       p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
+    eval \$ECHO \""Usage: $usage"\"
+    eval \$ECHO \""$fatal_help"\"
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
 }
 
 }
 
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
 func_help ()
 {
 func_help ()
 {
-    $opt_debug
-
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-       :print
-        s/^# //
-       s/^# *$//
-       s*\$progname*'$progname'*
-       s*\$host*'"$host"'*
-       s*\$SHELL*'"$SHELL"'*
-       s*\$LTCC*'"$LTCC"'*
-       s*\$LTCFLAGS*'"$LTCFLAGS"'*
-       s*\$LD*'"$LD"'*
-       s/\$with_gnu_ld/'"$with_gnu_ld"'/
-       s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
-       s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
-       p
-       d
-     }
-     /^# .* home page:/b print
-     /^# General help using/b print
-     ' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message"
+    exit 0
 }
 
 }
 
-# func_missing_arg argname
+
+# func_missing_arg ARGNAME
+# ------------------------
 # Echo program name prefixed message to standard error and set global
 # exit_cmd.
 func_missing_arg ()
 {
 # Echo program name prefixed message to standard error and set global
 # exit_cmd.
 func_missing_arg ()
 {
-    $opt_debug
+    $debug_cmd
 
 
-    func_error "missing argument for $1."
+    func_error "Missing argument for '$1'."
     exit_cmd=exit
 }
 
 
     exit_cmd=exit
 }
 
 
-# func_split_short_opt shortopt
+# func_split_equals STRING
+# ------------------------
+# 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 \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=${1%%=*}
+      func_split_equals_rhs=${1#*=}
+      test "x$func_split_equals_lhs" = "x$1" \
+        && func_split_equals_rhs=
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+      func_split_equals_rhs=
+      test "x$func_split_equals_lhs" = "x$1" \
+        || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+  }
+fi #func_split_equals
+
+
+# func_split_short_opt SHORTOPT
+# -----------------------------
 # Set func_split_short_opt_name and func_split_short_opt_arg shell
 # variables after splitting SHORTOPT after the 2nd character.
 # Set func_split_short_opt_name and func_split_short_opt_arg shell
 # variables after splitting SHORTOPT after the 2nd character.
-func_split_short_opt ()
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_arg=${1#??}
+      func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+      func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+  }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
 {
 {
-    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
-    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+    $debug_cmd
 
 
-    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
-    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
-} # func_split_short_opt may be replaced by extended shell implementation
+    func_usage_message
+    $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+    exit 0
+}
 
 
 
 
-# func_split_long_opt longopt
-# Set func_split_long_opt_name and func_split_long_opt_arg shell
-# variables after splitting LONGOPT at the `=' sign.
-func_split_long_opt ()
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
 {
 {
-    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
-    my_sed_long_arg='1s/^--[^=]*=//'
+    $debug_cmd
 
 
-    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
-    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
-} # func_split_long_opt may be replaced by extended shell implementation
+    eval \$ECHO \""Usage: $usage"\"
+    echo
+    $SED -n 's|^# ||
+        /^Written by/{
+          x;p;x
+        }
+       h
+       /^Written by/q' < "$progpath"
+    echo
+    eval \$ECHO \""$usage_message"\"
+}
 
 
-exit_cmd=:
 
 
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+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 / {
+          s|^# ||
+          p
+        }
+        /^warranty; /q' < "$progpath"
 
 
+    exit $?
+}
 
 
 
 
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
+# Local variables:
+# 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-time-zone: "UTC"
+# End:
 
 
-# Global variables.
-nonopt=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.6'
 
 
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
 
 
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
 {
 {
-    eval "${1}=\$${1}\${2}"
-} # func_append may be replaced by extended shell implementation
+    $debug_cmd
 
 
-# func_append_quoted var value
-# Quote VALUE and append to the end of shell variable VAR, separated
-# by a space.
-func_append_quoted ()
-{
-    func_quote_for_eval "${2}"
-    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
-} # func_append_quoted may be replaced by extended shell implementation
+    _G_message=$*
 
 
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
 
 
-# func_arith arithmetic-term...
-func_arith ()
+
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
 {
 {
-    func_arith_result=`expr "${@}"`
-} # func_arith may be replaced by extended shell implementation
+    $debug_cmd
 
 
+    $warning_func ${1+"$@"}
+}
 
 
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
-} # func_len may be replaced by extended shell implementation
 
 
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+       --config             show all configuration variables
+       --debug              enable verbose shell tracing
+   -n, --dry-run            display commands without modifying any files
+       --features           display basic configuration information and exit
+       --mode=MODE          use operation mode MODE
+       --no-warnings        equivalent to '-Wnone'
+       --preserve-dup-deps  don't remove duplicate dependency libraries
+       --quiet, --silent    don't print informational messages
+       --tag=TAG            use configuration variables from tag TAG
+   -v, --verbose            print more informational messages than default
+       --version            print version information
+   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]
+   -h, --help, --help-all   print short, long, or detailed help message
+"
 
 
-# func_lo2o object
-func_lo2o ()
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
 {
 {
-    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-} # func_lo2o may be replaced by extended shell implementation
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message
+
+MODE must be one of the following:
+
+       clean           remove files from the build directory
+       compile         compile a source file into a libtool object
+       execute         automatically set library path, then run a program
+       finish          complete the installation of libtool libraries
+       install         install libraries or executables
+       link            create a library or an executable
+       uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  When passed as first option,
+'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+Try '$progname --help --mode=MODE' for a more detailed description of MODE.
+
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+
+       host-triplet:   $host
+       shell:          $SHELL
+       compiler:       $LTCC
+       compiler flags: $LTCFLAGS
+       linker:         $LD (gnu? $with_gnu_ld)
+       version:        $progname $scriptversion Debian-2.4.6-2
+       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/s/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+    exit 0
+}
 
 
 
 
-# func_xform libobj-or-source
-func_xform ()
-{
-    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-} # func_xform may be replaced by extended shell implementation
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
+
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_lo2o ()
+  {
+    case $1 in
+      *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+      *   ) func_lo2o_result=$1               ;;
+    esac
+  }'
+
+  # func_xform LIBOBJ-OR-SOURCE
+  # ---------------------------
+  # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+  # suffix to a '.lo' libtool-object suffix.
+  eval 'func_xform ()
+  {
+    func_xform_result=${1%.*}.lo
+  }'
+else
+  # ...otherwise fall back to using sed.
+  func_lo2o ()
+  {
+    func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+  }
+
+  func_xform ()
+  {
+    func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+  }
+fi
 
 
 
 
-# func_fatal_configuration arg...
+# func_fatal_configuration ARG...
+# -------------------------------
 # Echo program name prefixed message to standard error, followed by
 # a configuration failure hint, and exit.
 func_fatal_configuration ()
 {
 # Echo program name prefixed message to standard error, followed by
 # a configuration failure hint, and exit.
 func_fatal_configuration ()
 {
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
+    func__fatal_error ${1+"$@"} \
+      "See the $PACKAGE documentation for more information." \
+      "Fatal configuration error."
 }
 
 
 # func_config
 }
 
 
 # func_config
+# -----------
 # Display the configuration for all the tags in this script.
 func_config ()
 {
 # Display the configuration for all the tags in this script.
 func_config ()
 {
@@ -915,17 +2149,19 @@ func_config ()
     exit $?
 }
 
     exit $?
 }
 
+
 # func_features
 # func_features
+# -------------
 # Display the features supported by this script.
 func_features ()
 {
     echo "host: $host"
 # Display the features supported by this script.
 func_features ()
 {
     echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
+    if test yes = "$build_libtool_libs"; then
       echo "enable shared libraries"
     else
       echo "disable shared libraries"
     fi
       echo "enable shared libraries"
     else
       echo "disable shared libraries"
     fi
-    if test "$build_old_libs" = yes; then
+    if test yes = "$build_old_libs"; then
       echo "enable static libraries"
     else
       echo "disable static libraries"
       echo "enable static libraries"
     else
       echo "disable static libraries"
@@ -934,314 +2170,350 @@ func_features ()
     exit $?
 }
 
     exit $?
 }
 
-# func_enable_tag tagname
+
+# func_enable_tag TAGNAME
+# -----------------------
 # Verify that TAGNAME is valid, and either flag an error and exit, or
 # enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
 # variable here.
 func_enable_tag ()
 {
 # Verify that TAGNAME is valid, and either flag an error and exit, or
 # enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
 # variable here.
 func_enable_tag ()
 {
-  # Global variable:
-  tagname="$1"
+    # Global variable:
+    tagname=$1
 
 
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+    re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+    re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+    sed_extractcf=/$re_begincf/,/$re_endcf/p
 
 
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
+    # Validate tagname.
+    case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+        func_fatal_error "invalid tag name: $tagname"
+        ;;
+    esac
 
 
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
+    # Don't test for the "default" C tag, as we know it's
+    # there but not specially marked.
+    case $tagname in
+        CC) ;;
     *)
     *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-       taglist="$taglist $tagname"
-
-       # Evaluate the configuration.  Be careful to quote the path
-       # and the sed script, to avoid splitting on whitespace, but
-       # also don't use non-portable quotes within backquotes within
-       # quotes we have to do it in 2 steps:
-       extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-       eval "$extractedcf"
-      else
-       func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
+        if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+         taglist="$taglist $tagname"
+
+         # Evaluate the configuration.  Be careful to quote the path
+         # and the sed script, to avoid splitting on whitespace, but
+         # also don't use non-portable quotes within backquotes within
+         # quotes we have to do it in 2 steps:
+         extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+         eval "$extractedcf"
+        else
+         func_error "ignoring unknown tag $tagname"
+        fi
+        ;;
+    esac
 }
 
 }
 
+
 # func_check_version_match
 # func_check_version_match
+# ------------------------
 # Ensure that we are using m4 macros, and libtool script from the same
 # release of libtool.
 func_check_version_match ()
 {
 # Ensure that we are using m4 macros, and libtool script from the same
 # release of libtool.
 func_check_version_match ()
 {
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
+    if test "$package_revision" != "$macro_revision"; then
+      if test "$VERSION" != "$macro_version"; then
+        if test -z "$macro_version"; then
+          cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from an older release.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from an older release.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
-      else
-        cat >&2 <<_LT_EOF
+        else
+          cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
+        fi
+      else
+        cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
 $progname: but the definition of this LT_INIT comes from revision $macro_revision.
 $progname: You should recreate aclocal.m4 with macros from revision $package_revision
 $progname: of $PACKAGE $VERSION and run autoconf again.
 _LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
 $progname: but the definition of this LT_INIT comes from revision $macro_revision.
 $progname: You should recreate aclocal.m4 with macros from revision $package_revision
 $progname: of $PACKAGE $VERSION and run autoconf again.
 _LT_EOF
-    fi
+      fi
 
 
-    exit $EXIT_MISMATCH
-  fi
+      exit $EXIT_MISMATCH
+    fi
 }
 
 
 }
 
 
-# Shorthand for --mode=foo, only valid as the first argument
-case $1 in
-clean|clea|cle|cl)
-  shift; set dummy --mode clean ${1+"$@"}; shift
-  ;;
-compile|compil|compi|comp|com|co|c)
-  shift; set dummy --mode compile ${1+"$@"}; shift
-  ;;
-execute|execut|execu|exec|exe|ex|e)
-  shift; set dummy --mode execute ${1+"$@"}; shift
-  ;;
-finish|finis|fini|fin|fi|f)
-  shift; set dummy --mode finish ${1+"$@"}; shift
-  ;;
-install|instal|insta|inst|ins|in|i)
-  shift; set dummy --mode install ${1+"$@"}; shift
-  ;;
-link|lin|li|l)
-  shift; set dummy --mode link ${1+"$@"}; shift
-  ;;
-uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-  shift; set dummy --mode uninstall ${1+"$@"}; shift
-  ;;
-esac
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+    $debug_mode
 
 
+    # Option defaults:
+    opt_config=false
+    opt_dlopen=
+    opt_dry_run=false
+    opt_help=false
+    opt_mode=
+    opt_preserve_dup_deps=false
+    opt_quiet=false
 
 
+    nonopt=
+    preserve_args=
 
 
-# Option defaults:
-opt_debug=:
-opt_dry_run=false
-opt_config=false
-opt_preserve_dup_deps=false
-opt_features=false
-opt_finish=false
-opt_help=false
-opt_help_all=false
-opt_silent=:
-opt_warning=:
-opt_verbose=:
-opt_silent=false
-opt_verbose=false
+    # Shorthand for --mode=foo, only valid as the first argument
+    case $1 in
+    clean|clea|cle|cl)
+      shift; set dummy --mode clean ${1+"$@"}; shift
+      ;;
+    compile|compil|compi|comp|com|co|c)
+      shift; set dummy --mode compile ${1+"$@"}; shift
+      ;;
+    execute|execut|execu|exec|exe|ex|e)
+      shift; set dummy --mode execute ${1+"$@"}; shift
+      ;;
+    finish|finis|fini|fin|fi|f)
+      shift; set dummy --mode finish ${1+"$@"}; shift
+      ;;
+    install|instal|insta|inst|ins|in|i)
+      shift; set dummy --mode install ${1+"$@"}; shift
+      ;;
+    link|lin|li|l)
+      shift; set dummy --mode link ${1+"$@"}; shift
+      ;;
+    uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+      shift; set dummy --mode uninstall ${1+"$@"}; shift
+      ;;
+    esac
+
+    # Pass back the list of options.
+    func_quote_for_eval ${1+"$@"}
+    libtool_options_prep_result=$func_quote_for_eval_result
+}
+func_add_hook func_options_prep libtool_options_prep
 
 
 
 
-# Parse options once, thoroughly.  This comes as soon as possible in the
-# script to make things like `--version' happen as quickly as we can.
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
 {
 {
-  # this just eases exit handling
-  while test $# -gt 0; do
-    opt="$1"
-    shift
-    case $opt in
-      --debug|-x)      opt_debug='set -x'
-                       func_echo "enabling shell trace mode"
-                       $opt_debug
-                       ;;
-      --dry-run|--dryrun|-n)
-                       opt_dry_run=:
-                       ;;
-      --config)
-                       opt_config=:
-func_config
-                       ;;
-      --dlopen|-dlopen)
-                       optarg="$1"
-                       opt_dlopen="${opt_dlopen+$opt_dlopen
-}$optarg"
-                       shift
-                       ;;
-      --preserve-dup-deps)
-                       opt_preserve_dup_deps=:
-                       ;;
-      --features)
-                       opt_features=:
-func_features
-                       ;;
-      --finish)
-                       opt_finish=:
-set dummy --mode finish ${1+"$@"}; shift
-                       ;;
-      --help)
-                       opt_help=:
-                       ;;
-      --help-all)
-                       opt_help_all=:
-opt_help=': help-all'
-                       ;;
-      --mode)
-                       test $# = 0 && func_missing_arg $opt && break
-                       optarg="$1"
-                       opt_mode="$optarg"
-case $optarg in
-  # Valid mode arguments:
-  clean|compile|execute|finish|install|link|relink|uninstall) ;;
-
-  # Catch anything else as an error
-  *) func_error "invalid argument for $opt"
-     exit_cmd=exit
-     break
-     ;;
-esac
-                       shift
-                       ;;
-      --no-silent|--no-quiet)
-                       opt_silent=false
-func_append preserve_args " $opt"
-                       ;;
-      --no-warning|--no-warn)
-                       opt_warning=false
-func_append preserve_args " $opt"
-                       ;;
-      --no-verbose)
-                       opt_verbose=false
-func_append preserve_args " $opt"
-                       ;;
-      --silent|--quiet)
-                       opt_silent=:
-func_append preserve_args " $opt"
-        opt_verbose=false
-                       ;;
-      --verbose|-v)
-                       opt_verbose=:
-func_append preserve_args " $opt"
-opt_silent=false
-                       ;;
-      --tag)
-                       test $# = 0 && func_missing_arg $opt && break
-                       optarg="$1"
-                       opt_tag="$optarg"
-func_append preserve_args " $opt $optarg"
-func_enable_tag "$optarg"
-                       shift
-                       ;;
-
-      -\?|-h)          func_usage                              ;;
-      --help)          func_help                               ;;
-      --version)       func_version                            ;;
-
-      # Separate optargs to long options:
-      --*=*)
-                       func_split_long_opt "$opt"
-                       set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
-                       shift
-                       ;;
-
-      # Separate non-argument short options:
-      -\?*|-h*|-n*|-v*)
-                       func_split_short_opt "$opt"
-                       set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
-                       shift
-                       ;;
-
-      --)              break                                   ;;
-      -*)              func_fatal_help "unrecognized option \`$opt'" ;;
-      *)               set dummy "$opt" ${1+"$@"};     shift; break  ;;
-    esac
-  done
+    $debug_cmd
 
 
-  # Validate options:
+    # Perform our own loop to consume as many options as possible in
+    # each iteration.
+    while test $# -gt 0; do
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --dry-run|--dryrun|-n)
+                        opt_dry_run=:
+                        ;;
+
+        --config)       func_config ;;
+
+        --dlopen|-dlopen)
+                        opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+                        shift
+                        ;;
+
+        --preserve-dup-deps)
+                        opt_preserve_dup_deps=: ;;
+
+        --features)     func_features ;;
+
+        --finish)       set dummy --mode finish ${1+"$@"}; shift ;;
+
+        --help)         opt_help=: ;;
+
+        --help-all)     opt_help=': help-all' ;;
+
+        --mode)         test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_mode=$1
+                        case $1 in
+                          # Valid mode arguments:
+                          clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+                          # Catch anything else as an error
+                          *) func_error "invalid argument for $_G_opt"
+                             exit_cmd=exit
+                             break
+                             ;;
+                        esac
+                        shift
+                        ;;
+
+        --no-silent|--no-quiet)
+                        opt_quiet=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                        opt_warning=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-verbose)
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --silent|--quiet)
+                        opt_quiet=:
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --tag)          test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_tag=$1
+                        func_append preserve_args " $_G_opt $1"
+                        func_enable_tag "$1"
+                        shift
+                        ;;
+
+        --verbose|-v)   opt_quiet=false
+                        opt_verbose=:
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+       # An option not handled by this hook function:
+        *)             set dummy "$_G_opt" ${1+"$@"};  shift; break  ;;
+      esac
+    done
 
 
-  # save first non-option argument
-  if test "$#" -gt 0; then
-    nonopt="$opt"
-    shift
-  fi
 
 
-  # preserve --debug
-  test "$opt_debug" = : || func_append preserve_args " --debug"
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    libtool_parse_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_parse_options libtool_parse_options
 
 
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
-      ;;
-  esac
 
 
-  $opt_help || {
-    # Sanity checks first:
-    func_check_version_match
 
 
-    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-      func_fatal_configuration "not configured to build any kind of library"
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+    # save first non-option argument
+    if test 0 -lt $#; then
+      nonopt=$1
+      shift
     fi
 
     fi
 
-    # Darwin sucks
-    eval std_shrext=\"$shrext_cmds\"
+    # preserve --debug
+    test : = "$debug_cmd" || func_append preserve_args " --debug"
 
 
-    # Only execute mode is allowed to have -dlopen flags.
-    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
-      func_error "unrecognized option \`-dlopen'"
-      $ECHO "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+    case $host in
+      # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+      # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+      *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+        # don't eliminate duplications in $postdeps and $predeps
+        opt_duplicate_compiler_generated_deps=:
+        ;;
+      *)
+        opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+        ;;
+    esac
 
 
-    # Change the help message to a mode-specific one.
-    generic_help="$help"
-    help="Try \`$progname --help --mode=$opt_mode' for more information."
-  }
+    $opt_help || {
+      # Sanity checks first:
+      func_check_version_match
+
+      test yes != "$build_libtool_libs" \
+        && test yes != "$build_old_libs" \
+        && func_fatal_configuration "not configured to build any kind of library"
+
+      # Darwin sucks
+      eval std_shrext=\"$shrext_cmds\"
+
+      # Only execute mode is allowed to have -dlopen flags.
+      if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
+        func_error "unrecognized option '-dlopen'"
+        $ECHO "$help" 1>&2
+        exit $EXIT_FAILURE
+      fi
 
 
+      # Change the help message to a mode-specific one.
+      generic_help=$help
+      help="Try '$progname --help --mode=$opt_mode' for more information."
+    }
 
 
-  # Bail if the options were screwed
-  $exit_cmd $EXIT_FAILURE
+    # Pass back the unparsed argument list
+    func_quote_for_eval ${1+"$@"}
+    libtool_validate_options_result=$func_quote_for_eval_result
 }
 }
+func_add_hook func_validate_options libtool_validate_options
 
 
 
 
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
+
 
 
 ## ----------- ##
 ##    Main.    ##
 ## ----------- ##
 
 
 
 ## ----------- ##
 ##    Main.    ##
 ## ----------- ##
 
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+  $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
 # func_lalib_p file
 # func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function is only a basic sanity check; it will hardly flush out
 # determined imposters.
 func_lalib_p ()
 {
     test -f "$1" &&
 # This function is only a basic sanity check; it will hardly flush out
 # determined imposters.
 func_lalib_p ()
 {
     test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+      $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_lalib_unsafe_p file
 }
 
 # func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function implements the same check as func_lalib_p without
 # resorting to external programs.  To this end, it redirects stdin and
 # closes it afterwards, without saving the original file descriptor.
 # As a safety measure, use it only where a negative result would be
 # This function implements the same check as func_lalib_p without
 # resorting to external programs.  To this end, it redirects stdin and
 # closes it afterwards, without saving the original file descriptor.
 # As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
+# fatal anyway.  Works if 'file' does not exist.
 func_lalib_unsafe_p ()
 {
     lalib_p=no
 func_lalib_unsafe_p ()
 {
     lalib_p=no
@@ -1249,13 +2521,13 @@ func_lalib_unsafe_p ()
        for lalib_p_l in 1 2 3 4
        do
            read lalib_p_line
        for lalib_p_l in 1 2 3 4
        do
            read lalib_p_line
-           case "$lalib_p_line" in
+           case $lalib_p_line in
                \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
            esac
        done
        exec 0<&5 5<&-
     fi
                \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
            esac
        done
        exec 0<&5 5<&-
     fi
-    test "$lalib_p" = yes
+    test yes = "$lalib_p"
 }
 
 # func_ltwrapper_script_p file
 }
 
 # func_ltwrapper_script_p file
@@ -1264,7 +2536,8 @@ func_lalib_unsafe_p ()
 # determined imposters.
 func_ltwrapper_script_p ()
 {
 # determined imposters.
 func_ltwrapper_script_p ()
 {
-    func_lalib_p "$1"
+    test -f "$1" &&
+      $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_ltwrapper_executable_p file
 }
 
 # func_ltwrapper_executable_p file
@@ -1289,7 +2562,7 @@ func_ltwrapper_scriptname ()
 {
     func_dirname_and_basename "$1" "" "."
     func_stripname '' '.exe' "$func_basename_result"
 {
     func_dirname_and_basename "$1" "" "."
     func_stripname '' '.exe' "$func_basename_result"
-    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
 }
 
 # func_ltwrapper_p file
 }
 
 # func_ltwrapper_p file
@@ -1308,11 +2581,13 @@ func_ltwrapper_p ()
 # FAIL_CMD may read-access the current command in variable CMD!
 func_execute_cmds ()
 {
 # FAIL_CMD may read-access the current command in variable CMD!
 func_execute_cmds ()
 {
-    $opt_debug
+    $debug_cmd
+
     save_ifs=$IFS; IFS='~'
     for cmd in $1; do
     save_ifs=$IFS; IFS='~'
     for cmd in $1; do
-      IFS=$save_ifs
+      IFS=$sp$nl
       eval cmd=\"$cmd\"
       eval cmd=\"$cmd\"
+      IFS=$save_ifs
       func_show_eval "$cmd" "${2-:}"
     done
     IFS=$save_ifs
       func_show_eval "$cmd" "${2-:}"
     done
     IFS=$save_ifs
@@ -1324,10 +2599,11 @@ func_execute_cmds ()
 # Note that it is not necessary on cygwin/mingw to append a dot to
 # FILE even if both FILE and FILE.exe exist: automatic-append-.exe
 # behavior happens only for exec(3), not for open(2)!  Also, sourcing
 # Note that it is not necessary on cygwin/mingw to append a dot to
 # FILE even if both FILE and FILE.exe exist: automatic-append-.exe
 # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
+# 'FILE.' does not work on cygwin managed mounts.
 func_source ()
 {
 func_source ()
 {
-    $opt_debug
+    $debug_cmd
+
     case $1 in
     */* | *\\*)        . "$1" ;;
     *)         . "./$1" ;;
     case $1 in
     */* | *\\*)        . "$1" ;;
     *)         . "./$1" ;;
@@ -1354,10 +2630,10 @@ func_resolve_sysroot ()
 # store the result into func_replace_sysroot_result.
 func_replace_sysroot ()
 {
 # store the result into func_replace_sysroot_result.
 func_replace_sysroot ()
 {
-  case "$lt_sysroot:$1" in
+  case $lt_sysroot:$1 in
   ?*:"$lt_sysroot"*)
     func_stripname "$lt_sysroot" '' "$1"
   ?*:"$lt_sysroot"*)
     func_stripname "$lt_sysroot" '' "$1"
-    func_replace_sysroot_result="=$func_stripname_result"
+    func_replace_sysroot_result='='$func_stripname_result
     ;;
   *)
     # Including no sysroot.
     ;;
   *)
     # Including no sysroot.
@@ -1374,7 +2650,8 @@ func_replace_sysroot ()
 # arg is usually of the form 'gcc ...'
 func_infer_tag ()
 {
 # arg is usually of the form 'gcc ...'
 func_infer_tag ()
 {
-    $opt_debug
+    $debug_cmd
+
     if test -n "$available_tags" && test -z "$tagname"; then
       CC_quoted=
       for arg in $CC; do
     if test -n "$available_tags" && test -z "$tagname"; then
       CC_quoted=
       for arg in $CC; do
@@ -1393,7 +2670,7 @@ func_infer_tag ()
        for z in $available_tags; do
          if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
            # Evaluate the configuration.
        for z in $available_tags; do
          if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
            # Evaluate the configuration.
-           eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+           eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
            CC_quoted=
            for arg in $CC; do
              # Double-quote args containing other shell metacharacters.
            CC_quoted=
            for arg in $CC; do
              # Double-quote args containing other shell metacharacters.
@@ -1418,7 +2695,7 @@ func_infer_tag ()
        # line option must be used.
        if test -z "$tagname"; then
          func_echo "unable to infer tagged configuration"
        # line option must be used.
        if test -z "$tagname"; then
          func_echo "unable to infer tagged configuration"
-         func_fatal_error "specify a tag with \`--tag'"
+         func_fatal_error "specify a tag with '--tag'"
 #      else
 #        func_verbose "using $tagname tagged configuration"
        fi
 #      else
 #        func_verbose "using $tagname tagged configuration"
        fi
@@ -1434,15 +2711,15 @@ func_infer_tag ()
 # but don't create it if we're doing a dry run.
 func_write_libtool_object ()
 {
 # but don't create it if we're doing a dry run.
 func_write_libtool_object ()
 {
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
+    write_libobj=$1
+    if test yes = "$build_libtool_libs"; then
+      write_lobj=\'$2\'
     else
       write_lobj=none
     fi
 
     else
       write_lobj=none
     fi
 
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
+    if test yes = "$build_old_libs"; then
+      write_oldobj=\'$3\'
     else
       write_oldobj=none
     fi
     else
       write_oldobj=none
     fi
@@ -1450,7 +2727,7 @@ func_write_libtool_object ()
     $opt_dry_run || {
       cat >${write_libobj}T <<EOF
 # $write_libobj - a libtool object file
     $opt_dry_run || {
       cat >${write_libobj}T <<EOF
 # $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
@@ -1462,7 +2739,7 @@ pic_object=$write_lobj
 non_pic_object=$write_oldobj
 
 EOF
 non_pic_object=$write_oldobj
 
 EOF
-      $MV "${write_libobj}T" "${write_libobj}"
+      $MV "${write_libobj}T" "$write_libobj"
     }
 }
 
     }
 }
 
@@ -1482,8 +2759,9 @@ EOF
 # be empty on error (or when ARG is empty)
 func_convert_core_file_wine_to_w32 ()
 {
 # be empty on error (or when ARG is empty)
 func_convert_core_file_wine_to_w32 ()
 {
-  $opt_debug
-  func_convert_core_file_wine_to_w32_result="$1"
+  $debug_cmd
+
+  func_convert_core_file_wine_to_w32_result=$1
   if test -n "$1"; then
     # Unfortunately, winepath does not exit with a non-zero error code, so we
     # are forced to check the contents of stdout. On the other hand, if the
   if test -n "$1"; then
     # Unfortunately, winepath does not exit with a non-zero error code, so we
     # are forced to check the contents of stdout. On the other hand, if the
@@ -1491,9 +2769,9 @@ func_convert_core_file_wine_to_w32 ()
     # *an error message* to stdout. So we must check for both error code of
     # zero AND non-empty stdout, which explains the odd construction:
     func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
     # *an error message* to stdout. So we must check for both error code of
     # zero AND non-empty stdout, which explains the odd construction:
     func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
-    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+    if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
       func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
       func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
-        $SED -e "$lt_sed_naive_backslashify"`
+        $SED -e "$sed_naive_backslashify"`
     else
       func_convert_core_file_wine_to_w32_result=
     fi
     else
       func_convert_core_file_wine_to_w32_result=
     fi
@@ -1514,18 +2792,19 @@ func_convert_core_file_wine_to_w32 ()
 # are convertible, then the result may be empty.
 func_convert_core_path_wine_to_w32 ()
 {
 # are convertible, then the result may be empty.
 func_convert_core_path_wine_to_w32 ()
 {
-  $opt_debug
+  $debug_cmd
+
   # unfortunately, winepath doesn't convert paths, only file names
   # unfortunately, winepath doesn't convert paths, only file names
-  func_convert_core_path_wine_to_w32_result=""
+  func_convert_core_path_wine_to_w32_result=
   if test -n "$1"; then
     oldIFS=$IFS
     IFS=:
     for func_convert_core_path_wine_to_w32_f in $1; do
       IFS=$oldIFS
       func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
   if test -n "$1"; then
     oldIFS=$IFS
     IFS=:
     for func_convert_core_path_wine_to_w32_f in $1; do
       IFS=$oldIFS
       func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
-      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+      if test -n "$func_convert_core_file_wine_to_w32_result"; then
         if test -z "$func_convert_core_path_wine_to_w32_result"; then
         if test -z "$func_convert_core_path_wine_to_w32_result"; then
-          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+          func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
         else
           func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
         fi
         else
           func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
         fi
@@ -1554,7 +2833,8 @@ func_convert_core_path_wine_to_w32 ()
 # environment variable; do not put it in $PATH.
 func_cygpath ()
 {
 # environment variable; do not put it in $PATH.
 func_cygpath ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
     func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
     if test "$?" -ne 0; then
   if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
     func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
     if test "$?" -ne 0; then
@@ -1563,7 +2843,7 @@ func_cygpath ()
     fi
   else
     func_cygpath_result=
     fi
   else
     func_cygpath_result=
-    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+    func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
   fi
 }
 #end: func_cygpath
   fi
 }
 #end: func_cygpath
@@ -1574,10 +2854,11 @@ func_cygpath ()
 # result in func_convert_core_msys_to_w32_result.
 func_convert_core_msys_to_w32 ()
 {
 # result in func_convert_core_msys_to_w32_result.
 func_convert_core_msys_to_w32 ()
 {
-  $opt_debug
+  $debug_cmd
+
   # awkward: cmd appends spaces to result
   func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
   # awkward: cmd appends spaces to result
   func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
-    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+    $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
 }
 #end: func_convert_core_msys_to_w32
 
 }
 #end: func_convert_core_msys_to_w32
 
@@ -1588,13 +2869,14 @@ func_convert_core_msys_to_w32 ()
 # func_to_host_file_result to ARG1).
 func_convert_file_check ()
 {
 # func_to_host_file_result to ARG1).
 func_convert_file_check ()
 {
-  $opt_debug
-  if test -z "$2" && test -n "$1" ; then
+  $debug_cmd
+
+  if test -z "$2" && test -n "$1"; then
     func_error "Could not determine host file name corresponding to"
     func_error "Could not determine host file name corresponding to"
-    func_error "  \`$1'"
+    func_error "  '$1'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback:
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback:
-    func_to_host_file_result="$1"
+    func_to_host_file_result=$1
   fi
 }
 # end func_convert_file_check
   fi
 }
 # end func_convert_file_check
@@ -1606,10 +2888,11 @@ func_convert_file_check ()
 # func_to_host_file_result to a simplistic fallback value (see below).
 func_convert_path_check ()
 {
 # func_to_host_file_result to a simplistic fallback value (see below).
 func_convert_path_check ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -z "$4" && test -n "$3"; then
     func_error "Could not determine the host path corresponding to"
   if test -z "$4" && test -n "$3"; then
     func_error "Could not determine the host path corresponding to"
-    func_error "  \`$3'"
+    func_error "  '$3'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback.  This is a deliberately simplistic "conversion" and
     # should not be "improved".  See libtool.info.
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback.  This is a deliberately simplistic "conversion" and
     # should not be "improved".  See libtool.info.
@@ -1618,7 +2901,7 @@ func_convert_path_check ()
       func_to_host_path_result=`echo "$3" |
         $SED -e "$lt_replace_pathsep_chars"`
     else
       func_to_host_path_result=`echo "$3" |
         $SED -e "$lt_replace_pathsep_chars"`
     else
-      func_to_host_path_result="$3"
+      func_to_host_path_result=$3
     fi
   fi
 }
     fi
   fi
 }
@@ -1630,9 +2913,10 @@ func_convert_path_check ()
 # and appending REPL if ORIG matches BACKPAT.
 func_convert_path_front_back_pathsep ()
 {
 # and appending REPL if ORIG matches BACKPAT.
 func_convert_path_front_back_pathsep ()
 {
-  $opt_debug
+  $debug_cmd
+
   case $4 in
   case $4 in
-  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+  $1 ) func_to_host_path_result=$3$func_to_host_path_result
     ;;
   esac
   case $4 in
     ;;
   esac
   case $4 in
@@ -1646,7 +2930,7 @@ func_convert_path_front_back_pathsep ()
 ##################################################
 # $build to $host FILE NAME CONVERSION FUNCTIONS #
 ##################################################
 ##################################################
 # $build to $host FILE NAME CONVERSION FUNCTIONS #
 ##################################################
-# invoked via `$to_host_file_cmd ARG'
+# invoked via '$to_host_file_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # Result will be available in $func_to_host_file_result.
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # Result will be available in $func_to_host_file_result.
@@ -1657,7 +2941,8 @@ func_convert_path_front_back_pathsep ()
 # in func_to_host_file_result.
 func_to_host_file ()
 {
 # in func_to_host_file_result.
 func_to_host_file ()
 {
-  $opt_debug
+  $debug_cmd
+
   $to_host_file_cmd "$1"
 }
 # end func_to_host_file
   $to_host_file_cmd "$1"
 }
 # end func_to_host_file
@@ -1669,7 +2954,8 @@ func_to_host_file ()
 # in (the comma separated) LAZY, no conversion takes place.
 func_to_tool_file ()
 {
 # in (the comma separated) LAZY, no conversion takes place.
 func_to_tool_file ()
 {
-  $opt_debug
+  $debug_cmd
+
   case ,$2, in
     *,"$to_tool_file_cmd",*)
       func_to_tool_file_result=$1
   case ,$2, in
     *,"$to_tool_file_cmd",*)
       func_to_tool_file_result=$1
@@ -1687,7 +2973,7 @@ func_to_tool_file ()
 # Copy ARG to func_to_host_file_result.
 func_convert_file_noop ()
 {
 # Copy ARG to func_to_host_file_result.
 func_convert_file_noop ()
 {
-  func_to_host_file_result="$1"
+  func_to_host_file_result=$1
 }
 # end func_convert_file_noop
 
 }
 # end func_convert_file_noop
 
@@ -1698,11 +2984,12 @@ func_convert_file_noop ()
 # func_to_host_file_result.
 func_convert_file_msys_to_w32 ()
 {
 # func_to_host_file_result.
 func_convert_file_msys_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result=$func_convert_core_msys_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1714,8 +3001,9 @@ func_convert_file_msys_to_w32 ()
 # func_to_host_file_result.
 func_convert_file_cygwin_to_w32 ()
 {
 # func_to_host_file_result.
 func_convert_file_cygwin_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
     # LT_CYGPATH in this case.
   if test -n "$1"; then
     # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
     # LT_CYGPATH in this case.
@@ -1731,11 +3019,12 @@ func_convert_file_cygwin_to_w32 ()
 # and a working winepath. Returns result in func_to_host_file_result.
 func_convert_file_nix_to_w32 ()
 {
 # and a working winepath. Returns result in func_to_host_file_result.
 func_convert_file_nix_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_file_wine_to_w32 "$1"
   if test -n "$1"; then
     func_convert_core_file_wine_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1747,12 +3036,13 @@ func_convert_file_nix_to_w32 ()
 # Returns result in func_to_host_file_result.
 func_convert_file_msys_to_cygwin ()
 {
 # Returns result in func_to_host_file_result.
 func_convert_file_msys_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
     func_cygpath -u "$func_convert_core_msys_to_w32_result"
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
     func_cygpath -u "$func_convert_core_msys_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
+    func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1765,13 +3055,14 @@ func_convert_file_msys_to_cygwin ()
 # in func_to_host_file_result.
 func_convert_file_nix_to_cygwin ()
 {
 # in func_to_host_file_result.
 func_convert_file_nix_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
     func_convert_core_file_wine_to_w32 "$1"
     func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
   if test -n "$1"; then
     # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
     func_convert_core_file_wine_to_w32 "$1"
     func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
+    func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1781,7 +3072,7 @@ func_convert_file_nix_to_cygwin ()
 #############################################
 # $build to $host PATH CONVERSION FUNCTIONS #
 #############################################
 #############################################
 # $build to $host PATH CONVERSION FUNCTIONS #
 #############################################
-# invoked via `$to_host_path_cmd ARG'
+# invoked via '$to_host_path_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # The result will be available in $func_to_host_path_result.
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # The result will be available in $func_to_host_path_result.
@@ -1805,10 +3096,11 @@ func_convert_file_nix_to_cygwin ()
 to_host_path_cmd=
 func_init_to_host_path_cmd ()
 {
 to_host_path_cmd=
 func_init_to_host_path_cmd ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -z "$to_host_path_cmd"; then
     func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
   if test -z "$to_host_path_cmd"; then
     func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
-    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+    to_host_path_cmd=func_convert_path_$func_stripname_result
   fi
 }
 
   fi
 }
 
@@ -1818,7 +3110,8 @@ func_init_to_host_path_cmd ()
 # in func_to_host_path_result.
 func_to_host_path ()
 {
 # in func_to_host_path_result.
 func_to_host_path ()
 {
-  $opt_debug
+  $debug_cmd
+
   func_init_to_host_path_cmd
   $to_host_path_cmd "$1"
 }
   func_init_to_host_path_cmd
   $to_host_path_cmd "$1"
 }
@@ -1829,7 +3122,7 @@ func_to_host_path ()
 # Copy ARG to func_to_host_path_result.
 func_convert_path_noop ()
 {
 # Copy ARG to func_to_host_path_result.
 func_convert_path_noop ()
 {
-  func_to_host_path_result="$1"
+  func_to_host_path_result=$1
 }
 # end func_convert_path_noop
 
 }
 # end func_convert_path_noop
 
@@ -1840,8 +3133,9 @@ func_convert_path_noop ()
 # func_to_host_path_result.
 func_convert_path_msys_to_w32 ()
 {
 # func_to_host_path_result.
 func_convert_path_msys_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from ARG.  MSYS
     # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from ARG.  MSYS
     # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
@@ -1849,7 +3143,7 @@ func_convert_path_msys_to_w32 ()
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result=$func_convert_core_msys_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1863,8 +3157,9 @@ func_convert_path_msys_to_w32 ()
 # func_to_host_file_result.
 func_convert_path_cygwin_to_w32 ()
 {
 # func_to_host_file_result.
 func_convert_path_cygwin_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
@@ -1883,14 +3178,15 @@ func_convert_path_cygwin_to_w32 ()
 # a working winepath.  Returns result in func_to_host_file_result.
 func_convert_path_nix_to_w32 ()
 {
 # a working winepath.  Returns result in func_to_host_file_result.
 func_convert_path_nix_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1904,15 +3200,16 @@ func_convert_path_nix_to_w32 ()
 # Returns result in func_to_host_file_result.
 func_convert_path_msys_to_cygwin ()
 {
 # Returns result in func_to_host_file_result.
 func_convert_path_msys_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
+    func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1927,8 +3224,9 @@ func_convert_path_msys_to_cygwin ()
 # func_to_host_file_result.
 func_convert_path_nix_to_cygwin ()
 {
 # func_to_host_file_result.
 func_convert_path_nix_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from
     # ARG. msys behavior is inconsistent here, cygpath turns them
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from
     # ARG. msys behavior is inconsistent here, cygpath turns them
@@ -1937,7 +3235,7 @@ func_convert_path_nix_to_cygwin ()
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
+    func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1946,13 +3244,31 @@ func_convert_path_nix_to_cygwin ()
 # end func_convert_path_nix_to_cygwin
 
 
 # end func_convert_path_nix_to_cygwin
 
 
+# func_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+  $debug_cmd
+
+  func_dll_def_p_tmp=`$SED -n \
+    -e 's/^[    ]*//' \
+    -e '/^\(;.*\)*$/d' \
+    -e 's/^\(EXPORTS\|LIBRARY\)\([      ].*\)*$/DEF/p' \
+    -e q \
+    "$1"`
+  test DEF = "$func_dll_def_p_tmp"
+}
+
+
 # func_mode_compile arg...
 func_mode_compile ()
 {
 # func_mode_compile arg...
 func_mode_compile ()
 {
-    $opt_debug
+    $debug_cmd
+
     # Get the compilation command and the source file.
     base_compile=
     # Get the compilation command and the source file.
     base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    srcfile=$nonopt  #  always keep a non-empty value in "srcfile"
     suppress_opt=yes
     suppress_output=
     arg_mode=normal
     suppress_opt=yes
     suppress_output=
     arg_mode=normal
@@ -1965,12 +3281,12 @@ func_mode_compile ()
       case $arg_mode in
       arg  )
        # do not "continue".  Instead, add this to base_compile
       case $arg_mode in
       arg  )
        # do not "continue".  Instead, add this to base_compile
-       lastarg="$arg"
+       lastarg=$arg
        arg_mode=normal
        ;;
 
       target )
        arg_mode=normal
        ;;
 
       target )
-       libobj="$arg"
+       libobj=$arg
        arg_mode=normal
        continue
        ;;
        arg_mode=normal
        continue
        ;;
@@ -1980,7 +3296,7 @@ func_mode_compile ()
        case $arg in
        -o)
          test -n "$libobj" && \
        case $arg in
        -o)
          test -n "$libobj" && \
-           func_fatal_error "you cannot specify \`-o' more than once"
+           func_fatal_error "you cannot specify '-o' more than once"
          arg_mode=target
          continue
          ;;
          arg_mode=target
          continue
          ;;
@@ -2009,12 +3325,12 @@ func_mode_compile ()
          func_stripname '-Wc,' '' "$arg"
          args=$func_stripname_result
          lastarg=
          func_stripname '-Wc,' '' "$arg"
          args=$func_stripname_result
          lastarg=
-         save_ifs="$IFS"; IFS=','
+         save_ifs=$IFS; IFS=,
          for arg in $args; do
          for arg in $args; do
-           IFS="$save_ifs"
+           IFS=$save_ifs
            func_append_quoted lastarg "$arg"
          done
            func_append_quoted lastarg "$arg"
          done
-         IFS="$save_ifs"
+         IFS=$save_ifs
          func_stripname ' ' '' "$lastarg"
          lastarg=$func_stripname_result
 
          func_stripname ' ' '' "$lastarg"
          lastarg=$func_stripname_result
 
@@ -2027,8 +3343,8 @@ func_mode_compile ()
          # Accept the current argument as the source file.
          # The previous "srcfile" becomes the current argument.
          #
          # Accept the current argument as the source file.
          # The previous "srcfile" becomes the current argument.
          #
-         lastarg="$srcfile"
-         srcfile="$arg"
+         lastarg=$srcfile
+         srcfile=$arg
          ;;
        esac  #  case $arg
        ;;
          ;;
        esac  #  case $arg
        ;;
@@ -2043,13 +3359,13 @@ func_mode_compile ()
       func_fatal_error "you must specify an argument for -Xcompile"
       ;;
     target)
       func_fatal_error "you must specify an argument for -Xcompile"
       ;;
     target)
-      func_fatal_error "you must specify a target with \`-o'"
+      func_fatal_error "you must specify a target with '-o'"
       ;;
     *)
       # Get the name of the library object.
       test -z "$libobj" && {
        func_basename "$srcfile"
       ;;
     *)
       # Get the name of the library object.
       test -z "$libobj" && {
        func_basename "$srcfile"
-       libobj="$func_basename_result"
+       libobj=$func_basename_result
       }
       ;;
     esac
       }
       ;;
     esac
@@ -2069,7 +3385,7 @@ func_mode_compile ()
     case $libobj in
     *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
     *)
     case $libobj in
     *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
     *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      func_fatal_error "cannot determine name of library object from '$libobj'"
       ;;
     esac
 
       ;;
     esac
 
@@ -2078,8 +3394,8 @@ func_mode_compile ()
     for arg in $later; do
       case $arg in
       -shared)
     for arg in $later; do
       case $arg in
       -shared)
-       test "$build_libtool_libs" != yes && \
-         func_fatal_configuration "can not build a shared library"
+       test yes = "$build_libtool_libs" \
+         || func_fatal_configuration "cannot build a shared library"
        build_old_libs=no
        continue
        ;;
        build_old_libs=no
        continue
        ;;
@@ -2105,17 +3421,17 @@ func_mode_compile ()
     func_quote_for_eval "$libobj"
     test "X$libobj" != "X$func_quote_for_eval_result" \
       && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'   &()|`$[]' \
     func_quote_for_eval "$libobj"
     test "X$libobj" != "X$func_quote_for_eval_result" \
       && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'   &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+      && func_warning "libobj name '$libobj' may not contain shell special characters."
     func_dirname_and_basename "$obj" "/" ""
     func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
+    objname=$func_basename_result
+    xdir=$func_dirname_result
+    lobj=$xdir$objdir/$objname
 
     test -z "$base_compile" && \
       func_fatal_help "you must specify a compilation command"
 
     # Delete any leftover library objects.
 
     test -z "$base_compile" && \
       func_fatal_help "you must specify a compilation command"
 
     # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
+    if test yes = "$build_old_libs"; then
       removelist="$obj $lobj $libobj ${libobj}T"
     else
       removelist="$lobj $libobj ${libobj}T"
       removelist="$obj $lobj $libobj ${libobj}T"
     else
       removelist="$lobj $libobj ${libobj}T"
@@ -2127,16 +3443,16 @@ func_mode_compile ()
       pic_mode=default
       ;;
     esac
       pic_mode=default
       ;;
     esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+    if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
       # non-PIC code in shared libraries is not supported
       pic_mode=default
     fi
 
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
       # non-PIC code in shared libraries is not supported
       pic_mode=default
     fi
 
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
+    if test no = "$compiler_c_o"; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
+      lockfile=$output_obj.lock
     else
       output_obj=
       need_locks=no
     else
       output_obj=
       need_locks=no
@@ -2145,12 +3461,12 @@ func_mode_compile ()
 
     # Lock this critical section if it is needed
     # We use this script file to make the link, it avoids creating a new file
 
     # Lock this critical section if it is needed
     # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
+    if test yes = "$need_locks"; then
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
        func_echo "Waiting for $lockfile to be removed"
        sleep 2
       done
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
        func_echo "Waiting for $lockfile to be removed"
        sleep 2
       done
-    elif test "$need_locks" = warn; then
+    elif test warn = "$need_locks"; then
       if test -f "$lockfile"; then
        $ECHO "\
 *** ERROR, $lockfile exists and contains:
       if test -f "$lockfile"; then
        $ECHO "\
 *** ERROR, $lockfile exists and contains:
@@ -2158,7 +3474,7 @@ func_mode_compile ()
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2180,11 +3496,11 @@ compiler."
     qsrcfile=$func_quote_for_eval_result
 
     # Only build a PIC object if we are building libtool libraries.
     qsrcfile=$func_quote_for_eval_result
 
     # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
+    if test yes = "$build_libtool_libs"; then
       # Without this assignment, base_compile gets emptied.
       fbsd_hideous_sh_bug=$base_compile
 
       # Without this assignment, base_compile gets emptied.
       fbsd_hideous_sh_bug=$base_compile
 
-      if test "$pic_mode" != no; then
+      if test no != "$pic_mode"; then
        command="$base_compile $qsrcfile $pic_flag"
       else
        # Don't build PIC code
        command="$base_compile $qsrcfile $pic_flag"
       else
        # Don't build PIC code
@@ -2201,7 +3517,7 @@ compiler."
       func_show_eval_locale "$command" \
           'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
 
       func_show_eval_locale "$command" \
           'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
 
-      if test "$need_locks" = warn &&
+      if test warn = "$need_locks" &&
         test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
        $ECHO "\
 *** ERROR, $lockfile contains:
         test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
        $ECHO "\
 *** ERROR, $lockfile contains:
@@ -2212,7 +3528,7 @@ $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2228,20 +3544,20 @@ compiler."
       fi
 
       # Allow error messages only from the first compilation.
       fi
 
       # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
+      if test yes = "$suppress_opt"; then
        suppress_output=' >/dev/null 2>&1'
       fi
     fi
 
     # Only build a position-dependent object if we build old libraries.
        suppress_output=' >/dev/null 2>&1'
       fi
     fi
 
     # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
+    if test yes = "$build_old_libs"; then
+      if test yes != "$pic_mode"; then
        # Don't build PIC code
        command="$base_compile $qsrcfile$pie_flag"
       else
        command="$base_compile $qsrcfile $pic_flag"
       fi
        # Don't build PIC code
        command="$base_compile $qsrcfile$pie_flag"
       else
        command="$base_compile $qsrcfile $pic_flag"
       fi
-      if test "$compiler_c_o" = yes; then
+      if test yes = "$compiler_c_o"; then
        func_append command " -o $obj"
       fi
 
        func_append command " -o $obj"
       fi
 
@@ -2250,7 +3566,7 @@ compiler."
       func_show_eval_locale "$command" \
         '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
 
       func_show_eval_locale "$command" \
         '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
 
-      if test "$need_locks" = warn &&
+      if test warn = "$need_locks" &&
         test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
        $ECHO "\
 *** ERROR, $lockfile contains:
         test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
        $ECHO "\
 *** ERROR, $lockfile contains:
@@ -2261,7 +3577,7 @@ $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2281,7 +3597,7 @@ compiler."
       func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
 
       # Unlock the critical section if it was locked
       func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
 
       # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
+      if test no != "$need_locks"; then
        removelist=$lockfile
         $RM "$lockfile"
       fi
        removelist=$lockfile
         $RM "$lockfile"
       fi
@@ -2291,7 +3607,7 @@ compiler."
 }
 
 $opt_help || {
 }
 
 $opt_help || {
-  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+  test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
 }
 
 func_mode_help ()
 }
 
 func_mode_help ()
@@ -2311,7 +3627,7 @@ func_mode_help ()
 Remove files from the build directory.
 
 RM is the name of the program to use to delete files associated with each FILE
 Remove files from the build directory.
 
 RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, object or program, all the files associated
 to RM.
 
 If FILE is a libtool library, object or program, all the files associated
@@ -2330,16 +3646,16 @@ This mode accepts the following additional options:
   -no-suppress      do not suppress compiler output for multiple passes
   -prefer-pic       try to build PIC objects only
   -prefer-non-pic   try to build non-PIC objects only
   -no-suppress      do not suppress compiler output for multiple passes
   -prefer-pic       try to build PIC objects only
   -prefer-non-pic   try to build non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
+  -shared           do not build a '.o' file suitable for static linking
+  -static           only build a '.o' file suitable for static linking
   -Wc,FLAG          pass FLAG directly to the compiler
 
   -Wc,FLAG          pass FLAG directly to the compiler
 
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+COMPILE-COMMAND is a command to be used in creating a 'standard' object file
 from the given SOURCEFILE.
 
 The output file name is determined by removing the directory component from
 from the given SOURCEFILE.
 
 The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
+SOURCEFILE, then substituting the C source code suffix '.c' with the
+library object suffix, '.lo'."
         ;;
 
       execute)
         ;;
 
       execute)
@@ -2352,7 +3668,7 @@ This mode accepts the following additional options:
 
   -dlopen FILE      add the directory containing FILE to the library path
 
 
   -dlopen FILE      add the directory containing FILE to the library path
 
-This mode sets the library path environment variable according to \`-dlopen'
+This mode sets the library path environment variable according to '-dlopen'
 flags.
 
 If any of the ARGS are libtool executable wrappers, then they are translated
 flags.
 
 If any of the ARGS are libtool executable wrappers, then they are translated
@@ -2371,7 +3687,7 @@ Complete the installation of libtool libraries.
 Each LIBDIR is a directory that contains libtool libraries.
 
 The commands that this mode executes may require superuser privileges.  Use
 Each LIBDIR is a directory that contains libtool libraries.
 
 The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
+the '--dry-run' option if you just want to see what would be executed."
         ;;
 
       install)
         ;;
 
       install)
@@ -2381,7 +3697,7 @@ the \`--dry-run' option if you just want to see what would be executed."
 Install executables or libraries.
 
 INSTALL-COMMAND is the installation command.  The first component should be
 Install executables or libraries.
 
 INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
+either the 'install' or 'cp' program.
 
 The following components of INSTALL-COMMAND are treated specially:
 
 
 The following components of INSTALL-COMMAND are treated specially:
 
@@ -2407,7 +3723,7 @@ The following components of LINK-COMMAND are treated specially:
   -avoid-version    do not add a version suffix if possible
   -bindir BINDIR    specify path to binaries directory (for systems where
                     libraries must be found in the PATH setting at runtime)
   -avoid-version    do not add a version suffix if possible
   -bindir BINDIR    specify path to binaries directory (for systems where
                     libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime
   -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
   -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
   -export-symbols SYMFILE
   -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
   -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
   -export-symbols SYMFILE
@@ -2421,7 +3737,8 @@ The following components of LINK-COMMAND are treated specially:
   -no-install       link a not-installable executable
   -no-undefined     declare that a library does not refer to external symbols
   -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
   -no-install       link a not-installable executable
   -no-undefined     declare that a library does not refer to external symbols
   -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -objectlist FILE  use a list of object files found in FILE to specify objects
+  -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)
   -precious-files-regex REGEX
                     don't remove output files matching REGEX
   -release RELEASE  specify package release information
   -precious-files-regex REGEX
                     don't remove output files matching REGEX
   -release RELEASE  specify package release information
@@ -2441,20 +3758,20 @@ The following components of LINK-COMMAND are treated specially:
   -Xlinker FLAG     pass linker-specific FLAG directly to the linker
   -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
 
   -Xlinker FLAG     pass linker-specific FLAG directly to the linker
   -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
 
-All other options (arguments beginning with \`-') are ignored.
+All other options (arguments beginning with '-') are ignored.
 
 
-Every other argument is treated as a filename.  Files ending in \`.la' are
+Every other argument is treated as a filename.  Files ending in '.la' are
 treated as uninstalled libtool libraries, other files are standard or library
 object files.
 
 treated as uninstalled libtool libraries, other files are standard or library
 object files.
 
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
+If the OUTPUT-FILE ends in '.la', then a libtool library is created,
+only library objects ('.lo' files) may be specified, and '-rpath' is
 required, except when creating a convenience library.
 
 required, except when creating a convenience library.
 
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
+If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
+using 'ar' and 'ranlib', or on Windows using 'lib'.
 
 
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
 is created, otherwise an executable program is created."
         ;;
 
 is created, otherwise an executable program is created."
         ;;
 
@@ -2465,7 +3782,7 @@ is created, otherwise an executable program is created."
 Remove libraries from an installation directory.
 
 RM is the name of the program to use to delete files associated with each FILE
 Remove libraries from an installation directory.
 
 RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, all the files associated with it are deleted.
 to RM.
 
 If FILE is a libtool library, all the files associated with it are deleted.
@@ -2473,17 +3790,17 @@ Otherwise, only FILE itself is deleted using RM."
         ;;
 
       *)
         ;;
 
       *)
-        func_fatal_help "invalid operation mode \`$opt_mode'"
+        func_fatal_help "invalid operation mode '$opt_mode'"
         ;;
     esac
 
     echo
         ;;
     esac
 
     echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
+    $ECHO "Try '$progname --help' for more information about other modes."
 }
 
 # Now that we've collected a possible --mode arg, show help if necessary
 if $opt_help; then
 }
 
 # Now that we've collected a possible --mode arg, show help if necessary
 if $opt_help; then
-  if test "$opt_help" = :; then
+  if test : = "$opt_help"; then
     func_mode_help
   else
     {
     func_mode_help
   else
     {
@@ -2491,7 +3808,7 @@ if $opt_help; then
       for opt_mode in compile link execute install finish uninstall clean; do
        func_mode_help
       done
       for opt_mode in compile link execute install finish uninstall clean; do
        func_mode_help
       done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    } | $SED -n '1p; 2,$s/^Usage:/  or: /p'
     {
       func_help noexit
       for opt_mode in compile link execute install finish uninstall clean; do
     {
       func_help noexit
       for opt_mode in compile link execute install finish uninstall clean; do
@@ -2499,7 +3816,7 @@ if $opt_help; then
        func_mode_help
       done
     } |
        func_mode_help
       done
     } |
-    sed '1d
+    $SED '1d
       /^When reporting/,/^Report/{
        H
        d
       /^When reporting/,/^Report/{
        H
        d
@@ -2516,16 +3833,17 @@ fi
 # func_mode_execute arg...
 func_mode_execute ()
 {
 # func_mode_execute arg...
 func_mode_execute ()
 {
-    $opt_debug
+    $debug_cmd
+
     # The first argument is the command name.
     # The first argument is the command name.
-    cmd="$nonopt"
+    cmd=$nonopt
     test -z "$cmd" && \
       func_fatal_help "you must specify a COMMAND"
 
     # Handle -dlopen flags immediately.
     for file in $opt_dlopen; do
       test -f "$file" \
     test -z "$cmd" && \
       func_fatal_help "you must specify a COMMAND"
 
     # Handle -dlopen flags immediately.
     for file in $opt_dlopen; do
       test -f "$file" \
-       || func_fatal_help "\`$file' is not a file"
+       || func_fatal_help "'$file' is not a file"
 
       dir=
       case $file in
 
       dir=
       case $file in
@@ -2535,7 +3853,7 @@ func_mode_execute ()
 
        # Check to see that this really is a libtool archive.
        func_lalib_unsafe_p "$file" \
 
        # Check to see that this really is a libtool archive.
        func_lalib_unsafe_p "$file" \
-         || func_fatal_help "\`$lib' is not a valid libtool archive"
+         || func_fatal_help "'$lib' is not a valid libtool archive"
 
        # Read the libtool library.
        dlname=
 
        # Read the libtool library.
        dlname=
@@ -2546,18 +3864,18 @@ func_mode_execute ()
        if test -z "$dlname"; then
          # Warn if it was a shared library.
          test -n "$library_names" && \
        if test -z "$dlname"; then
          # Warn if it was a shared library.
          test -n "$library_names" && \
-           func_warning "\`$file' was not linked with \`-export-dynamic'"
+           func_warning "'$file' was not linked with '-export-dynamic'"
          continue
        fi
 
        func_dirname "$file" "" "."
          continue
        fi
 
        func_dirname "$file" "" "."
-       dir="$func_dirname_result"
+       dir=$func_dirname_result
 
        if test -f "$dir/$objdir/$dlname"; then
          func_append dir "/$objdir"
        else
          if test ! -f "$dir/$dlname"; then
 
        if test -f "$dir/$objdir/$dlname"; then
          func_append dir "/$objdir"
        else
          if test ! -f "$dir/$dlname"; then
-           func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+           func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
          fi
        fi
        ;;
          fi
        fi
        ;;
@@ -2565,18 +3883,18 @@ func_mode_execute ()
       *.lo)
        # Just add the directory containing the .lo file.
        func_dirname "$file" "" "."
       *.lo)
        # Just add the directory containing the .lo file.
        func_dirname "$file" "" "."
-       dir="$func_dirname_result"
+       dir=$func_dirname_result
        ;;
 
       *)
        ;;
 
       *)
-       func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+       func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
        continue
        ;;
       esac
 
       # Get the absolute pathname.
       absdir=`cd "$dir" && pwd`
        continue
        ;;
       esac
 
       # Get the absolute pathname.
       absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
+      test -n "$absdir" && dir=$absdir
 
       # Now add the directory to shlibpath_var.
       if eval "test -z \"\$$shlibpath_var\""; then
 
       # Now add the directory to shlibpath_var.
       if eval "test -z \"\$$shlibpath_var\""; then
@@ -2588,7 +3906,7 @@ func_mode_execute ()
 
     # This variable tells wrapper scripts just to set shlibpath_var
     # rather than running their programs.
 
     # This variable tells wrapper scripts just to set shlibpath_var
     # rather than running their programs.
-    libtool_execute_magic="$magic"
+    libtool_execute_magic=$magic
 
     # Check if any of the arguments is a wrapper script.
     args=
 
     # Check if any of the arguments is a wrapper script.
     args=
@@ -2601,12 +3919,12 @@ func_mode_execute ()
        if func_ltwrapper_script_p "$file"; then
          func_source "$file"
          # Transform arg to wrapped name.
        if func_ltwrapper_script_p "$file"; then
          func_source "$file"
          # Transform arg to wrapped name.
-         file="$progdir/$program"
+         file=$progdir/$program
        elif func_ltwrapper_executable_p "$file"; then
          func_ltwrapper_scriptname "$file"
          func_source "$func_ltwrapper_scriptname_result"
          # Transform arg to wrapped name.
        elif func_ltwrapper_executable_p "$file"; then
          func_ltwrapper_scriptname "$file"
          func_source "$func_ltwrapper_scriptname_result"
          # Transform arg to wrapped name.
-         file="$progdir/$program"
+         file=$progdir/$program
        fi
        ;;
       esac
        fi
        ;;
       esac
@@ -2614,7 +3932,15 @@ func_mode_execute ()
       func_append_quoted args "$file"
     done
 
       func_append_quoted args "$file"
     done
 
-    if test "X$opt_dry_run" = Xfalse; then
+    if $opt_dry_run; then
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+       eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+       echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    else
       if test -n "$shlibpath_var"; then
        # Export the shlibpath_var.
        eval "export $shlibpath_var"
       if test -n "$shlibpath_var"; then
        # Export the shlibpath_var.
        eval "export $shlibpath_var"
@@ -2631,25 +3957,18 @@ func_mode_execute ()
       done
 
       # Now prepare to actually exec the command.
       done
 
       # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-       eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-       echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
+      exec_cmd=\$cmd$args
     fi
 }
 
     fi
 }
 
-test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
 
 
 # func_mode_finish arg...
 func_mode_finish ()
 {
 
 
 # func_mode_finish arg...
 func_mode_finish ()
 {
-    $opt_debug
+    $debug_cmd
+
     libs=
     libdirs=
     admincmds=
     libs=
     libdirs=
     admincmds=
@@ -2663,11 +3982,11 @@ func_mode_finish ()
        if func_lalib_unsafe_p "$opt"; then
          func_append libs " $opt"
        else
        if func_lalib_unsafe_p "$opt"; then
          func_append libs " $opt"
        else
-         func_warning "\`$opt' is not a valid libtool archive"
+         func_warning "'$opt' is not a valid libtool archive"
        fi
 
       else
        fi
 
       else
-       func_fatal_error "invalid argument \`$opt'"
+       func_fatal_error "invalid argument '$opt'"
       fi
     done
 
       fi
     done
 
@@ -2682,12 +4001,12 @@ func_mode_finish ()
       # Remove sysroot references
       if $opt_dry_run; then
         for lib in $libs; do
       # Remove sysroot references
       if $opt_dry_run; then
         for lib in $libs; do
-          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+          echo "removing references to $lt_sysroot and '=' prefixes from $lib"
         done
       else
         tmpdir=`func_mktempdir`
         for lib in $libs; do
         done
       else
         tmpdir=`func_mktempdir`
         for lib in $libs; do
-         sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+         $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
            > $tmpdir/tmp-la
          mv -f $tmpdir/tmp-la $lib
        done
            > $tmpdir/tmp-la
          mv -f $tmpdir/tmp-la $lib
        done
@@ -2712,7 +4031,7 @@ func_mode_finish ()
     fi
 
     # Exit here if they wanted silent mode.
     fi
 
     # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
+    $opt_quiet && exit $EXIT_SUCCESS
 
     if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
       echo "----------------------------------------------------------------------"
 
     if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
       echo "----------------------------------------------------------------------"
@@ -2723,27 +4042,27 @@ func_mode_finish ()
       echo
       echo "If you ever happen to want to link against installed libraries"
       echo "in a given directory, LIBDIR, you must either use libtool, and"
       echo
       echo "If you ever happen to want to link against installed libraries"
       echo "in a given directory, LIBDIR, you must either use libtool, and"
-      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "specify the full pathname of the library, or use the '-LLIBDIR'"
       echo "flag during linking and do at least one of the following:"
       if test -n "$shlibpath_var"; then
       echo "flag during linking and do at least one of the following:"
       if test -n "$shlibpath_var"; then
-       echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+       echo "   - add LIBDIR to the '$shlibpath_var' environment variable"
        echo "     during execution"
       fi
       if test -n "$runpath_var"; then
        echo "     during execution"
       fi
       if test -n "$runpath_var"; then
-       echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+       echo "   - add LIBDIR to the '$runpath_var' environment variable"
        echo "     during linking"
       fi
       if test -n "$hardcode_libdir_flag_spec"; then
        libdir=LIBDIR
        eval flag=\"$hardcode_libdir_flag_spec\"
 
        echo "     during linking"
       fi
       if test -n "$hardcode_libdir_flag_spec"; then
        libdir=LIBDIR
        eval flag=\"$hardcode_libdir_flag_spec\"
 
-       $ECHO "   - use the \`$flag' linker flag"
+       $ECHO "   - use the '$flag' linker flag"
       fi
       if test -n "$admincmds"; then
        $ECHO "   - have your system administrator run these commands:$admincmds"
       fi
       if test -f /etc/ld.so.conf; then
       fi
       if test -n "$admincmds"; then
        $ECHO "   - have your system administrator run these commands:$admincmds"
       fi
       if test -f /etc/ld.so.conf; then
-       echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+       echo "   - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
       fi
       echo
 
       fi
       echo
 
@@ -2762,18 +4081,20 @@ func_mode_finish ()
     exit $EXIT_SUCCESS
 }
 
     exit $EXIT_SUCCESS
 }
 
-test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
 
 
 # func_mode_install arg...
 func_mode_install ()
 {
 
 
 # func_mode_install arg...
 func_mode_install ()
 {
-    $opt_debug
+    $debug_cmd
+
     # There may be an optional sh(1) argument at the beginning of
     # install_prog (especially on Windows NT).
     # There may be an optional sh(1) argument at the beginning of
     # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+    if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
        # Allow the use of GNU shtool's install command.
        # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
+       case $nonopt in *shtool*) :;; *) false;; esac
+    then
       # Aesthetically quote it.
       func_quote_for_eval "$nonopt"
       install_prog="$func_quote_for_eval_result "
       # Aesthetically quote it.
       func_quote_for_eval "$nonopt"
       install_prog="$func_quote_for_eval_result "
@@ -2800,7 +4121,7 @@ func_mode_install ()
     opts=
     prev=
     install_type=
     opts=
     prev=
     install_type=
-    isdir=no
+    isdir=false
     stripme=
     no_mode=:
     for arg
     stripme=
     no_mode=:
     for arg
@@ -2813,7 +4134,7 @@ func_mode_install ()
       fi
 
       case $arg in
       fi
 
       case $arg in
-      -d) isdir=yes ;;
+      -d) isdir=: ;;
       -f)
        if $install_cp; then :; else
          prev=$arg
       -f)
        if $install_cp; then :; else
          prev=$arg
@@ -2831,7 +4152,7 @@ func_mode_install ()
       *)
        # If the previous option needed an argument, then skip it.
        if test -n "$prev"; then
       *)
        # If the previous option needed an argument, then skip it.
        if test -n "$prev"; then
-         if test "x$prev" = x-m && test -n "$install_override_mode"; then
+         if test X-m = "X$prev" && test -n "$install_override_mode"; then
            arg2=$install_override_mode
            no_mode=false
          fi
            arg2=$install_override_mode
            no_mode=false
          fi
@@ -2856,7 +4177,7 @@ func_mode_install ()
       func_fatal_help "you must specify an install program"
 
     test -n "$prev" && \
       func_fatal_help "you must specify an install program"
 
     test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
+      func_fatal_help "the '$prev' option requires an argument"
 
     if test -n "$install_override_mode" && $no_mode; then
       if $install_cp; then :; else
 
     if test -n "$install_override_mode" && $no_mode; then
       if $install_cp; then :; else
@@ -2878,19 +4199,19 @@ func_mode_install ()
     dest=$func_stripname_result
 
     # Check to see that the destination is a directory.
     dest=$func_stripname_result
 
     # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
+    test -d "$dest" && isdir=:
+    if $isdir; then
+      destdir=$dest
       destname=
     else
       func_dirname_and_basename "$dest" "" "."
       destname=
     else
       func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
+      destdir=$func_dirname_result
+      destname=$func_basename_result
 
       # Not a directory, so check to see that there is only one file specified.
       set dummy $files; shift
       test "$#" -gt 1 && \
 
       # Not a directory, so check to see that there is only one file specified.
       set dummy $files; shift
       test "$#" -gt 1 && \
-       func_fatal_help "\`$dest' is not a directory"
+       func_fatal_help "'$dest' is not a directory"
     fi
     case $destdir in
     [\\/]* | [A-Za-z]:[\\/]*) ;;
     fi
     case $destdir in
     [\\/]* | [A-Za-z]:[\\/]*) ;;
@@ -2899,7 +4220,7 @@ func_mode_install ()
        case $file in
        *.lo) ;;
        *)
        case $file in
        *.lo) ;;
        *)
-         func_fatal_help "\`$destdir' must be an absolute directory name"
+         func_fatal_help "'$destdir' must be an absolute directory name"
          ;;
        esac
       done
          ;;
        esac
       done
@@ -2908,7 +4229,7 @@ func_mode_install ()
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
-    libtool_install_magic="$magic"
+    libtool_install_magic=$magic
 
     staticlibs=
     future_libdirs=
 
     staticlibs=
     future_libdirs=
@@ -2928,7 +4249,7 @@ func_mode_install ()
 
        # Check to see that this really is a libtool archive.
        func_lalib_unsafe_p "$file" \
 
        # Check to see that this really is a libtool archive.
        func_lalib_unsafe_p "$file" \
-         || func_fatal_help "\`$file' is not a valid libtool archive"
+         || func_fatal_help "'$file' is not a valid libtool archive"
 
        library_names=
        old_library=
 
        library_names=
        old_library=
@@ -2950,7 +4271,7 @@ func_mode_install ()
        fi
 
        func_dirname "$file" "/" ""
        fi
 
        func_dirname "$file" "/" ""
-       dir="$func_dirname_result"
+       dir=$func_dirname_result
        func_append dir "$objdir"
 
        if test -n "$relink_command"; then
        func_append dir "$objdir"
 
        if test -n "$relink_command"; then
@@ -2964,7 +4285,7 @@ func_mode_install ()
          # are installed into $libdir/../bin (currently, that works fine)
          # but it's something to keep an eye on.
          test "$inst_prefix_dir" = "$destdir" && \
          # are installed into $libdir/../bin (currently, that works fine)
          # but it's something to keep an eye on.
          test "$inst_prefix_dir" = "$destdir" && \
-           func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+           func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
 
          if test -n "$inst_prefix_dir"; then
            # Stick the inst_prefix_dir data into the link command.
 
          if test -n "$inst_prefix_dir"; then
            # Stick the inst_prefix_dir data into the link command.
@@ -2973,29 +4294,36 @@ func_mode_install ()
            relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
          fi
 
            relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
          fi
 
-         func_warning "relinking \`$file'"
+         func_warning "relinking '$file'"
          func_show_eval "$relink_command" \
          func_show_eval "$relink_command" \
-           'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+           'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
        fi
 
        # See the names of the shared library.
        set dummy $library_names; shift
        if test -n "$1"; then
        fi
 
        # See the names of the shared library.
        set dummy $library_names; shift
        if test -n "$1"; then
-         realname="$1"
+         realname=$1
          shift
 
          shift
 
-         srcname="$realname"
-         test -n "$relink_command" && srcname="$realname"T
+         srcname=$realname
+         test -n "$relink_command" && srcname=${realname}T
 
          # Install the shared library and build the symlinks.
          func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
              'exit $?'
 
          # Install the shared library and build the symlinks.
          func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
              'exit $?'
-         tstripme="$stripme"
+         tstripme=$stripme
          case $host_os in
          cygwin* | mingw* | pw32* | cegcc*)
            case $realname in
            *.dll.a)
          case $host_os in
          cygwin* | mingw* | pw32* | cegcc*)
            case $realname in
            *.dll.a)
-             tstripme=""
+             tstripme=
+             ;;
+           esac
+           ;;
+         os2*)
+           case $realname in
+           *_dll.a)
+             tstripme=
              ;;
            esac
            ;;
              ;;
            esac
            ;;
@@ -3006,7 +4334,7 @@ func_mode_install ()
 
          if test "$#" -gt 0; then
            # Delete the old symlinks, and create new ones.
 
          if test "$#" -gt 0; then
            # Delete the old symlinks, and create new ones.
-           # Try `ln -sf' first, because the `ln' binary might depend on
+           # Try 'ln -sf' first, because the 'ln' binary might depend on
            # the symlink we replace!  Solaris /bin/ln does not understand -f,
            # so we also need to try rm && ln -s.
            for linkname
            # the symlink we replace!  Solaris /bin/ln does not understand -f,
            # so we also need to try rm && ln -s.
            for linkname
@@ -3017,14 +4345,14 @@ func_mode_install ()
          fi
 
          # Do each command in the postinstall commands.
          fi
 
          # Do each command in the postinstall commands.
-         lib="$destdir/$realname"
+         lib=$destdir/$realname
          func_execute_cmds "$postinstall_cmds" 'exit $?'
        fi
 
        # Install the pseudo-library for information purposes.
        func_basename "$file"
          func_execute_cmds "$postinstall_cmds" 'exit $?'
        fi
 
        # Install the pseudo-library for information purposes.
        func_basename "$file"
-       name="$func_basename_result"
-       instname="$dir/$name"i
+       name=$func_basename_result
+       instname=$dir/${name}i
        func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
 
        # Maybe install the static library, too.
        func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
 
        # Maybe install the static library, too.
@@ -3036,11 +4364,11 @@ func_mode_install ()
 
        # Figure out destination file name, if it wasn't already specified.
        if test -n "$destname"; then
 
        # Figure out destination file name, if it wasn't already specified.
        if test -n "$destname"; then
-         destfile="$destdir/$destname"
+         destfile=$destdir/$destname
        else
          func_basename "$file"
        else
          func_basename "$file"
-         destfile="$func_basename_result"
-         destfile="$destdir/$destfile"
+         destfile=$func_basename_result
+         destfile=$destdir/$destfile
        fi
 
        # Deduce the name of the destination old-style object file.
        fi
 
        # Deduce the name of the destination old-style object file.
@@ -3050,11 +4378,11 @@ func_mode_install ()
          staticdest=$func_lo2o_result
          ;;
        *.$objext)
          staticdest=$func_lo2o_result
          ;;
        *.$objext)
-         staticdest="$destfile"
+         staticdest=$destfile
          destfile=
          ;;
        *)
          destfile=
          ;;
        *)
-         func_fatal_help "cannot copy a libtool object to \`$destfile'"
+         func_fatal_help "cannot copy a libtool object to '$destfile'"
          ;;
        esac
 
          ;;
        esac
 
@@ -3063,7 +4391,7 @@ func_mode_install ()
          func_show_eval "$install_prog $file $destfile" 'exit $?'
 
        # Install the old object if enabled.
          func_show_eval "$install_prog $file $destfile" 'exit $?'
 
        # Install the old object if enabled.
-       if test "$build_old_libs" = yes; then
+       if test yes = "$build_old_libs"; then
          # Deduce the name of the old-style object file.
          func_lo2o "$file"
          staticobj=$func_lo2o_result
          # Deduce the name of the old-style object file.
          func_lo2o "$file"
          staticobj=$func_lo2o_result
@@ -3075,23 +4403,23 @@ func_mode_install ()
       *)
        # Figure out destination file name, if it wasn't already specified.
        if test -n "$destname"; then
       *)
        # Figure out destination file name, if it wasn't already specified.
        if test -n "$destname"; then
-         destfile="$destdir/$destname"
+         destfile=$destdir/$destname
        else
          func_basename "$file"
        else
          func_basename "$file"
-         destfile="$func_basename_result"
-         destfile="$destdir/$destfile"
+         destfile=$func_basename_result
+         destfile=$destdir/$destfile
        fi
 
        # If the file is missing, and there is a .exe on the end, strip it
        # because it is most likely a libtool script we actually want to
        # install
        fi
 
        # If the file is missing, and there is a .exe on the end, strip it
        # because it is most likely a libtool script we actually want to
        # install
-       stripped_ext=""
+       stripped_ext=
        case $file in
          *.exe)
            if test ! -f "$file"; then
              func_stripname '' '.exe' "$file"
              file=$func_stripname_result
        case $file in
          *.exe)
            if test ! -f "$file"; then
              func_stripname '' '.exe' "$file"
              file=$func_stripname_result
-             stripped_ext=".exe"
+             stripped_ext=.exe
            fi
            ;;
        esac
            fi
            ;;
        esac
@@ -3119,19 +4447,19 @@ func_mode_install ()
 
          # Check the variables that should have been set.
          test -z "$generated_by_libtool_version" && \
 
          # Check the variables that should have been set.
          test -z "$generated_by_libtool_version" && \
-           func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+           func_fatal_error "invalid libtool wrapper script '$wrapper'"
 
 
-         finalize=yes
+         finalize=:
          for lib in $notinst_deplibs; do
            # Check to see that each library is installed.
            libdir=
            if test -f "$lib"; then
              func_source "$lib"
            fi
          for lib in $notinst_deplibs; do
            # Check to see that each library is installed.
            libdir=
            if test -f "$lib"; then
              func_source "$lib"
            fi
-           libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+           libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
            if test -n "$libdir" && test ! -f "$libfile"; then
            if test -n "$libdir" && test ! -f "$libfile"; then
-             func_warning "\`$lib' has not been installed in \`$libdir'"
-             finalize=no
+             func_warning "'$lib' has not been installed in '$libdir'"
+             finalize=false
            fi
          done
 
            fi
          done
 
@@ -3139,29 +4467,29 @@ func_mode_install ()
          func_source "$wrapper"
 
          outputname=
          func_source "$wrapper"
 
          outputname=
-         if test "$fast_install" = no && test -n "$relink_command"; then
+         if test no = "$fast_install" && test -n "$relink_command"; then
            $opt_dry_run || {
            $opt_dry_run || {
-             if test "$finalize" = yes; then
+             if $finalize; then
                tmpdir=`func_mktempdir`
                func_basename "$file$stripped_ext"
                tmpdir=`func_mktempdir`
                func_basename "$file$stripped_ext"
-               file="$func_basename_result"
-               outputname="$tmpdir/$file"
+               file=$func_basename_result
+               outputname=$tmpdir/$file
                # Replace the output file specification.
                relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
 
                # Replace the output file specification.
                relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
 
-               $opt_silent || {
+               $opt_quiet || {
                  func_quote_for_expand "$relink_command"
                  eval "func_echo $func_quote_for_expand_result"
                }
                if eval "$relink_command"; then :
                  else
                  func_quote_for_expand "$relink_command"
                  eval "func_echo $func_quote_for_expand_result"
                }
                if eval "$relink_command"; then :
                  else
-                 func_error "error: relink \`$file' with the above command before installing it"
+                 func_error "error: relink '$file' with the above command before installing it"
                  $opt_dry_run || ${RM}r "$tmpdir"
                  continue
                fi
                  $opt_dry_run || ${RM}r "$tmpdir"
                  continue
                fi
-               file="$outputname"
+               file=$outputname
              else
              else
-               func_warning "cannot relink \`$file'"
+               func_warning "cannot relink '$file'"
              fi
            }
          else
              fi
            }
          else
@@ -3198,10 +4526,10 @@ func_mode_install ()
 
     for file in $staticlibs; do
       func_basename "$file"
 
     for file in $staticlibs; do
       func_basename "$file"
-      name="$func_basename_result"
+      name=$func_basename_result
 
       # Set up the ranlib parameters.
 
       # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
+      oldlib=$destdir/$name
       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
       tool_oldlib=$func_to_tool_file_result
 
       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
       tool_oldlib=$func_to_tool_file_result
 
@@ -3216,18 +4544,18 @@ func_mode_install ()
     done
 
     test -n "$future_libdirs" && \
     done
 
     test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
+      func_warning "remember to run '$progname --finish$future_libdirs'"
 
     if test -n "$current_libdirs"; then
       # Maybe just do a dry run.
       $opt_dry_run && current_libdirs=" -n$current_libdirs"
 
     if test -n "$current_libdirs"; then
       # Maybe just do a dry run.
       $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+      exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
     else
       exit $EXIT_SUCCESS
     fi
 }
 
     else
       exit $EXIT_SUCCESS
     fi
 }
 
-test "$opt_mode" = install && func_mode_install ${1+"$@"}
+test install = "$opt_mode" && func_mode_install ${1+"$@"}
 
 
 # func_generate_dlsyms outputname originator pic_p
 
 
 # func_generate_dlsyms outputname originator pic_p
@@ -3235,16 +4563,17 @@ test "$opt_mode" = install && func_mode_install ${1+"$@"}
 # a dlpreopen symbol table.
 func_generate_dlsyms ()
 {
 # a dlpreopen symbol table.
 func_generate_dlsyms ()
 {
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    $debug_cmd
+
+    my_outputname=$1
+    my_originator=$2
+    my_pic_p=${3-false}
+    my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
     my_dlsyms=
 
     my_dlsyms=
 
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+    if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
       if test -n "$NM" && test -n "$global_symbol_pipe"; then
       if test -n "$NM" && test -n "$global_symbol_pipe"; then
-       my_dlsyms="${my_outputname}S.c"
+       my_dlsyms=${my_outputname}S.c
       else
        func_error "not configured to extract global symbols from dlpreopened files"
       fi
       else
        func_error "not configured to extract global symbols from dlpreopened files"
       fi
@@ -3255,7 +4584,7 @@ func_generate_dlsyms ()
       "") ;;
       *.c)
        # Discover the nlist of each of the dlfiles.
       "") ;;
       *.c)
        # Discover the nlist of each of the dlfiles.
-       nlist="$output_objdir/${my_outputname}.nm"
+       nlist=$output_objdir/$my_outputname.nm
 
        func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
 
 
        func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
 
@@ -3263,34 +4592,36 @@ func_generate_dlsyms ()
        func_verbose "creating $output_objdir/$my_dlsyms"
 
        $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
        func_verbose "creating $output_objdir/$my_dlsyms"
 
        $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
 
 #ifdef __cplusplus
 extern \"C\" {
 #endif
 
 
 #ifdef __cplusplus
 extern \"C\" {
 #endif
 
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
 #pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
 #endif
 
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
 #pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
 #endif
 
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
 # define LT_DLSYM_CONST const
 #endif
 
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
 # define LT_DLSYM_CONST const
 #endif
 
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
 /* External symbol declarations for the compiler. */\
 "
 
 /* External symbol declarations for the compiler. */\
 "
 
-       if test "$dlself" = yes; then
-         func_verbose "generating symbol list for \`$output'"
+       if test yes = "$dlself"; then
+         func_verbose "generating symbol list for '$output'"
 
          $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
 
 
          $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
 
@@ -3298,7 +4629,7 @@ extern \"C\" {
          progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
          for progfile in $progfiles; do
            func_to_tool_file "$progfile" func_convert_file_msys_to_w32
          progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
          for progfile in $progfiles; do
            func_to_tool_file "$progfile" func_convert_file_msys_to_w32
-           func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+           func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
            $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
          done
 
            $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
          done
 
@@ -3318,10 +4649,10 @@ extern \"C\" {
 
          # Prepare the list of exported symbols
          if test -z "$export_symbols"; then
 
          # Prepare the list of exported symbols
          if test -z "$export_symbols"; then
-           export_symbols="$output_objdir/$outputname.exp"
+           export_symbols=$output_objdir/$outputname.exp
            $opt_dry_run || {
              $RM $export_symbols
            $opt_dry_run || {
              $RM $export_symbols
-             eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+             eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
              case $host in
              *cygwin* | *mingw* | *cegcc* )
                 eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
              case $host in
              *cygwin* | *mingw* | *cegcc* )
                 eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
@@ -3331,7 +4662,7 @@ extern \"C\" {
            }
          else
            $opt_dry_run || {
            }
          else
            $opt_dry_run || {
-             eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+             eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
              eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
              eval '$MV "$nlist"T "$nlist"'
              case $host in
              eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
              eval '$MV "$nlist"T "$nlist"'
              case $host in
@@ -3345,22 +4676,22 @@ extern \"C\" {
        fi
 
        for dlprefile in $dlprefiles; do
        fi
 
        for dlprefile in $dlprefiles; do
-         func_verbose "extracting global C symbols from \`$dlprefile'"
+         func_verbose "extracting global C symbols from '$dlprefile'"
          func_basename "$dlprefile"
          func_basename "$dlprefile"
-         name="$func_basename_result"
+         name=$func_basename_result
           case $host in
            *cygwin* | *mingw* | *cegcc* )
              # if an import library, we need to obtain dlname
              if func_win32_import_lib_p "$dlprefile"; then
                func_tr_sh "$dlprefile"
                eval "curr_lafile=\$libfile_$func_tr_sh_result"
           case $host in
            *cygwin* | *mingw* | *cegcc* )
              # if an import library, we need to obtain dlname
              if func_win32_import_lib_p "$dlprefile"; then
                func_tr_sh "$dlprefile"
                eval "curr_lafile=\$libfile_$func_tr_sh_result"
-               dlprefile_dlbasename=""
+               dlprefile_dlbasename=
                if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
                  # Use subshell, to avoid clobbering current variable values
                  dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
                if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
                  # Use subshell, to avoid clobbering current variable values
                  dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
-                 if test -n "$dlprefile_dlname" ; then
+                 if test -n "$dlprefile_dlname"; then
                    func_basename "$dlprefile_dlname"
                    func_basename "$dlprefile_dlname"
-                   dlprefile_dlbasename="$func_basename_result"
+                   dlprefile_dlbasename=$func_basename_result
                  else
                    # no lafile. user explicitly requested -dlpreopen <import library>.
                    $sharedlib_from_linklib_cmd "$dlprefile"
                  else
                    # no lafile. user explicitly requested -dlpreopen <import library>.
                    $sharedlib_from_linklib_cmd "$dlprefile"
@@ -3368,7 +4699,7 @@ extern \"C\" {
                  fi
                fi
                $opt_dry_run || {
                  fi
                fi
                $opt_dry_run || {
-                 if test -n "$dlprefile_dlbasename" ; then
+                 if test -n "$dlprefile_dlbasename"; then
                    eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
                  else
                    func_warning "Could not compute DLL name from $name"
                    eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
                  else
                    func_warning "Could not compute DLL name from $name"
@@ -3424,6 +4755,11 @@ extern \"C\" {
            echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
          fi
 
            echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
          fi
 
+         func_show_eval '$RM "${nlist}I"'
+         if test -n "$global_symbol_to_import"; then
+           eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+         fi
+
          echo >> "$output_objdir/$my_dlsyms" "\
 
 /* The mapping between symbol names and symbols.  */
          echo >> "$output_objdir/$my_dlsyms" "\
 
 /* The mapping between symbol names and symbols.  */
@@ -3432,11 +4768,30 @@ typedef struct {
   void *address;
 } lt_dlsymlist;
 extern LT_DLSYM_CONST lt_dlsymlist
   void *address;
 } lt_dlsymlist;
 extern LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
+lt_${my_prefix}_LTX_preloaded_symbols[];\
+"
+
+         if test -s "$nlist"I; then
+           echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+  LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+  for (; symbol->name; ++symbol)
+    {"
+           $SED 's/.*/      if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+           echo >> "$output_objdir/$my_dlsyms" "\
+    }
+}"
+         fi
+         echo >> "$output_objdir/$my_dlsyms" "\
 LT_DLSYM_CONST lt_dlsymlist
 lt_${my_prefix}_LTX_preloaded_symbols[] =
 LT_DLSYM_CONST lt_dlsymlist
 lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
+{ {\"$my_originator\", (void *) 0},"
+
+         if test -s "$nlist"I; then
+           echo >> "$output_objdir/$my_dlsyms" "\
+  {\"@INIT@\", (void *) &lt_syminit},"
+         fi
 
          case $need_lib_prefix in
          no)
 
          case $need_lib_prefix in
          no)
@@ -3478,9 +4833,7 @@ static const void *lt_preloaded_setup() {
          *-*-hpux*)
            pic_flag_for_symtable=" $pic_flag"  ;;
          *)
          *-*-hpux*)
            pic_flag_for_symtable=" $pic_flag"  ;;
          *)
-           if test "X$my_pic_p" != Xno; then
-             pic_flag_for_symtable=" $pic_flag"
-           fi
+           $my_pic_p && pic_flag_for_symtable=" $pic_flag"
            ;;
          esac
          ;;
            ;;
          esac
          ;;
@@ -3497,10 +4850,10 @@ static const void *lt_preloaded_setup() {
        func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
 
        # Clean up the generated files.
        func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
 
        # Clean up the generated files.
-       func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+       func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
 
        # Transform the symbol file into the correct name.
 
        # Transform the symbol file into the correct name.
-       symfileobj="$output_objdir/${my_outputname}S.$objext"
+       symfileobj=$output_objdir/${my_outputname}S.$objext
        case $host in
        *cygwin* | *mingw* | *cegcc* )
          if test -f "$output_objdir/$my_outputname.def"; then
        case $host in
        *cygwin* | *mingw* | *cegcc* )
          if test -f "$output_objdir/$my_outputname.def"; then
@@ -3518,7 +4871,7 @@ static const void *lt_preloaded_setup() {
        esac
        ;;
       *)
        esac
        ;;
       *)
-       func_fatal_error "unknown suffix for \`$my_dlsyms'"
+       func_fatal_error "unknown suffix for '$my_dlsyms'"
        ;;
       esac
     else
        ;;
       esac
     else
@@ -3532,6 +4885,32 @@ static const void *lt_preloaded_setup() {
     fi
 }
 
     fi
 }
 
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
 # func_win32_libid arg
 # return the library type of file 'arg'
 #
 # func_win32_libid arg
 # return the library type of file 'arg'
 #
@@ -3541,8 +4920,9 @@ static const void *lt_preloaded_setup() {
 # Despite the name, also deal with 64 bit binaries.
 func_win32_libid ()
 {
 # Despite the name, also deal with 64 bit binaries.
 func_win32_libid ()
 {
-  $opt_debug
-  win32_libid_type="unknown"
+  $debug_cmd
+
+  win32_libid_type=unknown
   win32_fileres=`file -L $1 2>/dev/null`
   case $win32_fileres in
   *ar\ archive\ import\ library*) # definitely import
   win32_fileres=`file -L $1 2>/dev/null`
   case $win32_fileres in
   *ar\ archive\ import\ library*) # definitely import
@@ -3552,16 +4932,29 @@ func_win32_libid ()
     # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
     if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
        $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
     # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
     if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
        $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      func_to_tool_file "$1" func_convert_file_msys_to_w32
-      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
-       $SED -n -e '
+      case $nm_interface in
+      "MS dumpbin")
+       if func_cygming_ms_implib_p "$1" ||
+          func_cygming_gnu_implib_p "$1"
+       then
+         win32_nmres=import
+       else
+         win32_nmres=
+       fi
+       ;;
+      *)
+       func_to_tool_file "$1" func_convert_file_msys_to_w32
+       win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+         $SED -n -e '
            1,100{
                / I /{
            1,100{
                / I /{
-                   s,.*,import,
+                   s|.*|import|
                    p
                    q
                }
            }'`
                    p
                    q
                }
            }'`
+       ;;
+      esac
       case $win32_nmres in
       import*)  win32_libid_type="x86 archive import";;
       *)        win32_libid_type="x86 archive static";;
       case $win32_nmres in
       import*)  win32_libid_type="x86 archive import";;
       *)        win32_libid_type="x86 archive static";;
@@ -3593,7 +4986,8 @@ func_win32_libid ()
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib ()
 {
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib ()
 {
-  $opt_debug
+  $debug_cmd
+
   sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
 }
 
   sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
 }
 
@@ -3610,7 +5004,8 @@ func_cygming_dll_for_implib ()
 # specified import library.
 func_cygming_dll_for_implib_fallback_core ()
 {
 # specified import library.
 func_cygming_dll_for_implib_fallback_core ()
 {
-  $opt_debug
+  $debug_cmd
+
   match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
   $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
     $SED '/^Contents of section '"$match_literal"':/{
   match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
   $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
     $SED '/^Contents of section '"$match_literal"':/{
@@ -3646,8 +5041,8 @@ func_cygming_dll_for_implib_fallback_core ()
       /./p' |
     # we now have a list, one entry per line, of the stringified
     # contents of the appropriate section of all members of the
       /./p' |
     # we now have a list, one entry per line, of the stringified
     # contents of the appropriate section of all members of the
-    # archive which possess that section. Heuristic: eliminate
-    # all those which have a first or second character that is
+    # archive that possess that section. Heuristic: eliminate
+    # all those that have a first or second character that is
     # a '.' (that is, objdump's representation of an unprintable
     # character.) This should work for all archives with less than
     # 0x302f exports -- but will fail for DLLs whose name actually
     # a '.' (that is, objdump's representation of an unprintable
     # character.) This should work for all archives with less than
     # 0x302f exports -- but will fail for DLLs whose name actually
@@ -3658,30 +5053,6 @@ func_cygming_dll_for_implib_fallback_core ()
     $SED -e '/^\./d;/^.\./d;q'
 }
 
     $SED -e '/^\./d;/^.\./d;q'
 }
 
-# func_cygming_gnu_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is a GNU/binutils-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_gnu_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
-  test -n "$func_cygming_gnu_implib_tmp"
-}
-
-# func_cygming_ms_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is an MS-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_ms_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
-  test -n "$func_cygming_ms_implib_tmp"
-}
-
 # func_cygming_dll_for_implib_fallback ARG
 # Platform-specific function to extract the
 # name of the DLL associated with the specified
 # func_cygming_dll_for_implib_fallback ARG
 # Platform-specific function to extract the
 # name of the DLL associated with the specified
@@ -3695,16 +5066,17 @@ func_cygming_ms_implib_p ()
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib_fallback ()
 {
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib_fallback ()
 {
-  $opt_debug
-  if func_cygming_gnu_implib_p "$1" ; then
+  $debug_cmd
+
+  if func_cygming_gnu_implib_p "$1"; then
     # binutils import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
     # binutils import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
-  elif func_cygming_ms_implib_p "$1" ; then
+  elif func_cygming_ms_implib_p "$1"; then
     # ms-generated import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
   else
     # unknown
     # ms-generated import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
   else
     # unknown
-    sharedlib_from_linklib_result=""
+    sharedlib_from_linklib_result=
   fi
 }
 
   fi
 }
 
@@ -3712,10 +5084,11 @@ func_cygming_dll_for_implib_fallback ()
 # func_extract_an_archive dir oldlib
 func_extract_an_archive ()
 {
 # func_extract_an_archive dir oldlib
 func_extract_an_archive ()
 {
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
+    $debug_cmd
+
+    f_ex_an_ar_dir=$1; shift
+    f_ex_an_ar_oldlib=$1
+    if test yes = "$lock_old_archive_extraction"; then
       lockfile=$f_ex_an_ar_oldlib.lock
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
        func_echo "Waiting for $lockfile to be removed"
       lockfile=$f_ex_an_ar_oldlib.lock
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
        func_echo "Waiting for $lockfile to be removed"
@@ -3724,7 +5097,7 @@ func_extract_an_archive ()
     fi
     func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
                   'stat=$?; rm -f "$lockfile"; exit $stat'
     fi
     func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
                   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
+    if test yes = "$lock_old_archive_extraction"; then
       $opt_dry_run || rm -f "$lockfile"
     fi
     if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
       $opt_dry_run || rm -f "$lockfile"
     fi
     if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
@@ -3738,22 +5111,23 @@ func_extract_an_archive ()
 # func_extract_archives gentop oldlib ...
 func_extract_archives ()
 {
 # func_extract_archives gentop oldlib ...
 func_extract_archives ()
 {
-    $opt_debug
-    my_gentop="$1"; shift
+    $debug_cmd
+
+    my_gentop=$1; shift
     my_oldlibs=${1+"$@"}
     my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
+    my_oldobjs=
+    my_xlib=
+    my_xabs=
+    my_xdir=
 
     for my_xlib in $my_oldlibs; do
       # Extract the objects.
       case $my_xlib in
 
     for my_xlib in $my_oldlibs; do
       # Extract the objects.
       case $my_xlib in
-       [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+       [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
        *) my_xabs=`pwd`"/$my_xlib" ;;
       esac
       func_basename "$my_xlib"
        *) my_xabs=`pwd`"/$my_xlib" ;;
       esac
       func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
+      my_xlib=$func_basename_result
       my_xlib_u=$my_xlib
       while :; do
         case " $extracted_archives " in
       my_xlib_u=$my_xlib
       while :; do
         case " $extracted_archives " in
@@ -3765,7 +5139,7 @@ func_extract_archives ()
        esac
       done
       extracted_archives="$extracted_archives $my_xlib_u"
        esac
       done
       extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
+      my_xdir=$my_gentop/$my_xlib_u
 
       func_mkdir_p "$my_xdir"
 
 
       func_mkdir_p "$my_xdir"
 
@@ -3778,22 +5152,23 @@ func_extract_archives ()
          cd $my_xdir || exit $?
          darwin_archive=$my_xabs
          darwin_curdir=`pwd`
          cd $my_xdir || exit $?
          darwin_archive=$my_xabs
          darwin_curdir=`pwd`
-         darwin_base_archive=`basename "$darwin_archive"`
+         func_basename "$darwin_archive"
+         darwin_base_archive=$func_basename_result
          darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
          if test -n "$darwin_arches"; then
            darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
            darwin_arch=
            func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
          darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
          if test -n "$darwin_arches"; then
            darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
            darwin_arch=
            func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-           for darwin_arch in  $darwin_arches ; do
-             func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-             $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-             cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-             func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+           for darwin_arch in  $darwin_arches; do
+             func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
+             $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
+             cd "unfat-$$/$darwin_base_archive-$darwin_arch"
+             func_extract_an_archive "`pwd`" "$darwin_base_archive"
              cd "$darwin_curdir"
              cd "$darwin_curdir"
-             $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+             $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
            done # $darwin_arches
             ## Okay now we've a bunch of thin objects, gotta fatten them up :)
            done # $darwin_arches
             ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-           darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+           darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
            darwin_file=
            darwin_files=
            for darwin_file in $darwin_filelist; do
            darwin_file=
            darwin_files=
            for darwin_file in $darwin_filelist; do
@@ -3815,7 +5190,7 @@ func_extract_archives ()
       my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
     done
 
       my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
     done
 
-    func_extract_archives_result="$my_oldobjs"
+    func_extract_archives_result=$my_oldobjs
 }
 
 
 }
 
 
@@ -3830,7 +5205,7 @@ func_extract_archives ()
 #
 # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
 # variable will take.  If 'yes', then the emitted script
 #
 # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
 # variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
+# will assume that the directory where it is stored is
 # the $objdir directory.  This is a cygwin/mingw-specific
 # behavior.
 func_emit_wrapper ()
 # the $objdir directory.  This is a cygwin/mingw-specific
 # behavior.
 func_emit_wrapper ()
@@ -3841,7 +5216,7 @@ func_emit_wrapper ()
 #! $SHELL
 
 # $output - temporary wrapper script for $objdir/$outputname
 #! $SHELL
 
 # $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # The $output program cannot be directly executed until all the libtool
 # libraries that it depends on are installed.
 #
 # The $output program cannot be directly executed until all the libtool
 # libraries that it depends on are installed.
@@ -3898,9 +5273,9 @@ _LTECHO_EOF'
 
 # Very basic option parsing. These options are (a) specific to
 # the libtool wrapper, (b) are identical between the wrapper
 
 # Very basic option parsing. These options are (a) specific to
 # the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
+# /script/ and the wrapper /executable/ that is used only on
 # windows platforms, and (c) all begin with the string "--lt-"
 # windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
+# (application programs are unlikely to have options that match
 # this pattern).
 #
 # There are only two supported options: --lt-debug and
 # this pattern).
 #
 # There are only two supported options: --lt-debug and
@@ -3933,7 +5308,7 @@ func_parse_lt_options ()
 
   # Print the debug banner immediately:
   if test -n \"\$lt_option_debug\"; then
 
   # Print the debug banner immediately:
   if test -n \"\$lt_option_debug\"; then
-    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+    echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
   fi
 }
 
   fi
 }
 
@@ -3944,7 +5319,7 @@ func_lt_dump_args ()
   lt_dump_args_N=1;
   for lt_arg
   do
   lt_dump_args_N=1;
   for lt_arg
   do
-    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
     lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
   done
 }
     lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
   done
 }
@@ -3958,7 +5333,7 @@ func_exec_program_core ()
   *-*-mingw | *-*-os2* | *-cegcc*)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
   *-*-mingw | *-*-os2* | *-cegcc*)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
@@ -3968,7 +5343,7 @@ func_exec_program_core ()
   *)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
   *)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir/\$program\" \${1+\"\$@\"}
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir/\$program\" \${1+\"\$@\"}
@@ -4043,13 +5418,13 @@ func_exec_program ()
   test -n \"\$absdir\" && thisdir=\"\$absdir\"
 "
 
   test -n \"\$absdir\" && thisdir=\"\$absdir\"
 "
 
-       if test "$fast_install" = yes; then
+       if test yes = "$fast_install"; then
          $ECHO "\
   program=lt-'$outputname'$exeext
   progdir=\"\$thisdir/$objdir\"
 
   if test ! -f \"\$progdir/\$program\" ||
          $ECHO "\
   program=lt-'$outputname'$exeext
   progdir=\"\$thisdir/$objdir\"
 
   if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
        test \"X\$file\" != \"X\$progdir/\$program\"; }; then
 
     file=\"\$\$-\$program\"
        test \"X\$file\" != \"X\$progdir/\$program\"; }; then
 
     file=\"\$\$-\$program\"
@@ -4066,7 +5441,7 @@ func_exec_program ()
     if test -n \"\$relink_command\"; then
       if relink_command_output=\`eval \$relink_command 2>&1\`; then :
       else
     if test -n \"\$relink_command\"; then
       if relink_command_output=\`eval \$relink_command 2>&1\`; then :
       else
-       $ECHO \"\$relink_command_output\" >&2
+       \$ECHO \"\$relink_command_output\" >&2
        $RM \"\$progdir/\$file\"
        exit 1
       fi
        $RM \"\$progdir/\$file\"
        exit 1
       fi
@@ -4101,7 +5476,7 @@ func_exec_program ()
        fi
 
        # Export our shlibpath_var if we have one.
        fi
 
        # Export our shlibpath_var if we have one.
-       if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+       if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
          $ECHO "\
     # Add our own library path to $shlibpath_var
     $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
          $ECHO "\
     # Add our own library path to $shlibpath_var
     $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
@@ -4121,7 +5496,7 @@ func_exec_program ()
     fi
   else
     # The program doesn't exist.
     fi
   else
     # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
     \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
     \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
     exit 1
     \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
     \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
     exit 1
@@ -4140,7 +5515,7 @@ func_emit_cwrapperexe_src ()
        cat <<EOF
 
 /* $cwrappersource - temporary wrapper executable for $objdir/$outputname
        cat <<EOF
 
 /* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+   Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 
    The $output program cannot be directly executed until all the libtool
    libraries that it depends on are installed.
 
    The $output program cannot be directly executed until all the libtool
    libraries that it depends on are installed.
@@ -4175,47 +5550,45 @@ EOF
 #include <fcntl.h>
 #include <sys/stat.h>
 
 #include <fcntl.h>
 #include <sys/stat.h>
 
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
 /* declarations of non-ANSI functions */
 /* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
+#if defined __MINGW32__
 # ifdef __STRICT_ANSI__
 int _putenv (const char *);
 # endif
 # ifdef __STRICT_ANSI__
 int _putenv (const char *);
 # endif
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
 # ifdef __STRICT_ANSI__
 char *realpath (const char *, char *);
 int putenv (char *);
 int setenv (const char *, const char *, int);
 # endif
 # ifdef __STRICT_ANSI__
 char *realpath (const char *, char *);
 int putenv (char *);
 int setenv (const char *, const char *, int);
 # endif
-/* #elif defined (other platforms) ... */
+/* #elif defined other_platform || defined ... */
 #endif
 
 /* portability defines, excluding path handling macros */
 #endif
 
 /* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
+#if defined _MSC_VER
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
 # define S_IXUSR _S_IEXEC
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
 # define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
+#elif defined __MINGW32__
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
 # define HAVE_SETENV
 # define FOPEN_WB "wb"
 # define HAVE_SETENV
 # define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
+/* #elif defined other platforms ... */
 #endif
 
 #endif
 
-#if defined(PATH_MAX)
+#if defined PATH_MAX
 # define LT_PATHMAX PATH_MAX
 # define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
+#elif defined MAXPATHLEN
 # define LT_PATHMAX MAXPATHLEN
 #else
 # define LT_PATHMAX 1024
 # define LT_PATHMAX MAXPATHLEN
 #else
 # define LT_PATHMAX 1024
@@ -4234,8 +5607,8 @@ int setenv (const char *, const char *, int);
 # define PATH_SEPARATOR ':'
 #endif
 
 # define PATH_SEPARATOR ':'
 #endif
 
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
+#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
+  defined __OS2__
 # define HAVE_DOS_BASED_FILE_SYSTEM
 # define FOPEN_WB "wb"
 # ifndef DIR_SEPARATOR_2
 # define HAVE_DOS_BASED_FILE_SYSTEM
 # define FOPEN_WB "wb"
 # ifndef DIR_SEPARATOR_2
@@ -4268,10 +5641,10 @@ int setenv (const char *, const char *, int);
 
 #define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
 #define XFREE(stale) do { \
 
 #define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
 #define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
+  if (stale) { free (stale); stale = 0; } \
 } while (0)
 
 } while (0)
 
-#if defined(LT_DEBUGWRAPPER)
+#if defined LT_DEBUGWRAPPER
 static int lt_debug = 1;
 #else
 static int lt_debug = 0;
 static int lt_debug = 1;
 #else
 static int lt_debug = 0;
@@ -4300,11 +5673,16 @@ void lt_dump_script (FILE *f);
 EOF
 
            cat <<EOF
 EOF
 
            cat <<EOF
-volatile const char * MAGIC_EXE = "$magic_exe";
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
 const char * LIB_PATH_VARNAME = "$shlibpath_var";
 EOF
 
 const char * LIB_PATH_VARNAME = "$shlibpath_var";
 EOF
 
-           if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+           if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
               func_to_host_path "$temp_rpath"
              cat <<EOF
 const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
               func_to_host_path "$temp_rpath"
              cat <<EOF
 const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
@@ -4328,7 +5706,7 @@ const char * EXE_PATH_VALUE   = "";
 EOF
            fi
 
 EOF
            fi
 
-           if test "$fast_install" = yes; then
+           if test yes = "$fast_install"; then
              cat <<EOF
 const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
 EOF
              cat <<EOF
 const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
 EOF
@@ -4357,12 +5735,12 @@ main (int argc, char *argv[])
   char *actual_cwrapper_name;
   char *target_name;
   char *lt_argv_zero;
   char *actual_cwrapper_name;
   char *target_name;
   char *lt_argv_zero;
-  intptr_t rval = 127;
+  int rval = 127;
 
   int i;
 
   program_name = (char *) xstrdup (base_name (argv[0]));
 
   int i;
 
   program_name = (char *) xstrdup (base_name (argv[0]));
-  newargz = XMALLOC (char *, argc + 1);
+  newargz = XMALLOC (char *, (size_t) argc + 1);
 
   /* very simple arg parsing; don't want to rely on getopt
    * also, copy all non cwrapper options to newargz, except
 
   /* very simple arg parsing; don't want to rely on getopt
    * also, copy all non cwrapper options to newargz, except
@@ -4371,10 +5749,10 @@ main (int argc, char *argv[])
   newargc=0;
   for (i = 1; i < argc; i++)
     {
   newargc=0;
   for (i = 1; i < argc; i++)
     {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
+      if (STREQ (argv[i], dumpscript_opt))
        {
 EOF
        {
 EOF
-           case "$host" in
+           case $host in
              *mingw* | *cygwin* )
                # make stdout use "unix" line endings
                echo "          setmode(1,_O_BINARY);"
              *mingw* | *cygwin* )
                # make stdout use "unix" line endings
                echo "          setmode(1,_O_BINARY);"
@@ -4385,12 +5763,12 @@ EOF
          lt_dump_script (stdout);
          return 0;
        }
          lt_dump_script (stdout);
          return 0;
        }
-      if (strcmp (argv[i], debug_opt) == 0)
+      if (STREQ (argv[i], debug_opt))
        {
           lt_debug = 1;
           continue;
        }
        {
           lt_debug = 1;
           continue;
        }
-      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+      if (STREQ (argv[i], ltwrapper_option_prefix))
         {
           /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
              namespace, but it is not one of the ones we know about and
         {
           /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
              namespace, but it is not one of the ones we know about and
@@ -4413,7 +5791,7 @@ EOF
 EOF
            cat <<EOF
   /* The GNU banner must be the first non-error debug message */
 EOF
            cat <<EOF
   /* The GNU banner must be the first non-error debug message */
-  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
 EOF
            cat <<"EOF"
   lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
 EOF
            cat <<"EOF"
   lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
@@ -4524,7 +5902,7 @@ EOF
                cat <<"EOF"
   /* execv doesn't actually work on mingw as expected on unix */
   newargz = prepare_spawn (newargz);
                cat <<"EOF"
   /* execv doesn't actually work on mingw as expected on unix */
   newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
   if (rval == -1)
     {
       /* failed to start process */
   if (rval == -1)
     {
       /* failed to start process */
@@ -4569,7 +5947,7 @@ base_name (const char *name)
 {
   const char *base;
 
 {
   const char *base;
 
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
   /* Skip over the disk name in MSDOS pathnames. */
   if (isalpha ((unsigned char) name[0]) && name[1] == ':')
     name += 2;
   /* Skip over the disk name in MSDOS pathnames. */
   if (isalpha ((unsigned char) name[0]) && name[1] == ':')
     name += 2;
@@ -4628,7 +6006,7 @@ find_executable (const char *wrapper)
   const char *p_next;
   /* static buffer for getcwd */
   char tmp[LT_PATHMAX + 1];
   const char *p_next;
   /* static buffer for getcwd */
   char tmp[LT_PATHMAX + 1];
-  int tmp_len;
+  size_t tmp_len;
   char *concat_name;
 
   lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
   char *concat_name;
 
   lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
@@ -4638,7 +6016,7 @@ find_executable (const char *wrapper)
     return NULL;
 
   /* Absolute path? */
     return NULL;
 
   /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
   if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
     {
       concat_name = xstrdup (wrapper);
   if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
     {
       concat_name = xstrdup (wrapper);
@@ -4656,7 +6034,7 @@ find_executable (const char *wrapper)
            return concat_name;
          XFREE (concat_name);
        }
            return concat_name;
          XFREE (concat_name);
        }
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
     }
 #endif
 
     }
 #endif
 
@@ -4679,7 +6057,7 @@ find_executable (const char *wrapper)
              for (q = p; *q; q++)
                if (IS_PATH_SEPARATOR (*q))
                  break;
              for (q = p; *q; q++)
                if (IS_PATH_SEPARATOR (*q))
                  break;
-             p_len = q - p;
+             p_len = (size_t) (q - p);
              p_next = (*q == '\0' ? q : q + 1);
              if (p_len == 0)
                {
              p_next = (*q == '\0' ? q : q + 1);
              if (p_len == 0)
                {
@@ -4798,7 +6176,7 @@ strendzap (char *str, const char *pat)
   if (patlen <= len)
     {
       str += len - patlen;
   if (patlen <= len)
     {
       str += len - patlen;
-      if (strcmp (str, pat) == 0)
+      if (STREQ (str, pat))
        *str = '\0';
     }
   return str;
        *str = '\0';
     }
   return str;
@@ -4863,7 +6241,7 @@ lt_setenv (const char *name, const char *value)
     char *str = xstrdup (value);
     setenv (name, str, 1);
 #else
     char *str = xstrdup (value);
     setenv (name, str, 1);
 #else
-    int len = strlen (name) + 1 + strlen (value) + 1;
+    size_t len = strlen (name) + 1 + strlen (value) + 1;
     char *str = XMALLOC (char, len);
     sprintf (str, "%s=%s", name, value);
     if (putenv (str) != EXIT_SUCCESS)
     char *str = XMALLOC (char, len);
     sprintf (str, "%s=%s", name, value);
     if (putenv (str) != EXIT_SUCCESS)
@@ -4880,8 +6258,8 @@ lt_extend_str (const char *orig_value, const char *add, int to_end)
   char *new_value;
   if (orig_value && *orig_value)
     {
   char *new_value;
   if (orig_value && *orig_value)
     {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
+      size_t orig_value_len = strlen (orig_value);
+      size_t add_len = strlen (add);
       new_value = XMALLOC (char, add_len + orig_value_len + 1);
       if (to_end)
         {
       new_value = XMALLOC (char, add_len + orig_value_len + 1);
       if (to_end)
         {
@@ -4912,10 +6290,10 @@ lt_update_exe_path (const char *name, const char *value)
     {
       char *new_value = lt_extend_str (getenv (name), value, 0);
       /* some systems can't cope with a ':'-terminated path #' */
     {
       char *new_value = lt_extend_str (getenv (name), value, 0);
       /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+      size_t len = strlen (new_value);
+      while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
         {
         {
-          new_value[len-1] = '\0';
+          new_value[--len] = '\0';
         }
       lt_setenv (name, new_value);
       XFREE (new_value);
         }
       lt_setenv (name, new_value);
       XFREE (new_value);
@@ -5082,27 +6460,47 @@ EOF
 # True if ARG is an import lib, as indicated by $file_magic_cmd
 func_win32_import_lib_p ()
 {
 # True if ARG is an import lib, as indicated by $file_magic_cmd
 func_win32_import_lib_p ()
 {
-    $opt_debug
+    $debug_cmd
+
     case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
     *import*) : ;;
     *) false ;;
     esac
 }
 
     case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
     *import*) : ;;
     *) false ;;
     esac
 }
 
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+    $debug_cmd
+
+    case " $compile_command " in
+    *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+      suncc_use_cstd_abi=no
+      ;;
+    *)
+      suncc_use_cstd_abi=yes
+      ;;
+    esac
+}
+
 # func_mode_link arg...
 func_mode_link ()
 {
 # func_mode_link arg...
 func_mode_link ()
 {
-    $opt_debug
+    $debug_cmd
+
     case $host in
     *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
       # It is impossible to link a dll without this setting, and
       # we shouldn't force the makefile maintainer to figure out
     case $host in
     *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
       # It is impossible to link a dll without this setting, and
       # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
+      # what system we are compiling for in order to pass an extra
       # flag for every libtool invocation.
       # allow_undefined=no
 
       # FIXME: Unfortunately, there are problems with the above when trying
       # flag for every libtool invocation.
       # allow_undefined=no
 
       # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
+      # to make a dll that has undefined symbols, in which case not
       # even a static library is built.  For now, we need to specify
       # -no-undefined on the libtool link line when we can be certain
       # that all symbols are satisfied, otherwise we get a static library.
       # even a static library is built.  For now, we need to specify
       # -no-undefined on the libtool link line when we can be certain
       # that all symbols are satisfied, otherwise we get a static library.
@@ -5146,10 +6544,11 @@ func_mode_link ()
     module=no
     no_install=no
     objs=
     module=no
     no_install=no
     objs=
+    os2dllname=
     non_pic_objects=
     precious_files_regex=
     prefer_static_libs=no
     non_pic_objects=
     precious_files_regex=
     prefer_static_libs=no
-    preload=no
+    preload=false
     prev=
     prevarg=
     release=
     prev=
     prevarg=
     release=
@@ -5161,7 +6560,7 @@ func_mode_link ()
     vinfo=
     vinfo_number=no
     weak_libs=
     vinfo=
     vinfo_number=no
     weak_libs=
-    single_module="${wl}-single_module"
+    single_module=$wl-single_module
     func_infer_tag $base_compile
 
     # We need to know -static, to get the right output filenames.
     func_infer_tag $base_compile
 
     # We need to know -static, to get the right output filenames.
@@ -5169,15 +6568,15 @@ func_mode_link ()
     do
       case $arg in
       -shared)
     do
       case $arg in
       -shared)
-       test "$build_libtool_libs" != yes && \
-         func_fatal_configuration "can not build a shared library"
+       test yes != "$build_libtool_libs" \
+         && func_fatal_configuration "cannot build a shared library"
        build_old_libs=no
        break
        ;;
       -all-static | -static | -static-libtool-libs)
        case $arg in
        -all-static)
        build_old_libs=no
        break
        ;;
       -all-static | -static | -static-libtool-libs)
        case $arg in
        -all-static)
-         if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+         if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
            func_warning "complete static linking is impossible in this configuration"
          fi
          if test -n "$link_static_flag"; then
            func_warning "complete static linking is impossible in this configuration"
          fi
          if test -n "$link_static_flag"; then
@@ -5210,7 +6609,7 @@ func_mode_link ()
 
     # Go through the arguments, transforming them on the way.
     while test "$#" -gt 0; do
 
     # Go through the arguments, transforming them on the way.
     while test "$#" -gt 0; do
-      arg="$1"
+      arg=$1
       shift
       func_quote_for_eval "$arg"
       qarg=$func_quote_for_eval_unquoted_result
       shift
       func_quote_for_eval "$arg"
       qarg=$func_quote_for_eval_unquoted_result
@@ -5227,21 +6626,21 @@ func_mode_link ()
 
        case $prev in
        bindir)
 
        case $prev in
        bindir)
-         bindir="$arg"
+         bindir=$arg
          prev=
          continue
          ;;
        dlfiles|dlprefiles)
          prev=
          continue
          ;;
        dlfiles|dlprefiles)
-         if test "$preload" = no; then
+         $preload || {
            # Add the symbol object into the linking commands.
            func_append compile_command " @SYMFILE@"
            func_append finalize_command " @SYMFILE@"
            # Add the symbol object into the linking commands.
            func_append compile_command " @SYMFILE@"
            func_append finalize_command " @SYMFILE@"
-           preload=yes
-         fi
+           preload=:
+         }
          case $arg in
          *.la | *.lo) ;;  # We handle these cases below.
          force)
          case $arg in
          *.la | *.lo) ;;  # We handle these cases below.
          force)
-           if test "$dlself" = no; then
+           if test no = "$dlself"; then
              dlself=needless
              export_dynamic=yes
            fi
              dlself=needless
              export_dynamic=yes
            fi
@@ -5249,9 +6648,9 @@ func_mode_link ()
            continue
            ;;
          self)
            continue
            ;;
          self)
-           if test "$prev" = dlprefiles; then
+           if test dlprefiles = "$prev"; then
              dlself=yes
              dlself=yes
-           elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+           elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
              dlself=yes
            else
              dlself=needless
              dlself=yes
            else
              dlself=needless
@@ -5261,7 +6660,7 @@ func_mode_link ()
            continue
            ;;
          *)
            continue
            ;;
          *)
-           if test "$prev" = dlfiles; then
+           if test dlfiles = "$prev"; then
              func_append dlfiles " $arg"
            else
              func_append dlprefiles " $arg"
              func_append dlfiles " $arg"
            else
              func_append dlprefiles " $arg"
@@ -5272,14 +6671,14 @@ func_mode_link ()
          esac
          ;;
        expsyms)
          esac
          ;;
        expsyms)
-         export_symbols="$arg"
+         export_symbols=$arg
          test -f "$arg" \
          test -f "$arg" \
-           || func_fatal_error "symbol file \`$arg' does not exist"
+           || func_fatal_error "symbol file '$arg' does not exist"
          prev=
          continue
          ;;
        expsyms_regex)
          prev=
          continue
          ;;
        expsyms_regex)
-         export_symbols_regex="$arg"
+         export_symbols_regex=$arg
          prev=
          continue
          ;;
          prev=
          continue
          ;;
@@ -5297,7 +6696,13 @@ func_mode_link ()
          continue
          ;;
        inst_prefix)
          continue
          ;;
        inst_prefix)
-         inst_prefix_dir="$arg"
+         inst_prefix_dir=$arg
+         prev=
+         continue
+         ;;
+       mllvm)
+         # Clang does not use LLVM to link, so we can simply discard any
+         # '-mllvm $arg' options when doing the link step.
          prev=
          continue
          ;;
          prev=
          continue
          ;;
@@ -5321,21 +6726,21 @@ func_mode_link ()
 
                if test -z "$pic_object" ||
                   test -z "$non_pic_object" ||
 
                if test -z "$pic_object" ||
                   test -z "$non_pic_object" ||
-                  test "$pic_object" = none &&
-                  test "$non_pic_object" = none; then
-                 func_fatal_error "cannot find name of object for \`$arg'"
+                  test none = "$pic_object" &&
+                  test none = "$non_pic_object"; then
+                 func_fatal_error "cannot find name of object for '$arg'"
                fi
 
                # Extract subdirectory from the argument.
                func_dirname "$arg" "/" ""
                fi
 
                # Extract subdirectory from the argument.
                func_dirname "$arg" "/" ""
-               xdir="$func_dirname_result"
+               xdir=$func_dirname_result
 
 
-               if test "$pic_object" != none; then
+               if test none != "$pic_object"; then
                  # Prepend the subdirectory the object is found in.
                  # Prepend the subdirectory the object is found in.
-                 pic_object="$xdir$pic_object"
+                 pic_object=$xdir$pic_object
 
 
-                 if test "$prev" = dlfiles; then
-                   if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+                 if test dlfiles = "$prev"; then
+                   if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
                      func_append dlfiles " $pic_object"
                      prev=
                      continue
                      func_append dlfiles " $pic_object"
                      prev=
                      continue
@@ -5346,7 +6751,7 @@ func_mode_link ()
                  fi
 
                  # CHECK ME:  I think I busted this.  -Ossama
                  fi
 
                  # CHECK ME:  I think I busted this.  -Ossama
-                 if test "$prev" = dlprefiles; then
+                 if test dlprefiles = "$prev"; then
                    # Preload the old-style object.
                    func_append dlprefiles " $pic_object"
                    prev=
                    # Preload the old-style object.
                    func_append dlprefiles " $pic_object"
                    prev=
@@ -5354,23 +6759,23 @@ func_mode_link ()
 
                  # A PIC object.
                  func_append libobjs " $pic_object"
 
                  # A PIC object.
                  func_append libobjs " $pic_object"
-                 arg="$pic_object"
+                 arg=$pic_object
                fi
 
                # Non-PIC object.
                fi
 
                # Non-PIC object.
-               if test "$non_pic_object" != none; then
+               if test none != "$non_pic_object"; then
                  # Prepend the subdirectory the object is found in.
                  # Prepend the subdirectory the object is found in.
-                 non_pic_object="$xdir$non_pic_object"
+                 non_pic_object=$xdir$non_pic_object
 
                  # A standard non-PIC object
                  func_append non_pic_objects " $non_pic_object"
 
                  # A standard non-PIC object
                  func_append non_pic_objects " $non_pic_object"
-                 if test -z "$pic_object" || test "$pic_object" = none ; then
-                   arg="$non_pic_object"
+                 if test -z "$pic_object" || test none = "$pic_object"; then
+                   arg=$non_pic_object
                  fi
                else
                  # If the PIC object exists, use it instead.
                  # $xdir was prepended to $pic_object above.
                  fi
                else
                  # If the PIC object exists, use it instead.
                  # $xdir was prepended to $pic_object above.
-                 non_pic_object="$pic_object"
+                 non_pic_object=$pic_object
                  func_append non_pic_objects " $non_pic_object"
                fi
              else
                  func_append non_pic_objects " $non_pic_object"
                fi
              else
@@ -5378,7 +6783,7 @@ func_mode_link ()
                if $opt_dry_run; then
                  # Extract subdirectory from the argument.
                  func_dirname "$arg" "/" ""
                if $opt_dry_run; then
                  # Extract subdirectory from the argument.
                  func_dirname "$arg" "/" ""
-                 xdir="$func_dirname_result"
+                 xdir=$func_dirname_result
 
                  func_lo2o "$arg"
                  pic_object=$xdir$objdir/$func_lo2o_result
 
                  func_lo2o "$arg"
                  pic_object=$xdir$objdir/$func_lo2o_result
@@ -5386,24 +6791,29 @@ func_mode_link ()
                  func_append libobjs " $pic_object"
                  func_append non_pic_objects " $non_pic_object"
                else
                  func_append libobjs " $pic_object"
                  func_append non_pic_objects " $non_pic_object"
                else
-                 func_fatal_error "\`$arg' is not a valid libtool object"
+                 func_fatal_error "'$arg' is not a valid libtool object"
                fi
              fi
            done
          else
                fi
              fi
            done
          else
-           func_fatal_error "link input file \`$arg' does not exist"
+           func_fatal_error "link input file '$arg' does not exist"
          fi
          arg=$save_arg
          prev=
          continue
          ;;
          fi
          arg=$save_arg
          prev=
          continue
          ;;
+       os2dllname)
+         os2dllname=$arg
+         prev=
+         continue
+         ;;
        precious_regex)
        precious_regex)
-         precious_files_regex="$arg"
+         precious_files_regex=$arg
          prev=
          continue
          ;;
        release)
          prev=
          continue
          ;;
        release)
-         release="-$arg"
+         release=-$arg
          prev=
          continue
          ;;
          prev=
          continue
          ;;
@@ -5415,7 +6825,7 @@ func_mode_link ()
            func_fatal_error "only absolute run-paths are allowed"
            ;;
          esac
            func_fatal_error "only absolute run-paths are allowed"
            ;;
          esac
-         if test "$prev" = rpath; then
+         if test rpath = "$prev"; then
            case "$rpath " in
            *" $arg "*) ;;
            *) func_append rpath " $arg" ;;
            case "$rpath " in
            *" $arg "*) ;;
            *) func_append rpath " $arg" ;;
@@ -5430,7 +6840,7 @@ func_mode_link ()
          continue
          ;;
        shrext)
          continue
          ;;
        shrext)
-         shrext_cmds="$arg"
+         shrext_cmds=$arg
          prev=
          continue
          ;;
          prev=
          continue
          ;;
@@ -5470,7 +6880,7 @@ func_mode_link ()
        esac
       fi # test -n "$prev"
 
        esac
       fi # test -n "$prev"
 
-      prevarg="$arg"
+      prevarg=$arg
 
       case $arg in
       -all-static)
 
       case $arg in
       -all-static)
@@ -5484,7 +6894,7 @@ func_mode_link ()
 
       -allow-undefined)
        # FIXME: remove this flag sometime in the future.
 
       -allow-undefined)
        # FIXME: remove this flag sometime in the future.
-       func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+       func_fatal_error "'-allow-undefined' must not be used because it is the default"
        ;;
 
       -avoid-version)
        ;;
 
       -avoid-version)
@@ -5516,7 +6926,7 @@ func_mode_link ()
        if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
          func_fatal_error "more than one -exported-symbols argument is not allowed"
        fi
        if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
          func_fatal_error "more than one -exported-symbols argument is not allowed"
        fi
-       if test "X$arg" = "X-export-symbols"; then
+       if test X-export-symbols = "X$arg"; then
          prev=expsyms
        else
          prev=expsyms_regex
          prev=expsyms
        else
          prev=expsyms_regex
@@ -5550,9 +6960,9 @@ func_mode_link ()
        func_stripname "-L" '' "$arg"
        if test -z "$func_stripname_result"; then
          if test "$#" -gt 0; then
        func_stripname "-L" '' "$arg"
        if test -z "$func_stripname_result"; then
          if test "$#" -gt 0; then
-           func_fatal_error "require no space between \`-L' and \`$1'"
+           func_fatal_error "require no space between '-L' and '$1'"
          else
          else
-           func_fatal_error "need path for \`-L' option"
+           func_fatal_error "need path for '-L' option"
          fi
        fi
        func_resolve_sysroot "$func_stripname_result"
          fi
        fi
        func_resolve_sysroot "$func_stripname_result"
@@ -5563,8 +6973,8 @@ func_mode_link ()
        *)
          absdir=`cd "$dir" && pwd`
          test -z "$absdir" && \
        *)
          absdir=`cd "$dir" && pwd`
          test -z "$absdir" && \
-           func_fatal_error "cannot determine absolute directory name of \`$dir'"
-         dir="$absdir"
+           func_fatal_error "cannot determine absolute directory name of '$dir'"
+         dir=$absdir
          ;;
        esac
        case "$deplibs " in
          ;;
        esac
        case "$deplibs " in
@@ -5599,7 +7009,7 @@ func_mode_link ()
        ;;
 
       -l*)
        ;;
 
       -l*)
-       if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+       if test X-lc = "X$arg" || test X-lm = "X$arg"; then
          case $host in
          *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
            # These systems don't actually have a C or math library (as such)
          case $host in
          *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
            # These systems don't actually have a C or math library (as such)
@@ -5607,11 +7017,11 @@ func_mode_link ()
            ;;
          *-*-os2*)
            # These systems don't actually have a C library (as such)
            ;;
          *-*-os2*)
            # These systems don't actually have a C library (as such)
-           test "X$arg" = "X-lc" && continue
+           test X-lc = "X$arg" && continue
            ;;
            ;;
-         *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+         *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
            # Do not include libc due to us having libc/libc_r.
            # Do not include libc due to us having libc/libc_r.
-           test "X$arg" = "X-lc" && continue
+           test X-lc = "X$arg" && continue
            ;;
          *-*-rhapsody* | *-*-darwin1.[012])
            # Rhapsody C and math libraries are in the System framework
            ;;
          *-*-rhapsody* | *-*-darwin1.[012])
            # Rhapsody C and math libraries are in the System framework
@@ -5620,16 +7030,16 @@ func_mode_link ()
            ;;
          *-*-sco3.2v5* | *-*-sco5v6*)
            # Causes problems with __ctype
            ;;
          *-*-sco3.2v5* | *-*-sco5v6*)
            # Causes problems with __ctype
-           test "X$arg" = "X-lc" && continue
+           test X-lc = "X$arg" && continue
            ;;
          *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
            # Compiler inserts libc in the correct place for threads to work
            ;;
          *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
            # Compiler inserts libc in the correct place for threads to work
-           test "X$arg" = "X-lc" && continue
+           test X-lc = "X$arg" && continue
            ;;
          esac
            ;;
          esac
-       elif test "X$arg" = "X-lc_r"; then
+       elif test X-lc_r = "X$arg"; then
         case $host in
         case $host in
-        *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+        *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
           # Do not include libc_r directly, use -pthread flag.
           continue
           ;;
           # Do not include libc_r directly, use -pthread flag.
           continue
           ;;
@@ -5639,6 +7049,11 @@ func_mode_link ()
        continue
        ;;
 
        continue
        ;;
 
+      -mllvm)
+       prev=mllvm
+       continue
+       ;;
+
       -module)
        module=yes
        continue
       -module)
        module=yes
        continue
@@ -5668,7 +7083,7 @@ func_mode_link ()
        ;;
 
       -multi_module)
        ;;
 
       -multi_module)
-       single_module="${wl}-multi_module"
+       single_module=$wl-multi_module
        continue
        ;;
 
        continue
        ;;
 
@@ -5682,8 +7097,8 @@ func_mode_link ()
        *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
          # The PATH hackery in wrapper scripts is required on Windows
          # and Darwin in order for the loader to find any dlls it needs.
        *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
          # The PATH hackery in wrapper scripts is required on Windows
          # and Darwin in order for the loader to find any dlls it needs.
-         func_warning "\`-no-install' is ignored for $host"
-         func_warning "assuming \`-no-fast-install' instead"
+         func_warning "'-no-install' is ignored for $host"
+         func_warning "assuming '-no-fast-install' instead"
          fast_install=no
          ;;
        *) no_install=yes ;;
          fast_install=no
          ;;
        *) no_install=yes ;;
@@ -5701,6 +7116,11 @@ func_mode_link ()
        continue
        ;;
 
        continue
        ;;
 
+      -os2dllname)
+       prev=os2dllname
+       continue
+       ;;
+
       -o) prev=output ;;
 
       -precious-files-regex)
       -o) prev=output ;;
 
       -precious-files-regex)
@@ -5788,14 +7208,14 @@ func_mode_link ()
        func_stripname '-Wc,' '' "$arg"
        args=$func_stripname_result
        arg=
        func_stripname '-Wc,' '' "$arg"
        args=$func_stripname_result
        arg=
-       save_ifs="$IFS"; IFS=','
+       save_ifs=$IFS; IFS=,
        for flag in $args; do
        for flag in $args; do
-         IFS="$save_ifs"
+         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"
        done
           func_quote_for_eval "$flag"
          func_append arg " $func_quote_for_eval_result"
          func_append compiler_flags " $func_quote_for_eval_result"
        done
-       IFS="$save_ifs"
+       IFS=$save_ifs
        func_stripname ' ' '' "$arg"
        arg=$func_stripname_result
        ;;
        func_stripname ' ' '' "$arg"
        arg=$func_stripname_result
        ;;
@@ -5804,15 +7224,15 @@ func_mode_link ()
        func_stripname '-Wl,' '' "$arg"
        args=$func_stripname_result
        arg=
        func_stripname '-Wl,' '' "$arg"
        args=$func_stripname_result
        arg=
-       save_ifs="$IFS"; IFS=','
+       save_ifs=$IFS; IFS=,
        for flag in $args; do
        for flag in $args; do
-         IFS="$save_ifs"
+         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"
        done
           func_quote_for_eval "$flag"
          func_append arg " $wl$func_quote_for_eval_result"
          func_append compiler_flags " $wl$func_quote_for_eval_result"
          func_append linker_flags " $func_quote_for_eval_result"
        done
-       IFS="$save_ifs"
+       IFS=$save_ifs
        func_stripname ' ' '' "$arg"
        arg=$func_stripname_result
        ;;
        func_stripname ' ' '' "$arg"
        arg=$func_stripname_result
        ;;
@@ -5835,7 +7255,7 @@ func_mode_link ()
       # -msg_* for osf cc
       -msg_*)
        func_quote_for_eval "$arg"
       # -msg_* for osf cc
       -msg_*)
        func_quote_for_eval "$arg"
-       arg="$func_quote_for_eval_result"
+       arg=$func_quote_for_eval_result
        ;;
 
       # Flags to be passed through unchanged, with rationale:
        ;;
 
       # Flags to be passed through unchanged, with rationale:
@@ -5847,25 +7267,49 @@ func_mode_link ()
       # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
       # -F/path              path to uninstalled frameworks, gcc on darwin
       # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
       # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
       # -F/path              path to uninstalled frameworks, gcc on darwin
       # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # -fstack-protector*   stack protector flags for GCC
       # @file                GCC response files
       # -tp=*                Portland pgcc target processor selection
       # --sysroot=*          for sysroot support
       # @file                GCC response files
       # -tp=*                Portland pgcc target processor selection
       # --sysroot=*          for sysroot support
-      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -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
       -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=*| \
       -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*|-flto*|-fwhopr*|-fuse-linker-plugin)
+      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+      -specs=*|-fsanitize=*)
         func_quote_for_eval "$arg"
         func_quote_for_eval "$arg"
-       arg="$func_quote_for_eval_result"
+       arg=$func_quote_for_eval_result
         func_append compile_command " $arg"
         func_append finalize_command " $arg"
         func_append compiler_flags " $arg"
         continue
         ;;
 
         func_append compile_command " $arg"
         func_append finalize_command " $arg"
         func_append compiler_flags " $arg"
         continue
         ;;
 
+      -Z*)
+        if test os2 = "`expr $host : '.*\(os2\)'`"; then
+          # OS/2 uses -Zxxx to specify OS/2-specific options
+         compiler_flags="$compiler_flags $arg"
+         func_append compile_command " $arg"
+         func_append finalize_command " $arg"
+         case $arg in
+         -Zlinker | -Zstack)
+           prev=xcompiler
+           ;;
+         esac
+         continue
+        else
+         # Otherwise treat like 'Some other compiler flag' below
+         func_quote_for_eval "$arg"
+         arg=$func_quote_for_eval_result
+        fi
+       ;;
+
       # Some other compiler flag.
       -* | +*)
         func_quote_for_eval "$arg"
       # Some other compiler flag.
       -* | +*)
         func_quote_for_eval "$arg"
-       arg="$func_quote_for_eval_result"
+       arg=$func_quote_for_eval_result
        ;;
 
       *.$objext)
        ;;
 
       *.$objext)
@@ -5886,21 +7330,21 @@ func_mode_link ()
 
          if test -z "$pic_object" ||
             test -z "$non_pic_object" ||
 
          if test -z "$pic_object" ||
             test -z "$non_pic_object" ||
-            test "$pic_object" = none &&
-            test "$non_pic_object" = none; then
-           func_fatal_error "cannot find name of object for \`$arg'"
+            test none = "$pic_object" &&
+            test none = "$non_pic_object"; then
+           func_fatal_error "cannot find name of object for '$arg'"
          fi
 
          # Extract subdirectory from the argument.
          func_dirname "$arg" "/" ""
          fi
 
          # Extract subdirectory from the argument.
          func_dirname "$arg" "/" ""
-         xdir="$func_dirname_result"
+         xdir=$func_dirname_result
 
 
-         if test "$pic_object" != none; then
+         test none = "$pic_object" || {
            # Prepend the subdirectory the object is found in.
            # Prepend the subdirectory the object is found in.
-           pic_object="$xdir$pic_object"
+           pic_object=$xdir$pic_object
 
 
-           if test "$prev" = dlfiles; then
-             if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+           if test dlfiles = "$prev"; then
+             if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
                func_append dlfiles " $pic_object"
                prev=
                continue
                func_append dlfiles " $pic_object"
                prev=
                continue
@@ -5911,7 +7355,7 @@ func_mode_link ()
            fi
 
            # CHECK ME:  I think I busted this.  -Ossama
            fi
 
            # CHECK ME:  I think I busted this.  -Ossama
-           if test "$prev" = dlprefiles; then
+           if test dlprefiles = "$prev"; then
              # Preload the old-style object.
              func_append dlprefiles " $pic_object"
              prev=
              # Preload the old-style object.
              func_append dlprefiles " $pic_object"
              prev=
@@ -5919,23 +7363,23 @@ func_mode_link ()
 
            # A PIC object.
            func_append libobjs " $pic_object"
 
            # A PIC object.
            func_append libobjs " $pic_object"
-           arg="$pic_object"
-         fi
+           arg=$pic_object
+         }
 
          # Non-PIC object.
 
          # Non-PIC object.
-         if test "$non_pic_object" != none; then
+         if test none != "$non_pic_object"; then
            # Prepend the subdirectory the object is found in.
            # Prepend the subdirectory the object is found in.
-           non_pic_object="$xdir$non_pic_object"
+           non_pic_object=$xdir$non_pic_object
 
            # A standard non-PIC object
            func_append non_pic_objects " $non_pic_object"
 
            # A standard non-PIC object
            func_append non_pic_objects " $non_pic_object"
-           if test -z "$pic_object" || test "$pic_object" = none ; then
-             arg="$non_pic_object"
+           if test -z "$pic_object" || test none = "$pic_object"; then
+             arg=$non_pic_object
            fi
          else
            # If the PIC object exists, use it instead.
            # $xdir was prepended to $pic_object above.
            fi
          else
            # If the PIC object exists, use it instead.
            # $xdir was prepended to $pic_object above.
-           non_pic_object="$pic_object"
+           non_pic_object=$pic_object
            func_append non_pic_objects " $non_pic_object"
          fi
        else
            func_append non_pic_objects " $non_pic_object"
          fi
        else
@@ -5943,7 +7387,7 @@ func_mode_link ()
          if $opt_dry_run; then
            # Extract subdirectory from the argument.
            func_dirname "$arg" "/" ""
          if $opt_dry_run; then
            # Extract subdirectory from the argument.
            func_dirname "$arg" "/" ""
-           xdir="$func_dirname_result"
+           xdir=$func_dirname_result
 
            func_lo2o "$arg"
            pic_object=$xdir$objdir/$func_lo2o_result
 
            func_lo2o "$arg"
            pic_object=$xdir$objdir/$func_lo2o_result
@@ -5951,7 +7395,7 @@ func_mode_link ()
            func_append libobjs " $pic_object"
            func_append non_pic_objects " $non_pic_object"
          else
            func_append libobjs " $pic_object"
            func_append non_pic_objects " $non_pic_object"
          else
-           func_fatal_error "\`$arg' is not a valid libtool object"
+           func_fatal_error "'$arg' is not a valid libtool object"
          fi
        fi
        ;;
          fi
        fi
        ;;
@@ -5967,11 +7411,11 @@ func_mode_link ()
        # A libtool-controlled library.
 
        func_resolve_sysroot "$arg"
        # A libtool-controlled library.
 
        func_resolve_sysroot "$arg"
-       if test "$prev" = dlfiles; then
+       if test dlfiles = "$prev"; then
          # This library was specified with -dlopen.
          func_append dlfiles " $func_resolve_sysroot_result"
          prev=
          # This library was specified with -dlopen.
          func_append dlfiles " $func_resolve_sysroot_result"
          prev=
-       elif test "$prev" = dlprefiles; then
+       elif test dlprefiles = "$prev"; then
          # The library was specified with -dlpreopen.
          func_append dlprefiles " $func_resolve_sysroot_result"
          prev=
          # The library was specified with -dlpreopen.
          func_append dlprefiles " $func_resolve_sysroot_result"
          prev=
@@ -5986,7 +7430,7 @@ 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"
        # 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"
+       arg=$func_quote_for_eval_result
        ;;
       esac # arg
 
        ;;
       esac # arg
 
@@ -5998,9 +7442,9 @@ func_mode_link ()
     done # argument parsing loop
 
     test -n "$prev" && \
     done # argument parsing loop
 
     test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
+      func_fatal_help "the '$prevarg' option requires an argument"
 
 
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+    if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
       eval arg=\"$export_dynamic_flag_spec\"
       func_append compile_command " $arg"
       func_append finalize_command " $arg"
       eval arg=\"$export_dynamic_flag_spec\"
       func_append compile_command " $arg"
       func_append finalize_command " $arg"
@@ -6009,20 +7453,23 @@ func_mode_link ()
     oldlibs=
     # calculate the name of the file, without its directory
     func_basename "$output"
     oldlibs=
     # calculate the name of the file, without its directory
     func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
+    outputname=$func_basename_result
+    libobjs_save=$libobjs
 
     if test -n "$shlibpath_var"; then
       # get the directories listed in $shlibpath_var
 
     if test -n "$shlibpath_var"; then
       # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+      eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
     else
       shlib_search_path=
     fi
     eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
     eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
 
     else
       shlib_search_path=
     fi
     eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
     eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
 
+    # Definition is injected by LT_CONFIG during libtool generation.
+    func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
     func_dirname "$output" "/" ""
     func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
+    output_objdir=$func_dirname_result$objdir
     func_to_tool_file "$output_objdir/"
     tool_output_objdir=$func_to_tool_file_result
     # Create the object directory.
     func_to_tool_file "$output_objdir/"
     tool_output_objdir=$func_to_tool_file_result
     # Create the object directory.
@@ -6045,7 +7492,7 @@ func_mode_link ()
     # Find all interdependent deplibs by searching for libraries
     # that are linked more than once (e.g. -la -lb -la)
     for deplib in $deplibs; do
     # Find all interdependent deplibs by searching for libraries
     # that are linked more than once (e.g. -la -lb -la)
     for deplib in $deplibs; do
-      if $opt_preserve_dup_deps ; then
+      if $opt_preserve_dup_deps; then
        case "$libs " in
        *" $deplib "*) func_append specialdeplibs " $deplib" ;;
        esac
        case "$libs " in
        *" $deplib "*) func_append specialdeplibs " $deplib" ;;
        esac
@@ -6053,7 +7500,7 @@ func_mode_link ()
       func_append libs " $deplib"
     done
 
       func_append libs " $deplib"
     done
 
-    if test "$linkmode" = lib; then
+    if test lib = "$linkmode"; then
       libs="$predeps $libs $compiler_lib_search_path $postdeps"
 
       # Compute libraries that are listed more than once in $predeps
       libs="$predeps $libs $compiler_lib_search_path $postdeps"
 
       # Compute libraries that are listed more than once in $predeps
@@ -6085,7 +7532,7 @@ func_mode_link ()
          case $file in
          *.la) ;;
          *)
          case $file in
          *.la) ;;
          *)
-           func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+           func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
            ;;
          esac
        done
            ;;
          esac
        done
@@ -6093,7 +7540,7 @@ func_mode_link ()
     prog)
        compile_deplibs=
        finalize_deplibs=
     prog)
        compile_deplibs=
        finalize_deplibs=
-       alldeplibs=no
+       alldeplibs=false
        newdlfiles=
        newdlprefiles=
        passes="conv scan dlopen dlpreopen link"
        newdlfiles=
        newdlprefiles=
        passes="conv scan dlopen dlpreopen link"
@@ -6105,32 +7552,32 @@ func_mode_link ()
     for pass in $passes; do
       # The preopen pass in lib mode reverses $deplibs; put it back here
       # so that -L comes before libs that need it for instance...
     for pass in $passes; do
       # The preopen pass in lib mode reverses $deplibs; put it back here
       # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
+      if test lib,link = "$linkmode,$pass"; then
        ## FIXME: Find the place where the list is rebuilt in the wrong
        ##        order, and fix it there properly
         tmp_deplibs=
        for deplib in $deplibs; do
          tmp_deplibs="$deplib $tmp_deplibs"
        done
        ## FIXME: Find the place where the list is rebuilt in the wrong
        ##        order, and fix it there properly
         tmp_deplibs=
        for deplib in $deplibs; do
          tmp_deplibs="$deplib $tmp_deplibs"
        done
-       deplibs="$tmp_deplibs"
+       deplibs=$tmp_deplibs
       fi
 
       fi
 
-      if test "$linkmode,$pass" = "lib,link" ||
-        test "$linkmode,$pass" = "prog,scan"; then
-       libs="$deplibs"
+      if test lib,link = "$linkmode,$pass" ||
+        test prog,scan = "$linkmode,$pass"; then
+       libs=$deplibs
        deplibs=
       fi
        deplibs=
       fi
-      if test "$linkmode" = prog; then
+      if test prog = "$linkmode"; then
        case $pass in
        case $pass in
-       dlopen) libs="$dlfiles" ;;
-       dlpreopen) libs="$dlprefiles" ;;
+       dlopen) libs=$dlfiles ;;
+       dlpreopen) libs=$dlprefiles ;;
        link)
          libs="$deplibs %DEPLIBS%"
          test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
          ;;
        esac
       fi
        link)
          libs="$deplibs %DEPLIBS%"
          test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
          ;;
        esac
       fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+      if test lib,dlpreopen = "$linkmode,$pass"; then
        # Collect and forward deplibs of preopened libtool libs
        for lib in $dlprefiles; do
          # Ignore non-libtool-libs
        # Collect and forward deplibs of preopened libtool libs
        for lib in $dlprefiles; do
          # Ignore non-libtool-libs
@@ -6151,26 +7598,26 @@ func_mode_link ()
            esac
          done
        done
            esac
          done
        done
-       libs="$dlprefiles"
+       libs=$dlprefiles
       fi
       fi
-      if test "$pass" = dlopen; then
+      if test dlopen = "$pass"; then
        # Collect dlpreopened libraries
        # Collect dlpreopened libraries
-       save_deplibs="$deplibs"
+       save_deplibs=$deplibs
        deplibs=
       fi
 
       for deplib in $libs; do
        lib=
        deplibs=
       fi
 
       for deplib in $libs; do
        lib=
-       found=no
+       found=false
        case $deplib in
        -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
         |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
        case $deplib in
        -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
         |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
-         if test "$linkmode,$pass" = "prog,link"; then
+         if test prog,link = "$linkmode,$pass"; then
            compile_deplibs="$deplib $compile_deplibs"
            finalize_deplibs="$deplib $finalize_deplibs"
          else
            func_append compiler_flags " $deplib"
            compile_deplibs="$deplib $compile_deplibs"
            finalize_deplibs="$deplib $finalize_deplibs"
          else
            func_append compiler_flags " $deplib"
-           if test "$linkmode" = lib ; then
+           if test lib = "$linkmode"; then
                case "$new_inherited_linker_flags " in
                    *" $deplib "*) ;;
                    * ) func_append new_inherited_linker_flags " $deplib" ;;
                case "$new_inherited_linker_flags " in
                    *" $deplib "*) ;;
                    * ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6180,13 +7627,13 @@ func_mode_link ()
          continue
          ;;
        -l*)
          continue
          ;;
        -l*)
-         if test "$linkmode" != lib && test "$linkmode" != prog; then
-           func_warning "\`-l' is ignored for archives/objects"
+         if test lib != "$linkmode" && test prog != "$linkmode"; then
+           func_warning "'-l' is ignored for archives/objects"
            continue
          fi
          func_stripname '-l' '' "$deplib"
          name=$func_stripname_result
            continue
          fi
          func_stripname '-l' '' "$deplib"
          name=$func_stripname_result
-         if test "$linkmode" = lib; then
+         if test lib = "$linkmode"; then
            searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
          else
            searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
            searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
          else
            searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
@@ -6194,31 +7641,22 @@ func_mode_link ()
          for searchdir in $searchdirs; do
            for search_ext in .la $std_shrext .so .a; do
              # Search the libtool library
          for searchdir in $searchdirs; do
            for search_ext in .la $std_shrext .so .a; do
              # Search the libtool library
-             lib="$searchdir/lib${name}${search_ext}"
+             lib=$searchdir/lib$name$search_ext
              if test -f "$lib"; then
              if test -f "$lib"; then
-               if test "$search_ext" = ".la"; then
-                 found=yes
+               if test .la = "$search_ext"; then
+                 found=:
                else
                else
-                 found=no
+                 found=false
                fi
                break 2
              fi
            done
          done
                fi
                break 2
              fi
            done
          done
-         if test "$found" != yes; then
-           # deplib doesn't seem to be a libtool library
-           if test "$linkmode,$pass" = "prog,link"; then
-             compile_deplibs="$deplib $compile_deplibs"
-             finalize_deplibs="$deplib $finalize_deplibs"
-           else
-             deplibs="$deplib $deplibs"
-             test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-           fi
-           continue
-         else # deplib is a libtool library
+         if $found; then
+           # deplib is a libtool library
            # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
            # We need to do some special things here, and not later.
            # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
            # We need to do some special things here, and not later.
-           if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+           if test yes = "$allow_libtool_libs_with_static_runtimes"; then
              case " $predeps $postdeps " in
              *" $deplib "*)
                if func_lalib_p "$lib"; then
              case " $predeps $postdeps " in
              *" $deplib "*)
                if func_lalib_p "$lib"; then
@@ -6226,19 +7664,19 @@ func_mode_link ()
                  old_library=
                  func_source "$lib"
                  for l in $old_library $library_names; do
                  old_library=
                  func_source "$lib"
                  for l in $old_library $library_names; do
-                   ll="$l"
+                   ll=$l
                  done
                  done
-                 if test "X$ll" = "X$old_library" ; then # only static version available
-                   found=no
+                 if test "X$ll" = "X$old_library"; then # only static version available
+                   found=false
                    func_dirname "$lib" "" "."
                    func_dirname "$lib" "" "."
-                   ladir="$func_dirname_result"
+                   ladir=$func_dirname_result
                    lib=$ladir/$old_library
                    lib=$ladir/$old_library
-                   if test "$linkmode,$pass" = "prog,link"; then
+                   if test prog,link = "$linkmode,$pass"; then
                      compile_deplibs="$deplib $compile_deplibs"
                      finalize_deplibs="$deplib $finalize_deplibs"
                    else
                      deplibs="$deplib $deplibs"
                      compile_deplibs="$deplib $compile_deplibs"
                      finalize_deplibs="$deplib $finalize_deplibs"
                    else
                      deplibs="$deplib $deplibs"
-                     test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+                     test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
                    fi
                    continue
                  fi
                    fi
                    continue
                  fi
@@ -6247,15 +7685,25 @@ func_mode_link ()
              *) ;;
              esac
            fi
              *) ;;
              esac
            fi
+         else
+           # deplib doesn't seem to be a libtool library
+           if test prog,link = "$linkmode,$pass"; then
+             compile_deplibs="$deplib $compile_deplibs"
+             finalize_deplibs="$deplib $finalize_deplibs"
+           else
+             deplibs="$deplib $deplibs"
+             test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+           fi
+           continue
          fi
          ;; # -l
        *.ltframework)
          fi
          ;; # -l
        *.ltframework)
-         if test "$linkmode,$pass" = "prog,link"; then
+         if test prog,link = "$linkmode,$pass"; then
            compile_deplibs="$deplib $compile_deplibs"
            finalize_deplibs="$deplib $finalize_deplibs"
          else
            deplibs="$deplib $deplibs"
            compile_deplibs="$deplib $compile_deplibs"
            finalize_deplibs="$deplib $finalize_deplibs"
          else
            deplibs="$deplib $deplibs"
-           if test "$linkmode" = lib ; then
+           if test lib = "$linkmode"; then
                case "$new_inherited_linker_flags " in
                    *" $deplib "*) ;;
                    * ) func_append new_inherited_linker_flags " $deplib" ;;
                case "$new_inherited_linker_flags " in
                    *" $deplib "*) ;;
                    * ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6268,18 +7716,18 @@ func_mode_link ()
          case $linkmode in
          lib)
            deplibs="$deplib $deplibs"
          case $linkmode in
          lib)
            deplibs="$deplib $deplibs"
-           test "$pass" = conv && continue
+           test conv = "$pass" && continue
            newdependency_libs="$deplib $newdependency_libs"
            func_stripname '-L' '' "$deplib"
            func_resolve_sysroot "$func_stripname_result"
            func_append newlib_search_path " $func_resolve_sysroot_result"
            ;;
          prog)
            newdependency_libs="$deplib $newdependency_libs"
            func_stripname '-L' '' "$deplib"
            func_resolve_sysroot "$func_stripname_result"
            func_append newlib_search_path " $func_resolve_sysroot_result"
            ;;
          prog)
-           if test "$pass" = conv; then
+           if test conv = "$pass"; then
              deplibs="$deplib $deplibs"
              continue
            fi
              deplibs="$deplib $deplibs"
              continue
            fi
-           if test "$pass" = scan; then
+           if test scan = "$pass"; then
              deplibs="$deplib $deplibs"
            else
              compile_deplibs="$deplib $compile_deplibs"
              deplibs="$deplib $deplibs"
            else
              compile_deplibs="$deplib $compile_deplibs"
@@ -6290,13 +7738,13 @@ func_mode_link ()
            func_append newlib_search_path " $func_resolve_sysroot_result"
            ;;
          *)
            func_append newlib_search_path " $func_resolve_sysroot_result"
            ;;
          *)
-           func_warning "\`-L' is ignored for archives/objects"
+           func_warning "'-L' is ignored for archives/objects"
            ;;
          esac # linkmode
          continue
          ;; # -L
        -R*)
            ;;
          esac # linkmode
          continue
          ;; # -L
        -R*)
-         if test "$pass" = link; then
+         if test link = "$pass"; then
            func_stripname '-R' '' "$deplib"
            func_resolve_sysroot "$func_stripname_result"
            dir=$func_resolve_sysroot_result
            func_stripname '-R' '' "$deplib"
            func_resolve_sysroot "$func_stripname_result"
            dir=$func_resolve_sysroot_result
@@ -6314,7 +7762,7 @@ func_mode_link ()
          lib=$func_resolve_sysroot_result
          ;;
        *.$libext)
          lib=$func_resolve_sysroot_result
          ;;
        *.$libext)
-         if test "$pass" = conv; then
+         if test conv = "$pass"; then
            deplibs="$deplib $deplibs"
            continue
          fi
            deplibs="$deplib $deplibs"
            continue
          fi
@@ -6325,21 +7773,26 @@ func_mode_link ()
            case " $dlpreconveniencelibs " in
            *" $deplib "*) ;;
            *)
            case " $dlpreconveniencelibs " in
            *" $deplib "*) ;;
            *)
-             valid_a_lib=no
+             valid_a_lib=false
              case $deplibs_check_method in
                match_pattern*)
                  set dummy $deplibs_check_method; shift
                  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
                  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
                    | $EGREP "$match_pattern_regex" > /dev/null; then
              case $deplibs_check_method in
                match_pattern*)
                  set dummy $deplibs_check_method; shift
                  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
                  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
                    | $EGREP "$match_pattern_regex" > /dev/null; then
-                   valid_a_lib=yes
+                   valid_a_lib=:
                  fi
                ;;
                pass_all)
                  fi
                ;;
                pass_all)
-                 valid_a_lib=yes
+                 valid_a_lib=:
                ;;
              esac
                ;;
              esac
-             if test "$valid_a_lib" != yes; then
+             if $valid_a_lib; then
+               echo
+               $ECHO "*** Warning: Linking the shared library $output against the"
+               $ECHO "*** static library $deplib is not portable!"
+               deplibs="$deplib $deplibs"
+             else
                echo
                $ECHO "*** Warning: Trying to link with static lib archive $deplib."
                echo "*** I have the capability to make that library automatically link in when"
                echo
                $ECHO "*** Warning: Trying to link with static lib archive $deplib."
                echo "*** I have the capability to make that library automatically link in when"
@@ -6347,18 +7800,13 @@ func_mode_link ()
                echo "*** shared version of the library, which you do not appear to have"
                echo "*** because the file extensions .$libext of this argument makes me believe"
                echo "*** that it is just a static archive that I should not use here."
                echo "*** shared version of the library, which you do not appear to have"
                echo "*** because the file extensions .$libext of this argument makes me believe"
                echo "*** that it is just a static archive that I should not use here."
-             else
-               echo
-               $ECHO "*** Warning: Linking the shared library $output against the"
-               $ECHO "*** static library $deplib is not portable!"
-               deplibs="$deplib $deplibs"
              fi
              ;;
            esac
            continue
            ;;
          prog)
              fi
              ;;
            esac
            continue
            ;;
          prog)
-           if test "$pass" != link; then
+           if test link != "$pass"; then
              deplibs="$deplib $deplibs"
            else
              compile_deplibs="$deplib $compile_deplibs"
              deplibs="$deplib $deplibs"
            else
              compile_deplibs="$deplib $compile_deplibs"
@@ -6369,10 +7817,10 @@ func_mode_link ()
          esac # linkmode
          ;; # *.$libext
        *.lo | *.$objext)
          esac # linkmode
          ;; # *.$libext
        *.lo | *.$objext)
-         if test "$pass" = conv; then
+         if test conv = "$pass"; then
            deplibs="$deplib $deplibs"
            deplibs="$deplib $deplibs"
-         elif test "$linkmode" = prog; then
-           if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+         elif test prog = "$linkmode"; then
+           if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
              # If there is no dlopen support or we're linking statically,
              # we need to preload.
              func_append newdlprefiles " $deplib"
              # If there is no dlopen support or we're linking statically,
              # we need to preload.
              func_append newdlprefiles " $deplib"
@@ -6385,22 +7833,20 @@ func_mode_link ()
          continue
          ;;
        %DEPLIBS%)
          continue
          ;;
        %DEPLIBS%)
-         alldeplibs=yes
+         alldeplibs=:
          continue
          ;;
        esac # case $deplib
 
          continue
          ;;
        esac # case $deplib
 
-       if test "$found" = yes || test -f "$lib"; then :
-       else
-         func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-       fi
+       $found || test -f "$lib" \
+         || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
 
        # Check to see that this really is a libtool archive.
        func_lalib_unsafe_p "$lib" \
 
        # Check to see that this really is a libtool archive.
        func_lalib_unsafe_p "$lib" \
-         || func_fatal_error "\`$lib' is not a valid libtool archive"
+         || func_fatal_error "'$lib' is not a valid libtool archive"
 
        func_dirname "$lib" "" "."
 
        func_dirname "$lib" "" "."
-       ladir="$func_dirname_result"
+       ladir=$func_dirname_result
 
        dlname=
        dlopen=
 
        dlname=
        dlopen=
@@ -6430,19 +7876,19 @@ func_mode_link ()
          done
        fi
        dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
          done
        fi
        dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-       if test "$linkmode,$pass" = "lib,link" ||
-          test "$linkmode,$pass" = "prog,scan" ||
-          { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+       if test lib,link = "$linkmode,$pass" ||
+          test prog,scan = "$linkmode,$pass" ||
+          { test prog != "$linkmode" && test lib != "$linkmode"; }; then
          test -n "$dlopen" && func_append dlfiles " $dlopen"
          test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
        fi
 
          test -n "$dlopen" && func_append dlfiles " $dlopen"
          test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
        fi
 
-       if test "$pass" = conv; then
+       if test conv = "$pass"; then
          # Only check for convenience libraries
          deplibs="$lib $deplibs"
          if test -z "$libdir"; then
            if test -z "$old_library"; then
          # Only check for convenience libraries
          deplibs="$lib $deplibs"
          if test -z "$libdir"; then
            if test -z "$old_library"; then
-             func_fatal_error "cannot find name of link library for \`$lib'"
+             func_fatal_error "cannot find name of link library for '$lib'"
            fi
            # It is a libtool convenience library, so add in its objects.
            func_append convenience " $ladir/$objdir/$old_library"
            fi
            # It is a libtool convenience library, so add in its objects.
            func_append convenience " $ladir/$objdir/$old_library"
@@ -6450,15 +7896,15 @@ func_mode_link ()
            tmp_libs=
            for deplib in $dependency_libs; do
              deplibs="$deplib $deplibs"
            tmp_libs=
            for deplib in $dependency_libs; do
              deplibs="$deplib $deplibs"
-             if $opt_preserve_dup_deps ; then
+             if $opt_preserve_dup_deps; then
                case "$tmp_libs " in
                *" $deplib "*) func_append specialdeplibs " $deplib" ;;
                esac
              fi
              func_append tmp_libs " $deplib"
            done
                case "$tmp_libs " in
                *" $deplib "*) func_append specialdeplibs " $deplib" ;;
                esac
              fi
              func_append tmp_libs " $deplib"
            done
-         elif test "$linkmode" != prog && test "$linkmode" != lib; then
-           func_fatal_error "\`$lib' is not a convenience library"
+         elif test prog != "$linkmode" && test lib != "$linkmode"; then
+           func_fatal_error "'$lib' is not a convenience library"
          fi
          continue
        fi # $pass = conv
          fi
          continue
        fi # $pass = conv
@@ -6467,26 +7913,26 @@ func_mode_link ()
        # Get the name of the library we link against.
        linklib=
        if test -n "$old_library" &&
        # Get the name of the library we link against.
        linklib=
        if test -n "$old_library" &&
-          { test "$prefer_static_libs" = yes ||
-            test "$prefer_static_libs,$installed" = "built,no"; }; then
+          { test yes = "$prefer_static_libs" ||
+            test built,no = "$prefer_static_libs,$installed"; }; then
          linklib=$old_library
        else
          for l in $old_library $library_names; do
          linklib=$old_library
        else
          for l in $old_library $library_names; do
-           linklib="$l"
+           linklib=$l
          done
        fi
        if test -z "$linklib"; then
          done
        fi
        if test -z "$linklib"; then
-         func_fatal_error "cannot find name of link library for \`$lib'"
+         func_fatal_error "cannot find name of link library for '$lib'"
        fi
 
        # This library was specified with -dlopen.
        fi
 
        # This library was specified with -dlopen.
-       if test "$pass" = dlopen; then
-         if test -z "$libdir"; then
-           func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-         fi
+       if test dlopen = "$pass"; then
+         test -z "$libdir" \
+           && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
          if test -z "$dlname" ||
          if test -z "$dlname" ||
-            test "$dlopen_support" != yes ||
-            test "$build_libtool_libs" = no; then
+            test yes != "$dlopen_support" ||
+            test no = "$build_libtool_libs"
+         then
            # If there is no dlname, no dlopen support or we're linking
            # statically, we need to preload.  We also need to preload any
            # dependent libraries so libltdl's deplib preloader doesn't
            # If there is no dlname, no dlopen support or we're linking
            # statically, we need to preload.  We also need to preload any
            # dependent libraries so libltdl's deplib preloader doesn't
@@ -6500,40 +7946,40 @@ func_mode_link ()
 
        # We need an absolute path.
        case $ladir in
 
        # We need an absolute path.
        case $ladir in
-       [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+       [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
        *)
          abs_ladir=`cd "$ladir" && pwd`
          if test -z "$abs_ladir"; then
        *)
          abs_ladir=`cd "$ladir" && pwd`
          if test -z "$abs_ladir"; then
-           func_warning "cannot determine absolute directory name of \`$ladir'"
+           func_warning "cannot determine absolute directory name of '$ladir'"
            func_warning "passing it literally to the linker, although it might fail"
            func_warning "passing it literally to the linker, although it might fail"
-           abs_ladir="$ladir"
+           abs_ladir=$ladir
          fi
          ;;
        esac
        func_basename "$lib"
          fi
          ;;
        esac
        func_basename "$lib"
-       laname="$func_basename_result"
+       laname=$func_basename_result
 
        # Find the relevant object directory and library name.
 
        # Find the relevant object directory and library name.
-       if test "X$installed" = Xyes; then
+       if test yes = "$installed"; then
          if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
          if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-           func_warning "library \`$lib' was moved."
-           dir="$ladir"
-           absdir="$abs_ladir"
-           libdir="$abs_ladir"
+           func_warning "library '$lib' was moved."
+           dir=$ladir
+           absdir=$abs_ladir
+           libdir=$abs_ladir
          else
          else
-           dir="$lt_sysroot$libdir"
-           absdir="$lt_sysroot$libdir"
+           dir=$lt_sysroot$libdir
+           absdir=$lt_sysroot$libdir
          fi
          fi
-         test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+         test yes = "$hardcode_automatic" && avoidtemprpath=yes
        else
          if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
        else
          if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-           dir="$ladir"
-           absdir="$abs_ladir"
+           dir=$ladir
+           absdir=$abs_ladir
            # Remove this search path later
            func_append notinst_path " $abs_ladir"
          else
            # Remove this search path later
            func_append notinst_path " $abs_ladir"
          else
-           dir="$ladir/$objdir"
-           absdir="$abs_ladir/$objdir"
+           dir=$ladir/$objdir
+           absdir=$abs_ladir/$objdir
            # Remove this search path later
            func_append notinst_path " $abs_ladir"
          fi
            # Remove this search path later
            func_append notinst_path " $abs_ladir"
          fi
@@ -6542,11 +7988,11 @@ func_mode_link ()
        name=$func_stripname_result
 
        # This library was specified with -dlpreopen.
        name=$func_stripname_result
 
        # This library was specified with -dlpreopen.
-       if test "$pass" = dlpreopen; then
-         if test -z "$libdir" && test "$linkmode" = prog; then
-           func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+       if test dlpreopen = "$pass"; then
+         if test -z "$libdir" && test prog = "$linkmode"; then
+           func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
          fi
          fi
-         case "$host" in
+         case $host in
            # special handling for platforms with PE-DLLs.
            *cygwin* | *mingw* | *cegcc* )
              # Linker will automatically link against shared library if both
            # special handling for platforms with PE-DLLs.
            *cygwin* | *mingw* | *cegcc* )
              # Linker will automatically link against shared library if both
@@ -6590,9 +8036,9 @@ func_mode_link ()
 
        if test -z "$libdir"; then
          # Link the convenience library
 
        if test -z "$libdir"; then
          # Link the convenience library
-         if test "$linkmode" = lib; then
+         if test lib = "$linkmode"; then
            deplibs="$dir/$old_library $deplibs"
            deplibs="$dir/$old_library $deplibs"
-         elif test "$linkmode,$pass" = "prog,link"; then
+         elif test prog,link = "$linkmode,$pass"; then
            compile_deplibs="$dir/$old_library $compile_deplibs"
            finalize_deplibs="$dir/$old_library $finalize_deplibs"
          else
            compile_deplibs="$dir/$old_library $compile_deplibs"
            finalize_deplibs="$dir/$old_library $finalize_deplibs"
          else
@@ -6602,14 +8048,14 @@ func_mode_link ()
        fi
 
 
        fi
 
 
-       if test "$linkmode" = prog && test "$pass" != link; then
+       if test prog = "$linkmode" && test link != "$pass"; then
          func_append newlib_search_path " $ladir"
          deplibs="$lib $deplibs"
 
          func_append newlib_search_path " $ladir"
          deplibs="$lib $deplibs"
 
-         linkalldeplibs=no
-         if test "$link_all_deplibs" != no || test -z "$library_names" ||
-            test "$build_libtool_libs" = no; then
-           linkalldeplibs=yes
+         linkalldeplibs=false
+         if test no != "$link_all_deplibs" || test -z "$library_names" ||
+            test no = "$build_libtool_libs"; then
+           linkalldeplibs=:
          fi
 
          tmp_libs=
          fi
 
          tmp_libs=
@@ -6621,14 +8067,14 @@ func_mode_link ()
                 ;;
            esac
            # Need to link against all dependency_libs?
                 ;;
            esac
            # Need to link against all dependency_libs?
-           if test "$linkalldeplibs" = yes; then
+           if $linkalldeplibs; then
              deplibs="$deplib $deplibs"
            else
              # Need to hardcode shared library paths
              # or/and link against static libraries
              newdependency_libs="$deplib $newdependency_libs"
            fi
              deplibs="$deplib $deplibs"
            else
              # Need to hardcode shared library paths
              # or/and link against static libraries
              newdependency_libs="$deplib $newdependency_libs"
            fi
-           if $opt_preserve_dup_deps ; then
+           if $opt_preserve_dup_deps; then
              case "$tmp_libs " in
              *" $deplib "*) func_append specialdeplibs " $deplib" ;;
              esac
              case "$tmp_libs " in
              *" $deplib "*) func_append specialdeplibs " $deplib" ;;
              esac
@@ -6638,15 +8084,15 @@ func_mode_link ()
          continue
        fi # $linkmode = prog...
 
          continue
        fi # $linkmode = prog...
 
-       if test "$linkmode,$pass" = "prog,link"; then
+       if test prog,link = "$linkmode,$pass"; then
          if test -n "$library_names" &&
          if test -n "$library_names" &&
-            { { test "$prefer_static_libs" = no ||
-                test "$prefer_static_libs,$installed" = "built,yes"; } ||
+            { { test no = "$prefer_static_libs" ||
+                test built,yes = "$prefer_static_libs,$installed"; } ||
               test -z "$old_library"; }; then
            # We need to hardcode the library path
               test -z "$old_library"; }; then
            # We need to hardcode the library path
-           if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+           if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
              # Make sure the rpath contains only unique directories.
              # Make sure the rpath contains only unique directories.
-             case "$temp_rpath:" in
+             case $temp_rpath: in
              *"$absdir:"*) ;;
              *) func_append temp_rpath "$absdir:" ;;
              esac
              *"$absdir:"*) ;;
              *) func_append temp_rpath "$absdir:" ;;
              esac
@@ -6675,9 +8121,9 @@ func_mode_link ()
            esac
          fi # $linkmode,$pass = prog,link...
 
            esac
          fi # $linkmode,$pass = prog,link...
 
-         if test "$alldeplibs" = yes &&
-            { test "$deplibs_check_method" = pass_all ||
-              { test "$build_libtool_libs" = yes &&
+         if $alldeplibs &&
+            { test pass_all = "$deplibs_check_method" ||
+              { test yes = "$build_libtool_libs" &&
                 test -n "$library_names"; }; }; then
            # We only need to search for static libraries
            continue
                 test -n "$library_names"; }; }; then
            # We only need to search for static libraries
            continue
@@ -6686,19 +8132,19 @@ func_mode_link ()
 
        link_static=no # Whether the deplib will be linked statically
        use_static_libs=$prefer_static_libs
 
        link_static=no # Whether the deplib will be linked statically
        use_static_libs=$prefer_static_libs
-       if test "$use_static_libs" = built && test "$installed" = yes; then
+       if test built = "$use_static_libs" && test yes = "$installed"; then
          use_static_libs=no
        fi
        if test -n "$library_names" &&
          use_static_libs=no
        fi
        if test -n "$library_names" &&
-          { test "$use_static_libs" = no || test -z "$old_library"; }; then
+          { test no = "$use_static_libs" || test -z "$old_library"; }; then
          case $host in
          case $host in
-         *cygwin* | *mingw* | *cegcc*)
+         *cygwin* | *mingw* | *cegcc* | *os2*)
              # No point in relinking DLLs because paths are not encoded
              func_append notinst_deplibs " $lib"
              need_relink=no
            ;;
          *)
              # No point in relinking DLLs because paths are not encoded
              func_append notinst_deplibs " $lib"
              need_relink=no
            ;;
          *)
-           if test "$installed" = no; then
+           if test no = "$installed"; then
              func_append notinst_deplibs " $lib"
              need_relink=yes
            fi
              func_append notinst_deplibs " $lib"
              need_relink=yes
            fi
@@ -6708,24 +8154,24 @@ func_mode_link ()
 
          # Warn about portability, can't link against -module's on some
          # systems (darwin).  Don't bleat about dlopened modules though!
 
          # Warn about portability, can't link against -module's on some
          # systems (darwin).  Don't bleat about dlopened modules though!
-         dlopenmodule=""
+         dlopenmodule=
          for dlpremoduletest in $dlprefiles; do
            if test "X$dlpremoduletest" = "X$lib"; then
          for dlpremoduletest in $dlprefiles; do
            if test "X$dlpremoduletest" = "X$lib"; then
-             dlopenmodule="$dlpremoduletest"
+             dlopenmodule=$dlpremoduletest
              break
            fi
          done
              break
            fi
          done
-         if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+         if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
            echo
            echo
-           if test "$linkmode" = prog; then
+           if test prog = "$linkmode"; then
              $ECHO "*** Warning: Linking the executable $output against the loadable module"
            else
              $ECHO "*** Warning: Linking the shared library $output against the loadable module"
            fi
            $ECHO "*** $linklib is not portable!"
          fi
              $ECHO "*** Warning: Linking the executable $output against the loadable module"
            else
              $ECHO "*** Warning: Linking the shared library $output against the loadable module"
            fi
            $ECHO "*** $linklib is not portable!"
          fi
-         if test "$linkmode" = lib &&
-            test "$hardcode_into_libs" = yes; then
+         if test lib = "$linkmode" &&
+            test yes = "$hardcode_into_libs"; then
            # Hardcode the library path.
            # Skip directories that are in the system default run-time
            # search path.
            # Hardcode the library path.
            # Skip directories that are in the system default run-time
            # search path.
@@ -6753,43 +8199,43 @@ func_mode_link ()
            # figure out the soname
            set dummy $library_names
            shift
            # figure out the soname
            set dummy $library_names
            shift
-           realname="$1"
+           realname=$1
            shift
            libname=`eval "\\$ECHO \"$libname_spec\""`
            # use dlname if we got it. it's perfectly good, no?
            if test -n "$dlname"; then
            shift
            libname=`eval "\\$ECHO \"$libname_spec\""`
            # use dlname if we got it. it's perfectly good, no?
            if test -n "$dlname"; then
-             soname="$dlname"
+             soname=$dlname
            elif test -n "$soname_spec"; then
              # bleh windows
              case $host in
            elif test -n "$soname_spec"; then
              # bleh windows
              case $host in
-             *cygwin* | mingw* | *cegcc*)
+             *cygwin* | mingw* | *cegcc* | *os2*)
                func_arith $current - $age
                major=$func_arith_result
                func_arith $current - $age
                major=$func_arith_result
-               versuffix="-$major"
+               versuffix=-$major
                ;;
              esac
              eval soname=\"$soname_spec\"
            else
                ;;
              esac
              eval soname=\"$soname_spec\"
            else
-             soname="$realname"
+             soname=$realname
            fi
 
            # Make a new name for the extract_expsyms_cmds to use
            fi
 
            # Make a new name for the extract_expsyms_cmds to use
-           soroot="$soname"
+           soroot=$soname
            func_basename "$soroot"
            func_basename "$soroot"
-           soname="$func_basename_result"
+           soname=$func_basename_result
            func_stripname 'lib' '.dll' "$soname"
            newlib=libimp-$func_stripname_result.a
 
            # If the library has no export list, then create one now
            if test -f "$output_objdir/$soname-def"; then :
            else
            func_stripname 'lib' '.dll' "$soname"
            newlib=libimp-$func_stripname_result.a
 
            # If the library has no export list, then create one now
            if test -f "$output_objdir/$soname-def"; then :
            else
-             func_verbose "extracting exported symbol list from \`$soname'"
+             func_verbose "extracting exported symbol list from '$soname'"
              func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
            fi
 
            # Create $newlib
            if test -f "$output_objdir/$newlib"; then :; else
              func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
            fi
 
            # Create $newlib
            if test -f "$output_objdir/$newlib"; then :; else
-             func_verbose "generating import library for \`$soname'"
+             func_verbose "generating import library for '$soname'"
              func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
            fi
            # make sure the library variables are pointing to the new library
              func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
            fi
            # make sure the library variables are pointing to the new library
@@ -6797,58 +8243,58 @@ func_mode_link ()
            linklib=$newlib
          fi # test -n "$old_archive_from_expsyms_cmds"
 
            linklib=$newlib
          fi # test -n "$old_archive_from_expsyms_cmds"
 
-         if test "$linkmode" = prog || test "$opt_mode" != relink; then
+         if test prog = "$linkmode" || test relink != "$opt_mode"; then
            add_shlibpath=
            add_dir=
            add=
            lib_linked=yes
            case $hardcode_action in
            immediate | unsupported)
            add_shlibpath=
            add_dir=
            add=
            lib_linked=yes
            case $hardcode_action in
            immediate | unsupported)
-             if test "$hardcode_direct" = no; then
-               add="$dir/$linklib"
+             if test no = "$hardcode_direct"; then
+               add=$dir/$linklib
                case $host in
                case $host in
-                 *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-                 *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+                 *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
+                 *-*-sysv4*uw2*) add_dir=-L$dir ;;
                  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
                  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-                   *-*-unixware7*) add_dir="-L$dir" ;;
+                   *-*-unixware7*) add_dir=-L$dir ;;
                  *-*-darwin* )
                  *-*-darwin* )
-                   # if the lib is a (non-dlopened) module then we can not
+                   # if the lib is a (non-dlopened) module then we cannot
                    # link against it, someone is ignoring the earlier warnings
                    if /usr/bin/file -L $add 2> /dev/null |
                    # link against it, someone is ignoring the earlier warnings
                    if /usr/bin/file -L $add 2> /dev/null |
-                        $GREP ": [^:]* bundle" >/dev/null ; then
+                        $GREP ": [^:]* bundle" >/dev/null; then
                      if test "X$dlopenmodule" != "X$lib"; then
                        $ECHO "*** Warning: lib $linklib is a module, not a shared library"
                      if test "X$dlopenmodule" != "X$lib"; then
                        $ECHO "*** Warning: lib $linklib is a module, not a shared library"
-                       if test -z "$old_library" ; then
+                       if test -z "$old_library"; then
                          echo
                          echo "*** And there doesn't seem to be a static archive available"
                          echo "*** The link will probably fail, sorry"
                        else
                          echo
                          echo "*** And there doesn't seem to be a static archive available"
                          echo "*** The link will probably fail, sorry"
                        else
-                         add="$dir/$old_library"
+                         add=$dir/$old_library
                        fi
                      elif test -n "$old_library"; then
                        fi
                      elif test -n "$old_library"; then
-                       add="$dir/$old_library"
+                       add=$dir/$old_library
                      fi
                    fi
                esac
                      fi
                    fi
                esac
-             elif test "$hardcode_minus_L" = no; then
+             elif test no = "$hardcode_minus_L"; then
                case $host in
                case $host in
-               *-*-sunos*) add_shlibpath="$dir" ;;
+               *-*-sunos*) add_shlibpath=$dir ;;
                esac
                esac
-               add_dir="-L$dir"
-               add="-l$name"
-             elif test "$hardcode_shlibpath_var" = no; then
-               add_shlibpath="$dir"
-               add="-l$name"
+               add_dir=-L$dir
+               add=-l$name
+             elif test no = "$hardcode_shlibpath_var"; then
+               add_shlibpath=$dir
+               add=-l$name
              else
                lib_linked=no
              fi
              ;;
            relink)
              else
                lib_linked=no
              fi
              ;;
            relink)
-             if test "$hardcode_direct" = yes &&
-                test "$hardcode_direct_absolute" = no; then
-               add="$dir/$linklib"
-             elif test "$hardcode_minus_L" = yes; then
-               add_dir="-L$absdir"
+             if test yes = "$hardcode_direct" &&
+                test no = "$hardcode_direct_absolute"; then
+               add=$dir/$linklib
+             elif test yes = "$hardcode_minus_L"; then
+               add_dir=-L$absdir
                # Try looking first in the location we're being installed to.
                if test -n "$inst_prefix_dir"; then
                  case $libdir in
                # Try looking first in the location we're being installed to.
                if test -n "$inst_prefix_dir"; then
                  case $libdir in
@@ -6857,10 +8303,10 @@ func_mode_link ()
                      ;;
                  esac
                fi
                      ;;
                  esac
                fi
-               add="-l$name"
-             elif test "$hardcode_shlibpath_var" = yes; then
-               add_shlibpath="$dir"
-               add="-l$name"
+               add=-l$name
+             elif test yes = "$hardcode_shlibpath_var"; then
+               add_shlibpath=$dir
+               add=-l$name
              else
                lib_linked=no
              fi
              else
                lib_linked=no
              fi
@@ -6868,7 +8314,7 @@ func_mode_link ()
            *) lib_linked=no ;;
            esac
 
            *) lib_linked=no ;;
            esac
 
-           if test "$lib_linked" != yes; then
+           if test yes != "$lib_linked"; then
              func_fatal_configuration "unsupported hardcode properties"
            fi
 
              func_fatal_configuration "unsupported hardcode properties"
            fi
 
@@ -6878,15 +8324,15 @@ func_mode_link ()
              *) func_append compile_shlibpath "$add_shlibpath:" ;;
              esac
            fi
              *) func_append compile_shlibpath "$add_shlibpath:" ;;
              esac
            fi
-           if test "$linkmode" = prog; then
+           if test prog = "$linkmode"; then
              test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
              test -n "$add" && compile_deplibs="$add $compile_deplibs"
            else
              test -n "$add_dir" && deplibs="$add_dir $deplibs"
              test -n "$add" && deplibs="$add $deplibs"
              test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
              test -n "$add" && compile_deplibs="$add $compile_deplibs"
            else
              test -n "$add_dir" && deplibs="$add_dir $deplibs"
              test -n "$add" && deplibs="$add $deplibs"
-             if test "$hardcode_direct" != yes &&
-                test "$hardcode_minus_L" != yes &&
-                test "$hardcode_shlibpath_var" = yes; then
+             if test yes != "$hardcode_direct" &&
+                test yes != "$hardcode_minus_L" &&
+                test yes = "$hardcode_shlibpath_var"; then
                case :$finalize_shlibpath: in
                *":$libdir:"*) ;;
                *) func_append finalize_shlibpath "$libdir:" ;;
                case :$finalize_shlibpath: in
                *":$libdir:"*) ;;
                *) func_append finalize_shlibpath "$libdir:" ;;
@@ -6895,33 +8341,33 @@ func_mode_link ()
            fi
          fi
 
            fi
          fi
 
-         if test "$linkmode" = prog || test "$opt_mode" = relink; then
+         if test prog = "$linkmode" || test relink = "$opt_mode"; then
            add_shlibpath=
            add_dir=
            add=
            # Finalize command for both is simple: just hardcode it.
            add_shlibpath=
            add_dir=
            add=
            # Finalize command for both is simple: just hardcode it.
-           if test "$hardcode_direct" = yes &&
-              test "$hardcode_direct_absolute" = no; then
-             add="$libdir/$linklib"
-           elif test "$hardcode_minus_L" = yes; then
-             add_dir="-L$libdir"
-             add="-l$name"
-           elif test "$hardcode_shlibpath_var" = yes; then
+           if test yes = "$hardcode_direct" &&
+              test no = "$hardcode_direct_absolute"; then
+             add=$libdir/$linklib
+           elif test yes = "$hardcode_minus_L"; then
+             add_dir=-L$libdir
+             add=-l$name
+           elif test yes = "$hardcode_shlibpath_var"; then
              case :$finalize_shlibpath: in
              *":$libdir:"*) ;;
              *) func_append finalize_shlibpath "$libdir:" ;;
              esac
              case :$finalize_shlibpath: in
              *":$libdir:"*) ;;
              *) func_append finalize_shlibpath "$libdir:" ;;
              esac
-             add="-l$name"
-           elif test "$hardcode_automatic" = yes; then
+             add=-l$name
+           elif test yes = "$hardcode_automatic"; then
              if test -n "$inst_prefix_dir" &&
              if test -n "$inst_prefix_dir" &&
-                test -f "$inst_prefix_dir$libdir/$linklib" ; then
-               add="$inst_prefix_dir$libdir/$linklib"
+                test -f "$inst_prefix_dir$libdir/$linklib"; then
+               add=$inst_prefix_dir$libdir/$linklib
              else
              else
-               add="$libdir/$linklib"
+               add=$libdir/$linklib
              fi
            else
              # We cannot seem to hardcode it, guess we'll fake it.
              fi
            else
              # We cannot seem to hardcode it, guess we'll fake it.
-             add_dir="-L$libdir"
+             add_dir=-L$libdir
              # Try looking first in the location we're being installed to.
              if test -n "$inst_prefix_dir"; then
                case $libdir in
              # Try looking first in the location we're being installed to.
              if test -n "$inst_prefix_dir"; then
                case $libdir in
@@ -6930,10 +8376,10 @@ func_mode_link ()
                    ;;
                esac
              fi
                    ;;
                esac
              fi
-             add="-l$name"
+             add=-l$name
            fi
 
            fi
 
-           if test "$linkmode" = prog; then
+           if test prog = "$linkmode"; then
              test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
              test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
            else
              test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
              test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
            else
@@ -6941,43 +8387,43 @@ func_mode_link ()
              test -n "$add" && deplibs="$add $deplibs"
            fi
          fi
              test -n "$add" && deplibs="$add $deplibs"
            fi
          fi
-       elif test "$linkmode" = prog; then
+       elif test prog = "$linkmode"; then
          # Here we assume that one of hardcode_direct or hardcode_minus_L
          # is not unsupported.  This is valid on all known static and
          # shared platforms.
          # Here we assume that one of hardcode_direct or hardcode_minus_L
          # is not unsupported.  This is valid on all known static and
          # shared platforms.
-         if test "$hardcode_direct" != unsupported; then
-           test -n "$old_library" && linklib="$old_library"
+         if test unsupported != "$hardcode_direct"; then
+           test -n "$old_library" && linklib=$old_library
            compile_deplibs="$dir/$linklib $compile_deplibs"
            finalize_deplibs="$dir/$linklib $finalize_deplibs"
          else
            compile_deplibs="-l$name -L$dir $compile_deplibs"
            finalize_deplibs="-l$name -L$dir $finalize_deplibs"
          fi
            compile_deplibs="$dir/$linklib $compile_deplibs"
            finalize_deplibs="$dir/$linklib $finalize_deplibs"
          else
            compile_deplibs="-l$name -L$dir $compile_deplibs"
            finalize_deplibs="-l$name -L$dir $finalize_deplibs"
          fi
-       elif test "$build_libtool_libs" = yes; then
+       elif test yes = "$build_libtool_libs"; then
          # Not a shared library
          # Not a shared library
-         if test "$deplibs_check_method" != pass_all; then
+         if test pass_all != "$deplibs_check_method"; then
            # We're trying link a shared library against a static one
            # but the system doesn't support it.
 
            # Just print a warning and add the library to dependency_libs so
            # that the program can be linked against the static library.
            echo
            # We're trying link a shared library against a static one
            # but the system doesn't support it.
 
            # Just print a warning and add the library to dependency_libs so
            # that the program can be linked against the static library.
            echo
-           $ECHO "*** Warning: This system can not link to static lib archive $lib."
+           $ECHO "*** Warning: This system cannot link to static lib archive $lib."
            echo "*** I have the capability to make that library automatically link in when"
            echo "*** you link to this library.  But I can only do this if you have a"
            echo "*** shared version of the library, which you do not appear to have."
            echo "*** I have the capability to make that library automatically link in when"
            echo "*** you link to this library.  But I can only do this if you have a"
            echo "*** shared version of the library, which you do not appear to have."
-           if test "$module" = yes; then
+           if test yes = "$module"; then
              echo "*** But as you try to build a module library, libtool will still create "
              echo "*** a static module, that should work as long as the dlopening application"
              echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
              if test -z "$global_symbol_pipe"; then
                echo
                echo "*** However, this would only work if libtool was able to extract symbol"
              echo "*** But as you try to build a module library, libtool will still create "
              echo "*** a static module, that should work as long as the dlopening application"
              echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
              if test -z "$global_symbol_pipe"; then
                echo
                echo "*** However, this would only work if libtool was able to extract symbol"
-               echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+               echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
                echo "*** not find such a program.  So, this module is probably useless."
                echo "*** not find such a program.  So, this module is probably useless."
-               echo "*** \`nm' from GNU binutils and a full rebuild may help."
+               echo "*** 'nm' from GNU binutils and a full rebuild may help."
              fi
              fi
-             if test "$build_old_libs" = no; then
+             if test no = "$build_old_libs"; then
                build_libtool_libs=module
                build_old_libs=yes
              else
                build_libtool_libs=module
                build_old_libs=yes
              else
@@ -6990,11 +8436,11 @@ func_mode_link ()
          fi
        fi # link shared/static library?
 
          fi
        fi # link shared/static library?
 
-       if test "$linkmode" = lib; then
+       if test lib = "$linkmode"; then
          if test -n "$dependency_libs" &&
          if test -n "$dependency_libs" &&
-            { test "$hardcode_into_libs" != yes ||
-              test "$build_old_libs" = yes ||
-              test "$link_static" = yes; }; then
+            { test yes != "$hardcode_into_libs" ||
+              test yes = "$build_old_libs" ||
+              test yes = "$link_static"; }; then
            # Extract -R from dependency_libs
            temp_deplibs=
            for libdir in $dependency_libs; do
            # Extract -R from dependency_libs
            temp_deplibs=
            for libdir in $dependency_libs; do
@@ -7008,12 +8454,12 @@ func_mode_link ()
              *) func_append temp_deplibs " $libdir";;
              esac
            done
              *) func_append temp_deplibs " $libdir";;
              esac
            done
-           dependency_libs="$temp_deplibs"
+           dependency_libs=$temp_deplibs
          fi
 
          func_append newlib_search_path " $absdir"
          # Link against this library
          fi
 
          func_append newlib_search_path " $absdir"
          # Link against this library
-         test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+         test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
          # ... and its dependency_libs
          tmp_libs=
          for deplib in $dependency_libs; do
          # ... and its dependency_libs
          tmp_libs=
          for deplib in $dependency_libs; do
@@ -7023,7 +8469,7 @@ func_mode_link ()
                    func_resolve_sysroot "$func_stripname_result";;
               *) func_resolve_sysroot "$deplib" ;;
             esac
                    func_resolve_sysroot "$func_stripname_result";;
               *) func_resolve_sysroot "$deplib" ;;
             esac
-           if $opt_preserve_dup_deps ; then
+           if $opt_preserve_dup_deps; then
              case "$tmp_libs " in
              *" $func_resolve_sysroot_result "*)
                 func_append specialdeplibs " $func_resolve_sysroot_result" ;;
              case "$tmp_libs " in
              *" $func_resolve_sysroot_result "*)
                 func_append specialdeplibs " $func_resolve_sysroot_result" ;;
@@ -7032,12 +8478,12 @@ func_mode_link ()
            func_append tmp_libs " $func_resolve_sysroot_result"
          done
 
            func_append tmp_libs " $func_resolve_sysroot_result"
          done
 
-         if test "$link_all_deplibs" != no; then
+         if test no != "$link_all_deplibs"; then
            # Add the search paths of all dependency libraries
            for deplib in $dependency_libs; do
              path=
              case $deplib in
            # Add the search paths of all dependency libraries
            for deplib in $dependency_libs; do
              path=
              case $deplib in
-             -L*) path="$deplib" ;;
+             -L*) path=$deplib ;;
              *.la)
                func_resolve_sysroot "$deplib"
                deplib=$func_resolve_sysroot_result
              *.la)
                func_resolve_sysroot "$deplib"
                deplib=$func_resolve_sysroot_result
@@ -7045,12 +8491,12 @@ func_mode_link ()
                dir=$func_dirname_result
                # We need an absolute path.
                case $dir in
                dir=$func_dirname_result
                # We need an absolute path.
                case $dir in
-               [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+               [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
                *)
                  absdir=`cd "$dir" && pwd`
                  if test -z "$absdir"; then
                *)
                  absdir=`cd "$dir" && pwd`
                  if test -z "$absdir"; then
-                   func_warning "cannot determine absolute directory name of \`$dir'"
-                   absdir="$dir"
+                   func_warning "cannot determine absolute directory name of '$dir'"
+                   absdir=$dir
                  fi
                  ;;
                esac
                  fi
                  ;;
                esac
@@ -7058,35 +8504,35 @@ func_mode_link ()
                case $host in
                *-*-darwin*)
                  depdepl=
                case $host in
                *-*-darwin*)
                  depdepl=
-                 eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-                 if test -n "$deplibrary_names" ; then
-                   for tmp in $deplibrary_names ; do
+                 eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+                 if test -n "$deplibrary_names"; then
+                   for tmp in $deplibrary_names; do
                      depdepl=$tmp
                    done
                      depdepl=$tmp
                    done
-                   if test -f "$absdir/$objdir/$depdepl" ; then
-                     depdepl="$absdir/$objdir/$depdepl"
-                     darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                   if test -f "$absdir/$objdir/$depdepl"; then
+                     depdepl=$absdir/$objdir/$depdepl
+                     darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
                       if test -z "$darwin_install_name"; then
                       if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                          darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
                       fi
                       fi
-                     func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-                     func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+                     func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
+                     func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
                      path=
                    fi
                  fi
                  ;;
                *)
                      path=
                    fi
                  fi
                  ;;
                *)
-                 path="-L$absdir/$objdir"
+                 path=-L$absdir/$objdir
                  ;;
                esac
                else
                  ;;
                esac
                else
-                 eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+                 eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
                  test -z "$libdir" && \
                  test -z "$libdir" && \
-                   func_fatal_error "\`$deplib' is not a valid libtool archive"
+                   func_fatal_error "'$deplib' is not a valid libtool archive"
                  test "$absdir" != "$libdir" && \
                  test "$absdir" != "$libdir" && \
-                   func_warning "\`$deplib' seems to be moved"
+                   func_warning "'$deplib' seems to be moved"
 
 
-                 path="-L$absdir"
+                 path=-L$absdir
                fi
                ;;
              esac
                fi
                ;;
              esac
@@ -7098,23 +8544,23 @@ func_mode_link ()
          fi # link_all_deplibs != no
        fi # linkmode = lib
       done # for deplib in $libs
          fi # link_all_deplibs != no
        fi # linkmode = lib
       done # for deplib in $libs
-      if test "$pass" = link; then
-       if test "$linkmode" = "prog"; then
+      if test link = "$pass"; then
+       if test prog = "$linkmode"; then
          compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
          finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
        else
          compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
        fi
       fi
          compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
          finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
        else
          compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
        fi
       fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
+      dependency_libs=$newdependency_libs
+      if test dlpreopen = "$pass"; then
        # Link the dlpreopened libraries before other libraries
        for deplib in $save_deplibs; do
          deplibs="$deplib $deplibs"
        done
       fi
        # Link the dlpreopened libraries before other libraries
        for deplib in $save_deplibs; do
          deplibs="$deplib $deplibs"
        done
       fi
-      if test "$pass" != dlopen; then
-       if test "$pass" != conv; then
+      if test dlopen != "$pass"; then
+       test conv = "$pass" || {
          # Make sure lib_search_path contains only unique directories.
          lib_search_path=
          for dir in $newlib_search_path; do
          # Make sure lib_search_path contains only unique directories.
          lib_search_path=
          for dir in $newlib_search_path; do
@@ -7124,12 +8570,12 @@ func_mode_link ()
            esac
          done
          newlib_search_path=
            esac
          done
          newlib_search_path=
-       fi
+       }
 
 
-       if test "$linkmode,$pass" != "prog,link"; then
-         vars="deplibs"
-       else
+       if test prog,link = "$linkmode,$pass"; then
          vars="compile_deplibs finalize_deplibs"
          vars="compile_deplibs finalize_deplibs"
+       else
+         vars=deplibs
        fi
        for var in $vars dependency_libs; do
          # Add libraries to $var in reverse order
        fi
        for var in $vars dependency_libs; do
          # Add libraries to $var in reverse order
@@ -7187,62 +8633,93 @@ func_mode_link ()
          eval $var=\"$tmp_libs\"
        done # for var
       fi
          eval $var=\"$tmp_libs\"
        done # for var
       fi
+
+      # Add Sun CC postdeps if required:
+      test CXX = "$tagname" && {
+        case $host_os in
+        linux*)
+          case `$CC -V 2>&1 | sed 5q` in
+          *Sun\ C*) # Sun C++ 5.9
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+
+        solaris*)
+          func_cc_basename "$CC"
+          case $func_cc_basename_result in
+          CC* | sunCC*)
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+        esac
+      }
+
       # Last step: remove runtime libs from dependency_libs
       # (they stay in deplibs)
       tmp_libs=
       # Last step: remove runtime libs from dependency_libs
       # (they stay in deplibs)
       tmp_libs=
-      for i in $dependency_libs ; do
+      for i in $dependency_libs; do
        case " $predeps $postdeps $compiler_lib_search_path " in
        *" $i "*)
        case " $predeps $postdeps $compiler_lib_search_path " in
        *" $i "*)
-         i=""
+         i=
          ;;
        esac
          ;;
        esac
-       if test -n "$i" ; then
+       if test -n "$i"; then
          func_append tmp_libs " $i"
        fi
       done
       dependency_libs=$tmp_libs
     done # for pass
          func_append tmp_libs " $i"
        fi
       done
       dependency_libs=$tmp_libs
     done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
+    if test prog = "$linkmode"; then
+      dlfiles=$newdlfiles
     fi
     fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
+    if test prog = "$linkmode" || test lib = "$linkmode"; then
+      dlprefiles=$newdlprefiles
     fi
 
     case $linkmode in
     oldlib)
     fi
 
     case $linkmode in
     oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-       func_warning "\`-dlopen' is ignored for archives"
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+       func_warning "'-dlopen' is ignored for archives"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
-       func_warning "\`-l' and \`-L' are ignored for archives" ;;
+       func_warning "'-l' and '-L' are ignored for archives" ;;
       esac
 
       test -n "$rpath" && \
       esac
 
       test -n "$rpath" && \
-       func_warning "\`-rpath' is ignored for archives"
+       func_warning "'-rpath' is ignored for archives"
 
       test -n "$xrpath" && \
 
       test -n "$xrpath" && \
-       func_warning "\`-R' is ignored for archives"
+       func_warning "'-R' is ignored for archives"
 
       test -n "$vinfo" && \
 
       test -n "$vinfo" && \
-       func_warning "\`-version-info/-version-number' is ignored for archives"
+       func_warning "'-version-info/-version-number' is ignored for archives"
 
       test -n "$release" && \
 
       test -n "$release" && \
-       func_warning "\`-release' is ignored for archives"
+       func_warning "'-release' is ignored for archives"
 
       test -n "$export_symbols$export_symbols_regex" && \
 
       test -n "$export_symbols$export_symbols_regex" && \
-       func_warning "\`-export-symbols' is ignored for archives"
+       func_warning "'-export-symbols' is ignored for archives"
 
       # Now set the variables for building old libraries.
       build_libtool_libs=no
 
       # Now set the variables for building old libraries.
       build_libtool_libs=no
-      oldlibs="$output"
+      oldlibs=$output
       func_append objs "$old_deplibs"
       ;;
 
     lib)
       func_append objs "$old_deplibs"
       ;;
 
     lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
+      # Make sure we only generate libraries of the form 'libNAME.la'.
       case $outputname in
       lib*)
        func_stripname 'lib' '.la' "$outputname"
       case $outputname in
       lib*)
        func_stripname 'lib' '.la' "$outputname"
@@ -7251,10 +8728,10 @@ func_mode_link ()
        eval libname=\"$libname_spec\"
        ;;
       *)
        eval libname=\"$libname_spec\"
        ;;
       *)
-       test "$module" = no && \
-         func_fatal_help "libtool library \`$output' must begin with \`lib'"
+       test no = "$module" \
+         && func_fatal_help "libtool library '$output' must begin with 'lib'"
 
 
-       if test "$need_lib_prefix" != no; then
+       if test no != "$need_lib_prefix"; then
          # Add the "lib" prefix for modules if required
          func_stripname '' '.la' "$outputname"
          name=$func_stripname_result
          # Add the "lib" prefix for modules if required
          func_stripname '' '.la' "$outputname"
          name=$func_stripname_result
@@ -7268,8 +8745,8 @@ func_mode_link ()
       esac
 
       if test -n "$objs"; then
       esac
 
       if test -n "$objs"; then
-       if test "$deplibs_check_method" != pass_all; then
-         func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+       if test pass_all != "$deplibs_check_method"; then
+         func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
        else
          echo
          $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
        else
          echo
          $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
@@ -7278,21 +8755,21 @@ func_mode_link ()
        fi
       fi
 
        fi
       fi
 
-      test "$dlself" != no && \
-       func_warning "\`-dlopen self' is ignored for libtool libraries"
+      test no = "$dlself" \
+       || func_warning "'-dlopen self' is ignored for libtool libraries"
 
       set dummy $rpath
       shift
 
       set dummy $rpath
       shift
-      test "$#" -gt 1 && \
-       func_warning "ignoring multiple \`-rpath's for a libtool library"
+      test 1 -lt "$#" \
+       && func_warning "ignoring multiple '-rpath's for a libtool library"
 
 
-      install_libdir="$1"
+      install_libdir=$1
 
       oldlibs=
       if test -z "$rpath"; then
 
       oldlibs=
       if test -z "$rpath"; then
-       if test "$build_libtool_libs" = yes; then
+       if test yes = "$build_libtool_libs"; then
          # Building a libtool convenience library.
          # Building a libtool convenience library.
-         # Some compilers have problems with a `.al' extension so
+         # Some compilers have problems with a '.al' extension so
          # convenience libraries should have the same extension an
          # archive normally would.
          oldlibs="$output_objdir/$libname.$libext $oldlibs"
          # convenience libraries should have the same extension an
          # archive normally would.
          oldlibs="$output_objdir/$libname.$libext $oldlibs"
@@ -7301,20 +8778,20 @@ func_mode_link ()
        fi
 
        test -n "$vinfo" && \
        fi
 
        test -n "$vinfo" && \
-         func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+         func_warning "'-version-info/-version-number' is ignored for convenience libraries"
 
        test -n "$release" && \
 
        test -n "$release" && \
-         func_warning "\`-release' is ignored for convenience libraries"
+         func_warning "'-release' is ignored for convenience libraries"
       else
 
        # Parse the version information argument.
       else
 
        # Parse the version information argument.
-       save_ifs="$IFS"; IFS=':'
+       save_ifs=$IFS; IFS=:
        set dummy $vinfo 0 0 0
        shift
        set dummy $vinfo 0 0 0
        shift
-       IFS="$save_ifs"
+       IFS=$save_ifs
 
        test -n "$7" && \
 
        test -n "$7" && \
-         func_fatal_help "too many parameters to \`-version-info'"
+         func_fatal_help "too many parameters to '-version-info'"
 
        # convert absolute version numbers to libtool ages
        # this retains compatibility with .la files and attempts
 
        # convert absolute version numbers to libtool ages
        # this retains compatibility with .la files and attempts
@@ -7322,45 +8799,45 @@ func_mode_link ()
 
        case $vinfo_number in
        yes)
 
        case $vinfo_number in
        yes)
-         number_major="$1"
-         number_minor="$2"
-         number_revision="$3"
+         number_major=$1
+         number_minor=$2
+         number_revision=$3
          #
          # There are really only two kinds -- those that
          # use the current revision as the major version
          # and those that subtract age and use age as
          # a minor version.  But, then there is irix
          #
          # There are really only two kinds -- those that
          # use the current revision as the major version
          # and those that subtract age and use age as
          # a minor version.  But, then there is irix
-         # which has an extra 1 added just for fun
+         # that has an extra 1 added just for fun
          #
          case $version_type in
          # correct linux to gnu/linux during the next big refactor
          #
          case $version_type in
          # correct linux to gnu/linux during the next big refactor
-         darwin|linux|osf|windows|none)
+         darwin|freebsd-elf|linux|osf|windows|none)
            func_arith $number_major + $number_minor
            current=$func_arith_result
            func_arith $number_major + $number_minor
            current=$func_arith_result
-           age="$number_minor"
-           revision="$number_revision"
+           age=$number_minor
+           revision=$number_revision
            ;;
            ;;
-         freebsd-aout|freebsd-elf|qnx|sunos)
-           current="$number_major"
-           revision="$number_minor"
-           age="0"
+         freebsd-aout|qnx|sunos)
+           current=$number_major
+           revision=$number_minor
+           age=0
            ;;
          irix|nonstopux)
            func_arith $number_major + $number_minor
            current=$func_arith_result
            ;;
          irix|nonstopux)
            func_arith $number_major + $number_minor
            current=$func_arith_result
-           age="$number_minor"
-           revision="$number_minor"
+           age=$number_minor
+           revision=$number_minor
            lt_irix_increment=no
            ;;
          *)
            lt_irix_increment=no
            ;;
          *)
-           func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+           func_fatal_configuration "$modename: unknown library version type '$version_type'"
            ;;
          esac
          ;;
        no)
            ;;
          esac
          ;;
        no)
-         current="$1"
-         revision="$2"
-         age="$3"
+         current=$1
+         revision=$2
+         age=$3
          ;;
        esac
 
          ;;
        esac
 
@@ -7368,30 +8845,30 @@ func_mode_link ()
        case $current in
        0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
        *)
        case $current in
        0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
        *)
-         func_error "CURRENT \`$current' must be a nonnegative integer"
-         func_fatal_error "\`$vinfo' is not valid version information"
+         func_error "CURRENT '$current' must be a nonnegative integer"
+         func_fatal_error "'$vinfo' is not valid version information"
          ;;
        esac
 
        case $revision in
        0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
        *)
          ;;
        esac
 
        case $revision in
        0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
        *)
-         func_error "REVISION \`$revision' must be a nonnegative integer"
-         func_fatal_error "\`$vinfo' is not valid version information"
+         func_error "REVISION '$revision' must be a nonnegative integer"
+         func_fatal_error "'$vinfo' is not valid version information"
          ;;
        esac
 
        case $age in
        0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
        *)
          ;;
        esac
 
        case $age in
        0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
        *)
-         func_error "AGE \`$age' must be a nonnegative integer"
-         func_fatal_error "\`$vinfo' is not valid version information"
+         func_error "AGE '$age' must be a nonnegative integer"
+         func_fatal_error "'$vinfo' is not valid version information"
          ;;
        esac
 
        if test "$age" -gt "$current"; then
          ;;
        esac
 
        if test "$age" -gt "$current"; then
-         func_error "AGE \`$age' is greater than the current interface number \`$current'"
-         func_fatal_error "\`$vinfo' is not valid version information"
+         func_error "AGE '$age' is greater than the current interface number '$current'"
+         func_fatal_error "'$vinfo' is not valid version information"
        fi
 
        # Calculate the version variables.
        fi
 
        # Calculate the version variables.
@@ -7406,26 +8883,36 @@ func_mode_link ()
          # verstring for coding it into the library header
          func_arith $current - $age
          major=.$func_arith_result
          # verstring for coding it into the library header
          func_arith $current - $age
          major=.$func_arith_result
-         versuffix="$major.$age.$revision"
+         versuffix=$major.$age.$revision
          # Darwin ld doesn't like 0 for these options...
          func_arith $current + 1
          minor_current=$func_arith_result
          # Darwin ld doesn't like 0 for these options...
          func_arith $current + 1
          minor_current=$func_arith_result
-         xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+         xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
          verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
          verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+          # On Darwin other compilers
+          case $CC in
+              nagfor*)
+                  verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+                  ;;
+              *)
+                  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+                  ;;
+          esac
          ;;
 
        freebsd-aout)
          ;;
 
        freebsd-aout)
-         major=".$current"
-         versuffix=".$current.$revision";
+         major=.$current
+         versuffix=.$current.$revision
          ;;
 
        freebsd-elf)
          ;;
 
        freebsd-elf)
-         major=".$current"
-         versuffix=".$current"
+         func_arith $current - $age
+         major=.$func_arith_result
+         versuffix=$major.$age.$revision
          ;;
 
        irix | nonstopux)
          ;;
 
        irix | nonstopux)
-         if test "X$lt_irix_increment" = "Xno"; then
+         if test no = "$lt_irix_increment"; then
            func_arith $current - $age
          else
            func_arith $current - $age + 1
            func_arith $current - $age
          else
            func_arith $current - $age + 1
@@ -7436,69 +8923,74 @@ func_mode_link ()
            nonstopux) verstring_prefix=nonstopux ;;
            *)         verstring_prefix=sgi ;;
          esac
            nonstopux) verstring_prefix=nonstopux ;;
            *)         verstring_prefix=sgi ;;
          esac
-         verstring="$verstring_prefix$major.$revision"
+         verstring=$verstring_prefix$major.$revision
 
          # Add in all the interfaces that we are compatible with.
          loop=$revision
 
          # Add in all the interfaces that we are compatible with.
          loop=$revision
-         while test "$loop" -ne 0; do
+         while test 0 -ne "$loop"; do
            func_arith $revision - $loop
            iface=$func_arith_result
            func_arith $loop - 1
            loop=$func_arith_result
            func_arith $revision - $loop
            iface=$func_arith_result
            func_arith $loop - 1
            loop=$func_arith_result
-           verstring="$verstring_prefix$major.$iface:$verstring"
+           verstring=$verstring_prefix$major.$iface:$verstring
          done
 
          done
 
-         # Before this point, $major must not contain `.'.
+         # Before this point, $major must not contain '.'.
          major=.$major
          major=.$major
-         versuffix="$major.$revision"
+         versuffix=$major.$revision
          ;;
 
        linux) # correct to gnu/linux during the next big refactor
          func_arith $current - $age
          major=.$func_arith_result
          ;;
 
        linux) # correct to gnu/linux during the next big refactor
          func_arith $current - $age
          major=.$func_arith_result
-         versuffix="$major.$age.$revision"
+         versuffix=$major.$age.$revision
          ;;
 
        osf)
          func_arith $current - $age
          major=.$func_arith_result
          ;;
 
        osf)
          func_arith $current - $age
          major=.$func_arith_result
-         versuffix=".$current.$age.$revision"
-         verstring="$current.$age.$revision"
+         versuffix=.$current.$age.$revision
+         verstring=$current.$age.$revision
 
          # Add in all the interfaces that we are compatible with.
          loop=$age
 
          # Add in all the interfaces that we are compatible with.
          loop=$age
-         while test "$loop" -ne 0; do
+         while test 0 -ne "$loop"; do
            func_arith $current - $loop
            iface=$func_arith_result
            func_arith $loop - 1
            loop=$func_arith_result
            func_arith $current - $loop
            iface=$func_arith_result
            func_arith $loop - 1
            loop=$func_arith_result
-           verstring="$verstring:${iface}.0"
+           verstring=$verstring:$iface.0
          done
 
          # Make executables depend on our current version.
          done
 
          # Make executables depend on our current version.
-         func_append verstring ":${current}.0"
+         func_append verstring ":$current.0"
          ;;
 
        qnx)
          ;;
 
        qnx)
-         major=".$current"
-         versuffix=".$current"
+         major=.$current
+         versuffix=.$current
+         ;;
+
+       sco)
+         major=.$current
+         versuffix=.$current
          ;;
 
        sunos)
          ;;
 
        sunos)
-         major=".$current"
-         versuffix=".$current.$revision"
+         major=.$current
+         versuffix=.$current.$revision
          ;;
 
        windows)
          # Use '-' rather than '.', since we only want one
          ;;
 
        windows)
          # Use '-' rather than '.', since we only want one
-         # extension on DOS 8.3 filesystems.
+         # extension on DOS 8.3 file systems.
          func_arith $current - $age
          major=$func_arith_result
          func_arith $current - $age
          major=$func_arith_result
-         versuffix="-$major"
+         versuffix=-$major
          ;;
 
        *)
          ;;
 
        *)
-         func_fatal_configuration "unknown library version type \`$version_type'"
+         func_fatal_configuration "unknown library version type '$version_type'"
          ;;
        esac
 
          ;;
        esac
 
@@ -7512,42 +9004,45 @@ func_mode_link ()
            verstring=
            ;;
          *)
            verstring=
            ;;
          *)
-           verstring="0.0"
+           verstring=0.0
            ;;
          esac
            ;;
          esac
-         if test "$need_version" = no; then
+         if test no = "$need_version"; then
            versuffix=
          else
            versuffix=
          else
-           versuffix=".0.0"
+           versuffix=.0.0
          fi
        fi
 
        # Remove version info from name if versioning should be avoided
          fi
        fi
 
        # Remove version info from name if versioning should be avoided
-       if test "$avoid_version" = yes && test "$need_version" = no; then
+       if test yes,no = "$avoid_version,$need_version"; then
          major=
          versuffix=
          major=
          versuffix=
-         verstring=""
+         verstring=
        fi
 
        # Check to see if the archive will have undefined symbols.
        fi
 
        # Check to see if the archive will have undefined symbols.
-       if test "$allow_undefined" = yes; then
-         if test "$allow_undefined_flag" = unsupported; then
-           func_warning "undefined symbols not allowed in $host shared libraries"
-           build_libtool_libs=no
-           build_old_libs=yes
+       if test yes = "$allow_undefined"; then
+         if test unsupported = "$allow_undefined_flag"; then
+           if test yes = "$build_old_libs"; then
+             func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+             build_libtool_libs=no
+           else
+             func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+           fi
          fi
        else
          # Don't allow undefined symbols.
          fi
        else
          # Don't allow undefined symbols.
-         allow_undefined_flag="$no_undefined_flag"
+         allow_undefined_flag=$no_undefined_flag
        fi
 
       fi
 
        fi
 
       fi
 
-      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_generate_dlsyms "$libname" "$libname" :
       func_append libobjs " $symfileobj"
       func_append libobjs " $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
+      test " " = "$libobjs" && libobjs=
 
 
-      if test "$opt_mode" != relink; then
+      if test relink != "$opt_mode"; then
        # Remove our outputs, but don't remove object files since they
        # may have been created when compiling PIC objects.
        removelist=
        # Remove our outputs, but don't remove object files since they
        # may have been created when compiling PIC objects.
        removelist=
@@ -7556,8 +9051,8 @@ func_mode_link ()
          case $p in
            *.$objext | *.gcno)
               ;;
          case $p in
            *.$objext | *.gcno)
               ;;
-           $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-              if test "X$precious_files_regex" != "X"; then
+           $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
+              if test -n "$precious_files_regex"; then
                 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
                 then
                   continue
                 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
                 then
                   continue
@@ -7573,11 +9068,11 @@ func_mode_link ()
       fi
 
       # Now set the variables for building old libraries.
       fi
 
       # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+      if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
        func_append oldlibs " $output_objdir/$libname.$libext"
 
        # Transform .lo files to .o files.
        func_append oldlibs " $output_objdir/$libname.$libext"
 
        # Transform .lo files to .o files.
-       oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+       oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
       fi
 
       # Eliminate all temporary directories.
       fi
 
       # Eliminate all temporary directories.
@@ -7598,13 +9093,13 @@ func_mode_link ()
          *) func_append finalize_rpath " $libdir" ;;
          esac
        done
          *) func_append finalize_rpath " $libdir" ;;
          esac
        done
-       if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+       if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
          dependency_libs="$temp_xrpath $dependency_libs"
        fi
       fi
 
       # Make sure dlfiles contains only unique files that won't be dlpreopened
          dependency_libs="$temp_xrpath $dependency_libs"
        fi
       fi
 
       # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
+      old_dlfiles=$dlfiles
       dlfiles=
       for lib in $old_dlfiles; do
        case " $dlprefiles $dlfiles " in
       dlfiles=
       for lib in $old_dlfiles; do
        case " $dlprefiles $dlfiles " in
@@ -7614,7 +9109,7 @@ func_mode_link ()
       done
 
       # Make sure dlprefiles contains only unique files
       done
 
       # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
+      old_dlprefiles=$dlprefiles
       dlprefiles=
       for lib in $old_dlprefiles; do
        case "$dlprefiles " in
       dlprefiles=
       for lib in $old_dlprefiles; do
        case "$dlprefiles " in
@@ -7623,7 +9118,7 @@ func_mode_link ()
        esac
       done
 
        esac
       done
 
-      if test "$build_libtool_libs" = yes; then
+      if test yes = "$build_libtool_libs"; then
        if test -n "$rpath"; then
          case $host in
          *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
        if test -n "$rpath"; then
          case $host in
          *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
@@ -7647,7 +9142,7 @@ func_mode_link ()
            ;;
          *)
            # Add libc to deplibs on all other systems if necessary.
            ;;
          *)
            # Add libc to deplibs on all other systems if necessary.
-           if test "$build_libtool_need_lc" = "yes"; then
+           if test yes = "$build_libtool_need_lc"; then
              func_append deplibs " -lc"
            fi
            ;;
              func_append deplibs " -lc"
            fi
            ;;
@@ -7663,9 +9158,9 @@ func_mode_link ()
        # I'm not sure if I'm treating the release correctly.  I think
        # release should show up in the -l (ie -lgmp5) so we don't want to
        # add it in twice.  Is that correct?
        # I'm not sure if I'm treating the release correctly.  I think
        # release should show up in the -l (ie -lgmp5) so we don't want to
        # add it in twice.  Is that correct?
-       release=""
-       versuffix=""
-       major=""
+       release=
+       versuffix=
+       major=
        newdeplibs=
        droppeddeps=no
        case $deplibs_check_method in
        newdeplibs=
        droppeddeps=no
        case $deplibs_check_method in
@@ -7694,20 +9189,20 @@ EOF
              -l*)
                func_stripname -l '' "$i"
                name=$func_stripname_result
              -l*)
                func_stripname -l '' "$i"
                name=$func_stripname_result
-               if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+               if test yes = "$allow_libtool_libs_with_static_runtimes"; then
                  case " $predeps $postdeps " in
                  *" $i "*)
                    func_append newdeplibs " $i"
                  case " $predeps $postdeps " in
                  *" $i "*)
                    func_append newdeplibs " $i"
-                   i=""
+                   i=
                    ;;
                  esac
                fi
                    ;;
                  esac
                fi
-               if test -n "$i" ; then
+               if test -n "$i"; then
                  libname=`eval "\\$ECHO \"$libname_spec\""`
                  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
                  set dummy $deplib_matches; shift
                  deplib_match=$1
                  libname=`eval "\\$ECHO \"$libname_spec\""`
                  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
                  set dummy $deplib_matches; shift
                  deplib_match=$1
-                 if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+                 if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
                    func_append newdeplibs " $i"
                  else
                    droppeddeps=yes
                    func_append newdeplibs " $i"
                  else
                    droppeddeps=yes
@@ -7737,20 +9232,20 @@ EOF
                $opt_dry_run || $RM conftest
                if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
                  ldd_output=`ldd conftest`
                $opt_dry_run || $RM conftest
                if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
                  ldd_output=`ldd conftest`
-                 if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+                 if test yes = "$allow_libtool_libs_with_static_runtimes"; then
                    case " $predeps $postdeps " in
                    *" $i "*)
                      func_append newdeplibs " $i"
                    case " $predeps $postdeps " in
                    *" $i "*)
                      func_append newdeplibs " $i"
-                     i=""
+                     i=
                      ;;
                    esac
                  fi
                      ;;
                    esac
                  fi
-                 if test -n "$i" ; then
+                 if test -n "$i"; then
                    libname=`eval "\\$ECHO \"$libname_spec\""`
                    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
                    set dummy $deplib_matches; shift
                    deplib_match=$1
                    libname=`eval "\\$ECHO \"$libname_spec\""`
                    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
                    set dummy $deplib_matches; shift
                    deplib_match=$1
-                   if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+                   if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
                      func_append newdeplibs " $i"
                    else
                      droppeddeps=yes
                      func_append newdeplibs " $i"
                    else
                      droppeddeps=yes
@@ -7787,24 +9282,24 @@ EOF
            -l*)
              func_stripname -l '' "$a_deplib"
              name=$func_stripname_result
            -l*)
              func_stripname -l '' "$a_deplib"
              name=$func_stripname_result
-             if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+             if test yes = "$allow_libtool_libs_with_static_runtimes"; then
                case " $predeps $postdeps " in
                *" $a_deplib "*)
                  func_append newdeplibs " $a_deplib"
                case " $predeps $postdeps " in
                *" $a_deplib "*)
                  func_append newdeplibs " $a_deplib"
-                 a_deplib=""
+                 a_deplib=
                  ;;
                esac
              fi
                  ;;
                esac
              fi
-             if test -n "$a_deplib" ; then
+             if test -n "$a_deplib"; then
                libname=`eval "\\$ECHO \"$libname_spec\""`
                if test -n "$file_magic_glob"; then
                  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
                else
                  libnameglob=$libname
                fi
                libname=`eval "\\$ECHO \"$libname_spec\""`
                if test -n "$file_magic_glob"; then
                  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
                else
                  libnameglob=$libname
                fi
-               test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+               test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
                for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
                for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-                 if test "$want_nocaseglob" = yes; then
+                 if test yes = "$want_nocaseglob"; then
                    shopt -s nocaseglob
                    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
                    $nocaseglob
                    shopt -s nocaseglob
                    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
                    $nocaseglob
@@ -7822,25 +9317,25 @@ EOF
                      # We might still enter an endless loop, since a link
                      # loop can be closed while we follow links,
                      # but so what?
                      # We might still enter an endless loop, since a link
                      # loop can be closed while we follow links,
                      # but so what?
-                     potlib="$potent_lib"
+                     potlib=$potent_lib
                      while test -h "$potlib" 2>/dev/null; do
                      while test -h "$potlib" 2>/dev/null; do
-                       potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+                       potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
                        case $potliblink in
                        case $potliblink in
-                       [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-                       *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+                       [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
+                       *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
                        esac
                      done
                      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
                         $SED -e 10q |
                         $EGREP "$file_magic_regex" > /dev/null; then
                        func_append newdeplibs " $a_deplib"
                        esac
                      done
                      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
                         $SED -e 10q |
                         $EGREP "$file_magic_regex" > /dev/null; then
                        func_append newdeplibs " $a_deplib"
-                       a_deplib=""
+                       a_deplib=
                        break 2
                      fi
                  done
                done
              fi
                        break 2
                      fi
                  done
                done
              fi
-             if test -n "$a_deplib" ; then
+             if test -n "$a_deplib"; then
                droppeddeps=yes
                echo
                $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
                droppeddeps=yes
                echo
                $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7848,7 +9343,7 @@ EOF
                echo "*** you link to this library.  But I can only do this if you have a"
                echo "*** shared version of the library, which you do not appear to have"
                echo "*** because I did check the linker path looking for a file starting"
                echo "*** you link to this library.  But I can only do this if you have a"
                echo "*** shared version of the library, which you do not appear to have"
                echo "*** because I did check the linker path looking for a file starting"
-               if test -z "$potlib" ; then
+               if test -z "$potlib"; then
                  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
                else
                  $ECHO "*** with $libname and none of the candidates passed a file format test"
                  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
                else
                  $ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7871,30 +9366,30 @@ EOF
            -l*)
              func_stripname -l '' "$a_deplib"
              name=$func_stripname_result
            -l*)
              func_stripname -l '' "$a_deplib"
              name=$func_stripname_result
-             if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+             if test yes = "$allow_libtool_libs_with_static_runtimes"; then
                case " $predeps $postdeps " in
                *" $a_deplib "*)
                  func_append newdeplibs " $a_deplib"
                case " $predeps $postdeps " in
                *" $a_deplib "*)
                  func_append newdeplibs " $a_deplib"
-                 a_deplib=""
+                 a_deplib=
                  ;;
                esac
              fi
                  ;;
                esac
              fi
-             if test -n "$a_deplib" ; then
+             if test -n "$a_deplib"; then
                libname=`eval "\\$ECHO \"$libname_spec\""`
                for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
                  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
                  for potent_lib in $potential_libs; do
                libname=`eval "\\$ECHO \"$libname_spec\""`
                for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
                  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
                  for potent_lib in $potential_libs; do
-                   potlib="$potent_lib" # see symlink-check above in file_magic test
+                   potlib=$potent_lib # see symlink-check above in file_magic test
                    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
                       $EGREP "$match_pattern_regex" > /dev/null; then
                      func_append newdeplibs " $a_deplib"
                    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
                       $EGREP "$match_pattern_regex" > /dev/null; then
                      func_append newdeplibs " $a_deplib"
-                     a_deplib=""
+                     a_deplib=
                      break 2
                    fi
                  done
                done
              fi
                      break 2
                    fi
                  done
                done
              fi
-             if test -n "$a_deplib" ; then
+             if test -n "$a_deplib"; then
                droppeddeps=yes
                echo
                $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
                droppeddeps=yes
                echo
                $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7902,7 +9397,7 @@ EOF
                echo "*** you link to this library.  But I can only do this if you have a"
                echo "*** shared version of the library, which you do not appear to have"
                echo "*** because I did check the linker path looking for a file starting"
                echo "*** you link to this library.  But I can only do this if you have a"
                echo "*** shared version of the library, which you do not appear to have"
                echo "*** because I did check the linker path looking for a file starting"
-               if test -z "$potlib" ; then
+               if test -z "$potlib"; then
                  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
                else
                  $ECHO "*** with $libname and none of the candidates passed a file format test"
                  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
                else
                  $ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7918,18 +9413,18 @@ EOF
          done # Gone through all deplibs.
          ;;
        none | unknown | *)
          done # Gone through all deplibs.
          ;;
        none | unknown | *)
-         newdeplibs=""
+         newdeplibs=
          tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
          tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-         if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-           for i in $predeps $postdeps ; do
+         if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+           for i in $predeps $postdeps; do
              # can't use Xsed below, because $i might contain '/'
              # can't use Xsed below, because $i might contain '/'
-             tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+             tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
            done
          fi
          case $tmp_deplibs in
          *[!\  \ ]*)
            echo
            done
          fi
          case $tmp_deplibs in
          *[!\  \ ]*)
            echo
-           if test "X$deplibs_check_method" = "Xnone"; then
+           if test none = "$deplibs_check_method"; then
              echo "*** Warning: inter-library dependencies are not supported in this platform."
            else
              echo "*** Warning: inter-library dependencies are not known to be supported."
              echo "*** Warning: inter-library dependencies are not supported in this platform."
            else
              echo "*** Warning: inter-library dependencies are not known to be supported."
@@ -7953,8 +9448,8 @@ EOF
          ;;
        esac
 
          ;;
        esac
 
-       if test "$droppeddeps" = yes; then
-         if test "$module" = yes; then
+       if test yes = "$droppeddeps"; then
+         if test yes = "$module"; then
            echo
            echo "*** Warning: libtool could not satisfy all declared inter-library"
            $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
            echo
            echo "*** Warning: libtool could not satisfy all declared inter-library"
            $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
@@ -7963,12 +9458,12 @@ EOF
            if test -z "$global_symbol_pipe"; then
              echo
              echo "*** However, this would only work if libtool was able to extract symbol"
            if test -z "$global_symbol_pipe"; then
              echo
              echo "*** However, this would only work if libtool was able to extract symbol"
-             echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+             echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
              echo "*** not find such a program.  So, this module is probably useless."
              echo "*** not find such a program.  So, this module is probably useless."
-             echo "*** \`nm' from GNU binutils and a full rebuild may help."
+             echo "*** 'nm' from GNU binutils and a full rebuild may help."
            fi
            fi
-           if test "$build_old_libs" = no; then
-             oldlibs="$output_objdir/$libname.$libext"
+           if test no = "$build_old_libs"; then
+             oldlibs=$output_objdir/$libname.$libext
              build_libtool_libs=module
              build_old_libs=yes
            else
              build_libtool_libs=module
              build_old_libs=yes
            else
@@ -7979,14 +9474,14 @@ EOF
            echo "*** automatically added whenever a program is linked with this library"
            echo "*** or is declared to -dlopen it."
 
            echo "*** automatically added whenever a program is linked with this library"
            echo "*** or is declared to -dlopen it."
 
-           if test "$allow_undefined" = no; then
+           if test no = "$allow_undefined"; then
              echo
              echo "*** Since this library must not contain undefined symbols,"
              echo "*** because either the platform does not support them or"
              echo "*** it was explicitly requested with -no-undefined,"
              echo "*** libtool will only create a static version of it."
              echo
              echo "*** Since this library must not contain undefined symbols,"
              echo "*** because either the platform does not support them or"
              echo "*** it was explicitly requested with -no-undefined,"
              echo "*** libtool will only create a static version of it."
-             if test "$build_old_libs" = no; then
-               oldlibs="$output_objdir/$libname.$libext"
+             if test no = "$build_old_libs"; then
+               oldlibs=$output_objdir/$libname.$libext
                build_libtool_libs=module
                build_old_libs=yes
              else
                build_libtool_libs=module
                build_old_libs=yes
              else
@@ -8032,7 +9527,7 @@ EOF
        *) func_append new_libs " $deplib" ;;
        esac
       done
        *) func_append new_libs " $deplib" ;;
        esac
       done
-      deplibs="$new_libs"
+      deplibs=$new_libs
 
       # All the library-specific variables (install_libdir is set above).
       library_names=
 
       # All the library-specific variables (install_libdir is set above).
       library_names=
@@ -8040,25 +9535,25 @@ EOF
       dlname=
 
       # Test again, we may have decided not to build it any more
       dlname=
 
       # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-       # Remove ${wl} instances when linking with ld.
+      if test yes = "$build_libtool_libs"; then
+       # Remove $wl instances when linking with ld.
        # FIXME: should test the right _cmds variable.
        case $archive_cmds in
          *\$LD\ *) wl= ;;
         esac
        # FIXME: should test the right _cmds variable.
        case $archive_cmds in
          *\$LD\ *) wl= ;;
         esac
-       if test "$hardcode_into_libs" = yes; then
+       if test yes = "$hardcode_into_libs"; then
          # Hardcode the library paths
          hardcode_libdirs=
          dep_rpath=
          # Hardcode the library paths
          hardcode_libdirs=
          dep_rpath=
-         rpath="$finalize_rpath"
-         test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+         rpath=$finalize_rpath
+         test relink = "$opt_mode" || rpath=$compile_rpath$rpath
          for libdir in $rpath; do
            if test -n "$hardcode_libdir_flag_spec"; then
              if test -n "$hardcode_libdir_separator"; then
                func_replace_sysroot "$libdir"
                libdir=$func_replace_sysroot_result
                if test -z "$hardcode_libdirs"; then
          for libdir in $rpath; do
            if test -n "$hardcode_libdir_flag_spec"; then
              if test -n "$hardcode_libdir_separator"; then
                func_replace_sysroot "$libdir"
                libdir=$func_replace_sysroot_result
                if test -z "$hardcode_libdirs"; then
-                 hardcode_libdirs="$libdir"
+                 hardcode_libdirs=$libdir
                else
                  # Just accumulate the unique libdirs.
                  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
                else
                  # Just accumulate the unique libdirs.
                  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8083,7 +9578,7 @@ EOF
          # Substitute the hardcoded libdirs into the rpath.
          if test -n "$hardcode_libdir_separator" &&
             test -n "$hardcode_libdirs"; then
          # Substitute the hardcoded libdirs into the rpath.
          if test -n "$hardcode_libdir_separator" &&
             test -n "$hardcode_libdirs"; then
-           libdir="$hardcode_libdirs"
+           libdir=$hardcode_libdirs
            eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
          fi
          if test -n "$runpath_var" && test -n "$perm_rpath"; then
            eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
          fi
          if test -n "$runpath_var" && test -n "$perm_rpath"; then
@@ -8097,8 +9592,8 @@ EOF
          test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
        fi
 
          test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
        fi
 
-       shlibpath="$finalize_shlibpath"
-       test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+       shlibpath=$finalize_shlibpath
+       test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
        if test -n "$shlibpath"; then
          eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
        fi
        if test -n "$shlibpath"; then
          eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
        fi
@@ -8108,19 +9603,19 @@ EOF
        eval library_names=\"$library_names_spec\"
        set dummy $library_names
        shift
        eval library_names=\"$library_names_spec\"
        set dummy $library_names
        shift
-       realname="$1"
+       realname=$1
        shift
 
        if test -n "$soname_spec"; then
          eval soname=\"$soname_spec\"
        else
        shift
 
        if test -n "$soname_spec"; then
          eval soname=\"$soname_spec\"
        else
-         soname="$realname"
+         soname=$realname
        fi
        if test -z "$dlname"; then
          dlname=$soname
        fi
 
        fi
        if test -z "$dlname"; then
          dlname=$soname
        fi
 
-       lib="$output_objdir/$realname"
+       lib=$output_objdir/$realname
        linknames=
        for link
        do
        linknames=
        for link
        do
@@ -8134,7 +9629,7 @@ EOF
        delfiles=
        if test -n "$export_symbols" && test -n "$include_expsyms"; then
          $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
        delfiles=
        if test -n "$export_symbols" && test -n "$include_expsyms"; then
          $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-         export_symbols="$output_objdir/$libname.uexp"
+         export_symbols=$output_objdir/$libname.uexp
          func_append delfiles " $export_symbols"
        fi
 
          func_append delfiles " $export_symbols"
        fi
 
@@ -8143,31 +9638,31 @@ EOF
        cygwin* | mingw* | cegcc*)
          if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
            # exporting using user supplied symfile
        cygwin* | mingw* | cegcc*)
          if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
            # exporting using user supplied symfile
-           if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+           func_dll_def_p "$export_symbols" || {
              # and it's NOT already a .def file. Must figure out
              # which of the given symbols are data symbols and tag
              # them as such. So, trigger use of export_symbols_cmds.
              # export_symbols gets reassigned inside the "prepare
              # the list of exported symbols" if statement, so the
              # include_expsyms logic still works.
              # and it's NOT already a .def file. Must figure out
              # which of the given symbols are data symbols and tag
              # them as such. So, trigger use of export_symbols_cmds.
              # export_symbols gets reassigned inside the "prepare
              # the list of exported symbols" if statement, so the
              # include_expsyms logic still works.
-             orig_export_symbols="$export_symbols"
+             orig_export_symbols=$export_symbols
              export_symbols=
              always_export_symbols=yes
              export_symbols=
              always_export_symbols=yes
-           fi
+           }
          fi
          ;;
        esac
 
        # Prepare the list of exported symbols
        if test -z "$export_symbols"; then
          fi
          ;;
        esac
 
        # Prepare the list of exported symbols
        if test -z "$export_symbols"; then
-         if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-           func_verbose "generating symbol list for \`$libname.la'"
-           export_symbols="$output_objdir/$libname.exp"
+         if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
+           func_verbose "generating symbol list for '$libname.la'"
+           export_symbols=$output_objdir/$libname.exp
            $opt_dry_run || $RM $export_symbols
            cmds=$export_symbols_cmds
            $opt_dry_run || $RM $export_symbols
            cmds=$export_symbols_cmds
-           save_ifs="$IFS"; IFS='~'
+           save_ifs=$IFS; IFS='~'
            for cmd1 in $cmds; do
            for cmd1 in $cmds; do
-             IFS="$save_ifs"
+             IFS=$save_ifs
              # Take the normal branch if the nm_file_list_spec branch
              # doesn't work or if tool conversion is not needed.
              case $nm_file_list_spec~$to_tool_file_cmd in
              # Take the normal branch if the nm_file_list_spec branch
              # doesn't work or if tool conversion is not needed.
              case $nm_file_list_spec~$to_tool_file_cmd in
@@ -8181,7 +9676,7 @@ EOF
                  try_normal_branch=no
                  ;;
              esac
                  try_normal_branch=no
                  ;;
              esac
-             if test "$try_normal_branch" = yes \
+             if test yes = "$try_normal_branch" \
                 && { test "$len" -lt "$max_cmd_len" \
                      || test "$max_cmd_len" -le -1; }
              then
                 && { test "$len" -lt "$max_cmd_len" \
                      || test "$max_cmd_len" -le -1; }
              then
@@ -8192,7 +9687,7 @@ EOF
                output_la=$func_basename_result
                save_libobjs=$libobjs
                save_output=$output
                output_la=$func_basename_result
                save_libobjs=$libobjs
                save_output=$output
-               output=${output_objdir}/${output_la}.nm
+               output=$output_objdir/$output_la.nm
                func_to_tool_file "$output"
                libobjs=$nm_file_list_spec$func_to_tool_file_result
                func_append delfiles " $output"
                func_to_tool_file "$output"
                libobjs=$nm_file_list_spec$func_to_tool_file_result
                func_append delfiles " $output"
@@ -8215,8 +9710,8 @@ EOF
                break
              fi
            done
                break
              fi
            done
-           IFS="$save_ifs"
-           if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+           IFS=$save_ifs
+           if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
              func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
              func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
            fi
              func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
              func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
            fi
@@ -8224,16 +9719,16 @@ EOF
        fi
 
        if test -n "$export_symbols" && test -n "$include_expsyms"; then
        fi
 
        if test -n "$export_symbols" && test -n "$include_expsyms"; then
-         tmp_export_symbols="$export_symbols"
-         test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+         tmp_export_symbols=$export_symbols
+         test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
          $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
        fi
 
          $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
        fi
 
-       if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+       if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
          # The given exports_symbols file has to be filtered, so filter it.
          # The given exports_symbols file has to be filtered, so filter it.
-         func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+         func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
          # FIXME: $output_objdir/$libname.filter potentially contains lots of
          # FIXME: $output_objdir/$libname.filter potentially contains lots of
-         # 's' commands which not all seds can handle. GNU sed should be fine
+         # 's' commands, which not all seds can handle. GNU sed should be fine
          # though. Also, the filter scales superlinearly with the number of
          # global variables. join(1) would be nice here, but unfortunately
          # isn't a blessed tool.
          # though. Also, the filter scales superlinearly with the number of
          # global variables. join(1) would be nice here, but unfortunately
          # isn't a blessed tool.
@@ -8252,11 +9747,11 @@ EOF
            ;;
          esac
        done
            ;;
          esac
        done
-       deplibs="$tmp_deplibs"
+       deplibs=$tmp_deplibs
 
        if test -n "$convenience"; then
          if test -n "$whole_archive_flag_spec" &&
 
        if test -n "$convenience"; then
          if test -n "$whole_archive_flag_spec" &&
-           test "$compiler_needs_object" = yes &&
+           test yes = "$compiler_needs_object" &&
            test -z "$libobjs"; then
            # extract the archives, so we have objects to list.
            # TODO: could optimize this to just extract one archive.
            test -z "$libobjs"; then
            # extract the archives, so we have objects to list.
            # TODO: could optimize this to just extract one archive.
@@ -8267,7 +9762,7 @@ EOF
            eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
            test "X$libobjs" = "X " && libobjs=
          else
            eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
            test "X$libobjs" = "X " && libobjs=
          else
-           gentop="$output_objdir/${outputname}x"
+           gentop=$output_objdir/${outputname}x
            func_append generated " $gentop"
 
            func_extract_archives $gentop $convenience
            func_append generated " $gentop"
 
            func_extract_archives $gentop $convenience
@@ -8276,18 +9771,18 @@ EOF
          fi
        fi
 
          fi
        fi
 
-       if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+       if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
          eval flag=\"$thread_safe_flag_spec\"
          func_append linker_flags " $flag"
        fi
 
        # Make a backup of the uninstalled library when relinking
          eval flag=\"$thread_safe_flag_spec\"
          func_append linker_flags " $flag"
        fi
 
        # Make a backup of the uninstalled library when relinking
-       if test "$opt_mode" = relink; then
+       if test relink = "$opt_mode"; then
          $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
        fi
 
        # Do each of the archive commands.
          $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
        fi
 
        # Do each of the archive commands.
-       if test "$module" = yes && test -n "$module_cmds" ; then
+       if test yes = "$module" && test -n "$module_cmds"; then
          if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
            eval test_cmds=\"$module_expsym_cmds\"
            cmds=$module_expsym_cmds
          if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
            eval test_cmds=\"$module_expsym_cmds\"
            cmds=$module_expsym_cmds
@@ -8305,7 +9800,7 @@ EOF
          fi
        fi
 
          fi
        fi
 
-       if test "X$skipped_export" != "X:" &&
+       if test : != "$skipped_export" &&
           func_len " $test_cmds" &&
           len=$func_len_result &&
           test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
           func_len " $test_cmds" &&
           len=$func_len_result &&
           test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
@@ -8338,8 +9833,8 @@ EOF
          last_robj=
          k=1
 
          last_robj=
          k=1
 
-         if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-           output=${output_objdir}/${output_la}.lnkscript
+         if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+           output=$output_objdir/$output_la.lnkscript
            func_verbose "creating GNU ld script: $output"
            echo 'INPUT (' > $output
            for obj in $save_libobjs
            func_verbose "creating GNU ld script: $output"
            echo 'INPUT (' > $output
            for obj in $save_libobjs
@@ -8351,14 +9846,14 @@ EOF
            func_append delfiles " $output"
            func_to_tool_file "$output"
            output=$func_to_tool_file_result
            func_append delfiles " $output"
            func_to_tool_file "$output"
            output=$func_to_tool_file_result
-         elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-           output=${output_objdir}/${output_la}.lnk
+         elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+           output=$output_objdir/$output_la.lnk
            func_verbose "creating linker input file list: $output"
            : > $output
            set x $save_libobjs
            shift
            firstobj=
            func_verbose "creating linker input file list: $output"
            : > $output
            set x $save_libobjs
            shift
            firstobj=
-           if test "$compiler_needs_object" = yes; then
+           if test yes = "$compiler_needs_object"; then
              firstobj="$1 "
              shift
            fi
              firstobj="$1 "
              shift
            fi
@@ -8373,7 +9868,7 @@ EOF
          else
            if test -n "$save_libobjs"; then
              func_verbose "creating reloadable object files..."
          else
            if test -n "$save_libobjs"; then
              func_verbose "creating reloadable object files..."
-             output=$output_objdir/$output_la-${k}.$objext
+             output=$output_objdir/$output_la-$k.$objext
              eval test_cmds=\"$reload_cmds\"
              func_len " $test_cmds"
              len0=$func_len_result
              eval test_cmds=\"$reload_cmds\"
              func_len " $test_cmds"
              len0=$func_len_result
@@ -8385,13 +9880,13 @@ EOF
                func_len " $obj"
                func_arith $len + $func_len_result
                len=$func_arith_result
                func_len " $obj"
                func_arith $len + $func_len_result
                len=$func_arith_result
-               if test "X$objlist" = X ||
+               if test -z "$objlist" ||
                   test "$len" -lt "$max_cmd_len"; then
                  func_append objlist " $obj"
                else
                  # The command $test_cmds is almost too long, add a
                  # command to the queue.
                   test "$len" -lt "$max_cmd_len"; then
                  func_append objlist " $obj"
                else
                  # The command $test_cmds is almost too long, add a
                  # command to the queue.
-                 if test "$k" -eq 1 ; then
+                 if test 1 -eq "$k"; then
                    # The first file doesn't have a previous command to add.
                    reload_objs=$objlist
                    eval concat_cmds=\"$reload_cmds\"
                    # The first file doesn't have a previous command to add.
                    reload_objs=$objlist
                    eval concat_cmds=\"$reload_cmds\"
@@ -8401,10 +9896,10 @@ EOF
                    reload_objs="$objlist $last_robj"
                    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
                  fi
                    reload_objs="$objlist $last_robj"
                    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
                  fi
-                 last_robj=$output_objdir/$output_la-${k}.$objext
+                 last_robj=$output_objdir/$output_la-$k.$objext
                  func_arith $k + 1
                  k=$func_arith_result
                  func_arith $k + 1
                  k=$func_arith_result
-                 output=$output_objdir/$output_la-${k}.$objext
+                 output=$output_objdir/$output_la-$k.$objext
                  objlist=" $obj"
                  func_len " $last_robj"
                  func_arith $len0 + $func_len_result
                  objlist=" $obj"
                  func_len " $last_robj"
                  func_arith $len0 + $func_len_result
@@ -8416,9 +9911,9 @@ EOF
              # files will link in the last one created.
              test -z "$concat_cmds" || concat_cmds=$concat_cmds~
              reload_objs="$objlist $last_robj"
              # files will link in the last one created.
              test -z "$concat_cmds" || concat_cmds=$concat_cmds~
              reload_objs="$objlist $last_robj"
-             eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+             eval concat_cmds=\"\$concat_cmds$reload_cmds\"
              if test -n "$last_robj"; then
              if test -n "$last_robj"; then
-               eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+               eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
              fi
              func_append delfiles " $output"
 
              fi
              func_append delfiles " $output"
 
@@ -8426,9 +9921,9 @@ EOF
              output=
            fi
 
              output=
            fi
 
-           if ${skipped_export-false}; then
-             func_verbose "generating symbol list for \`$libname.la'"
-             export_symbols="$output_objdir/$libname.exp"
+           ${skipped_export-false} && {
+             func_verbose "generating symbol list for '$libname.la'"
+             export_symbols=$output_objdir/$libname.exp
              $opt_dry_run || $RM $export_symbols
              libobjs=$output
              # Append the command to create the export file.
              $opt_dry_run || $RM $export_symbols
              libobjs=$output
              # Append the command to create the export file.
@@ -8437,16 +9932,16 @@ EOF
              if test -n "$last_robj"; then
                eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
              fi
              if test -n "$last_robj"; then
                eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
              fi
-           fi
+           }
 
            test -n "$save_libobjs" &&
              func_verbose "creating a temporary reloadable object file: $output"
 
            # Loop through the commands generated above and execute them.
 
            test -n "$save_libobjs" &&
              func_verbose "creating a temporary reloadable object file: $output"
 
            # Loop through the commands generated above and execute them.
-           save_ifs="$IFS"; IFS='~'
+           save_ifs=$IFS; IFS='~'
            for cmd in $concat_cmds; do
            for cmd in $concat_cmds; do
-             IFS="$save_ifs"
-             $opt_silent || {
+             IFS=$save_ifs
+             $opt_quiet || {
                  func_quote_for_expand "$cmd"
                  eval "func_echo $func_quote_for_expand_result"
              }
                  func_quote_for_expand "$cmd"
                  eval "func_echo $func_quote_for_expand_result"
              }
@@ -8454,7 +9949,7 @@ EOF
                lt_exit=$?
 
                # Restore the uninstalled library and exit
                lt_exit=$?
 
                # Restore the uninstalled library and exit
-               if test "$opt_mode" = relink; then
+               if test relink = "$opt_mode"; then
                  ( cd "$output_objdir" && \
                    $RM "${realname}T" && \
                    $MV "${realname}U" "$realname" )
                  ( cd "$output_objdir" && \
                    $RM "${realname}T" && \
                    $MV "${realname}U" "$realname" )
@@ -8463,7 +9958,7 @@ EOF
                exit $lt_exit
              }
            done
                exit $lt_exit
              }
            done
-           IFS="$save_ifs"
+           IFS=$save_ifs
 
            if test -n "$export_symbols_regex" && ${skipped_export-false}; then
              func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
 
            if test -n "$export_symbols_regex" && ${skipped_export-false}; then
              func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
@@ -8471,18 +9966,18 @@ EOF
            fi
          fi
 
            fi
          fi
 
-          if ${skipped_export-false}; then
+          ${skipped_export-false} && {
            if test -n "$export_symbols" && test -n "$include_expsyms"; then
            if test -n "$export_symbols" && test -n "$include_expsyms"; then
-             tmp_export_symbols="$export_symbols"
-             test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+             tmp_export_symbols=$export_symbols
+             test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
              $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
            fi
 
            if test -n "$orig_export_symbols"; then
              # The given exports_symbols file has to be filtered, so filter it.
              $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
            fi
 
            if test -n "$orig_export_symbols"; then
              # The given exports_symbols file has to be filtered, so filter it.
-             func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+             func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
              # FIXME: $output_objdir/$libname.filter potentially contains lots of
              # FIXME: $output_objdir/$libname.filter potentially contains lots of
-             # 's' commands which not all seds can handle. GNU sed should be fine
+             # 's' commands, which not all seds can handle. GNU sed should be fine
              # though. Also, the filter scales superlinearly with the number of
              # global variables. join(1) would be nice here, but unfortunately
              # isn't a blessed tool.
              # though. Also, the filter scales superlinearly with the number of
              # global variables. join(1) would be nice here, but unfortunately
              # isn't a blessed tool.
@@ -8491,7 +9986,7 @@ EOF
              export_symbols=$output_objdir/$libname.def
              $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
            fi
              export_symbols=$output_objdir/$libname.def
              $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
            fi
-         fi
+         }
 
          libobjs=$output
          # Restore the value of output.
 
          libobjs=$output
          # Restore the value of output.
@@ -8505,7 +10000,7 @@ EOF
          # value of $libobjs for piecewise linking.
 
          # Do each of the archive commands.
          # value of $libobjs for piecewise linking.
 
          # Do each of the archive commands.
-         if test "$module" = yes && test -n "$module_cmds" ; then
+         if test yes = "$module" && test -n "$module_cmds"; then
            if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
              cmds=$module_expsym_cmds
            else
            if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
              cmds=$module_expsym_cmds
            else
@@ -8527,7 +10022,7 @@ EOF
 
        # Add any objects from preloaded convenience libraries
        if test -n "$dlprefiles"; then
 
        # Add any objects from preloaded convenience libraries
        if test -n "$dlprefiles"; then
-         gentop="$output_objdir/${outputname}x"
+         gentop=$output_objdir/${outputname}x
          func_append generated " $gentop"
 
          func_extract_archives $gentop $dlprefiles
          func_append generated " $gentop"
 
          func_extract_archives $gentop $dlprefiles
@@ -8535,11 +10030,12 @@ EOF
          test "X$libobjs" = "X " && libobjs=
        fi
 
          test "X$libobjs" = "X " && libobjs=
        fi
 
-       save_ifs="$IFS"; IFS='~'
+       save_ifs=$IFS; IFS='~'
        for cmd in $cmds; do
        for cmd in $cmds; do
-         IFS="$save_ifs"
+         IFS=$sp$nl
          eval cmd=\"$cmd\"
          eval cmd=\"$cmd\"
-         $opt_silent || {
+         IFS=$save_ifs
+         $opt_quiet || {
            func_quote_for_expand "$cmd"
            eval "func_echo $func_quote_for_expand_result"
          }
            func_quote_for_expand "$cmd"
            eval "func_echo $func_quote_for_expand_result"
          }
@@ -8547,7 +10043,7 @@ EOF
            lt_exit=$?
 
            # Restore the uninstalled library and exit
            lt_exit=$?
 
            # Restore the uninstalled library and exit
-           if test "$opt_mode" = relink; then
+           if test relink = "$opt_mode"; then
              ( cd "$output_objdir" && \
                $RM "${realname}T" && \
                $MV "${realname}U" "$realname" )
              ( cd "$output_objdir" && \
                $RM "${realname}T" && \
                $MV "${realname}U" "$realname" )
@@ -8556,10 +10052,10 @@ EOF
            exit $lt_exit
          }
        done
            exit $lt_exit
          }
        done
-       IFS="$save_ifs"
+       IFS=$save_ifs
 
        # Restore the uninstalled library and exit
 
        # Restore the uninstalled library and exit
-       if test "$opt_mode" = relink; then
+       if test relink = "$opt_mode"; then
          $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
 
          if test -n "$convenience"; then
          $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
 
          if test -n "$convenience"; then
@@ -8579,39 +10075,39 @@ EOF
        done
 
        # If -module or -export-dynamic was specified, set the dlname.
        done
 
        # If -module or -export-dynamic was specified, set the dlname.
-       if test "$module" = yes || test "$export_dynamic" = yes; then
+       if test yes = "$module" || test yes = "$export_dynamic"; then
          # On all known operating systems, these are identical.
          # On all known operating systems, these are identical.
-         dlname="$soname"
+         dlname=$soname
        fi
       fi
       ;;
 
     obj)
        fi
       fi
       ;;
 
     obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-       func_warning "\`-dlopen' is ignored for objects"
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+       func_warning "'-dlopen' is ignored for objects"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
-       func_warning "\`-l' and \`-L' are ignored for objects" ;;
+       func_warning "'-l' and '-L' are ignored for objects" ;;
       esac
 
       test -n "$rpath" && \
       esac
 
       test -n "$rpath" && \
-       func_warning "\`-rpath' is ignored for objects"
+       func_warning "'-rpath' is ignored for objects"
 
       test -n "$xrpath" && \
 
       test -n "$xrpath" && \
-       func_warning "\`-R' is ignored for objects"
+       func_warning "'-R' is ignored for objects"
 
       test -n "$vinfo" && \
 
       test -n "$vinfo" && \
-       func_warning "\`-version-info' is ignored for objects"
+       func_warning "'-version-info' is ignored for objects"
 
       test -n "$release" && \
 
       test -n "$release" && \
-       func_warning "\`-release' is ignored for objects"
+       func_warning "'-release' is ignored for objects"
 
       case $output in
       *.lo)
        test -n "$objs$old_deplibs" && \
 
       case $output in
       *.lo)
        test -n "$objs$old_deplibs" && \
-         func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+         func_fatal_error "cannot build library object '$output' from non-libtool objects"
 
        libobj=$output
        func_lo2o "$libobj"
 
        libobj=$output
        func_lo2o "$libobj"
@@ -8619,7 +10115,7 @@ EOF
        ;;
       *)
        libobj=
        ;;
       *)
        libobj=
-       obj="$output"
+       obj=$output
        ;;
       esac
 
        ;;
       esac
 
@@ -8632,17 +10128,19 @@ EOF
       # the extraction.
       reload_conv_objs=
       gentop=
       # the extraction.
       reload_conv_objs=
       gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
+      # if reload_cmds runs $LD directly, get rid of -Wl from
+      # whole_archive_flag_spec and hope we can get by with turning comma
+      # into space.
+      case $reload_cmds in
+        *\$LD[\ \$]*) wl= ;;
+      esac
       if test -n "$convenience"; then
        if test -n "$whole_archive_flag_spec"; then
          eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
       if test -n "$convenience"; then
        if test -n "$whole_archive_flag_spec"; then
          eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-         reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+         test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+         reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
        else
        else
-         gentop="$output_objdir/${obj}x"
+         gentop=$output_objdir/${obj}x
          func_append generated " $gentop"
 
          func_extract_archives $gentop $convenience
          func_append generated " $gentop"
 
          func_extract_archives $gentop $convenience
@@ -8651,12 +10149,12 @@ EOF
       fi
 
       # If we're not building shared, we need to use non_pic_objs
       fi
 
       # If we're not building shared, we need to use non_pic_objs
-      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+      test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
 
       # Create the old-style object.
 
       # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+      reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
 
 
-      output="$obj"
+      output=$obj
       func_execute_cmds "$reload_cmds" 'exit $?'
 
       # Exit if we aren't doing a library object file.
       func_execute_cmds "$reload_cmds" 'exit $?'
 
       # Exit if we aren't doing a library object file.
@@ -8668,7 +10166,7 @@ EOF
        exit $EXIT_SUCCESS
       fi
 
        exit $EXIT_SUCCESS
       fi
 
-      if test "$build_libtool_libs" != yes; then
+      test yes = "$build_libtool_libs" || {
        if test -n "$gentop"; then
          func_show_eval '${RM}r "$gentop"'
        fi
        if test -n "$gentop"; then
          func_show_eval '${RM}r "$gentop"'
        fi
@@ -8678,12 +10176,12 @@ EOF
        # $show "echo timestamp > $libobj"
        # $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
        exit $EXIT_SUCCESS
        # $show "echo timestamp > $libobj"
        # $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
        exit $EXIT_SUCCESS
-      fi
+      }
 
 
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
+      if test -n "$pic_flag" || test default != "$pic_mode"; then
        # Only do commands if we really have different PIC objects.
        reload_objs="$libobjs $reload_conv_objs"
        # Only do commands if we really have different PIC objects.
        reload_objs="$libobjs $reload_conv_objs"
-       output="$libobj"
+       output=$libobj
        func_execute_cmds "$reload_cmds" 'exit $?'
       fi
 
        func_execute_cmds "$reload_cmds" 'exit $?'
       fi
 
@@ -8700,16 +10198,14 @@ EOF
                  output=$func_stripname_result.exe;;
       esac
       test -n "$vinfo" && \
                  output=$func_stripname_result.exe;;
       esac
       test -n "$vinfo" && \
-       func_warning "\`-version-info' is ignored for programs"
+       func_warning "'-version-info' is ignored for programs"
 
       test -n "$release" && \
 
       test -n "$release" && \
-       func_warning "\`-release' is ignored for programs"
+       func_warning "'-release' is ignored for programs"
 
 
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-       && test "$dlopen_self" = unknown \
-       && test "$dlopen_self_static" = unknown && \
-         func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+      $preload \
+       && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+       && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
 
       case $host in
       *-*-rhapsody* | *-*-darwin1.[012])
 
       case $host in
       *-*-rhapsody* | *-*-darwin1.[012])
@@ -8723,11 +10219,11 @@ EOF
       *-*-darwin*)
        # Don't allow lazy linking, it breaks C++ global constructors
        # But is supposedly fixed on 10.4 or later (yay!).
       *-*-darwin*)
        # Don't allow lazy linking, it breaks C++ global constructors
        # But is supposedly fixed on 10.4 or later (yay!).
-       if test "$tagname" = CXX ; then
+       if test CXX = "$tagname"; then
          case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
            10.[0123])
          case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
            10.[0123])
-             func_append compile_command " ${wl}-bind_at_load"
-             func_append finalize_command " ${wl}-bind_at_load"
+             func_append compile_command " $wl-bind_at_load"
+             func_append finalize_command " $wl-bind_at_load"
            ;;
          esac
        fi
            ;;
          esac
        fi
@@ -8763,7 +10259,7 @@ EOF
        *) func_append new_libs " $deplib" ;;
        esac
       done
        *) func_append new_libs " $deplib" ;;
        esac
       done
-      compile_deplibs="$new_libs"
+      compile_deplibs=$new_libs
 
 
       func_append compile_command " $compile_deplibs"
 
 
       func_append compile_command " $compile_deplibs"
@@ -8787,7 +10283,7 @@ EOF
        if test -n "$hardcode_libdir_flag_spec"; then
          if test -n "$hardcode_libdir_separator"; then
            if test -z "$hardcode_libdirs"; then
        if test -n "$hardcode_libdir_flag_spec"; then
          if test -n "$hardcode_libdir_separator"; then
            if test -z "$hardcode_libdirs"; then
-             hardcode_libdirs="$libdir"
+             hardcode_libdirs=$libdir
            else
              # Just accumulate the unique libdirs.
              case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
            else
              # Just accumulate the unique libdirs.
              case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8810,7 +10306,7 @@ EOF
        fi
        case $host in
        *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
        fi
        case $host in
        *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-         testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+         testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
          case :$dllsearchpath: in
          *":$libdir:"*) ;;
          ::) dllsearchpath=$libdir;;
          case :$dllsearchpath: in
          *":$libdir:"*) ;;
          ::) dllsearchpath=$libdir;;
@@ -8827,10 +10323,10 @@ EOF
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
         test -n "$hardcode_libdirs"; then
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
         test -n "$hardcode_libdirs"; then
-       libdir="$hardcode_libdirs"
+       libdir=$hardcode_libdirs
        eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
        eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
-      compile_rpath="$rpath"
+      compile_rpath=$rpath
 
       rpath=
       hardcode_libdirs=
 
       rpath=
       hardcode_libdirs=
@@ -8838,7 +10334,7 @@ EOF
        if test -n "$hardcode_libdir_flag_spec"; then
          if test -n "$hardcode_libdir_separator"; then
            if test -z "$hardcode_libdirs"; then
        if test -n "$hardcode_libdir_flag_spec"; then
          if test -n "$hardcode_libdir_separator"; then
            if test -z "$hardcode_libdirs"; then
-             hardcode_libdirs="$libdir"
+             hardcode_libdirs=$libdir
            else
              # Just accumulate the unique libdirs.
              case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
            else
              # Just accumulate the unique libdirs.
              case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8863,45 +10359,43 @@ EOF
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
         test -n "$hardcode_libdirs"; then
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
         test -n "$hardcode_libdirs"; then
-       libdir="$hardcode_libdirs"
+       libdir=$hardcode_libdirs
        eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
        eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
-      finalize_rpath="$rpath"
+      finalize_rpath=$rpath
 
 
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+      if test -n "$libobjs" && test yes = "$build_old_libs"; then
        # Transform all the library objects into standard objects.
        compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
        finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
       fi
 
        # Transform all the library objects into standard objects.
        compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
        finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
       fi
 
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+      func_generate_dlsyms "$outputname" "@PROGRAM@" false
 
       # template prelinking step
       if test -n "$prelink_cmds"; then
        func_execute_cmds "$prelink_cmds" 'exit $?'
       fi
 
 
       # template prelinking step
       if test -n "$prelink_cmds"; then
        func_execute_cmds "$prelink_cmds" 'exit $?'
       fi
 
-      wrappers_required=yes
+      wrappers_required=:
       case $host in
       *cegcc* | *mingw32ce*)
         # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
       case $host in
       *cegcc* | *mingw32ce*)
         # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
+        wrappers_required=false
         ;;
       *cygwin* | *mingw* )
         ;;
       *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
+        test yes = "$build_libtool_libs" || wrappers_required=false
         ;;
       *)
         ;;
       *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
+        if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+          wrappers_required=false
         fi
         ;;
       esac
         fi
         ;;
       esac
-      if test "$wrappers_required" = no; then
+      $wrappers_required || {
        # Replace the output file specification.
        compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
        # Replace the output file specification.
        compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-       link_command="$compile_command$compile_rpath"
+       link_command=$compile_command$compile_rpath
 
        # We have no uninstalled library dependencies, so finalize right now.
        exit_status=0
 
        # We have no uninstalled library dependencies, so finalize right now.
        exit_status=0
@@ -8914,12 +10408,12 @@ EOF
        fi
 
        # Delete the generated files.
        fi
 
        # Delete the generated files.
-       if test -f "$output_objdir/${outputname}S.${objext}"; then
-         func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+       if test -f "$output_objdir/${outputname}S.$objext"; then
+         func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
        fi
 
        exit $exit_status
        fi
 
        exit $exit_status
-      fi
+      }
 
       if test -n "$compile_shlibpath$finalize_shlibpath"; then
        compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
 
       if test -n "$compile_shlibpath$finalize_shlibpath"; then
        compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
@@ -8949,9 +10443,9 @@ EOF
        fi
       fi
 
        fi
       fi
 
-      if test "$no_install" = yes; then
+      if test yes = "$no_install"; then
        # We don't need to create a wrapper script.
        # We don't need to create a wrapper script.
-       link_command="$compile_var$compile_command$compile_rpath"
+       link_command=$compile_var$compile_command$compile_rpath
        # Replace the output file specification.
        link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
        # Delete the old output file.
        # Replace the output file specification.
        link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
        # Delete the old output file.
@@ -8968,27 +10462,28 @@ EOF
        exit $EXIT_SUCCESS
       fi
 
        exit $EXIT_SUCCESS
       fi
 
-      if test "$hardcode_action" = relink; then
-       # Fast installation is not supported
-       link_command="$compile_var$compile_command$compile_rpath"
-       relink_command="$finalize_var$finalize_command$finalize_rpath"
+      case $hardcode_action,$fast_install in
+        relink,*)
+         # Fast installation is not supported
+         link_command=$compile_var$compile_command$compile_rpath
+         relink_command=$finalize_var$finalize_command$finalize_rpath
 
 
-       func_warning "this platform does not like uninstalled shared libraries"
-       func_warning "\`$output' will be relinked during installation"
-      else
-       if test "$fast_install" != no; then
-         link_command="$finalize_var$compile_command$finalize_rpath"
-         if test "$fast_install" = yes; then
-           relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-         else
-           # fast_install is set to needless
-           relink_command=
-         fi
-       else
-         link_command="$compile_var$compile_command$compile_rpath"
-         relink_command="$finalize_var$finalize_command$finalize_rpath"
-       fi
-      fi
+         func_warning "this platform does not like uninstalled shared libraries"
+         func_warning "'$output' will be relinked during installation"
+         ;;
+        *,yes)
+         link_command=$finalize_var$compile_command$finalize_rpath
+         relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+          ;;
+       *,no)
+         link_command=$compile_var$compile_command$compile_rpath
+         relink_command=$finalize_var$finalize_command$finalize_rpath
+          ;;
+       *,needless)
+         link_command=$finalize_var$compile_command$finalize_rpath
+         relink_command=
+          ;;
+      esac
 
       # Replace the output file specification.
       link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
 
       # Replace the output file specification.
       link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
@@ -9045,8 +10540,8 @@ EOF
            func_dirname_and_basename "$output" "" "."
            output_name=$func_basename_result
            output_path=$func_dirname_result
            func_dirname_and_basename "$output" "" "."
            output_name=$func_basename_result
            output_path=$func_dirname_result
-           cwrappersource="$output_path/$objdir/lt-$output_name.c"
-           cwrapper="$output_path/$output_name.exe"
+           cwrappersource=$output_path/$objdir/lt-$output_name.c
+           cwrapper=$output_path/$output_name.exe
            $RM $cwrappersource $cwrapper
            trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
 
            $RM $cwrappersource $cwrapper
            trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
 
@@ -9067,7 +10562,7 @@ EOF
            trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
            $opt_dry_run || {
              # note: this script will not be executed, so do not chmod.
            trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
            $opt_dry_run || {
              # note: this script will not be executed, so do not chmod.
-             if test "x$build" = "x$host" ; then
+             if test "x$build" = "x$host"; then
                $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
              else
                func_emit_wrapper no > $func_ltwrapper_scriptname_result
                $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
              else
                func_emit_wrapper no > $func_ltwrapper_scriptname_result
@@ -9090,25 +10585,27 @@ EOF
     # See if we need to build an old-fashioned archive.
     for oldlib in $oldlibs; do
 
     # See if we need to build an old-fashioned archive.
     for oldlib in $oldlibs; do
 
-      if test "$build_libtool_libs" = convenience; then
-       oldobjs="$libobjs_save $symfileobj"
-       addlibs="$convenience"
-       build_libtool_libs=no
-      else
-       if test "$build_libtool_libs" = module; then
-         oldobjs="$libobjs_save"
+      case $build_libtool_libs in
+        convenience)
+         oldobjs="$libobjs_save $symfileobj"
+         addlibs=$convenience
          build_libtool_libs=no
          build_libtool_libs=no
-       else
+         ;;
+       module)
+         oldobjs=$libobjs_save
+         addlibs=$old_convenience
+         build_libtool_libs=no
+          ;;
+       *)
          oldobjs="$old_deplibs $non_pic_objects"
          oldobjs="$old_deplibs $non_pic_objects"
-         if test "$preload" = yes && test -f "$symfileobj"; then
-           func_append oldobjs " $symfileobj"
-         fi
-       fi
-       addlibs="$old_convenience"
-      fi
+         $preload && test -f "$symfileobj" \
+           && func_append oldobjs " $symfileobj"
+         addlibs=$old_convenience
+         ;;
+      esac
 
       if test -n "$addlibs"; then
 
       if test -n "$addlibs"; then
-       gentop="$output_objdir/${outputname}x"
+       gentop=$output_objdir/${outputname}x
        func_append generated " $gentop"
 
        func_extract_archives $gentop $addlibs
        func_append generated " $gentop"
 
        func_extract_archives $gentop $addlibs
@@ -9116,13 +10613,13 @@ EOF
       fi
 
       # Do each command in the archive commands.
       fi
 
       # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+      if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
        cmds=$old_archive_from_new_cmds
       else
 
        # Add any objects from preloaded convenience libraries
        if test -n "$dlprefiles"; then
        cmds=$old_archive_from_new_cmds
       else
 
        # Add any objects from preloaded convenience libraries
        if test -n "$dlprefiles"; then
-         gentop="$output_objdir/${outputname}x"
+         gentop=$output_objdir/${outputname}x
          func_append generated " $gentop"
 
          func_extract_archives $gentop $dlprefiles
          func_append generated " $gentop"
 
          func_extract_archives $gentop $dlprefiles
@@ -9143,7 +10640,7 @@ EOF
          :
        else
          echo "copying selected object files to avoid basename conflicts..."
          :
        else
          echo "copying selected object files to avoid basename conflicts..."
-         gentop="$output_objdir/${outputname}x"
+         gentop=$output_objdir/${outputname}x
          func_append generated " $gentop"
          func_mkdir_p "$gentop"
          save_oldobjs=$oldobjs
          func_append generated " $gentop"
          func_mkdir_p "$gentop"
          save_oldobjs=$oldobjs
@@ -9152,7 +10649,7 @@ EOF
          for obj in $save_oldobjs
          do
            func_basename "$obj"
          for obj in $save_oldobjs
          do
            func_basename "$obj"
-           objbase="$func_basename_result"
+           objbase=$func_basename_result
            case " $oldobjs " in
            " ") oldobjs=$obj ;;
            *[\ /]"$objbase "*)
            case " $oldobjs " in
            " ") oldobjs=$obj ;;
            *[\ /]"$objbase "*)
@@ -9221,18 +10718,18 @@ EOF
            else
              # the above command should be used before it gets too long
              oldobjs=$objlist
            else
              # the above command should be used before it gets too long
              oldobjs=$objlist
-             if test "$obj" = "$last_oldobj" ; then
+             if test "$obj" = "$last_oldobj"; then
                RANLIB=$save_RANLIB
              fi
              test -z "$concat_cmds" || concat_cmds=$concat_cmds~
                RANLIB=$save_RANLIB
              fi
              test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-             eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+             eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
              objlist=
              len=$len0
            fi
          done
          RANLIB=$save_RANLIB
          oldobjs=$objlist
              objlist=
              len=$len0
            fi
          done
          RANLIB=$save_RANLIB
          oldobjs=$objlist
-         if test "X$oldobjs" = "X" ; then
+         if test -z "$oldobjs"; then
            eval cmds=\"\$concat_cmds\"
          else
            eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
            eval cmds=\"\$concat_cmds\"
          else
            eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
@@ -9249,7 +10746,7 @@ EOF
     case $output in
     *.la)
       old_library=
     case $output in
     *.la)
       old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      test yes = "$build_old_libs" && old_library=$libname.$libext
       func_verbose "creating $output"
 
       # Preserve any variables that may affect compiler behavior
       func_verbose "creating $output"
 
       # Preserve any variables that may affect compiler behavior
@@ -9264,31 +10761,31 @@ EOF
        fi
       done
       # Quote the link command for shipping.
        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="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
+      if test yes = "$hardcode_automatic"; then
        relink_command=
       fi
 
       # Only create the output if not a dry run.
       $opt_dry_run || {
        for installed in no yes; do
        relink_command=
       fi
 
       # Only create the output if not a dry run.
       $opt_dry_run || {
        for installed in no yes; do
-         if test "$installed" = yes; then
+         if test yes = "$installed"; then
            if test -z "$install_libdir"; then
              break
            fi
            if test -z "$install_libdir"; then
              break
            fi
-           output="$output_objdir/$outputname"i
+           output=$output_objdir/${outputname}i
            # Replace all uninstalled libtool libraries with the installed ones
            newdependency_libs=
            for deplib in $dependency_libs; do
              case $deplib in
              *.la)
                func_basename "$deplib"
            # Replace all uninstalled libtool libraries with the installed ones
            newdependency_libs=
            for deplib in $dependency_libs; do
              case $deplib in
              *.la)
                func_basename "$deplib"
-               name="$func_basename_result"
+               name=$func_basename_result
                func_resolve_sysroot "$deplib"
                func_resolve_sysroot "$deplib"
-               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+               eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
                test -z "$libdir" && \
                test -z "$libdir" && \
-                 func_fatal_error "\`$deplib' is not a valid libtool archive"
+                 func_fatal_error "'$deplib' is not a valid libtool archive"
                func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
                ;;
              -L*)
                func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
                ;;
              -L*)
@@ -9304,23 +10801,23 @@ EOF
              *) func_append newdependency_libs " $deplib" ;;
              esac
            done
              *) func_append newdependency_libs " $deplib" ;;
              esac
            done
-           dependency_libs="$newdependency_libs"
+           dependency_libs=$newdependency_libs
            newdlfiles=
 
            for lib in $dlfiles; do
              case $lib in
              *.la)
                func_basename "$lib"
            newdlfiles=
 
            for lib in $dlfiles; do
              case $lib in
              *.la)
                func_basename "$lib"
-               name="$func_basename_result"
-               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+               name=$func_basename_result
+               eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
                test -z "$libdir" && \
                test -z "$libdir" && \
-                 func_fatal_error "\`$lib' is not a valid libtool archive"
+                 func_fatal_error "'$lib' is not a valid libtool archive"
                func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
                ;;
              *) func_append newdlfiles " $lib" ;;
              esac
            done
                func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
                ;;
              *) func_append newdlfiles " $lib" ;;
              esac
            done
-           dlfiles="$newdlfiles"
+           dlfiles=$newdlfiles
            newdlprefiles=
            for lib in $dlprefiles; do
              case $lib in
            newdlprefiles=
            for lib in $dlprefiles; do
              case $lib in
@@ -9330,34 +10827,34 @@ EOF
                # didn't already link the preopened objects directly into
                # the library:
                func_basename "$lib"
                # didn't already link the preopened objects directly into
                # the library:
                func_basename "$lib"
-               name="$func_basename_result"
-               eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+               name=$func_basename_result
+               eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
                test -z "$libdir" && \
                test -z "$libdir" && \
-                 func_fatal_error "\`$lib' is not a valid libtool archive"
+                 func_fatal_error "'$lib' is not a valid libtool archive"
                func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
                ;;
              esac
            done
                func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
                ;;
              esac
            done
-           dlprefiles="$newdlprefiles"
+           dlprefiles=$newdlprefiles
          else
            newdlfiles=
            for lib in $dlfiles; do
              case $lib in
          else
            newdlfiles=
            for lib in $dlfiles; do
              case $lib in
-               [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+               [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
                *) abs=`pwd`"/$lib" ;;
              esac
              func_append newdlfiles " $abs"
            done
                *) abs=`pwd`"/$lib" ;;
              esac
              func_append newdlfiles " $abs"
            done
-           dlfiles="$newdlfiles"
+           dlfiles=$newdlfiles
            newdlprefiles=
            for lib in $dlprefiles; do
              case $lib in
            newdlprefiles=
            for lib in $dlprefiles; do
              case $lib in
-               [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+               [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
                *) abs=`pwd`"/$lib" ;;
              esac
              func_append newdlprefiles " $abs"
            done
                *) abs=`pwd`"/$lib" ;;
              esac
              func_append newdlprefiles " $abs"
            done
-           dlprefiles="$newdlprefiles"
+           dlprefiles=$newdlprefiles
          fi
          $RM $output
          # place dlname in correct position for cygwin
          fi
          $RM $output
          # place dlname in correct position for cygwin
@@ -9373,10 +10870,9 @@ EOF
          case $host,$output,$installed,$module,$dlname in
            *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
              # If a -bindir argument was supplied, place the dll there.
          case $host,$output,$installed,$module,$dlname in
            *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
              # If a -bindir argument was supplied, place the dll there.
-             if test "x$bindir" != x ;
-             then
+             if test -n "$bindir"; then
                func_relative_path "$install_libdir" "$bindir"
                func_relative_path "$install_libdir" "$bindir"
-               tdlname=$func_relative_path_result$dlname
+               tdlname=$func_relative_path_result/$dlname
              else
                # Otherwise fall back on heuristic.
                tdlname=../bin/$dlname
              else
                # Otherwise fall back on heuristic.
                tdlname=../bin/$dlname
@@ -9385,7 +10881,7 @@ EOF
          esac
          $ECHO > $output "\
 # $outputname - a libtool library file
          esac
          $ECHO > $output "\
 # $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
@@ -9399,7 +10895,7 @@ library_names='$library_names'
 # The name of the static archive.
 old_library='$old_library'
 
 # The name of the static archive.
 old_library='$old_library'
 
-# Linker flags that can not go in dependency_libs.
+# Linker flags that cannot go in dependency_libs.
 inherited_linker_flags='$new_inherited_linker_flags'
 
 # Libraries that this one depends upon.
 inherited_linker_flags='$new_inherited_linker_flags'
 
 # Libraries that this one depends upon.
@@ -9425,7 +10921,7 @@ dlpreopen='$dlprefiles'
 
 # Directory that this library needs to be installed in:
 libdir='$install_libdir'"
 
 # Directory that this library needs to be installed in:
 libdir='$install_libdir'"
-         if test "$installed" = no && test "$need_relink" = yes; then
+         if test no,yes = "$installed,$need_relink"; then
            $ECHO >> $output "\
 relink_command=\"$relink_command\""
          fi
            $ECHO >> $output "\
 relink_command=\"$relink_command\""
          fi
@@ -9440,27 +10936,29 @@ relink_command=\"$relink_command\""
     exit $EXIT_SUCCESS
 }
 
     exit $EXIT_SUCCESS
 }
 
-{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
-    func_mode_link ${1+"$@"}
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+  func_mode_link ${1+"$@"}
+fi
 
 
 # func_mode_uninstall arg...
 func_mode_uninstall ()
 {
 
 
 # func_mode_uninstall arg...
 func_mode_uninstall ()
 {
-    $opt_debug
-    RM="$nonopt"
+    $debug_cmd
+
+    RM=$nonopt
     files=
     files=
-    rmforce=
+    rmforce=false
     exit_status=0
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
     exit_status=0
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
-    libtool_install_magic="$magic"
+    libtool_install_magic=$magic
 
     for arg
     do
       case $arg in
 
     for arg
     do
       case $arg in
-      -f) func_append RM " $arg"; rmforce=yes ;;
+      -f) func_append RM " $arg"; rmforce=: ;;
       -*) func_append RM " $arg" ;;
       *) func_append files " $arg" ;;
       esac
       -*) func_append RM " $arg" ;;
       *) func_append files " $arg" ;;
       esac
@@ -9473,18 +10971,18 @@ func_mode_uninstall ()
 
     for file in $files; do
       func_dirname "$file" "" "."
 
     for file in $files; do
       func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-       odir="$objdir"
+      dir=$func_dirname_result
+      if test . = "$dir"; then
+       odir=$objdir
       else
       else
-       odir="$dir/$objdir"
+       odir=$dir/$objdir
       fi
       func_basename "$file"
       fi
       func_basename "$file"
-      name="$func_basename_result"
-      test "$opt_mode" = uninstall && odir="$dir"
+      name=$func_basename_result
+      test uninstall = "$opt_mode" && odir=$dir
 
       # Remember odir for removal later, being careful to avoid duplicates
 
       # Remember odir for removal later, being careful to avoid duplicates
-      if test "$opt_mode" = clean; then
+      if test clean = "$opt_mode"; then
        case " $rmdirs " in
          *" $odir "*) ;;
          *) func_append rmdirs " $odir" ;;
        case " $rmdirs " in
          *" $odir "*) ;;
          *) func_append rmdirs " $odir" ;;
@@ -9499,11 +10997,11 @@ func_mode_uninstall ()
       elif test -d "$file"; then
        exit_status=1
        continue
       elif test -d "$file"; then
        exit_status=1
        continue
-      elif test "$rmforce" = yes; then
+      elif $rmforce; then
        continue
       fi
 
        continue
       fi
 
-      rmfiles="$file"
+      rmfiles=$file
 
       case $name in
       *.la)
 
       case $name in
       *.la)
@@ -9517,7 +11015,7 @@ func_mode_uninstall ()
          done
          test -n "$old_library" && func_append rmfiles " $odir/$old_library"
 
          done
          test -n "$old_library" && func_append rmfiles " $odir/$old_library"
 
-         case "$opt_mode" in
+         case $opt_mode in
          clean)
            case " $library_names " in
            *" $dlname "*) ;;
          clean)
            case " $library_names " in
            *" $dlname "*) ;;
@@ -9528,12 +11026,12 @@ func_mode_uninstall ()
          uninstall)
            if test -n "$library_names"; then
              # Do each command in the postuninstall commands.
          uninstall)
            if test -n "$library_names"; then
              # Do each command in the postuninstall commands.
-             func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+             func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
            fi
 
            if test -n "$old_library"; then
              # Do each command in the old_postuninstall commands.
            fi
 
            if test -n "$old_library"; then
              # Do each command in the old_postuninstall commands.
-             func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+             func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
            fi
            # FIXME: should reinstall the best remaining shared library.
            ;;
            fi
            # FIXME: should reinstall the best remaining shared library.
            ;;
@@ -9549,21 +11047,19 @@ func_mode_uninstall ()
          func_source $dir/$name
 
          # Add PIC object to the list of files to remove.
          func_source $dir/$name
 
          # Add PIC object to the list of files to remove.
-         if test -n "$pic_object" &&
-            test "$pic_object" != none; then
+         if test -n "$pic_object" && test none != "$pic_object"; then
            func_append rmfiles " $dir/$pic_object"
          fi
 
          # Add non-PIC object to the list of files to remove.
            func_append rmfiles " $dir/$pic_object"
          fi
 
          # Add non-PIC object to the list of files to remove.
-         if test -n "$non_pic_object" &&
-            test "$non_pic_object" != none; then
+         if test -n "$non_pic_object" && test none != "$non_pic_object"; then
            func_append rmfiles " $dir/$non_pic_object"
          fi
        fi
        ;;
 
       *)
            func_append rmfiles " $dir/$non_pic_object"
          fi
        fi
        ;;
 
       *)
-       if test "$opt_mode" = clean ; then
+       if test clean = "$opt_mode"; then
          noexename=$name
          case $file in
          *.exe)
          noexename=$name
          case $file in
          *.exe)
@@ -9590,12 +11086,12 @@ func_mode_uninstall ()
 
            # note $name still contains .exe if it was in $file originally
            # as does the version of $file that was added into $rmfiles
 
            # note $name still contains .exe if it was in $file originally
            # as does the version of $file that was added into $rmfiles
-           func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
-           if test "$fast_install" = yes && test -n "$relink_command"; then
+           func_append rmfiles " $odir/$name $odir/${name}S.$objext"
+           if test yes = "$fast_install" && test -n "$relink_command"; then
              func_append rmfiles " $odir/lt-$name"
            fi
              func_append rmfiles " $odir/lt-$name"
            fi
-           if test "X$noexename" != "X$name" ; then
-             func_append rmfiles " $odir/lt-${noexename}.c"
+           if test "X$noexename" != "X$name"; then
+             func_append rmfiles " $odir/lt-$noexename.c"
            fi
          fi
        fi
            fi
          fi
        fi
@@ -9604,7 +11100,7 @@ func_mode_uninstall ()
       func_show_eval "$RM $rmfiles" 'exit_status=1'
     done
 
       func_show_eval "$RM $rmfiles" 'exit_status=1'
     done
 
-    # Try to remove the ${objdir}s in the directories where we deleted files
+    # Try to remove the $objdir's in the directories where we deleted files
     for dir in $rmdirs; do
       if test -d "$dir"; then
        func_show_eval "rmdir $dir >/dev/null 2>&1"
     for dir in $rmdirs; do
       if test -d "$dir"; then
        func_show_eval "rmdir $dir >/dev/null 2>&1"
@@ -9614,16 +11110,17 @@ func_mode_uninstall ()
     exit $exit_status
 }
 
     exit $exit_status
 }
 
-{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+  func_mode_uninstall ${1+"$@"}
+fi
 
 test -z "$opt_mode" && {
 
 test -z "$opt_mode" && {
-  help="$generic_help"
+  help=$generic_help
   func_fatal_help "you must specify a MODE"
 }
 
 test -z "$exec_cmd" && \
   func_fatal_help "you must specify a MODE"
 }
 
 test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$opt_mode'"
+  func_fatal_help "invalid operation mode '$opt_mode'"
 
 if test -n "$exec_cmd"; then
   eval exec "$exec_cmd"
 
 if test -n "$exec_cmd"; then
   eval exec "$exec_cmd"
@@ -9634,7 +11131,7 @@ exit $exit_status
 
 
 # The TAGs below are defined such that we never get into a situation
 
 
 # The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
+# where we disable both kinds of libraries.  Given conflicting
 # choices, we go for a static library, that is the most portable,
 # since we can't tell whether shared libraries were disabled because
 # the user asked for that or because the platform doesn't support
 # choices, we go for a static library, that is the most portable,
 # since we can't tell whether shared libraries were disabled because
 # the user asked for that or because the platform doesn't support
@@ -9657,5 +11154,3 @@ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
 # mode:shell-script
 # sh-indentation:2
 # End:
 # mode:shell-script
 # sh-indentation:2
 # End:
-# vi:sw=2
-
diff --git a/m4/ax_code_coverage.m4 b/m4/ax_code_coverage.m4
new file mode 100644 (file)
index 0000000..6484f03
--- /dev/null
@@ -0,0 +1,264 @@
+# ===========================================================================
+#     https://www.gnu.org/software/autoconf-archive/ax_code_coverage.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CODE_COVERAGE()
+#
+# DESCRIPTION
+#
+#   Defines CODE_COVERAGE_CPPFLAGS, CODE_COVERAGE_CFLAGS,
+#   CODE_COVERAGE_CXXFLAGS and CODE_COVERAGE_LIBS which should be included
+#   in the CPPFLAGS, CFLAGS CXXFLAGS and LIBS/LIBADD variables of every
+#   build target (program or library) which should be built with code
+#   coverage support. Also defines CODE_COVERAGE_RULES which should be
+#   substituted in your Makefile; and $enable_code_coverage which can be
+#   used in subsequent configure output. CODE_COVERAGE_ENABLED is defined
+#   and substituted, and corresponds to the value of the
+#   --enable-code-coverage option, which defaults to being disabled.
+#
+#   Test also for gcov program and create GCOV variable that could be
+#   substituted.
+#
+#   Note that all optimization flags in CFLAGS must be disabled when code
+#   coverage is enabled.
+#
+#   Usage example:
+#
+#   configure.ac:
+#
+#     AX_CODE_COVERAGE
+#
+#   Makefile.am:
+#
+#     @CODE_COVERAGE_RULES@
+#     my_program_LIBS = ... $(CODE_COVERAGE_LIBS) ...
+#     my_program_CPPFLAGS = ... $(CODE_COVERAGE_CPPFLAGS) ...
+#     my_program_CFLAGS = ... $(CODE_COVERAGE_CFLAGS) ...
+#     my_program_CXXFLAGS = ... $(CODE_COVERAGE_CXXFLAGS) ...
+#
+#   This results in a "check-code-coverage" rule being added to any
+#   Makefile.am which includes "@CODE_COVERAGE_RULES@" (assuming the module
+#   has been configured with --enable-code-coverage). Running `make
+#   check-code-coverage` in that directory will run the module's test suite
+#   (`make check`) and build a code coverage report detailing the code which
+#   was touched, then print the URI for the report.
+#
+#   In earlier versions of this macro, CODE_COVERAGE_LDFLAGS was defined
+#   instead of CODE_COVERAGE_LIBS. They are both still defined, but use of
+#   CODE_COVERAGE_LIBS is preferred for clarity; CODE_COVERAGE_LDFLAGS is
+#   deprecated. They have the same value.
+#
+#   This code was derived from Makefile.decl in GLib, originally licenced
+#   under LGPLv2.1+.
+#
+# LICENSE
+#
+#   Copyright (c) 2012, 2016 Philip Withnall
+#   Copyright (c) 2012 Xan Lopez
+#   Copyright (c) 2012 Christian Persch
+#   Copyright (c) 2012 Paolo Borelli
+#   Copyright (c) 2012 Dan Winship
+#   Copyright (c) 2015 Bastien ROUCARIES
+#
+#   This library is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation; either version 2.1 of the License, or (at
+#   your option) any later version.
+#
+#   This library 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 Lesser
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+#serial 25
+
+AC_DEFUN([AX_CODE_COVERAGE],[
+       dnl Check for --enable-code-coverage
+       AC_REQUIRE([AC_PROG_SED])
+
+       # allow to override gcov location
+       AC_ARG_WITH([gcov],
+         [AS_HELP_STRING([--with-gcov[=GCOV]], [use given GCOV for coverage (GCOV=gcov).])],
+         [_AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov],
+         [_AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov])
+
+       AC_MSG_CHECKING([whether to build with code coverage support])
+       AC_ARG_ENABLE([code-coverage],
+         AS_HELP_STRING([--enable-code-coverage],
+         [Whether to enable code coverage support]),,
+         enable_code_coverage=no)
+
+       AM_CONDITIONAL([CODE_COVERAGE_ENABLED], [test x$enable_code_coverage = xyes])
+       AC_SUBST([CODE_COVERAGE_ENABLED], [$enable_code_coverage])
+       AC_MSG_RESULT($enable_code_coverage)
+
+       AS_IF([ test "$enable_code_coverage" = "yes" ], [
+               # check for gcov
+               AC_CHECK_TOOL([GCOV],
+                 [$_AX_CODE_COVERAGE_GCOV_PROG_WITH],
+                 [:])
+               AS_IF([test "X$GCOV" = "X:"],
+                 [AC_MSG_ERROR([gcov is needed to do coverage])])
+               AC_SUBST([GCOV])
+
+               dnl Check if gcc is being used
+               AS_IF([ test "$GCC" = "no" ], [
+                       AC_MSG_ERROR([not compiling with gcc, which is required for gcov code coverage])
+               ])
+
+               AC_CHECK_PROG([LCOV], [lcov], [lcov])
+               AC_CHECK_PROG([GENHTML], [genhtml], [genhtml])
+
+               AS_IF([ test -z "$LCOV" ], [
+                       AC_MSG_ERROR([To enable code coverage reporting you must have lcov installed])
+               ])
+
+               AS_IF([ test -z "$GENHTML" ], [
+                       AC_MSG_ERROR([Could not find genhtml from the lcov package])
+               ])
+
+               dnl Build the code coverage flags
+               dnl Define CODE_COVERAGE_LDFLAGS for backwards compatibility
+               CODE_COVERAGE_CPPFLAGS="-DNDEBUG"
+               CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
+               CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
+               CODE_COVERAGE_LIBS="-lgcov"
+               CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS"
+
+               AC_SUBST([CODE_COVERAGE_CPPFLAGS])
+               AC_SUBST([CODE_COVERAGE_CFLAGS])
+               AC_SUBST([CODE_COVERAGE_CXXFLAGS])
+               AC_SUBST([CODE_COVERAGE_LIBS])
+               AC_SUBST([CODE_COVERAGE_LDFLAGS])
+
+               [CODE_COVERAGE_RULES_CHECK='
+       -$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check
+       $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture
+']
+               [CODE_COVERAGE_RULES_CAPTURE='
+       $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS)
+       $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS)
+       -@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp
+       $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS)
+       @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html"
+']
+               [CODE_COVERAGE_RULES_CLEAN='
+clean: code-coverage-clean
+distclean: code-coverage-clean
+code-coverage-clean:
+       -$(LCOV) --directory $(top_builddir) -z
+       -rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY)
+       -find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete
+']
+       ], [
+               [CODE_COVERAGE_RULES_CHECK='
+       @echo "Need to reconfigure with --enable-code-coverage"
+']
+               CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK"
+               CODE_COVERAGE_RULES_CLEAN=''
+       ])
+
+[CODE_COVERAGE_RULES='
+# Code coverage
+#
+# Optional:
+#  - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting.
+#    Multiple directories may be specified, separated by whitespace.
+#    (Default: $(top_builddir))
+#  - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated
+#    by lcov for code coverage. (Default:
+#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info)
+#  - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage
+#    reports to be created. (Default:
+#    $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage)
+#  - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage,
+#    set to 0 to disable it and leave empty to stay with the default.
+#    (Default: empty)
+#  - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov
+#    instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
+#  - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov
+#    instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+#  - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov
+#  - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the
+#    collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
+#  - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov
+#    instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+#  - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering
+#    lcov instance. (Default: empty)
+#  - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov
+#    instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+#  - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the
+#    genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
+#  - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml
+#    instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
+#  - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore
+#
+# The generated report will be titled using the $(PACKAGE_NAME) and
+# $(PACKAGE_VERSION). In order to add the current git hash to the title,
+# use the git-version-gen script, available online.
+
+# Optional variables
+CODE_COVERAGE_DIRECTORY ?= $(top_builddir)
+CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info
+CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage
+CODE_COVERAGE_BRANCH_COVERAGE ?=
+CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
+--rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
+CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)"
+CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
+CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?=
+CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\
+$(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
+--rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
+CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
+CODE_COVERAGE_IGNORE_PATTERN ?=
+
+GITIGNOREFILES ?=
+GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY)
+
+code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V))
+code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_lcov_cap_0 = @echo "  LCOV   --capture"\
+ $(CODE_COVERAGE_OUTPUT_FILE);
+code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V))
+code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_lcov_ign_0 = @echo "  LCOV   --remove /tmp/*"\
+ $(CODE_COVERAGE_IGNORE_PATTERN);
+code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V))
+code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY))
+code_coverage_v_genhtml_0 = @echo "  GEN   " $(CODE_COVERAGE_OUTPUT_DIRECTORY);
+code_coverage_quiet = $(code_coverage_quiet_$(V))
+code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY))
+code_coverage_quiet_0 = --quiet
+
+# sanitizes the test-name: replaces with underscores: dashes and dots
+code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1)))
+
+# Use recursive makes in order to ignore errors during check
+check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"'
+
+# Capture code coverage data
+code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"'
+
+# Hook rule executed before code-coverage-capture, overridable by the user
+code-coverage-capture-hook:
+
+'"$CODE_COVERAGE_RULES_CLEAN"'
+
+A''M_DISTCHECK_CONFIGURE_FLAGS ?=
+A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage
+
+.PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean
+']
+
+       AC_SUBST([CODE_COVERAGE_RULES])
+       m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([CODE_COVERAGE_RULES])])
+])
index 4c4051e..5fbf9fe 100644 (file)
@@ -1,5 +1,5 @@
 # ===========================================================================
 # ===========================================================================
-#        http://www.gnu.org/software/autoconf-archive/ax_pthread.html
+#        https://www.gnu.org/software/autoconf-archive/ax_pthread.html
 # ===========================================================================
 #
 # SYNOPSIS
 # ===========================================================================
 #
 # SYNOPSIS
@@ -67,7 +67,7 @@
 #   Public License for more details.
 #
 #   You should have received a copy of the GNU General Public License along
 #   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/>.
+#   with this program. If not, see <https://www.gnu.org/licenses/>.
 #
 #   As a special exception, the respective Autoconf Macro's copyright owner
 #   gives unlimited permission to copy, distribute and modify the configure
 #
 #   As a special exception, the respective Autoconf Macro's copyright owner
 #   gives unlimited permission to copy, distribute and modify the configure
@@ -82,7 +82,7 @@
 #   modified version of the Autoconf Macro, you may extend this special
 #   exception to the GPL to apply to your modified version as well.
 
 #   modified version of the Autoconf Macro, you may extend this special
 #   exception to the GPL to apply to your modified version as well.
 
-#serial 23
+#serial 24
 
 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
 AC_DEFUN([AX_PTHREAD], [
 
 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
 AC_DEFUN([AX_PTHREAD], [
index d7c043f..ee80844 100644 (file)
@@ -1,8 +1,6 @@
 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 #
 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
+#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 # This file is free software; the Free Software Foundation gives
 #   Written by Gordon Matzigkeit, 1996
 #
 # This file is free software; the Free Software Foundation gives
 # modifications, as long as this notice is preserved.
 
 m4_define([_LT_COPYING], [dnl
 # modifications, as long as this notice is preserved.
 
 m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool 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 2 of
-# the License, or (at your option) any later version.
+# Copyright (C) 2014 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.
+
+# GNU Libtool 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 2 of 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.
+# 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.
 #
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool 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.
 #
 # You should have received a copy of the GNU General Public License
 # MERCHANTABILITY or FITNESS 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 GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ])
 
 ])
 
-# serial 57 LT_INIT
+# serial 58 LT_INIT
 
 
 # LT_PREREQ(VERSION)
 
 
 # LT_PREREQ(VERSION)
@@ -67,7 +59,7 @@ esac
 # LT_INIT([OPTIONS])
 # ------------------
 AC_DEFUN([LT_INIT],
 # LT_INIT([OPTIONS])
 # ------------------
 AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
 AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
 AC_BEFORE([$0], [LT_LANG])dnl
 AC_BEFORE([$0], [LT_OUTPUT])dnl
 AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
 AC_BEFORE([$0], [LT_LANG])dnl
 AC_BEFORE([$0], [LT_OUTPUT])dnl
@@ -91,7 +83,7 @@ dnl Parse OPTIONS
 _LT_SET_OPTIONS([$0], [$1])
 
 # This can be used to rebuild libtool when needed
 _LT_SET_OPTIONS([$0], [$1])
 
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -111,26 +103,43 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
 dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
 
 
 dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
 
 
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in @S|@*""; do
+      case $cc_temp in
+        compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+        distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
 # _LT_CC_BASENAME(CC)
 # -------------------
 # _LT_CC_BASENAME(CC)
 # -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
 m4_defun([_LT_CC_BASENAME],
 m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
 ])
 
 
 # _LT_FILEUTILS_DEFAULTS
 # ----------------------
 # It is okay to use these file commands and assume they have been set
 ])
 
 
 # _LT_FILEUTILS_DEFAULTS
 # ----------------------
 # It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
 m4_defun([_LT_FILEUTILS_DEFAULTS],
 [: ${CP="cp -f"}
 : ${MV="mv -f"}
 m4_defun([_LT_FILEUTILS_DEFAULTS],
 [: ${CP="cp -f"}
 : ${MV="mv -f"}
@@ -177,15 +186,16 @@ m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
 m4_require([_LT_CMD_OLD_ARCHIVE])dnl
 m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
 m4_require([_LT_WITH_SYSROOT])dnl
 m4_require([_LT_CMD_OLD_ARCHIVE])dnl
 m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
 m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
 
 _LT_CONFIG_LIBTOOL_INIT([
 
 _LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 ])
    setopt NO_GLOB_SUBST
 fi
 ])
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
    setopt NO_GLOB_SUBST
 fi
 
@@ -198,7 +208,7 @@ aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
+  if test set != "${COLLECT_NAMES+set}"; then
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
@@ -209,14 +219,14 @@ esac
 ofile=libtool
 can_build_shared=yes
 
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 
 # which needs '.lib').
 libext=a
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
@@ -269,14 +279,14 @@ no_glob_subst='s/\*/\\\*/g'
 
 # _LT_PROG_LTMAIN
 # ---------------
 
 # _LT_PROG_LTMAIN
 # ---------------
-# Note that this code is called both from `configure', and `config.status'
+# Note that this code is called both from 'configure', and 'config.status'
 # now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
 # now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
 # so we pass a copy along to make sure it has a sensible value anyway.
 m4_defun([_LT_PROG_LTMAIN],
 [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
 _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
 # so we pass a copy along to make sure it has a sensible value anyway.
 m4_defun([_LT_PROG_LTMAIN],
 [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
 _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 ])# _LT_PROG_LTMAIN
 
 
 ])# _LT_PROG_LTMAIN
 
 
@@ -286,7 +296,7 @@ ltmain="$ac_aux_dir/ltmain.sh"
 
 # So that we can recreate a full libtool script including additional
 # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
 
 # So that we can recreate a full libtool script including additional
 # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
+# in macros and then make a single call at the end using the 'libtool'
 # label.
 
 
 # label.
 
 
@@ -421,8 +431,8 @@ m4_define([_lt_decl_all_varnames],
 
 # _LT_CONFIG_STATUS_DECLARE([VARNAME])
 # ------------------------------------
 
 # _LT_CONFIG_STATUS_DECLARE([VARNAME])
 # ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'.  VARNAME
 # must have a single quote delimited value for this to work.
 m4_define([_LT_CONFIG_STATUS_DECLARE],
 [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
 # must have a single quote delimited value for this to work.
 m4_define([_LT_CONFIG_STATUS_DECLARE],
 [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
@@ -446,7 +456,7 @@ m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
 # Output comment and list of tags supported by the script
 m4_defun([_LT_LIBTOOL_TAGS],
 [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
 # Output comment and list of tags supported by the script
 m4_defun([_LT_LIBTOOL_TAGS],
 [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
+available_tags='_LT_TAGS'dnl
 ])
 
 
 ])
 
 
@@ -474,7 +484,7 @@ m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
 # _LT_LIBTOOL_CONFIG_VARS
 # -----------------------
 # Produce commented declarations of non-tagged libtool config variables
 # _LT_LIBTOOL_CONFIG_VARS
 # -----------------------
 # Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
 # script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
 # section) are produced by _LT_LIBTOOL_TAG_VARS.
 m4_defun([_LT_LIBTOOL_CONFIG_VARS],
 # script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
 # section) are produced by _LT_LIBTOOL_TAG_VARS.
 m4_defun([_LT_LIBTOOL_CONFIG_VARS],
@@ -500,8 +510,8 @@ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
 # Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
 # variables for single and double quote escaping we saved from calls
 # to _LT_DECL, we can put quote escaped variables declarations
 # Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
 # variables for single and double quote escaping we saved from calls
 # to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'.  Finally, any additional code accumulated
 # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
 m4_defun([_LT_CONFIG_COMMANDS],
 [AC_PROVIDE_IFELSE([LT_OUTPUT],
 # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
 m4_defun([_LT_CONFIG_COMMANDS],
 [AC_PROVIDE_IFELSE([LT_OUTPUT],
@@ -547,7 +557,7 @@ for var in lt_decl_all_varnames([[ \
 ]], lt_decl_quote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
 ]], lt_decl_quote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -560,7 +570,7 @@ for var in lt_decl_all_varnames([[ \
 ]], lt_decl_dquote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
 ]], lt_decl_dquote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -576,7 +586,7 @@ _LT_OUTPUT_LIBTOOL_INIT
 # Generate a child script FILE with all initialization necessary to
 # reuse the environment learned by the parent script, and make the
 # file executable.  If COMMENT is supplied, it is inserted after the
 # Generate a child script FILE with all initialization necessary to
 # reuse the environment learned by the parent script, and make the
 # file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
+# '#!' sequence but before initialization text begins.  After this
 # macro, additional text can be appended to FILE to form the body of
 # the child script.  The macro ends with non-zero status if the
 # file could not be fully written (such as if the disk is full).
 # macro, additional text can be appended to FILE to form the body of
 # the child script.  The macro ends with non-zero status if the
 # file could not be fully written (such as if the disk is full).
@@ -598,7 +608,7 @@ AS_SHELL_SANITIZE
 _AS_PREPARE
 exec AS_MESSAGE_FD>&1
 _ASEOF
 _AS_PREPARE
 exec AS_MESSAGE_FD>&1
 _ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
 m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
 
 # LT_OUTPUT
 m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
 
 # LT_OUTPUT
@@ -621,7 +631,7 @@ exec AS_MESSAGE_LOG_FD>>config.log
 } >&AS_MESSAGE_LOG_FD
 
 lt_cl_help="\
 } >&AS_MESSAGE_LOG_FD
 
 lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
+'$as_me' creates a local libtool stub from the current configuration,
 for use in further configure time tests before the real libtool is
 generated.
 
 for use in further configure time tests before the real libtool is
 generated.
 
@@ -643,7 +653,7 @@ Copyright (C) 2011 Free Software Foundation, Inc.
 This config.lt script is free software; the Free Software Foundation
 gives unlimited permision to copy, distribute and modify it."
 
 This config.lt script is free software; the Free Software Foundation
 gives unlimited permision to copy, distribute and modify it."
 
-while test $[#] != 0
+while test 0 != $[#]
 do
   case $[1] in
     --version | --v* | -V )
 do
   case $[1] in
     --version | --v* | -V )
@@ -656,10 +666,10 @@ do
       lt_cl_silent=: ;;
 
     -*) AC_MSG_ERROR([unrecognized option: $[1]
       lt_cl_silent=: ;;
 
     -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
 
     *) AC_MSG_ERROR([unrecognized argument: $[1]
 
     *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
   esac
   shift
 done
   esac
   shift
 done
@@ -685,7 +695,7 @@ chmod +x "$CONFIG_LT"
 # open by configure.  Here we exec the FD to /dev/null, effectively closing
 # config.log, so it can be properly (re)opened and appended to by config.lt.
 lt_cl_success=:
 # open by configure.  Here we exec the FD to /dev/null, effectively closing
 # config.log, so it can be properly (re)opened and appended to by config.lt.
 lt_cl_success=:
-test "$silent" = yes &&
+test yes = "$silent" &&
   lt_config_lt_args="$lt_config_lt_args --quiet"
 exec AS_MESSAGE_LOG_FD>/dev/null
 $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
   lt_config_lt_args="$lt_config_lt_args --quiet"
 exec AS_MESSAGE_LOG_FD>/dev/null
 $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
@@ -705,27 +715,30 @@ m4_defun([_LT_CONFIG],
 _LT_CONFIG_SAVE_COMMANDS([
   m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
   m4_if(_LT_TAG, [C], [
 _LT_CONFIG_SAVE_COMMANDS([
   m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
   m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
 _LT_COPYING
 _LT_LIBTOOL_TAGS
 
 _LT_COPYING
 _LT_LIBTOOL_TAGS
 
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
 # ### BEGIN LIBTOOL CONFIG
 _LT_LIBTOOL_CONFIG_VARS
 _LT_LIBTOOL_TAG_VARS
 # ### BEGIN LIBTOOL CONFIG
 _LT_LIBTOOL_CONFIG_VARS
 _LT_LIBTOOL_TAG_VARS
@@ -733,13 +746,24 @@ _LT_LIBTOOL_TAG_VARS
 
 _LT_EOF
 
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -756,8 +780,6 @@ _LT_EOF
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  _LT_PROG_REPLACE_SHELLFNS
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
@@ -775,7 +797,6 @@ _LT_EOF
 [m4_if([$1], [], [
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
 [m4_if([$1], [], [
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'], [])
 ])dnl /_LT_CONFIG_SAVE_COMMANDS
     RM='$RM'
     ofile='$ofile'], [])
 ])dnl /_LT_CONFIG_SAVE_COMMANDS
@@ -974,7 +995,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
 
     AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
       [lt_cv_apple_cc_single_mod=no
 
     AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
       [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
+      if test -z "$LT_MULTI_MODULE"; then
        # By default we will add the -single_module flag. You can override
        # by either setting the environment variable LT_MULTI_MODULE
        # non-empty at configure time, or by adding -multi_module to the
        # By default we will add the -single_module flag. You can override
        # by either setting the environment variable LT_MULTI_MODULE
        # non-empty at configure time, or by adding -multi_module to the
@@ -992,7 +1013,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
          cat conftest.err >&AS_MESSAGE_LOG_FD
        # Otherwise, if the output was created with a 0 exit code from
        # the compiler, it worked.
          cat conftest.err >&AS_MESSAGE_LOG_FD
        # Otherwise, if the output was created with a 0 exit code from
        # the compiler, it worked.
-       elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+       elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
          lt_cv_apple_cc_single_mod=yes
        else
          cat conftest.err >&AS_MESSAGE_LOG_FD
          lt_cv_apple_cc_single_mod=yes
        else
          cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1010,7 +1031,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
       AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
        [lt_cv_ld_exported_symbols_list=yes],
        [lt_cv_ld_exported_symbols_list=no])
       AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
        [lt_cv_ld_exported_symbols_list=yes],
        [lt_cv_ld_exported_symbols_list=no])
-       LDFLAGS="$save_LDFLAGS"
+       LDFLAGS=$save_LDFLAGS
     ])
 
     AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
     ])
 
     AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
@@ -1032,7 +1053,7 @@ _LT_EOF
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
        cat conftest.err >&AS_MESSAGE_LOG_FD
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
        cat conftest.err >&AS_MESSAGE_LOG_FD
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
        lt_cv_ld_force_load=yes
       else
        cat conftest.err >&AS_MESSAGE_LOG_FD
        lt_cv_ld_force_load=yes
       else
        cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1042,32 +1063,32 @@ _LT_EOF
     ])
     case $host_os in
     rhapsody* | darwin1.[[012]])
     ])
     case $host_os in
     rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
     darwin1.*)
     darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
        10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
        10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-       10.[[012]]*)
-         _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+         _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+       10.[[012]][[,.]]*)
+         _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
        10.*)
        10.*)
-         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+         _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
       esac
     ;;
   esac
       esac
     ;;
   esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
       _lt_dar_single_mod='$single_module'
     fi
       _lt_dar_single_mod='$single_module'
     fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
     else
     else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
     fi
     fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -1087,29 +1108,29 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
   _LT_TAGVAR(hardcode_direct, $1)=no
   _LT_TAGVAR(hardcode_automatic, $1)=yes
   _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
   _LT_TAGVAR(hardcode_direct, $1)=no
   _LT_TAGVAR(hardcode_automatic, $1)=yes
   _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
     m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
                   [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
   else
     _LT_TAGVAR(whole_archive_flag_spec, $1)=''
   fi
   _LT_TAGVAR(link_all_deplibs, $1)=yes
     m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
                   [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
   else
     _LT_TAGVAR(whole_archive_flag_spec, $1)=''
   fi
   _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
   case $cc_basename in
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
     output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
     m4_if([$1], [CXX],
     m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+[   if test yes != "$lt_cv_apple_cc_single_mod"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
     fi
 ],[])
   else
     fi
 ],[])
   else
@@ -1129,7 +1150,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
 # Allow to override them for all tags through lt_cv_aix_libpath.
 m4_defun([_LT_SYS_MODULE_PATH_AIX],
 [m4_require([_LT_DECL_SED])dnl
 # Allow to override them for all tags through lt_cv_aix_libpath.
 m4_defun([_LT_SYS_MODULE_PATH_AIX],
 [m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
+if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
   aix_libpath=$lt_cv_aix_libpath
 else
   AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
@@ -1147,7 +1168,7 @@ else
     _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
   fi],[])
   if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
     _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
   fi],[])
   if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
   fi
   ])
   aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
   fi
   ])
   aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
@@ -1167,8 +1188,8 @@ m4_define([_LT_SHELL_INIT],
 # -----------------------
 # Find how we can fake an echo command that does not interpret backslash.
 # In particular, with Autoconf 2.60 or later we add some code to the start
 # -----------------------
 # Find how we can fake an echo command that does not interpret backslash.
 # In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
 m4_defun([_LT_PROG_ECHO_BACKSLASH],
 [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
 ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
 m4_defun([_LT_PROG_ECHO_BACKSLASH],
 [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
 ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
@@ -1196,10 +1217,10 @@ fi
 # Invoke $ECHO with all args, space-separated.
 func_echo_all ()
 {
 # Invoke $ECHO with all args, space-separated.
 func_echo_all ()
 {
-    $ECHO "$*" 
+    $ECHO "$*"
 }
 
 }
 
-case "$ECHO" in
+case $ECHO in
   printf*) AC_MSG_RESULT([printf]) ;;
   print*) AC_MSG_RESULT([print -r]) ;;
   *) AC_MSG_RESULT([cat]) ;;
   printf*) AC_MSG_RESULT([printf]) ;;
   print*) AC_MSG_RESULT([print -r]) ;;
   *) AC_MSG_RESULT([cat]) ;;
@@ -1225,16 +1246,17 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
 AC_DEFUN([_LT_WITH_SYSROOT],
 [AC_MSG_CHECKING([for sysroot])
 AC_ARG_WITH([sysroot],
 AC_DEFUN([_LT_WITH_SYSROOT],
 [AC_MSG_CHECKING([for sysroot])
 AC_ARG_WITH([sysroot],
-[  --with-sysroot[=DIR] Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+  [Search for dependent libraries within DIR (or the compiler's sysroot
+   if not specified).])],
 [], [with_sysroot=no])
 
 dnl lt_sysroot will always be passed unquoted.  We quote it here
 dnl in case the user passed a directory name.
 lt_sysroot=
 [], [with_sysroot=no])
 
 dnl lt_sysroot will always be passed unquoted.  We quote it here
 dnl in case the user passed a directory name.
 lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
  yes)
  yes)
-   if test "$GCC" = yes; then
+   if test yes = "$GCC"; then
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
@@ -1244,14 +1266,14 @@ case ${with_sysroot} in #(
  no|'')
    ;; #(
  *)
  no|'')
    ;; #(
  *)
-   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_RESULT([$with_sysroot])
    AC_MSG_ERROR([The sysroot must be an absolute path.])
    ;;
 esac
 
  AC_MSG_RESULT([${lt_sysroot:-no}])
 _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
    AC_MSG_ERROR([The sysroot must be an absolute path.])
    ;;
 esac
 
  AC_MSG_RESULT([${lt_sysroot:-no}])
 _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
+[dependent libraries, and where our libraries should be installed.])])
 
 # _LT_ENABLE_LOCK
 # ---------------
 
 # _LT_ENABLE_LOCK
 # ---------------
@@ -1259,31 +1281,33 @@ m4_defun([_LT_ENABLE_LOCK],
 [AC_ARG_ENABLE([libtool-lock],
   [AS_HELP_STRING([--disable-libtool-lock],
     [avoid locking (might break parallel builds)])])
 [AC_ARG_ENABLE([libtool-lock],
   [AS_HELP_STRING([--disable-libtool-lock],
     [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
-       HPUX_IA64_MODE="32"
+       HPUX_IA64_MODE=32
        ;;
       *ELF-64*)
        ;;
       *ELF-64*)
-       HPUX_IA64_MODE="64"
+       HPUX_IA64_MODE=64
        ;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
        ;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
   echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
       case `/usr/bin/file conftest.$ac_objext` in
        *32-bit*)
          LD="${LD-ld} -melf32bsmip"
       case `/usr/bin/file conftest.$ac_objext` in
        *32-bit*)
          LD="${LD-ld} -melf32bsmip"
@@ -1312,9 +1336,46 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
   rm -rf conftest*
   ;;
 
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+       emul="${emul}32"
+       ;;
+      *64-bit*)
+       emul="${emul}64"
+       ;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+       emul="${emul}btsmip"
+       ;;
+      *LSB*)
+       emul="${emul}ltsmip"
+       ;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+       emul="${emul}n32"
+       ;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
 x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
@@ -1333,10 +1394,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
                ;;
            esac
            ;;
                ;;
            esac
            ;;
-         powerpc64le-*)
+         powerpc64le-*linux*)
            LD="${LD-ld} -m elf32lppclinux"
            ;;
            LD="${LD-ld} -m elf32lppclinux"
            ;;
-         powerpc64-*)
+         powerpc64-*linux*)
            LD="${LD-ld} -m elf32ppclinux"
            ;;
          s390x-*linux*)
            LD="${LD-ld} -m elf32ppclinux"
            ;;
          s390x-*linux*)
@@ -1355,10 +1416,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
          x86_64-*linux*)
            LD="${LD-ld} -m elf_x86_64"
            ;;
          x86_64-*linux*)
            LD="${LD-ld} -m elf_x86_64"
            ;;
-         powerpcle-*)
+         powerpcle-*linux*)
            LD="${LD-ld} -m elf64lppc"
            ;;
            LD="${LD-ld} -m elf64lppc"
            ;;
-         powerpc-*)
+         powerpc-*linux*)
            LD="${LD-ld} -m elf64ppc"
            ;;
          s390*-*linux*|s390*-*tpf*)
            LD="${LD-ld} -m elf64ppc"
            ;;
          s390*-*linux*|s390*-*tpf*)
@@ -1376,19 +1437,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
+  SAVE_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -belf"
   AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
     [AC_LANG_PUSH(C)
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
      AC_LANG_POP])
   CFLAGS="$CFLAGS -belf"
   AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
     [AC_LANG_PUSH(C)
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
      AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+  if test yes != "$lt_cv_cc_needs_belf"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
+    CFLAGS=$SAVE_CFLAGS
   fi
   ;;
 *-*solaris*)
   fi
   ;;
 *-*solaris*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
@@ -1396,7 +1458,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris*|x86_64-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
@@ -1405,7 +1467,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
+          LD=${LD-ld}_sol2
         fi
         ;;
       *)
         fi
         ;;
       *)
@@ -1421,7 +1483,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   ;;
 esac
 
   ;;
 esac
 
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
 ])# _LT_ENABLE_LOCK
 
 
 ])# _LT_ENABLE_LOCK
 
 
@@ -1440,11 +1502,11 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
      [echo conftest.$ac_objext > conftest.lst
       lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
       AC_TRY_EVAL([lt_ar_try])
      [echo conftest.$ac_objext > conftest.lst
       lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
       AC_TRY_EVAL([lt_ar_try])
-      if test "$ac_status" -eq 0; then
+      if test 0 -eq "$ac_status"; then
        # Ensure the archiver fails upon bogus file names.
        rm -f conftest.$ac_objext libconftest.a
        AC_TRY_EVAL([lt_ar_try])
        # Ensure the archiver fails upon bogus file names.
        rm -f conftest.$ac_objext libconftest.a
        AC_TRY_EVAL([lt_ar_try])
-       if test "$ac_status" -ne 0; then
+       if test 0 -ne "$ac_status"; then
           lt_cv_ar_at_file=@
         fi
       fi
           lt_cv_ar_at_file=@
         fi
       fi
@@ -1452,7 +1514,7 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
      ])
   ])
 
      ])
   ])
 
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
@@ -1483,7 +1545,7 @@ old_postuninstall_cmds=
 
 if test -n "$RANLIB"; then
   case $host_os in
 
 if test -n "$RANLIB"; then
   case $host_os in
-  openbsd*)
+  bitrig* | openbsd*)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
@@ -1519,7 +1581,7 @@ AC_CACHE_CHECK([$1], [$2],
   [$2=no
    m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   [$2=no
    m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
+   lt_compiler_flag="$3"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -1546,7 +1608,7 @@ AC_CACHE_CHECK([$1], [$2],
    $RM conftest*
 ])
 
    $RM conftest*
 ])
 
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
     m4_if([$5], , :, [$5])
 else
     m4_if([$6], , :, [$6])
     m4_if([$5], , :, [$5])
 else
     m4_if([$6], , :, [$6])
@@ -1568,7 +1630,7 @@ AC_DEFUN([_LT_LINKER_OPTION],
 m4_require([_LT_DECL_SED])dnl
 AC_CACHE_CHECK([$1], [$2],
   [$2=no
 m4_require([_LT_DECL_SED])dnl
 AC_CACHE_CHECK([$1], [$2],
   [$2=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $3"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
    LDFLAGS="$LDFLAGS $3"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -1587,10 +1649,10 @@ AC_CACHE_CHECK([$1], [$2],
      fi
    fi
    $RM -r conftest*
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 ])
 
 ])
 
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
     m4_if([$4], , :, [$4])
 else
     m4_if([$5], , :, [$5])
     m4_if([$4], , :, [$4])
 else
     m4_if([$5], , :, [$5])
@@ -1611,7 +1673,7 @@ AC_DEFUN([LT_CMD_MAX_LEN],
 AC_MSG_CHECKING([the maximum length of command line arguments])
 AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
   i=0
 AC_MSG_CHECKING([the maximum length of command line arguments])
 AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
   i=0
-  teststring="ABCD"
+  teststring=ABCD
 
   case $build_os in
   msdosdjgpp*)
 
   case $build_os in
   msdosdjgpp*)
@@ -1651,7 +1713,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -1702,22 +1764,22 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
     if test -n "$lt_cv_sys_max_cmd_len" && \
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
     if test -n "$lt_cv_sys_max_cmd_len" && \
-       test undefined != "$lt_cv_sys_max_cmd_len"; then
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
+      for i in 1 2 3 4 5 6 7 8; do
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
                 = "X$teststring$teststring"; } >/dev/null 2>&1 &&
                 = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-             test $i != 17 # 1/2 MB should be enough
+             test 17 != "$i" # 1/2 MB should be enough
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
@@ -1733,7 +1795,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     ;;
   esac
 ])
     ;;
   esac
 ])
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
   AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
 else
   AC_MSG_RESULT(none)
   AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
 else
   AC_MSG_RESULT(none)
@@ -1761,7 +1823,7 @@ m4_defun([_LT_HEADER_DLFCN],
 # ----------------------------------------------------------------
 m4_defun([_LT_TRY_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
 # ----------------------------------------------------------------
 m4_defun([_LT_TRY_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
+if test yes = "$cross_compiling"; then :
   [$4]
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   [$4]
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -1808,9 +1870,9 @@ else
 #  endif
 #endif
 
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -1836,7 +1898,7 @@ int main ()
   return status;
 }]
 _LT_EOF
   return status;
 }]
 _LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+  if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
     lt_status=$?
     case x$lt_status in
     (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -1857,7 +1919,7 @@ rm -fr conftest*
 # ------------------
 AC_DEFUN([LT_SYS_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
 # ------------------
 AC_DEFUN([LT_SYS_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
+if test yes != "$enable_dlopen"; then
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
@@ -1867,44 +1929,52 @@ else
 
   case $host_os in
   beos*)
 
   case $host_os in
   beos*)
-    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen=load_add_on
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen=LoadLibrary
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
-    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen=dlopen
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
-  # if libdl is installed we need to link against it
+    # if libdl is installed we need to link against it
     AC_CHECK_LIB([dl], [dlopen],
     AC_CHECK_LIB([dl], [dlopen],
-               [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
+               [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+    lt_cv_dlopen=dyld
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ])
     ;;
 
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ])
     ;;
 
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
   *)
     AC_CHECK_FUNC([shl_load],
   *)
     AC_CHECK_FUNC([shl_load],
-         [lt_cv_dlopen="shl_load"],
+         [lt_cv_dlopen=shl_load],
       [AC_CHECK_LIB([dld], [shl_load],
       [AC_CHECK_LIB([dld], [shl_load],
-           [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+           [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
        [AC_CHECK_FUNC([dlopen],
        [AC_CHECK_FUNC([dlopen],
-             [lt_cv_dlopen="dlopen"],
+             [lt_cv_dlopen=dlopen],
          [AC_CHECK_LIB([dl], [dlopen],
          [AC_CHECK_LIB([dl], [dlopen],
-               [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+               [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
            [AC_CHECK_LIB([svld], [dlopen],
            [AC_CHECK_LIB([svld], [dlopen],
-                 [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+                 [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
              [AC_CHECK_LIB([dld], [dld_link],
              [AC_CHECK_LIB([dld], [dld_link],
-                   [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+                   [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
              ])
            ])
          ])
              ])
            ])
          ])
@@ -1913,21 +1983,21 @@ else
     ;;
   esac
 
     ;;
   esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
+  if test no = "$lt_cv_dlopen"; then
     enable_dlopen=no
     enable_dlopen=no
+  else
+    enable_dlopen=yes
   fi
 
   case $lt_cv_dlopen in
   dlopen)
   fi
 
   case $lt_cv_dlopen in
   dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
 
-    save_LDFLAGS="$LDFLAGS"
+    save_LDFLAGS=$LDFLAGS
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
+    save_LIBS=$LIBS
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     AC_CACHE_CHECK([whether a program can dlopen itself],
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     AC_CACHE_CHECK([whether a program can dlopen itself],
@@ -1937,7 +2007,7 @@ else
            lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
     ])
 
            lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
     ])
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
+    if test yes = "$lt_cv_dlopen_self"; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
          lt_cv_dlopen_self_static, [dnl
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
          lt_cv_dlopen_self_static, [dnl
@@ -1947,9 +2017,9 @@ else
       ])
     fi
 
       ])
     fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
     ;;
   esac
 
     ;;
   esac
 
@@ -2041,8 +2111,8 @@ m4_defun([_LT_COMPILER_FILE_LOCKS],
 m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 _LT_COMPILER_C_O([$1])
 
 m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 _LT_COMPILER_C_O([$1])
 
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   AC_MSG_CHECKING([if we can lock with hard links])
   hard_links=yes
   # do not overwrite the value of need_locks provided by the user
   AC_MSG_CHECKING([if we can lock with hard links])
   hard_links=yes
@@ -2052,8 +2122,8 @@ if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" !=
   ln conftest.a conftest.b 2>&5 || hard_links=no
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   AC_MSG_RESULT([$hard_links])
   ln conftest.a conftest.b 2>&5 || hard_links=no
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+  if test no = "$hard_links"; then
+    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
     need_locks=warn
   fi
 else
     need_locks=warn
   fi
 else
@@ -2080,8 +2150,8 @@ objdir=$lt_cv_objdir
 _LT_DECL([], [objdir], [0],
          [The name of the directory that contains temporary libtool files])dnl
 m4_pattern_allow([LT_OBJDIR])dnl
 _LT_DECL([], [objdir], [0],
          [The name of the directory that contains temporary libtool files])dnl
 m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+  [Define to the sub-directory where libtool stores uninstalled libraries.])
 ])# _LT_CHECK_OBJDIR
 
 
 ])# _LT_CHECK_OBJDIR
 
 
@@ -2093,15 +2163,15 @@ m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
 _LT_TAGVAR(hardcode_action, $1)=
 if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
    test -n "$_LT_TAGVAR(runpath_var, $1)" ||
 _LT_TAGVAR(hardcode_action, $1)=
 if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
    test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+   test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
 
   # We can hardcode non-existent directories.
 
   # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+  if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+     test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
     # Linking always hardcodes the temporary library directory.
     _LT_TAGVAR(hardcode_action, $1)=relink
   else
     # Linking always hardcodes the temporary library directory.
     _LT_TAGVAR(hardcode_action, $1)=relink
   else
@@ -2115,12 +2185,12 @@ else
 fi
 AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
 
 fi
 AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
 
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+   test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
   # Fast installation is not supported
   enable_fast_install=no
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -2144,7 +2214,7 @@ else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
-    if test -n "$STRIP" ; then
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       AC_MSG_RESULT([yes])
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       AC_MSG_RESULT([yes])
@@ -2162,6 +2232,47 @@ _LT_DECL([], [striplib], [1])
 ])# _LT_CMD_STRIPLIB
 
 
 ])# _LT_CMD_STRIPLIB
 
 
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x@S|@2 in
+    x)
+        ;;
+    *:)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+        ;;
+    x:*)
+        eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+        ;;
+    *)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
 # _LT_SYS_DYNAMIC_LINKER([TAG])
 # -----------------------------
 # PORTME Fill in your ld.so characteristics
 # _LT_SYS_DYNAMIC_LINKER([TAG])
 # -----------------------------
 # PORTME Fill in your ld.so characteristics
@@ -2172,17 +2283,18 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_OBJDUMP])dnl
 m4_require([_LT_DECL_SED])dnl
 m4_require([_LT_CHECK_SHELL_FEATURES])dnl
 m4_require([_LT_DECL_OBJDUMP])dnl
 m4_require([_LT_DECL_SED])dnl
 m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
 AC_MSG_CHECKING([dynamic linker characteristics])
 m4_if([$1],
        [], [
 AC_MSG_CHECKING([dynamic linker characteristics])
 m4_if([$1],
        [], [
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $host_os in
   case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
   esac
   case $host_os in
   esac
   case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
@@ -2198,28 +2310,35 @@ if test "$GCC" = yes; then
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
+  # and add multilib dir if necessary...
   lt_tmp_lt_search_path_spec=
   lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
   for lt_sys_path in $lt_search_path_spec; do
   for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
       test -d "$lt_sys_path" && \
        lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
       test -d "$lt_sys_path" && \
        lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
+          lt_foo = "/" $lt_i lt_foo;
         } else {
           lt_count--;
         }
         } else {
           lt_count--;
         }
@@ -2233,7 +2352,7 @@ BEGIN {RS=" "; FS="/|\n";} {
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+      $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
@@ -2242,7 +2361,7 @@ fi])
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -2259,14 +2378,17 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
 # flags to be left without arguments
 need_version=unknown
 
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[[4-9]]*)
   ;;
 
 aix[[4-9]]*)
@@ -2274,41 +2396,91 @@ aix[[4-9]]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[[01]] | aix4.[[01]].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
           echo ' yes '
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[[01]] | aix4.[[01]].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
           echo ' yes '
-          echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+          echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
        :
       else
        can_build_shared=no
       fi
       ;;
     esac
        :
       else
        can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a[(]lib.so.V[)]'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -2318,18 +2490,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -2337,8 +2509,8 @@ beos*)
 bsdi[[45]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
 bsdi[[45]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -2350,7 +2522,7 @@ bsdi[[45]]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
   need_version=no
   need_lib_prefix=no
 
@@ -2359,8 +2531,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -2376,17 +2548,17 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
 m4_if([$1], [],[
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
 m4_if([$1], [],[
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -2395,8 +2567,8 @@ m4_if([$1], [],[
   *,cl*)
     # Native MSVC
     libname_spec='$name'
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
 
     case $build_os in
     mingw*)
@@ -2423,7 +2595,7 @@ m4_if([$1], [],[
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -2436,8 +2608,8 @@ m4_if([$1], [],[
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -2450,7 +2622,7 @@ m4_if([$1], [],[
 
   *)
     # Assume MSVC wrapper
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -2463,8 +2635,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -2477,8 +2649,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -2496,12 +2668,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
       need_version=yes
       ;;
   esac
@@ -2531,10 +2704,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -2552,14 +2725,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -2567,8 +2741,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -2577,8 +2751,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -2591,8 +2765,8 @@ interix[[3-9]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -2603,7 +2777,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-       if test "$lt_cv_prog_gnu_ld" = yes; then
+       if test yes = "$lt_cv_prog_gnu_ld"; then
                version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
                version_type=linux # correct to gnu/linux during the next big refactor
        else
                version_type=irix
@@ -2611,8 +2785,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -2631,8 +2805,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
   hardcode_into_libs=yes
   ;;
 
@@ -2641,13 +2815,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -2672,7 +2866,12 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   # before this can be enabled.
   hardcode_into_libs=yes
 
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # 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
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # 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="/lib /usr/lib $lt_ld_extra"
   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="/lib /usr/lib $lt_ld_extra"
@@ -2704,12 +2903,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -2719,7 +2918,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -2728,58 +2927,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
-    *)                         need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-       shlibpath_overrides_runpath=no
-       ;;
-      *)
-       shlibpath_overrides_runpath=yes
-       ;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
   ;;
 
 rdos*)
@@ -2790,8 +2999,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -2801,11 +3010,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
     need_lib_prefix=no
   fi
   need_version=yes
@@ -2813,8 +3022,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -2835,24 +3044,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/necthen
     version_type=linux # correct to gnu/linux during the next big refactor
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -2870,7 +3079,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -2878,8 +3087,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -2888,20 +3097,30 @@ uts4*)
   ;;
 esac
 AC_MSG_RESULT([$dynamic_linker])
   ;;
 esac
 AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
 _LT_DECL([], [variables_saved_for_relink], [1],
     [Variables whose values should be saved in libtool wrapper scripts and
     restored at link time])
 _LT_DECL([], [variables_saved_for_relink], [1],
     [Variables whose values should be saved in libtool wrapper scripts and
     restored at link time])
@@ -2934,39 +3153,41 @@ _LT_DECL([], [hardcode_into_libs], [0],
     [Whether we should hardcode library paths into libraries])
 _LT_DECL([], [sys_lib_search_path_spec], [2],
     [Compile-time system search path for libraries])
     [Whether we should hardcode library paths into libraries])
 _LT_DECL([], [sys_lib_search_path_spec], [2],
     [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+    [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+    [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
 ])# _LT_SYS_DYNAMIC_LINKER
 
 
 # _LT_PATH_TOOL_PREFIX(TOOL)
 # --------------------------
 ])# _LT_SYS_DYNAMIC_LINKER
 
 
 # _LT_PATH_TOOL_PREFIX(TOOL)
 # --------------------------
-# find a file program which can recognize shared library
+# find a file program that can recognize shared library
 AC_DEFUN([_LT_PATH_TOOL_PREFIX],
 [m4_require([_LT_DECL_EGREP])dnl
 AC_MSG_CHECKING([for $1])
 AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
 [case $MAGIC_CMD in
 [[\\/*] |  ?:[\\/]*])
 AC_DEFUN([_LT_PATH_TOOL_PREFIX],
 [m4_require([_LT_DECL_EGREP])dnl
 AC_MSG_CHECKING([for $1])
 AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
 [case $MAGIC_CMD in
 [[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
 dnl $ac_dummy forces splitting on constant user-supplied paths.
 dnl POSIX.2 word splitting is done only on the output of word expansions,
 dnl not every word.  This closes a longstanding sh security hole.
   ac_dummy="m4_if([$2], , $PATH, [$2])"
   for ac_dir in $ac_dummy; do
 dnl $ac_dummy forces splitting on constant user-supplied paths.
 dnl POSIX.2 word splitting is done only on the output of word expansions,
 dnl not every word.  This closes a longstanding sh security hole.
   ac_dummy="m4_if([$2], , $PATH, [$2])"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+    if test -f "$ac_dir/$1"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
       if test -n "$file_magic_test_file"; then
        case $deplibs_check_method in
        "file_magic "*)
          file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
       if test -n "$file_magic_test_file"; then
        case $deplibs_check_method in
        "file_magic "*)
          file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         MAGIC_CMD=$lt_cv_path_MAGIC_CMD
          if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
            $EGREP "$file_magic_regex" > /dev/null; then
            :
          if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
            $EGREP "$file_magic_regex" > /dev/null; then
            :
@@ -2989,11 +3210,11 @@ _LT_EOF
       break
     fi
   done
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac])
   ;;
 esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   AC_MSG_RESULT($MAGIC_CMD)
 else
 if test -n "$MAGIC_CMD"; then
   AC_MSG_RESULT($MAGIC_CMD)
 else
@@ -3011,7 +3232,7 @@ dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
 
 # _LT_PATH_MAGIC
 # --------------
 
 # _LT_PATH_MAGIC
 # --------------
-# find a file program which can recognize a shared library
+# find a file program that can recognize a shared library
 m4_defun([_LT_PATH_MAGIC],
 [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
 if test -z "$lt_cv_path_MAGIC_CMD"; then
 m4_defun([_LT_PATH_MAGIC],
 [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
 if test -z "$lt_cv_path_MAGIC_CMD"; then
@@ -3038,16 +3259,16 @@ m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
 AC_ARG_WITH([gnu-ld],
     [AS_HELP_STRING([--with-gnu-ld],
        [assume the C compiler uses GNU ld @<:@default=no@:>@])],
 AC_ARG_WITH([gnu-ld],
     [AS_HELP_STRING([--with-gnu-ld],
        [assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
+    [test no = "$withval" || with_gnu_ld=yes],
     [with_gnu_ld=no])dnl
 
 ac_prog=ld
     [with_gnu_ld=no])dnl
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   AC_MSG_CHECKING([for ld used by $CC])
   case $host in
   *-*-mingw*)
   # Check if gcc -print-prog-name=ld gives a path.
   AC_MSG_CHECKING([for ld used by $CC])
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -3061,7 +3282,7 @@ if test "$GCC" = yes; then
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
        ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
        ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -3072,37 +3293,37 @@ if test "$GCC" = yes; then
     with_gnu_ld=unknown
     ;;
   esac
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   AC_MSG_CHECKING([for GNU ld])
 else
   AC_MSG_CHECKING([for non-GNU ld])
 fi
 AC_CACHE_VAL(lt_cv_path_LD,
 [if test -z "$LD"; then
   AC_MSG_CHECKING([for GNU ld])
 else
   AC_MSG_CHECKING([for non-GNU ld])
 fi
 AC_CACHE_VAL(lt_cv_path_LD,
 [if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-       test "$with_gnu_ld" != no && break
+       test no != "$with_gnu_ld" && break
        ;;
       *)
        ;;
       *)
-       test "$with_gnu_ld" != yes && break
+       test yes != "$with_gnu_ld" && break
        ;;
       esac
     fi
   done
        ;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi])
 fi])
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   AC_MSG_RESULT($LD)
 else
 if test -n "$LD"; then
   AC_MSG_RESULT($LD)
 else
@@ -3156,13 +3377,13 @@ esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       reload_cmds=false
     fi
     ;;
   darwin*)
       reload_cmds=false
     fi
     ;;
   darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
@@ -3173,6 +3394,43 @@ _LT_TAGDECL([], [reload_cmds], [2])dnl
 ])# _LT_CMD_RELOAD
 
 
 ])# _LT_CMD_RELOAD
 
 
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+  [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
 # _LT_CHECK_MAGIC_METHOD
 # ----------------------
 # how to check for library dependencies
 # _LT_CHECK_MAGIC_METHOD
 # ----------------------
 # how to check for library dependencies
@@ -3188,13 +3446,13 @@ lt_cv_deplibs_check_method='unknown'
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
 
 case $host_os in
 aix[[4-9]]*)
 
 case $host_os in
 aix[[4-9]]*)
@@ -3221,8 +3479,7 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+  if ( file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
@@ -3318,8 +3575,8 @@ newos6*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
@@ -3372,6 +3629,9 @@ sysv4 | sysv4.3*)
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 esac
 ])
 
 esac
 ])
 
@@ -3412,33 +3672,38 @@ AC_DEFUN([LT_PATH_NM],
 AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
 [if test -n "$NM"; then
   # Let the user override the test.
 AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
 [if test -n "$NM"; then
   # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  lt_cv_path_NM=$NM
 else
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
+  lt_nm_to_check=${ac_tool_prefix}nm
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       test -z "$ac_dir" && ac_dir=.
       test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
        # Check to see if the nm accepts a BSD-compat flag.
        # Check to see if the nm accepts a BSD-compat flag.
-       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+       # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
        #   nm: unknown option "B" ignored
        # Tru64's nm complains that /dev/null is an invalid object file
        #   nm: unknown option "B" ignored
        # Tru64's nm complains that /dev/null is an invalid object file
-       case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-       */dev/null* | *'Invalid file or object type'*)
+       # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+       case $build_os in
+       mingw*) lt_bad_file=conftest.nm/nofile ;;
+       *) lt_bad_file=/dev/null ;;
+       esac
+       case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+       *$lt_bad_file* | *'Invalid file or object type'*)
          lt_cv_path_NM="$tmp_nm -B"
          lt_cv_path_NM="$tmp_nm -B"
-         break
+         break 2
          ;;
        *)
          case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
          */dev/null*)
            lt_cv_path_NM="$tmp_nm -p"
          ;;
        *)
          case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
          */dev/null*)
            lt_cv_path_NM="$tmp_nm -p"
-           break
+           break 2
            ;;
          *)
            lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
            ;;
          *)
            lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -3449,21 +3714,21 @@ else
        esac
       fi
     done
        esac
       fi
     done
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
   done
   : ${lt_cv_path_NM=no}
 fi])
   done
   : ${lt_cv_path_NM=no}
 fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
     # Let the user override the test.
   else
     AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
     # Let the user override the test.
   else
     AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
     *COFF*)
     *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
+      DUMPBIN="$DUMPBIN -symbols -headers"
       ;;
     *)
       DUMPBIN=:
       ;;
     *)
       DUMPBIN=:
@@ -3471,8 +3736,8 @@ else
     esac
   fi
   AC_SUBST([DUMPBIN])
     esac
   fi
   AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
   fi
 fi
 test -z "$NM" && NM=nm
   fi
 fi
 test -z "$NM" && NM=nm
@@ -3518,8 +3783,8 @@ lt_cv_sharedlib_from_linklib_cmd,
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -3531,7 +3796,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   ;;
 *)
   # fallback: assume linklib IS sharedlib
   ;;
 *)
   # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
   ;;
 esac
 ])
   ;;
 esac
 ])
@@ -3558,13 +3823,28 @@ AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool
     lt_cv_path_mainfest_tool=yes
   fi
   rm -f conftest*])
     lt_cv_path_mainfest_tool=yes
   fi
   rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
   MANIFEST_TOOL=:
 fi
 _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
 ])# _LT_PATH_MANIFEST_TOOL
 
 
   MANIFEST_TOOL=:
 fi
 _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
 ])# _LT_PATH_MANIFEST_TOOL
 
 
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+  test DEF = "`$SED -n dnl
+    -e '\''s/^[[        ]]*//'\'' dnl Strip leading whitespace
+    -e '\''/^\(;.*\)*$/d'\'' dnl      Delete empty lines and comments
+    -e '\''s/^\(EXPORTS\|LIBRARY\)\([[  ]].*\)*$/DEF/p'\'' dnl
+    -e q dnl                          Only consider the first "real" line
+    $1`" dnl
+])# _LT_DLL_DEF_P
+
+
 # LT_LIB_M
 # --------
 # check for math library
 # LT_LIB_M
 # --------
 # check for math library
@@ -3576,11 +3856,11 @@ case $host in
   # These system don't have libm, or don't need it
   ;;
 *-ncr-sysv4.3*)
   # These system don't have libm, or don't need it
   ;;
 *-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
   AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
   ;;
 *)
   AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
   ;;
 *)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  AC_CHECK_LIB(m, cos, LIBM=-lm)
   ;;
 esac
 AC_SUBST([LIBM])
   ;;
 esac
 AC_SUBST([LIBM])
@@ -3599,7 +3879,7 @@ m4_defun([_LT_COMPILER_NO_RTTI],
 
 _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
 
 
 _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $cc_basename in
   nvcc*)
     _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
   case $cc_basename in
   nvcc*)
     _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
@@ -3651,7 +3931,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   symcode='[[ABCDGISTW]]'
   ;;
 hpux*)
   symcode='[[ABCDGISTW]]'
   ;;
 hpux*)
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     symcode='[[ABCDEGRST]]'
   fi
   ;;
     symcode='[[ABCDEGRST]]'
   fi
   ;;
@@ -3684,14 +3964,44 @@ case `$NM -V 2>&1` in
   symcode='[[ABCDGIRSTW]]' ;;
 esac
 
   symcode='[[ABCDGIRSTW]]' ;;
 esac
 
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -3709,21 +4019,24 @@ for ac_symprfx in "" "_"; do
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
+    # 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++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK ['"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
     # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK ['"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
 "     ' prfx=^$ac_symprfx]"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[    ]]\($symcode$symcode*\)[[       ]][[    ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
 "     ' prfx=^$ac_symprfx]"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[    ]]\($symcode$symcode*\)[[       ]][[    ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -3763,11 +4076,11 @@ _LT_EOF
        if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
          cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
        if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
          cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT@&t@_DLSYM_CONST
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT@&t@_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT@&t@_DLSYM_CONST
 #else
 /* This system does not cope well with relocations in const data.  */
 # define LT@&t@_DLSYM_CONST
 #else
@@ -3793,7 +4106,7 @@ lt__PROGRAM__LTX_preloaded_symbols[[]] =
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
-         $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+         $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
          cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
          cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
@@ -3813,9 +4126,9 @@ _LT_EOF
          mv conftest.$ac_objext conftstm.$ac_objext
          lt_globsym_save_LIBS=$LIBS
          lt_globsym_save_CFLAGS=$CFLAGS
          mv conftest.$ac_objext conftstm.$ac_objext
          lt_globsym_save_LIBS=$LIBS
          lt_globsym_save_CFLAGS=$CFLAGS
-         LIBS="conftstm.$ac_objext"
+         LIBS=conftstm.$ac_objext
          CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
          CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-         if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+         if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
            pipe_works=yes
          fi
          LIBS=$lt_globsym_save_LIBS
            pipe_works=yes
          fi
          LIBS=$lt_globsym_save_LIBS
@@ -3836,7 +4149,7 @@ _LT_EOF
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
+  if test yes = "$pipe_works"; then
     break
   else
     lt_cv_sys_global_symbol_pipe=
     break
   else
     lt_cv_sys_global_symbol_pipe=
@@ -3863,12 +4176,16 @@ _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
     [Take the output of nm and produce a listing of raw symbols and C names])
 _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
     [Transform the output of nm in a proper C declaration])
     [Take the output of nm and produce a listing of raw symbols and C names])
 _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
     [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+    [Transform the output of nm into a list of symbols to manually relocate])
 _LT_DECL([global_symbol_to_c_name_address],
     [lt_cv_sys_global_symbol_to_c_name_address], [1],
     [Transform the output of nm in a C name address pair])
 _LT_DECL([global_symbol_to_c_name_address_lib_prefix],
     [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
     [Transform the output of nm in a C name address pair when lib prefix is needed])
 _LT_DECL([global_symbol_to_c_name_address],
     [lt_cv_sys_global_symbol_to_c_name_address], [1],
     [Transform the output of nm in a C name address pair])
 _LT_DECL([global_symbol_to_c_name_address_lib_prefix],
     [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
     [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+    [The name lister interface])
 _LT_DECL([], [nm_file_list_spec], [1],
     [Specify filename containing input files for $NM])
 ]) # _LT_CMD_GLOBAL_SYMBOLS
 _LT_DECL([], [nm_file_list_spec], [1],
     [Specify filename containing input files for $NM])
 ]) # _LT_CMD_GLOBAL_SYMBOLS
@@ -3884,17 +4201,18 @@ _LT_TAGVAR(lt_prog_compiler_static, $1)=
 
 m4_if([$1], [CXX], [
   # C++ specific cases for pic, static, wl, etc.
 
 m4_if([$1], [CXX], [
   # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
+  if test yes = "$GXX"; then
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
        # AIX 5 now supports IA64 processor
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
        # AIX 5 now supports IA64 processor
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
 
     amigaos*)
       ;;
 
     amigaos*)
@@ -3905,8 +4223,8 @@ m4_if([$1], [CXX], [
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -3922,6 +4240,11 @@ m4_if([$1], [CXX], [
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
        [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
        [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+       ;;
+      esac
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
@@ -3971,7 +4294,7 @@ m4_if([$1], [CXX], [
     case $host_os in
       aix[[4-9]]*)
        # All AIX code is PIC.
     case $host_os in
       aix[[4-9]]*)
        # All AIX code is PIC.
-       if test "$host_cpu" = ia64; then
+       if test ia64 = "$host_cpu"; then
          # AIX 5 now supports IA64 processor
          _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
        else
          # AIX 5 now supports IA64 processor
          _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
        else
@@ -4012,14 +4335,14 @@ m4_if([$1], [CXX], [
        case $cc_basename in
          CC*)
            _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
        case $cc_basename in
          CC*)
            _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-           _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-           if test "$host_cpu" != ia64; then
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+           if test ia64 != "$host_cpu"; then
              _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
            fi
            ;;
          aCC*)
            _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
              _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
            fi
            ;;
          aCC*)
            _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-           _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+           _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
            case $host_cpu in
            hppa*64*|ia64*)
              # +Z the default
            case $host_cpu in
            hppa*64*|ia64*)
              # +Z the default
@@ -4056,7 +4379,7 @@ m4_if([$1], [CXX], [
            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
            ;;
          ecpc* )
            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
            ;;
          ecpc* )
-           # old Intel C++ for x86_64 which still supported -KPIC.
+           # old Intel C++ for x86_64, which still supported -KPIC.
            _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
            _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
            _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
            _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
@@ -4201,17 +4524,18 @@ m4_if([$1], [CXX], [
   fi
 ],
 [
   fi
 ],
 [
-  if test "$GCC" = yes; then
+  if test yes = "$GCC"; then
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
        # AIX 5 now supports IA64 processor
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
        # AIX 5 now supports IA64 processor
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
 
     amigaos*)
       ;;
 
     amigaos*)
@@ -4222,8 +4546,8 @@ m4_if([$1], [CXX], [
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -4240,6 +4564,11 @@ m4_if([$1], [CXX], [
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
        [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
        [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+       ;;
+      esac
       ;;
 
     darwin* | rhapsody*)
       ;;
 
     darwin* | rhapsody*)
@@ -4310,7 +4639,7 @@ m4_if([$1], [CXX], [
     case $host_os in
     aix*)
       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     case $host_os in
     aix*)
       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
        # AIX 5 now supports IA64 processor
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       else
        # AIX 5 now supports IA64 processor
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       else
@@ -4318,11 +4647,30 @@ m4_if([$1], [CXX], [
       fi
       ;;
 
       fi
       ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      esac
+      ;;
+
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       m4_if([$1], [GCJ], [],
        [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       m4_if([$1], [GCJ], [],
        [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+       ;;
+      esac
       ;;
 
     hpux9* | hpux10* | hpux11*)
       ;;
 
     hpux9* | hpux10* | hpux11*)
@@ -4338,7 +4686,7 @@ m4_if([$1], [CXX], [
        ;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
        ;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
       ;;
 
     irix5* | irix6* | nonstopux*)
       ;;
 
     irix5* | irix6* | nonstopux*)
@@ -4349,7 +4697,7 @@ m4_if([$1], [CXX], [
 
     linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
 
     linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
+      # old Intel for x86_64, which still supported -KPIC.
       ecc*)
        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
       ecc*)
        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
@@ -4374,6 +4722,12 @@ m4_if([$1], [CXX], [
        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
        ;;
        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
        ;;
+      tcc*)
+       # Fabrice Bellard et al's Tiny C Compiler
+       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+       _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+       _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+       ;;
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
        # which looks to be a dead project)
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
        # which looks to be a dead project)
@@ -4471,7 +4825,7 @@ m4_if([$1], [CXX], [
       ;;
 
     sysv4*MP*)
       ;;
 
     sysv4*MP*)
-      if test -d /usr/nec ;then
+      if test -d /usr/necthen
        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
@@ -4500,7 +4854,7 @@ m4_if([$1], [CXX], [
   fi
 ])
 case $host_os in
   fi
 ])
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     _LT_TAGVAR(lt_prog_compiler_pic, $1)=
     ;;
   *djgpp*)
     _LT_TAGVAR(lt_prog_compiler_pic, $1)=
     ;;
@@ -4566,17 +4920,21 @@ m4_if([$1], [CXX], [
   case $host_os in
   aix[[4-9]]*)
     # If we're using GNU nm, then we don't want the "-C" option.
   case $host_os in
   aix[[4-9]]*)
     # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
     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) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _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
     else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
     fi
     ;;
   pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
@@ -4625,9 +4983,9 @@ m4_if([$1], [CXX], [
   # included in the symbol list
   _LT_TAGVAR(include_expsyms, $1)=
   # exclude_expsyms can be an extended regexp of symbols to exclude
   # included in the symbol list
   _LT_TAGVAR(include_expsyms, $1)=
   # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
   _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
   _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
@@ -4643,7 +5001,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
       with_gnu_ld=no
     fi
     ;;
@@ -4651,7 +5009,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
-  openbsd*)
+  openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
   linux* | k*bsd*-gnu | gnu*)
     with_gnu_ld=no
     ;;
   linux* | k*bsd*-gnu | gnu*)
@@ -4664,7 +5022,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     case $host_os in
       aix*)
        # The AIX port of GNU ld has always aspired to compatibility
     case $host_os in
       aix*)
        # The AIX port of GNU ld has always aspired to compatibility
@@ -4686,24 +5044,24 @@ dnl Note also adjust exclude_expsyms for C++ above.
     esac
   fi
 
     esac
   fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
+  if test yes = "$lt_use_gnu_ld_interface"; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
     # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+    wlarc='$wl'
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
     else
       _LT_TAGVAR(whole_archive_flag_spec, $1)=
     fi
     supports_anon_versioning=no
     else
       _LT_TAGVAR(whole_archive_flag_spec, $1)=
     fi
     supports_anon_versioning=no
-    case `$LD -v 2>&1` in
+    case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -4716,7 +5074,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     case $host_os in
     aix[[3-9]]*)
       # On AIX/PPC, the GNU linker is very broken
     case $host_os in
     aix[[3-9]]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
+      if test ia64 != "$host_cpu"; then
        _LT_TAGVAR(ld_shlibs, $1)=no
        cat <<_LT_EOF 1>&2
 
        _LT_TAGVAR(ld_shlibs, $1)=no
        cat <<_LT_EOF 1>&2
 
@@ -4735,7 +5093,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
@@ -4751,7 +5109,7 @@ _LT_EOF
        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
        # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
        # support --undefined.  This deserves some investigation.  FIXME
        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
        # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
        # support --undefined.  This deserves some investigation.  FIXME
-       _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
       fi
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4761,7 +5119,7 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
       # as there is no search path for DLLs.
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
       # as there is no search path for DLLs.
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
       _LT_TAGVAR(always_export_symbols, $1)=no
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
       _LT_TAGVAR(always_export_symbols, $1)=no
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -4769,61 +5127,89 @@ _LT_EOF
       _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
       _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-       # If the export-symbols file already is a .def file (1st line
-       # is EXPORTS), use it as is; otherwise, prepend...
-       _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-         cp $export_symbols $output_objdir/$soname.def;
-       else
-         echo EXPORTS > $output_objdir/$soname.def;
-         cat $export_symbols >> $output_objdir/$soname.def;
-       fi~
-       $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+       # If the export-symbols file already is a .def file, use it as
+       # is; otherwise, prepend EXPORTS...
+       _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
 
     haiku*)
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
 
     haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+       $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+       $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+       $ECHO EXPORTS >> $output_objdir/$libname.def~
+       emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+       $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+       emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+       $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+       $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+       $ECHO EXPORTS >> $output_objdir/$libname.def~
+       prefix_cmds="$SED"~
+       if test EXPORTS = "`$SED 1q $export_symbols`"; then
+         prefix_cmds="$prefix_cmds -e 1d";
+       fi~
+       prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+       cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+       $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+       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
+      ;;
+
     interix[[3-9]]*)
       _LT_TAGVAR(hardcode_direct, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
     interix[[3-9]]*)
       _LT_TAGVAR(hardcode_direct, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
+      if test linux-dietlibc = "$host_os"; then
        case $cc_basename in
          diet\ *) tmp_diet=yes;;       # linux-dietlibc with static linking (!diet-dyn)
        esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
        case $cc_basename in
          diet\ *) tmp_diet=yes;;       # linux-dietlibc with static linking (!diet-dyn)
        esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-        && test "$tmp_diet" = no
+        && test no = "$tmp_diet"
       then
        tmp_addflag=' $pic_flag'
        tmp_sharedflag='-shared'
        case $cc_basename,$host_cpu in
         pgcc*)                         # Portland Group C compiler
       then
        tmp_addflag=' $pic_flag'
        tmp_sharedflag='-shared'
        case $cc_basename,$host_cpu in
         pgcc*)                         # Portland Group C compiler
-         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
          tmp_addflag=' $pic_flag'
          ;;
        pgf77* | pgf90* | pgf95* | pgfortran*)
                                        # Portland Group f77 and f90 compilers
          tmp_addflag=' $pic_flag'
          ;;
        pgf77* | pgf90* | pgf95* | pgfortran*)
                                        # Portland Group f77 and f90 compilers
-         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
          tmp_addflag=' $pic_flag -Mnomain' ;;
        ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
          tmp_addflag=' -i_dynamic' ;;
          tmp_addflag=' $pic_flag -Mnomain' ;;
        ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
          tmp_addflag=' -i_dynamic' ;;
@@ -4834,42 +5220,47 @@ _LT_EOF
        lf95*)                          # Lahey Fortran 8.1
          _LT_TAGVAR(whole_archive_flag_spec, $1)=
          tmp_sharedflag='--shared' ;;
        lf95*)                          # Lahey Fortran 8.1
          _LT_TAGVAR(whole_archive_flag_spec, $1)=
          tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
        xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
          tmp_sharedflag='-qmkshrobj'
          tmp_addflag= ;;
        nvcc*)  # Cuda Compiler Driver 2.2
        xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
          tmp_sharedflag='-qmkshrobj'
          tmp_addflag= ;;
        nvcc*)  # Cuda Compiler Driver 2.2
-         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
          _LT_TAGVAR(compiler_needs_object, $1)=yes
          ;;
        esac
        case `$CC -V 2>&1 | sed 5q` in
        *Sun\ C*)                       # Sun C 5.9
          _LT_TAGVAR(compiler_needs_object, $1)=yes
          ;;
        esac
        case `$CC -V 2>&1 | sed 5q` in
        *Sun\ C*)                       # Sun C 5.9
-         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
          _LT_TAGVAR(compiler_needs_object, $1)=yes
          tmp_sharedflag='-G' ;;
        *Sun\ F*)                       # Sun Fortran 8.3
          tmp_sharedflag='-G' ;;
        esac
          _LT_TAGVAR(compiler_needs_object, $1)=yes
          tmp_sharedflag='-G' ;;
        *Sun\ F*)                       # Sun Fortran 8.3
          tmp_sharedflag='-G' ;;
        esac
-       _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 
 
-        if test "x$supports_anon_versioning" = xyes; then
+        if test yes = "$supports_anon_versioning"; then
           _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
           _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-           cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-           echo "local: *; };" >> $output_objdir/$libname.ver~
-           $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
         fi
 
        case $cc_basename in
         fi
 
        case $cc_basename in
+       tcc*)
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+         ;;
        xlf* | bgf* | bgxlf* | mpixlf*)
          # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
          _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
        xlf* | bgf* | bgxlf* | mpixlf*)
          # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
          _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
          _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
          _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-         if test "x$supports_anon_versioning" = xyes; then
+         if test yes = "$supports_anon_versioning"; then
            _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
            _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-             cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-             echo "local: *; };" >> $output_objdir/$libname.ver~
-             $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
          fi
          ;;
        esac
          fi
          ;;
        esac
@@ -4883,8 +5274,8 @@ _LT_EOF
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
       else
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
       else
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
       fi
       ;;
 
@@ -4902,8 +5293,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
       fi
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4915,7 +5306,7 @@ _LT_EOF
        _LT_TAGVAR(ld_shlibs, $1)=no
        cat <<_LT_EOF 1>&2
 
        _LT_TAGVAR(ld_shlibs, $1)=no
        cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
@@ -4930,9 +5321,9 @@ _LT_EOF
          # DT_RUNPATH tag from executables and libraries.  But doing so
          # requires that you compile everything twice, which is a pain.
          if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
          # DT_RUNPATH tag from executables and libraries.  But doing so
          # requires that you compile everything twice, which is a pain.
          if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
          else
            _LT_TAGVAR(ld_shlibs, $1)=no
          fi
          else
            _LT_TAGVAR(ld_shlibs, $1)=no
          fi
@@ -4949,15 +5340,15 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
     esac
 
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
     esac
 
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+    if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
       runpath_var=
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
       _LT_TAGVAR(export_dynamic_flag_spec, $1)=
       runpath_var=
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
       _LT_TAGVAR(export_dynamic_flag_spec, $1)=
@@ -4973,7 +5364,7 @@ _LT_EOF
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
        # Neither direct hardcoding nor static linking is supported with a
        # broken collect2.
        _LT_TAGVAR(hardcode_direct, $1)=unsupported
        # Neither direct hardcoding nor static linking is supported with a
        # broken collect2.
        _LT_TAGVAR(hardcode_direct, $1)=unsupported
@@ -4981,34 +5372,57 @@ _LT_EOF
       ;;
 
     aix[[4-9]]*)
       ;;
 
     aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
        # On IA64, the linker does run time linking by default, so we don't
        # have to do anything special.
        aix_use_runtimelinking=no
        exp_sym_flag='-Bexport'
        # On IA64, the linker does run time linking by default, so we don't
        # have to do anything special.
        aix_use_runtimelinking=no
        exp_sym_flag='-Bexport'
-       no_entry_flag=""
+       no_entry_flag=
       else
        # If we're using GNU nm, then we don't want the "-C" option.
       else
        # If we're using GNU nm, then we don't want the "-C" option.
-       # -C means demangle to AIX nm, but means don't demangle with GNU nm
-       # Also, AIX nm treats weak defined symbols like other global
-       # defined symbols, whereas GNU nm marks them as "W".
+       # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+       # Without the "-l" option, or with the "-B" option, AIX nm treats
+       # weak defined symbols like other global defined symbols, whereas
+       # GNU nm marks them as "W".
+       # While the 'weak' keyword is ignored in the Export File, we need
+       # it in the Import File for the 'aix-soname' feature, so we have
+       # to replace the "-B" option with "-P" for AIX nm.
        if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
        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) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+         _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
        else
-         _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+         _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
        fi
        aix_use_runtimelinking=no
 
        # Test if we are trying to use run time linking or normal
        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
        fi
        aix_use_runtimelinking=no
 
        # Test if we are trying to use run time linking or normal
        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-       # need to do runtime linking.
+       # have runtime linking enabled, and use it for executables.
+       # For shared libraries, we enable/disable runtime linking
+       # depending on the kind of the shared library created -
+       # when "with_aix_soname,aix_use_runtimelinking" is:
+       # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+       # "aix,yes"  lib.so          shared, rtl:yes, for executables
+       #            lib.a           static archive
+       # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+       #            lib.a(lib.so.V) shared, rtl:no,  for executables
+       # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+       #            lib.a(lib.so.V) shared, rtl:no
+       # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+       #            lib.a           static archive
        case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
          for ld_flag in $LDFLAGS; do
        case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
          for ld_flag in $LDFLAGS; do
-         if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+         if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
            aix_use_runtimelinking=yes
            break
          fi
          done
            aix_use_runtimelinking=yes
            break
          fi
          done
+         if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+           # With aix-soname=svr4, we create the lib.so.V shared archives only,
+           # so we don't have lib.a shared libs to link our executables.
+           # We have to force runtime linking in this case.
+           aix_use_runtimelinking=yes
+           LDFLAGS="$LDFLAGS -Wl,-brtl"
+         fi
          ;;
        esac
 
          ;;
        esac
 
@@ -5027,13 +5441,21 @@ _LT_EOF
       _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+      _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+       # The Import File defines what to hardcode.
+       _LT_TAGVAR(hardcode_direct, $1)=no
+       _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+       ;;
+      esac
 
 
-      if test "$GCC" = yes; then
+      if test yes = "$GCC"; then
        case $host_os in aix4.[[012]]|aix4.[[012]].*)
        # We only want to do this on AIX 4.2 and lower, the check
        # below for broken collect2 doesn't work under 4.3+
        case $host_os in aix4.[[012]]|aix4.[[012]].*)
        # We only want to do this on AIX 4.2 and lower, the check
        # below for broken collect2 doesn't work under 4.3+
-         collect2name=`${CC} -print-prog-name=collect2`
+         collect2name=`$CC -print-prog-name=collect2`
          if test -f "$collect2name" &&
           strings "$collect2name" | $GREP resolve_lib_name >/dev/null
          then
          if test -f "$collect2name" &&
           strings "$collect2name" | $GREP resolve_lib_name >/dev/null
          then
@@ -5052,62 +5474,80 @@ _LT_EOF
          ;;
        esac
        shared_flag='-shared'
          ;;
        esac
        shared_flag='-shared'
-       if test "$aix_use_runtimelinking" = yes; then
-         shared_flag="$shared_flag "'${wl}-G'
+       if test yes = "$aix_use_runtimelinking"; then
+         shared_flag="$shared_flag "'$wl-G'
        fi
        fi
-       _LT_TAGVAR(link_all_deplibs, $1)=no
+       # Need to ensure runtime linking is disabled for the traditional
+       # shared library, or the linker may eventually find shared libraries
+       # /with/ Import File - we do not want to mix them.
+       shared_flag_aix='-shared'
+       shared_flag_svr4='-shared $wl-G'
       else
        # not using gcc
       else
        # not using gcc
-       if test "$host_cpu" = ia64; then
+       if test ia64 = "$host_cpu"; then
        # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
        # chokes on -Wl,-G. The following line is correct:
          shared_flag='-G'
        else
        # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
        # chokes on -Wl,-G. The following line is correct:
          shared_flag='-G'
        else
-         if test "$aix_use_runtimelinking" = yes; then
-           shared_flag='${wl}-G'
+         if test yes = "$aix_use_runtimelinking"; then
+           shared_flag='$wl-G'
          else
          else
-           shared_flag='${wl}-bM:SRE'
+           shared_flag='$wl-bM:SRE'
          fi
          fi
+         shared_flag_aix='$wl-bM:SRE'
+         shared_flag_svr4='$wl-G'
        fi
       fi
 
        fi
       fi
 
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       _LT_TAGVAR(always_export_symbols, $1)=yes
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
        # Warning - without using the other runtime loading flags (-brtl),
        # -berok will link without error, but may produce a broken library.
        _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
         _LT_SYS_MODULE_PATH_AIX([$1])
        # Warning - without using the other runtime loading flags (-brtl),
        # -berok will link without error, but may produce a broken library.
        _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
         _LT_SYS_MODULE_PATH_AIX([$1])
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
       else
       else
-       if test "$host_cpu" = ia64; then
-         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+       if test ia64 = "$host_cpu"; then
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
          _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
          _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-         _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+         _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
        else
         # Determine the default libpath from the value encoded in an
         # empty executable.
         _LT_SYS_MODULE_PATH_AIX([$1])
        else
         # Determine the default libpath from the value encoded in an
         # empty executable.
         _LT_SYS_MODULE_PATH_AIX([$1])
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
          # Warning - without using the other run time loading flags,
          # -berok will link without error, but may produce a broken library.
          # Warning - without using the other run time loading flags,
          # -berok will link without error, but may produce a broken library.
-         _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-         _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-         if test "$with_gnu_ld" = yes; then
+         _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+         _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+         if test yes = "$with_gnu_ld"; then
            # We only use this code for GNU lds that support --whole-archive.
            # We only use this code for GNU lds that support --whole-archive.
-           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
          else
            # Exported symbols can be pulled into shared objects from archives
            _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
          fi
          _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
          else
            # Exported symbols can be pulled into shared objects from archives
            _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
          fi
          _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-         # This is similar to how AIX traditionally builds its shared libraries.
-         _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+         # -brtl affects multiple linker settings, -berok does not and is overridden later
+         compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+         if test svr4 != "$with_aix_soname"; then
+           # This is similar to how AIX traditionally builds its shared libraries.
+           _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+         fi
+         if test aix != "$with_aix_soname"; then
+           _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+         else
+           # used by -dlpreopen to get the symbols
+           _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+         fi
+         _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
        fi
       fi
       ;;
        fi
       fi
       ;;
@@ -5116,7 +5556,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
@@ -5146,16 +5586,17 @@ _LT_EOF
        # Tell ltmain to make .lib files, not .a files.
        libext=lib
        # Tell ltmain to make .dll files, not .so files.
        # Tell ltmain to make .lib files, not .a files.
        libext=lib
        # Tell ltmain to make .dll files, not .so files.
-       shrext_cmds=".dll"
+       shrext_cmds=.dll
        # FIXME: Setting linknames here is a bad hack.
        # FIXME: Setting linknames here is a bad hack.
-       _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-       _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-           sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-         else
-           sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-         fi~
-         $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-         linknames='
+       _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+       _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
        # The linker will not automatically build a static lib if we build a DLL.
        # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
        # The linker will not automatically build a static lib if we build a DLL.
        # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -5164,18 +5605,18 @@ _LT_EOF
        # Don't use ranlib
        _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
        _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
        # Don't use ranlib
        _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
        _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-         lt_tool_outputfile="@TOOL_OUTPUT@"~
-         case $lt_outputfile in
-           *.exe|*.EXE) ;;
-           *)
-             lt_outputfile="$lt_outputfile.exe"
-             lt_tool_outputfile="$lt_tool_outputfile.exe"
-             ;;
-         esac~
-         if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-           $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-           $RM "$lt_outputfile.manifest";
-         fi'
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
        ;;
       *)
        # Assume MSVC wrapper
        ;;
       *)
        # Assume MSVC wrapper
@@ -5184,7 +5625,7 @@ _LT_EOF
        # Tell ltmain to make .lib files, not .a files.
        libext=lib
        # Tell ltmain to make .dll files, not .so files.
        # Tell ltmain to make .lib files, not .a files.
        libext=lib
        # Tell ltmain to make .dll files, not .so files.
-       shrext_cmds=".dll"
+       shrext_cmds=.dll
        # FIXME: Setting linknames here is a bad hack.
        _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
        # The linker will automatically build a .lib file if we build a DLL.
        # FIXME: Setting linknames here is a bad hack.
        _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
        # The linker will automatically build a .lib file if we build a DLL.
@@ -5234,33 +5675,33 @@ _LT_EOF
       ;;
 
     hpux9*)
       ;;
 
     hpux9*)
-      if test "$GCC" = yes; then
-       _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      if test yes = "$GCC"; then
+       _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       else
       else
-       _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       fi
       fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_direct, $1)=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_direct, $1)=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
       ;;
 
     hpux10*)
       ;;
 
     hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
        _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
       else
        _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
-      if test "$with_gnu_ld" = no; then
-       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
        _LT_TAGVAR(hardcode_direct, $1)=yes
        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
        _LT_TAGVAR(hardcode_direct, $1)=yes
        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
        # hardcode_minus_L: Not really in the search PATH,
        # but as the default location of the library.
        _LT_TAGVAR(hardcode_minus_L, $1)=yes
        # hardcode_minus_L: Not really in the search PATH,
        # but as the default location of the library.
        _LT_TAGVAR(hardcode_minus_L, $1)=yes
@@ -5268,25 +5709,25 @@ _LT_EOF
       ;;
 
     hpux11*)
       ;;
 
     hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+      if test yes,no = "$GCC,$with_gnu_ld"; then
        case $host_cpu in
        hppa*64*)
        case $host_cpu in
        hppa*64*)
-         _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        ia64*)
          ;;
        ia64*)
-         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        *)
          ;;
        *)
-         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        esac
       else
        case $host_cpu in
        hppa*64*)
          ;;
        esac
       else
        case $host_cpu in
        hppa*64*)
-         _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        ia64*)
          ;;
        ia64*)
-         _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        *)
        m4_if($1, [], [
          ;;
        *)
        m4_if($1, [], [
@@ -5294,14 +5735,14 @@ _LT_EOF
          # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
          _LT_LINKER_OPTION([if $CC understands -b],
            _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
          # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
          _LT_LINKER_OPTION([if $CC understands -b],
            _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-           [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+           [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
            [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
            [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-         [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+         [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
          ;;
        esac
       fi
          ;;
        esac
       fi
-      if test "$with_gnu_ld" = no; then
-       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
        case $host_cpu in
        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
        case $host_cpu in
@@ -5312,7 +5753,7 @@ _LT_EOF
        *)
          _LT_TAGVAR(hardcode_direct, $1)=yes
          _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
        *)
          _LT_TAGVAR(hardcode_direct, $1)=yes
          _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 
          # hardcode_minus_L: Not really in the search PATH,
          # but as the default location of the library.
 
          # hardcode_minus_L: Not really in the search PATH,
          # but as the default location of the library.
@@ -5323,16 +5764,16 @@ _LT_EOF
       ;;
 
     irix5* | irix6* | nonstopux*)
       ;;
 
     irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
        # Try to use the -exported_symbol ld option, if it does not
        # work, assume that -exports_file does not work either and
        # implicitly export all symbols.
        # This should be the same for all languages, so no per-tag cache variable.
        AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
          [lt_cv_irix_exported_symbol],
        # Try to use the -exported_symbol ld option, if it does not
        # work, assume that -exports_file does not work either and
        # implicitly export all symbols.
        # This should be the same for all languages, so no per-tag cache variable.
        AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
          [lt_cv_irix_exported_symbol],
-         [save_LDFLAGS="$LDFLAGS"
-          LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+         [save_LDFLAGS=$LDFLAGS
+          LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
           AC_LINK_IFELSE(
             [AC_LANG_SOURCE(
                [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
           AC_LINK_IFELSE(
             [AC_LANG_SOURCE(
                [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
@@ -5345,21 +5786,32 @@ _LT_EOF
       end]])])],
              [lt_cv_irix_exported_symbol=yes],
              [lt_cv_irix_exported_symbol=no])
       end]])])],
              [lt_cv_irix_exported_symbol=yes],
              [lt_cv_irix_exported_symbol=no])
-           LDFLAGS="$save_LDFLAGS"])
-       if test "$lt_cv_irix_exported_symbol" = yes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+           LDFLAGS=$save_LDFLAGS])
+       if test yes = "$lt_cv_irix_exported_symbol"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
        fi
        fi
+       _LT_TAGVAR(link_all_deplibs, $1)=no
       else
       else
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(inherit_rpath, $1)=yes
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(inherit_rpath, $1)=yes
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
+    linux*)
+      case $cc_basename in
+      tcc*)
+       # Fabrice Bellard et al's Tiny C Compiler
+       _LT_TAGVAR(ld_shlibs, $1)=yes
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+       ;;
+      esac
+      ;;
+
     netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
     netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
@@ -5374,7 +5826,7 @@ _LT_EOF
     newsos6)
       _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       _LT_TAGVAR(hardcode_direct, $1)=yes
     newsos6)
       _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       ;;
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       ;;
@@ -5382,27 +5834,19 @@ _LT_EOF
     *nto* | *qnx*)
       ;;
 
     *nto* | *qnx*)
       ;;
 
-    openbsd*)
+    openbsd* | bitrig*)
       if test -f /usr/libexec/ld.so; then
        _LT_TAGVAR(hardcode_direct, $1)=yes
        _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
       if test -f /usr/libexec/ld.so; then
        _LT_TAGVAR(hardcode_direct, $1)=yes
        _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-       if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+       if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
        else
        else
-         case $host_os in
-          openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-            _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-            ;;
-          *)
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-            ;;
-         esac
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
        fi
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
        fi
       else
        _LT_TAGVAR(ld_shlibs, $1)=no
@@ -5413,33 +5857,53 @@ _LT_EOF
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+       $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+       $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+       $ECHO EXPORTS >> $output_objdir/$libname.def~
+       emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+       $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+       emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+       $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+       $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+       $ECHO EXPORTS >> $output_objdir/$libname.def~
+       prefix_cmds="$SED"~
+       if test EXPORTS = "`$SED 1q $export_symbols`"; then
+         prefix_cmds="$prefix_cmds -e 1d";
+       fi~
+       prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+       cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+       $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+       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
       ;;
 
     osf3*)
       ;;
 
     osf3*)
-      if test "$GCC" = yes; then
-       _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+       _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
       else
        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
       else
        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       ;;
 
     osf4* | osf5*)     # as osf3* with the addition of -msym flag
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       ;;
 
     osf4* | osf5*)     # as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-       _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      if test yes = "$GCC"; then
+       _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       else
        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
       else
        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
 
        # Both c and cxx compiler support -rpath directly
        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
 
        # Both c and cxx compiler support -rpath directly
        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -5450,24 +5914,24 @@ _LT_EOF
 
     solaris*)
       _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
 
     solaris*)
       _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-       wlarc='${wl}'
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+       wlarc='$wl'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-         $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
        case `$CC -V 2>&1` in
        *"Compilers 5.0"*)
          wlarc=''
       else
        case `$CC -V 2>&1` in
        *"Compilers 5.0"*)
          wlarc=''
-         _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-         $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
          ;;
        *)
          ;;
        *)
-         wlarc='${wl}'
-         _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+         wlarc='$wl'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-         $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
          ;;
        esac
       fi
          ;;
        esac
       fi
@@ -5477,11 +5941,11 @@ _LT_EOF
       solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
       *)
        # The compiler driver will combine and reorder linker options,
       solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
       *)
        # The compiler driver will combine and reorder linker options,
-       # but understands `-z linker_flag'.  GCC discards it without `$wl',
+       # but understands '-z linker_flag'.  GCC discards it without '$wl',
        # but is careful enough not to reorder.
        # Supported since Solaris 2.6 (maybe 2.5.1?)
        # but is careful enough not to reorder.
        # Supported since Solaris 2.6 (maybe 2.5.1?)
-       if test "$GCC" = yes; then
-         _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+       if test yes = "$GCC"; then
+         _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
        else
          _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
        fi
        else
          _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
        fi
@@ -5491,10 +5955,10 @@ _LT_EOF
       ;;
 
     sunos4*)
       ;;
 
     sunos4*)
-      if test "x$host_vendor" = xsequent; then
+      if test sequent = "$host_vendor"; then
        # Use $CC to link under sequent, because it throws in some extra .o
        # files that make .init and .fini sections work.
        # Use $CC to link under sequent, because it throws in some extra .o
        # files that make .init and .fini sections work.
-       _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
       else
        _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
       else
        _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
@@ -5543,43 +6007,43 @@ _LT_EOF
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
       else
-       _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
+      # Note: We CANNOT use -z defs as we might desire, because we do not
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
       runpath_var='LD_RUN_PATH'
 
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
       else
-       _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
       fi
       ;;
 
@@ -5594,17 +6058,17 @@ _LT_EOF
       ;;
     esac
 
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
+    if test sni = "$host_vendor"; then
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
        ;;
       esac
     fi
   fi
 ])
 AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
        ;;
       esac
     fi
   fi
 ])
 AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
 
 _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
 
 
 _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
 
@@ -5621,7 +6085,7 @@ x|xyes)
   # Assume -lc should be added
   _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
 
   # Assume -lc should be added
   _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $_LT_TAGVAR(archive_cmds, $1) in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
     case $_LT_TAGVAR(archive_cmds, $1) in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -5701,12 +6165,12 @@ _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
 _LT_TAGDECL([], [hardcode_libdir_separator], [1],
     [Whether we need a single "-rpath" flag with a separated argument])
 _LT_TAGDECL([], [hardcode_direct], [0],
 _LT_TAGDECL([], [hardcode_libdir_separator], [1],
     [Whether we need a single "-rpath" flag with a separated argument])
 _LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
     DIR into the resulting binary])
 _LT_TAGDECL([], [hardcode_direct_absolute], [0],
     DIR into the resulting binary])
 _LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
     DIR into the resulting binary and the resulting library dependency is
     DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    "absolute", i.e impossible to change by setting $shlibpath_var if the
     library is relocated])
 _LT_TAGDECL([], [hardcode_minus_L], [0],
     [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
     library is relocated])
 _LT_TAGDECL([], [hardcode_minus_L], [0],
     [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
@@ -5747,10 +6211,10 @@ dnl    [Compiler flag to generate thread safe objects])
 # ------------------------
 # Ensure that the configuration variables for a C compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
 # ------------------------
 # Ensure that the configuration variables for a C compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_C_CONFIG],
 [m4_require([_LT_DECL_EGREP])dnl
 m4_defun([_LT_LANG_C_CONFIG],
 [m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
+lt_save_CC=$CC
 AC_LANG_PUSH(C)
 
 # Source file extension for C test sources.
 AC_LANG_PUSH(C)
 
 # Source file extension for C test sources.
@@ -5790,18 +6254,18 @@ if test -n "$compiler"; then
   LT_SYS_DLOPEN_SELF
   _LT_CMD_STRIPLIB
 
   LT_SYS_DLOPEN_SELF
   _LT_CMD_STRIPLIB
 
-  # Report which library types will actually be built
+  # Report what library types will actually be built
   AC_MSG_CHECKING([if libtool supports shared libraries])
   AC_MSG_RESULT([$can_build_shared])
 
   AC_MSG_CHECKING([whether to build shared libraries])
   AC_MSG_CHECKING([if libtool supports shared libraries])
   AC_MSG_RESULT([$can_build_shared])
 
   AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
+  test no = "$can_build_shared" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
-    test "$enable_shared" = yes && enable_static=no
+    test yes = "$enable_shared" && enable_static=no
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
@@ -5809,8 +6273,12 @@ if test -n "$compiler"; then
     ;;
 
   aix[[4-9]]*)
     ;;
 
   aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;                  # shared object as lib.so file only
+      yes,svr4,*) ;;                   # shared object as lib.so archive member only
+      yes,*) enable_static=no ;;       # shared object in lib.a archive as well
+      esac
     fi
     ;;
   esac
     fi
     ;;
   esac
@@ -5818,13 +6286,13 @@ if test -n "$compiler"; then
 
   AC_MSG_CHECKING([whether to build static libraries])
   # Make sure either enable_shared or enable_static is yes.
 
   AC_MSG_CHECKING([whether to build static libraries])
   # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
+  test yes = "$enable_shared" || enable_static=yes
   AC_MSG_RESULT([$enable_static])
 
   _LT_CONFIG($1)
 fi
 AC_LANG_POP
   AC_MSG_RESULT([$enable_static])
 
   _LT_CONFIG($1)
 fi
 AC_LANG_POP
-CC="$lt_save_CC"
+CC=$lt_save_CC
 ])# _LT_LANG_C_CONFIG
 
 
 ])# _LT_LANG_C_CONFIG
 
 
@@ -5832,14 +6300,14 @@ CC="$lt_save_CC"
 # --------------------------
 # Ensure that the configuration variables for a C++ compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
 # --------------------------
 # Ensure that the configuration variables for a C++ compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_CXX_CONFIG],
 [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_EGREP])dnl
 m4_require([_LT_PATH_MANIFEST_TOOL])dnl
 m4_defun([_LT_LANG_CXX_CONFIG],
 [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_EGREP])dnl
 m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
+if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
   AC_PROG_CXXCPP
 else
   _lt_caught_CXX_error=yes
   AC_PROG_CXXCPP
 else
   _lt_caught_CXX_error=yes
@@ -5881,7 +6349,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
+if test yes != "$_lt_caught_CXX_error"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
@@ -5923,35 +6391,35 @@ if test "$_lt_caught_CXX_error" != yes; then
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
     else
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
     fi
 
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
     else
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
     fi
 
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       # Set up default GNU C++ configuration
 
       LT_PATH_LD
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
       # Set up default GNU C++ configuration
 
       LT_PATH_LD
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      if test yes = "$with_gnu_ld"; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 
 
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
+        wlarc='$wl'
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
          $GREP 'no-whole-archive' > /dev/null; then
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
          $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
         else
           _LT_TAGVAR(whole_archive_flag_spec, $1)=
         fi
         else
           _LT_TAGVAR(whole_archive_flag_spec, $1)=
         fi
@@ -5987,18 +6455,30 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=no
         ;;
       aix[[4-9]]*)
         _LT_TAGVAR(ld_shlibs, $1)=no
         ;;
       aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
+        if test ia64 = "$host_cpu"; then
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
-          no_entry_flag=""
+          no_entry_flag=
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
           case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
            for ld_flag in $LDFLAGS; do
              case $ld_flag in
           case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
            for ld_flag in $LDFLAGS; do
              case $ld_flag in
@@ -6008,6 +6488,13 @@ if test "$_lt_caught_CXX_error" != yes; then
                ;;
              esac
            done
                ;;
              esac
            done
+           if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+             # With aix-soname=svr4, we create the lib.so.V shared archives only,
+             # so we don't have lib.a shared libs to link our executables.
+             # We have to force runtime linking in this case.
+             aix_use_runtimelinking=yes
+             LDFLAGS="$LDFLAGS -Wl,-brtl"
+           fi
            ;;
           esac
 
            ;;
           esac
 
@@ -6026,13 +6513,21 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
         _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
         _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
         _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+        _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;      # no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          _LT_TAGVAR(hardcode_direct, $1)=no
+          _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+          ;;
+        esac
 
 
-        if test "$GXX" = yes; then
+        if test yes = "$GXX"; then
           case $host_os in aix4.[[012]]|aix4.[[012]].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
           case $host_os in aix4.[[012]]|aix4.[[012]].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
-         collect2name=`${CC} -print-prog-name=collect2`
+         collect2name=`$CC -print-prog-name=collect2`
          if test -f "$collect2name" &&
             strings "$collect2name" | $GREP resolve_lib_name >/dev/null
          then
          if test -f "$collect2name" &&
             strings "$collect2name" | $GREP resolve_lib_name >/dev/null
          then
@@ -6050,64 +6545,84 @@ if test "$_lt_caught_CXX_error" != yes; then
          fi
           esac
           shared_flag='-shared'
          fi
           esac
           shared_flag='-shared'
-         if test "$aix_use_runtimelinking" = yes; then
-           shared_flag="$shared_flag "'${wl}-G'
+         if test yes = "$aix_use_runtimelinking"; then
+           shared_flag=$shared_flag' $wl-G'
          fi
          fi
+         # Need to ensure runtime linking is disabled for the traditional
+         # shared library, or the linker may eventually find shared libraries
+         # /with/ Import File - we do not want to mix them.
+         shared_flag_aix='-shared'
+         shared_flag_svr4='-shared $wl-G'
         else
           # not using gcc
         else
           # not using gcc
-          if test "$host_cpu" = ia64; then
+          if test ia64 = "$host_cpu"; then
          # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
          # chokes on -Wl,-G. The following line is correct:
          shared_flag='-G'
           else
          # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
          # chokes on -Wl,-G. The following line is correct:
          shared_flag='-G'
           else
-           if test "$aix_use_runtimelinking" = yes; then
-             shared_flag='${wl}-G'
+           if test yes = "$aix_use_runtimelinking"; then
+             shared_flag='$wl-G'
            else
            else
-             shared_flag='${wl}-bM:SRE'
+             shared_flag='$wl-bM:SRE'
            fi
            fi
+           shared_flag_aix='$wl-bM:SRE'
+           shared_flag_svr4='$wl-G'
           fi
         fi
 
           fi
         fi
 
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
        # export.
         _LT_TAGVAR(always_export_symbols, $1)=yes
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
        # export.
         _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
+       if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # The "-G" linker flag allows undefined symbols.
+          _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
           # Determine the default libpath from the value encoded in an empty
           # executable.
           _LT_SYS_MODULE_PATH_AIX([$1])
           # Determine the default libpath from the value encoded in an empty
           # executable.
           _LT_SYS_MODULE_PATH_AIX([$1])
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 
 
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
         else
         else
-          if test "$host_cpu" = ia64; then
-           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+          if test ia64 = "$host_cpu"; then
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
            _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
            _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-           _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+           _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
           else
            # Determine the default libpath from the value encoded in an
            # empty executable.
            _LT_SYS_MODULE_PATH_AIX([$1])
           else
            # Determine the default libpath from the value encoded in an
            # empty executable.
            _LT_SYS_MODULE_PATH_AIX([$1])
-           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
            # Warning - without using the other run time loading flags,
            # -berok will link without error, but may produce a broken library.
            # Warning - without using the other run time loading flags,
            # -berok will link without error, but may produce a broken library.
-           _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-           _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-           if test "$with_gnu_ld" = yes; then
+           _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+           _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+           if test yes = "$with_gnu_ld"; then
              # We only use this code for GNU lds that support --whole-archive.
              # We only use this code for GNU lds that support --whole-archive.
-             _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
            else
              # Exported symbols can be pulled into shared objects from archives
              _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
            fi
            _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
            else
              # Exported symbols can be pulled into shared objects from archives
              _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
            fi
            _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-           # This is similar to how AIX traditionally builds its shared
-           # libraries.
-           _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+           # -brtl affects multiple linker settings, -berok does not and is overridden later
+           compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+           if test svr4 != "$with_aix_soname"; then
+             # This is similar to how AIX traditionally builds its shared
+             # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+             _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+           fi
+           if test aix != "$with_aix_soname"; then
+             _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+           else
+             # used by -dlpreopen to get the symbols
+             _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+           fi
+           _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
           fi
         fi
         ;;
           fi
         fi
         ;;
@@ -6117,7 +6632,7 @@ if test "$_lt_caught_CXX_error" != yes; then
          _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
          # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
          # support --undefined.  This deserves some investigation.  FIXME
          _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
          # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
          # support --undefined.  This deserves some investigation.  FIXME
-         _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
        else
          _LT_TAGVAR(ld_shlibs, $1)=no
        fi
        else
          _LT_TAGVAR(ld_shlibs, $1)=no
        fi
@@ -6145,57 +6660,58 @@ if test "$_lt_caught_CXX_error" != yes; then
          # Tell ltmain to make .lib files, not .a files.
          libext=lib
          # Tell ltmain to make .dll files, not .so files.
          # Tell ltmain to make .lib files, not .a files.
          libext=lib
          # Tell ltmain to make .dll files, not .so files.
-         shrext_cmds=".dll"
+         shrext_cmds=.dll
          # FIXME: Setting linknames here is a bad hack.
          # FIXME: Setting linknames here is a bad hack.
-         _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-         _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-             $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-           else
-             $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-           fi~
-           $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-           linknames='
+         _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+         _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
          # The linker will not automatically build a static lib if we build a DLL.
          # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
          _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
          # Don't use ranlib
          _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
          _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
          # The linker will not automatically build a static lib if we build a DLL.
          # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
          _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
          # Don't use ranlib
          _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
          _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-           lt_tool_outputfile="@TOOL_OUTPUT@"~
-           case $lt_outputfile in
-             *.exe|*.EXE) ;;
-             *)
-               lt_outputfile="$lt_outputfile.exe"
-               lt_tool_outputfile="$lt_tool_outputfile.exe"
-               ;;
-           esac~
-           func_to_tool_file "$lt_outputfile"~
-           if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-             $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-             $RM "$lt_outputfile.manifest";
-           fi'
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
          ;;
        *)
          # g++
          # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
          # as there is no search path for DLLs.
          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
          ;;
        *)
          # g++
          # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
          # as there is no search path for DLLs.
          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-         _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+         _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
          _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
          _LT_TAGVAR(always_export_symbols, $1)=no
          _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
 
          if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
          _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
          _LT_TAGVAR(always_export_symbols, $1)=no
          _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
 
          if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-           # If the export-symbols file already is a .def file (1st line
-           # is EXPORTS), use it as is; otherwise, prepend...
-           _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-             cp $export_symbols $output_objdir/$soname.def;
-           else
-             echo EXPORTS > $output_objdir/$soname.def;
-             cat $export_symbols >> $output_objdir/$soname.def;
-           fi~
-           $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+           # If the export-symbols file already is a .def file, use it as
+           # is; otherwise, prepend EXPORTS...
+           _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
          else
            _LT_TAGVAR(ld_shlibs, $1)=no
          fi
          else
            _LT_TAGVAR(ld_shlibs, $1)=no
          fi
@@ -6206,6 +6722,34 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_DARWIN_LINKER_FEATURES($1)
        ;;
 
         _LT_DARWIN_LINKER_FEATURES($1)
        ;;
 
+      os2*)
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+       _LT_TAGVAR(hardcode_minus_L, $1)=yes
+       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+       shrext_cmds=.dll
+       _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+         $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+         $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+         $ECHO EXPORTS >> $output_objdir/$libname.def~
+         emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+         $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+         emximp -o $lib $output_objdir/$libname.def'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+         $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+         $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+         $ECHO EXPORTS >> $output_objdir/$libname.def~
+         prefix_cmds="$SED"~
+         if test EXPORTS = "`$SED 1q $export_symbols`"; then
+           prefix_cmds="$prefix_cmds -e 1d";
+         fi~
+         prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+         cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+         $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+         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
+       ;;
+
       dgux*)
         case $cc_basename in
           ec++*)
       dgux*)
         case $cc_basename in
           ec++*)
@@ -6241,14 +6785,14 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
       haiku*)
         ;;
 
       haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
         ;;
 
       hpux9*)
         _LT_TAGVAR(link_all_deplibs, $1)=yes
         ;;
 
       hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
         _LT_TAGVAR(hardcode_direct, $1)=yes
         _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
                                             # but as the default
         _LT_TAGVAR(hardcode_direct, $1)=yes
         _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
                                             # but as the default
@@ -6260,7 +6804,7 @@ if test "$_lt_caught_CXX_error" != yes; then
             _LT_TAGVAR(ld_shlibs, $1)=no
             ;;
           aCC*)
             _LT_TAGVAR(ld_shlibs, $1)=no
             ;;
           aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
@@ -6269,11 +6813,11 @@ if test "$_lt_caught_CXX_error" != yes; then
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
             ;;
           *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            if test yes = "$GXX"; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             else
               # FIXME: insert proper C++ library support
               _LT_TAGVAR(ld_shlibs, $1)=no
             else
               # FIXME: insert proper C++ library support
               _LT_TAGVAR(ld_shlibs, $1)=no
@@ -6283,15 +6827,15 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
       hpux10*|hpux11*)
         ;;
 
       hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        if test no = "$with_gnu_ld"; then
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
          _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
          _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
-             _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+             _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
               ;;
           esac
         fi
               ;;
           esac
         fi
@@ -6317,13 +6861,13 @@ if test "$_lt_caught_CXX_error" != yes; then
           aCC*)
            case $host_cpu in
              hppa*64*)
           aCC*)
            case $host_cpu in
              hppa*64*)
-               _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                ;;
              ia64*)
                ;;
              ia64*)
-               _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                ;;
              *)
                ;;
              *)
-               _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                ;;
            esac
            # Commands to make compiler produce verbose output that lists
                ;;
            esac
            # Commands to make compiler produce verbose output that lists
@@ -6334,20 +6878,20 @@ if test "$_lt_caught_CXX_error" != yes; then
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
            ;;
           *)
            ;;
           *)
-           if test "$GXX" = yes; then
-             if test $with_gnu_ld = no; then
+           if test yes = "$GXX"; then
+             if test no = "$with_gnu_ld"; then
                case $host_cpu in
                  hppa*64*)
                case $host_cpu in
                  hppa*64*)
-                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                    ;;
                  ia64*)
                    ;;
                  ia64*)
-                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                    ;;
                  *)
                    ;;
                  *)
-                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
                    ;;
                esac
              fi
                    ;;
                esac
              fi
@@ -6362,22 +6906,22 @@ if test "$_lt_caught_CXX_error" != yes; then
       interix[[3-9]]*)
        _LT_TAGVAR(hardcode_direct, $1)=no
        _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       interix[[3-9]]*)
        _LT_TAGVAR(hardcode_direct, $1)=no
        _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
        # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
        # Instead, shared libraries are loaded at an image base (0x10000000 by
        # default) and relocated if they conflict, which is a slow very memory
        # consuming and fragmenting process.  To avoid this, we pick a random,
        # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
        # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
        # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
        # Instead, shared libraries are loaded at an image base (0x10000000 by
        # default) and relocated if they conflict, which is a slow very memory
        # consuming and fragmenting process.  To avoid this, we pick a random,
        # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
        # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-       _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
        ;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
            # SGI C++
        ;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
            # SGI C++
-           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 
            # Archives containing C++ object files must be created using
            # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
 
            # Archives containing C++ object files must be created using
            # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
@@ -6386,17 +6930,17 @@ if test "$_lt_caught_CXX_error" != yes; then
            _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
            ;;
           *)
            _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
            ;;
           *)
-           if test "$GXX" = yes; then
-             if test "$with_gnu_ld" = no; then
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+           if test yes = "$GXX"; then
+             if test no = "$with_gnu_ld"; then
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
              else
              else
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
              fi
            fi
            _LT_TAGVAR(link_all_deplibs, $1)=yes
            ;;
         esac
              fi
            fi
            _LT_TAGVAR(link_all_deplibs, $1)=yes
            ;;
         esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
@@ -6409,8 +6953,8 @@ if test "$_lt_caught_CXX_error" != yes; then
            # KCC will only create a shared library if the output file
            # ends with ".so" (or ".sl" for HP-UX), so rename the library
            # to its proper name (with version) after linking.
            # KCC will only create a shared library if the output file
            # ends with ".so" (or ".sl" for HP-UX), so rename the library
            # to its proper name (with version) after linking.
-           _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-           _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+           _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
            # Commands to make compiler produce verbose output that lists
            # what "hidden" libraries, object files and flags are used when
            # linking a shared library.
            # Commands to make compiler produce verbose output that lists
            # what "hidden" libraries, object files and flags are used when
            # linking a shared library.
@@ -6419,10 +6963,10 @@ if test "$_lt_caught_CXX_error" != yes; then
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 
 
-           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
 
            # Archives containing C++ object files must be created using
            # "CC -Bstatic", where "CC" is the KAI C++ compiler.
 
            # Archives containing C++ object files must be created using
            # "CC -Bstatic", where "CC" is the KAI C++ compiler.
@@ -6436,59 +6980,59 @@ if test "$_lt_caught_CXX_error" != yes; then
            # earlier do not add the objects themselves.
            case `$CC -V 2>&1` in
              *"Version 7."*)
            # earlier do not add the objects themselves.
            case `$CC -V 2>&1` in
              *"Version 7."*)
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-               _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
                ;;
              *)  # Version 8.0 or newer
                tmp_idyn=
                case $host_cpu in
                  ia64*) tmp_idyn=' -i_dynamic';;
                esac
                ;;
              *)  # Version 8.0 or newer
                tmp_idyn=
                case $host_cpu in
                  ia64*) tmp_idyn=' -i_dynamic';;
                esac
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-               _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+               _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
                ;;
            esac
            _LT_TAGVAR(archive_cmds_need_lc, $1)=no
                ;;
            esac
            _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
            ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
            case `$CC -V` in
            *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
              _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
            ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
            case `$CC -V` in
            *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
              _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-               rm -rf $tpldir~
-               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
              _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
              _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-               rm -rf $tpldir~
-               $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-               $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-               $RANLIB $oldlib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
              _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
              _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-               rm -rf $tpldir~
-               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
              _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
              _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-               rm -rf $tpldir~
-               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
              ;;
            *) # Version 6 and above use weak symbols
              ;;
            *) # Version 6 and above use weak symbols
-             _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-             _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+             _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+             _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
              ;;
            esac
 
              ;;
            esac
 
-           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-           _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
             ;;
          cxx*)
            # Compaq C++
             ;;
          cxx*)
            # Compaq C++
-           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
 
            runpath_var=LD_RUN_PATH
            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
 
            runpath_var=LD_RUN_PATH
            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -6502,18 +7046,18 @@ if test "$_lt_caught_CXX_error" != yes; then
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
            ;;
          xl* | mpixl* | bgxl*)
            # IBM XL 8.0 on PPC, with GNU ld
            ;;
          xl* | mpixl* | bgxl*)
            # IBM XL 8.0 on PPC, with GNU ld
-           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-           _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-           if test "x$supports_anon_versioning" = xyes; then
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+           if test yes = "$supports_anon_versioning"; then
              _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
              _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-               cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-               echo "local: *; };" >> $output_objdir/$libname.ver~
-               $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
            fi
            ;;
          *)
            fi
            ;;
          *)
@@ -6521,10 +7065,10 @@ if test "$_lt_caught_CXX_error" != yes; then
            *Sun\ C*)
              # Sun C++ 5.9
              _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
            *Sun\ C*)
              # Sun C++ 5.9
              _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-             _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-             _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+             _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+             _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
              _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
              _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-             _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+             _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
              _LT_TAGVAR(compiler_needs_object, $1)=yes
 
              # Not sure whether something based on
              _LT_TAGVAR(compiler_needs_object, $1)=yes
 
              # Not sure whether something based on
@@ -6582,22 +7126,17 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=yes
        ;;
 
         _LT_TAGVAR(ld_shlibs, $1)=yes
        ;;
 
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-       _LT_TAGVAR(ld_shlibs, $1)=no
-       ;;
-
-      openbsd*)
+      openbsd* | bitrig*)
        if test -f /usr/libexec/ld.so; then
          _LT_TAGVAR(hardcode_direct, $1)=yes
          _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
          _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
        if test -f /usr/libexec/ld.so; then
          _LT_TAGVAR(hardcode_direct, $1)=yes
          _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
          _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-         if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-           _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-           _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+         _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+         if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+           _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+           _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
          fi
          output_verbose_link_cmd=func_echo_all
        else
          fi
          output_verbose_link_cmd=func_echo_all
        else
@@ -6613,9 +7152,9 @@ if test "$_lt_caught_CXX_error" != yes; then
            # KCC will only create a shared library if the output file
            # ends with ".so" (or ".sl" for HP-UX), so rename the library
            # to its proper name (with version) after linking.
            # KCC will only create a shared library if the output file
            # ends with ".so" (or ".sl" for HP-UX), so rename the library
            # to its proper name (with version) after linking.
-           _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+           _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
 
 
-           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+           _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
            _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
            # Archives containing C++ object files must be created using
            _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
            # Archives containing C++ object files must be created using
@@ -6633,17 +7172,17 @@ if test "$_lt_caught_CXX_error" != yes; then
           cxx*)
            case $host in
              osf3*)
           cxx*)
            case $host in
              osf3*)
-               _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-               _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+               _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+               _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
                ;;
              *)
                _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
                ;;
              *)
                _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
                _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
                _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-                 echo "-hidden">> $lib.exp~
-                 $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-                 $RM $lib.exp'
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
                _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
                ;;
            esac
                _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
                ;;
            esac
@@ -6658,21 +7197,21 @@ if test "$_lt_caught_CXX_error" != yes; then
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
-           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
            ;;
          *)
            ;;
          *)
-           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-             _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+           if test yes,no = "$GXX,$with_gnu_ld"; then
+             _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
              case $host in
                osf3*)
              case $host in
                osf3*)
-                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
                  ;;
                *)
                  ;;
                *)
-                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
                  ;;
              esac
 
                  ;;
              esac
 
-             _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+             _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
              _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
              # Commands to make compiler produce verbose output that lists
              _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
              # Commands to make compiler produce verbose output that lists
@@ -6718,9 +7257,9 @@ if test "$_lt_caught_CXX_error" != yes; then
            # Sun C++ 4.2, 5.x and Centerline C++
             _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
            _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
            # Sun C++ 4.2, 5.x and Centerline C++
             _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
            _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-           _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
            _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
            _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-             $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
 
            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -6728,7 +7267,7 @@ if test "$_lt_caught_CXX_error" != yes; then
              solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
              *)
                # The compiler driver will combine and reorder linker options,
              solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
              *)
                # The compiler driver will combine and reorder linker options,
-               # but understands `-z linker_flag'.
+               # but understands '-z linker_flag'.
                # Supported since Solaris 2.6 (maybe 2.5.1?)
                _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
                ;;
                # Supported since Solaris 2.6 (maybe 2.5.1?)
                _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
                ;;
@@ -6745,30 +7284,30 @@ if test "$_lt_caught_CXX_error" != yes; then
            ;;
           gcx*)
            # Green Hills C++ Compiler
            ;;
           gcx*)
            # Green Hills C++ Compiler
-           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 
            # The C++ compiler must be used to create the archive.
            _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
            ;;
           *)
            # GNU C++ compiler with Solaris linker
 
            # The C++ compiler must be used to create the archive.
            _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
            ;;
           *)
            # GNU C++ compiler with Solaris linker
-           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-             _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+           if test yes,no = "$GXX,$with_gnu_ld"; then
+             _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
              if $CC --version | $GREP -v '^2\.7' > /dev/null; then
              if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
                _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
                _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-                 $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                # linking a shared library.
                output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
              else
 
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
                # linking a shared library.
                output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
              else
-               # g++ 2.7 appears to require `-G' NOT `-shared' on this
+               # g++ 2.7 appears to require '-G' NOT '-shared' on this
                # platform.
                # platform.
-               _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
                _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
                _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-                 $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
 
                # Commands to make compiler produce verbose output that lists
                # what "hidden" libraries, object files and flags are used when
@@ -6776,11 +7315,11 @@ if test "$_lt_caught_CXX_error" != yes; then
                output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
              fi
 
                output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
              fi
 
-             _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+             _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
              case $host_os in
                solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
                *)
              case $host_os in
                solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
                *)
-                 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+                 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
                  ;;
              esac
            fi
                  ;;
              esac
            fi
@@ -6789,52 +7328,52 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
-         _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
          ;;
        *)
          ;;
        *)
-         _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
          ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
          ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
-       # Note: We can NOT use -z defs as we might desire, because we do not
+       # Note: We CANNOT use -z defs as we might desire, because we do not
        # link with -lc, and that would cause any symbols used from libc to
        # always be unresolved, which means just about no library would
        # ever link correctly.  If we're not using GNU ld we use -z text
        # though, which does catch some bad symbols but isn't as heavy-handed
        # as -z defs.
        # link with -lc, and that would cause any symbols used from libc to
        # always be unresolved, which means just about no library would
        # ever link correctly.  If we're not using GNU ld we use -z text
        # though, which does catch some bad symbols but isn't as heavy-handed
        # as -z defs.
-       _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-       _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+       _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+       _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
        _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
        _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
        _LT_TAGVAR(link_all_deplibs, $1)=yes
        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
        _LT_TAGVAR(link_all_deplibs, $1)=yes
-       _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+       _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
        runpath_var='LD_RUN_PATH'
 
        case $cc_basename in
           CC*)
        runpath_var='LD_RUN_PATH'
 
        case $cc_basename in
           CC*)
-           _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
            _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
            _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-             '"$_LT_TAGVAR(old_archive_cmds, $1)"
+              '"$_LT_TAGVAR(old_archive_cmds, $1)"
            _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
            _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-             '"$_LT_TAGVAR(reload_cmds, $1)"
+              '"$_LT_TAGVAR(reload_cmds, $1)"
            ;;
          *)
            ;;
          *)
-           _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
            ;;
        esac
       ;;
            ;;
        esac
       ;;
@@ -6865,10 +7404,10 @@ if test "$_lt_caught_CXX_error" != yes; then
     esac
 
     AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
     esac
 
     AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+    test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
 
 
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$GXX
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -6895,7 +7434,7 @@ if test "$_lt_caught_CXX_error" != yes; then
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
+fi # test yes != "$_lt_caught_CXX_error"
 
 AC_LANG_POP
 ])# _LT_LANG_CXX_CONFIG
 
 AC_LANG_POP
 ])# _LT_LANG_CXX_CONFIG
@@ -6917,13 +7456,14 @@ AC_REQUIRE([_LT_DECL_SED])
 AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
 func_stripname_cnf ()
 {
 AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
 func_stripname_cnf ()
 {
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  case @S|@2 in
+  .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
   esac
 } # func_stripname_cnf
 ])# _LT_FUNC_STRIPNAME_CNF
 
   esac
 } # func_stripname_cnf
 ])# _LT_FUNC_STRIPNAME_CNF
 
+
 # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
 # ---------------------------------
 # Figure out "hidden" library dependencies from verbose
 # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
 # ---------------------------------
 # Figure out "hidden" library dependencies from verbose
@@ -7007,13 +7547,13 @@ if AC_TRY_EVAL(ac_compile); then
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
+    case $prev$p in
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
         prev=$p
         continue
        fi
         prev=$p
         continue
        fi
@@ -7029,16 +7569,16 @@ if AC_TRY_EVAL(ac_compile); then
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
-       if test "$pre_test_object_deps_done" = no; then
-        case ${prev} in
+       if test no = "$pre_test_object_deps_done"; then
+        case $prev in
         -L | -R)
           # Internal compiler library paths should come after those
           # provided the user.  The postdeps already come after the
           # user supplied libs so there is no need to process them.
           if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
         -L | -R)
           # Internal compiler library paths should come after those
           # provided the user.  The postdeps already come after the
           # user supplied libs so there is no need to process them.
           if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-            _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+            _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
           else
           else
-            _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+            _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
           fi
           ;;
         # The "-l" case would never come before the object being
           fi
           ;;
         # The "-l" case would never come before the object being
@@ -7046,9 +7586,9 @@ if AC_TRY_EVAL(ac_compile); then
         esac
        else
         if test -z "$_LT_TAGVAR(postdeps, $1)"; then
         esac
        else
         if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-          _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+          _LT_TAGVAR(postdeps, $1)=$prev$p
         else
         else
-          _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+          _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
         fi
        fi
        prev=
         fi
        fi
        prev=
@@ -7063,15 +7603,15 @@ if AC_TRY_EVAL(ac_compile); then
         continue
        fi
 
         continue
        fi
 
-       if test "$pre_test_object_deps_done" = no; then
+       if test no = "$pre_test_object_deps_done"; then
         if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
         if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-          _LT_TAGVAR(predep_objects, $1)="$p"
+          _LT_TAGVAR(predep_objects, $1)=$p
         else
           _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
         fi
        else
         if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
         else
           _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
         fi
        else
         if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-          _LT_TAGVAR(postdep_objects, $1)="$p"
+          _LT_TAGVAR(postdep_objects, $1)=$p
         else
           _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
         fi
         else
           _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
         fi
@@ -7102,51 +7642,6 @@ interix[[3-9]]*)
   _LT_TAGVAR(postdep_objects,$1)=
   _LT_TAGVAR(postdeps,$1)=
   ;;
   _LT_TAGVAR(postdep_objects,$1)=
   _LT_TAGVAR(postdeps,$1)=
   ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
 esac
 ])
 
 esac
 ])
 
@@ -7155,7 +7650,7 @@ case " $_LT_TAGVAR(postdeps, $1) " in
 esac
  _LT_TAGVAR(compiler_lib_search_dirs, $1)=
 if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
 esac
  _LT_TAGVAR(compiler_lib_search_dirs, $1)=
 if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
 fi
 _LT_TAGDECL([], [compiler_lib_search_dirs], [1],
     [The directories searched by this compiler when creating a shared library])
 fi
 _LT_TAGDECL([], [compiler_lib_search_dirs], [1],
     [The directories searched by this compiler when creating a shared library])
@@ -7175,10 +7670,10 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1],
 # --------------------------
 # Ensure that the configuration variables for a Fortran 77 compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
 # --------------------------
 # Ensure that the configuration variables for a Fortran 77 compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_F77_CONFIG],
 [AC_LANG_PUSH(Fortran 77)
 m4_defun([_LT_LANG_F77_CONFIG],
 [AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
+if test -z "$F77" || test no = "$F77"; then
   _lt_disable_F77=yes
 fi
 
   _lt_disable_F77=yes
 fi
 
@@ -7215,7 +7710,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the F77 compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
 # the F77 compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
+if test yes != "$_lt_disable_F77"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
@@ -7237,7 +7732,7 @@ if test "$_lt_disable_F77" != yes; then
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
+  lt_save_CC=$CC
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${F77-"f77"}
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${F77-"f77"}
@@ -7251,21 +7746,25 @@ if test "$_lt_disable_F77" != yes; then
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
+    test no = "$can_build_shared" && enable_shared=no
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
-        test "$enable_shared" = yes && enable_static=no
+        test yes = "$enable_shared" && enable_static=no
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
-       if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-         test "$enable_shared" = yes && enable_static=no
+       if test ia64 != "$host_cpu"; then
+         case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+         yes,aix,yes) ;;               # shared object as lib.so file only
+         yes,svr4,*) ;;                # shared object as lib.so archive member only
+         yes,*) enable_static=no ;;    # shared object in lib.a archive as well
+         esac
        fi
         ;;
     esac
        fi
         ;;
     esac
@@ -7273,11 +7772,11 @@ if test "$_lt_disable_F77" != yes; then
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
+    test yes = "$enable_shared" || enable_static=yes
     AC_MSG_RESULT([$enable_static])
 
     AC_MSG_RESULT([$enable_static])
 
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$G77
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -7294,9 +7793,9 @@ if test "$_lt_disable_F77" != yes; then
   fi # test -n "$compiler"
 
   GCC=$lt_save_GCC
   fi # test -n "$compiler"
 
   GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-  CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
 
 AC_LANG_POP
 ])# _LT_LANG_F77_CONFIG
 
 AC_LANG_POP
 ])# _LT_LANG_F77_CONFIG
@@ -7306,11 +7805,11 @@ AC_LANG_POP
 # -------------------------
 # Ensure that the configuration variables for a Fortran compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
 # -------------------------
 # Ensure that the configuration variables for a Fortran compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_FC_CONFIG],
 [AC_LANG_PUSH(Fortran)
 
 m4_defun([_LT_LANG_FC_CONFIG],
 [AC_LANG_PUSH(Fortran)
 
-if test -z "$FC" || test "X$FC" = "Xno"; then
+if test -z "$FC" || test no = "$FC"; then
   _lt_disable_FC=yes
 fi
 
   _lt_disable_FC=yes
 fi
 
@@ -7347,7 +7846,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the FC compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
 # the FC compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
+if test yes != "$_lt_disable_FC"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
@@ -7369,7 +7868,7 @@ if test "$_lt_disable_FC" != yes; then
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
+  lt_save_CC=$CC
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${FC-"f95"}
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${FC-"f95"}
@@ -7385,21 +7884,25 @@ if test "$_lt_disable_FC" != yes; then
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
+    test no = "$can_build_shared" && enable_shared=no
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
-        test "$enable_shared" = yes && enable_static=no
+        test yes = "$enable_shared" && enable_static=no
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
-       if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-         test "$enable_shared" = yes && enable_static=no
+       if test ia64 != "$host_cpu"; then
+         case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+         yes,aix,yes) ;;               # shared object as lib.so file only
+         yes,svr4,*) ;;                # shared object as lib.so archive member only
+         yes,*) enable_static=no ;;    # shared object in lib.a archive as well
+         esac
        fi
         ;;
     esac
        fi
         ;;
     esac
@@ -7407,11 +7910,11 @@ if test "$_lt_disable_FC" != yes; then
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
+    test yes = "$enable_shared" || enable_static=yes
     AC_MSG_RESULT([$enable_static])
 
     AC_MSG_RESULT([$enable_static])
 
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -7431,7 +7934,7 @@ if test "$_lt_disable_FC" != yes; then
   GCC=$lt_save_GCC
   CC=$lt_save_CC
   CFLAGS=$lt_save_CFLAGS
   GCC=$lt_save_GCC
   CC=$lt_save_CC
   CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
+fi # test yes != "$_lt_disable_FC"
 
 AC_LANG_POP
 ])# _LT_LANG_FC_CONFIG
 
 AC_LANG_POP
 ])# _LT_LANG_FC_CONFIG
@@ -7441,7 +7944,7 @@ AC_LANG_POP
 # --------------------------
 # Ensure that the configuration variables for the GNU Java Compiler compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
 # --------------------------
 # Ensure that the configuration variables for the GNU Java Compiler compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_GCJ_CONFIG],
 [AC_REQUIRE([LT_PROG_GCJ])dnl
 AC_LANG_SAVE
 m4_defun([_LT_LANG_GCJ_CONFIG],
 [AC_REQUIRE([LT_PROG_GCJ])dnl
 AC_LANG_SAVE
@@ -7475,7 +7978,7 @@ CC=${GCJ-"gcj"}
 CFLAGS=$GCJFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
 CFLAGS=$GCJFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
 _LT_CC_BASENAME([$compiler])
 
 # GCJ did not exist at the time GCC didn't implicitly link libc in.
 _LT_CC_BASENAME([$compiler])
 
 # GCJ did not exist at the time GCC didn't implicitly link libc in.
@@ -7512,7 +8015,7 @@ CFLAGS=$lt_save_CFLAGS
 # --------------------------
 # Ensure that the configuration variables for the GNU Go compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
 # --------------------------
 # Ensure that the configuration variables for the GNU Go compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_GO_CONFIG],
 [AC_REQUIRE([LT_PROG_GO])dnl
 AC_LANG_SAVE
 m4_defun([_LT_LANG_GO_CONFIG],
 [AC_REQUIRE([LT_PROG_GO])dnl
 AC_LANG_SAVE
@@ -7546,7 +8049,7 @@ CC=${GOC-"gccgo"}
 CFLAGS=$GOFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
 CFLAGS=$GOFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
 _LT_CC_BASENAME([$compiler])
 
 # Go did not exist at the time GCC didn't implicitly link libc in.
 _LT_CC_BASENAME([$compiler])
 
 # Go did not exist at the time GCC didn't implicitly link libc in.
@@ -7583,7 +8086,7 @@ CFLAGS=$lt_save_CFLAGS
 # -------------------------
 # Ensure that the configuration variables for the Windows resource compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
 # -------------------------
 # Ensure that the configuration variables for the Windows resource compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_RC_CONFIG],
 [AC_REQUIRE([LT_PROG_RC])dnl
 AC_LANG_SAVE
 m4_defun([_LT_LANG_RC_CONFIG],
 [AC_REQUIRE([LT_PROG_RC])dnl
 AC_LANG_SAVE
@@ -7599,7 +8102,7 @@ _LT_TAGVAR(objext, $1)=$objext
 lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
 
 # Code to be used in simple link tests
 lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
 
 # Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
+lt_simple_link_test_code=$lt_simple_compile_test_code
 
 # ltmain only uses $CC for tagged configurations so make sure $CC is set.
 _LT_TAG_COMPILER
 
 # ltmain only uses $CC for tagged configurations so make sure $CC is set.
 _LT_TAG_COMPILER
@@ -7609,7 +8112,7 @@ _LT_COMPILER_BOILERPLATE
 _LT_LINKER_BOILERPLATE
 
 # Allow CC to be a program name with arguments.
 _LT_LINKER_BOILERPLATE
 
 # Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
+lt_save_CC=$CC
 lt_save_CFLAGS=$CFLAGS
 lt_save_GCC=$GCC
 GCC=
 lt_save_CFLAGS=$CFLAGS
 lt_save_GCC=$GCC
 GCC=
@@ -7638,7 +8141,7 @@ AC_DEFUN([LT_PROG_GCJ],
 [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
   [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
     [AC_CHECK_TOOL(GCJ, gcj,)
 [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
   [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
     [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
       AC_SUBST(GCJFLAGS)])])[]dnl
 ])
 
       AC_SUBST(GCJFLAGS)])])[]dnl
 ])
 
@@ -7749,7 +8252,7 @@ lt_ac_count=0
 # Add /usr/xpg4/bin/sed as it is typically found on Solaris
 # along with /bin/sed that truncates output.
 for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
 # Add /usr/xpg4/bin/sed as it is typically found on Solaris
 # along with /bin/sed that truncates output.
 for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
+  test ! -f "$lt_ac_sed" && continue
   cat /dev/null > conftest.in
   lt_ac_count=0
   echo $ECHO_N "0123456789$ECHO_C" >conftest.in
   cat /dev/null > conftest.in
   lt_ac_count=0
   echo $ECHO_N "0123456789$ECHO_C" >conftest.in
@@ -7766,9 +8269,9 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
     $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
     cmp -s conftest.out conftest.nl || break
     # 10000 chars as input seems more than enough
     $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
     cmp -s conftest.out conftest.nl || break
     # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
+    test 10 -lt "$lt_ac_count" && break
     lt_ac_count=`expr $lt_ac_count + 1`
     lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
+    if test "$lt_ac_count" -gt "$lt_ac_max"; then
       lt_ac_max=$lt_ac_count
       lt_cv_path_SED=$lt_ac_sed
     fi
       lt_ac_max=$lt_ac_count
       lt_cv_path_SED=$lt_ac_sed
     fi
@@ -7792,27 +8295,7 @@ dnl AC_DEFUN([LT_AC_PROG_SED], [])
 # Find out whether the shell is Bourne or XSI compatible,
 # or has some other useful features.
 m4_defun([_LT_CHECK_SHELL_FEATURES],
 # Find out whether the shell is Bourne or XSI compatible,
 # or has some other useful features.
 m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
   lt_unset=false
   lt_unset=unset
 else
   lt_unset=false
@@ -7836,102 +8319,9 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
 ])# _LT_CHECK_SHELL_FEATURES
 
 
 ])# _LT_CHECK_SHELL_FEATURES
 
 
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([    ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
-    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-    # positional parameters, so assign one to ordinary parameter first.
-    func_stripname_result=${3}
-    func_stripname_result=${func_stripname_result#"${1}"}
-    func_stripname_result=${func_stripname_result%"${2}"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
-    func_split_long_opt_name=${1%%=*}
-    func_split_long_opt_arg=${1#*=}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
-    func_split_short_opt_arg=${1#??}
-    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
-    case ${1} in
-      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-      *)    func_lo2o_result=${1} ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
-
-  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
-
-  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
-    func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
-    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
 # _LT_PATH_CONVERSION_FUNCTIONS
 # -----------------------------
 # _LT_PATH_CONVERSION_FUNCTIONS
 # -----------------------------
-# Determine which file name conversion functions should be used by
+# Determine what file name conversion functions should be used by
 # func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
 # for certain cross-compile configurations and native mingw.
 m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
 # func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
 # for certain cross-compile configurations and native mingw.
 m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
index 5d9acd8..94b0829 100644 (file)
@@ -1,14 +1,14 @@
 # Helper functions for option handling.                    -*- Autoconf -*-
 #
 # Helper functions for option handling.                    -*- Autoconf -*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+#   Foundation, Inc.
 #   Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
 # unlimited permission to copy and/or distribute it, with or without
 # modifications, as long as this notice is preserved.
 
 #   Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
 # unlimited permission to copy and/or distribute it, with or without
 # modifications, as long as this notice is preserved.
 
-# serial 7 ltoptions.m4
+# serial 8 ltoptions.m4
 
 # This is to help aclocal find these macros, as it can't see m4_define.
 AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
 
 # This is to help aclocal find these macros, as it can't see m4_define.
 AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
@@ -29,7 +29,7 @@ m4_define([_LT_SET_OPTION],
 [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
 m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
         _LT_MANGLE_DEFUN([$1], [$2]),
 [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
 m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
         _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
+    [m4_warning([Unknown $1 option '$2'])])[]dnl
 ])
 
 
 ])
 
 
@@ -75,13 +75,15 @@ m4_if([$1],[LT_INIT],[
   dnl
   dnl If no reference was made to various pairs of opposing options, then
   dnl we run the default mode handler for the pair.  For example, if neither
   dnl
   dnl If no reference was made to various pairs of opposing options, then
   dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
   dnl archives by default:
   _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
   _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
   dnl archives by default:
   _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
   _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-                  [_LT_ENABLE_FAST_INSTALL])
+                  [_LT_ENABLE_FAST_INSTALL])
+  _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+                  [_LT_WITH_AIX_SONAME([aix])])
   ])
 ])# _LT_SET_OPTIONS
 
   ])
 ])# _LT_SET_OPTIONS
 
@@ -112,7 +114,7 @@ AU_DEFUN([AC_LIBTOOL_DLOPEN],
 [_LT_SET_OPTION([LT_INIT], [dlopen])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
 [_LT_SET_OPTION([LT_INIT], [dlopen])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
+put the 'dlopen' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -148,7 +150,7 @@ AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
 _LT_SET_OPTION([LT_INIT], [win32-dll])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
 _LT_SET_OPTION([LT_INIT], [win32-dll])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
+put the 'win32-dll' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -157,9 +159,9 @@ dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
 
 # _LT_ENABLE_SHARED([DEFAULT])
 # ----------------------------
 
 # _LT_ENABLE_SHARED([DEFAULT])
 # ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_SHARED],
 [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([shared],
 m4_define([_LT_ENABLE_SHARED],
 [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([shared],
@@ -172,14 +174,14 @@ AC_ARG_ENABLE([shared],
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
       for pkg in $enableval; do
-       IFS="$lt_save_ifs"
+       IFS=$lt_save_ifs
        if test "X$pkg" = "X$p"; then
          enable_shared=yes
        fi
       done
        if test "X$pkg" = "X$p"; then
          enable_shared=yes
        fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
       ;;
     esac],
     [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
@@ -211,9 +213,9 @@ dnl AC_DEFUN([AM_DISABLE_SHARED], [])
 
 # _LT_ENABLE_STATIC([DEFAULT])
 # ----------------------------
 
 # _LT_ENABLE_STATIC([DEFAULT])
 # ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_STATIC],
 [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([static],
 m4_define([_LT_ENABLE_STATIC],
 [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([static],
@@ -226,14 +228,14 @@ AC_ARG_ENABLE([static],
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
       for pkg in $enableval; do
-       IFS="$lt_save_ifs"
+       IFS=$lt_save_ifs
        if test "X$pkg" = "X$p"; then
          enable_static=yes
        fi
       done
        if test "X$pkg" = "X$p"; then
          enable_static=yes
        fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
       ;;
     esac],
     [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
@@ -265,9 +267,9 @@ dnl AC_DEFUN([AM_DISABLE_STATIC], [])
 
 # _LT_ENABLE_FAST_INSTALL([DEFAULT])
 # ----------------------------------
 
 # _LT_ENABLE_FAST_INSTALL([DEFAULT])
 # ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_FAST_INSTALL],
 [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([fast-install],
 m4_define([_LT_ENABLE_FAST_INSTALL],
 [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([fast-install],
@@ -280,14 +282,14 @@ AC_ARG_ENABLE([fast-install],
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
       for pkg in $enableval; do
-       IFS="$lt_save_ifs"
+       IFS=$lt_save_ifs
        if test "X$pkg" = "X$p"; then
          enable_fast_install=yes
        fi
       done
        if test "X$pkg" = "X$p"; then
          enable_fast_install=yes
        fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
       ;;
     esac],
     [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
@@ -304,14 +306,14 @@ AU_DEFUN([AC_ENABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
 [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
+the 'fast-install' option into LT_INIT's first parameter.])
 ])
 
 AU_DEFUN([AC_DISABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], [disable-fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
 ])
 
 AU_DEFUN([AC_DISABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], [disable-fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
+the 'disable-fast-install' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -319,11 +321,64 @@ dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
 dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
 
 
 dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
 
 
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'.  If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+  AC_MSG_CHECKING([which variant of shared library versioning to provide])
+  AC_ARG_WITH([aix-soname],
+    [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+      [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+    [case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname],
+    [AC_CACHE_VAL([lt_cv_with_aix_soname],
+      [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+    with_aix_soname=$lt_cv_with_aix_soname])
+  AC_MSG_RESULT([$with_aix_soname])
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+    [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
 # _LT_WITH_PIC([MODE])
 # --------------------
 # _LT_WITH_PIC([MODE])
 # --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
 # LT_INIT options.
 # LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+# MODE is either 'yes' or 'no'.  If omitted, it defaults to 'both'.
 m4_define([_LT_WITH_PIC],
 [AC_ARG_WITH([pic],
     [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
 m4_define([_LT_WITH_PIC],
 [AC_ARG_WITH([pic],
     [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
@@ -334,19 +389,17 @@ m4_define([_LT_WITH_PIC],
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for lt_pkg in $withval; do
       for lt_pkg in $withval; do
-       IFS="$lt_save_ifs"
+       IFS=$lt_save_ifs
        if test "X$lt_pkg" = "X$lt_p"; then
          pic_mode=yes
        fi
       done
        if test "X$lt_pkg" = "X$lt_p"; then
          pic_mode=yes
        fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
       ;;
     esac],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+    [pic_mode=m4_default([$1], [default])])
 
 _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
 ])# _LT_WITH_PIC
 
 _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
 ])# _LT_WITH_PIC
@@ -359,7 +412,7 @@ AU_DEFUN([AC_LIBTOOL_PICMODE],
 [_LT_SET_OPTION([LT_INIT], [pic-only])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
 [_LT_SET_OPTION([LT_INIT], [pic-only])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
+put the 'pic-only' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
 ])
 
 dnl aclocal-1.4 backwards compatibility:
index 9000a05..48bc934 100644 (file)
@@ -1,6 +1,7 @@
 # ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
 #
 # ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
 #
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Foundation, Inc.
 # Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
 # Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -33,7 +34,7 @@ m4_define([_lt_join],
 # ------------
 # Manipulate m4 lists.
 # These macros are necessary as long as will still need to support
 # ------------
 # Manipulate m4 lists.
 # These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
+# Autoconf-2.59, which quotes differently.
 m4_define([lt_car], [[$1]])
 m4_define([lt_cdr],
 [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
 m4_define([lt_car], [[$1]])
 m4_define([lt_cdr],
 [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
@@ -44,7 +45,7 @@ m4_define([lt_unquote], $1)
 
 # lt_append(MACRO-NAME, STRING, [SEPARATOR])
 # ------------------------------------------
 
 # lt_append(MACRO-NAME, STRING, [SEPARATOR])
 # ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
 # Note that neither SEPARATOR nor STRING are expanded; they are appended
 # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
 # No SEPARATOR is output if MACRO-NAME was previously undefined (different
 # Note that neither SEPARATOR nor STRING are expanded; they are appended
 # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
 # No SEPARATOR is output if MACRO-NAME was previously undefined (different
index 07a8602..fa04b52 100644 (file)
@@ -1,6 +1,6 @@
 # ltversion.m4 -- version numbers                      -*- Autoconf -*-
 #
 # ltversion.m4 -- version numbers                      -*- Autoconf -*-
 #
-#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
 #   Written by Scott James Remnant, 2004
 #
 # This file is free software; the Free Software Foundation gives
 #   Written by Scott James Remnant, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -9,15 +9,15 @@
 
 # @configure_input@
 
 
 # @configure_input@
 
-# serial 3337 ltversion.m4
+# serial 4179 ltversion.m4
 # This file is part of GNU Libtool
 
 # This file is part of GNU Libtool
 
-m4_define([LT_PACKAGE_VERSION], [2.4.2])
-m4_define([LT_PACKAGE_REVISION], [1.3337])
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
 
 AC_DEFUN([LTVERSION_VERSION],
 
 AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.2'
-macro_revision='1.3337'
+[macro_version='2.4.6'
+macro_revision='2.4.6'
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
index c573da9..c6b26f8 100644 (file)
@@ -1,6 +1,7 @@
 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
 #
 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+#   Foundation, Inc.
 #   Written by Scott James Remnant, 2004.
 #
 # This file is free software; the Free Software Foundation gives
 #   Written by Scott James Remnant, 2004.
 #
 # This file is free software; the Free Software Foundation gives
@@ -11,7 +12,7 @@
 
 # These exist entirely to fool aclocal when bootstrapping libtool.
 #
 
 # These exist entirely to fool aclocal when bootstrapping libtool.
 #
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
 # which have later been changed to m4_define as they aren't part of the
 # exported API, or moved to Autoconf or Automake where they belong.
 #
 # which have later been changed to m4_define as they aren't part of the
 # exported API, or moved to Autoconf or Automake where they belong.
 #
@@ -25,7 +26,7 @@
 # included after everything else.  This provides aclocal with the
 # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
 # because those macros already exist, or will be overwritten later.
 # included after everything else.  This provides aclocal with the
 # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
 # because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
 #
 # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
 # Yes, that means every name once taken will need to remain here until
 #
 # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
 # Yes, that means every name once taken will need to remain here until
diff --git a/missing b/missing
index db98974..f62bbae 100755 (executable)
--- a/missing
+++ b/missing
@@ -3,7 +3,7 @@
 
 scriptversion=2013-10-28.13; # UTC
 
 
 scriptversion=2013-10-28.13; # UTC
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 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
 # Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
diff --git a/replace-enum-strings.cmake b/replace-enum-strings.cmake
new file mode 100644 (file)
index 0000000..42fdbff
--- /dev/null
@@ -0,0 +1,21 @@
+# CMake script to replace items\r
+# in sources generated by glib-mkenums\r
+\r
+FILE(READ ${ENUM_INPUT_SRC} enum_in)\r
+\r
+STRING(REPLACE\r
+  "_t_get_type"\r
+  "_get_type"\r
+  enum_out_tmp\r
+  "${enum_in}"\r
+  )\r
+\r
+STRING(REPLACE\r
+  "_T ("\r
+  " ("\r
+  enum_out\r
+  "${enum_out_tmp}"\r
+  )\r
+\r
+FILE(WRITE ${ENUM_OUTPUT_SRC} "${enum_out}")\r
+FILE(REMOVE ${ENUM_INPUT_SRC})
\ No newline at end of file
index 0c077d9..afa104b 100644 (file)
@@ -1,5 +1,6 @@
 # Process this file with automake to produce Makefile.in
 
 # Process this file with automake to produce Makefile.in
 
+NULL =
 SUBDIRS =
 DIST_SUBDIRS =
 BUILT_SOURCES =
 SUBDIRS =
 DIST_SUBDIRS =
 BUILT_SOURCES =
@@ -8,12 +9,14 @@ CLEANFILES =
 DISTCLEANFILES =
 MAINTAINERCLEANFILES =
 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
 DISTCLEANFILES =
 MAINTAINERCLEANFILES =
 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
+TESTS =
+check_PROGRAMS =
 
 # The following warning options are useful for debugging: -Wpadded
 #AM_CXXFLAGS =
 
 # Convenience targets:
 
 # The following warning options are useful for debugging: -Wpadded
 #AM_CXXFLAGS =
 
 # Convenience targets:
-lib: $(BUILT_SOURCES) libharfbuzz.la
+lib: $(BUILT_SOURCES) libharfbuzz.la libharfbuzz-subset.la
 fuzzing: $(BUILT_SOURCES) libharfbuzz-fuzzing.la
 
 lib_LTLIBRARIES = libharfbuzz.la
 fuzzing: $(BUILT_SOURCES) libharfbuzz-fuzzing.la
 
 lib_LTLIBRARIES = libharfbuzz.la
@@ -27,7 +30,15 @@ HBDEPS =
 HBSOURCES =  $(HB_BASE_sources)
 HBSOURCES += $(HB_BASE_RAGEL_GENERATED_sources)
 HBHEADERS = $(HB_BASE_headers)
 HBSOURCES =  $(HB_BASE_sources)
 HBSOURCES += $(HB_BASE_RAGEL_GENERATED_sources)
 HBHEADERS = $(HB_BASE_headers)
-HBNODISTHEADERS = $(HB_NODIST_headers)
+
+if WITH_LIBSTDCXX
+HBNOLIBCXXCFLAGS =
+else
+# Make sure we don't link to libstdc++
+# No threadsafe statics in C++ as we do it ourselves
+HBCFLAGS += -fno-exceptions
+HBNOLIBCXXFLAGS = -fno-threadsafe-statics -fno-rtti
+endif
 
 if HAVE_OT
 HBSOURCES += $(HB_OT_sources)
 
 if HAVE_OT
 HBSOURCES += $(HB_OT_sources)
@@ -99,6 +110,9 @@ SUBDIRS += hb-ucdn
 HBCFLAGS += -I$(srcdir)/hb-ucdn
 HBLIBS   += hb-ucdn/libhb-ucdn.la
 HBSOURCES += $(HB_UCDN_sources)
 HBCFLAGS += -I$(srcdir)/hb-ucdn
 HBLIBS   += hb-ucdn/libhb-ucdn.la
 HBSOURCES += $(HB_UCDN_sources)
+hb-ucdn/libhb-ucdn.la: ucdn
+ucdn:
+       @$(MAKE) $(AM_MAKEFLAGS) -C hb-ucdn
 endif
 DIST_SUBDIRS += hb-ucdn
 
 endif
 DIST_SUBDIRS += hb-ucdn
 
@@ -110,40 +124,71 @@ HBLIBS += $(HBNONPCLIBS)
 if OS_WIN32
 export_symbols = -export-symbols harfbuzz.def
 harfbuzz_def_dependency = harfbuzz.def
 if OS_WIN32
 export_symbols = -export-symbols harfbuzz.def
 harfbuzz_def_dependency = harfbuzz.def
-libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS)
+export_symbols_subset = -export-symbols harfbuzz-subset.def
+harfbuzz_subset_def_dependency = harfbuzz-subset.def
+export_symbols_icu = -export-symbols harfbuzz-icu.def
+harfbuzz_icu_def_dependency = harfbuzz-icu.def
+export_symbols_gobject = -export-symbols harfbuzz-gobject.def
+harfbuzz_gobject_def_dependency = harfbuzz-gobject.def
+chosen_linker = $(CXXLINK)
+else
+if WITH_LIBSTDCXX
+chosen_linker = $(CXXLINK)
 else
 else
-# Use a C linker for GCC, not C++; Don't link to libstdc++
 if HAVE_GCC
 if HAVE_GCC
-libharfbuzz_la_LINK = $(LINK) $(libharfbuzz_la_LDFLAGS)
+# Use a C linker for GCC, not C++; Don't link to libstdc++
+chosen_linker = $(LINK)
 else
 else
-libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS)
+chosen_linker = $(CXXLINK)
 endif
 endif
 endif
 endif
+endif
+
+@CODE_COVERAGE_RULES@
 
 
-libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS) $(HBNODISTHEADERS)
-libharfbuzz_la_CPPFLAGS = $(HBCFLAGS)
-libharfbuzz_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) $(export_symbols) -no-undefined
+base_link_flags = $(AM_LDFLAGS) -lm -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+libharfbuzz_la_LINK = $(chosen_linker) $(libharfbuzz_la_LDFLAGS) $(CODE_COVERAGE_LDFLAGS)
+libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS)
+libharfbuzz_la_CPPFLAGS = $(HBCFLAGS) $(HBNOLIBCXXFLAGS) $(CODE_COVERAGE_CFLAGS)
+libharfbuzz_la_LDFLAGS = $(base_link_flags) $(export_symbols)
 libharfbuzz_la_LIBADD = $(HBLIBS)
 EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency)
 pkginclude_HEADERS = $(HBHEADERS)
 libharfbuzz_la_LIBADD = $(HBLIBS)
 EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency)
 pkginclude_HEADERS = $(HBHEADERS)
-nodist_pkginclude_HEADERS = $(HBNODISTHEADERS)
+nodist_pkginclude_HEADERS =
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = harfbuzz.pc
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = harfbuzz.pc
-EXTRA_DIST += harfbuzz.pc.in
-
-FUZZING_CPPFLAGS= \
+cmakedir = $(libdir)/cmake/harfbuzz
+cmake_DATA = harfbuzz-config.cmake
+EXTRA_DIST += harfbuzz.pc.in harfbuzz-config.cmake.in
+
+lib_LTLIBRARIES += libharfbuzz-subset.la
+libharfbuzz_subset_la_SOURCES = $(HB_SUBSET_sources)
+libharfbuzz_subset_la_CPPFLAGS = $(HBCFLAGS)
+libharfbuzz_subset_la_LDFLAGS = $(base_link_flags) $(export_symbols_subset)
+libharfbuzz_subset_la_LIBADD = libharfbuzz.la
+EXTRA_libharfbuzz_subset_la_DEPENDENCIES = $(harfbuzz_subset_def_dependency)
+pkginclude_HEADERS += $(HB_SUBSET_headers)
+pkgconfig_DATA += harfbuzz-subset.pc
+EXTRA_DIST += harfbuzz-subset.pc.in
+
+FUZZING_CPPFLAGS = \
        -DHB_NDEBUG \
        -DHB_MAX_NESTING_LEVEL=3 \
        -DHB_SANITIZE_MAX_EDITS=3 \
        -DHB_NDEBUG \
        -DHB_MAX_NESTING_LEVEL=3 \
        -DHB_SANITIZE_MAX_EDITS=3 \
-       -DHB_BUFFER_MAX_EXPANSION_FACTOR=3 \
+       -DHB_SANITIZE_MAX_OPS_FACTOR=3 \
+       -DHB_SANITIZE_MAX_OPS_MIN=128 \
+       -DHB_BUFFER_MAX_LEN_FACTOR=3 \
        -DHB_BUFFER_MAX_LEN_MIN=8 \
        -DHB_BUFFER_MAX_LEN_DEFAULT=128 \
        -DHB_BUFFER_MAX_LEN_MIN=8 \
        -DHB_BUFFER_MAX_LEN_DEFAULT=128 \
+       -DHB_BUFFER_MAX_OPS_FACTOR=8 \
+       -DHB_BUFFER_MAX_OPS_MIN=64 \
+       -DHB_BUFFER_MAX_OPS_DEFAULT=1024 \
        $(NULL)
 EXTRA_LTLIBRARIES = libharfbuzz-fuzzing.la
        $(NULL)
 EXTRA_LTLIBRARIES = libharfbuzz-fuzzing.la
-libharfbuzz_fuzzing_la_LINK = $(libharfbuzz_la_LINK)
+libharfbuzz_fuzzing_la_LINK = $(chosen_linker) $(libharfbuzz_fuzzing_la_LDFLAGS)
 libharfbuzz_fuzzing_la_SOURCES = $(libharfbuzz_la_SOURCES)
 libharfbuzz_fuzzing_la_SOURCES = $(libharfbuzz_la_SOURCES)
-libharfbuzz_fuzzing_la_CPPFLAGS = $(libharfbuzz_la_CPPFLAGS) $(FUZZING_CPPFLAGS)
-libharfbuzz_fuzzing_la_LDFLAGS = $(libharfbuzz_la_LDFLAGS)
+libharfbuzz_fuzzing_la_CPPFLAGS = $(HBCFLAGS) $(FUZZING_CPPFLAGS)
+libharfbuzz_fuzzing_la_LDFLAGS = $(AM_LDFLAGS)
 libharfbuzz_fuzzing_la_LIBADD = $(libharfbuzz_la_LIBADD)
 EXTRA_libharfbuzz_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_la_DEPENDENCIES)
 CLEANFILES += libharfbuzz-fuzzing.la
 libharfbuzz_fuzzing_la_LIBADD = $(libharfbuzz_la_LIBADD)
 EXTRA_libharfbuzz_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_la_DEPENDENCIES)
 CLEANFILES += libharfbuzz-fuzzing.la
@@ -157,9 +202,10 @@ HBHEADERS += $(HB_ICU_headers)
 else
 lib_LTLIBRARIES += libharfbuzz-icu.la
 libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources)
 else
 lib_LTLIBRARIES += libharfbuzz-icu.la
 libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources)
-libharfbuzz_icu_la_CPPFLAGS = $(ICU_CFLAGS)
-libharfbuzz_icu_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+libharfbuzz_icu_la_CPPFLAGS = $(HBCFLAGS) $(ICU_CFLAGS)
+libharfbuzz_icu_la_LDFLAGS = $(base_link_flags) $(export_symbols_icu)
 libharfbuzz_icu_la_LIBADD = $(ICU_LIBS) libharfbuzz.la
 libharfbuzz_icu_la_LIBADD = $(ICU_LIBS) libharfbuzz.la
+EXTRA_libharfbuzz_icu_la_DEPENDENCIES = $(harfbuzz_icu_def_dependency)
 pkginclude_HEADERS += $(HB_ICU_headers)
 pkgconfig_DATA += harfbuzz-icu.pc
 endif
 pkginclude_HEADERS += $(HB_ICU_headers)
 pkgconfig_DATA += harfbuzz-icu.pc
 endif
@@ -168,13 +214,15 @@ EXTRA_DIST += harfbuzz-icu.pc.in
 
 if HAVE_GOBJECT
 lib_LTLIBRARIES += libharfbuzz-gobject.la
 
 if HAVE_GOBJECT
 lib_LTLIBRARIES += libharfbuzz-gobject.la
-libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_sources)
-nodist_libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_ENUM_sources)
-libharfbuzz_gobject_la_CPPFLAGS = $(GOBJECT_CFLAGS)
-libharfbuzz_gobject_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+libharfbuzz_gobject_la_LINK = $(chosen_linker) $(libharfbuzz_gobject_la_LDFLAGS)
+libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_DIST_sources)
+nodist_libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_NODIST_sources)
+libharfbuzz_gobject_la_CPPFLAGS = $(HBCFLAGS) $(HBNOLIBCXXFLAGS) $(GOBJECT_CFLAGS)
+libharfbuzz_gobject_la_LDFLAGS = $(base_link_flags)
 libharfbuzz_gobject_la_LIBADD = $(GOBJECT_LIBS) libharfbuzz.la
 libharfbuzz_gobject_la_LIBADD = $(GOBJECT_LIBS) libharfbuzz.la
-pkginclude_HEADERS += $(HB_GOBJECT_headers)
-nodist_pkginclude_HEADERS += $(HB_GOBJECT_ENUM_headers)
+EXTRA_libharfbuzz_gobject_la_DEPENDENCIES = $(harfbuzz_gobject_def_dependency)
+pkginclude_HEADERS += $(HB_GOBJECT_DIST_headers)
+nodist_pkginclude_HEADERS += $(HB_GOBJECT_NODIST_headers)
 pkgconfig_DATA += harfbuzz-gobject.pc
 
 BUILT_SOURCES += \
 pkgconfig_DATA += harfbuzz-gobject.pc
 
 BUILT_SOURCES += \
@@ -214,23 +262,27 @@ EXTRA_DIST += \
 CLEANFILES += $(pkgconfig_DATA)
 
 
 CLEANFILES += $(pkgconfig_DATA)
 
 
-CLEANFILES += harfbuzz.def
+DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def
+if HAVE_GOBJECT
+DEF_FILES += harfbuzz-gobject.def
+endif
+check: $(DEF_FILES) # For check-symbols.sh
+CLEANFILES += $(DEF_FILES)
 harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
 harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
-       $(AM_V_GEN) (echo EXPORTS; \
-       (cat $^ || echo 'hb_ERROR ()' ) | \
-       $(EGREP) '^hb_.* \(' | \
-       sed -e 's/ (.*//' | \
-       LC_ALL=C sort; \
-       echo LIBRARY libharfbuzz-0.dll; \
-       ) >"$@"
-       @ ! grep -q hb_ERROR "$@" \
-       || ($(RM) "$@"; false)
+       $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
+harfbuzz-subset.def: $(HB_SUBSET_headers)
+       $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
+harfbuzz-icu.def: $(HB_ICU_headers)
+       $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
+harfbuzz-gobject.def: $(HB_GOBJECT_headers)
+       $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
 
 
 GENERATORS = \
        gen-arabic-table.py \
        gen-indic-table.py \
        gen-use-table.py \
 
 
 GENERATORS = \
        gen-arabic-table.py \
        gen-indic-table.py \
        gen-use-table.py \
+       gen-def.py \
        $(NULL)
 EXTRA_DIST += $(GENERATORS)
 
        $(NULL)
 EXTRA_DIST += $(GENERATORS)
 
@@ -261,7 +313,8 @@ EXTRA_DIST += \
        $(HB_BASE_RAGEL_sources) \
        $(HB_OT_RAGEL_sources) \
        $(NULL)
        $(HB_BASE_RAGEL_sources) \
        $(HB_OT_RAGEL_sources) \
        $(NULL)
-MAINTAINERCLEANFILES += $(RAGEL_GENERATED)
+# We decided to add ragel-generated files to git...
+#MAINTAINERCLEANFILES += $(RAGEL_GENERATED)
 $(srcdir)/%.hh: $(srcdir)/%.rl
        $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \
        || ($(RM) "$@"; false)
 $(srcdir)/%.hh: $(srcdir)/%.rl
        $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \
        || ($(RM) "$@"; false)
@@ -295,31 +348,56 @@ test_buffer_serialize_SOURCES = test-buffer-serialize.cc
 test_buffer_serialize_CPPFLAGS = $(HBCFLAGS)
 test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS)
 
 test_buffer_serialize_CPPFLAGS = $(HBCFLAGS)
 test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS)
 
-check: harfbuzz.def # For check-defs.sh
-
 dist_check_SCRIPTS = \
        check-c-linkage-decls.sh \
 dist_check_SCRIPTS = \
        check-c-linkage-decls.sh \
-       check-defs.sh \
+       check-externs.sh \
        check-header-guards.sh \
        check-includes.sh \
        check-header-guards.sh \
        check-includes.sh \
-       check-libstdc++.sh \
        check-static-inits.sh \
        check-symbols.sh \
        $(NULL)
        check-static-inits.sh \
        check-symbols.sh \
        $(NULL)
+TESTS += $(dist_check_SCRIPTS)
 
 
-check_PROGRAMS = \
-       test-ot-tag \
+if !WITH_LIBSTDCXX
+dist_check_SCRIPTS += \
+       check-libstdc++.sh \
        $(NULL)
        $(NULL)
+endif
+
+check_PROGRAMS += \
+       dump-indic-data \
+       dump-khmer-data \
+       dump-myanmar-data \
+       dump-use-data \
+       $(NULL)
+dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc
+dump_indic_data_CPPFLAGS = $(HBCFLAGS)
+dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_khmer_data_SOURCES = dump-khmer-data.cc hb-ot-shape-complex-indic-table.cc
+dump_khmer_data_CPPFLAGS = $(HBCFLAGS)
+dump_khmer_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_myanmar_data_SOURCES = dump-myanmar-data.cc hb-ot-shape-complex-indic-table.cc
+dump_myanmar_data_CPPFLAGS = $(HBCFLAGS)
+dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc
+dump_use_data_CPPFLAGS = $(HBCFLAGS)
+dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
+
+check_PROGRAMS += test-ot-tag test-unicode-ranges
+TESTS += test-ot-tag test-unicode-ranges
+
 test_ot_tag_SOURCES = hb-ot-tag.cc
 test_ot_tag_CPPFLAGS = $(HBCFLAGS) -DMAIN
 test_ot_tag_LDADD = libharfbuzz.la $(HBLIBS)
 
 test_ot_tag_SOURCES = hb-ot-tag.cc
 test_ot_tag_CPPFLAGS = $(HBCFLAGS) -DMAIN
 test_ot_tag_LDADD = libharfbuzz.la $(HBLIBS)
 
-TESTS = $(dist_check_SCRIPTS) $(check_PROGRAMS)
+test_unicode_ranges_SOURCES = test-unicode-ranges.cc
+test_unicode_ranges_LDADD = libharfbuzz.la $(HBLIBS)
+
 TESTS_ENVIRONMENT = \
        srcdir="$(srcdir)" \
        MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
        HBSOURCES="$(HBSOURCES)" \
 TESTS_ENVIRONMENT = \
        srcdir="$(srcdir)" \
        MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
        HBSOURCES="$(HBSOURCES)" \
-       HBHEADERS="$(HBHEADERS) $(HBNODISTHEADERS)" \
+       HBHEADERS="$(HBHEADERS)" \
        $(NULL)
 
 if HAVE_INTROSPECTION
        $(NULL)
 
 if HAVE_INTROSPECTION
@@ -349,12 +427,9 @@ HarfBuzz_0_0_gir_LIBS = \
        $(NULL)
 HarfBuzz_0_0_gir_FILES = \
        $(HBHEADERS) \
        $(NULL)
 HarfBuzz_0_0_gir_FILES = \
        $(HBHEADERS) \
-       $(HBNODISTHEADERS) \
        $(HBSOURCES) \
        $(HBSOURCES) \
-       $(HB_GOBJECT_ENUM_sources) \
-       $(HB_GOBJECT_ENUM_headers) \
        $(HB_GOBJECT_sources) \
        $(HB_GOBJECT_sources) \
-       $(HB_GOBJECT_STRUCTS_headers) \
+       $(HB_GOBJECT_headers) \
        $(NULL)
 
 girdir = $(datadir)/gir-1.0
        $(NULL)
 
 girdir = $(datadir)/gir-1.0
index baf7fa6..f2f5c6b 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # Process this file with automake to produce Makefile.in
 
 
 # Process this file with automake to produce Makefile.in
 
+# Base and default-included sources and headers
+
 
 
 
 VPATH = @srcdir@
 
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -83,92 +95,103 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(srcdir)/Makefile.sources $(srcdir)/Makefile.in \
-       $(srcdir)/Makefile.am $(srcdir)/hb-version.h.in \
-       $(dist_check_SCRIPTS) $(top_srcdir)/depcomp \
-       $(am__pkginclude_HEADERS_DIST) $(top_srcdir)/test-driver
-@HAVE_OT_TRUE@am__append_1 = $(HB_OT_sources) \
+TESTS = $(am__EXEEXT_3) test-ot-tag$(EXEEXT) \
+       test-unicode-ranges$(EXEEXT)
+check_PROGRAMS = dump-indic-data$(EXEEXT) dump-khmer-data$(EXEEXT) \
+       dump-myanmar-data$(EXEEXT) dump-use-data$(EXEEXT) \
+       $(am__EXEEXT_1) test-ot-tag$(EXEEXT) \
+       test-unicode-ranges$(EXEEXT)
+# Make sure we don't link to libstdc++
+# No threadsafe statics in C++ as we do it ourselves
+@WITH_LIBSTDCXX_FALSE@am__append_1 = -fno-exceptions
+@HAVE_OT_TRUE@am__append_2 = $(HB_OT_sources) \
 @HAVE_OT_TRUE@ $(HB_OT_RAGEL_GENERATED_sources)
 @HAVE_OT_TRUE@ $(HB_OT_RAGEL_GENERATED_sources)
-@HAVE_OT_TRUE@am__append_2 = $(HB_OT_headers)
-@HAVE_FALLBACK_TRUE@am__append_3 = $(HB_FALLBACK_sources)
-@HAVE_PTHREAD_TRUE@am__append_4 = $(PTHREAD_CFLAGS)
-@HAVE_PTHREAD_TRUE@am__append_5 = $(PTHREAD_LIBS)
-@HAVE_GLIB_TRUE@am__append_6 = $(GLIB_CFLAGS)
-@HAVE_GLIB_TRUE@am__append_7 = $(GLIB_LIBS)
-@HAVE_GLIB_TRUE@am__append_8 = $(GLIB_DEPS)
-@HAVE_GLIB_TRUE@am__append_9 = $(HB_GLIB_sources)
-@HAVE_GLIB_TRUE@am__append_10 = $(HB_GLIB_headers)
-@HAVE_FREETYPE_TRUE@am__append_11 = $(FREETYPE_CFLAGS)
-@HAVE_FREETYPE_TRUE@am__append_12 = $(FREETYPE_LIBS)
+@HAVE_OT_TRUE@am__append_3 = $(HB_OT_headers)
+@HAVE_FALLBACK_TRUE@am__append_4 = $(HB_FALLBACK_sources)
+@HAVE_PTHREAD_TRUE@am__append_5 = $(PTHREAD_CFLAGS)
+@HAVE_PTHREAD_TRUE@am__append_6 = $(PTHREAD_LIBS)
+@HAVE_GLIB_TRUE@am__append_7 = $(GLIB_CFLAGS)
+@HAVE_GLIB_TRUE@am__append_8 = $(GLIB_LIBS)
+@HAVE_GLIB_TRUE@am__append_9 = $(GLIB_DEPS)
+@HAVE_GLIB_TRUE@am__append_10 = $(HB_GLIB_sources)
+@HAVE_GLIB_TRUE@am__append_11 = $(HB_GLIB_headers)
+@HAVE_FREETYPE_TRUE@am__append_12 = $(FREETYPE_CFLAGS)
+@HAVE_FREETYPE_TRUE@am__append_13 = $(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)
 # 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_13 = $(HB_FT_sources)
-@HAVE_FREETYPE_TRUE@am__append_14 = $(HB_FT_headers)
-@HAVE_GRAPHITE2_TRUE@am__append_15 = $(GRAPHITE2_CFLAGS)
-@HAVE_GRAPHITE2_TRUE@am__append_16 = $(GRAPHITE2_LIBS)
-@HAVE_GRAPHITE2_TRUE@am__append_17 = $(GRAPHITE2_DEPS)
-@HAVE_GRAPHITE2_TRUE@am__append_18 = $(HB_GRAPHITE2_sources)
-@HAVE_GRAPHITE2_TRUE@am__append_19 = $(HB_GRAPHITE2_headers)
-@HAVE_UNISCRIBE_TRUE@am__append_20 = $(UNISCRIBE_CFLAGS)
-@HAVE_UNISCRIBE_TRUE@am__append_21 = $(UNISCRIBE_LIBS)
-@HAVE_UNISCRIBE_TRUE@am__append_22 = $(HB_UNISCRIBE_sources)
-@HAVE_UNISCRIBE_TRUE@am__append_23 = $(HB_UNISCRIBE_headers)
-@HAVE_DIRECTWRITE_TRUE@am__append_24 = $(DIRECTWRITE_CXXFLAGS)
-@HAVE_DIRECTWRITE_TRUE@am__append_25 = $(DIRECTWRITE_LIBS)
-@HAVE_DIRECTWRITE_TRUE@am__append_26 = $(HB_DIRECTWRITE_sources)
-@HAVE_DIRECTWRITE_TRUE@am__append_27 = $(HB_DIRECTWRITE_headers)
-@HAVE_CORETEXT_TRUE@am__append_28 = $(CORETEXT_CFLAGS)
-@HAVE_CORETEXT_TRUE@am__append_29 = $(CORETEXT_LIBS)
-@HAVE_CORETEXT_TRUE@am__append_30 = $(HB_CORETEXT_sources)
-@HAVE_CORETEXT_TRUE@am__append_31 = $(HB_CORETEXT_headers)
-@HAVE_UCDN_TRUE@am__append_32 = hb-ucdn
-@HAVE_UCDN_TRUE@am__append_33 = -I$(srcdir)/hb-ucdn
-@HAVE_UCDN_TRUE@am__append_34 = hb-ucdn/libhb-ucdn.la
-@HAVE_UCDN_TRUE@am__append_35 = $(HB_UCDN_sources)
-@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_36 = $(ICU_CFLAGS)
-@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_37 = $(ICU_LIBS)
-@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_38 = $(HB_ICU_sources)
-@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_39 = $(HB_ICU_headers)
-@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_40 = libharfbuzz-icu.la
-@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_41 = $(HB_ICU_headers)
-@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_42 = harfbuzz-icu.pc
-@HAVE_GOBJECT_TRUE@am__append_43 = libharfbuzz-gobject.la
-@HAVE_GOBJECT_TRUE@am__append_44 = $(HB_GOBJECT_headers)
-@HAVE_GOBJECT_TRUE@am__append_45 = $(HB_GOBJECT_ENUM_headers)
-@HAVE_GOBJECT_TRUE@am__append_46 = harfbuzz-gobject.pc
-@HAVE_GOBJECT_TRUE@am__append_47 = \
+@HAVE_FREETYPE_TRUE@am__append_14 = $(HB_FT_sources)
+@HAVE_FREETYPE_TRUE@am__append_15 = $(HB_FT_headers)
+@HAVE_GRAPHITE2_TRUE@am__append_16 = $(GRAPHITE2_CFLAGS)
+@HAVE_GRAPHITE2_TRUE@am__append_17 = $(GRAPHITE2_LIBS)
+@HAVE_GRAPHITE2_TRUE@am__append_18 = $(GRAPHITE2_DEPS)
+@HAVE_GRAPHITE2_TRUE@am__append_19 = $(HB_GRAPHITE2_sources)
+@HAVE_GRAPHITE2_TRUE@am__append_20 = $(HB_GRAPHITE2_headers)
+@HAVE_UNISCRIBE_TRUE@am__append_21 = $(UNISCRIBE_CFLAGS)
+@HAVE_UNISCRIBE_TRUE@am__append_22 = $(UNISCRIBE_LIBS)
+@HAVE_UNISCRIBE_TRUE@am__append_23 = $(HB_UNISCRIBE_sources)
+@HAVE_UNISCRIBE_TRUE@am__append_24 = $(HB_UNISCRIBE_headers)
+@HAVE_DIRECTWRITE_TRUE@am__append_25 = $(DIRECTWRITE_CXXFLAGS)
+@HAVE_DIRECTWRITE_TRUE@am__append_26 = $(DIRECTWRITE_LIBS)
+@HAVE_DIRECTWRITE_TRUE@am__append_27 = $(HB_DIRECTWRITE_sources)
+@HAVE_DIRECTWRITE_TRUE@am__append_28 = $(HB_DIRECTWRITE_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_UCDN_TRUE@am__append_33 = hb-ucdn
+@HAVE_UCDN_TRUE@am__append_34 = -I$(srcdir)/hb-ucdn
+@HAVE_UCDN_TRUE@am__append_35 = hb-ucdn/libhb-ucdn.la
+@HAVE_UCDN_TRUE@am__append_36 = $(HB_UCDN_sources)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_37 = $(ICU_CFLAGS)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_38 = $(ICU_LIBS)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_39 = $(HB_ICU_sources)
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_40 = $(HB_ICU_headers)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_41 = libharfbuzz-icu.la
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_42 = $(HB_ICU_headers)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_43 = harfbuzz-icu.pc
+@HAVE_GOBJECT_TRUE@am__append_44 = libharfbuzz-gobject.la
+@HAVE_GOBJECT_TRUE@am__append_45 = $(HB_GOBJECT_DIST_headers)
+@HAVE_GOBJECT_TRUE@am__append_46 = $(HB_GOBJECT_NODIST_headers)
+@HAVE_GOBJECT_TRUE@am__append_47 = harfbuzz-gobject.pc
+@HAVE_GOBJECT_TRUE@am__append_48 = \
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_sources) \
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_headers) \
 @HAVE_GOBJECT_TRUE@    $(NULL)
 
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_sources) \
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_headers) \
 @HAVE_GOBJECT_TRUE@    $(NULL)
 
-@HAVE_GOBJECT_TRUE@am__append_48 = \
+@HAVE_GOBJECT_TRUE@am__append_49 = \
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_sources) \
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_headers) \
 @HAVE_GOBJECT_TRUE@    $(NULL)
 
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_sources) \
 @HAVE_GOBJECT_TRUE@    $(HB_GOBJECT_ENUM_headers) \
 @HAVE_GOBJECT_TRUE@    $(NULL)
 
+@HAVE_GOBJECT_TRUE@am__append_50 = harfbuzz-gobject.def
 noinst_PROGRAMS = main$(EXEEXT) test$(EXEEXT) \
        test-buffer-serialize$(EXEEXT) test-size-params$(EXEEXT) \
        test-would-substitute$(EXEEXT) $(am__EXEEXT_1)
 bin_PROGRAMS =
 noinst_PROGRAMS = main$(EXEEXT) test$(EXEEXT) \
        test-buffer-serialize$(EXEEXT) test-size-params$(EXEEXT) \
        test-would-substitute$(EXEEXT) $(am__EXEEXT_1)
 bin_PROGRAMS =
-check_PROGRAMS = test-ot-tag$(EXEEXT) $(am__EXEEXT_1)
-TESTS = $(am__EXEEXT_2) $(check_PROGRAMS)
-@HAVE_INTROSPECTION_TRUE@am__append_49 = $(gir_DATA) $(typelib_DATA)
+@WITH_LIBSTDCXX_FALSE@am__append_51 = \
+@WITH_LIBSTDCXX_FALSE@ check-libstdc++.sh \
+@WITH_LIBSTDCXX_FALSE@ $(NULL)
+
+@HAVE_INTROSPECTION_TRUE@am__append_52 = $(gir_DATA) $(typelib_DATA)
 subdir = src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 subdir = src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-       $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_check_SCRIPTS_DIST) \
+       $(am__pkginclude_HEADERS_DIST) $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = hb-version.h
+CONFIG_CLEAN_FILES = hb-version.h harfbuzz-config.cmake
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
@@ -198,9 +221,9 @@ am__uninstall_files_from_dir = { \
          $(am__cd) "$$dir" && rm -f $$files; }; \
   }
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
          $(am__cd) "$$dir" && rm -f $$files; }; \
   }
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
-       "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" \
-       "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(pkgincludedir)" \
-       "$(DESTDIR)$(pkgincludedir)"
+       "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(girdir)" \
+       "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibdir)" \
+       "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 am__DEPENDENCIES_1 =
 @HAVE_GLIB_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
 LTLIBRARIES = $(lib_LTLIBRARIES)
 am__DEPENDENCIES_1 =
 @HAVE_GLIB_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
@@ -215,31 +238,40 @@ am__DEPENDENCIES_9 = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_6) \
 @HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__DEPENDENCIES_10 =  \
 @HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__DEPENDENCIES_1)
 am__DEPENDENCIES_11 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) \
 @HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__DEPENDENCIES_10 =  \
 @HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__DEPENDENCIES_1)
 am__DEPENDENCIES_11 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_4) $(am__append_34) $(am__DEPENDENCIES_9) \
+       $(am__DEPENDENCIES_4) $(am__append_35) $(am__DEPENDENCIES_9) \
        $(am__DEPENDENCIES_10)
 am__DEPENDENCIES_12 = $(am__DEPENDENCIES_11)
 libharfbuzz_fuzzing_la_DEPENDENCIES = $(am__DEPENDENCIES_12)
 am__libharfbuzz_fuzzing_la_SOURCES_DIST = hb-atomic-private.hh \
        hb-blob.cc hb-buffer-private.hh hb-buffer-serialize.cc \
        $(am__DEPENDENCIES_10)
 am__DEPENDENCIES_12 = $(am__DEPENDENCIES_11)
 libharfbuzz_fuzzing_la_DEPENDENCIES = $(am__DEPENDENCIES_12)
 am__libharfbuzz_fuzzing_la_SOURCES_DIST = hb-atomic-private.hh \
        hb-blob.cc hb-buffer-private.hh hb-buffer-serialize.cc \
-       hb-buffer.cc hb-cache-private.hh hb-common.cc \
+       hb-buffer.cc hb-common.cc hb-debug.hh hb-dsalgs.hh \
        hb-face-private.hh hb-face.cc hb-font-private.hh hb-font.cc \
        hb-mutex-private.hh hb-object-private.hh \
        hb-open-file-private.hh hb-open-type-private.hh \
        hb-face-private.hh hb-face.cc hb-font-private.hh hb-font.cc \
        hb-mutex-private.hh hb-object-private.hh \
        hb-open-file-private.hh hb-open-type-private.hh \
-       hb-ot-cbdt-table.hh hb-ot-cmap-table.hh hb-ot-glyf-table.hh \
-       hb-ot-head-table.hh hb-ot-hhea-table.hh hb-ot-hmtx-table.hh \
+       hb-ot-color-cbdt-table.hh hb-ot-cmap-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-maxp-table.hh hb-ot-name-table.hh hb-ot-os2-table.hh \
        hb-ot-maxp-table.hh hb-ot-name-table.hh hb-ot-os2-table.hh \
+       hb-ot-os2-unicode-ranges.hh hb-ot-post-macroman.hh \
        hb-ot-post-table.hh hb-ot-tag.cc hb-private.hh \
        hb-ot-post-table.hh hb-ot-tag.cc hb-private.hh \
-       hb-set-private.hh hb-set.cc hb-shape.cc \
-       hb-shape-plan-private.hh hb-shape-plan.cc hb-shaper-list.hh \
-       hb-shaper-impl-private.hh hb-shaper-private.hh hb-shaper.cc \
+       hb-set-digest-private.hh hb-set-private.hh hb-set.cc \
+       hb-shape.cc hb-shape-plan-private.hh hb-shape-plan.cc \
+       hb-shaper-list.hh hb-shaper-impl-private.hh \
+       hb-shaper-private.hh hb-shaper.cc hb-string-array.hh \
        hb-unicode-private.hh hb-unicode.cc hb-utf-private.hh \
        hb-warning.cc hb-buffer-deserialize-json.hh \
        hb-unicode-private.hh hb-unicode.cc hb-utf-private.hh \
        hb-warning.cc hb-buffer-deserialize-json.hh \
-       hb-buffer-deserialize-text.hh hb-ot-font.cc hb-ot-layout.cc \
+       hb-buffer-deserialize-text.hh hb-aat-layout.cc \
+       hb-aat-layout-common-private.hh hb-aat-layout-ankr-table.hh \
+       hb-aat-layout-kerx-table.hh hb-aat-layout-morx-table.hh \
+       hb-aat-layout-trak-table.hh hb-aat-layout-private.hh \
+       hb-ot-font.cc hb-ot-layout.cc hb-ot-layout-base-table.hh \
        hb-ot-layout-common-private.hh hb-ot-layout-gdef-table.hh \
        hb-ot-layout-gpos-table.hh hb-ot-layout-gsubgpos-private.hh \
        hb-ot-layout-gsub-table.hh hb-ot-layout-jstf-table.hh \
        hb-ot-layout-common-private.hh hb-ot-layout-gdef-table.hh \
        hb-ot-layout-gpos-table.hh hb-ot-layout-gsubgpos-private.hh \
        hb-ot-layout-gsub-table.hh hb-ot-layout-jstf-table.hh \
-       hb-ot-layout-private.hh hb-ot-map.cc hb-ot-map-private.hh \
-       hb-ot-math.cc hb-ot-math-table.hh hb-ot-shape.cc \
+       hb-ot-layout-private.hh hb-ot-color.cc \
+       hb-ot-color-colr-table.hh hb-ot-color-cpal-table.hh \
+       hb-ot-map.cc hb-ot-map-private.hh hb-ot-math.cc \
+       hb-ot-math-table.hh hb-ot-shape.cc \
        hb-ot-shape-complex-arabic.cc \
        hb-ot-shape-complex-arabic-fallback.hh \
        hb-ot-shape-complex-arabic-private.hh \
        hb-ot-shape-complex-arabic.cc \
        hb-ot-shape-complex-arabic-fallback.hh \
        hb-ot-shape-complex-arabic-private.hh \
@@ -249,6 +281,9 @@ am__libharfbuzz_fuzzing_la_SOURCES_DIST = hb-atomic-private.hh \
        hb-ot-shape-complex-hebrew.cc hb-ot-shape-complex-indic.cc \
        hb-ot-shape-complex-indic-private.hh \
        hb-ot-shape-complex-indic-table.cc \
        hb-ot-shape-complex-hebrew.cc hb-ot-shape-complex-indic.cc \
        hb-ot-shape-complex-indic-private.hh \
        hb-ot-shape-complex-indic-table.cc \
+       hb-ot-shape-complex-khmer-private.hh \
+       hb-ot-shape-complex-khmer.cc \
+       hb-ot-shape-complex-myanmar-private.hh \
        hb-ot-shape-complex-myanmar.cc hb-ot-shape-complex-thai.cc \
        hb-ot-shape-complex-tibetan.cc hb-ot-shape-complex-use.cc \
        hb-ot-shape-complex-use-private.hh \
        hb-ot-shape-complex-myanmar.cc hb-ot-shape-complex-thai.cc \
        hb-ot-shape-complex-tibetan.cc hb-ot-shape-complex-use.cc \
        hb-ot-shape-complex-use-private.hh \
@@ -259,16 +294,17 @@ am__libharfbuzz_fuzzing_la_SOURCES_DIST = hb-atomic-private.hh \
        hb-ot-shape-private.hh hb-ot-var.cc hb-ot-var-avar-table.hh \
        hb-ot-var-fvar-table.hh hb-ot-var-hvar-table.hh \
        hb-ot-var-mvar-table.hh hb-ot-shape-complex-indic-machine.hh \
        hb-ot-shape-private.hh hb-ot-var.cc hb-ot-var-avar-table.hh \
        hb-ot-var-fvar-table.hh hb-ot-var-hvar-table.hh \
        hb-ot-var-mvar-table.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-fallback-shape.cc \
        hb-glib.cc hb-ft.cc hb-graphite2.cc hb-uniscribe.cc \
        hb-directwrite.cc hb-coretext.cc hb-ucdn.cc hb-icu.cc hb.h \
        hb-blob.h hb-buffer.h hb-common.h hb-deprecated.h hb-face.h \
        hb-font.h hb-set.h hb-shape.h hb-shape-plan.h hb-unicode.h \
        hb-ot-shape-complex-myanmar-machine.hh \
        hb-ot-shape-complex-use-machine.hh hb-fallback-shape.cc \
        hb-glib.cc hb-ft.cc hb-graphite2.cc hb-uniscribe.cc \
        hb-directwrite.cc hb-coretext.cc hb-ucdn.cc hb-icu.cc hb.h \
        hb-blob.h hb-buffer.h hb-common.h hb-deprecated.h hb-face.h \
        hb-font.h hb-set.h hb-shape.h hb-shape-plan.h hb-unicode.h \
-       hb-ot.h hb-ot-font.h hb-ot-layout.h hb-ot-math.h hb-ot-shape.h \
-       hb-ot-tag.h hb-ot-var.h hb-glib.h hb-ft.h hb-graphite2.h \
-       hb-uniscribe.h hb-directwrite.h hb-coretext.h hb-icu.h \
-       hb-version.h
+       hb-version.h hb-ot.h hb-ot-font.h hb-ot-layout.h hb-ot-math.h \
+       hb-ot-shape.h hb-ot-tag.h hb-ot-var.h hb-glib.h hb-ft.h \
+       hb-graphite2.h hb-uniscribe.h hb-directwrite.h hb-coretext.h \
+       hb-icu.h
 am__objects_1 =
 am__objects_2 = libharfbuzz_fuzzing_la-hb-blob.lo \
        libharfbuzz_fuzzing_la-hb-buffer-serialize.lo \
 am__objects_1 =
 am__objects_2 = libharfbuzz_fuzzing_la-hb-blob.lo \
        libharfbuzz_fuzzing_la-hb-buffer-serialize.lo \
@@ -284,8 +320,10 @@ am__objects_2 = libharfbuzz_fuzzing_la-hb-blob.lo \
        libharfbuzz_fuzzing_la-hb-unicode.lo \
        libharfbuzz_fuzzing_la-hb-warning.lo $(am__objects_1)
 am__objects_3 = $(am__objects_1)
        libharfbuzz_fuzzing_la-hb-unicode.lo \
        libharfbuzz_fuzzing_la-hb-warning.lo $(am__objects_1)
 am__objects_3 = $(am__objects_1)
-am__objects_4 = libharfbuzz_fuzzing_la-hb-ot-font.lo \
+am__objects_4 = libharfbuzz_fuzzing_la-hb-aat-layout.lo \
+       libharfbuzz_fuzzing_la-hb-ot-font.lo \
        libharfbuzz_fuzzing_la-hb-ot-layout.lo \
        libharfbuzz_fuzzing_la-hb-ot-layout.lo \
+       libharfbuzz_fuzzing_la-hb-ot-color.lo \
        libharfbuzz_fuzzing_la-hb-ot-map.lo \
        libharfbuzz_fuzzing_la-hb-ot-math.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape.lo \
        libharfbuzz_fuzzing_la-hb-ot-map.lo \
        libharfbuzz_fuzzing_la-hb-ot-math.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape.lo \
@@ -295,6 +333,7 @@ am__objects_4 = libharfbuzz_fuzzing_la-hb-ot-font.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo \
+       libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.lo \
@@ -304,7 +343,8 @@ am__objects_4 = libharfbuzz_fuzzing_la-hb-ot-font.lo \
        libharfbuzz_fuzzing_la-hb-ot-shape-fallback.lo \
        libharfbuzz_fuzzing_la-hb-ot-var.lo $(am__objects_1)
 @HAVE_OT_TRUE@am__objects_5 = $(am__objects_4) $(am__objects_3)
        libharfbuzz_fuzzing_la-hb-ot-shape-fallback.lo \
        libharfbuzz_fuzzing_la-hb-ot-var.lo $(am__objects_1)
 @HAVE_OT_TRUE@am__objects_5 = $(am__objects_4) $(am__objects_3)
-am__objects_6 = libharfbuzz_fuzzing_la-hb-fallback-shape.lo
+am__objects_6 = libharfbuzz_fuzzing_la-hb-fallback-shape.lo \
+       $(am__objects_1)
 @HAVE_FALLBACK_TRUE@am__objects_7 = $(am__objects_6)
 am__objects_8 = libharfbuzz_fuzzing_la-hb-glib.lo
 @HAVE_GLIB_TRUE@am__objects_9 = $(am__objects_8)
 @HAVE_FALLBACK_TRUE@am__objects_7 = $(am__objects_6)
 am__objects_8 = libharfbuzz_fuzzing_la-hb-glib.lo
 @HAVE_GLIB_TRUE@am__objects_9 = $(am__objects_8)
@@ -339,29 +379,21 @@ am__objects_24 = $(am__objects_2) $(am__objects_3) $(am__objects_5) \
 am__objects_33 = $(am__objects_3) $(am__objects_25) $(am__objects_26) \
        $(am__objects_27) $(am__objects_28) $(am__objects_29) \
        $(am__objects_30) $(am__objects_31) $(am__objects_32)
 am__objects_33 = $(am__objects_3) $(am__objects_25) $(am__objects_26) \
        $(am__objects_27) $(am__objects_28) $(am__objects_29) \
        $(am__objects_30) $(am__objects_31) $(am__objects_32)
-am__objects_34 = $(am__objects_3)
-am__objects_35 = $(am__objects_24) $(am__objects_33) $(am__objects_34)
-am_libharfbuzz_fuzzing_la_OBJECTS = $(am__objects_35)
+am__objects_34 = $(am__objects_24) $(am__objects_33)
+am_libharfbuzz_fuzzing_la_OBJECTS = $(am__objects_34)
 libharfbuzz_fuzzing_la_OBJECTS = $(am_libharfbuzz_fuzzing_la_OBJECTS)
 @HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_DEPENDENCIES =  \
 @HAVE_GOBJECT_TRUE@    $(am__DEPENDENCIES_1) libharfbuzz.la
 am__libharfbuzz_gobject_la_SOURCES_DIST = hb-gobject-structs.cc
 libharfbuzz_fuzzing_la_OBJECTS = $(am_libharfbuzz_fuzzing_la_OBJECTS)
 @HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_DEPENDENCIES =  \
 @HAVE_GOBJECT_TRUE@    $(am__DEPENDENCIES_1) libharfbuzz.la
 am__libharfbuzz_gobject_la_SOURCES_DIST = hb-gobject-structs.cc
-am__objects_36 = libharfbuzz_gobject_la-hb-gobject-structs.lo
+am__objects_35 = libharfbuzz_gobject_la-hb-gobject-structs.lo
 @HAVE_GOBJECT_TRUE@am_libharfbuzz_gobject_la_OBJECTS =  \
 @HAVE_GOBJECT_TRUE@am_libharfbuzz_gobject_la_OBJECTS =  \
-@HAVE_GOBJECT_TRUE@    $(am__objects_36)
-am__objects_37 = libharfbuzz_gobject_la-hb-gobject-enums.lo
+@HAVE_GOBJECT_TRUE@    $(am__objects_35)
+am__objects_36 = libharfbuzz_gobject_la-hb-gobject-enums.lo
+am__objects_37 = $(am__objects_36)
 @HAVE_GOBJECT_TRUE@nodist_libharfbuzz_gobject_la_OBJECTS =  \
 @HAVE_GOBJECT_TRUE@    $(am__objects_37)
 libharfbuzz_gobject_la_OBJECTS = $(am_libharfbuzz_gobject_la_OBJECTS) \
        $(nodist_libharfbuzz_gobject_la_OBJECTS)
 @HAVE_GOBJECT_TRUE@nodist_libharfbuzz_gobject_la_OBJECTS =  \
 @HAVE_GOBJECT_TRUE@    $(am__objects_37)
 libharfbuzz_gobject_la_OBJECTS = $(am_libharfbuzz_gobject_la_OBJECTS) \
        $(nodist_libharfbuzz_gobject_la_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 = 
-libharfbuzz_gobject_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
-       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
-       $(AM_CXXFLAGS) $(CXXFLAGS) $(libharfbuzz_gobject_la_LDFLAGS) \
-       $(LDFLAGS) -o $@
 @HAVE_GOBJECT_TRUE@am_libharfbuzz_gobject_la_rpath = -rpath $(libdir)
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_DEPENDENCIES =  \
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@        $(am__DEPENDENCIES_1) \
 @HAVE_GOBJECT_TRUE@am_libharfbuzz_gobject_la_rpath = -rpath $(libdir)
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_DEPENDENCIES =  \
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@        $(am__DEPENDENCIES_1) \
@@ -371,32 +403,55 @@ am__objects_38 = libharfbuzz_icu_la-hb-icu.lo
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am_libharfbuzz_icu_la_OBJECTS =  \
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@        $(am__objects_38)
 libharfbuzz_icu_la_OBJECTS = $(am_libharfbuzz_icu_la_OBJECTS)
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am_libharfbuzz_icu_la_OBJECTS =  \
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@        $(am__objects_38)
 libharfbuzz_icu_la_OBJECTS = $(am_libharfbuzz_icu_la_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 = 
 libharfbuzz_icu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
        $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
        $(AM_CXXFLAGS) $(CXXFLAGS) $(libharfbuzz_icu_la_LDFLAGS) \
        $(LDFLAGS) -o $@
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am_libharfbuzz_icu_la_rpath =  \
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@        -rpath $(libdir)
 libharfbuzz_icu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
        $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
        $(AM_CXXFLAGS) $(CXXFLAGS) $(libharfbuzz_icu_la_LDFLAGS) \
        $(LDFLAGS) -o $@
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am_libharfbuzz_icu_la_rpath =  \
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@        -rpath $(libdir)
+libharfbuzz_subset_la_DEPENDENCIES = libharfbuzz.la
+am__objects_39 = libharfbuzz_subset_la-hb-subset.lo \
+       libharfbuzz_subset_la-hb-subset-glyf.lo \
+       libharfbuzz_subset_la-hb-subset-input.lo \
+       libharfbuzz_subset_la-hb-subset-plan.lo $(am__objects_1)
+am_libharfbuzz_subset_la_OBJECTS = $(am__objects_39)
+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 $@
 libharfbuzz_la_DEPENDENCIES = $(am__DEPENDENCIES_11)
 am__libharfbuzz_la_SOURCES_DIST = hb-atomic-private.hh hb-blob.cc \
        hb-buffer-private.hh hb-buffer-serialize.cc hb-buffer.cc \
 libharfbuzz_la_DEPENDENCIES = $(am__DEPENDENCIES_11)
 am__libharfbuzz_la_SOURCES_DIST = hb-atomic-private.hh hb-blob.cc \
        hb-buffer-private.hh hb-buffer-serialize.cc hb-buffer.cc \
-       hb-cache-private.hh hb-common.cc hb-face-private.hh hb-face.cc \
-       hb-font-private.hh hb-font.cc hb-mutex-private.hh \
+       hb-common.cc hb-debug.hh hb-dsalgs.hh hb-face-private.hh \
+       hb-face.cc hb-font-private.hh hb-font.cc hb-mutex-private.hh \
        hb-object-private.hh hb-open-file-private.hh \
        hb-object-private.hh hb-open-file-private.hh \
-       hb-open-type-private.hh hb-ot-cbdt-table.hh \
-       hb-ot-cmap-table.hh hb-ot-glyf-table.hh hb-ot-head-table.hh \
-       hb-ot-hhea-table.hh hb-ot-hmtx-table.hh hb-ot-maxp-table.hh \
-       hb-ot-name-table.hh hb-ot-os2-table.hh hb-ot-post-table.hh \
-       hb-ot-tag.cc hb-private.hh hb-set-private.hh hb-set.cc \
-       hb-shape.cc hb-shape-plan-private.hh hb-shape-plan.cc \
-       hb-shaper-list.hh hb-shaper-impl-private.hh \
-       hb-shaper-private.hh hb-shaper.cc hb-unicode-private.hh \
-       hb-unicode.cc hb-utf-private.hh hb-warning.cc \
-       hb-buffer-deserialize-json.hh hb-buffer-deserialize-text.hh \
-       hb-ot-font.cc hb-ot-layout.cc hb-ot-layout-common-private.hh \
-       hb-ot-layout-gdef-table.hh hb-ot-layout-gpos-table.hh \
-       hb-ot-layout-gsubgpos-private.hh hb-ot-layout-gsub-table.hh \
-       hb-ot-layout-jstf-table.hh hb-ot-layout-private.hh \
+       hb-open-type-private.hh hb-ot-color-cbdt-table.hh \
+       hb-ot-cmap-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-maxp-table.hh hb-ot-name-table.hh \
+       hb-ot-os2-table.hh hb-ot-os2-unicode-ranges.hh \
+       hb-ot-post-macroman.hh hb-ot-post-table.hh hb-ot-tag.cc \
+       hb-private.hh hb-set-digest-private.hh hb-set-private.hh \
+       hb-set.cc hb-shape.cc hb-shape-plan-private.hh \
+       hb-shape-plan.cc hb-shaper-list.hh hb-shaper-impl-private.hh \
+       hb-shaper-private.hh hb-shaper.cc hb-string-array.hh \
+       hb-unicode-private.hh hb-unicode.cc hb-utf-private.hh \
+       hb-warning.cc hb-buffer-deserialize-json.hh \
+       hb-buffer-deserialize-text.hh hb-aat-layout.cc \
+       hb-aat-layout-common-private.hh hb-aat-layout-ankr-table.hh \
+       hb-aat-layout-kerx-table.hh hb-aat-layout-morx-table.hh \
+       hb-aat-layout-trak-table.hh hb-aat-layout-private.hh \
+       hb-ot-font.cc hb-ot-layout.cc hb-ot-layout-base-table.hh \
+       hb-ot-layout-common-private.hh hb-ot-layout-gdef-table.hh \
+       hb-ot-layout-gpos-table.hh hb-ot-layout-gsubgpos-private.hh \
+       hb-ot-layout-gsub-table.hh hb-ot-layout-jstf-table.hh \
+       hb-ot-layout-private.hh hb-ot-color.cc \
+       hb-ot-color-colr-table.hh hb-ot-color-cpal-table.hh \
        hb-ot-map.cc hb-ot-map-private.hh hb-ot-math.cc \
        hb-ot-math-table.hh hb-ot-shape.cc \
        hb-ot-shape-complex-arabic.cc \
        hb-ot-map.cc hb-ot-map-private.hh hb-ot-math.cc \
        hb-ot-math-table.hh hb-ot-shape.cc \
        hb-ot-shape-complex-arabic.cc \
@@ -408,6 +463,9 @@ am__libharfbuzz_la_SOURCES_DIST = hb-atomic-private.hh hb-blob.cc \
        hb-ot-shape-complex-hebrew.cc hb-ot-shape-complex-indic.cc \
        hb-ot-shape-complex-indic-private.hh \
        hb-ot-shape-complex-indic-table.cc \
        hb-ot-shape-complex-hebrew.cc hb-ot-shape-complex-indic.cc \
        hb-ot-shape-complex-indic-private.hh \
        hb-ot-shape-complex-indic-table.cc \
+       hb-ot-shape-complex-khmer-private.hh \
+       hb-ot-shape-complex-khmer.cc \
+       hb-ot-shape-complex-myanmar-private.hh \
        hb-ot-shape-complex-myanmar.cc hb-ot-shape-complex-thai.cc \
        hb-ot-shape-complex-tibetan.cc hb-ot-shape-complex-use.cc \
        hb-ot-shape-complex-use-private.hh \
        hb-ot-shape-complex-myanmar.cc hb-ot-shape-complex-thai.cc \
        hb-ot-shape-complex-tibetan.cc hb-ot-shape-complex-use.cc \
        hb-ot-shape-complex-use-private.hh \
@@ -418,17 +476,18 @@ am__libharfbuzz_la_SOURCES_DIST = hb-atomic-private.hh hb-blob.cc \
        hb-ot-shape-private.hh hb-ot-var.cc hb-ot-var-avar-table.hh \
        hb-ot-var-fvar-table.hh hb-ot-var-hvar-table.hh \
        hb-ot-var-mvar-table.hh hb-ot-shape-complex-indic-machine.hh \
        hb-ot-shape-private.hh hb-ot-var.cc hb-ot-var-avar-table.hh \
        hb-ot-var-fvar-table.hh hb-ot-var-hvar-table.hh \
        hb-ot-var-mvar-table.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-fallback-shape.cc \
        hb-glib.cc hb-ft.cc hb-graphite2.cc hb-uniscribe.cc \
        hb-directwrite.cc hb-coretext.cc hb-ucdn.cc hb-icu.cc hb.h \
        hb-blob.h hb-buffer.h hb-common.h hb-deprecated.h hb-face.h \
        hb-font.h hb-set.h hb-shape.h hb-shape-plan.h hb-unicode.h \
        hb-ot-shape-complex-myanmar-machine.hh \
        hb-ot-shape-complex-use-machine.hh hb-fallback-shape.cc \
        hb-glib.cc hb-ft.cc hb-graphite2.cc hb-uniscribe.cc \
        hb-directwrite.cc hb-coretext.cc hb-ucdn.cc hb-icu.cc hb.h \
        hb-blob.h hb-buffer.h hb-common.h hb-deprecated.h hb-face.h \
        hb-font.h hb-set.h hb-shape.h hb-shape-plan.h hb-unicode.h \
-       hb-ot.h hb-ot-font.h hb-ot-layout.h hb-ot-math.h hb-ot-shape.h \
-       hb-ot-tag.h hb-ot-var.h hb-glib.h hb-ft.h hb-graphite2.h \
-       hb-uniscribe.h hb-directwrite.h hb-coretext.h hb-icu.h \
-       hb-version.h
-am__objects_39 = libharfbuzz_la-hb-blob.lo \
+       hb-version.h hb-ot.h hb-ot-font.h hb-ot-layout.h hb-ot-math.h \
+       hb-ot-shape.h hb-ot-tag.h hb-ot-var.h hb-glib.h hb-ft.h \
+       hb-graphite2.h hb-uniscribe.h hb-directwrite.h hb-coretext.h \
+       hb-icu.h
+am__objects_40 = 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-font.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-font.lo \
@@ -436,8 +495,9 @@ am__objects_39 = libharfbuzz_la-hb-blob.lo \
        libharfbuzz_la-hb-shape.lo libharfbuzz_la-hb-shape-plan.lo \
        libharfbuzz_la-hb-shaper.lo libharfbuzz_la-hb-unicode.lo \
        libharfbuzz_la-hb-warning.lo $(am__objects_1)
        libharfbuzz_la-hb-shape.lo libharfbuzz_la-hb-shape-plan.lo \
        libharfbuzz_la-hb-shaper.lo libharfbuzz_la-hb-unicode.lo \
        libharfbuzz_la-hb-warning.lo $(am__objects_1)
-am__objects_40 = libharfbuzz_la-hb-ot-font.lo \
-       libharfbuzz_la-hb-ot-layout.lo libharfbuzz_la-hb-ot-map.lo \
+am__objects_41 = libharfbuzz_la-hb-aat-layout.lo \
+       libharfbuzz_la-hb-ot-font.lo libharfbuzz_la-hb-ot-layout.lo \
+       libharfbuzz_la-hb-ot-color.lo libharfbuzz_la-hb-ot-map.lo \
        libharfbuzz_la-hb-ot-math.lo libharfbuzz_la-hb-ot-shape.lo \
        libharfbuzz_la-hb-ot-shape-complex-arabic.lo \
        libharfbuzz_la-hb-ot-shape-complex-default.lo \
        libharfbuzz_la-hb-ot-math.lo libharfbuzz_la-hb-ot-shape.lo \
        libharfbuzz_la-hb-ot-shape-complex-arabic.lo \
        libharfbuzz_la-hb-ot-shape-complex-default.lo \
@@ -445,6 +505,7 @@ am__objects_40 = libharfbuzz_la-hb-ot-font.lo \
        libharfbuzz_la-hb-ot-shape-complex-hebrew.lo \
        libharfbuzz_la-hb-ot-shape-complex-indic.lo \
        libharfbuzz_la-hb-ot-shape-complex-indic-table.lo \
        libharfbuzz_la-hb-ot-shape-complex-hebrew.lo \
        libharfbuzz_la-hb-ot-shape-complex-indic.lo \
        libharfbuzz_la-hb-ot-shape-complex-indic-table.lo \
+       libharfbuzz_la-hb-ot-shape-complex-khmer.lo \
        libharfbuzz_la-hb-ot-shape-complex-myanmar.lo \
        libharfbuzz_la-hb-ot-shape-complex-thai.lo \
        libharfbuzz_la-hb-ot-shape-complex-tibetan.lo \
        libharfbuzz_la-hb-ot-shape-complex-myanmar.lo \
        libharfbuzz_la-hb-ot-shape-complex-thai.lo \
        libharfbuzz_la-hb-ot-shape-complex-tibetan.lo \
@@ -453,35 +514,53 @@ am__objects_40 = libharfbuzz_la-hb-ot-font.lo \
        libharfbuzz_la-hb-ot-shape-normalize.lo \
        libharfbuzz_la-hb-ot-shape-fallback.lo \
        libharfbuzz_la-hb-ot-var.lo $(am__objects_1)
        libharfbuzz_la-hb-ot-shape-normalize.lo \
        libharfbuzz_la-hb-ot-shape-fallback.lo \
        libharfbuzz_la-hb-ot-var.lo $(am__objects_1)
-@HAVE_OT_TRUE@am__objects_41 = $(am__objects_40) $(am__objects_3)
-am__objects_42 = libharfbuzz_la-hb-fallback-shape.lo
-@HAVE_FALLBACK_TRUE@am__objects_43 = $(am__objects_42)
-am__objects_44 = libharfbuzz_la-hb-glib.lo
-@HAVE_GLIB_TRUE@am__objects_45 = $(am__objects_44)
-am__objects_46 = libharfbuzz_la-hb-ft.lo
-@HAVE_FREETYPE_TRUE@am__objects_47 = $(am__objects_46)
-am__objects_48 = libharfbuzz_la-hb-graphite2.lo
-@HAVE_GRAPHITE2_TRUE@am__objects_49 = $(am__objects_48)
-am__objects_50 = libharfbuzz_la-hb-uniscribe.lo
-@HAVE_UNISCRIBE_TRUE@am__objects_51 = $(am__objects_50)
-am__objects_52 = libharfbuzz_la-hb-directwrite.lo
-@HAVE_DIRECTWRITE_TRUE@am__objects_53 = $(am__objects_52)
-am__objects_54 = libharfbuzz_la-hb-coretext.lo
-@HAVE_CORETEXT_TRUE@am__objects_55 = $(am__objects_54)
-am__objects_56 = libharfbuzz_la-hb-ucdn.lo
-@HAVE_UCDN_TRUE@am__objects_57 = $(am__objects_56)
-am__objects_58 = libharfbuzz_la-hb-icu.lo
-@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__objects_59 =  \
-@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__objects_58)
-am__objects_60 = $(am__objects_39) $(am__objects_3) $(am__objects_41) \
-       $(am__objects_43) $(am__objects_45) $(am__objects_47) \
-       $(am__objects_49) $(am__objects_51) $(am__objects_53) \
-       $(am__objects_55) $(am__objects_57) $(am__objects_59)
-am_libharfbuzz_la_OBJECTS = $(am__objects_60) $(am__objects_33) \
-       $(am__objects_34)
+@HAVE_OT_TRUE@am__objects_42 = $(am__objects_41) $(am__objects_3)
+am__objects_43 = libharfbuzz_la-hb-fallback-shape.lo $(am__objects_1)
+@HAVE_FALLBACK_TRUE@am__objects_44 = $(am__objects_43)
+am__objects_45 = libharfbuzz_la-hb-glib.lo
+@HAVE_GLIB_TRUE@am__objects_46 = $(am__objects_45)
+am__objects_47 = libharfbuzz_la-hb-ft.lo
+@HAVE_FREETYPE_TRUE@am__objects_48 = $(am__objects_47)
+am__objects_49 = libharfbuzz_la-hb-graphite2.lo
+@HAVE_GRAPHITE2_TRUE@am__objects_50 = $(am__objects_49)
+am__objects_51 = libharfbuzz_la-hb-uniscribe.lo
+@HAVE_UNISCRIBE_TRUE@am__objects_52 = $(am__objects_51)
+am__objects_53 = libharfbuzz_la-hb-directwrite.lo
+@HAVE_DIRECTWRITE_TRUE@am__objects_54 = $(am__objects_53)
+am__objects_55 = libharfbuzz_la-hb-coretext.lo
+@HAVE_CORETEXT_TRUE@am__objects_56 = $(am__objects_55)
+am__objects_57 = libharfbuzz_la-hb-ucdn.lo
+@HAVE_UCDN_TRUE@am__objects_58 = $(am__objects_57)
+am__objects_59 = libharfbuzz_la-hb-icu.lo
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__objects_60 =  \
+@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__objects_59)
+am__objects_61 = $(am__objects_40) $(am__objects_3) $(am__objects_42) \
+       $(am__objects_44) $(am__objects_46) $(am__objects_48) \
+       $(am__objects_50) $(am__objects_52) $(am__objects_54) \
+       $(am__objects_56) $(am__objects_58) $(am__objects_60)
+am_libharfbuzz_la_OBJECTS = $(am__objects_61) $(am__objects_33)
 libharfbuzz_la_OBJECTS = $(am_libharfbuzz_la_OBJECTS)
 am__EXEEXT_1 =
 PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
 libharfbuzz_la_OBJECTS = $(am_libharfbuzz_la_OBJECTS)
 am__EXEEXT_1 =
 PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+am_dump_indic_data_OBJECTS =  \
+       dump_indic_data-dump-indic-data.$(OBJEXT) \
+       dump_indic_data-hb-ot-shape-complex-indic-table.$(OBJEXT)
+dump_indic_data_OBJECTS = $(am_dump_indic_data_OBJECTS)
+dump_indic_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am_dump_khmer_data_OBJECTS =  \
+       dump_khmer_data-dump-khmer-data.$(OBJEXT) \
+       dump_khmer_data-hb-ot-shape-complex-indic-table.$(OBJEXT)
+dump_khmer_data_OBJECTS = $(am_dump_khmer_data_OBJECTS)
+dump_khmer_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am_dump_myanmar_data_OBJECTS =  \
+       dump_myanmar_data-dump-myanmar-data.$(OBJEXT) \
+       dump_myanmar_data-hb-ot-shape-complex-indic-table.$(OBJEXT)
+dump_myanmar_data_OBJECTS = $(am_dump_myanmar_data_OBJECTS)
+dump_myanmar_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am_dump_use_data_OBJECTS = dump_use_data-dump-use-data.$(OBJEXT) \
+       dump_use_data-hb-ot-shape-complex-use-table.$(OBJEXT)
+dump_use_data_OBJECTS = $(am_dump_use_data_OBJECTS)
+dump_use_data_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
 am_main_OBJECTS = main-main.$(OBJEXT)
 main_OBJECTS = $(am_main_OBJECTS)
 main_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
 am_main_OBJECTS = main-main.$(OBJEXT)
 main_OBJECTS = $(am_main_OBJECTS)
 main_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
@@ -501,11 +580,18 @@ am_test_size_params_OBJECTS =  \
        test_size_params-test-size-params.$(OBJEXT)
 test_size_params_OBJECTS = $(am_test_size_params_OBJECTS)
 test_size_params_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
        test_size_params-test-size-params.$(OBJEXT)
 test_size_params_OBJECTS = $(am_test_size_params_OBJECTS)
 test_size_params_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11)
+am_test_unicode_ranges_OBJECTS = test-unicode-ranges.$(OBJEXT)
+test_unicode_ranges_OBJECTS = $(am_test_unicode_ranges_OBJECTS)
+test_unicode_ranges_DEPENDENCIES = libharfbuzz.la \
+       $(am__DEPENDENCIES_11)
 am_test_would_substitute_OBJECTS =  \
        test_would_substitute-test-would-substitute.$(OBJEXT)
 test_would_substitute_OBJECTS = $(am_test_would_substitute_OBJECTS)
 test_would_substitute_DEPENDENCIES = libharfbuzz.la \
        $(am__DEPENDENCIES_11) $(am__DEPENDENCIES_1)
 am_test_would_substitute_OBJECTS =  \
        test_would_substitute-test-would-substitute.$(OBJEXT)
 test_would_substitute_OBJECTS = $(am_test_would_substitute_OBJECTS)
 test_would_substitute_DEPENDENCIES = libharfbuzz.la \
        $(am__DEPENDENCIES_11) $(am__DEPENDENCIES_1)
+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_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -561,16 +647,22 @@ am__v_CCLD_1 =
 SOURCES = $(libharfbuzz_fuzzing_la_SOURCES) \
        $(libharfbuzz_gobject_la_SOURCES) \
        $(nodist_libharfbuzz_gobject_la_SOURCES) \
 SOURCES = $(libharfbuzz_fuzzing_la_SOURCES) \
        $(libharfbuzz_gobject_la_SOURCES) \
        $(nodist_libharfbuzz_gobject_la_SOURCES) \
-       $(libharfbuzz_icu_la_SOURCES) $(libharfbuzz_la_SOURCES) \
-       $(main_SOURCES) $(test_SOURCES) \
+       $(libharfbuzz_icu_la_SOURCES) $(libharfbuzz_subset_la_SOURCES) \
+       $(libharfbuzz_la_SOURCES) $(dump_indic_data_SOURCES) \
+       $(dump_khmer_data_SOURCES) $(dump_myanmar_data_SOURCES) \
+       $(dump_use_data_SOURCES) $(main_SOURCES) $(test_SOURCES) \
        $(test_buffer_serialize_SOURCES) $(test_ot_tag_SOURCES) \
        $(test_buffer_serialize_SOURCES) $(test_ot_tag_SOURCES) \
-       $(test_size_params_SOURCES) $(test_would_substitute_SOURCES)
+       $(test_size_params_SOURCES) $(test_unicode_ranges_SOURCES) \
+       $(test_would_substitute_SOURCES)
 DIST_SOURCES = $(am__libharfbuzz_fuzzing_la_SOURCES_DIST) \
        $(am__libharfbuzz_gobject_la_SOURCES_DIST) \
        $(am__libharfbuzz_icu_la_SOURCES_DIST) \
 DIST_SOURCES = $(am__libharfbuzz_fuzzing_la_SOURCES_DIST) \
        $(am__libharfbuzz_gobject_la_SOURCES_DIST) \
        $(am__libharfbuzz_icu_la_SOURCES_DIST) \
-       $(am__libharfbuzz_la_SOURCES_DIST) $(main_SOURCES) \
-       $(test_SOURCES) $(test_buffer_serialize_SOURCES) \
-       $(test_ot_tag_SOURCES) $(test_size_params_SOURCES) \
+       $(libharfbuzz_subset_la_SOURCES) \
+       $(am__libharfbuzz_la_SOURCES_DIST) $(dump_indic_data_SOURCES) \
+       $(dump_khmer_data_SOURCES) $(dump_myanmar_data_SOURCES) \
+       $(dump_use_data_SOURCES) $(main_SOURCES) $(test_SOURCES) \
+       $(test_buffer_serialize_SOURCES) $(test_ot_tag_SOURCES) \
+       $(test_size_params_SOURCES) $(test_unicode_ranges_SOURCES) \
        $(test_would_substitute_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
        ctags-recursive dvi-recursive html-recursive info-recursive \
        $(test_would_substitute_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
        ctags-recursive dvi-recursive html-recursive info-recursive \
@@ -585,14 +677,15 @@ am__can_run_installinfo = \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
-DATA = $(gir_DATA) $(pkgconfig_DATA) $(typelib_DATA)
+DATA = $(cmake_DATA) $(gir_DATA) $(pkgconfig_DATA) $(typelib_DATA)
 am__pkginclude_HEADERS_DIST = hb.h hb-blob.h hb-buffer.h hb-common.h \
        hb-deprecated.h hb-face.h hb-font.h hb-set.h hb-shape.h \
 am__pkginclude_HEADERS_DIST = hb.h hb-blob.h hb-buffer.h hb-common.h \
        hb-deprecated.h hb-face.h hb-font.h hb-set.h hb-shape.h \
-       hb-shape-plan.h hb-unicode.h hb-ot.h hb-ot-font.h \
+       hb-shape-plan.h hb-unicode.h hb-version.h hb-ot.h hb-ot-font.h \
        hb-ot-layout.h hb-ot-math.h hb-ot-shape.h hb-ot-tag.h \
        hb-ot-var.h hb-glib.h hb-ft.h hb-graphite2.h hb-uniscribe.h \
        hb-ot-layout.h hb-ot-math.h hb-ot-shape.h hb-ot-tag.h \
        hb-ot-var.h hb-glib.h hb-ft.h hb-graphite2.h hb-uniscribe.h \
-       hb-directwrite.h hb-coretext.h hb-icu.h hb-gobject.h \
-       hb-gobject-structs.h
+       hb-directwrite.h hb-coretext.h hb-icu.h hb-subset.h \
+       hb-subset-glyf.hh hb-subset-plan.hh hb-subset-private.hh \
+       hb-gobject.h hb-gobject-structs.h
 HEADERS = $(nodist_pkginclude_HEADERS) $(pkginclude_HEADERS)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
 HEADERS = $(nodist_pkginclude_HEADERS) $(pkginclude_HEADERS)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
@@ -777,9 +870,11 @@ am__set_TESTS_bases = \
   bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
   bases=`echo $$bases`
 RECHECK_LOGS = $(TEST_LOGS)
   bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
   bases=`echo $$bases`
 RECHECK_LOGS = $(TEST_LOGS)
-am__EXEEXT_2 = check-c-linkage-decls.sh check-defs.sh \
-       check-header-guards.sh check-includes.sh check-libstdc++.sh \
-       check-static-inits.sh check-symbols.sh $(am__EXEEXT_1)
+@WITH_LIBSTDCXX_FALSE@am__EXEEXT_2 = check-libstdc++.sh \
+@WITH_LIBSTDCXX_FALSE@ $(am__EXEEXT_1)
+am__EXEEXT_3 = 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_2)
 TEST_SUITE_LOG = test-suite.log
 TEST_EXTENSIONS = @EXEEXT@ .test
 LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
 TEST_SUITE_LOG = test-suite.log
 TEST_EXTENSIONS = @EXEEXT@ .test
 LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
@@ -800,6 +895,9 @@ TEST_LOGS = $(am__test_logs2:.test.log=.log)
 TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
        $(TEST_LOG_FLAGS)
 TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
        $(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+       $(srcdir)/harfbuzz-config.cmake.in $(srcdir)/hb-version.h.in \
+       $(top_srcdir)/depcomp $(top_srcdir)/test-driver
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -841,6 +939,12 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
@@ -868,6 +972,8 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
@@ -907,6 +1013,7 @@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -915,6 +1022,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -971,6 +1079,7 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -991,6 +1100,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -999,30 +1109,31 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-SUBDIRS = $(am__append_32)
+NULL = 
+SUBDIRS = $(am__append_33)
 DIST_SUBDIRS = hb-ucdn
 DIST_SUBDIRS = hb-ucdn
-BUILT_SOURCES = $(am__append_47) $(RAGEL_GENERATED)
-EXTRA_DIST = harfbuzz.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) $(HB_OT_RAGEL_sources) \
-       $(NULL)
-CLEANFILES = libharfbuzz-fuzzing.la $(pkgconfig_DATA) harfbuzz.def \
-       $(am__append_49)
-DISTCLEANFILES = $(am__append_48)
-MAINTAINERCLEANFILES = $(RAGEL_GENERATED)
+BUILT_SOURCES = $(am__append_48) $(RAGEL_GENERATED)
+EXTRA_DIST = 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) $(HB_OT_RAGEL_sources) $(NULL)
+CLEANFILES = libharfbuzz-fuzzing.la $(pkgconfig_DATA) $(DEF_FILES) \
+       $(am__append_52)
+DISTCLEANFILES = $(am__append_49)
+MAINTAINERCLEANFILES = 
 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
-lib_LTLIBRARIES = libharfbuzz.la $(am__append_40) $(am__append_43)
-NULL = 
-
-# Base and default-included sources and headers
+lib_LTLIBRARIES = libharfbuzz.la libharfbuzz-subset.la \
+       $(am__append_41) $(am__append_44)
 HB_BASE_sources = \
        hb-atomic-private.hh \
        hb-blob.cc \
        hb-buffer-private.hh \
        hb-buffer-serialize.cc \
        hb-buffer.cc \
 HB_BASE_sources = \
        hb-atomic-private.hh \
        hb-blob.cc \
        hb-buffer-private.hh \
        hb-buffer-serialize.cc \
        hb-buffer.cc \
-       hb-cache-private.hh \
        hb-common.cc \
        hb-common.cc \
+       hb-debug.hh \
+       hb-dsalgs.hh \
        hb-face-private.hh \
        hb-face.cc \
        hb-font-private.hh \
        hb-face-private.hh \
        hb-face.cc \
        hb-font-private.hh \
@@ -1031,18 +1142,23 @@ HB_BASE_sources = \
        hb-object-private.hh \
        hb-open-file-private.hh \
        hb-open-type-private.hh \
        hb-object-private.hh \
        hb-open-file-private.hh \
        hb-open-type-private.hh \
-       hb-ot-cbdt-table.hh \
+       hb-ot-color-cbdt-table.hh \
        hb-ot-cmap-table.hh \
        hb-ot-glyf-table.hh \
        hb-ot-cmap-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-head-table.hh \
        hb-ot-hhea-table.hh \
        hb-ot-hmtx-table.hh \
+       hb-ot-kern-table.hh \
        hb-ot-maxp-table.hh \
        hb-ot-name-table.hh \
        hb-ot-os2-table.hh \
        hb-ot-maxp-table.hh \
        hb-ot-name-table.hh \
        hb-ot-os2-table.hh \
+       hb-ot-os2-unicode-ranges.hh \
+       hb-ot-post-macroman.hh \
        hb-ot-post-table.hh \
        hb-ot-tag.cc \
        hb-private.hh \
        hb-ot-post-table.hh \
        hb-ot-tag.cc \
        hb-private.hh \
+       hb-set-digest-private.hh \
        hb-set-private.hh \
        hb-set.cc \
        hb-shape.cc \
        hb-set-private.hh \
        hb-set.cc \
        hb-shape.cc \
@@ -1052,6 +1168,7 @@ HB_BASE_sources = \
        hb-shaper-impl-private.hh \
        hb-shaper-private.hh \
        hb-shaper.cc \
        hb-shaper-impl-private.hh \
        hb-shaper-private.hh \
        hb-shaper.cc \
+       hb-string-array.hh \
        hb-unicode-private.hh \
        hb-unicode.cc \
        hb-utf-private.hh \
        hb-unicode-private.hh \
        hb-unicode.cc \
        hb-utf-private.hh \
@@ -1080,16 +1197,24 @@ HB_BASE_headers = \
        hb-shape.h \
        hb-shape-plan.h \
        hb-unicode.h \
        hb-shape.h \
        hb-shape-plan.h \
        hb-unicode.h \
+       hb-version.h \
        $(NULL)
 
        $(NULL)
 
-HB_NODIST_headers = \
-       hb-version.h \
+HB_FALLBACK_sources = \
+       hb-fallback-shape.cc    \
        $(NULL)
 
        $(NULL)
 
-HB_FALLBACK_sources = hb-fallback-shape.cc
 HB_OT_sources = \
 HB_OT_sources = \
+       hb-aat-layout.cc \
+       hb-aat-layout-common-private.hh \
+       hb-aat-layout-ankr-table.hh \
+       hb-aat-layout-kerx-table.hh \
+       hb-aat-layout-morx-table.hh \
+       hb-aat-layout-trak-table.hh \
+       hb-aat-layout-private.hh \
        hb-ot-font.cc \
        hb-ot-layout.cc \
        hb-ot-font.cc \
        hb-ot-layout.cc \
+       hb-ot-layout-base-table.hh \
        hb-ot-layout-common-private.hh \
        hb-ot-layout-gdef-table.hh \
        hb-ot-layout-gpos-table.hh \
        hb-ot-layout-common-private.hh \
        hb-ot-layout-gdef-table.hh \
        hb-ot-layout-gpos-table.hh \
@@ -1097,6 +1222,9 @@ HB_OT_sources = \
        hb-ot-layout-gsub-table.hh \
        hb-ot-layout-jstf-table.hh \
        hb-ot-layout-private.hh \
        hb-ot-layout-gsub-table.hh \
        hb-ot-layout-jstf-table.hh \
        hb-ot-layout-private.hh \
+       hb-ot-color.cc \
+       hb-ot-color-colr-table.hh \
+       hb-ot-color-cpal-table.hh \
        hb-ot-map.cc \
        hb-ot-map-private.hh \
        hb-ot-math.cc \
        hb-ot-map.cc \
        hb-ot-map-private.hh \
        hb-ot-math.cc \
@@ -1113,6 +1241,9 @@ HB_OT_sources = \
        hb-ot-shape-complex-indic.cc \
        hb-ot-shape-complex-indic-private.hh \
        hb-ot-shape-complex-indic-table.cc \
        hb-ot-shape-complex-indic.cc \
        hb-ot-shape-complex-indic-private.hh \
        hb-ot-shape-complex-indic-table.cc \
+       hb-ot-shape-complex-khmer-private.hh \
+       hb-ot-shape-complex-khmer.cc \
+       hb-ot-shape-complex-myanmar-private.hh \
        hb-ot-shape-complex-myanmar.cc \
        hb-ot-shape-complex-thai.cc \
        hb-ot-shape-complex-tibetan.cc \
        hb-ot-shape-complex-myanmar.cc \
        hb-ot-shape-complex-thai.cc \
        hb-ot-shape-complex-tibetan.cc \
@@ -1134,12 +1265,14 @@ HB_OT_sources = \
 
 HB_OT_RAGEL_GENERATED_sources = \
        hb-ot-shape-complex-indic-machine.hh \
 
 HB_OT_RAGEL_GENERATED_sources = \
        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 \
        $(NULL)
 
 HB_OT_RAGEL_sources = \
        hb-ot-shape-complex-indic-machine.rl \
        hb-ot-shape-complex-myanmar-machine.hh \
        hb-ot-shape-complex-use-machine.hh \
        $(NULL)
 
 HB_OT_RAGEL_sources = \
        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 \
        $(NULL)
        hb-ot-shape-complex-myanmar-machine.rl \
        hb-ot-shape-complex-use-machine.rl \
        $(NULL)
@@ -1177,74 +1310,124 @@ HB_UCDN_sources = hb-ucdn.cc
 # Sources for libharfbuzz-gobject and libharfbuzz-icu
 HB_ICU_sources = hb-icu.cc
 HB_ICU_headers = hb-icu.h
 # Sources for libharfbuzz-gobject and libharfbuzz-icu
 HB_ICU_sources = hb-icu.cc
 HB_ICU_headers = hb-icu.h
-HB_GOBJECT_sources = hb-gobject-structs.cc
-HB_GOBJECT_STRUCTS_headers = hb-gobject-structs.h
-HB_GOBJECT_headers = hb-gobject.h $(HB_GOBJECT_STRUCTS_headers)
+
+# Sources for libharfbuzz-subset
+HB_SUBSET_sources = \
+       hb-subset.cc \
+       hb-subset-glyf.cc \
+       hb-subset-input.cc \
+       hb-subset-plan.cc \
+       $(NULL)
+
+HB_SUBSET_headers = \
+       hb-subset.h \
+       hb-subset-glyf.hh \
+       hb-subset-plan.hh \
+       hb-subset-private.hh \
+       $(NULL)
+
+HB_GOBJECT_DIST_sources = hb-gobject-structs.cc
+HB_GOBJECT_DIST_headers = hb-gobject.h hb-gobject-structs.h
 HB_GOBJECT_ENUM_sources = hb-gobject-enums.cc
 HB_GOBJECT_ENUM_headers = hb-gobject-enums.h
 HB_GOBJECT_ENUM_sources = hb-gobject-enums.cc
 HB_GOBJECT_ENUM_headers = hb-gobject-enums.h
-HBCFLAGS = $(am__append_4) $(am__append_6) $(am__append_11) \
-       $(am__append_15) $(am__append_20) $(am__append_24) \
-       $(am__append_28) $(am__append_33) $(am__append_36)
+HB_GOBJECT_NODIST_sources = $(HB_GOBJECT_ENUM_sources)
+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_5) $(am__append_7) \
+       $(am__append_12) $(am__append_16) $(am__append_21) \
+       $(am__append_25) $(am__append_29) $(am__append_34) \
+       $(am__append_37)
 
 # Put the library together
 
 # Put the library together
-HBLIBS = $(am__append_7) $(am__append_12) $(am__append_16) \
-       $(am__append_34) $(HBNONPCLIBS) $(am__append_37)
-HBNONPCLIBS = $(am__append_5) $(am__append_21) $(am__append_25) \
-       $(am__append_29)
-HBDEPS = $(am__append_8) $(am__append_17)
+HBLIBS = $(am__append_8) $(am__append_13) $(am__append_17) \
+       $(am__append_35) $(HBNONPCLIBS) $(am__append_38)
+HBNONPCLIBS = $(am__append_6) $(am__append_22) $(am__append_26) \
+       $(am__append_30)
+HBDEPS = $(am__append_9) $(am__append_18)
 HBSOURCES = $(HB_BASE_sources) $(HB_BASE_RAGEL_GENERATED_sources) \
 HBSOURCES = $(HB_BASE_sources) $(HB_BASE_RAGEL_GENERATED_sources) \
-       $(am__append_1) $(am__append_3) $(am__append_9) \
-       $(am__append_13) $(am__append_18) $(am__append_22) \
-       $(am__append_26) $(am__append_30) $(am__append_35) \
-       $(am__append_38)
-HBHEADERS = $(HB_BASE_headers) $(am__append_2) $(am__append_10) \
+       $(am__append_2) $(am__append_4) $(am__append_10) \
        $(am__append_14) $(am__append_19) $(am__append_23) \
        $(am__append_14) $(am__append_19) $(am__append_23) \
-       $(am__append_27) $(am__append_31) $(am__append_39)
-HBNODISTHEADERS = $(HB_NODIST_headers)
+       $(am__append_27) $(am__append_31) $(am__append_36) \
+       $(am__append_39)
+HBHEADERS = $(HB_BASE_headers) $(am__append_3) $(am__append_11) \
+       $(am__append_15) $(am__append_20) $(am__append_24) \
+       $(am__append_28) $(am__append_32) $(am__append_40)
+@WITH_LIBSTDCXX_TRUE@HBNOLIBCXXCFLAGS = 
+@WITH_LIBSTDCXX_FALSE@HBNOLIBCXXFLAGS = -fno-threadsafe-statics -fno-rtti
 @OS_WIN32_TRUE@export_symbols = -export-symbols harfbuzz.def
 @OS_WIN32_TRUE@harfbuzz_def_dependency = harfbuzz.def
 @OS_WIN32_TRUE@export_symbols = -export-symbols harfbuzz.def
 @OS_WIN32_TRUE@harfbuzz_def_dependency = harfbuzz.def
-@HAVE_GCC_FALSE@@OS_WIN32_FALSE@libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS)
+@OS_WIN32_TRUE@export_symbols_subset = -export-symbols harfbuzz-subset.def
+@OS_WIN32_TRUE@harfbuzz_subset_def_dependency = harfbuzz-subset.def
+@OS_WIN32_TRUE@export_symbols_icu = -export-symbols harfbuzz-icu.def
+@OS_WIN32_TRUE@harfbuzz_icu_def_dependency = harfbuzz-icu.def
+@OS_WIN32_TRUE@export_symbols_gobject = -export-symbols harfbuzz-gobject.def
+@OS_WIN32_TRUE@harfbuzz_gobject_def_dependency = harfbuzz-gobject.def
+@HAVE_GCC_FALSE@@OS_WIN32_FALSE@@WITH_LIBSTDCXX_FALSE@chosen_linker = $(CXXLINK)
 # Use a C linker for GCC, not C++; Don't link to libstdc++
 # Use a C linker for GCC, not C++; Don't link to libstdc++
-@HAVE_GCC_TRUE@@OS_WIN32_FALSE@libharfbuzz_la_LINK = $(LINK) $(libharfbuzz_la_LDFLAGS)
-@OS_WIN32_TRUE@libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS)
-libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS) $(HBNODISTHEADERS)
-libharfbuzz_la_CPPFLAGS = $(HBCFLAGS)
-libharfbuzz_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) $(export_symbols) -no-undefined
+@HAVE_GCC_TRUE@@OS_WIN32_FALSE@@WITH_LIBSTDCXX_FALSE@chosen_linker = $(LINK)
+@OS_WIN32_FALSE@@WITH_LIBSTDCXX_TRUE@chosen_linker = $(CXXLINK)
+@OS_WIN32_TRUE@chosen_linker = $(CXXLINK)
+base_link_flags = $(AM_LDFLAGS) -lm -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+libharfbuzz_la_LINK = $(chosen_linker) $(libharfbuzz_la_LDFLAGS) $(CODE_COVERAGE_LDFLAGS)
+libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS)
+libharfbuzz_la_CPPFLAGS = $(HBCFLAGS) $(HBNOLIBCXXFLAGS) $(CODE_COVERAGE_CFLAGS)
+libharfbuzz_la_LDFLAGS = $(base_link_flags) $(export_symbols)
 libharfbuzz_la_LIBADD = $(HBLIBS)
 EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency)
 libharfbuzz_la_LIBADD = $(HBLIBS)
 EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency)
-pkginclude_HEADERS = $(HBHEADERS) $(am__append_41) $(am__append_44)
-nodist_pkginclude_HEADERS = $(HBNODISTHEADERS) $(am__append_45)
+pkginclude_HEADERS = $(HBHEADERS) $(HB_SUBSET_headers) \
+       $(am__append_42) $(am__append_45)
+nodist_pkginclude_HEADERS = $(am__append_46)
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = harfbuzz.pc $(am__append_42) $(am__append_46)
+pkgconfig_DATA = harfbuzz.pc harfbuzz-subset.pc $(am__append_43) \
+       $(am__append_47)
+cmakedir = $(libdir)/cmake/harfbuzz
+cmake_DATA = harfbuzz-config.cmake
+libharfbuzz_subset_la_SOURCES = $(HB_SUBSET_sources)
+libharfbuzz_subset_la_CPPFLAGS = $(HBCFLAGS)
+libharfbuzz_subset_la_LDFLAGS = $(base_link_flags) $(export_symbols_subset)
+libharfbuzz_subset_la_LIBADD = libharfbuzz.la
+EXTRA_libharfbuzz_subset_la_DEPENDENCIES = $(harfbuzz_subset_def_dependency)
 FUZZING_CPPFLAGS = \
        -DHB_NDEBUG \
        -DHB_MAX_NESTING_LEVEL=3 \
        -DHB_SANITIZE_MAX_EDITS=3 \
 FUZZING_CPPFLAGS = \
        -DHB_NDEBUG \
        -DHB_MAX_NESTING_LEVEL=3 \
        -DHB_SANITIZE_MAX_EDITS=3 \
-       -DHB_BUFFER_MAX_EXPANSION_FACTOR=3 \
+       -DHB_SANITIZE_MAX_OPS_FACTOR=3 \
+       -DHB_SANITIZE_MAX_OPS_MIN=128 \
+       -DHB_BUFFER_MAX_LEN_FACTOR=3 \
        -DHB_BUFFER_MAX_LEN_MIN=8 \
        -DHB_BUFFER_MAX_LEN_DEFAULT=128 \
        -DHB_BUFFER_MAX_LEN_MIN=8 \
        -DHB_BUFFER_MAX_LEN_DEFAULT=128 \
+       -DHB_BUFFER_MAX_OPS_FACTOR=8 \
+       -DHB_BUFFER_MAX_OPS_MIN=64 \
+       -DHB_BUFFER_MAX_OPS_DEFAULT=1024 \
        $(NULL)
 
 EXTRA_LTLIBRARIES = libharfbuzz-fuzzing.la
        $(NULL)
 
 EXTRA_LTLIBRARIES = libharfbuzz-fuzzing.la
-libharfbuzz_fuzzing_la_LINK = $(libharfbuzz_la_LINK)
+libharfbuzz_fuzzing_la_LINK = $(chosen_linker) $(libharfbuzz_fuzzing_la_LDFLAGS)
 libharfbuzz_fuzzing_la_SOURCES = $(libharfbuzz_la_SOURCES)
 libharfbuzz_fuzzing_la_SOURCES = $(libharfbuzz_la_SOURCES)
-libharfbuzz_fuzzing_la_CPPFLAGS = $(libharfbuzz_la_CPPFLAGS) $(FUZZING_CPPFLAGS)
-libharfbuzz_fuzzing_la_LDFLAGS = $(libharfbuzz_la_LDFLAGS)
+libharfbuzz_fuzzing_la_CPPFLAGS = $(HBCFLAGS) $(FUZZING_CPPFLAGS)
+libharfbuzz_fuzzing_la_LDFLAGS = $(AM_LDFLAGS)
 libharfbuzz_fuzzing_la_LIBADD = $(libharfbuzz_la_LIBADD)
 EXTRA_libharfbuzz_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_la_DEPENDENCIES)
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources)
 libharfbuzz_fuzzing_la_LIBADD = $(libharfbuzz_la_LIBADD)
 EXTRA_libharfbuzz_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_la_DEPENDENCIES)
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources)
-@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_CPPFLAGS = $(ICU_CFLAGS)
-@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_CPPFLAGS = $(HBCFLAGS) $(ICU_CFLAGS)
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_LDFLAGS = $(base_link_flags) $(export_symbols_icu)
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_LIBADD = $(ICU_LIBS) libharfbuzz.la
 @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_LIBADD = $(ICU_LIBS) libharfbuzz.la
-@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_sources)
-@HAVE_GOBJECT_TRUE@nodist_libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_ENUM_sources)
-@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_CPPFLAGS = $(GOBJECT_CFLAGS)
-@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@EXTRA_libharfbuzz_icu_la_DEPENDENCIES = $(harfbuzz_icu_def_dependency)
+@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_LINK = $(chosen_linker) $(libharfbuzz_gobject_la_LDFLAGS)
+@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_DIST_sources)
+@HAVE_GOBJECT_TRUE@nodist_libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_NODIST_sources)
+@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_CPPFLAGS = $(HBCFLAGS) $(HBNOLIBCXXFLAGS) $(GOBJECT_CFLAGS)
+@HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_LDFLAGS = $(base_link_flags)
 @HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_LIBADD = $(GOBJECT_LIBS) libharfbuzz.la
 @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 \
+       $(am__append_50)
 GENERATORS = \
        gen-arabic-table.py \
        gen-indic-table.py \
        gen-use-table.py \
 GENERATORS = \
        gen-arabic-table.py \
        gen-indic-table.py \
        gen-use-table.py \
+       gen-def.py \
        $(NULL)
 
 RAGEL_GENERATED = \
        $(NULL)
 
 RAGEL_GENERATED = \
@@ -1267,24 +1450,31 @@ test_size_params_LDADD = libharfbuzz.la $(HBLIBS)
 test_buffer_serialize_SOURCES = test-buffer-serialize.cc
 test_buffer_serialize_CPPFLAGS = $(HBCFLAGS)
 test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS)
 test_buffer_serialize_SOURCES = test-buffer-serialize.cc
 test_buffer_serialize_CPPFLAGS = $(HBCFLAGS)
 test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS)
-dist_check_SCRIPTS = \
-       check-c-linkage-decls.sh \
-       check-defs.sh \
-       check-header-guards.sh \
-       check-includes.sh \
-       check-libstdc++.sh \
-       check-static-inits.sh \
-       check-symbols.sh \
-       $(NULL)
-
+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_51)
+dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc
+dump_indic_data_CPPFLAGS = $(HBCFLAGS)
+dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_khmer_data_SOURCES = dump-khmer-data.cc hb-ot-shape-complex-indic-table.cc
+dump_khmer_data_CPPFLAGS = $(HBCFLAGS)
+dump_khmer_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_myanmar_data_SOURCES = dump-myanmar-data.cc hb-ot-shape-complex-indic-table.cc
+dump_myanmar_data_CPPFLAGS = $(HBCFLAGS)
+dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc
+dump_use_data_CPPFLAGS = $(HBCFLAGS)
+dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
 test_ot_tag_SOURCES = hb-ot-tag.cc
 test_ot_tag_CPPFLAGS = $(HBCFLAGS) -DMAIN
 test_ot_tag_LDADD = libharfbuzz.la $(HBLIBS)
 test_ot_tag_SOURCES = hb-ot-tag.cc
 test_ot_tag_CPPFLAGS = $(HBCFLAGS) -DMAIN
 test_ot_tag_LDADD = libharfbuzz.la $(HBLIBS)
+test_unicode_ranges_SOURCES = test-unicode-ranges.cc
+test_unicode_ranges_LDADD = libharfbuzz.la $(HBLIBS)
 TESTS_ENVIRONMENT = \
        srcdir="$(srcdir)" \
        MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
        HBSOURCES="$(HBSOURCES)" \
 TESTS_ENVIRONMENT = \
        srcdir="$(srcdir)" \
        MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
        HBSOURCES="$(HBSOURCES)" \
-       HBHEADERS="$(HBHEADERS) $(HBNODISTHEADERS)" \
+       HBHEADERS="$(HBHEADERS)" \
        $(NULL)
 
 @HAVE_INTROSPECTION_TRUE@INTROSPECTION_GIRS = HarfBuzz-0.0.gir # What does the 0 mean anyway?!
        $(NULL)
 
 @HAVE_INTROSPECTION_TRUE@INTROSPECTION_GIRS = HarfBuzz-0.0.gir # What does the 0 mean anyway?!
@@ -1311,12 +1501,9 @@ TESTS_ENVIRONMENT = \
 
 @HAVE_INTROSPECTION_TRUE@HarfBuzz_0_0_gir_FILES = \
 @HAVE_INTROSPECTION_TRUE@      $(HBHEADERS) \
 
 @HAVE_INTROSPECTION_TRUE@HarfBuzz_0_0_gir_FILES = \
 @HAVE_INTROSPECTION_TRUE@      $(HBHEADERS) \
-@HAVE_INTROSPECTION_TRUE@      $(HBNODISTHEADERS) \
 @HAVE_INTROSPECTION_TRUE@      $(HBSOURCES) \
 @HAVE_INTROSPECTION_TRUE@      $(HBSOURCES) \
-@HAVE_INTROSPECTION_TRUE@      $(HB_GOBJECT_ENUM_sources) \
-@HAVE_INTROSPECTION_TRUE@      $(HB_GOBJECT_ENUM_headers) \
 @HAVE_INTROSPECTION_TRUE@      $(HB_GOBJECT_sources) \
 @HAVE_INTROSPECTION_TRUE@      $(HB_GOBJECT_sources) \
-@HAVE_INTROSPECTION_TRUE@      $(HB_GOBJECT_STRUCTS_headers) \
+@HAVE_INTROSPECTION_TRUE@      $(HB_GOBJECT_headers) \
 @HAVE_INTROSPECTION_TRUE@      $(NULL)
 
 @HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
 @HAVE_INTROSPECTION_TRUE@      $(NULL)
 
 @HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
@@ -1340,7 +1527,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__c
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits src/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits src/Makefile
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits src/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits src/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -1349,7 +1535,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
-$(srcdir)/Makefile.sources:
+$(srcdir)/Makefile.sources $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -1361,6 +1547,8 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 hb-version.h: $(top_builddir)/config.status $(srcdir)/hb-version.h.in
        cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 $(am__aclocal_m4_deps):
 hb-version.h: $(top_builddir)/config.status $(srcdir)/hb-version.h.in
        cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+harfbuzz-config.cmake: $(top_builddir)/config.status $(srcdir)/harfbuzz-config.cmake.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
        @$(NORMAL_INSTALL)
 
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
        @$(NORMAL_INSTALL)
@@ -1401,11 +1589,14 @@ libharfbuzz-fuzzing.la: $(libharfbuzz_fuzzing_la_OBJECTS) $(libharfbuzz_fuzzing_
        $(AM_V_GEN)$(libharfbuzz_fuzzing_la_LINK)  $(libharfbuzz_fuzzing_la_OBJECTS) $(libharfbuzz_fuzzing_la_LIBADD) $(LIBS)
 
 libharfbuzz-gobject.la: $(libharfbuzz_gobject_la_OBJECTS) $(libharfbuzz_gobject_la_DEPENDENCIES) $(EXTRA_libharfbuzz_gobject_la_DEPENDENCIES) 
        $(AM_V_GEN)$(libharfbuzz_fuzzing_la_LINK)  $(libharfbuzz_fuzzing_la_OBJECTS) $(libharfbuzz_fuzzing_la_LIBADD) $(LIBS)
 
 libharfbuzz-gobject.la: $(libharfbuzz_gobject_la_OBJECTS) $(libharfbuzz_gobject_la_DEPENDENCIES) $(EXTRA_libharfbuzz_gobject_la_DEPENDENCIES) 
-       $(AM_V_CXXLD)$(libharfbuzz_gobject_la_LINK) $(am_libharfbuzz_gobject_la_rpath) $(libharfbuzz_gobject_la_OBJECTS) $(libharfbuzz_gobject_la_LIBADD) $(LIBS)
+       $(AM_V_GEN)$(libharfbuzz_gobject_la_LINK) $(am_libharfbuzz_gobject_la_rpath) $(libharfbuzz_gobject_la_OBJECTS) $(libharfbuzz_gobject_la_LIBADD) $(LIBS)
 
 libharfbuzz-icu.la: $(libharfbuzz_icu_la_OBJECTS) $(libharfbuzz_icu_la_DEPENDENCIES) $(EXTRA_libharfbuzz_icu_la_DEPENDENCIES) 
        $(AM_V_CXXLD)$(libharfbuzz_icu_la_LINK) $(am_libharfbuzz_icu_la_rpath) $(libharfbuzz_icu_la_OBJECTS) $(libharfbuzz_icu_la_LIBADD) $(LIBS)
 
 
 libharfbuzz-icu.la: $(libharfbuzz_icu_la_OBJECTS) $(libharfbuzz_icu_la_DEPENDENCIES) $(EXTRA_libharfbuzz_icu_la_DEPENDENCIES) 
        $(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)
+
 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)
 install-binPROGRAMS: $(bin_PROGRAMS)
 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)
 install-binPROGRAMS: $(bin_PROGRAMS)
@@ -1492,6 +1683,22 @@ clean-noinstPROGRAMS:
        echo " rm -f" $$list; \
        rm -f $$list
 
        echo " rm -f" $$list; \
        rm -f $$list
 
+dump-indic-data$(EXEEXT): $(dump_indic_data_OBJECTS) $(dump_indic_data_DEPENDENCIES) $(EXTRA_dump_indic_data_DEPENDENCIES) 
+       @rm -f dump-indic-data$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(dump_indic_data_OBJECTS) $(dump_indic_data_LDADD) $(LIBS)
+
+dump-khmer-data$(EXEEXT): $(dump_khmer_data_OBJECTS) $(dump_khmer_data_DEPENDENCIES) $(EXTRA_dump_khmer_data_DEPENDENCIES) 
+       @rm -f dump-khmer-data$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(dump_khmer_data_OBJECTS) $(dump_khmer_data_LDADD) $(LIBS)
+
+dump-myanmar-data$(EXEEXT): $(dump_myanmar_data_OBJECTS) $(dump_myanmar_data_DEPENDENCIES) $(EXTRA_dump_myanmar_data_DEPENDENCIES) 
+       @rm -f dump-myanmar-data$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(dump_myanmar_data_OBJECTS) $(dump_myanmar_data_LDADD) $(LIBS)
+
+dump-use-data$(EXEEXT): $(dump_use_data_OBJECTS) $(dump_use_data_DEPENDENCIES) $(EXTRA_dump_use_data_DEPENDENCIES) 
+       @rm -f dump-use-data$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(dump_use_data_OBJECTS) $(dump_use_data_LDADD) $(LIBS)
+
 main$(EXEEXT): $(main_OBJECTS) $(main_DEPENDENCIES) $(EXTRA_main_DEPENDENCIES) 
        @rm -f main$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(main_OBJECTS) $(main_LDADD) $(LIBS)
 main$(EXEEXT): $(main_OBJECTS) $(main_DEPENDENCIES) $(EXTRA_main_DEPENDENCIES) 
        @rm -f main$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(main_OBJECTS) $(main_LDADD) $(LIBS)
@@ -1512,6 +1719,10 @@ test-size-params$(EXEEXT): $(test_size_params_OBJECTS) $(test_size_params_DEPEND
        @rm -f test-size-params$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_size_params_OBJECTS) $(test_size_params_LDADD) $(LIBS)
 
        @rm -f test-size-params$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_size_params_OBJECTS) $(test_size_params_LDADD) $(LIBS)
 
+test-unicode-ranges$(EXEEXT): $(test_unicode_ranges_OBJECTS) $(test_unicode_ranges_DEPENDENCIES) $(EXTRA_test_unicode_ranges_DEPENDENCIES) 
+       @rm -f test-unicode-ranges$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(test_unicode_ranges_OBJECTS) $(test_unicode_ranges_LDADD) $(LIBS)
+
 test-would-substitute$(EXEEXT): $(test_would_substitute_OBJECTS) $(test_would_substitute_DEPENDENCIES) $(EXTRA_test_would_substitute_DEPENDENCIES) 
        @rm -f test-would-substitute$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_would_substitute_OBJECTS) $(test_would_substitute_LDADD) $(LIBS)
 test-would-substitute$(EXEEXT): $(test_would_substitute_OBJECTS) $(test_would_substitute_DEPENDENCIES) $(EXTRA_test_would_substitute_DEPENDENCIES) 
        @rm -f test-would-substitute$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(test_would_substitute_OBJECTS) $(test_would_substitute_LDADD) $(LIBS)
@@ -1522,6 +1733,15 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
 distclean-compile:
        -rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_indic_data-dump-indic-data.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_khmer_data-dump-khmer-data.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_use_data-dump-use-data.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-aat-layout.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-blob.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer-serialize.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-blob.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer-serialize.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer.Plo@am__quote@
@@ -1535,6 +1755,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-glib.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-graphite2.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-icu.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-glib.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-graphite2.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-icu.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-color.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-layout.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-layout.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Plo@am__quote@
@@ -1545,6 +1766,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.Plo@am__quote@
@@ -1566,6 +1788,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-aat-layout.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-blob.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-blob.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer.Plo@am__quote@
@@ -1579,6 +1802,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-glib.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-graphite2.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-icu.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-glib.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-graphite2.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-icu.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-color.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-font.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-layout.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-map.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-font.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-layout.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-map.Plo@am__quote@
@@ -1589,6 +1813,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hebrew.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic-table.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hebrew.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic-table.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-tibetan.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-tibetan.Plo@am__quote@
@@ -1607,8 +1832,13 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-unicode.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-uniscribe.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-warning.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-unicode.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-uniscribe.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-warning.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-glyf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-input.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-plan.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-main.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-main.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-unicode-ranges.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_tag-hb-ot-tag.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_size_params-test-size-params.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_tag-hb-ot-tag.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_size_params-test-size-params.Po@am__quote@
@@ -1726,6 +1956,13 @@ libharfbuzz_fuzzing_la-hb-warning.lo: hb-warning.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_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.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_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.cc
 
+libharfbuzz_fuzzing_la-hb-aat-layout.lo: hb-aat-layout.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-aat-layout.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-aat-layout.Tpo -c -o libharfbuzz_fuzzing_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-aat-layout.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-aat-layout.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-aat-layout.cc' object='libharfbuzz_fuzzing_la-hb-aat-layout.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_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc
+
 libharfbuzz_fuzzing_la-hb-ot-font.lo: hb-ot-font.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-font.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-font.lo `test -f 'hb-ot-font.cc' || echo '$(srcdir)/'`hb-ot-font.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Plo
 libharfbuzz_fuzzing_la-hb-ot-font.lo: hb-ot-font.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-font.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-font.lo `test -f 'hb-ot-font.cc' || echo '$(srcdir)/'`hb-ot-font.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Plo
@@ -1740,6 +1977,13 @@ libharfbuzz_fuzzing_la-hb-ot-layout.lo: hb-ot-layout.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_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-layout.lo `test -f 'hb-ot-layout.cc' || echo '$(srcdir)/'`hb-ot-layout.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_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-layout.lo `test -f 'hb-ot-layout.cc' || echo '$(srcdir)/'`hb-ot-layout.cc
 
+libharfbuzz_fuzzing_la-hb-ot-color.lo: hb-ot-color.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-color.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-color.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-color.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-color.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-color.cc' object='libharfbuzz_fuzzing_la-hb-ot-color.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_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc
+
 libharfbuzz_fuzzing_la-hb-ot-map.lo: hb-ot-map.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-map.lo `test -f 'hb-ot-map.cc' || echo '$(srcdir)/'`hb-ot-map.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Plo
 libharfbuzz_fuzzing_la-hb-ot-map.lo: hb-ot-map.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-map.lo `test -f 'hb-ot-map.cc' || echo '$(srcdir)/'`hb-ot-map.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Plo
@@ -1803,6 +2047,13 @@ libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo: hb-ot-shape-complex-i
 @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_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.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_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
 
+libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo: hb-ot-shape-complex-khmer.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo `test -f 'hb-ot-shape-complex-khmer.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-khmer.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-khmer.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.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_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo `test -f 'hb-ot-shape-complex-khmer.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-khmer.cc
+
 libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo: hb-ot-shape-complex-myanmar.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo `test -f 'hb-ot-shape-complex-myanmar.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-myanmar.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Plo
 libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo: hb-ot-shape-complex-myanmar.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo `test -f 'hb-ot-shape-complex-myanmar.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-myanmar.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Plo
@@ -1943,6 +2194,34 @@ libharfbuzz_icu_la-hb-icu.lo: hb-icu.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_icu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_icu_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc
 
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_icu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_icu_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc
 
+libharfbuzz_subset_la-hb-subset.lo: hb-subset.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Tpo -c -o libharfbuzz_subset_la-hb-subset.lo `test -f 'hb-subset.cc' || echo '$(srcdir)/'`hb-subset.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-subset.cc' object='libharfbuzz_subset_la-hb-subset.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_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset.lo `test -f 'hb-subset.cc' || echo '$(srcdir)/'`hb-subset.cc
+
+libharfbuzz_subset_la-hb-subset-glyf.lo: hb-subset-glyf.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-glyf.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-glyf.Tpo -c -o libharfbuzz_subset_la-hb-subset-glyf.lo `test -f 'hb-subset-glyf.cc' || echo '$(srcdir)/'`hb-subset-glyf.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-glyf.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-glyf.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-subset-glyf.cc' object='libharfbuzz_subset_la-hb-subset-glyf.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_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-glyf.lo `test -f 'hb-subset-glyf.cc' || echo '$(srcdir)/'`hb-subset-glyf.cc
+
+libharfbuzz_subset_la-hb-subset-input.lo: hb-subset-input.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-input.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-input.Tpo -c -o libharfbuzz_subset_la-hb-subset-input.lo `test -f 'hb-subset-input.cc' || echo '$(srcdir)/'`hb-subset-input.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-input.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-input.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-subset-input.cc' object='libharfbuzz_subset_la-hb-subset-input.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_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-input.lo `test -f 'hb-subset-input.cc' || echo '$(srcdir)/'`hb-subset-input.cc
+
+libharfbuzz_subset_la-hb-subset-plan.lo: hb-subset-plan.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-plan.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-plan.Tpo -c -o libharfbuzz_subset_la-hb-subset-plan.lo `test -f 'hb-subset-plan.cc' || echo '$(srcdir)/'`hb-subset-plan.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-plan.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-plan.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-subset-plan.cc' object='libharfbuzz_subset_la-hb-subset-plan.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_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-plan.lo `test -f 'hb-subset-plan.cc' || echo '$(srcdir)/'`hb-subset-plan.cc
+
 libharfbuzz_la-hb-blob.lo: hb-blob.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-blob.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-blob.Tpo -c -o libharfbuzz_la-hb-blob.lo `test -f 'hb-blob.cc' || echo '$(srcdir)/'`hb-blob.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-blob.Tpo $(DEPDIR)/libharfbuzz_la-hb-blob.Plo
 libharfbuzz_la-hb-blob.lo: hb-blob.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-blob.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-blob.Tpo -c -o libharfbuzz_la-hb-blob.lo `test -f 'hb-blob.cc' || echo '$(srcdir)/'`hb-blob.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-blob.Tpo $(DEPDIR)/libharfbuzz_la-hb-blob.Plo
@@ -2034,6 +2313,13 @@ libharfbuzz_la-hb-warning.lo: hb-warning.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-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.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-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.cc
 
+libharfbuzz_la-hb-aat-layout.lo: hb-aat-layout.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-aat-layout.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Tpo -c -o libharfbuzz_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Tpo $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-aat-layout.cc' object='libharfbuzz_la-hb-aat-layout.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-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc
+
 libharfbuzz_la-hb-ot-font.lo: hb-ot-font.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-font.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-font.Tpo -c -o libharfbuzz_la-hb-ot-font.lo `test -f 'hb-ot-font.cc' || echo '$(srcdir)/'`hb-ot-font.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-font.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-font.Plo
 libharfbuzz_la-hb-ot-font.lo: hb-ot-font.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-font.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-font.Tpo -c -o libharfbuzz_la-hb-ot-font.lo `test -f 'hb-ot-font.cc' || echo '$(srcdir)/'`hb-ot-font.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-font.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-font.Plo
@@ -2048,6 +2334,13 @@ libharfbuzz_la-hb-ot-layout.lo: hb-ot-layout.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-layout.lo `test -f 'hb-ot-layout.cc' || echo '$(srcdir)/'`hb-ot-layout.cc
 
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-layout.lo `test -f 'hb-ot-layout.cc' || echo '$(srcdir)/'`hb-ot-layout.cc
 
+libharfbuzz_la-hb-ot-color.lo: hb-ot-color.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-color.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-color.Tpo -c -o libharfbuzz_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-color.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-color.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-color.cc' object='libharfbuzz_la-hb-ot-color.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc
+
 libharfbuzz_la-hb-ot-map.lo: hb-ot-map.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-map.Tpo -c -o libharfbuzz_la-hb-ot-map.lo `test -f 'hb-ot-map.cc' || echo '$(srcdir)/'`hb-ot-map.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-map.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-map.Plo
 libharfbuzz_la-hb-ot-map.lo: hb-ot-map.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-map.Tpo -c -o libharfbuzz_la-hb-ot-map.lo `test -f 'hb-ot-map.cc' || echo '$(srcdir)/'`hb-ot-map.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-map.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-map.Plo
@@ -2111,6 +2404,13 @@ libharfbuzz_la-hb-ot-shape-complex-indic-table.lo: hb-ot-shape-complex-indic-tab
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-indic-table.lo `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
 
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-indic-table.lo `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
 
+libharfbuzz_la-hb-ot-shape-complex-khmer.lo: hb-ot-shape-complex-khmer.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-khmer.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-khmer.lo `test -f 'hb-ot-shape-complex-khmer.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-khmer.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-khmer.cc' object='libharfbuzz_la-hb-ot-shape-complex-khmer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-khmer.lo `test -f 'hb-ot-shape-complex-khmer.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-khmer.cc
+
 libharfbuzz_la-hb-ot-shape-complex-myanmar.lo: hb-ot-shape-complex-myanmar.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-myanmar.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-myanmar.lo `test -f 'hb-ot-shape-complex-myanmar.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-myanmar.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo
 libharfbuzz_la-hb-ot-shape-complex-myanmar.lo: hb-ot-shape-complex-myanmar.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-myanmar.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-myanmar.lo `test -f 'hb-ot-shape-complex-myanmar.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-myanmar.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo
@@ -2230,6 +2530,118 @@ libharfbuzz_la-hb-icu.lo: hb-icu.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc
 
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc
 
+dump_indic_data-dump-indic-data.o: dump-indic-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-dump-indic-data.o -MD -MP -MF $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo -c -o dump_indic_data-dump-indic-data.o `test -f 'dump-indic-data.cc' || echo '$(srcdir)/'`dump-indic-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo $(DEPDIR)/dump_indic_data-dump-indic-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-indic-data.cc' object='dump_indic_data-dump-indic-data.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-dump-indic-data.o `test -f 'dump-indic-data.cc' || echo '$(srcdir)/'`dump-indic-data.cc
+
+dump_indic_data-dump-indic-data.obj: dump-indic-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-dump-indic-data.obj -MD -MP -MF $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo -c -o dump_indic_data-dump-indic-data.obj `if test -f 'dump-indic-data.cc'; then $(CYGPATH_W) 'dump-indic-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-indic-data.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo $(DEPDIR)/dump_indic_data-dump-indic-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-indic-data.cc' object='dump_indic_data-dump-indic-data.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-dump-indic-data.obj `if test -f 'dump-indic-data.cc'; then $(CYGPATH_W) 'dump-indic-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-indic-data.cc'; fi`
+
+dump_indic_data-hb-ot-shape-complex-indic-table.o: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-hb-ot-shape-complex-indic-table.o -MD -MP -MF $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_indic_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_indic_data-hb-ot-shape-complex-indic-table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+
+dump_indic_data-hb-ot-shape-complex-indic-table.obj: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-hb-ot-shape-complex-indic-table.obj -MD -MP -MF $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_indic_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_indic_data-hb-ot-shape-complex-indic-table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_indic_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+
+dump_khmer_data-dump-khmer-data.o: dump-khmer-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-dump-khmer-data.o -MD -MP -MF $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo -c -o dump_khmer_data-dump-khmer-data.o `test -f 'dump-khmer-data.cc' || echo '$(srcdir)/'`dump-khmer-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo $(DEPDIR)/dump_khmer_data-dump-khmer-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-khmer-data.cc' object='dump_khmer_data-dump-khmer-data.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-dump-khmer-data.o `test -f 'dump-khmer-data.cc' || echo '$(srcdir)/'`dump-khmer-data.cc
+
+dump_khmer_data-dump-khmer-data.obj: dump-khmer-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-dump-khmer-data.obj -MD -MP -MF $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo -c -o dump_khmer_data-dump-khmer-data.obj `if test -f 'dump-khmer-data.cc'; then $(CYGPATH_W) 'dump-khmer-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-khmer-data.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-dump-khmer-data.Tpo $(DEPDIR)/dump_khmer_data-dump-khmer-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-khmer-data.cc' object='dump_khmer_data-dump-khmer-data.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-dump-khmer-data.obj `if test -f 'dump-khmer-data.cc'; then $(CYGPATH_W) 'dump-khmer-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-khmer-data.cc'; fi`
+
+dump_khmer_data-hb-ot-shape-complex-indic-table.o: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-hb-ot-shape-complex-indic-table.o -MD -MP -MF $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_khmer_data-hb-ot-shape-complex-indic-table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+
+dump_khmer_data-hb-ot-shape-complex-indic-table.obj: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_khmer_data-hb-ot-shape-complex-indic-table.obj -MD -MP -MF $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_khmer_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_khmer_data-hb-ot-shape-complex-indic-table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_khmer_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_khmer_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+
+dump_myanmar_data-dump-myanmar-data.o: dump-myanmar-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-dump-myanmar-data.o -MD -MP -MF $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo -c -o dump_myanmar_data-dump-myanmar-data.o `test -f 'dump-myanmar-data.cc' || echo '$(srcdir)/'`dump-myanmar-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-myanmar-data.cc' object='dump_myanmar_data-dump-myanmar-data.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-dump-myanmar-data.o `test -f 'dump-myanmar-data.cc' || echo '$(srcdir)/'`dump-myanmar-data.cc
+
+dump_myanmar_data-dump-myanmar-data.obj: dump-myanmar-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-dump-myanmar-data.obj -MD -MP -MF $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo -c -o dump_myanmar_data-dump-myanmar-data.obj `if test -f 'dump-myanmar-data.cc'; then $(CYGPATH_W) 'dump-myanmar-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-myanmar-data.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Tpo $(DEPDIR)/dump_myanmar_data-dump-myanmar-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-myanmar-data.cc' object='dump_myanmar_data-dump-myanmar-data.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-dump-myanmar-data.obj `if test -f 'dump-myanmar-data.cc'; then $(CYGPATH_W) 'dump-myanmar-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-myanmar-data.cc'; fi`
+
+dump_myanmar_data-hb-ot-shape-complex-indic-table.o: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-hb-ot-shape-complex-indic-table.o -MD -MP -MF $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_myanmar_data-hb-ot-shape-complex-indic-table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.o `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc
+
+dump_myanmar_data-hb-ot-shape-complex-indic-table.obj: hb-ot-shape-complex-indic-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_myanmar_data-hb-ot-shape-complex-indic-table.obj -MD -MP -MF $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='dump_myanmar_data-hb-ot-shape-complex-indic-table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_myanmar_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_myanmar_data-hb-ot-shape-complex-indic-table.obj `if test -f 'hb-ot-shape-complex-indic-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-indic-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-indic-table.cc'; fi`
+
+dump_use_data-dump-use-data.o: dump-use-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-dump-use-data.o -MD -MP -MF $(DEPDIR)/dump_use_data-dump-use-data.Tpo -c -o dump_use_data-dump-use-data.o `test -f 'dump-use-data.cc' || echo '$(srcdir)/'`dump-use-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-dump-use-data.Tpo $(DEPDIR)/dump_use_data-dump-use-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-use-data.cc' object='dump_use_data-dump-use-data.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-dump-use-data.o `test -f 'dump-use-data.cc' || echo '$(srcdir)/'`dump-use-data.cc
+
+dump_use_data-dump-use-data.obj: dump-use-data.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-dump-use-data.obj -MD -MP -MF $(DEPDIR)/dump_use_data-dump-use-data.Tpo -c -o dump_use_data-dump-use-data.obj `if test -f 'dump-use-data.cc'; then $(CYGPATH_W) 'dump-use-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-use-data.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-dump-use-data.Tpo $(DEPDIR)/dump_use_data-dump-use-data.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='dump-use-data.cc' object='dump_use_data-dump-use-data.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-dump-use-data.obj `if test -f 'dump-use-data.cc'; then $(CYGPATH_W) 'dump-use-data.cc'; else $(CYGPATH_W) '$(srcdir)/dump-use-data.cc'; fi`
+
+dump_use_data-hb-ot-shape-complex-use-table.o: hb-ot-shape-complex-use-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-hb-ot-shape-complex-use-table.o -MD -MP -MF $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo -c -o dump_use_data-hb-ot-shape-complex-use-table.o `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='dump_use_data-hb-ot-shape-complex-use-table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-hb-ot-shape-complex-use-table.o `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc
+
+dump_use_data-hb-ot-shape-complex-use-table.obj: hb-ot-shape-complex-use-table.cc
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_use_data-hb-ot-shape-complex-use-table.obj -MD -MP -MF $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo -c -o dump_use_data-hb-ot-shape-complex-use-table.obj `if test -f 'hb-ot-shape-complex-use-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-use-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-use-table.cc'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='dump_use_data-hb-ot-shape-complex-use-table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_use_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_use_data-hb-ot-shape-complex-use-table.obj `if test -f 'hb-ot-shape-complex-use-table.cc'; then $(CYGPATH_W) 'hb-ot-shape-complex-use-table.cc'; else $(CYGPATH_W) '$(srcdir)/hb-ot-shape-complex-use-table.cc'; fi`
+
 main-main.o: main.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(main_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT main-main.o -MD -MP -MF $(DEPDIR)/main-main.Tpo -c -o main-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/main-main.Tpo $(DEPDIR)/main-main.Po
 main-main.o: main.cc
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(main_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT main-main.o -MD -MP -MF $(DEPDIR)/main-main.Tpo -c -o main-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) $(DEPDIR)/main-main.Tpo $(DEPDIR)/main-main.Po
@@ -2319,6 +2731,27 @@ mostlyclean-libtool:
 
 clean-libtool:
        -rm -rf .libs _libs
 
 clean-libtool:
        -rm -rf .libs _libs
+install-cmakeDATA: $(cmake_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(cmake_DATA)'; test -n "$(cmakedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(cmakedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(cmakedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cmakedir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(cmakedir)" || exit $$?; \
+       done
+
+uninstall-cmakeDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(cmake_DATA)'; test -n "$(cmakedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(cmakedir)'; $(am__uninstall_files_from_dir)
 install-girDATA: $(gir_DATA)
        @$(NORMAL_INSTALL)
        @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
 install-girDATA: $(gir_DATA)
        @$(NORMAL_INSTALL)
        @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
@@ -2554,7 +2987,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
        if test -n "$$am__remaking_logs"; then \
          echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
               "recursion detected" >&2; \
        if test -n "$$am__remaking_logs"; then \
          echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
               "recursion detected" >&2; \
-       else \
+       elif test -n "$$redo_logs"; then \
          am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
        fi; \
        if $(am__make_dryrun); then :; else \
          am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
        fi; \
        if $(am__make_dryrun); then :; else \
@@ -2672,9 +3105,9 @@ check-c-linkage-decls.sh.log: check-c-linkage-decls.sh
        --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)
        --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-defs.sh.log: check-defs.sh
-       @p='check-defs.sh'; \
-       b='check-defs.sh'; \
+check-externs.sh.log: check-externs.sh
+       @p='check-externs.sh'; \
+       b='check-externs.sh'; \
        $(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) \
        $(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) \
@@ -2693,13 +3126,6 @@ check-includes.sh.log: check-includes.sh
        --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)
        --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'; \
-       $(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'; \
 check-static-inits.sh.log: check-static-inits.sh
        @p='check-static-inits.sh'; \
        b='check-static-inits.sh'; \
@@ -2714,6 +3140,13 @@ check-symbols.sh.log: check-symbols.sh
        --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)
        --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'; \
+       $(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-ot-tag.log: test-ot-tag$(EXEEXT)
        @p='test-ot-tag$(EXEEXT)'; \
        b='test-ot-tag'; \
@@ -2721,6 +3154,13 @@ test-ot-tag.log: test-ot-tag$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
        --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'; \
+       $(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); \
 .test.log:
        @p='$<'; \
        $(am__set_b); \
@@ -2802,7 +3242,7 @@ install-binPROGRAMS: install-libLTLIBRARIES
 
 installdirs: installdirs-recursive
 installdirs-am:
 
 installdirs: installdirs-recursive
 installdirs-am:
-       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"; do \
+       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"; do \
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
 install: $(BUILT_SOURCES)
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
 install: $(BUILT_SOURCES)
@@ -2867,9 +3307,9 @@ info: info-recursive
 
 info-am:
 
 
 info-am:
 
-install-data-am: install-girDATA install-nodist_pkgincludeHEADERS \
-       install-pkgconfigDATA install-pkgincludeHEADERS \
-       install-typelibDATA
+install-data-am: install-cmakeDATA install-girDATA \
+       install-nodist_pkgincludeHEADERS install-pkgconfigDATA \
+       install-pkgincludeHEADERS install-typelibDATA
 
 install-dvi: install-dvi-recursive
 
 
 install-dvi: install-dvi-recursive
 
@@ -2915,10 +3355,10 @@ ps: ps-recursive
 
 ps-am:
 
 
 ps-am:
 
-uninstall-am: uninstall-binPROGRAMS uninstall-girDATA \
-       uninstall-libLTLIBRARIES uninstall-nodist_pkgincludeHEADERS \
-       uninstall-pkgconfigDATA uninstall-pkgincludeHEADERS \
-       uninstall-typelibDATA
+uninstall-am: uninstall-binPROGRAMS uninstall-cmakeDATA \
+       uninstall-girDATA uninstall-libLTLIBRARIES \
+       uninstall-nodist_pkgincludeHEADERS uninstall-pkgconfigDATA \
+       uninstall-pkgincludeHEADERS uninstall-typelibDATA
 
 .MAKE: $(am__recursive_targets) all check check-am install install-am \
        install-strip
 
 .MAKE: $(am__recursive_targets) all check check-am install install-am \
        install-strip
@@ -2930,9 +3370,9 @@ uninstall-am: uninstall-binPROGRAMS uninstall-girDATA \
        ctags-am distclean distclean-compile distclean-generic \
        distclean-libtool distclean-tags distdir dvi dvi-am html \
        html-am info info-am install install-am install-binPROGRAMS \
        ctags-am distclean distclean-compile distclean-generic \
        distclean-libtool distclean-tags distdir dvi dvi-am html \
        html-am info info-am install install-am install-binPROGRAMS \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-girDATA install-html \
-       install-html-am install-info install-info-am \
+       install-cmakeDATA install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-girDATA \
+       install-html install-html-am install-info install-info-am \
        install-libLTLIBRARIES install-man \
        install-nodist_pkgincludeHEADERS install-pdf install-pdf-am \
        install-pkgconfigDATA install-pkgincludeHEADERS install-ps \
        install-libLTLIBRARIES install-man \
        install-nodist_pkgincludeHEADERS install-pdf install-pdf-am \
        install-pkgconfigDATA install-pkgincludeHEADERS install-ps \
@@ -2941,18 +3381,25 @@ uninstall-am: uninstall-binPROGRAMS uninstall-girDATA \
        installdirs-am maintainer-clean maintainer-clean-generic \
        mostlyclean mostlyclean-compile mostlyclean-generic \
        mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
        installdirs-am maintainer-clean maintainer-clean-generic \
        mostlyclean mostlyclean-compile mostlyclean-generic \
        mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
-       uninstall uninstall-am uninstall-binPROGRAMS uninstall-girDATA \
-       uninstall-libLTLIBRARIES uninstall-nodist_pkgincludeHEADERS \
-       uninstall-pkgconfigDATA uninstall-pkgincludeHEADERS \
-       uninstall-typelibDATA
+       uninstall uninstall-am uninstall-binPROGRAMS \
+       uninstall-cmakeDATA uninstall-girDATA uninstall-libLTLIBRARIES \
+       uninstall-nodist_pkgincludeHEADERS uninstall-pkgconfigDATA \
+       uninstall-pkgincludeHEADERS uninstall-typelibDATA
+
+.PRECIOUS: Makefile
 
 
 # The following warning options are useful for debugging: -Wpadded
 #AM_CXXFLAGS =
 
 # Convenience targets:
 
 
 # The following warning options are useful for debugging: -Wpadded
 #AM_CXXFLAGS =
 
 # Convenience targets:
-lib: $(BUILT_SOURCES) libharfbuzz.la
+lib: $(BUILT_SOURCES) libharfbuzz.la libharfbuzz-subset.la
 fuzzing: $(BUILT_SOURCES) libharfbuzz-fuzzing.la
 fuzzing: $(BUILT_SOURCES) libharfbuzz-fuzzing.la
+@HAVE_UCDN_TRUE@hb-ucdn/libhb-ucdn.la: ucdn
+@HAVE_UCDN_TRUE@ucdn:
+@HAVE_UCDN_TRUE@       @$(MAKE) $(AM_MAKEFLAGS) -C hb-ucdn
+
+@CODE_COVERAGE_RULES@
 @HAVE_GOBJECT_TRUE@hb-gobject-enums.%: hb-gobject-enums.%.tmpl $(HBHEADERS)
 @HAVE_GOBJECT_TRUE@    $(AM_V_GEN) $(GLIB_MKENUMS) \
 @HAVE_GOBJECT_TRUE@            --identifier-prefix hb_ --symbol-prefix hb_gobject \
 @HAVE_GOBJECT_TRUE@hb-gobject-enums.%: hb-gobject-enums.%.tmpl $(HBHEADERS)
 @HAVE_GOBJECT_TRUE@    $(AM_V_GEN) $(GLIB_MKENUMS) \
 @HAVE_GOBJECT_TRUE@            --identifier-prefix hb_ --symbol-prefix hb_gobject \
@@ -2971,16 +3418,15 @@ fuzzing: $(BUILT_SOURCES) libharfbuzz-fuzzing.la
                -e 's@%VERSION%@$(VERSION)@g' \
        "$<" > "$@" \
        || ($(RM) "$@"; false)
                -e 's@%VERSION%@$(VERSION)@g' \
        "$<" > "$@" \
        || ($(RM) "$@"; false)
+check: $(DEF_FILES) # For check-symbols.sh
 harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
 harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
-       $(AM_V_GEN) (echo EXPORTS; \
-       (cat $^ || echo 'hb_ERROR ()' ) | \
-       $(EGREP) '^hb_.* \(' | \
-       sed -e 's/ (.*//' | \
-       LC_ALL=C sort; \
-       echo LIBRARY libharfbuzz-0.dll; \
-       ) >"$@"
-       @ ! grep -q hb_ERROR "$@" \
-       || ($(RM) "$@"; false)
+       $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
+harfbuzz-subset.def: $(HB_SUBSET_headers)
+       $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
+harfbuzz-icu.def: $(HB_ICU_headers)
+       $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
+harfbuzz-gobject.def: $(HB_GOBJECT_headers)
+       $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
 
 unicode-tables: arabic-table indic-table use-table
 
 
 unicode-tables: arabic-table indic-table use-table
 
@@ -2999,12 +3445,12 @@ use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.tx
 built-sources: $(BUILT_SOURCES)
 
 .PHONY: unicode-tables arabic-table indic-table use-table built-sources
 built-sources: $(BUILT_SOURCES)
 
 .PHONY: unicode-tables arabic-table indic-table use-table built-sources
+# We decided to add ragel-generated files to git...
+#MAINTAINERCLEANFILES += $(RAGEL_GENERATED)
 $(srcdir)/%.hh: $(srcdir)/%.rl
        $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \
        || ($(RM) "$@"; false)
 
 $(srcdir)/%.hh: $(srcdir)/%.rl
        $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \
        || ($(RM) "$@"; false)
 
-check: harfbuzz.def # For check-defs.sh
-
 @HAVE_INTROSPECTION_TRUE@-include $(INTROSPECTION_MAKEFILE)
 
 @HAVE_INTROSPECTION_TRUE@HarfBuzz-0.0.gir: libharfbuzz.la libharfbuzz-gobject.la
 @HAVE_INTROSPECTION_TRUE@-include $(INTROSPECTION_MAKEFILE)
 
 @HAVE_INTROSPECTION_TRUE@HarfBuzz-0.0.gir: libharfbuzz.la libharfbuzz-gobject.la
index 51e687b..787c3c4 100644 (file)
@@ -1,5 +1,3 @@
-NULL =
-
 # Base and default-included sources and headers
 
 HB_BASE_sources = \
 # Base and default-included sources and headers
 
 HB_BASE_sources = \
@@ -8,8 +6,9 @@ HB_BASE_sources = \
        hb-buffer-private.hh \
        hb-buffer-serialize.cc \
        hb-buffer.cc \
        hb-buffer-private.hh \
        hb-buffer-serialize.cc \
        hb-buffer.cc \
-       hb-cache-private.hh \
        hb-common.cc \
        hb-common.cc \
+       hb-debug.hh \
+       hb-dsalgs.hh \
        hb-face-private.hh \
        hb-face.cc \
        hb-font-private.hh \
        hb-face-private.hh \
        hb-face.cc \
        hb-font-private.hh \
@@ -18,18 +17,23 @@ HB_BASE_sources = \
        hb-object-private.hh \
        hb-open-file-private.hh \
        hb-open-type-private.hh \
        hb-object-private.hh \
        hb-open-file-private.hh \
        hb-open-type-private.hh \
-       hb-ot-cbdt-table.hh \
+       hb-ot-color-cbdt-table.hh \
        hb-ot-cmap-table.hh \
        hb-ot-glyf-table.hh \
        hb-ot-cmap-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-head-table.hh \
        hb-ot-hhea-table.hh \
        hb-ot-hmtx-table.hh \
+       hb-ot-kern-table.hh \
        hb-ot-maxp-table.hh \
        hb-ot-name-table.hh \
        hb-ot-os2-table.hh \
        hb-ot-maxp-table.hh \
        hb-ot-name-table.hh \
        hb-ot-os2-table.hh \
+       hb-ot-os2-unicode-ranges.hh \
+       hb-ot-post-macroman.hh \
        hb-ot-post-table.hh \
        hb-ot-tag.cc \
        hb-private.hh \
        hb-ot-post-table.hh \
        hb-ot-tag.cc \
        hb-private.hh \
+       hb-set-digest-private.hh \
        hb-set-private.hh \
        hb-set.cc \
        hb-shape.cc \
        hb-set-private.hh \
        hb-set.cc \
        hb-shape.cc \
@@ -39,6 +43,7 @@ HB_BASE_sources = \
        hb-shaper-impl-private.hh \
        hb-shaper-private.hh \
        hb-shaper.cc \
        hb-shaper-impl-private.hh \
        hb-shaper-private.hh \
        hb-shaper.cc \
+       hb-string-array.hh \
        hb-unicode-private.hh \
        hb-unicode.cc \
        hb-utf-private.hh \
        hb-unicode-private.hh \
        hb-unicode.cc \
        hb-utf-private.hh \
@@ -66,17 +71,24 @@ HB_BASE_headers = \
        hb-shape.h \
        hb-shape-plan.h \
        hb-unicode.h \
        hb-shape.h \
        hb-shape-plan.h \
        hb-unicode.h \
-       $(NULL)
-
-HB_NODIST_headers = \
        hb-version.h \
        $(NULL)
 
        hb-version.h \
        $(NULL)
 
-HB_FALLBACK_sources = hb-fallback-shape.cc
+HB_FALLBACK_sources = \
+       hb-fallback-shape.cc    \
+       $(NULL)
 
 HB_OT_sources = \
 
 HB_OT_sources = \
+       hb-aat-layout.cc \
+       hb-aat-layout-common-private.hh \
+       hb-aat-layout-ankr-table.hh \
+       hb-aat-layout-kerx-table.hh \
+       hb-aat-layout-morx-table.hh \
+       hb-aat-layout-trak-table.hh \
+       hb-aat-layout-private.hh \
        hb-ot-font.cc \
        hb-ot-layout.cc \
        hb-ot-font.cc \
        hb-ot-layout.cc \
+       hb-ot-layout-base-table.hh \
        hb-ot-layout-common-private.hh \
        hb-ot-layout-gdef-table.hh \
        hb-ot-layout-gpos-table.hh \
        hb-ot-layout-common-private.hh \
        hb-ot-layout-gdef-table.hh \
        hb-ot-layout-gpos-table.hh \
@@ -84,6 +96,9 @@ HB_OT_sources = \
        hb-ot-layout-gsub-table.hh \
        hb-ot-layout-jstf-table.hh \
        hb-ot-layout-private.hh \
        hb-ot-layout-gsub-table.hh \
        hb-ot-layout-jstf-table.hh \
        hb-ot-layout-private.hh \
+       hb-ot-color.cc \
+       hb-ot-color-colr-table.hh \
+       hb-ot-color-cpal-table.hh \
        hb-ot-map.cc \
        hb-ot-map-private.hh \
        hb-ot-math.cc \
        hb-ot-map.cc \
        hb-ot-map-private.hh \
        hb-ot-math.cc \
@@ -100,6 +115,9 @@ HB_OT_sources = \
        hb-ot-shape-complex-indic.cc \
        hb-ot-shape-complex-indic-private.hh \
        hb-ot-shape-complex-indic-table.cc \
        hb-ot-shape-complex-indic.cc \
        hb-ot-shape-complex-indic-private.hh \
        hb-ot-shape-complex-indic-table.cc \
+       hb-ot-shape-complex-khmer-private.hh \
+       hb-ot-shape-complex-khmer.cc \
+       hb-ot-shape-complex-myanmar-private.hh \
        hb-ot-shape-complex-myanmar.cc \
        hb-ot-shape-complex-thai.cc \
        hb-ot-shape-complex-tibetan.cc \
        hb-ot-shape-complex-myanmar.cc \
        hb-ot-shape-complex-thai.cc \
        hb-ot-shape-complex-tibetan.cc \
@@ -121,11 +139,13 @@ HB_OT_sources = \
 
 HB_OT_RAGEL_GENERATED_sources = \
        hb-ot-shape-complex-indic-machine.hh \
 
 HB_OT_RAGEL_GENERATED_sources = \
        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 \
        $(NULL)
 HB_OT_RAGEL_sources = \
        hb-ot-shape-complex-indic-machine.rl \
        hb-ot-shape-complex-myanmar-machine.hh \
        hb-ot-shape-complex-use-machine.hh \
        $(NULL)
 HB_OT_RAGEL_sources = \
        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 \
        $(NULL)
        hb-ot-shape-complex-myanmar-machine.rl \
        hb-ot-shape-complex-use-machine.rl \
        $(NULL)
@@ -169,8 +189,26 @@ HB_UCDN_sources  = hb-ucdn.cc
 HB_ICU_sources = hb-icu.cc
 HB_ICU_headers = hb-icu.h
 
 HB_ICU_sources = hb-icu.cc
 HB_ICU_headers = hb-icu.h
 
-HB_GOBJECT_sources = hb-gobject-structs.cc
-HB_GOBJECT_STRUCTS_headers = hb-gobject-structs.h
-HB_GOBJECT_headers = hb-gobject.h $(HB_GOBJECT_STRUCTS_headers)
+# Sources for libharfbuzz-subset
+HB_SUBSET_sources = \
+       hb-subset.cc \
+       hb-subset-glyf.cc \
+       hb-subset-input.cc \
+       hb-subset-plan.cc \
+       $(NULL)
+
+HB_SUBSET_headers = \
+       hb-subset.h \
+       hb-subset-glyf.hh \
+       hb-subset-plan.hh \
+       hb-subset-private.hh \
+       $(NULL)
+
+HB_GOBJECT_DIST_sources = hb-gobject-structs.cc
+HB_GOBJECT_DIST_headers = hb-gobject.h hb-gobject-structs.h
 HB_GOBJECT_ENUM_sources = hb-gobject-enums.cc
 HB_GOBJECT_ENUM_headers = hb-gobject-enums.h
 HB_GOBJECT_ENUM_sources = hb-gobject-enums.cc
 HB_GOBJECT_ENUM_headers = hb-gobject-enums.h
+HB_GOBJECT_NODIST_sources = $(HB_GOBJECT_ENUM_sources)
+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)
index b10310f..8234abc 100755 (executable)
@@ -7,18 +7,17 @@ test -z "$srcdir" && srcdir=.
 stat=0
 
 test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
 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*.h'`
-
+test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.cc'`
 
 for x in $HBHEADERS; do
 
 for x in $HBHEADERS; do
-       test -f $srcdir/$x && x=$srcdir/$x
+       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
        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 && x=$srcdir/$x
+       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
        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
diff --git a/src/check-defs.sh b/src/check-defs.sh
deleted file mode 100755 (executable)
index 65a2467..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/sh
-
-LC_ALL=C
-export LC_ALL
-
-test -z "$srcdir" && srcdir=.
-test -z "$MAKE" && MAKE=make
-stat=0
-
-if which nm 2>/dev/null >/dev/null; then
-       :
-else
-       echo "check-defs.sh: 'nm' not found; skipping test"
-       exit 77
-fi
-
-defs="harfbuzz.def"
-$MAKE $defs > /dev/null
-tested=false
-for def in $defs; do
-       lib=`echo "$def" | sed 's/[.]def$//;s@.*/@@'`
-       so=.libs/lib${lib}.so
-
-       EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] ' | grep -v ' _fini\>\| _init\>\| _fdata\>\| _ftext\>\| _fbss\>\| __bss_start\>\| __bss_start__\>\| __bss_end__\>\| _edata\>\| _end\>\| _bss_end__\>\| __end__\>\| __gcov_flush\>\| llvm_' | cut -d' ' -f3`"
-
-       if test -f "$so"; then
-
-               echo "Checking that $so has the same symbol list as $def"
-               {
-                       echo EXPORTS
-                       echo "$EXPORTED_SYMBOLS"
-                       # cheat: copy the last line from the def file!
-                       tail -n1 "$def"
-               } | diff "$def" - >&2 || stat=1
-
-               tested=true
-       fi
-done
-if ! $tested; then
-       echo "check-defs.sh: libharfbuzz shared library not found; skipping test"
-       exit 77
-fi
-
-exit $stat
diff --git a/src/check-externs.sh b/src/check-externs.sh
new file mode 100755 (executable)
index 0000000..a6de375
--- /dev/null
@@ -0,0 +1,22 @@
+#!/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
index 09c5ea8..b67640f 100755 (executable)
@@ -6,11 +6,11 @@ export LC_ALL
 test -z "$srcdir" && srcdir=.
 stat=0
 
 test -z "$srcdir" && srcdir=.
 stat=0
 
-test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'`
+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 "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" && x="$srcdir/$x"
+       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_'`
        echo "$x" | grep -q '[^h]$' && continue;
        xx=`echo "$x" | sed 's@.*/@@'`
        tag=`echo "$xx" | tr 'a-z.-' 'A-Z_'`
index 902f235..fd565da 100755 (executable)
@@ -13,7 +13,7 @@ test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb-
 echo 'Checking that public header files #include "hb-common.h" or "hb.h" first (or none)'
 
 for x in $HBHEADERS; do
 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" && x="$srcdir/$x"
+       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 '#.*\<include\>' "$x" /dev/null | head -n 1
 done |
 grep -v '"hb-common[.]h"' |
@@ -26,7 +26,7 @@ grep . >&2 && stat=1
 echo 'Checking that source files #include "hb-*private.hh" first (or none)'
 
 for x in $HBSOURCES; do
 echo 'Checking that source files #include "hb-*private.hh" first (or none)'
 
 for x in $HBSOURCES; do
-       test -f "$srcdir/$x" && x="$srcdir/$x"
+       test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x"
        grep '#.*\<include\>' "$x" /dev/null | grep -v 'include _' | head -n 1
 done |
 grep -v '"hb-.*private[.]hh"' |
        grep '#.*\<include\>' "$x" /dev/null | grep -v 'include _' | head -n 1
 done |
 grep -v '"hb-.*private[.]hh"' |
@@ -34,7 +34,7 @@ grep -v 'hb-private[.]hh:' |
 grep . >&2 && stat=1
 
 
 grep . >&2 && stat=1
 
 
-echo 'Checking that there is no #include <hb.*.h>'
+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
 for x in $HBHEADERS $HBSOURCES; do
        test -f "$srcdir/$x" && x="$srcdir/$x"
        grep '#.*\<include\>.*<.*hb' "$x" /dev/null >&2 && stat=1
index b541828..ce0bdab 100755 (executable)
@@ -4,27 +4,37 @@ LC_ALL=C
 export LC_ALL
 
 test -z "$srcdir" && srcdir=.
 export LC_ALL
 
 test -z "$srcdir" && srcdir=.
+test -z "$libs" && libs=.libs
 stat=0
 
 
 if which ldd 2>/dev/null >/dev/null; then
 stat=0
 
 
 if which ldd 2>/dev/null >/dev/null; then
-       :
+       LDD=ldd
 else
 else
-       echo "check-libstdc++.sh: 'ldd' not found; skipping test"
-       exit 77
+       # 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
 fi
 
 tested=false
-for suffix in so dylib; do
-       so=.libs/libharfbuzz.$suffix
-       if ! test -f "$so"; then continue; fi
+# 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++"
-       if ldd $so | grep 'libstdc[+][+]\|libc[+][+]'; then
-               echo "Ouch, linked to libstdc++ or libc++"
-               stat=1
-       fi
-       tested=true
+               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"
 done
 if ! $tested; then
        echo "check-libstdc++.sh: libharfbuzz shared library not found; skipping test"
index 1446fa7..71551cb 100755 (executable)
@@ -4,6 +4,7 @@ LC_ALL=C
 export LC_ALL
 
 test -z "$srcdir" && srcdir=.
 export LC_ALL
 
 test -z "$srcdir" && srcdir=.
+test -z "$libs" && libs=.libs
 stat=0
 
 
 stat=0
 
 
@@ -14,7 +15,7 @@ else
        exit 77
 fi
 
        exit 77
 fi
 
-OBJS=.libs/*.o
+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
 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
index ba09ba1..bfc93b3 100755 (executable)
@@ -4,8 +4,10 @@ LC_ALL=C
 export LC_ALL
 
 test -z "$srcdir" && srcdir=.
 export LC_ALL
 
 test -z "$srcdir" && srcdir=.
+test -z "$libs" && libs=.libs
 stat=0
 
 stat=0
 
+IGNORED_SYMBOLS='_fini\|_init\|_fdata\|_ftext\|_fbss\|__bss_start\|__bss_start__\|__bss_end__\|_edata\|_end\|_bss_end__\|__end__\|__gcov_flush\|llvm_.*'
 
 if which nm 2>/dev/null >/dev/null; then
        :
 
 if which nm 2>/dev/null >/dev/null; then
        :
@@ -14,29 +16,46 @@ else
        exit 77
 fi
 
        exit 77
 fi
 
-echo "Checking that we are not exposing internal symbols"
 tested=false
 tested=false
-for suffix in so dylib; do
-       so=.libs/libharfbuzz.$suffix
-       if ! test -f "$so"; then continue; fi
-
-       EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] ' | grep -v ' _fini\>\| _init\>\| _fdata\>\| _ftext\>\| _fbss\>\| __bss_start\>\| __bss_start__\>\| __bss_end__\>\| _edata\>\| _end\>\| _bss_end__\>\| __end__\>\| __gcov_flush\>\| ___gcov_flush\>\| llvm_\| _llvm_' | cut -d' ' -f3`"
-
-       prefix=`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'`
-
-       # On mac, C symbols are prefixed with _
-       if test $suffix = dylib; then prefix="_$prefix"; fi
-
-       echo "Processing $so"
-       if echo "$EXPORTED_SYMBOLS" | grep -v "^${prefix}_"; then
-               echo "Ouch, internal symbols exposed"
-               stat=1
-       fi
-
-       tested=true
+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 ' [BCDGINRSTVW] .' | grep -v " $symprefix\\($IGNORED_SYMBOLS\\>\\)" | cut -d' ' -f3 | c++filt`"
+
+               prefix=$symprefix`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'`
+
+               echo
+               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
+                       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
 done
 if ! $tested; then
-       echo "check-symbols.sh: no shared library found; skipping test"
+       echo "check-symbols.sh: no shared libraries found; skipping test"
        exit 77
 fi
 
        exit 77
 fi
 
diff --git a/src/dump-indic-data.cc b/src/dump-indic-data.cc
new file mode 100644 (file)
index 0000000..d574138
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-indic-private.hh"
+
+int
+main (void)
+{
+  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+  {
+    hb_glyph_info_t info;
+    info.codepoint = u;
+    set_indic_properties (info);
+    if (info.indic_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
+       info.indic_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
+      printf("U+%04X   %u      %u\n", u,
+            info.indic_category(),
+            info.indic_position());
+  }
+}
diff --git a/src/dump-khmer-data.cc b/src/dump-khmer-data.cc
new file mode 100644 (file)
index 0000000..7dd09b2
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-khmer-private.hh"
+
+int
+main (void)
+{
+  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+  {
+    hb_glyph_info_t info;
+    info.codepoint = u;
+    set_khmer_properties (info);
+    if (info.khmer_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
+       info.khmer_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
+      printf("U+%04X   %u      %u\n", u,
+            info.khmer_category(),
+            info.khmer_position());
+  }
+}
diff --git a/src/dump-myanmar-data.cc b/src/dump-myanmar-data.cc
new file mode 100644 (file)
index 0000000..2df9cd9
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-myanmar-private.hh"
+
+int
+main (void)
+{
+  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+  {
+    hb_glyph_info_t info;
+    info.codepoint = u;
+    set_myanmar_properties (info);
+    if (info.myanmar_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
+       info.myanmar_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
+      printf("U+%04X   %u      %u\n", u,
+            info.myanmar_category(),
+            info.myanmar_position());
+  }
+}
diff --git a/src/dump-use-data.cc b/src/dump-use-data.cc
new file mode 100644 (file)
index 0000000..0e64688
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-use-private.hh"
+
+int
+main (void)
+{
+  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
+  {
+    unsigned int category = hb_use_get_category (u);
+    if (category != USE_O)
+      printf("U+%04X   %u\n", u, category);
+  }
+}
index 308435f..59bd760 100755 (executable)
@@ -134,7 +134,7 @@ def print_joining_table(f):
                for (start,end) in ranges:
                        if p not in [start>>page_bits, end>>page_bits]: continue
                        offset = "joining_offset_0x%04xu" % start
                for (start,end) in ranges:
                        if p not in [start>>page_bits, end>>page_bits]: continue
                        offset = "joining_offset_0x%04xu" % start
-                       print "      if (hb_in_range (u, 0x%04Xu, 0x%04Xu)) return joining_table[u - 0x%04Xu + %s];" % (start, end, start, offset)
+                       print "      if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return joining_table[u - 0x%04Xu + %s];" % (start, end, start, offset)
                print "      break;"
                print ""
        print "    default:"
                print "      break;"
                print ""
        print "    default:"
diff --git a/src/gen-def.py b/src/gen-def.py
new file mode 100755 (executable)
index 0000000..1673537
--- /dev/null
@@ -0,0 +1,19 @@
+#!/usr/bin/env python
+
+from __future__ import print_function
+
+import io, os, re, sys
+
+headers_content = []
+for h in os.environ["headers"].split (' '):
+       if h.endswith (".h"):
+               with io.open(h, encoding='utf8') as f: headers_content.append (f.read ())
+
+result = """EXPORTS
+%s
+LIBRARY lib%s-0.dll""" % (
+       "\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M))),
+       sys.argv[1].replace ('.def', '')
+)
+
+with open (sys.argv[1], "w") as f: f.write (result)
index 3016cd0..735b901 100755 (executable)
@@ -229,13 +229,13 @@ print "  {"
 pages = set([u>>page_bits for u in starts+ends+singles.keys()])
 for p in sorted(pages):
        print "    case 0x%0Xu:" % p
 pages = set([u>>page_bits for u in starts+ends+singles.keys()])
 for p in sorted(pages):
        print "    case 0x%0Xu:" % p
-       for (start,end) in zip (starts, ends):
-               if p not in [start>>page_bits, end>>page_bits]: continue
-               offset = "indic_offset_0x%04xu" % start
-               print "      if (hb_in_range (u, 0x%04Xu, 0x%04Xu)) return indic_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset)
        for u,d in singles.items ():
                if p != u>>page_bits: continue
                print "      if (unlikely (u == 0x%04Xu)) return _(%s,%s);" % (u, short[0][d[0]], short[1][d[1]])
        for u,d in singles.items ():
                if p != u>>page_bits: continue
                print "      if (unlikely (u == 0x%04Xu)) return _(%s,%s);" % (u, short[0][d[0]], short[1][d[1]])
+       for (start,end) in zip (starts, ends):
+               if p not in [start>>page_bits, end>>page_bits]: continue
+               offset = "indic_offset_0x%04xu" % start
+               print "      if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return indic_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset)
        print "      break;"
        print ""
 print "    default:"
        print "      break;"
        print ""
 print "    default:"
index a922c92..0681725 100755 (executable)
@@ -44,6 +44,7 @@ defaults = ('Other', 'Not_Applicable', 'Cn', 'No_Block')
 # TODO Characters that are not in Unicode Indic files, but used in USE
 data[0][0x034F] = defaults[0]
 data[0][0x2060] = defaults[0]
 # TODO Characters that are not in Unicode Indic files, but used in USE
 data[0][0x034F] = defaults[0]
 data[0][0x2060] = defaults[0]
+data[0][0x20F0] = defaults[0]
 for u in range (0xFE00, 0xFE0F + 1):
        data[0][u] = defaults[0]
 
 for u in range (0xFE00, 0xFE0F + 1):
        data[0][u] = defaults[0]
 
@@ -117,6 +118,7 @@ property_names = [
        'Top_And_Right',
        'Top_And_Left',
        'Top_And_Left_And_Right',
        'Top_And_Right',
        'Top_And_Left',
        'Top_And_Left_And_Right',
+       'Bottom_And_Left',
        'Bottom_And_Right',
        'Top_And_Bottom_And_Right',
        'Overstruck',
        'Bottom_And_Right',
        'Top_And_Bottom_And_Right',
        'Overstruck',
@@ -153,7 +155,7 @@ def is_BASE(U, UISC, UGC):
 def is_BASE_IND(U, UISC, UGC):
        #SPEC-DRAFT return (UISC in [Consonant_Dead, Modifying_Letter] or UGC == Po)
        return (UISC in [Consonant_Dead, Modifying_Letter] or
 def is_BASE_IND(U, UISC, UGC):
        #SPEC-DRAFT return (UISC in [Consonant_Dead, Modifying_Letter] or UGC == Po)
        return (UISC in [Consonant_Dead, Modifying_Letter] or
-               (UGC == Po and not U in [0x104E, 0x2022]) or
+               (UGC == Po and not U in [0x104E, 0x2022, 0x11A3F, 0x11A45]) or
                False # SPEC-DRAFT-OUTDATED! U == 0x002D
                )
 def is_BASE_NUM(U, UISC, UGC):
                False # SPEC-DRAFT-OUTDATED! U == 0x002D
                )
 def is_BASE_NUM(U, UISC, UGC):
@@ -177,6 +179,8 @@ def is_CONS_MOD(U, UISC, UGC):
 def is_CONS_SUB(U, UISC, UGC):
        #SPEC-DRAFT return UISC == Consonant_Subjoined
        return UISC == Consonant_Subjoined and UGC != Lo
 def is_CONS_SUB(U, UISC, UGC):
        #SPEC-DRAFT return UISC == Consonant_Subjoined
        return UISC == Consonant_Subjoined and UGC != Lo
+def is_CONS_WITH_STACKER(U, UISC, UGC):
+       return UISC == Consonant_With_Stacker
 def is_HALANT(U, UISC, UGC):
        return UISC in [Virama, Invisible_Stacker]
 def is_HALANT_NUM(U, UISC, UGC):
 def is_HALANT(U, UISC, UGC):
        return UISC in [Virama, Invisible_Stacker]
 def is_HALANT_NUM(U, UISC, UGC):
@@ -198,9 +202,7 @@ def is_OTHER(U, UISC, UGC):
 def is_Reserved(U, UISC, UGC):
        return UGC == 'Cn'
 def is_REPHA(U, UISC, UGC):
 def is_Reserved(U, UISC, UGC):
        return UGC == 'Cn'
 def is_REPHA(U, UISC, UGC):
-       #return UISC == Consonant_Preceding_Repha
-       #SPEC-OUTDATED hack to categorize Consonant_With_Stacker and Consonant_Prefixed
-       return UISC in [Consonant_Preceding_Repha, Consonant_With_Stacker, Consonant_Prefixed]
+       return UISC in [Consonant_Preceding_Repha, Consonant_Prefixed]
 def is_SYM(U, UISC, UGC):
        if U == 0x25CC: return False #SPEC-DRAFT
        #SPEC-DRAFT return UGC in [So, Sc] or UISC == Symbol_Letter
 def is_SYM(U, UISC, UGC):
        if U == 0x25CC: return False #SPEC-DRAFT
        #SPEC-DRAFT return UGC in [So, Sc] or UISC == Symbol_Letter
@@ -210,11 +212,13 @@ def is_SYM_MOD(U, UISC, UGC):
 def is_VARIATION_SELECTOR(U, UISC, UGC):
        return 0xFE00 <= U <= 0xFE0F
 def is_VOWEL(U, UISC, UGC):
 def is_VARIATION_SELECTOR(U, UISC, UGC):
        return 0xFE00 <= U <= 0xFE0F
 def is_VOWEL(U, UISC, UGC):
+       # https://github.com/roozbehp/unicode-data/issues/6
        return (UISC == Pure_Killer or
        return (UISC == Pure_Killer or
-               (UGC != Lo and UISC in [Vowel, Vowel_Dependent]))
+               (UGC != Lo and UISC in [Vowel, Vowel_Dependent] and U not in [0xAA29]))
 def is_VOWEL_MOD(U, UISC, UGC):
 def is_VOWEL_MOD(U, UISC, UGC):
+       # https://github.com/roozbehp/unicode-data/issues/6
        return (UISC in [Tone_Mark, Cantillation_Mark, Register_Shifter, Visarga] or
        return (UISC in [Tone_Mark, Cantillation_Mark, Register_Shifter, Visarga] or
-               (UGC != Lo and UISC == Bindu))
+               (UGC != Lo and (UISC == Bindu or U in [0xAA29])))
 
 use_mapping = {
        'B':    is_BASE,
 
 use_mapping = {
        'B':    is_BASE,
@@ -227,6 +231,7 @@ use_mapping = {
        'M':    is_CONS_MED,
        'CM':   is_CONS_MOD,
        'SUB':  is_CONS_SUB,
        'M':    is_CONS_MED,
        'CM':   is_CONS_MOD,
        'SUB':  is_CONS_SUB,
+       'CS':   is_CONS_WITH_STACKER,
        'H':    is_HALANT,
        'HN':   is_HALANT_NUM,
        'ZWNJ': is_ZWNJ,
        'H':    is_HALANT,
        'HN':   is_HALANT_NUM,
        'ZWNJ': is_ZWNJ,
@@ -250,7 +255,7 @@ use_positions = {
        },
        'M': {
                'Abv': [Top],
        },
        'M': {
                'Abv': [Top],
-               'Blw': [Bottom],
+               'Blw': [Bottom, Bottom_And_Left],
                'Pst': [Right],
                'Pre': [Left],
        },
                'Pst': [Right],
                'Pre': [Left],
        },
@@ -292,12 +297,23 @@ def map_to_use(data):
                if U == 0x17DD: UISC = Vowel_Dependent
                if 0x1CE2 <= U <= 0x1CE8: UISC = Cantillation_Mark
 
                if U == 0x17DD: UISC = Vowel_Dependent
                if 0x1CE2 <= U <= 0x1CE8: UISC = Cantillation_Mark
 
+               # TODO: https://github.com/harfbuzz/harfbuzz/pull/627
+               if 0x1BF2 <= U <= 0x1BF3: UISC = Nukta; UIPC = Bottom
+
                # TODO: U+1CED should only be allowed after some of
                # the nasalization marks, maybe only for U+1CE9..U+1CF1.
                if U == 0x1CED: UISC = Tone_Mark
 
                # TODO: U+1CED should only be allowed after some of
                # the nasalization marks, maybe only for U+1CE9..U+1CF1.
                if U == 0x1CED: UISC = Tone_Mark
 
-               evals = [(k, v(U,UISC,UGC)) for k,v in items]
-               values = [k for k,v in evals if v]
+               # TODO: https://github.com/harfbuzz/harfbuzz/issues/525
+               if U == 0x1A7F: UISC = Consonant_Final; UIPC = Bottom
+
+               # TODO: https://github.com/harfbuzz/harfbuzz/pull/609
+               if U == 0x20F0: UISC = Cantillation_Mark; UIPC = Top
+
+               # TODO: https://github.com/harfbuzz/harfbuzz/pull/626
+               if U == 0xA8B4: UISC = Consonant_Medial
+
+               values = [k for k,v in items if v(U,UISC,UGC)]
                assert len(values) == 1, "%s %s %s %s" % (hex(U), UISC, UGC, values)
                USE = values[0]
 
                assert len(values) == 1, "%s %s %s %s" % (hex(U), UISC, UGC, values)
                USE = values[0]
 
@@ -336,12 +352,6 @@ def map_to_use(data):
 defaults = ('O', 'No_Block')
 data = map_to_use(data)
 
 defaults = ('O', 'No_Block')
 data = map_to_use(data)
 
-# Remove the outliers
-singles = {}
-for u in [0x034F, 0x25CC, 0x1107F]:
-       singles[u] = data[u]
-       del data[u]
-
 print "/* == Start of generated table == */"
 print "/*"
 print " * The following table is generated by running:"
 print "/* == Start of generated table == */"
 print "/*"
 print " * The following table is generated by running:"
@@ -439,20 +449,17 @@ page_bits = 12
 print "}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy)
 print
 print "USE_TABLE_ELEMENT_TYPE"
 print "}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy)
 print
 print "USE_TABLE_ELEMENT_TYPE"
-print "hb_use_get_categories (hb_codepoint_t u)"
+print "hb_use_get_category (hb_codepoint_t u)"
 print "{"
 print "  switch (u >> %d)" % page_bits
 print "  {"
 print "{"
 print "  switch (u >> %d)" % page_bits
 print "  {"
-pages = set([u>>page_bits for u in starts+ends+singles.keys()])
+pages = set([u>>page_bits for u in starts+ends])
 for p in sorted(pages):
        print "    case 0x%0Xu:" % p
        for (start,end) in zip (starts, ends):
                if p not in [start>>page_bits, end>>page_bits]: continue
                offset = "use_offset_0x%04xu" % start
 for p in sorted(pages):
        print "    case 0x%0Xu:" % p
        for (start,end) in zip (starts, ends):
                if p not in [start>>page_bits, end>>page_bits]: continue
                offset = "use_offset_0x%04xu" % start
-               print "      if (hb_in_range (u, 0x%04Xu, 0x%04Xu)) return use_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset)
-       for u,d in singles.items ():
-               if p != u>>page_bits: continue
-               print "      if (unlikely (u == 0x%04Xu)) return %s;" % (u, d[0])
+               print "      if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return use_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset)
        print "      break;"
        print ""
 print "    default:"
        print "      break;"
        print ""
 print "    default:"
diff --git a/src/harfbuzz-config.cmake.in b/src/harfbuzz-config.cmake.in
new file mode 100644 (file)
index 0000000..87b1572
--- /dev/null
@@ -0,0 +1,82 @@
+# Set these variables so that the `${prefix}/lib` expands to something we can
+# remove.
+set(_harfbuzz_remove_string "REMOVE_ME")
+set(exec_prefix "${_harfbuzz_remove_string}")
+set(prefix "${_harfbuzz_remove_string}")
+
+# Compute the installation prefix by stripping components from our current
+# location.
+get_filename_component(_harfbuzz_prefix "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY)
+get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY)
+set(_harfbuzz_libdir "@libdir@")
+string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_libdir "${_harfbuzz_libdir}")
+set(_harfbuzz_libdir_iter "${_harfbuzz_libdir}")
+while (_harfbuzz_libdir_iter)
+  get_filename_component(_harfbuzz_libdir_iter "${_harfbuzz_libdir_iter}" DIRECTORY)
+  get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY)
+endwhile ()
+unset(_harfbuzz_libdir_iter)
+
+# Get the include subdir.
+set(_harfbuzz_includedir "@includedir@")
+string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_includedir "${_harfbuzz_includedir}")
+
+# Extract version information from libtool.
+set(_harfbuzz_version_info "@HB_LIBTOOL_VERSION_INFO@")
+string(REPLACE ":" ";" _harfbuzz_version_info "${_harfbuzz_version_info}")
+list(GET _harfbuzz_version_info 0
+  _harfbuzz_current)
+list(GET _harfbuzz_version_info 1
+  _harfbuzz_revision)
+list(GET _harfbuzz_version_info 2
+  _harfbuzz_age)
+unset(_harfbuzz_version_info)
+
+if (APPLE)
+  set(_harfbuzz_lib_suffix ".0${CMAKE_SHARED_LIBRARY_SUFFIX}")
+elseif (UNIX)
+  set(_harfbuzz_lib_suffix "${CMAKE_SHARED_LIBRARY_SUFFIX}.0.${_harfbuzz_current}.${_harfbuzz_revision}")
+else ()
+  # Unsupported.
+  set(harfbuzz_FOUND 0)
+endif ()
+
+# Add the libraries.
+add_library(harfbuzz::harfbuzz SHARED IMPORTED)
+set_target_properties(harfbuzz::harfbuzz PROPERTIES
+  INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+  IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz${_harfbuzz_lib_suffix}")
+
+add_library(harfbuzz::icu SHARED IMPORTED)
+set_target_properties(harfbuzz::icu PROPERTIES
+  INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+  INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+  IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-icu${_harfbuzz_lib_suffix}")
+
+add_library(harfbuzz::subset SHARED IMPORTED)
+set_target_properties(harfbuzz::subset PROPERTIES
+  INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+  INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+  IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-subset${_harfbuzz_lib_suffix}")
+
+# Only add the gobject library if it was built.
+set(_harfbuzz_have_gobject "@have_gobject@")
+if (_harfbuzz_have_gobject)
+  add_library(harfbuzz::gobject SHARED IMPORTED)
+  set_target_properties(harfbuzz::gobject PROPERTIES
+    INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+    INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+    IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-gobject${_harfbuzz_lib_suffix}")
+endif ()
+
+# Clean out variables we used in our scope.
+unset(_harfbuzz_lib_suffix)
+unset(_harfbuzz_current)
+unset(_harfbuzz_revision)
+unset(_harfbuzz_age)
+unset(_harfbuzz_includedir)
+unset(_harfbuzz_libdir)
+unset(_harfbuzz_prefix)
+unset(exec_prefix)
+unset(prefix)
+unset(_harfbuzz_remove_string)
diff --git a/src/harfbuzz-subset.pc.in b/src/harfbuzz-subset.pc.in
new file mode 100644 (file)
index 0000000..5da64b3
--- /dev/null
@@ -0,0 +1,12 @@
+prefix=%prefix%
+exec_prefix=%exec_prefix%
+libdir=%libdir%
+includedir=%includedir%
+
+Name: harfbuzz
+Description: HarfBuzz font subsetter
+Version: %VERSION%
+
+Requires: harfbuzz
+Libs: -L${libdir} -lharfbuzz-subset
+Cflags: -I${includedir}/harfbuzz
index b3e124a..661251c 100644 (file)
@@ -8,6 +8,6 @@ Description: HarfBuzz text shaping library
 Version: %VERSION%
 
 Libs: -L${libdir} -lharfbuzz
 Version: %VERSION%
 
 Libs: -L${libdir} -lharfbuzz
-Libs.private: %libs_private%
+Libs.private: -lm %libs_private%
 Requires.private: %requires_private%
 Cflags: -I${includedir}/harfbuzz
 Requires.private: %requires_private%
 Cflags: -I${includedir}/harfbuzz
diff --git a/src/hb-aat-layout-ankr-table.hh b/src/hb-aat-layout-ankr-table.hh
new file mode 100644 (file)
index 0000000..d0453bd
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_AAT_LAYOUT_ANKR_TABLE_HH
+#define HB_AAT_LAYOUT_ANKR_TABLE_HH
+
+#include "hb-aat-layout-common-private.hh"
+
+#define HB_AAT_TAG_ankr HB_TAG('a','n','k','r')
+
+
+namespace AAT {
+
+
+/*
+ * ankr -- Anchor point
+ */
+
+struct Anchor
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  FWORD                xCoordinate;
+  FWORD                yCoordinate;
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct ankr
+{
+  static const hb_tag_t tableTag = HB_AAT_TAG_ankr;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && version == 0 &&
+                 lookupTable.sanitize (c, this) &&
+                 anchors.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16                     version;        /* Version number (set to zero) */
+  HBUINT16                     flags;          /* Flags (currently unused; set to zero) */
+  LOffsetTo<Lookup<HBUINT16> > lookupTable;    /* Offset to the table's lookup table */
+  LOffsetTo<ArrayOf<Anchor, HBUINT32> >
+                               anchors;        /* Offset to the glyph data table */
+
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_ANKR_TABLE_HH */
diff --git a/src/hb-aat-layout-common-private.hh b/src/hb-aat-layout-common-private.hh
new file mode 100644 (file)
index 0000000..7c0dfa8
--- /dev/null
@@ -0,0 +1,728 @@
+/*
+ * Copyright © 2017  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_LAYOUT_COMMON_PRIVATE_HH
+#define HB_AAT_LAYOUT_COMMON_PRIVATE_HH
+
+#include "hb-aat-layout-private.hh"
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+/*
+ * Binary Searching Tables
+ */
+
+struct BinSearchHeader
+{
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16     unitSize;       /* Size of a lookup unit for this search in bytes. */
+  HBUINT16     nUnits;         /* Number of units of the preceding size to be searched. */
+  HBUINT16     searchRange;    /* The value of unitSize times the largest power of 2
+                                * that is less than or equal to the value of nUnits. */
+  HBUINT16     entrySelector;  /* The log base 2 of the largest power of 2 less than
+                                * or equal to the value of nUnits. */
+  HBUINT16     rangeShift;     /* The value of unitSize times the difference of the
+                                * value of nUnits minus the largest power of 2 less
+                                * than or equal to the value of nUnits. */
+  public:
+  DEFINE_SIZE_STATIC (10);
+};
+
+template <typename Type>
+struct BinSearchArrayOf
+{
+  inline const Type& operator [] (unsigned int i) const
+  {
+    if (unlikely (i >= header.nUnits)) return Null(Type);
+    return StructAtOffset<Type> (bytes, i * header.unitSize);
+  }
+  inline Type& operator [] (unsigned int i)
+  {
+    return StructAtOffset<Type> (bytes, i * header.unitSize);
+  }
+  inline unsigned int get_size (void) const
+  { return header.static_size + header.nUnits * header.unitSize; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+
+    /* Note: for structs that do not reference other structs,
+     * we do not need to call their sanitize() as we already did
+     * a bound check on the aggregate array size.  We just include
+     * a small unreachable expression to make sure the structs
+     * pointed to do have a simple sanitize(), ie. they do not
+     * reference other structs via offsets.
+     */
+    (void) (false && StructAtOffset<Type> (bytes, 0).sanitize (c));
+
+    return_trace (true);
+  }
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c))) return_trace (false);
+    unsigned int count = header.nUnits;
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!(*this)[i].sanitize (c, base)))
+        return_trace (false);
+    return_trace (true);
+  }
+
+  template <typename T>
+  inline const Type *bsearch (const T &key) const
+  {
+    unsigned int size = header.unitSize;
+    int min = 0, max = (int) header.nUnits - 1;
+    while (min <= max)
+    {
+      int mid = (min + max) / 2;
+      const Type *p = (const Type *) (((const char *) bytes) + (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;
+  }
+
+  private:
+  inline bool sanitize_shallow (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (header.sanitize (c) &&
+                 Type::static_size >= header.unitSize &&
+                 c->check_array (bytes, header.unitSize, header.nUnits));
+  }
+
+  protected:
+  BinSearchHeader      header;
+  HBUINT8                      bytes[VAR];
+  public:
+  DEFINE_SIZE_ARRAY (10, bytes);
+};
+
+
+/* TODO Move this to hb-open-type-private.hh and use it in ArrayOf, HeadlessArrayOf,
+ * and other places around the code base?? */
+template <typename Type>
+struct UnsizedArrayOf
+{
+  inline const Type& operator [] (unsigned int i) const { return arrayZ[i]; }
+  inline Type& operator [] (unsigned int i) { return arrayZ[i]; }
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
+
+    /* Note: for structs that do not reference other structs,
+     * we do not need to call their sanitize() as we already did
+     * a bound check on the aggregate array size.  We just include
+     * a small unreachable expression to make sure the structs
+     * pointed to do have a simple sanitize(), ie. they do not
+     * reference other structs via offsets.
+     */
+    (void) (false && arrayZ[0].sanitize (c));
+
+    return_trace (true);
+  }
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!arrayZ[i].sanitize (c, base)))
+        return_trace (false);
+    return_trace (true);
+  }
+  template <typename T>
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base, T user_data) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!arrayZ[i].sanitize (c, base, user_data)))
+        return_trace (false);
+    return_trace (true);
+  }
+
+  private:
+  inline bool sanitize_shallow (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_array (arrayZ, arrayZ[0].static_size, count));
+  }
+
+  public:
+  Type arrayZ[VAR];
+  public:
+  DEFINE_SIZE_ARRAY (0, arrayZ);
+};
+
+/* Unsized array of offset's */
+template <typename Type, typename OffsetType>
+struct UnsizedOffsetArrayOf : UnsizedArrayOf<OffsetTo<Type, OffsetType> > {};
+
+/* Unsized array of offsets relative to the beginning of the array itself. */
+template <typename Type, typename OffsetType>
+struct UnsizedOffsetListOf : UnsizedOffsetArrayOf<Type, OffsetType>
+{
+  inline const Type& operator [] (unsigned int i) const
+  {
+    return this+this->arrayZ[i];
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace ((UnsizedOffsetArrayOf<Type, OffsetType>::sanitize (c, count, this)));
+  }
+  template <typename T>
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, T user_data) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace ((UnsizedOffsetArrayOf<Type, OffsetType>::sanitize (c, count, this, user_data)));
+  }
+};
+
+
+/*
+ * Lookup Table
+ */
+
+template <typename T> struct Lookup;
+
+template <typename T>
+struct LookupFormat0
+{
+  friend struct Lookup<T>;
+
+  private:
+  inline const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  {
+    if (unlikely (glyph_id >= num_glyphs)) return nullptr;
+    return &arrayZ[glyph_id];
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (arrayZ.sanitize (c, c->num_glyphs));
+  }
+
+  protected:
+  HBUINT16     format;         /* Format identifier--format = 0 */
+  UnsizedArrayOf<T>
+               arrayZ;         /* Array of lookup values, indexed by glyph index. */
+  public:
+  DEFINE_SIZE_ARRAY (2, arrayZ);
+};
+
+
+template <typename T>
+struct LookupSegmentSingle
+{
+  inline int cmp (hb_codepoint_t g) const {
+    return g < first ? -1 : g <= last ? 0 : +1 ;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && value.sanitize (c));
+  }
+
+  GlyphID      last;           /* Last GlyphID in this segment */
+  GlyphID      first;          /* First GlyphID in this segment */
+  T            value;          /* The lookup value (only one) */
+  public:
+  DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <typename T>
+struct LookupFormat2
+{
+  friend struct Lookup<T>;
+
+  private:
+  inline const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    const LookupSegmentSingle<T> *v = segments.bsearch (glyph_id);
+    return v ? &v->value : nullptr;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (segments.sanitize (c));
+  }
+
+  protected:
+  HBUINT16     format;         /* Format identifier--format = 2 */
+  BinSearchArrayOf<LookupSegmentSingle<T> >
+               segments;       /* The actual segments. These must already be sorted,
+                                * according to the first word in each one (the last
+                                * glyph in each segment). */
+  public:
+  DEFINE_SIZE_ARRAY (8, segments);
+};
+
+template <typename T>
+struct LookupSegmentArray
+{
+  inline const T* get_value (hb_codepoint_t glyph_id, const void *base) const
+  {
+    return first <= glyph_id && glyph_id <= last ? &(base+valuesZ)[glyph_id - first] : nullptr;
+  }
+
+  inline int cmp (hb_codepoint_t g) const {
+    return g < first ? -1 : g <= last ? 0 : +1 ;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                 first <= last &&
+                 valuesZ.sanitize (c, base, last - first + 1));
+  }
+
+  GlyphID      last;           /* Last GlyphID in this segment */
+  GlyphID      first;          /* First GlyphID in this segment */
+  OffsetTo<UnsizedArrayOf<T> >
+               valuesZ;        /* A 16-bit offset from the start of
+                                * the table to the data. */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+template <typename T>
+struct LookupFormat4
+{
+  friend struct Lookup<T>;
+
+  private:
+  inline const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    const LookupSegmentArray<T> *v = segments.bsearch (glyph_id);
+    return v ? v->get_value (glyph_id, this) : nullptr;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (segments.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16     format;         /* Format identifier--format = 2 */
+  BinSearchArrayOf<LookupSegmentArray<T> >
+               segments;       /* The actual segments. These must already be sorted,
+                                * according to the first word in each one (the last
+                                * glyph in each segment). */
+  public:
+  DEFINE_SIZE_ARRAY (8, segments);
+};
+
+template <typename T>
+struct LookupSingle
+{
+  inline int cmp (hb_codepoint_t g) const { return glyph.cmp (g); }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && value.sanitize (c));
+  }
+
+  GlyphID      glyph;          /* Last GlyphID */
+  T            value;          /* The lookup value (only one) */
+  public:
+  DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <typename T>
+struct LookupFormat6
+{
+  friend struct Lookup<T>;
+
+  private:
+  inline const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    const LookupSingle<T> *v = entries.bsearch (glyph_id);
+    return v ? &v->value : nullptr;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (entries.sanitize (c));
+  }
+
+  protected:
+  HBUINT16     format;         /* Format identifier--format = 6 */
+  BinSearchArrayOf<LookupSingle<T> >
+               entries;        /* The actual entries, sorted by glyph index. */
+  public:
+  DEFINE_SIZE_ARRAY (8, entries);
+};
+
+template <typename T>
+struct LookupFormat8
+{
+  friend struct Lookup<T>;
+
+  private:
+  inline const T* get_value (hb_codepoint_t glyph_id) const
+  {
+    return firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount ? &valueArrayZ[glyph_id - firstGlyph] : nullptr;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && valueArrayZ.sanitize (c, glyphCount));
+  }
+
+  protected:
+  HBUINT16     format;         /* Format identifier--format = 6 */
+  GlyphID      firstGlyph;     /* First glyph index included in the trimmed array. */
+  HBUINT16     glyphCount;     /* Total number of glyphs (equivalent to the last
+                                * glyph minus the value of firstGlyph plus 1). */
+  UnsizedArrayOf<T>
+               valueArrayZ;    /* The lookup values (indexed by the glyph index
+                                * minus the value of firstGlyph). */
+  public:
+  DEFINE_SIZE_ARRAY (6, valueArrayZ);
+};
+
+template <typename T>
+struct Lookup
+{
+  inline const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  {
+    switch (u.format) {
+    case 0: return u.format0.get_value (glyph_id, num_glyphs);
+    case 2: return u.format2.get_value (glyph_id);
+    case 4: return u.format4.get_value (glyph_id);
+    case 6: return u.format6.get_value (glyph_id);
+    case 8: return u.format8.get_value (glyph_id);
+    default:return nullptr;
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 0: return_trace (u.format0.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    case 4: return_trace (u.format4.sanitize (c));
+    case 6: return_trace (u.format6.sanitize (c));
+    case 8: return_trace (u.format8.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  HBUINT16             format;         /* Format identifier */
+  LookupFormat0<T>     format0;
+  LookupFormat2<T>     format2;
+  LookupFormat4<T>     format4;
+  LookupFormat6<T>     format6;
+  LookupFormat8<T>     format8;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+
+/*
+ * Extended State Table
+ */
+
+template <typename T>
+struct Entry
+{
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    /* Note, we don't recurse-sanitize data because we don't access it.
+     * That said, in our DEFINE_SIZE_STATIC we access T::static_size,
+     * which ensures that data has a simple sanitize(). To be determined
+     * if I need to remove that as well. */
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16     newState;       /* Byte offset from beginning of state table
+                                * to the new state. Really?!?! Or just state
+                                * number?  The latter in morx for sure. */
+  HBUINT16     flags;          /* Table specific. */
+  T            data;           /* Optional offsets to per-glyph tables. */
+  public:
+  DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <>
+struct Entry<void>
+{
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16     newState;       /* Byte offset from beginning of state table to the new state. */
+  HBUINT16     flags;          /* Table specific. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+template <typename Extra>
+struct StateTable
+{
+  inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  {
+    const HBUINT16 *v = (this+classTable).get_value (glyph_id, num_glyphs);
+    return v ? *v : 1;
+  }
+
+  inline const Entry<Extra> *get_entries () const
+  {
+    return (this+entryTable).arrayZ;
+  }
+
+  inline const Entry<Extra> *get_entryZ (unsigned int state, unsigned int klass) const
+  {
+    if (unlikely (klass >= nClasses)) return nullptr;
+
+    const HBUINT16 *states = (this+stateArrayTable).arrayZ;
+    const Entry<Extra> *entries = (this+entryTable).arrayZ;
+
+    unsigned int entry = states[state * nClasses + klass];
+
+    return &entries[entry];
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c,
+                       unsigned int *num_entries_out = nullptr) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!(c->check_struct (this) &&
+                   classTable.sanitize (c, this)))) return_trace (false);
+
+    const HBUINT16 *states = (this+stateArrayTable).arrayZ;
+    const Entry<Extra> *entries = (this+entryTable).arrayZ;
+
+    unsigned int num_states = 1;
+    unsigned int num_entries = 0;
+
+    unsigned int state = 0;
+    unsigned int entry = 0;
+    while (state < num_states)
+    {
+      if (unlikely (!c->check_array (states,
+                                    states[0].static_size * nClasses,
+                                    num_states)))
+       return_trace (false);
+      { /* Sweep new states. */
+       const HBUINT16 *stop = &states[num_states * nClasses];
+       for (const HBUINT16 *p = &states[state * nClasses]; p < stop; p++)
+         num_entries = MAX<unsigned int> (num_entries, *p + 1);
+       state = num_states;
+      }
+
+      if (unlikely (!c->check_array (entries,
+                                    entries[0].static_size,
+                                    num_entries)))
+       return_trace (false);
+      { /* Sweep new entries. */
+       const Entry<Extra> *stop = &entries[num_entries];
+       for (const Entry<Extra> *p = &entries[entry]; p < stop; p++)
+         num_states = MAX<unsigned int> (num_states, p->newState + 1);
+       entry = num_entries;
+      }
+    }
+
+    if (num_entries_out)
+      *num_entries_out = num_entries;
+
+    return_trace (true);
+  }
+
+  protected:
+  HBUINT32     nClasses;       /* Number of classes, which is the number of indices
+                                * in a single line in the state array. */
+  OffsetTo<Lookup<HBUINT16>, HBUINT32>
+               classTable;     /* Offset to the class table. */
+  OffsetTo<UnsizedArrayOf<HBUINT16>, HBUINT32>
+               stateArrayTable;/* Offset to the state array. */
+  OffsetTo<UnsizedArrayOf<Entry<Extra> >, HBUINT32>
+               entryTable;     /* Offset to the entry array. */
+
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+template <typename EntryData>
+struct StateTableDriver
+{
+  inline StateTableDriver (const StateTable<EntryData> &machine_,
+                          hb_buffer_t *buffer_,
+                          hb_face_t *face_) :
+             machine (machine_),
+             buffer (buffer_),
+             num_glyphs (face_->get_num_glyphs ()) {}
+
+  template <typename context_t>
+  inline void drive (context_t *c)
+  {
+    hb_glyph_info_t *info = buffer->info;
+
+    if (!c->in_place)
+      buffer->clear_output ();
+
+    unsigned int state = 0;
+    bool last_was_dont_advance = false;
+    for (buffer->idx = 0;;)
+    {
+      unsigned int klass = buffer->idx < buffer->len ?
+                          machine.get_class (info[buffer->idx].codepoint, num_glyphs) :
+                          0 /* End of text */;
+      const Entry<EntryData> *entry = machine.get_entryZ (state, klass);
+      if (unlikely (!entry))
+       break;
+
+      /* Unsafe-to-break before this if not in state 0, as things might
+       * go differently if we start from state 0 here. */
+      if (state && buffer->idx)
+      {
+       /* If there's no action and we're just epsilon-transitioning to state 0,
+        * safe to break. */
+       if (c->is_actionable (this, entry) ||
+           !(entry->newState == 0 && entry->flags == context_t::DontAdvance))
+         buffer->unsafe_to_break (buffer->idx - 1, buffer->idx + 1);
+      }
+
+      /* Unsafe-to-break if end-of-text would kick in here. */
+      if (buffer->idx + 2 <= buffer->len)
+      {
+       const Entry<EntryData> *end_entry = machine.get_entryZ (state, 0);
+       if (c->is_actionable (this, end_entry))
+         buffer->unsafe_to_break (buffer->idx, buffer->idx + 2);
+      }
+
+      if (unlikely (!c->transition (this, entry)))
+        break;
+
+      last_was_dont_advance = (entry->flags & context_t::DontAdvance) && buffer->max_ops-- > 0;
+
+      state = entry->newState;
+
+      if (buffer->idx == buffer->len)
+        break;
+
+      if (!last_was_dont_advance)
+        buffer->next_glyph ();
+    }
+
+    if (!c->in_place)
+    {
+      for (; buffer->idx < buffer->len;)
+        buffer->next_glyph ();
+      buffer->swap_buffers ();
+    }
+  }
+
+  public:
+  const StateTable<EntryData> &machine;
+  hb_buffer_t *buffer;
+  unsigned int num_glyphs;
+};
+
+
+
+struct hb_aat_apply_context_t :
+       hb_dispatch_context_t<hb_aat_apply_context_t, bool, HB_DEBUG_APPLY>
+{
+  inline const char *get_name (void) { return "APPLY"; }
+  template <typename T>
+  inline return_t dispatch (const T &obj) { return obj.apply (this); }
+  static return_t default_return_value (void) { return false; }
+  bool stop_sublookup_iteration (return_t r) const { return r; }
+
+  hb_font_t *font;
+  hb_face_t *face;
+  hb_buffer_t *buffer;
+  hb_sanitize_context_t sanitizer;
+
+  /* Unused. For debug tracing only. */
+  unsigned int lookup_index;
+  unsigned int debug_depth;
+
+  inline hb_aat_apply_context_t (hb_font_t *font_,
+                                hb_buffer_t *buffer_,
+                                hb_blob_t *table) :
+               font (font_), face (font->face), buffer (buffer_),
+               sanitizer (), lookup_index (0), debug_depth (0)
+  {
+    sanitizer.init (table);
+    sanitizer.num_glyphs = face->get_num_glyphs ();
+    sanitizer.start_processing ();
+  }
+
+  inline void set_lookup_index (unsigned int i) { lookup_index = i; }
+
+  inline ~hb_aat_apply_context_t (void)
+  {
+    sanitizer.end_processing ();
+  }
+};
+
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_COMMON_PRIVATE_HH */
diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh
new file mode 100644 (file)
index 0000000..ce7ca10
--- /dev/null
@@ -0,0 +1,339 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_LAYOUT_KERX_TABLE_HH
+#define HB_AAT_LAYOUT_KERX_TABLE_HH
+
+#include "hb-open-type-private.hh"
+#include "hb-aat-layout-common-private.hh"
+
+#define HB_AAT_TAG_KERX HB_TAG('k','e','r','x')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+struct KerxFormat0Records
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  GlyphID      left;
+  GlyphID      right;
+  FWORD                value;
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct KerxSubTableFormat0
+{
+  // TODO(ebraminio) Enable when we got suitable BinSearchArrayOf
+  // inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+  // {
+  //   hb_glyph_pair_t pair = {left, right};
+  //   int i = pairs.bsearch (pair);
+  //   if (i == -1)
+  //     return 0;
+  //   return pairs[i].get_kerning ();
+  // }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      c->check_array (records, records[0].static_size, nPairs));
+  }
+
+  protected:
+  // TODO(ebraminio): A custom version of "BinSearchArrayOf<KerxPair> pairs;" is
+  // needed here to use HBUINT32 instead
+  HBUINT32 nPairs;     /* The number of kerning pairs in this subtable */
+  HBUINT32 searchRange; /* The largest power of two less than or equal to the value of nPairs,
+                         * multiplied by the size in bytes of an entry in the subtable. */
+  HBUINT32 entrySelector; /* This is calculated as log2 of the largest power of two less
+                           * than or equal to the value of nPairs. */
+  HBUINT32 rangeShift; /* The value of nPairs minus the largest power of two less than or equal to nPairs. */
+  KerxFormat0Records records[VAR]; /* VAR=nPairs */
+  public:
+  DEFINE_SIZE_ARRAY (16, records);
+};
+
+struct KerxSubTableFormat1
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      stateHeader.sanitize (c));
+  }
+
+  protected:
+  StateTable<HBUINT16>         stateHeader;
+  LOffsetTo<ArrayOf<HBUINT16> >        valueTable;
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+// TODO(ebraminio): Maybe this can be replaced with Lookup<HBUINT16>?
+struct KerxClassTable
+{
+  inline unsigned int get_class (hb_codepoint_t g) const { return classes[g - firstGlyph]; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (firstGlyph.sanitize (c) && classes.sanitize (c));
+  }
+
+  protected:
+  HBUINT16             firstGlyph;     /* First glyph in class range. */
+  ArrayOf<HBUINT16>    classes;        /* Glyph classes. */
+  public:
+  DEFINE_SIZE_ARRAY (4, classes);
+};
+
+struct KerxSubTableFormat2
+{
+  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const
+  {
+    unsigned int l = (this+leftClassTable).get_class (left);
+    unsigned int r = (this+leftClassTable).get_class (left);
+    unsigned int offset = l * rowWidth + r * sizeof (FWORD);
+    const FWORD *arr = &(this+array);
+    if (unlikely ((const void *) arr < (const void *) this || (const void *) arr >= (const void *) end))
+      return 0;
+    const FWORD *v = &StructAtOffset<FWORD> (arr, offset);
+    if (unlikely ((const void *) v < (const void *) arr || (const void *) (v + 1) > (const void *) end))
+      return 0;
+    return *v;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      rowWidth.sanitize (c) &&
+                 leftClassTable.sanitize (c, this) &&
+                 rightClassTable.sanitize (c, this) &&
+                 array.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT32     rowWidth;       /* The width, in bytes, of a row in the table. */
+  LOffsetTo<KerxClassTable>
+               leftClassTable; /* Offset from beginning of this subtable to
+                                * left-hand class table. */
+  LOffsetTo<KerxClassTable>
+               rightClassTable;/* Offset from beginning of this subtable to
+                                * right-hand class table. */
+  LOffsetTo<FWORD>
+               array;          /* Offset from beginning of this subtable to
+                                * the start of the kerning array. */
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+struct KerxSubTableFormat4
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      rowWidth.sanitize (c) &&
+                 leftClassTable.sanitize (c, this) &&
+                 rightClassTable.sanitize (c, this) &&
+                 array.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT32     rowWidth;       /* The width, in bytes, of a row in the table. */
+  LOffsetTo<KerxClassTable>
+               leftClassTable; /* Offset from beginning of this subtable to
+                                * left-hand class table. */
+  LOffsetTo<KerxClassTable>
+               rightClassTable;/* Offset from beginning of this subtable to
+                                * right-hand class table. */
+  LOffsetTo<FWORD>
+               array;          /* Offset from beginning of this subtable to
+                                * the start of the kerning array. */
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+struct KerxSubTableFormat6
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      rowIndexTable.sanitize (c, this) &&
+      columnIndexTable.sanitize (c, this) &&
+      kerningArray.sanitize (c, this) &&
+      kerningVector.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT32     flags;
+  HBUINT16     rowCount;
+  HBUINT16     columnCount;
+  LOffsetTo<Lookup<HBUINT16> > rowIndexTable;
+  LOffsetTo<Lookup<HBUINT16> > columnIndexTable;
+  LOffsetTo<Lookup<HBUINT16> > kerningArray;
+  LOffsetTo<Lookup<HBUINT16> > kerningVector;
+  public:
+  DEFINE_SIZE_STATIC (24);
+};
+
+enum coverage_flags_t
+{
+  COVERAGE_VERTICAL_FLAG       = 0x80u,
+  COVERAGE_CROSSSTREAM_FLAG    = 0x40u,
+  COVERAGE_VARIATION_FLAG      = 0x20u,
+  COVERAGE_PROCESS_DIRECTION   = 0x10u,
+};
+
+struct KerxTable
+{
+  inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const
+  {
+    TRACE_APPLY (this);
+    /* TODO */
+    return_trace (false);
+  }
+
+  inline unsigned int get_size (void) const { return length; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!c->check_struct (this))
+      return_trace (false);
+
+    switch (format) {
+    case 0: return u.format0.sanitize (c);
+    case 1: return u.format1.sanitize (c);
+    case 2: return u.format2.sanitize (c);
+    case 4: return u.format4.sanitize (c);
+    case 6: return u.format6.sanitize (c);
+    default:return_trace (false);
+    }
+  }
+
+protected:
+  HBUINT32     length;
+  HBUINT8      coverage;
+  HBUINT16     unused;
+  HBUINT8      format;
+  HBUINT32     tupleIndex;
+  union {
+  KerxSubTableFormat0  format0;
+  KerxSubTableFormat1  format1;
+  KerxSubTableFormat2  format2;
+  KerxSubTableFormat4  format4;
+  KerxSubTableFormat6  format6;
+  } u;
+public:
+  DEFINE_SIZE_MIN (12);
+};
+
+struct SubtableGlyphCoverageArray
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT32     length;
+  HBUINT32     coverage;
+  HBUINT32     tupleCount;
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+struct kerx
+{
+  static const hb_tag_t tableTag = HB_AAT_TAG_KERX;
+
+  inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const
+  {
+    TRACE_APPLY (this);
+    const KerxTable &table = StructAfter<KerxTable> (*this);
+    return_trace (table.apply (c, ankr));
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!(c->check_struct (this)))
+     return_trace (false);
+
+    /* TODO: Something like `morx`s ChainSubtable should be done here instead */
+    const KerxTable *table = &StructAfter<KerxTable> (*this);
+    if (!(table->sanitize (c)))
+      return_trace (false);
+
+    for (unsigned int i = 0; i < nTables - 1; ++i)
+    {
+      table = &StructAfter<KerxTable> (*table);
+      if (!(table->sanitize (c)))
+        return_trace (false);
+    }
+
+    // If version is less than 3, we are done here; otherwise better to check footer also
+    if (version < 3)
+      return_trace (true);
+
+    // TODO: Investigate why this just work on some fonts no matter of version
+    // const SubtableGlyphCoverageArray &footer =
+    //   StructAfter<SubtableGlyphCoverageArray> (*table);
+    // return_trace (footer.sanitize (c));
+
+    return_trace (true);
+  }
+
+  protected:
+  HBUINT16             version;
+  HBUINT16             padding;
+  HBUINT32             nTables;
+/*KerxTable tables[VAR];*/
+/*SubtableGlyphCoverageArray coverage_array;*/
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_KERX_TABLE_HH */
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
new file mode 100644 (file)
index 0000000..4cc2824
--- /dev/null
@@ -0,0 +1,728 @@
+/*
+ * Copyright © 2017  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_LAYOUT_MORX_TABLE_HH
+#define HB_AAT_LAYOUT_MORX_TABLE_HH
+
+#include "hb-open-type-private.hh"
+#include "hb-aat-layout-common-private.hh"
+
+#define HB_AAT_TAG_MORX HB_TAG('m','o','r','x')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+struct RearrangementSubtable
+{
+  typedef void EntryData;
+
+  struct driver_context_t
+  {
+    static const bool in_place = true;
+    enum Flags {
+      MarkFirst                = 0x8000,       /* If set, make the current glyph the first
+                                        * glyph to be rearranged. */
+      DontAdvance      = 0x4000,       /* If set, don't advance to the next glyph
+                                        * before going to the new state. This means
+                                        * that the glyph index doesn't change, even
+                                        * if the glyph at that index has changed. */
+      MarkLast         = 0x2000,       /* If set, make the current glyph the last
+                                        * glyph to be rearranged. */
+      Reserved         = 0x1FF0,       /* These bits are reserved and should be set to 0. */
+      Verb             = 0x000F,       /* The type of rearrangement specified. */
+    };
+
+    inline driver_context_t (const RearrangementSubtable *table) :
+       ret (false),
+       start (0), end (0) {}
+
+    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+                              const Entry<EntryData> *entry)
+    {
+      return (entry->flags & Verb) && start < end;
+    }
+    inline bool transition (StateTableDriver<EntryData> *driver,
+                           const Entry<EntryData> *entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+      unsigned int flags = entry->flags;
+
+      if (flags & MarkFirst)
+       start = buffer->idx;
+
+      if (flags & MarkLast)
+       end = MIN (buffer->idx + 1, buffer->len);
+
+      if ((flags & Verb) && start < end)
+      {
+       /* The following map has two nibbles, for start-side
+        * and end-side. Values of 0,1,2 mean move that many
+        * to the other side. Value of 3 means move 2 and
+        * flip them. */
+       const unsigned char map[16] =
+       {
+         0x00, /* 0    no change */
+         0x10, /* 1    Ax => xA */
+         0x01, /* 2    xD => Dx */
+         0x11, /* 3    AxD => DxA */
+         0x20, /* 4    ABx => xAB */
+         0x30, /* 5    ABx => xBA */
+         0x02, /* 6    xCD => CDx */
+         0x03, /* 7    xCD => DCx */
+         0x12, /* 8    AxCD => CDxA */
+         0x13, /* 9    AxCD => DCxA */
+         0x21, /* 10   ABxD => DxAB */
+         0x31, /* 11   ABxD => DxBA */
+         0x22, /* 12   ABxCD => CDxAB */
+         0x32, /* 13   ABxCD => CDxBA */
+         0x23, /* 14   ABxCD => DCxAB */
+         0x33, /* 15   ABxCD => DCxBA */
+       };
+
+       unsigned int m = map[flags & Verb];
+       unsigned int l = MIN<unsigned int> (2, m >> 4);
+       unsigned int r = MIN<unsigned int> (2, m & 0x0F);
+       bool reverse_l = 3 == (m >> 4);
+       bool reverse_r = 3 == (m & 0x0F);
+
+       if (end - start >= l + r)
+       {
+         buffer->merge_clusters (start, MIN (buffer->idx + 1, buffer->len));
+         buffer->merge_clusters (start, end);
+
+         hb_glyph_info_t *info = buffer->info;
+         hb_glyph_info_t buf[4];
+
+         memcpy (buf, info + start, l * sizeof (buf[0]));
+         memcpy (buf + 2, info + end - r, r * sizeof (buf[0]));
+
+         if (l != r)
+           memmove (info + start + r, info + start + l, (end - start - l - r) * sizeof (buf[0]));
+
+         memcpy (info + start, buf + 2, r * sizeof (buf[0]));
+         memcpy (info + end - l, buf, l * sizeof (buf[0]));
+         if (reverse_l)
+         {
+           buf[0] = info[end - 1];
+           info[end - 1] = info[end - 2];
+           info[end - 2] = buf[0];
+         }
+         if (reverse_r)
+         {
+           buf[0] = info[start];
+           info[start] = info[start + 1];
+           info[start + 1] = buf[0];
+         }
+       }
+      }
+
+      return true;
+    }
+
+    public:
+    bool ret;
+    private:
+    unsigned int start;
+    unsigned int end;
+  };
+
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this);
+
+    StateTableDriver<void> driver (machine, c->buffer, c->face);
+    driver.drive (&dc);
+
+    return_trace (dc.ret);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (machine.sanitize (c));
+  }
+
+  protected:
+  StateTable<EntryData>        machine;
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+struct ContextualSubtable
+{
+  struct EntryData
+  {
+    HBUINT16   markIndex;      /* Index of the substitution table for the
+                                * marked glyph (use 0xFFFF for none). */
+    HBUINT16   currentIndex;   /* Index of the substitution table for the
+                                * current glyph (use 0xFFFF for none). */
+    public:
+    DEFINE_SIZE_STATIC (4);
+  };
+
+  struct driver_context_t
+  {
+    static const bool in_place = true;
+    enum Flags {
+      SetMark          = 0x8000,       /* If set, make the current glyph the marked glyph. */
+      DontAdvance      = 0x4000,       /* If set, don't advance to the next glyph before
+                                        * going to the new state. */
+      Reserved         = 0x3FFF,       /* These bits are reserved and should be set to 0. */
+    };
+
+    inline driver_context_t (const ContextualSubtable *table) :
+       ret (false),
+       mark_set (false),
+       mark (0),
+       subs (table+table->substitutionTables) {}
+
+    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+                              const Entry<EntryData> *entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+
+      if (buffer->idx == buffer->len && !mark_set)
+        return false;
+
+      return entry->data.markIndex != 0xFFFF || entry->data.currentIndex != 0xFFFF;
+    }
+    inline bool transition (StateTableDriver<EntryData> *driver,
+                           const Entry<EntryData> *entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+
+      /* Looks like CoreText applies neither mark nor current substitution for
+       * end-of-text if mark was not explicitly set. */
+      if (buffer->idx == buffer->len && !mark_set)
+        return true;
+
+      if (entry->data.markIndex != 0xFFFF)
+      {
+       const Lookup<GlyphID> &lookup = subs[entry->data.markIndex];
+       hb_glyph_info_t *info = buffer->info;
+       const GlyphID *replacement = lookup.get_value (info[mark].codepoint, driver->num_glyphs);
+       if (replacement)
+       {
+         buffer->unsafe_to_break (mark, MIN (buffer->idx + 1, buffer->len));
+         info[mark].codepoint = *replacement;
+         ret = true;
+       }
+      }
+      if (entry->data.currentIndex != 0xFFFF)
+      {
+        unsigned int idx = MIN (buffer->idx, buffer->len - 1);
+       const Lookup<GlyphID> &lookup = subs[entry->data.currentIndex];
+       hb_glyph_info_t *info = buffer->info;
+       const GlyphID *replacement = lookup.get_value (info[idx].codepoint, driver->num_glyphs);
+       if (replacement)
+       {
+         info[idx].codepoint = *replacement;
+         ret = true;
+       }
+      }
+
+      if (entry->flags & SetMark)
+      {
+       mark_set = true;
+       mark = buffer->idx;
+      }
+
+      return true;
+    }
+
+    public:
+    bool ret;
+    private:
+    bool mark_set;
+    unsigned int mark;
+    const UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT32> &subs;
+  };
+
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this);
+
+    StateTableDriver<EntryData> driver (machine, c->buffer, c->face);
+    driver.drive (&dc);
+
+    return_trace (dc.ret);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    unsigned int num_entries = 0;
+    if (unlikely (!machine.sanitize (c, &num_entries))) return_trace (false);
+
+    unsigned int num_lookups = 0;
+
+    const Entry<EntryData> *entries = machine.get_entries ();
+    for (unsigned int i = 0; i < num_entries; i++)
+    {
+      const EntryData &data = entries[i].data;
+
+      if (data.markIndex != 0xFFFF)
+       num_lookups = MAX<unsigned int> (num_lookups, 1 + data.markIndex);
+      if (data.currentIndex != 0xFFFF)
+       num_lookups = MAX<unsigned int> (num_lookups, 1 + data.currentIndex);
+    }
+
+    return_trace (substitutionTables.sanitize (c, this, num_lookups));
+  }
+
+  protected:
+  StateTable<EntryData>        machine;
+  OffsetTo<UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT32>, HBUINT32>
+                       substitutionTables;
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+struct LigatureSubtable
+{
+  struct EntryData
+  {
+    HBUINT16   ligActionIndex; /* Index to the first ligActionTable entry
+                                * for processing this group, if indicated
+                                * by the flags. */
+    public:
+    DEFINE_SIZE_STATIC (2);
+  };
+
+  struct driver_context_t
+  {
+    static const bool in_place = false;
+    enum Flags {
+      SetComponent     = 0x8000,       /* Push this glyph onto the component stack for
+                                        * eventual processing. */
+      DontAdvance      = 0x4000,       /* Leave the glyph pointer at this glyph for the
+                                          next iteration. */
+      PerformAction    = 0x2000,       /* Use the ligActionIndex to process a ligature
+                                        * group. */
+      Reserved         = 0x1FFF,       /* These bits are reserved and should be set to 0. */
+    };
+    enum LigActionFlags {
+      LigActionLast    = 0x80000000,   /* This is the last action in the list. This also
+                                        * implies storage. */
+      LigActionStore   = 0x40000000,   /* Store the ligature at the current cumulated index
+                                        * in the ligature table in place of the marked
+                                        * (i.e. currently-popped) glyph. */
+      LigActionOffset  = 0x3FFFFFFF,   /* A 30-bit value which is sign-extended to 32-bits
+                                        * and added to the glyph ID, resulting in an index
+                                        * into the component table. */
+    };
+
+    inline driver_context_t (const LigatureSubtable *table,
+                            hb_aat_apply_context_t *c_) :
+       ret (false),
+       c (c_),
+       ligAction (table+table->ligAction),
+       component (table+table->component),
+       ligature (table+table->ligature),
+       match_length (0) {}
+
+    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+                              const Entry<EntryData> *entry)
+    {
+      return !!(entry->flags & PerformAction);
+    }
+    inline bool transition (StateTableDriver<EntryData> *driver,
+                           const Entry<EntryData> *entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+      unsigned int flags = entry->flags;
+
+      if (flags & SetComponent)
+      {
+        if (unlikely (match_length >= ARRAY_LENGTH (match_positions)))
+         return false;
+
+       /* Never mark same index twice, in case DontAdvance was used... */
+       if (match_length && match_positions[match_length - 1] == buffer->out_len)
+         match_length--;
+
+       match_positions[match_length++] = buffer->out_len;
+      }
+
+      if (flags & PerformAction)
+      {
+       unsigned int end = buffer->out_len;
+       unsigned int action_idx = entry->data.ligActionIndex;
+       unsigned int action;
+       unsigned int ligature_idx = 0;
+        do
+       {
+         if (unlikely (!match_length))
+           return false;
+
+         buffer->move_to (match_positions[--match_length]);
+
+         const HBUINT32 &actionData = ligAction[action_idx];
+         if (unlikely (!actionData.sanitize (&c->sanitizer))) return false;
+         action = actionData;
+
+         uint32_t uoffset = action & LigActionOffset;
+         if (uoffset & 0x20000000)
+           uoffset += 0xC0000000;
+         int32_t offset = (int32_t) uoffset;
+         unsigned int component_idx = buffer->cur().codepoint + offset;
+
+         const HBUINT16 &componentData = component[component_idx];
+         if (unlikely (!componentData.sanitize (&c->sanitizer))) return false;
+         ligature_idx += componentData;
+
+         if (action & (LigActionStore | LigActionLast))
+         {
+           const GlyphID &ligatureData = ligature[ligature_idx];
+           if (unlikely (!ligatureData.sanitize (&c->sanitizer))) return false;
+           hb_codepoint_t lig = ligatureData;
+
+           match_positions[match_length++] = buffer->out_len;
+           buffer->replace_glyph (lig);
+
+           //ligature_idx = 0; // XXX Yes or no?
+         }
+         else
+         {
+           buffer->skip_glyph ();
+           end--;
+         }
+         /* TODO merge_clusters / unsafe_to_break */
+
+         action_idx++;
+       }
+       while (!(action & LigActionLast));
+       buffer->move_to (end);
+      }
+
+      return true;
+    }
+
+    public:
+    bool ret;
+    private:
+    hb_aat_apply_context_t *c;
+    const UnsizedArrayOf<HBUINT32> &ligAction;
+    const UnsizedArrayOf<HBUINT16> &component;
+    const UnsizedArrayOf<GlyphID> &ligature;
+    unsigned int match_length;
+    unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
+  };
+
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    driver_context_t dc (this, c);
+
+    StateTableDriver<EntryData> driver (machine, c->buffer, c->face);
+    driver.drive (&dc);
+
+    return_trace (dc.ret);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    /* The rest of array sanitizations are done at run-time. */
+    return_trace (c->check_struct (this) && machine.sanitize (c) &&
+                 ligAction && component && ligature);
+  }
+
+  protected:
+  StateTable<EntryData>        machine;
+  OffsetTo<UnsizedArrayOf<HBUINT32>, HBUINT32>
+               ligAction;      /* Offset to the ligature action table. */
+  OffsetTo<UnsizedArrayOf<HBUINT16>, HBUINT32>
+               component;      /* Offset to the component table. */
+  OffsetTo<UnsizedArrayOf<GlyphID>, HBUINT32>
+               ligature;       /* Offset to the actual ligature lists. */
+  public:
+  DEFINE_SIZE_STATIC (28);
+};
+
+struct NoncontextualSubtable
+{
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    bool ret = false;
+    unsigned int num_glyphs = c->face->get_num_glyphs ();
+
+    hb_glyph_info_t *info = c->buffer->info;
+    unsigned int count = c->buffer->len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const GlyphID *replacement = substitute.get_value (info[i].codepoint, num_glyphs);
+      if (replacement)
+      {
+       info[i].codepoint = *replacement;
+       ret = true;
+      }
+    }
+
+    return_trace (ret);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (substitute.sanitize (c));
+  }
+
+  protected:
+  Lookup<GlyphID>      substitute;
+  public:
+  DEFINE_SIZE_MIN (2);
+};
+
+struct InsertionSubtable
+{
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    /* TODO */
+    return_trace (false);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    /* TODO */
+    return_trace (true);
+  }
+};
+
+
+struct Feature
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16     featureType;    /* The type of feature. */
+  HBUINT16     featureSetting; /* The feature's setting (aka selector). */
+  HBUINT32     enableFlags;    /* Flags for the settings that this feature
+                                * and setting enables. */
+  HBUINT32     disableFlags;   /* Complement of flags for the settings that this
+                                * feature and setting disable. */
+
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+
+struct ChainSubtable
+{
+  friend struct Chain;
+
+  inline unsigned int get_size (void) const { return length; }
+  inline unsigned int get_type (void) const { return coverage & 0xFF; }
+
+  enum Type {
+    Rearrangement      = 0,
+    Contextual         = 1,
+    Ligature           = 2,
+    Noncontextual      = 4,
+    Insertion          = 5
+  };
+
+  inline void apply (hb_aat_apply_context_t *c) const
+  {
+    dispatch (c);
+  }
+
+  template <typename context_t>
+  inline typename context_t::return_t dispatch (context_t *c) const
+  {
+    unsigned int subtable_type = get_type ();
+    TRACE_DISPATCH (this, subtable_type);
+    switch (subtable_type) {
+    case Rearrangement:                return_trace (c->dispatch (u.rearrangement));
+    case Contextual:           return_trace (c->dispatch (u.contextual));
+    case Ligature:             return_trace (c->dispatch (u.ligature));
+    case Noncontextual:                return_trace (c->dispatch (u.noncontextual));
+    case Insertion:            return_trace (c->dispatch (u.insertion));
+    default:                   return_trace (c->default_return_value ());
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!length.sanitize (c) ||
+       length < min_size ||
+       !c->check_range (this, length))
+      return_trace (false);
+
+    return_trace (dispatch (c));
+  }
+
+  protected:
+  HBUINT32     length;         /* Total subtable length, including this header. */
+  HBUINT32     coverage;       /* Coverage flags and subtable type. */
+  HBUINT32     subFeatureFlags;/* The 32-bit mask identifying which subtable this is. */
+  union {
+  RearrangementSubtable                rearrangement;
+  ContextualSubtable           contextual;
+  LigatureSubtable             ligature;
+  NoncontextualSubtable                noncontextual;
+  InsertionSubtable            insertion;
+  } u;
+  public:
+  DEFINE_SIZE_MIN (12);
+};
+
+struct Chain
+{
+  inline void apply (hb_aat_apply_context_t *c) const
+  {
+    const ChainSubtable *subtable = &StructAtOffset<ChainSubtable> (featureZ, featureZ[0].static_size * featureCount);
+    unsigned int count = subtableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (!c->buffer->message (c->font, "start chain subtable %d", c->lookup_index))
+      {
+       c->set_lookup_index (c->lookup_index + 1);
+       continue;
+      }
+
+      subtable->apply (c);
+      subtable = &StructAfter<ChainSubtable> (*subtable);
+
+      (void) c->buffer->message (c->font, "end chain subtable %d", c->lookup_index);
+
+      c->set_lookup_index (c->lookup_index + 1);
+    }
+  }
+
+  inline unsigned int get_size (void) const { return length; }
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int major) const
+  {
+    TRACE_SANITIZE (this);
+    if (!length.sanitize (c) ||
+       length < min_size ||
+       !c->check_range (this, length))
+      return_trace (false);
+
+    if (!c->check_array (featureZ, featureZ[0].static_size, featureCount))
+      return_trace (false);
+
+    const ChainSubtable *subtable = &StructAtOffset<ChainSubtable> (featureZ, featureZ[0].static_size * featureCount);
+    unsigned int count = subtableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (!subtable->sanitize (c))
+       return_trace (false);
+      subtable = &StructAfter<ChainSubtable> (*subtable);
+    }
+
+    return_trace (true);
+  }
+
+  protected:
+  HBUINT32     defaultFlags;   /* The default specification for subtables. */
+  HBUINT32     length;         /* Total byte count, including this header. */
+  HBUINT32     featureCount;   /* Number of feature subtable entries. */
+  HBUINT32     subtableCount;  /* The number of subtables in the chain. */
+
+  Feature      featureZ[VAR];  /* Features. */
+  ChainSubtable        subtableX[VAR]; /* Subtables. */
+  // subtableGlyphCoverageArray if major == 3
+
+  public:
+  DEFINE_SIZE_MIN (16);
+};
+
+
+/*
+ * The 'mort'/'morx' Tables
+ */
+
+struct morx
+{
+  static const hb_tag_t tableTag = HB_AAT_TAG_MORX;
+
+  inline void apply (hb_aat_apply_context_t *c) const
+  {
+    c->set_lookup_index (0);
+    const Chain *chain = chains;
+    unsigned int count = chainCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      chain->apply (c);
+      chain = &StructAfter<Chain> (*chain);
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!version.sanitize (c) ||
+       (version.major >> (sizeof (HBUINT32) == 4 ? 1 : 0)) != 1 ||
+       !chainCount.sanitize (c))
+      return_trace (false);
+
+    const Chain *chain = chains;
+    unsigned int count = chainCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (!chain->sanitize (c, version.major))
+       return_trace (false);
+      chain = &StructAfter<Chain> (*chain);
+    }
+
+    return_trace (true);
+  }
+
+  protected:
+  FixedVersion<>version;       /* Version number of the glyph metamorphosis table.
+                                * 1 for mort, 2 or 3 for morx. */
+  HBUINT32     chainCount;     /* Number of metamorphosis chains contained in this
+                                * table. */
+  Chain                chains[VAR];    /* Chains. */
+
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_MORX_TABLE_HH */
diff --git a/src/hb-aat-layout-private.hh b/src/hb-aat-layout-private.hh
new file mode 100644 (file)
index 0000000..ce75c8e
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2017  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_LAYOUT_PRIVATE_HH
+#define HB_AAT_LAYOUT_PRIVATE_HH
+
+#include "hb-private.hh"
+
+#include "hb-font-private.hh"
+#include "hb-buffer-private.hh"
+#include "hb-open-type-private.hh"
+
+
+HB_INTERNAL void
+hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer);
+
+HB_INTERNAL void
+hb_aat_layout_position (hb_font_t *font, hb_buffer_t *buffer);
+
+#endif /* HB_AAT_LAYOUT_PRIVATE_HH */
diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh
new file mode 100644 (file)
index 0000000..5767b11
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_AAT_LAYOUT_TRAK_TABLE_HH
+#define HB_AAT_LAYOUT_TRAK_TABLE_HH
+
+#include "hb-aat-layout-common-private.hh"
+#include "hb-open-type-private.hh"
+
+#define HB_AAT_TAG_trak HB_TAG('t','r','a','k')
+
+
+namespace AAT {
+
+
+struct TrackTableEntry
+{
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base, unsigned int size) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && (values.sanitize (c, base, size)));
+  }
+
+  inline float get_track_value () const
+  {
+    return track.to_float ();
+  }
+
+  inline int get_value (const void *base, unsigned int index) const
+  {
+    return (base+values)[index];
+  }
+
+  protected:
+  Fixed                        track;          /* Track value for this record. */
+  HBUINT16             trackNameID;    /* The 'name' table index for this track */
+  OffsetTo<UnsizedArrayOf<FWORD> >
+                       values;         /* Offset from start of tracking table to
+                                        * per-size tracking values for this track. */
+
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct TrackData
+{
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                 sizeTable.sanitize (c, base, nSizes) &&
+                 trackTable.sanitize (c, nTracks, base, nSizes));
+  }
+
+  inline float get_tracking (const void *base, float ptem) const
+  {
+    /* CoreText points are CSS pixels (96 per inch),
+     * NOT typographic points (72 per inch).
+     *
+     * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html
+     */
+    float csspx = ptem * 96.f / 72.f;
+    Fixed fixed_size;
+    fixed_size.set_float (csspx);
+
+    /* XXX Clean this up. Make it work with nSizes==1 and 0. */
+
+    unsigned int sizes = nSizes;
+
+    const TrackTableEntry *trackTableEntry = nullptr;
+    for (unsigned int i = 0; i < sizes; ++i)
+      // For now we only seek for track entries with zero tracking value
+      if (trackTable[i].get_track_value () == 0.)
+        trackTableEntry = &trackTable[0];
+
+    // We couldn't match any, exit
+    if (!trackTableEntry) return 0.;
+
+    /* TODO bfind() */
+    unsigned int size_index;
+    UnsizedArrayOf<Fixed> size_table = base+sizeTable;
+    for (size_index = 0; size_index < sizes; ++size_index)
+      if (size_table[size_index] >= fixed_size)
+        break;
+
+    // TODO(ebraminio): We don't attempt to extrapolate to larger or
+    // smaller values for now but we should do, per spec
+    if (size_index == sizes)
+      return trackTableEntry->get_value (base, sizes - 1);
+    if (size_index == 0 || size_table[size_index] == fixed_size)
+      return trackTableEntry->get_value (base, size_index);
+
+    float s0 = size_table[size_index - 1].to_float ();
+    float s1 = size_table[size_index].to_float ();
+    float t = (csspx - s0) / (s1 - s0);
+    return t * trackTableEntry->get_value (base, size_index) +
+      (1.0 - t) * trackTableEntry->get_value (base, size_index - 1);
+  }
+
+  protected:
+  HBUINT16             nTracks;        /* Number of separate tracks included in this table. */
+  HBUINT16             nSizes;         /* Number of point sizes included in this table. */
+  LOffsetTo<UnsizedArrayOf<Fixed> >    /* Offset to array[nSizes] of size values. */
+                       sizeTable;
+  UnsizedArrayOf<TrackTableEntry>
+                       trackTable;     /* Array[nTracks] of TrackTableEntry records. */
+
+  public:
+  DEFINE_SIZE_ARRAY (8, trackTable);
+};
+
+struct trak
+{
+  static const hb_tag_t tableTag = HB_AAT_TAG_trak;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    return_trace (c->check_struct (this) &&
+                 horizData.sanitize (c, this, this) &&
+                 vertData.sanitize (c, this, this));
+  }
+
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    const float ptem = c->font->ptem;
+    if (ptem <= 0.f)
+      return_trace (false);
+
+    hb_buffer_t *buffer = c->buffer;
+    if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+    {
+      const TrackData &trackData = this+horizData;
+      float tracking = trackData.get_tracking (this, ptem);
+      hb_position_t advance_to_add = c->font->em_scalef_x (tracking / 2);
+      foreach_grapheme (buffer, start, end)
+      {
+       /* TODO This is wrong. */
+       buffer->pos[start].x_advance += advance_to_add;
+       buffer->pos[end].x_advance += advance_to_add;
+      }
+    }
+    else
+    {
+      const TrackData &trackData = this+vertData;
+      float tracking = trackData.get_tracking (this, ptem);
+      hb_position_t advance_to_add = c->font->em_scalef_y (tracking / 2);
+      foreach_grapheme (buffer, start, end)
+      {
+       /* TODO This is wrong. */
+       buffer->pos[start].y_advance += advance_to_add;
+       buffer->pos[end].y_advance += advance_to_add;
+      }
+    }
+
+    return_trace (true);
+  }
+
+  protected:
+  FixedVersion<>       version;        /* Version of the tracking table--currently
+                                        * 0x00010000u for version 1.0. */
+  HBUINT16             format;         /* Format of the tracking table */
+  OffsetTo<TrackData>  horizData;      /* TrackData for horizontal text */
+  OffsetTo<TrackData>  vertData;       /* TrackData for vertical text */
+  HBUINT16             reserved;       /* Reserved. Set to 0. */
+
+  public:
+  DEFINE_SIZE_MIN (12);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_TRAK_TABLE_HH */
diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc
new file mode 100644 (file)
index 0000000..45268e3
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * Copyright © 2017  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-open-type-private.hh"
+
+#include "hb-ot-layout-private.hh"
+#include "hb-ot-layout-gsubgpos-private.hh"
+
+#include "hb-aat-layout-private.hh"
+#include "hb-aat-layout-ankr-table.hh"
+#include "hb-aat-layout-kerx-table.hh"
+#include "hb-aat-layout-morx-table.hh"
+#include "hb-aat-layout-trak-table.hh"
+
+/*
+ * morx/kerx/trak
+ */
+
+static inline const AAT::ankr&
+_get_ankr (hb_face_t *face, hb_blob_t **blob = nullptr)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
+  {
+    if (blob)
+      *blob = hb_blob_get_empty ();
+    return OT::Null(AAT::ankr);
+  }
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  const AAT::ankr& ankr = *(layout->ankr.get ());
+  if (blob)
+    *blob = layout->ankr.blob;
+  return ankr;
+}
+
+static inline const AAT::kerx&
+_get_kerx (hb_face_t *face, hb_blob_t **blob = nullptr)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
+  {
+    if (blob)
+      *blob = hb_blob_get_empty ();
+    return OT::Null(AAT::kerx);
+  }
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  /* XXX this doesn't call set_num_glyphs on sanitizer. */
+  const AAT::kerx& kerx = *(layout->kerx.get ());
+  if (blob)
+    *blob = layout->kerx.blob;
+  return kerx;
+}
+
+static inline const AAT::morx&
+_get_morx (hb_face_t *face, hb_blob_t **blob = nullptr)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
+  {
+    if (blob)
+      *blob = hb_blob_get_empty ();
+    return OT::Null(AAT::morx);
+  }
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  /* XXX this doesn't call set_num_glyphs on sanitizer. */
+  const AAT::morx& morx = *(layout->morx.get ());
+  if (blob)
+    *blob = layout->morx.blob;
+  return morx;
+}
+
+static inline const AAT::trak&
+_get_trak (hb_face_t *face, hb_blob_t **blob = nullptr)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
+  {
+    if (blob)
+      *blob = hb_blob_get_empty ();
+    return OT::Null(AAT::trak);
+  }
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  const AAT::trak& trak = *(layout->trak.get ());
+  if (blob)
+    *blob = layout->trak.blob;
+  return trak;
+}
+
+// static inline void
+// _hb_aat_layout_create (hb_face_t *face)
+// {
+//   OT::Sanitizer<AAT::morx> sanitizer;
+//   sanitizer.set_num_glyphs (face->get_num_glyphs ());
+//   hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_MORX));
+//   OT::Sanitizer<AAT::morx>::lock_instance (morx_blob);
+
+//   if (0)
+//   {
+//     OT::Sanitizer<AAT::Lookup<OT::GlyphID> >::lock_instance (morx_blob)->get_value (1, face->get_num_glyphs ());
+//   }
+// }
+
+void
+hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer)
+{
+  hb_blob_t *blob;
+  const AAT::morx& morx = _get_morx (font->face, &blob);
+
+  AAT::hb_aat_apply_context_t c (font, buffer, blob);
+  morx.apply (&c);
+}
+
+void
+hb_aat_layout_position (hb_font_t *font, hb_buffer_t *buffer)
+{
+  hb_blob_t *blob;
+  const AAT::ankr& ankr = _get_ankr (font->face, &blob);
+  const AAT::kerx& kerx = _get_kerx (font->face, &blob);
+  const AAT::trak& trak = _get_trak (font->face, &blob);
+
+  AAT::hb_aat_apply_context_t c (font, buffer, blob);
+  kerx.apply (&c, &ankr);
+  trak.apply (&c);
+}
index 100ba53..a7e9b11 100644 (file)
@@ -70,6 +70,29 @@ typedef LONG hb_atomic_int_impl_t;
 #define hb_atomic_ptr_impl_cmpexch(P,O,N)      (InterlockedCompareExchangePointer ((void **) (P), (void *) (N), (void *) (O)) == (void *) (O))
 
 
 #define hb_atomic_ptr_impl_cmpexch(P,O,N)      (InterlockedCompareExchangePointer ((void **) (P), (void *) (N), (void *) (O)) == (void *) (O))
 
 
+#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
+
+typedef int hb_atomic_int_impl_t;
+#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
+#define hb_atomic_int_impl_add(AI, V)          __sync_fetch_and_add (&(AI), (V))
+
+#define hb_atomic_ptr_impl_get(P)              (void *) (__sync_synchronize (), *(P))
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)      __sync_bool_compare_and_swap ((P), (O), (N))
+
+
+#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS)
+
+#include <atomic.h>
+#include <mbarrier.h>
+
+typedef unsigned int hb_atomic_int_impl_t;
+#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
+#define hb_atomic_int_impl_add(AI, V)          ( ({__machine_rw_barrier ();}), atomic_add_int_nv (&(AI), (V)) - (V))
+
+#define hb_atomic_ptr_impl_get(P)              ( ({__machine_rw_barrier ();}), (void *) *(P))
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)      ( ({__machine_rw_barrier ();}), atomic_cas_ptr ((void **) (P), (void *) (O), (void *) (N)) == (void *) (O) ? true : false)
+
+
 #elif !defined(HB_NO_MT) && defined(__APPLE__)
 
 #include <libkern/OSAtomic.h>
 #elif !defined(HB_NO_MT) && defined(__APPLE__)
 
 #include <libkern/OSAtomic.h>
@@ -89,48 +112,25 @@ typedef int32_t hb_atomic_int_impl_t;
 #define hb_atomic_ptr_impl_cmpexch(P,O,N)      OSAtomicCompareAndSwapPtrBarrier ((void *) (O), (void *) (N), (void **) (P))
 #else
 #if __ppc64__ || __x86_64__ || __aarch64__
 #define hb_atomic_ptr_impl_cmpexch(P,O,N)      OSAtomicCompareAndSwapPtrBarrier ((void *) (O), (void *) (N), (void **) (P))
 #else
 #if __ppc64__ || __x86_64__ || __aarch64__
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)      OSAtomicCompareAndSwap64Barrier ((int64_t) (O), (int64_t) (N), (int64_t*) (P))
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)      OSAtomicCompareAndSwap64Barrier ((int64_t) (void *) (O), (int64_t) (void *) (N), (int64_t*) (P))
 #else
 #else
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)      OSAtomicCompareAndSwap32Barrier ((int32_t) (O), (int32_t) (N), (int32_t*) (P))
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)      OSAtomicCompareAndSwap32Barrier ((int32_t) (void *) (O), (int32_t) (void *) (N), (int32_t*) (P))
 #endif
 #endif
 
 
 #endif
 #endif
 
 
-#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
-
-typedef int hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V)          __sync_fetch_and_add (&(AI), (V))
-
-#define hb_atomic_ptr_impl_get(P)              (void *) (__sync_synchronize (), *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)      __sync_bool_compare_and_swap ((P), (O), (N))
-
-
-#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS)
-
-#include <atomic.h>
-#include <mbarrier.h>
-
-typedef unsigned int hb_atomic_int_impl_t;
-#define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V)          ( ({__machine_rw_barrier ();}), atomic_add_int_nv (&(AI), (V)) - (V))
-
-#define hb_atomic_ptr_impl_get(P)              ( ({__machine_rw_barrier ();}), (void *) *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)      ( ({__machine_rw_barrier ();}), atomic_cas_ptr ((void **) (P), (void *) (O), (void *) (N)) == (void *) (O) ? true : false)
-
-
 #elif !defined(HB_NO_MT) && defined(_AIX) && defined(__IBMCPP__)
 
 #include <builtins.h>
 
 
 #elif !defined(HB_NO_MT) && defined(_AIX) && defined(__IBMCPP__)
 
 #include <builtins.h>
 
 
-static inline int hb_fetch_and_add(volatile int* AI, unsigned int V) {
+static inline int _hb_fetch_and_add(volatile int* AI, unsigned int V) {
   __lwsync();
   int result = __fetch_and_add(AI, V);
   __isync();
   return result;
 }
   __lwsync();
   int result = __fetch_and_add(AI, V);
   __isync();
   return result;
 }
-static inline int hb_compare_and_swaplp(volatile long* P, long O, long N) {
+static inline int _hb_compare_and_swaplp(volatile long* P, long O, long N) {
   __sync();
   int result = __compare_and_swaplp (P, &O, N);
   __sync();
   __sync();
   int result = __compare_and_swaplp (P, &O, N);
   __sync();
@@ -139,10 +139,10 @@ static inline int hb_compare_and_swaplp(volatile long* P, long O, long N) {
 
 typedef int hb_atomic_int_impl_t;
 #define HB_ATOMIC_INT_IMPL_INIT(V) (V)
 
 typedef int hb_atomic_int_impl_t;
 #define HB_ATOMIC_INT_IMPL_INIT(V) (V)
-#define hb_atomic_int_impl_add(AI, V)           hb_fetch_and_add (&(AI), (V))
+#define hb_atomic_int_impl_add(AI, V)           _hb_fetch_and_add (&(AI), (V))
 
 #define hb_atomic_ptr_impl_get(P)               (__sync(), (void *) *(P))
 
 #define hb_atomic_ptr_impl_get(P)               (__sync(), (void *) *(P))
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)       hb_compare_and_swaplp ((long*)(P), (long)(O), (long)(N))
+#define hb_atomic_ptr_impl_cmpexch(P,O,N)       _hb_compare_and_swaplp ((long*)(P), (long)(O), (long)(N))
 
 #elif !defined(HB_NO_MT)
 
 
 #elif !defined(HB_NO_MT)
 
index fb48f03..b5291f6 100644 (file)
 
 /* http://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html */
 #ifndef _POSIX_C_SOURCE
 
 /* http://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html */
 #ifndef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 199309L
+#define _POSIX_C_SOURCE 200809L
 #endif
 
 #include "hb-private.hh"
 #endif
 
 #include "hb-private.hh"
+#include "hb-debug.hh"
 
 #include "hb-object-private.hh"
 
 
 #include "hb-object-private.hh"
 
 #include <errno.h>
 
 
 #include <errno.h>
 
 
-
-#ifndef HB_DEBUG_BLOB
-#define HB_DEBUG_BLOB (HB_DEBUG+0)
-#endif
-
-
 struct hb_blob_t {
   hb_object_header_t header;
   ASSERT_POD ();
 struct hb_blob_t {
   hb_object_header_t header;
   ASSERT_POD ();
@@ -72,8 +67,8 @@ _hb_blob_destroy_user_data (hb_blob_t *blob)
 {
   if (blob->destroy) {
     blob->destroy (blob->user_data);
 {
   if (blob->destroy) {
     blob->destroy (blob->user_data);
-    blob->user_data = NULL;
-    blob->destroy = NULL;
+    blob->user_data = nullptr;
+    blob->destroy = nullptr;
   }
 }
 
   }
 }
 
@@ -128,6 +123,12 @@ hb_blob_create (const char        *data,
   return blob;
 }
 
   return blob;
 }
 
+static void
+_hb_blob_destroy (void *data)
+{
+  hb_blob_destroy ((hb_blob_t *) data);
+}
+
 /**
  * hb_blob_create_sub_blob:
  * @parent: Parent blob.
 /**
  * hb_blob_create_sub_blob:
  * @parent: Parent blob.
@@ -164,7 +165,32 @@ hb_blob_create_sub_blob (hb_blob_t    *parent,
                         MIN (length, parent->length - offset),
                         HB_MEMORY_MODE_READONLY,
                         hb_blob_reference (parent),
                         MIN (length, parent->length - offset),
                         HB_MEMORY_MODE_READONLY,
                         hb_blob_reference (parent),
-                        (hb_destroy_func_t) hb_blob_destroy);
+                        _hb_blob_destroy);
+
+  return blob;
+}
+
+/**
+ * hb_blob_copy_writable_or_fail:
+ * @blob: A blob.
+ *
+ * Makes a writable copy of @blob.
+ *
+ * Return value: New blob, or nullptr if allocation failed.
+ *
+ * Since: 1.8.0
+ **/
+hb_blob_t *
+hb_blob_copy_writable_or_fail (hb_blob_t *blob)
+{
+  blob = hb_blob_create (blob->data,
+                        blob->length,
+                        HB_MEMORY_MODE_DUPLICATE,
+                        nullptr,
+                        nullptr);
+
+  if (unlikely (blob == hb_blob_get_empty ()))
+    blob = nullptr;
 
   return blob;
 }
 
   return blob;
 }
@@ -188,12 +214,12 @@ hb_blob_get_empty (void)
 
     true, /* immutable */
 
 
     true, /* immutable */
 
-    NULL, /* data */
+    nullptr, /* data */
     0, /* length */
     HB_MEMORY_MODE_READONLY, /* mode */
 
     0, /* length */
     HB_MEMORY_MODE_READONLY, /* mode */
 
-    NULL, /* user_data */
-    NULL  /* destroy */
+    nullptr, /* user_data */
+    nullptr  /* destroy */
   };
 
   return const_cast<hb_blob_t *> (&_hb_blob_nil);
   };
 
   return const_cast<hb_blob_t *> (&_hb_blob_nil);
@@ -221,7 +247,7 @@ hb_blob_reference (hb_blob_t *blob)
  * hb_blob_destroy: (skip)
  * @blob: a blob.
  *
  * hb_blob_destroy: (skip)
  * @blob: a blob.
  *
- * Descreases the reference count on @blob, and if it reaches zero, destroys
+ * Decreases the reference count on @blob, and if it reaches zero, destroys
  * @blob, freeing all memory, possibly calling the destroy-callback the blob
  * was created for if it has not been called already.
  *
  * @blob, freeing all memory, possibly calling the destroy-callback the blob
  * was created for if it has not been called already.
  *
@@ -373,7 +399,7 @@ hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length)
     if (length)
       *length = 0;
 
     if (length)
       *length = 0;
 
-    return NULL;
+    return nullptr;
   }
 
   if (length)
   }
 
   if (length)
index ef3fc98..fd561f7 100644 (file)
@@ -44,7 +44,7 @@ HB_BEGIN_DECLS
  *   any such possibility, MODE_DUPLICATE should be used
  *   such that HarfBuzz makes a copy immediately,
  *
  *   any such possibility, MODE_DUPLICATE should be used
  *   such that HarfBuzz makes a copy immediately,
  *
- * - Use MODE_READONLY otherse, unless you really really
+ * - Use MODE_READONLY otherwise, unless you really really
  *   really know what you are doing,
  *
  * - MODE_WRITABLE is appropriate if you really made a
  *   really know what you are doing,
  *
  * - MODE_WRITABLE is appropriate if you really made a
@@ -83,6 +83,9 @@ hb_blob_create_sub_blob (hb_blob_t    *parent,
                         unsigned int  length);
 
 HB_EXTERN hb_blob_t *
                         unsigned int  length);
 
 HB_EXTERN hb_blob_t *
+hb_blob_copy_writable_or_fail (hb_blob_t *blob);
+
+HB_EXTERN hb_blob_t *
 hb_blob_get_empty (void);
 
 HB_EXTERN hb_blob_t *
 hb_blob_get_empty (void);
 
 HB_EXTERN hb_blob_t *
index 3f626bd..be374c7 100644 (file)
 
 #line 36 "hb-buffer-deserialize-json.hh"
 static const unsigned char _deserialize_json_trans_keys[] = {
 
 #line 36 "hb-buffer-deserialize-json.hh"
 static const unsigned char _deserialize_json_trans_keys[] = {
-       0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 
-       48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 
-       9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, 
-       120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 
-       9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 
+       0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u,
+       48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u,
+       9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u,
+       120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u,
+       9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u,
        65u, 122u, 34u, 122u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0
 };
 
 static const char _deserialize_json_key_spans[] = {
        65u, 122u, 34u, 122u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0
 };
 
 static const char _deserialize_json_key_spans[] = {
-       0, 115, 26, 7, 2, 1, 50, 49, 
-       10, 117, 117, 117, 1, 50, 49, 10, 
-       117, 117, 1, 1, 50, 49, 117, 117, 
-       2, 1, 50, 49, 10, 117, 117, 1, 
-       50, 49, 10, 117, 117, 1, 50, 49, 
+       0, 115, 26, 7, 2, 1, 50, 49,
+       10, 117, 117, 117, 1, 50, 49, 10,
+       117, 117, 1, 1, 50, 49, 117, 117,
+       2, 1, 50, 49, 10, 117, 117, 1,
+       50, 49, 10, 117, 117, 1, 50, 49,
        58, 89, 117, 117, 85, 115, 0
 };
 
 static const short _deserialize_json_index_offsets[] = {
        58, 89, 117, 117, 85, 115, 0
 };
 
 static const short _deserialize_json_index_offsets[] = {
-       0, 0, 116, 143, 151, 154, 156, 207, 
-       257, 268, 386, 504, 622, 624, 675, 725, 
-       736, 854, 972, 974, 976, 1027, 1077, 1195, 
-       1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666, 
-       1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069, 
+       0, 0, 116, 143, 151, 154, 156, 207,
+       257, 268, 386, 504, 622, 624, 675, 725,
+       736, 854, 972, 974, 976, 1027, 1077, 1195,
+       1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666,
+       1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069,
        2119, 2178, 2268, 2386, 2504, 2590, 2706
 };
 
 static const char _deserialize_json_indicies[] = {
        2119, 2178, 2268, 2386, 2504, 2590, 2706
 };
 
 static const char _deserialize_json_indicies[] = {
-       0, 0, 0, 0, 0, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       0, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 2, 1, 3, 3, 3, 
-       3, 3, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 3, 1, 4, 1, 
-       5, 1, 6, 7, 1, 1, 8, 1, 
-       9, 10, 1, 11, 1, 11, 11, 11, 
-       11, 11, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 11, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 12, 1, 
-       12, 12, 12, 12, 12, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 12, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 13, 1, 1, 14, 
-       15, 15, 15, 15, 15, 15, 15, 15, 
-       15, 1, 16, 17, 17, 17, 17, 17, 
-       17, 17, 17, 17, 1, 18, 18, 18, 
-       18, 18, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 18, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       19, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 20, 1, 21, 21, 21, 21, 21, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 21, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 3, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 22, 
-       1, 18, 18, 18, 18, 18, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       18, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 19, 1, 1, 1, 
-       17, 17, 17, 17, 17, 17, 17, 17, 
-       17, 17, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 20, 1, 23, 
-       1, 23, 23, 23, 23, 23, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       23, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 24, 1, 24, 24, 24, 24, 
-       24, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 24, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       25, 1, 1, 26, 27, 27, 27, 27, 
-       27, 27, 27, 27, 27, 1, 28, 29, 
-       29, 29, 29, 29, 29, 29, 29, 29, 
-       1, 30, 30, 30, 30, 30, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       30, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 31, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 32, 1, 30, 
-       30, 30, 30, 30, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 30, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 31, 1, 1, 1, 29, 29, 
-       29, 29, 29, 29, 29, 29, 29, 29, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 32, 1, 33, 1, 34, 
-       1, 34, 34, 34, 34, 34, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       34, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 35, 1, 35, 35, 35, 35, 
-       35, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 35, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 36, 37, 37, 37, 37, 
-       37, 37, 37, 37, 37, 1, 38, 38, 
-       38, 38, 38, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 38, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 39, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 40, 1, 38, 38, 38, 38, 
-       38, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 38, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 39, 
-       1, 1, 1, 41, 41, 41, 41, 41, 
-       41, 41, 41, 41, 41, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       40, 1, 42, 43, 1, 44, 1, 44, 
-       44, 44, 44, 44, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 44, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       45, 1, 45, 45, 45, 45, 45, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 45, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 46, 1, 
-       1, 47, 48, 48, 48, 48, 48, 48, 
-       48, 48, 48, 1, 49, 50, 50, 50, 
-       50, 50, 50, 50, 50, 50, 1, 51, 
-       51, 51, 51, 51, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 51, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 52, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 53, 1, 51, 51, 51, 
-       51, 51, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 51, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       52, 1, 1, 1, 50, 50, 50, 50, 
-       50, 50, 50, 50, 50, 50, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 53, 1, 54, 1, 54, 54, 54, 
-       54, 54, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 54, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 55, 1, 
-       55, 55, 55, 55, 55, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 55, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 56, 1, 1, 57, 
-       58, 58, 58, 58, 58, 58, 58, 58, 
-       58, 1, 59, 60, 60, 60, 60, 60, 
-       60, 60, 60, 60, 1, 61, 61, 61, 
-       61, 61, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 61, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       62, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 63, 1, 61, 61, 61, 61, 61, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 61, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 62, 1, 
-       1, 1, 60, 60, 60, 60, 60, 60, 
-       60, 60, 60, 60, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 63, 
-       1, 64, 1, 64, 64, 64, 64, 64, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 64, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 65, 1, 65, 65, 
-       65, 65, 65, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 65, 1, 66, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 67, 68, 68, 
-       68, 68, 68, 68, 68, 68, 68, 1, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 1, 1, 1, 1, 1, 1, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 69, 69, 69, 69, 69, 69, 
-       69, 69, 1, 70, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 71, 71, 
-       1, 71, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 1, 1, 1, 1, 1, 
-       1, 1, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 1, 1, 1, 1, 
-       71, 1, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 71, 71, 71, 71, 
-       71, 71, 71, 71, 1, 72, 72, 72, 
-       72, 72, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 72, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       73, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 74, 1, 72, 72, 72, 72, 72, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 72, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 73, 1, 
-       1, 1, 75, 75, 75, 75, 75, 75, 
-       75, 75, 75, 75, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 74, 
-       1, 76, 76, 76, 76, 76, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       76, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 77, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 78, 1, 0, 
-       0, 0, 0, 0, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 0, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
+       0, 0, 0, 0, 0, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       0, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 2, 1, 3, 3, 3,
+       3, 3, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 3, 1, 4, 1,
+       5, 1, 6, 7, 1, 1, 8, 1,
+       9, 10, 1, 11, 1, 11, 11, 11,
+       11, 11, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 11, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 12, 1,
+       12, 12, 12, 12, 12, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 12,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 13, 1, 1, 14,
+       15, 15, 15, 15, 15, 15, 15, 15,
+       15, 1, 16, 17, 17, 17, 17, 17,
+       17, 17, 17, 17, 1, 18, 18, 18,
+       18, 18, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 18, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       19, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 20, 1, 21, 21, 21, 21, 21,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 21, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 3, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 22,
+       1, 18, 18, 18, 18, 18, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       18, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 19, 1, 1, 1,
+       17, 17, 17, 17, 17, 17, 17, 17,
+       17, 17, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 20, 1, 23,
+       1, 23, 23, 23, 23, 23, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       23, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 24, 1, 24, 24, 24, 24,
+       24, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 24, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       25, 1, 1, 26, 27, 27, 27, 27,
+       27, 27, 27, 27, 27, 1, 28, 29,
+       29, 29, 29, 29, 29, 29, 29, 29,
+       1, 30, 30, 30, 30, 30, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       30, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 31, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 32, 1, 30,
+       30, 30, 30, 30, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 30, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 31, 1, 1, 1, 29, 29,
+       29, 29, 29, 29, 29, 29, 29, 29,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 32, 1, 33, 1, 34,
+       1, 34, 34, 34, 34, 34, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       34, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 35, 1, 35, 35, 35, 35,
+       35, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 35, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 36, 37, 37, 37, 37,
+       37, 37, 37, 37, 37, 1, 38, 38,
+       38, 38, 38, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 38, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 39, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 40, 1, 38, 38, 38, 38,
+       38, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 38, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 39,
+       1, 1, 1, 41, 41, 41, 41, 41,
+       41, 41, 41, 41, 41, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       40, 1, 42, 43, 1, 44, 1, 44,
+       44, 44, 44, 44, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 44, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       45, 1, 45, 45, 45, 45, 45, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 45, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 46, 1,
+       1, 47, 48, 48, 48, 48, 48, 48,
+       48, 48, 48, 1, 49, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 1, 51,
+       51, 51, 51, 51, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 51, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 52, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 53, 1, 51, 51, 51,
+       51, 51, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 51, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       52, 1, 1, 1, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 53, 1, 54, 1, 54, 54, 54,
+       54, 54, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 54, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 55, 1,
+       55, 55, 55, 55, 55, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 55,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 56, 1, 1, 57,
+       58, 58, 58, 58, 58, 58, 58, 58,
+       58, 1, 59, 60, 60, 60, 60, 60,
+       60, 60, 60, 60, 1, 61, 61, 61,
+       61, 61, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 61, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       62, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 63, 1, 61, 61, 61, 61, 61,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 61, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 62, 1,
+       1, 1, 60, 60, 60, 60, 60, 60,
+       60, 60, 60, 60, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 63,
+       1, 64, 1, 64, 64, 64, 64, 64,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 64, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 65, 1, 65, 65,
+       65, 65, 65, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 65, 1, 66,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 67, 68, 68,
+       68, 68, 68, 68, 68, 68, 68, 1,
+       69, 69, 69, 69, 69, 69, 69, 69,
+       69, 69, 69, 69, 69, 69, 69, 69,
+       69, 69, 69, 69, 69, 69, 69, 69,
+       69, 69, 1, 1, 1, 1, 1, 1,
+       69, 69, 69, 69, 69, 69, 69, 69,
+       69, 69, 69, 69, 69, 69, 69, 69,
+       69, 69, 69, 69, 69, 69, 69, 69,
+       69, 69, 1, 70, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 71, 71,
+       1, 71, 71, 71, 71, 71, 71, 71,
+       71, 71, 71, 1, 1, 1, 1, 1,
+       1, 1, 71, 71, 71, 71, 71, 71,
+       71, 71, 71, 71, 71, 71, 71, 71,
+       71, 71, 71, 71, 71, 71, 71, 71,
+       71, 71, 71, 71, 1, 1, 1, 1,
+       71, 1, 71, 71, 71, 71, 71, 71,
+       71, 71, 71, 71, 71, 71, 71, 71,
+       71, 71, 71, 71, 71, 71, 71, 71,
+       71, 71, 71, 71, 1, 72, 72, 72,
+       72, 72, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 72, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       73, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 74, 1, 72, 72, 72, 72, 72,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 72, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 73, 1,
+       1, 1, 75, 75, 75, 75, 75, 75,
+       75, 75, 75, 75, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 74,
+       1, 76, 76, 76, 76, 76, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       76, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 77, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 78, 1, 0,
+       0, 0, 0, 0, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 0, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
        1, 2, 1, 1, 0
 };
 
 static const char _deserialize_json_trans_targs[] = {
        1, 2, 1, 1, 0
 };
 
 static const char _deserialize_json_trans_targs[] = {
-       1, 0, 2, 2, 3, 4, 18, 24, 
-       37, 5, 12, 6, 7, 8, 9, 11, 
-       9, 11, 10, 2, 44, 10, 44, 13, 
-       14, 15, 16, 17, 16, 17, 10, 2, 
-       44, 19, 20, 21, 22, 23, 10, 2, 
-       44, 23, 25, 31, 26, 27, 28, 29, 
-       30, 29, 30, 10, 2, 44, 32, 33, 
-       34, 35, 36, 35, 36, 10, 2, 44, 
-       38, 39, 40, 42, 43, 41, 10, 41, 
+       1, 0, 2, 2, 3, 4, 18, 24,
+       37, 5, 12, 6, 7, 8, 9, 11,
+       9, 11, 10, 2, 44, 10, 44, 13,
+       14, 15, 16, 17, 16, 17, 10, 2,
+       44, 19, 20, 21, 22, 23, 10, 2,
+       44, 23, 25, 31, 26, 27, 28, 29,
+       30, 29, 30, 10, 2, 44, 32, 33,
+       34, 35, 36, 35, 36, 10, 2, 44,
+       38, 39, 40, 42, 43, 41, 10, 41,
        10, 2, 44, 43, 44, 45, 46
 };
 
 static const char _deserialize_json_trans_actions[] = {
        10, 2, 44, 43, 44, 45, 46
 };
 
 static const char _deserialize_json_trans_actions[] = {
-       0, 0, 1, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 2, 2, 2, 
-       0, 0, 3, 3, 4, 0, 5, 0, 
-       0, 2, 2, 2, 0, 0, 6, 6, 
-       7, 0, 0, 0, 2, 2, 8, 8, 
-       9, 0, 0, 0, 0, 0, 2, 2, 
-       2, 0, 0, 10, 10, 11, 0, 0, 
-       2, 2, 2, 0, 0, 12, 12, 13, 
-       0, 0, 0, 2, 2, 2, 14, 0, 
+       0, 0, 1, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 2, 2, 2,
+       0, 0, 3, 3, 4, 0, 5, 0,
+       0, 2, 2, 2, 0, 0, 6, 6,
+       7, 0, 0, 0, 2, 2, 8, 8,
+       9, 0, 0, 0, 0, 0, 2, 2,
+       2, 0, 0, 10, 10, 11, 0, 0,
+       2, 2, 2, 0, 0, 12, 12, 13,
+       0, 0, 0, 2, 2, 2, 14, 0,
        15, 15, 16, 0, 0, 0, 0
 };
 
        15, 15, 16, 0, 0, 0, 0
 };
 
@@ -448,7 +448,7 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
   const char *p = buf, *pe = buf + buf_len;
 
   /* Ensure we have positions. */
   const char *p = buf, *pe = buf + buf_len;
 
   /* Ensure we have positions. */
-  (void) hb_buffer_get_glyph_positions (buffer, NULL);
+  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
 
   while (p < pe && ISSPACE (*p))
     p++;
 
   while (p < pe && ISSPACE (*p))
     p++;
@@ -457,11 +457,11 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
     *end_ptr = ++p;
   }
 
     *end_ptr = ++p;
   }
 
-  const char *tok = NULL;
+  const char *tok = nullptr;
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
-  
+
 #line 466 "hb-buffer-deserialize-json.hh"
        {
        cs = deserialize_json_start;
 #line 466 "hb-buffer-deserialize-json.hh"
        {
        cs = deserialize_json_start;
index 91b350f..0f7d48e 100644 (file)
@@ -106,7 +106,7 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
   const char *p = buf, *pe = buf + buf_len;
 
   /* Ensure we have positions. */
   const char *p = buf, *pe = buf + buf_len;
 
   /* Ensure we have positions. */
-  (void) hb_buffer_get_glyph_positions (buffer, NULL);
+  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
 
   while (p < pe && ISSPACE (*p))
     p++;
 
   while (p < pe && ISSPACE (*p))
     p++;
@@ -115,7 +115,7 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
     *end_ptr = ++p;
   }
 
     *end_ptr = ++p;
   }
 
-  const char *tok = NULL;
+  const char *tok = nullptr;
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
index d2d8daa..a6ab0bb 100644 (file)
 
 #line 36 "hb-buffer-deserialize-text.hh"
 static const unsigned char _deserialize_text_trans_keys[] = {
 
 #line 36 "hb-buffer-deserialize-text.hh"
 static const unsigned char _deserialize_text_trans_keys[] = {
-       0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 
-       48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 
-       9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 
+       0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u,
+       48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u,
+       9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u,
        9u, 124u, 9u, 124u, 9u, 124u, 0
 };
 
 static const char _deserialize_text_key_spans[] = {
        9u, 124u, 9u, 124u, 9u, 124u, 0
 };
 
 static const char _deserialize_text_key_spans[] = {
-       0, 114, 13, 10, 13, 10, 10, 13, 
-       10, 1, 13, 10, 14, 116, 116, 0, 
-       114, 116, 116, 116, 116, 116, 116, 116, 
+       0, 114, 13, 10, 13, 10, 10, 13,
+       10, 1, 13, 10, 14, 116, 116, 0,
+       114, 116, 116, 116, 116, 116, 116, 116,
        116, 116, 116
 };
 
 static const short _deserialize_text_index_offsets[] = {
        116, 116, 116
 };
 
 static const short _deserialize_text_index_offsets[] = {
-       0, 0, 115, 129, 140, 154, 165, 176, 
-       190, 201, 203, 217, 228, 243, 360, 477, 
-       478, 593, 710, 827, 944, 1061, 1178, 1295, 
+       0, 0, 115, 129, 140, 154, 165, 176,
+       190, 201, 203, 217, 228, 243, 360, 477,
+       478, 593, 710, 827, 944, 1061, 1178, 1295,
        1412, 1529, 1646
 };
 
 static const char _deserialize_text_indicies[] = {
        1412, 1529, 1646
 };
 
 static const char _deserialize_text_indicies[] = {
-       0, 0, 0, 0, 0, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       0, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       2, 3, 3, 3, 3, 3, 3, 3, 
-       3, 3, 1, 1, 1, 1, 1, 1, 
-       1, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 1, 1, 1, 1, 1, 
-       1, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 1, 5, 1, 1, 6, 
-       7, 7, 7, 7, 7, 7, 7, 7, 
-       7, 1, 8, 9, 9, 9, 9, 9, 
-       9, 9, 9, 9, 1, 10, 1, 1, 
-       11, 12, 12, 12, 12, 12, 12, 12, 
-       12, 12, 1, 13, 14, 14, 14, 14, 
-       14, 14, 14, 14, 14, 1, 15, 16, 
-       16, 16, 16, 16, 16, 16, 16, 16, 
-       1, 17, 1, 1, 18, 19, 19, 19, 
-       19, 19, 19, 19, 19, 19, 1, 20, 
-       21, 21, 21, 21, 21, 21, 21, 21, 
-       21, 1, 22, 1, 23, 1, 1, 24, 
-       25, 25, 25, 25, 25, 25, 25, 25, 
-       25, 1, 26, 27, 27, 27, 27, 27, 
-       27, 27, 27, 27, 1, 22, 1, 1, 
-       1, 21, 21, 21, 21, 21, 21, 21, 
-       21, 21, 21, 1, 28, 28, 28, 28, 
-       28, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 28, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 29, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       30, 1, 1, 31, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       32, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 33, 
-       1, 34, 34, 34, 34, 34, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       34, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 35, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 36, 1, 1, 0, 
-       0, 0, 0, 0, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 0, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 2, 3, 
-       3, 3, 3, 3, 3, 3, 3, 3, 
-       1, 1, 1, 1, 1, 1, 1, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 1, 1, 1, 1, 1, 1, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 4, 4, 4, 4, 4, 4, 4, 
-       4, 1, 28, 28, 28, 28, 28, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 28, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 29, 1, 1, 1, 
-       1, 37, 37, 37, 37, 37, 37, 37, 
-       37, 37, 37, 1, 1, 1, 30, 1, 
-       1, 31, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 32, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 33, 1, 38, 
-       38, 38, 38, 38, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 38, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 39, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 40, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 41, 1, 42, 42, 42, 42, 
-       42, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 42, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       43, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 44, 
-       1, 42, 42, 42, 42, 42, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       42, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       14, 14, 14, 14, 14, 14, 14, 14, 
-       14, 14, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 43, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 44, 1, 38, 38, 
-       38, 38, 38, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 38, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 39, 1, 1, 1, 9, 9, 9, 
-       9, 9, 9, 9, 9, 9, 9, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 40, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 41, 1, 45, 45, 45, 45, 45, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 45, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 46, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 47, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 48, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 49, 1, 
-       50, 50, 50, 50, 50, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 50, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 51, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 52, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 53, 1, 50, 50, 50, 
-       50, 50, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 50, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 51, 
-       1, 1, 1, 1, 27, 27, 27, 27, 
-       27, 27, 27, 27, 27, 27, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 52, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       53, 1, 45, 45, 45, 45, 45, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 45, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 46, 1, 1, 1, 
-       1, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 1, 1, 1, 1, 1, 
-       1, 47, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 48, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 49, 1, 28, 
-       28, 28, 28, 28, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 28, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 29, 1, 55, 55, 1, 55, 55, 
-       55, 55, 55, 55, 55, 55, 55, 55, 
-       1, 1, 1, 30, 1, 1, 31, 55, 
-       55, 55, 55, 55, 55, 55, 55, 55, 
-       55, 55, 55, 55, 55, 55, 55, 55, 
-       55, 55, 55, 55, 55, 55, 55, 55, 
-       55, 1, 1, 32, 1, 55, 1, 55, 
-       55, 55, 55, 55, 55, 55, 55, 55, 
-       55, 55, 55, 55, 55, 55, 55, 55, 
-       55, 55, 55, 55, 55, 55, 55, 55, 
+       0, 0, 0, 0, 0, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       0, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       2, 3, 3, 3, 3, 3, 3, 3,
+       3, 3, 1, 1, 1, 1, 1, 1,
+       1, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 1, 1, 1, 1, 1,
+       1, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 1, 5, 1, 1, 6,
+       7, 7, 7, 7, 7, 7, 7, 7,
+       7, 1, 8, 9, 9, 9, 9, 9,
+       9, 9, 9, 9, 1, 10, 1, 1,
+       11, 12, 12, 12, 12, 12, 12, 12,
+       12, 12, 1, 13, 14, 14, 14, 14,
+       14, 14, 14, 14, 14, 1, 15, 16,
+       16, 16, 16, 16, 16, 16, 16, 16,
+       1, 17, 1, 1, 18, 19, 19, 19,
+       19, 19, 19, 19, 19, 19, 1, 20,
+       21, 21, 21, 21, 21, 21, 21, 21,
+       21, 1, 22, 1, 23, 1, 1, 24,
+       25, 25, 25, 25, 25, 25, 25, 25,
+       25, 1, 26, 27, 27, 27, 27, 27,
+       27, 27, 27, 27, 1, 22, 1, 1,
+       1, 21, 21, 21, 21, 21, 21, 21,
+       21, 21, 21, 1, 28, 28, 28, 28,
+       28, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 28, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 29, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       30, 1, 1, 31, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       32, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 33,
+       1, 34, 34, 34, 34, 34, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       34, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 35, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 36, 1, 1, 0,
+       0, 0, 0, 0, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 0, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 2, 3,
+       3, 3, 3, 3, 3, 3, 3, 3,
+       1, 1, 1, 1, 1, 1, 1, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 1, 1, 1, 1, 1, 1, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 1, 28, 28, 28, 28, 28, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 28, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 29, 1, 1, 1,
+       1, 37, 37, 37, 37, 37, 37, 37,
+       37, 37, 37, 1, 1, 1, 30, 1,
+       1, 31, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 32, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 33, 1, 38,
+       38, 38, 38, 38, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 38, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 39, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 40, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 41, 1, 42, 42, 42, 42,
+       42, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 42, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       43, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 44,
+       1, 42, 42, 42, 42, 42, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       42, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       14, 14, 14, 14, 14, 14, 14, 14,
+       14, 14, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 43, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 44, 1, 38, 38,
+       38, 38, 38, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 38, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 39, 1, 1, 1, 9, 9, 9,
+       9, 9, 9, 9, 9, 9, 9, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 40, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 41, 1, 45, 45, 45, 45, 45,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 45, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 46, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 47, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 48,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 49, 1,
+       50, 50, 50, 50, 50, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 50,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 51, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 52, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 53, 1, 50, 50, 50,
+       50, 50, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 50, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 51,
+       1, 1, 1, 1, 27, 27, 27, 27,
+       27, 27, 27, 27, 27, 27, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 52, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       53, 1, 45, 45, 45, 45, 45, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 45, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 46, 1, 1, 1,
+       1, 54, 54, 54, 54, 54, 54, 54,
+       54, 54, 54, 1, 1, 1, 1, 1,
+       1, 47, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 48, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 49, 1, 28,
+       28, 28, 28, 28, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 28, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 29, 1, 55, 55, 1, 55, 55,
+       55, 55, 55, 55, 55, 55, 55, 55,
+       1, 1, 1, 30, 1, 1, 31, 55,
+       55, 55, 55, 55, 55, 55, 55, 55,
+       55, 55, 55, 55, 55, 55, 55, 55,
+       55, 55, 55, 55, 55, 55, 55, 55,
+       55, 1, 1, 32, 1, 55, 1, 55,
+       55, 55, 55, 55, 55, 55, 55, 55,
+       55, 55, 55, 55, 55, 55, 55, 55,
+       55, 55, 55, 55, 55, 55, 55, 55,
        55, 1, 33, 1, 0
 };
 
 static const char _deserialize_text_trans_targs[] = {
        55, 1, 33, 1, 0
 };
 
 static const char _deserialize_text_trans_targs[] = {
-       1, 0, 13, 17, 26, 3, 18, 21, 
-       18, 21, 5, 19, 20, 19, 20, 22, 
-       25, 8, 9, 12, 9, 12, 10, 11, 
-       23, 24, 23, 24, 14, 2, 6, 7, 
-       15, 16, 14, 15, 16, 17, 14, 4, 
-       15, 16, 14, 15, 16, 14, 2, 7, 
+       1, 0, 13, 17, 26, 3, 18, 21,
+       18, 21, 5, 19, 20, 19, 20, 22,
+       25, 8, 9, 12, 9, 12, 10, 11,
+       23, 24, 23, 24, 14, 2, 6, 7,
+       15, 16, 14, 15, 16, 17, 14, 4,
+       15, 16, 14, 15, 16, 14, 2, 7,
        15, 16, 14, 2, 15, 16, 25, 26
 };
 
 static const char _deserialize_text_trans_actions[] = {
        15, 16, 14, 2, 15, 16, 25, 26
 };
 
 static const char _deserialize_text_trans_actions[] = {
-       0, 0, 1, 1, 1, 2, 2, 2, 
-       0, 0, 2, 2, 2, 0, 0, 2, 
-       2, 2, 2, 2, 0, 0, 3, 2, 
-       2, 2, 0, 0, 4, 5, 5, 5, 
-       4, 4, 0, 0, 0, 0, 6, 7, 
-       6, 6, 8, 8, 8, 9, 10, 10, 
+       0, 0, 1, 1, 1, 2, 2, 2,
+       0, 0, 2, 2, 2, 0, 0, 2,
+       2, 2, 2, 2, 0, 0, 3, 2,
+       2, 2, 0, 0, 4, 5, 5, 5,
+       4, 4, 0, 0, 0, 0, 6, 7,
+       6, 6, 8, 8, 8, 9, 10, 10,
        9, 9, 11, 12, 11, 11, 0, 0
 };
 
 static const char _deserialize_text_eof_actions[] = {
        9, 9, 11, 12, 11, 11, 0, 0
 };
 
 static const char _deserialize_text_eof_actions[] = {
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 4, 0, 0, 
-       0, 4, 6, 8, 8, 6, 9, 11, 
+       0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 4, 0, 0,
+       0, 4, 6, 8, 8, 6, 9, 11,
        11, 9, 4
 };
 
        11, 9, 4
 };
 
@@ -325,7 +325,7 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
   const char *p = buf, *pe = buf + buf_len;
 
   /* Ensure we have positions. */
   const char *p = buf, *pe = buf + buf_len;
 
   /* Ensure we have positions. */
-  (void) hb_buffer_get_glyph_positions (buffer, NULL);
+  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
 
   while (p < pe && ISSPACE (*p))
     p++;
 
   while (p < pe && ISSPACE (*p))
     p++;
@@ -334,11 +334,11 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
     *end_ptr = ++p;
   }
 
     *end_ptr = ++p;
   }
 
-  const char *eof = pe, *tok = NULL;
+  const char *eof = pe, *tok = nullptr;
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
-  
+
 #line 343 "hb-buffer-deserialize-text.hh"
        {
        cs = deserialize_text_start;
 #line 343 "hb-buffer-deserialize-text.hh"
        {
        cs = deserialize_text_start;
index 8a682f7..fd9be42 100644 (file)
@@ -100,7 +100,7 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
   const char *p = buf, *pe = buf + buf_len;
 
   /* Ensure we have positions. */
   const char *p = buf, *pe = buf + buf_len;
 
   /* Ensure we have positions. */
-  (void) hb_buffer_get_glyph_positions (buffer, NULL);
+  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
 
   while (p < pe && ISSPACE (*p))
     p++;
 
   while (p < pe && ISSPACE (*p))
     p++;
@@ -109,7 +109,7 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
     *end_ptr = ++p;
   }
 
     *end_ptr = ++p;
   }
 
-  const char *eof = pe, *tok = NULL;
+  const char *eof = pe, *tok = nullptr;
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
index bca308d..af4767f 100644 (file)
@@ -35,8 +35,8 @@
 #include "hb-unicode-private.hh"
 
 
 #include "hb-unicode-private.hh"
 
 
-#ifndef HB_BUFFER_MAX_EXPANSION_FACTOR
-#define HB_BUFFER_MAX_EXPANSION_FACTOR 32
+#ifndef HB_BUFFER_MAX_LEN_FACTOR
+#define HB_BUFFER_MAX_LEN_FACTOR 32
 #endif
 #ifndef HB_BUFFER_MAX_LEN_MIN
 #define HB_BUFFER_MAX_LEN_MIN 8192
 #endif
 #ifndef HB_BUFFER_MAX_LEN_MIN
 #define HB_BUFFER_MAX_LEN_MIN 8192
 #define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
 #endif
 
 #define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
 #endif
 
-ASSERT_STATIC (sizeof (hb_glyph_info_t) == 20);
-ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t));
+#ifndef HB_BUFFER_MAX_OPS_FACTOR
+#define HB_BUFFER_MAX_OPS_FACTOR 64
+#endif
+#ifndef HB_BUFFER_MAX_OPS_MIN
+#define HB_BUFFER_MAX_OPS_MIN 1024
+#endif
+#ifndef HB_BUFFER_MAX_OPS_DEFAULT
+#define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */
+#endif
+
+static_assert ((sizeof (hb_glyph_info_t) == 20), "");
+static_assert ((sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)), "");
 
 HB_MARK_AS_FLAG_T (hb_buffer_flags_t);
 HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t);
 
 HB_MARK_AS_FLAG_T (hb_buffer_flags_t);
 HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t);
+HB_MARK_AS_FLAG_T (hb_buffer_diff_flags_t);
 
 enum hb_buffer_scratch_flags_t {
   HB_BUFFER_SCRATCH_FLAG_DEFAULT                       = 0x00000000u,
 
 enum hb_buffer_scratch_flags_t {
   HB_BUFFER_SCRATCH_FLAG_DEFAULT                       = 0x00000000u,
@@ -57,6 +68,9 @@ enum hb_buffer_scratch_flags_t {
   HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES                = 0x00000002u,
   HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK            = 0x00000004u,
   HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT           = 0x00000008u,
   HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES                = 0x00000002u,
   HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK            = 0x00000004u,
   HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT           = 0x00000008u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK           = 0x00000010u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_CGJ                       = 0x00000020u,
+
   /* Reserved for complex shapers' internal use. */
   HB_BUFFER_SCRATCH_FLAG_COMPLEX0                      = 0x01000000u,
   HB_BUFFER_SCRATCH_FLAG_COMPLEX1                      = 0x02000000u,
   /* Reserved for complex shapers' internal use. */
   HB_BUFFER_SCRATCH_FLAG_COMPLEX0                      = 0x01000000u,
   HB_BUFFER_SCRATCH_FLAG_COMPLEX1                      = 0x02000000u,
@@ -79,8 +93,9 @@ struct hb_buffer_t {
   hb_buffer_flags_t flags; /* BOT / EOT / etc. */
   hb_buffer_cluster_level_t cluster_level;
   hb_codepoint_t replacement; /* U+FFFD or something else. */
   hb_buffer_flags_t flags; /* BOT / EOT / etc. */
   hb_buffer_cluster_level_t cluster_level;
   hb_codepoint_t replacement; /* U+FFFD or something else. */
-  hb_buffer_scratch_flags_t scratch_flags; /* Have space-flallback, etc. */
+  hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */
   unsigned int max_len; /* Maximum allowed len. */
   unsigned int max_len; /* Maximum allowed len. */
+  int max_ops; /* Maximum allowed operations. */
 
   /* Buffer contents */
   hb_buffer_content_type_t content_type;
 
   /* Buffer contents */
   hb_buffer_content_type_t content_type;
@@ -99,17 +114,6 @@ struct hb_buffer_t {
   hb_glyph_info_t     *out_info;
   hb_glyph_position_t *pos;
 
   hb_glyph_info_t     *out_info;
   hb_glyph_position_t *pos;
 
-  inline hb_glyph_info_t &cur (unsigned int i = 0) { return info[idx + i]; }
-  inline hb_glyph_info_t cur (unsigned int i = 0) const { return info[idx + i]; }
-
-  inline hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; }
-  inline hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; }
-
-  inline hb_glyph_info_t &prev (void) { return out_info[out_len ? out_len - 1 : 0]; }
-  inline hb_glyph_info_t prev (void) const { return out_info[out_len ? out_len - 1 : 0]; }
-
-  inline bool has_separate_output (void) const { return info != out_info; }
-
   unsigned int serial;
 
   /* Text before / after the main buffer contents.
   unsigned int serial;
 
   /* Text before / after the main buffer contents.
@@ -129,6 +133,10 @@ struct hb_buffer_t {
 #ifndef HB_NDEBUG
   uint8_t allocated_var_bits;
 #endif
 #ifndef HB_NDEBUG
   uint8_t allocated_var_bits;
 #endif
+
+
+  /* Methods */
+
   inline void allocate_var (unsigned int start, unsigned int count)
   {
 #ifndef HB_NDEBUG
   inline void allocate_var (unsigned int start, unsigned int count)
   {
 #ifndef HB_NDEBUG
@@ -165,8 +173,17 @@ struct hb_buffer_t {
 #endif
   }
 
 #endif
   }
 
+  inline hb_glyph_info_t &cur (unsigned int i = 0) { return info[idx + i]; }
+  inline hb_glyph_info_t cur (unsigned int i = 0) const { return info[idx + i]; }
+
+  inline hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; }
+  inline hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; }
+
+  inline hb_glyph_info_t &prev (void) { return out_info[out_len ? out_len - 1 : 0]; }
+  inline hb_glyph_info_t prev (void) const { return out_info[out_len ? out_len - 1 : 0]; }
+
+  inline bool has_separate_output (void) const { return info != out_info; }
 
 
-  /* Methods */
 
   HB_INTERNAL void reset (void);
   HB_INTERNAL void clear (void);
 
   HB_INTERNAL void reset (void);
   HB_INTERNAL void clear (void);
@@ -232,25 +249,31 @@ struct hb_buffer_t {
     for (unsigned int j = 0; j < len; j++)
       info[j].mask |= mask;
   }
     for (unsigned int j = 0; j < len; j++)
       info[j].mask |= mask;
   }
-  HB_INTERNAL void set_masks (hb_mask_t value,
-                             hb_mask_t mask,
-                             unsigned int cluster_start,
-                             unsigned int cluster_end);
+  HB_INTERNAL void set_masks (hb_mask_t value, hb_mask_t mask,
+                             unsigned int cluster_start, unsigned int cluster_end);
 
 
-  HB_INTERNAL void merge_clusters (unsigned int start,
-                                  unsigned int end)
+  inline void merge_clusters (unsigned int start, unsigned int end)
   {
     if (end - start < 2)
       return;
     merge_clusters_impl (start, end);
   }
   {
     if (end - start < 2)
       return;
     merge_clusters_impl (start, end);
   }
-  HB_INTERNAL void merge_clusters_impl (unsigned int start,
-                                       unsigned int end);
-  HB_INTERNAL void merge_out_clusters (unsigned int start,
-                                      unsigned int end);
+  HB_INTERNAL void merge_clusters_impl (unsigned int start, unsigned int end);
+  HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end);
   /* Merge clusters for deleting current glyph, and skip it. */
   HB_INTERNAL void delete_glyph (void);
 
   /* Merge clusters for deleting current glyph, and skip it. */
   HB_INTERNAL void delete_glyph (void);
 
+  inline void unsafe_to_break (unsigned int start,
+                              unsigned int end)
+  {
+    if (end - start < 2)
+      return;
+    unsafe_to_break_impl (start, end);
+  }
+  HB_INTERNAL void unsafe_to_break_impl (unsigned int start, unsigned int end);
+  HB_INTERNAL void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end);
+
+
   /* Internal methods */
   HB_INTERNAL bool enlarge (unsigned int size);
 
   /* Internal methods */
   HB_INTERNAL bool enlarge (unsigned int size);
 
@@ -282,9 +305,78 @@ struct hb_buffer_t {
     return ret;
   }
   HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0);
     return ret;
   }
   HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0);
+
+  static inline void
+  set_cluster (hb_glyph_info_t &inf, unsigned int cluster, unsigned int mask = 0)
+  {
+    if (inf.cluster != cluster)
+    {
+      if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
+       inf.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+      else
+       inf.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+    }
+    inf.cluster = cluster;
+  }
+
+  inline int
+  _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *infos,
+                                    unsigned int start, unsigned int end,
+                                    unsigned int cluster) const
+  {
+    for (unsigned int i = start; i < end; i++)
+      cluster = MIN<unsigned int> (cluster, infos[i].cluster);
+    return cluster;
+  }
+  inline void
+  _unsafe_to_break_set_mask (hb_glyph_info_t *infos,
+                            unsigned int start, unsigned int end,
+                            unsigned int cluster)
+  {
+    for (unsigned int i = start; i < end; i++)
+      if (cluster != infos[i].cluster)
+      {
+       scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK;
+       infos[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+      }
+  }
+
+  inline void
+  unsafe_to_break_all (void)
+  {
+    unsafe_to_break_impl (0, len);
+  }
+  inline void
+  safe_to_break_all (void)
+  {
+    for (unsigned int i = 0; i < len; i++)
+      info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+  }
 };
 
 
 };
 
 
+/* Loop over clusters. Duplicated in foreach_syllable(). */
+#define foreach_cluster(buffer, start, end) \
+  for (unsigned int \
+       _count = buffer->len, \
+       start = 0, end = _count ? _next_cluster (buffer, 0) : 0; \
+       start < _count; \
+       start = end, end = _next_cluster (buffer, start))
+
+static inline unsigned int
+_next_cluster (hb_buffer_t *buffer, unsigned int start)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+
+  unsigned int cluster = info[start].cluster;
+  while (++start < count && cluster == info[start].cluster)
+    ;
+
+  return start;
+}
+
+
 #define HB_BUFFER_XALLOCATE_VAR(b, func, var) \
   b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
           sizeof (b->info[0].var))
 #define HB_BUFFER_XALLOCATE_VAR(b, func, var) \
   b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
           sizeof (b->info[0].var))
index 85696c5..1147194 100644 (file)
@@ -30,7 +30,7 @@
 static const char *serialize_formats[] = {
   "text",
   "json",
 static const char *serialize_formats[] = {
   "text",
   "json",
-  NULL
+  nullptr
 };
 
 /**
 };
 
 /**
@@ -90,7 +90,7 @@ hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format)
     case HB_BUFFER_SERIALIZE_FORMAT_TEXT:      return serialize_formats[0];
     case HB_BUFFER_SERIALIZE_FORMAT_JSON:      return serialize_formats[1];
     default:
     case HB_BUFFER_SERIALIZE_FORMAT_TEXT:      return serialize_formats[0];
     case HB_BUFFER_SERIALIZE_FORMAT_JSON:      return serialize_formats[1];
     default:
-    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:   return NULL;
+    case HB_BUFFER_SERIALIZE_FORMAT_INVALID:   return nullptr;
   }
 }
 
   }
 }
 
@@ -104,11 +104,12 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
                                  hb_font_t *font,
                                  hb_buffer_serialize_flags_t flags)
 {
                                  hb_font_t *font,
                                  hb_buffer_serialize_flags_t flags)
 {
-  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL);
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
   hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
   hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
-                            NULL : hb_buffer_get_glyph_positions (buffer, NULL);
+                            nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
 
   *buf_consumed = 0;
 
   *buf_consumed = 0;
+  hb_position_t x = 0, y = 0;
   for (unsigned int i = start; i < end; i++)
   {
     char b[1024];
   for (unsigned int i = start; i < end; i++)
   {
     char b[1024];
@@ -145,10 +146,17 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
 
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     {
 
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     {
-      p += snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
-                    pos[i].x_offset, pos[i].y_offset);
-      p += snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
-                    pos[i].x_advance, pos[i].y_advance);
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
+                            x+pos[i].x_offset, y+pos[i].y_offset));
+      if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
+                              pos[i].x_advance, pos[i].y_advance));
+    }
+
+    if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
+    {
+      if (info[i].mask & HB_GLYPH_FLAG_DEFINED)
+       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED));
     }
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
     }
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
@@ -156,9 +164,9 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
       hb_glyph_extents_t extents;
       hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d",
       hb_glyph_extents_t extents;
       hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d",
-        extents.x_bearing, extents.y_bearing));
+               extents.x_bearing, extents.y_bearing));
       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d",
       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d",
-        extents.width, extents.height));
+               extents.width, extents.height));
     }
 
     *p++ = '}';
     }
 
     *p++ = '}';
@@ -173,6 +181,12 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
       *buf = '\0';
     } else
       return i - start;
       *buf = '\0';
     } else
       return i - start;
+
+    if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+    {
+      x += pos[i].x_advance;
+      y += pos[i].y_advance;
+    }
   }
 
   return end - start;
   }
 
   return end - start;
@@ -188,11 +202,12 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
                                  hb_font_t *font,
                                  hb_buffer_serialize_flags_t flags)
 {
                                  hb_font_t *font,
                                  hb_buffer_serialize_flags_t flags)
 {
-  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL);
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
   hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
   hb_glyph_position_t *pos = (flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS) ?
-                            NULL : hb_buffer_get_glyph_positions (buffer, NULL);
+                            nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
 
   *buf_consumed = 0;
 
   *buf_consumed = 0;
+  hb_position_t x = 0, y = 0;
   for (unsigned int i = start; i < end; i++)
   {
     char b[1024];
   for (unsigned int i = start; i < end; i++)
   {
     char b[1024];
@@ -217,13 +232,22 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
 
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     {
 
     if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
     {
-      if (pos[i].x_offset || pos[i].y_offset)
-       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", pos[i].x_offset, pos[i].y_offset));
+      if (x+pos[i].x_offset || y+pos[i].y_offset)
+       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset));
+
+      if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+      {
+       *p++ = '+';
+       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance));
+       if (pos[i].y_advance)
+         p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
+      }
+    }
 
 
-      *p++ = '+';
-      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance));
-      if (pos[i].y_advance)
-       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
+    if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
+    {
+      if (info[i].mask &HB_GLYPH_FLAG_DEFINED)
+       p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED));
     }
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
     }
 
     if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
@@ -243,6 +267,12 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
       *buf = '\0';
     } else
       return i - start;
       *buf = '\0';
     } else
       return i - start;
+
+    if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
+    {
+      x += pos[i].x_advance;
+      y += pos[i].y_advance;
+    }
   }
 
   return end - start;
   }
 
   return end - start;
@@ -410,8 +440,8 @@ hb_bool_t
 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
                              const char *buf,
                              int buf_len, /* -1 means nul-terminated */
 hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
                              const char *buf,
                              int buf_len, /* -1 means nul-terminated */
-                             const char **end_ptr, /* May be NULL */
-                             hb_font_t *font, /* May be NULL */
+                             const char **end_ptr, /* May be nullptr */
+                             hb_font_t *font, /* May be nullptr */
                              hb_buffer_serialize_format_t format)
 {
   const char *end;
                              hb_buffer_serialize_format_t format)
 {
   const char *end;
index 3940a3d..dc0639f 100644 (file)
 #include "hb-utf-private.hh"
 
 
 #include "hb-utf-private.hh"
 
 
-#ifndef HB_DEBUG_BUFFER
-#define HB_DEBUG_BUFFER (HB_DEBUG+0)
-#endif
-
 /**
  * SECTION: hb-buffer
  * @title: Buffers
 /**
  * SECTION: hb-buffer
  * @title: Buffers
@@ -124,8 +120,8 @@ hb_buffer_t::enlarge (unsigned int size)
   }
 
   unsigned int new_allocated = allocated;
   }
 
   unsigned int new_allocated = allocated;
-  hb_glyph_position_t *new_pos = NULL;
-  hb_glyph_info_t *new_info = NULL;
+  hb_glyph_position_t *new_pos = nullptr;
+  hb_glyph_info_t *new_info = nullptr;
   bool separate_out = out_info != info;
 
   if (unlikely (_hb_unsigned_int_mul_overflows (size, sizeof (info[0]))))
   bool separate_out = out_info != info;
 
   if (unlikely (_hb_unsigned_int_mul_overflows (size, sizeof (info[0]))))
@@ -134,7 +130,7 @@ hb_buffer_t::enlarge (unsigned int size)
   while (size >= new_allocated)
     new_allocated += (new_allocated >> 1) + 32;
 
   while (size >= new_allocated)
     new_allocated += (new_allocated >> 1) + 32;
 
-  ASSERT_STATIC (sizeof (info[0]) == sizeof (pos[0]));
+  static_assert ((sizeof (info[0]) == sizeof (pos[0])), "");
   if (unlikely (_hb_unsigned_int_mul_overflows (new_allocated, sizeof (info[0]))))
     goto done;
 
   if (unlikely (_hb_unsigned_int_mul_overflows (new_allocated, sizeof (info[0]))))
     goto done;
 
@@ -267,7 +263,7 @@ hb_buffer_t::add (hb_codepoint_t  codepoint,
 
   memset (glyph, 0, sizeof (*glyph));
   glyph->codepoint = codepoint;
 
   memset (glyph, 0, sizeof (*glyph));
   glyph->codepoint = codepoint;
-  glyph->mask = 1;
+  glyph->mask = 0;
   glyph->cluster = cluster;
 
   len++;
   glyph->cluster = cluster;
 
   len++;
@@ -550,12 +546,15 @@ hb_buffer_t::merge_clusters_impl (unsigned int start,
                                  unsigned int end)
 {
   if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_CHARACTERS)
                                  unsigned int end)
 {
   if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_CHARACTERS)
+  {
+    unsafe_to_break (start, end);
     return;
     return;
+  }
 
   unsigned int cluster = info[start].cluster;
 
   for (unsigned int i = start + 1; i < end; i++)
 
   unsigned int cluster = info[start].cluster;
 
   for (unsigned int i = start + 1; i < end; i++)
-    cluster = MIN (cluster, info[i].cluster);
+    cluster = MIN<unsigned int> (cluster, info[i].cluster);
 
   /* Extend end */
   while (end < len && info[end - 1].cluster == info[end].cluster)
 
   /* Extend end */
   while (end < len && info[end - 1].cluster == info[end].cluster)
@@ -568,10 +567,10 @@ hb_buffer_t::merge_clusters_impl (unsigned int start,
   /* If we hit the start of buffer, continue in out-buffer. */
   if (idx == start)
     for (unsigned int i = out_len; i && out_info[i - 1].cluster == info[start].cluster; i--)
   /* If we hit the start of buffer, continue in out-buffer. */
   if (idx == start)
     for (unsigned int i = out_len; i && out_info[i - 1].cluster == info[start].cluster; i--)
-      out_info[i - 1].cluster = cluster;
+      set_cluster (out_info[i - 1], cluster);
 
   for (unsigned int i = start; i < end; i++)
 
   for (unsigned int i = start; i < end; i++)
-    info[i].cluster = cluster;
+    set_cluster (info[i], cluster);
 }
 void
 hb_buffer_t::merge_out_clusters (unsigned int start,
 }
 void
 hb_buffer_t::merge_out_clusters (unsigned int start,
@@ -586,7 +585,7 @@ hb_buffer_t::merge_out_clusters (unsigned int start,
   unsigned int cluster = out_info[start].cluster;
 
   for (unsigned int i = start + 1; i < end; i++)
   unsigned int cluster = out_info[start].cluster;
 
   for (unsigned int i = start + 1; i < end; i++)
-    cluster = MIN (cluster, out_info[i].cluster);
+    cluster = MIN<unsigned int> (cluster, out_info[i].cluster);
 
   /* Extend start */
   while (start && out_info[start - 1].cluster == out_info[start].cluster)
 
   /* Extend start */
   while (start && out_info[start - 1].cluster == out_info[start].cluster)
@@ -599,14 +598,16 @@ hb_buffer_t::merge_out_clusters (unsigned int start,
   /* If we hit the end of out-buffer, continue in buffer. */
   if (end == out_len)
     for (unsigned int i = idx; i < len && info[i].cluster == out_info[end - 1].cluster; i++)
   /* If we hit the end of out-buffer, continue in buffer. */
   if (end == out_len)
     for (unsigned int i = idx; i < len && info[i].cluster == out_info[end - 1].cluster; i++)
-      info[i].cluster = cluster;
+      set_cluster (info[i], cluster);
 
   for (unsigned int i = start; i < end; i++)
 
   for (unsigned int i = start; i < end; i++)
-    out_info[i].cluster = cluster;
+    set_cluster (out_info[i], cluster);
 }
 void
 hb_buffer_t::delete_glyph ()
 {
 }
 void
 hb_buffer_t::delete_glyph ()
 {
+  /* The logic here is duplicated in hb_ot_hide_default_ignorables(). */
+
   unsigned int cluster = info[idx].cluster;
   if (idx + 1 < len && cluster == info[idx + 1].cluster)
   {
   unsigned int cluster = info[idx].cluster;
   if (idx + 1 < len && cluster == info[idx + 1].cluster)
   {
@@ -619,9 +620,10 @@ hb_buffer_t::delete_glyph ()
     /* Merge cluster backward. */
     if (cluster < out_info[out_len - 1].cluster)
     {
     /* Merge cluster backward. */
     if (cluster < out_info[out_len - 1].cluster)
     {
+      unsigned int mask = info[idx].mask;
       unsigned int old_cluster = out_info[out_len - 1].cluster;
       for (unsigned i = out_len; i && out_info[i - 1].cluster == old_cluster; i--)
       unsigned int old_cluster = out_info[out_len - 1].cluster;
       for (unsigned i = out_len; i && out_info[i - 1].cluster == old_cluster; i--)
-       out_info[i - 1].cluster = cluster;
+       set_cluster (out_info[i - 1], cluster, mask);
     }
     goto done;
   }
     }
     goto done;
   }
@@ -638,6 +640,32 @@ done:
 }
 
 void
 }
 
 void
+hb_buffer_t::unsafe_to_break_impl (unsigned int start, unsigned int end)
+{
+  unsigned int cluster = (unsigned int) -1;
+  cluster = _unsafe_to_break_find_min_cluster (info, start, end, cluster);
+  _unsafe_to_break_set_mask (info, start, end, cluster);
+}
+void
+hb_buffer_t::unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end)
+{
+  if (!have_output)
+  {
+    unsafe_to_break_impl (start, end);
+    return;
+  }
+
+  assert (start <= out_len);
+  assert (idx <= end);
+
+  unsigned int cluster = (unsigned int) -1;
+  cluster = _unsafe_to_break_find_min_cluster (out_info, start, out_len, cluster);
+  cluster = _unsafe_to_break_find_min_cluster (info, idx, end, cluster);
+  _unsafe_to_break_set_mask (out_info, start, out_len, cluster);
+  _unsafe_to_break_set_mask (info, idx, end, cluster);
+}
+
+void
 hb_buffer_t::guess_segment_properties (void)
 {
   assert (content_type == HB_BUFFER_CONTENT_TYPE_UNICODE ||
 hb_buffer_t::guess_segment_properties (void)
 {
   assert (content_type == HB_BUFFER_CONTENT_TYPE_UNICODE ||
@@ -694,6 +722,7 @@ hb_buffer_create (void)
     return hb_buffer_get_empty ();
 
   buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
     return hb_buffer_get_empty ();
 
   buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
+  buffer->max_ops = HB_BUFFER_MAX_OPS_DEFAULT;
 
   buffer->reset ();
 
 
   buffer->reset ();
 
@@ -721,6 +750,7 @@ hb_buffer_get_empty (void)
     HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
     HB_BUFFER_SCRATCH_FLAG_DEFAULT,
     HB_BUFFER_MAX_LEN_DEFAULT,
     HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
     HB_BUFFER_SCRATCH_FLAG_DEFAULT,
     HB_BUFFER_MAX_LEN_DEFAULT,
+    HB_BUFFER_MAX_OPS_DEFAULT,
 
     HB_BUFFER_CONTENT_TYPE_INVALID,
     HB_SEGMENT_PROPERTIES_DEFAULT,
 
     HB_BUFFER_CONTENT_TYPE_INVALID,
     HB_SEGMENT_PROPERTIES_DEFAULT,
@@ -1380,6 +1410,23 @@ hb_buffer_get_glyph_positions (hb_buffer_t  *buffer,
 }
 
 /**
 }
 
 /**
+ * hb_glyph_info_get_glyph_flags:
+ * @info: a #hb_glyph_info_t.
+ *
+ * Returns glyph flags encoded within a #hb_glyph_info_t.
+ *
+ * Return value:
+ * The #hb_glyph_flags_t encoded within @info.
+ *
+ * Since: 1.5.0
+ **/
+hb_glyph_flags_t
+(hb_glyph_info_get_glyph_flags) (const hb_glyph_info_t *info)
+{
+  return hb_glyph_info_get_glyph_flags (info);
+}
+
+/**
  * hb_buffer_reverse:
  * @buffer: an #hb_buffer_t.
  *
  * hb_buffer_reverse:
  * @buffer: an #hb_buffer_t.
  *
@@ -1666,6 +1713,58 @@ hb_buffer_add_codepoints (hb_buffer_t          *buffer,
 }
 
 
 }
 
 
+/**
+ * hb_buffer_append:
+ * @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.
+ *
+ * Append (part of) contents of another buffer to this buffer.
+ *
+ * Since: 1.5.0
+ **/
+HB_EXTERN void
+hb_buffer_append (hb_buffer_t *buffer,
+                 hb_buffer_t *source,
+                 unsigned int start,
+                 unsigned int end)
+{
+  assert (!buffer->have_output && !source->have_output);
+  assert (buffer->have_positions == source->have_positions ||
+         !buffer->len || !source->len);
+  assert (buffer->content_type == source->content_type ||
+         !buffer->len || !source->len);
+
+  if (end > source->len)
+    end = source->len;
+  if (start > end)
+    start = end;
+  if (start == end)
+    return;
+
+  if (!buffer->len)
+    buffer->content_type = source->content_type;
+  if (!buffer->have_positions && source->have_positions)
+    buffer->clear_positions ();
+
+  if (buffer->len + (end - start) < buffer->len) /* Overflows. */
+  {
+    buffer->in_error = true;
+    return;
+  }
+
+  unsigned int orig_len = buffer->len;
+  hb_buffer_set_length (buffer, buffer->len + (end - start));
+  if (buffer->in_error)
+    return;
+
+  memcpy (buffer->info + orig_len, source->info + start, (end - start) * sizeof (buffer->info[0]));
+  if (buffer->have_positions)
+    memcpy (buffer->pos + orig_len, source->pos + start, (end - start) * sizeof (buffer->pos[0]));
+}
+
+
 static int
 compare_info_codepoint (const hb_glyph_info_t *pa,
                        const hb_glyph_info_t *pb)
 static int
 compare_info_codepoint (const hb_glyph_info_t *pa,
                        const hb_glyph_info_t *pb)
@@ -1736,7 +1835,8 @@ void
 hb_buffer_normalize_glyphs (hb_buffer_t *buffer)
 {
   assert (buffer->have_positions);
 hb_buffer_normalize_glyphs (hb_buffer_t *buffer)
 {
   assert (buffer->have_positions);
-  assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS);
+  assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS ||
+         (!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID));
 
   bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
 
 
   bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
 
@@ -1775,6 +1875,98 @@ hb_buffer_t::sort (unsigned int start, unsigned int end, int(*compar)(const hb_g
   }
 }
 
   }
 }
 
+
+/*
+ * Comparing buffers.
+ */
+
+/**
+ * hb_buffer_diff:
+ *
+ * If dottedcircle_glyph is (hb_codepoint_t) -1 then %HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
+ * and %HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT are never returned.  This should be used by most
+ * callers if just comparing two buffers is needed.
+ *
+ * Since: 1.5.0
+ **/
+hb_buffer_diff_flags_t
+hb_buffer_diff (hb_buffer_t *buffer,
+               hb_buffer_t *reference,
+               hb_codepoint_t dottedcircle_glyph,
+               unsigned int position_fuzz)
+{
+  if (buffer->content_type != reference->content_type && buffer->len && reference->len)
+    return HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH;
+
+  hb_buffer_diff_flags_t result = HB_BUFFER_DIFF_FLAG_EQUAL;
+  bool contains = dottedcircle_glyph != (hb_codepoint_t) -1;
+
+  unsigned int count = reference->len;
+
+  if (buffer->len != count)
+  {
+    /*
+     * we can't compare glyph-by-glyph, but we do want to know if there
+     * are .notdef or dottedcircle glyphs present in the reference buffer
+     */
+    const hb_glyph_info_t *info = reference->info;
+    unsigned int i;
+    for (i = 0; i < count; i++)
+    {
+      if (contains && info[i].codepoint == dottedcircle_glyph)
+        result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT;
+      if (contains && info[i].codepoint == 0)
+        result |= HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT;
+    }
+    result |= HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH;
+    return hb_buffer_diff_flags_t (result);
+  }
+
+  if (!count)
+    return hb_buffer_diff_flags_t (result);
+
+  const hb_glyph_info_t *buf_info = buffer->info;
+  const hb_glyph_info_t *ref_info = reference->info;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    if (buf_info->codepoint != ref_info->codepoint)
+      result |= HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH;
+    if (buf_info->cluster != ref_info->cluster)
+      result |= HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH;
+    if ((buf_info->mask & ~ref_info->mask & HB_GLYPH_FLAG_DEFINED))
+      result |= HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH;
+    if (contains && ref_info->codepoint == dottedcircle_glyph)
+      result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT;
+    if (contains && ref_info->codepoint == 0)
+      result |= HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT;
+    buf_info++;
+    ref_info++;
+  }
+
+  if (buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS)
+  {
+    assert (buffer->have_positions);
+    const hb_glyph_position_t *buf_pos = buffer->pos;
+    const hb_glyph_position_t *ref_pos = reference->pos;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if ((unsigned int) abs (buf_pos->x_advance - ref_pos->x_advance) > position_fuzz ||
+          (unsigned int) abs (buf_pos->y_advance - ref_pos->y_advance) > position_fuzz ||
+          (unsigned int) abs (buf_pos->x_offset - ref_pos->x_offset) > position_fuzz ||
+          (unsigned int) abs (buf_pos->y_offset - ref_pos->y_offset) > position_fuzz)
+      {
+        result |= HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH;
+        break;
+      }
+      buf_pos++;
+      ref_pos++;
+    }
+  }
+
+  return result;
+}
+
+
 /*
  * Debugging.
  */
 /*
  * Debugging.
  */
@@ -1803,9 +1995,9 @@ hb_buffer_set_message_func (hb_buffer_t *buffer,
     buffer->message_data = user_data;
     buffer->message_destroy = destroy;
   } else {
     buffer->message_data = user_data;
     buffer->message_destroy = destroy;
   } else {
-    buffer->message_func = NULL;
-    buffer->message_data = NULL;
-    buffer->message_destroy = NULL;
+    buffer->message_func = nullptr;
+    buffer->message_data = nullptr;
+    buffer->message_destroy = nullptr;
   }
 }
 
   }
 }
 
index bf289c1..8a2d3e8 100644 (file)
@@ -63,7 +63,7 @@ HB_BEGIN_DECLS
  */
 typedef struct hb_glyph_info_t {
   hb_codepoint_t codepoint;
  */
 typedef struct hb_glyph_info_t {
   hb_codepoint_t codepoint;
-  hb_mask_t      mask;
+  hb_mask_t      mask; /* Holds hb_glyph_flags_t after hb_shape(), plus other things. */
   uint32_t       cluster;
 
   /*< private >*/
   uint32_t       cluster;
 
   /*< private >*/
@@ -72,6 +72,37 @@ typedef struct hb_glyph_info_t {
 } hb_glyph_info_t;
 
 /**
 } hb_glyph_info_t;
 
 /**
+ * hb_glyph_flags_t:
+ * @HB_GLYPH_FLAG_UNSAFE_TO_BREAK: Indicates that if input text is broken at the
+ *                                beginning of the cluster this glyph is part of,
+ *                                then both sides need to be re-shaped, as the
+ *                                result might be different.  On the flip side,
+ *                                it means that when this flag is not present,
+ *                                then it's safe to break the glyph-run at the
+ *                                beginning of this cluster, and the two sides
+ *                                represent the exact same result one would get
+ *                                if breaking input text at the beginning of
+ *                                this cluster and shaping the two sides
+ *                                separately.  This can be used to optimize
+ *                                paragraph layout, by avoiding re-shaping
+ *                                of each line after line-breaking, or limiting
+ *                                the reshaping to a small piece around the
+ *                                breaking point only.
+ */
+typedef enum { /*< flags >*/
+  HB_GLYPH_FLAG_UNSAFE_TO_BREAK                = 0x00000001,
+
+  HB_GLYPH_FLAG_DEFINED                        = 0x00000001 /* OR of all defined flags */
+} hb_glyph_flags_t;
+
+HB_EXTERN hb_glyph_flags_t
+hb_glyph_info_get_glyph_flags (const hb_glyph_info_t *info);
+
+#define hb_glyph_info_get_glyph_flags(info) \
+       ((hb_glyph_flags_t) ((unsigned int) (info)->mask & HB_GLYPH_FLAG_DEFINED))
+
+
+/**
  * hb_glyph_position_t:
  * @x_advance: how much the line advances after drawing this glyph when setting
  *             text in horizontal direction.
  * hb_glyph_position_t:
  * @x_advance: how much the line advances after drawing this glyph when setting
  *             text in horizontal direction.
@@ -119,8 +150,8 @@ typedef struct hb_segment_properties_t {
 #define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
                                       HB_SCRIPT_INVALID, \
                                       HB_LANGUAGE_INVALID, \
 #define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
                                       HB_SCRIPT_INVALID, \
                                       HB_LANGUAGE_INVALID, \
-                                      NULL, \
-                                      NULL}
+                                      (void *) 0, \
+                                      (void *) 0}
 
 HB_EXTERN hb_bool_t
 hb_segment_properties_equal (const hb_segment_properties_t *a,
 
 HB_EXTERN hb_bool_t
 hb_segment_properties_equal (const hb_segment_properties_t *a,
@@ -163,6 +194,7 @@ HB_EXTERN void *
 hb_buffer_get_user_data (hb_buffer_t        *buffer,
                         hb_user_data_key_t *key);
 
 hb_buffer_get_user_data (hb_buffer_t        *buffer,
                         hb_user_data_key_t *key);
 
+
 /**
  * hb_buffer_content_type_t:
  * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
 /**
  * hb_buffer_content_type_t:
  * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
@@ -233,13 +265,21 @@ hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
  *                      of the text without the full context.
  * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
  *                      paragraph can be applied to this buffer, similar to
  *                      of the text without the full context.
  * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
  *                      paragraph can be applied to this buffer, similar to
- *                      @HB_BUFFER_FLAG_EOT.
+ *                      @HB_BUFFER_FLAG_BOT.
  * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
  *                      flag indication that character with Default_Ignorable
  *                      Unicode property should use the corresponding glyph
  * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
  *                      flag indication that character with Default_Ignorable
  *                      Unicode property should use the corresponding glyph
- *                      from the font, instead of hiding them (currently done
- *                      by replacing them with the space glyph and zeroing the
- *                      advance width.)
+ *                      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
+ *                      @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES.
+ * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES:
+ *                      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.)
+ *                      @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
+ *                      precedence over this flag. Since: 1.8.0
  *
  * Since: 0.9.20
  */
  *
  * Since: 0.9.20
  */
@@ -247,7 +287,8 @@ typedef enum { /*< flags >*/
   HB_BUFFER_FLAG_DEFAULT                       = 0x00000000u,
   HB_BUFFER_FLAG_BOT                           = 0x00000001u, /* Beginning-of-text */
   HB_BUFFER_FLAG_EOT                           = 0x00000002u, /* End-of-text */
   HB_BUFFER_FLAG_DEFAULT                       = 0x00000000u,
   HB_BUFFER_FLAG_BOT                           = 0x00000001u, /* Beginning-of-text */
   HB_BUFFER_FLAG_EOT                           = 0x00000002u, /* End-of-text */
-  HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES   = 0x00000004u
+  HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES   = 0x00000004u,
+  HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES     = 0x00000008u
 } hb_buffer_flags_t;
 
 HB_EXTERN void
 } hb_buffer_flags_t;
 
 HB_EXTERN void
@@ -359,6 +400,11 @@ hb_buffer_add_codepoints (hb_buffer_t          *buffer,
                          unsigned int          item_offset,
                          int                   item_length);
 
                          unsigned int          item_offset,
                          int                   item_length);
 
+HB_EXTERN void
+hb_buffer_append (hb_buffer_t *buffer,
+                 hb_buffer_t *source,
+                 unsigned int start,
+                 unsigned int end);
 
 HB_EXTERN hb_bool_t
 hb_buffer_set_length (hb_buffer_t  *buffer,
 
 HB_EXTERN hb_bool_t
 hb_buffer_set_length (hb_buffer_t  *buffer,
@@ -393,6 +439,9 @@ hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
  * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
  * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
  * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
  * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
  * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
  * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
+ * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: serialize glyph flags. Since: 1.5.0
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: do not serialize glyph advances,
+ *  glyph offsets will reflect absolute glyph positions. Since: 1.8.0
  *
  * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
  *
  *
  * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
  *
@@ -403,7 +452,9 @@ typedef enum { /*< flags >*/
   HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS         = 0x00000001u,
   HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS                = 0x00000002u,
   HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES      = 0x00000004u,
   HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS         = 0x00000001u,
   HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS                = 0x00000002u,
   HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES      = 0x00000004u,
-  HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS       = 0x00000008u
+  HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS       = 0x00000008u,
+  HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS         = 0x00000010u,
+  HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES         = 0x00000020u
 } hb_buffer_serialize_flags_t;
 
 /**
 } hb_buffer_serialize_flags_t;
 
 /**
@@ -453,6 +504,45 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
 
 
 /*
 
 
 /*
+ * Compare buffers
+ */
+
+typedef enum { /*< flags >*/
+  HB_BUFFER_DIFF_FLAG_EQUAL                    = 0x0000,
+
+  /* Buffers with different content_type cannot be meaningfully compared
+   * in any further detail. */
+  HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH    = 0x0001,
+
+  /* For buffers with differing length, the per-glyph comparison is not
+   * attempted, though we do still scan reference for dottedcircle / .notdef
+   * glyphs. */
+  HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH          = 0x0002,
+
+  /* We want to know if dottedcircle / .notdef glyphs are present in the
+   * reference, as we may not care so much about other differences in this
+   * case. */
+  HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT           = 0x0004,
+  HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT    = 0x0008,
+
+  /* If the buffers have the same length, we compare them glyph-by-glyph
+   * and report which aspect(s) of the glyph info/position are different. */
+  HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH       = 0x0010,
+  HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH         = 0x0020,
+  HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH     = 0x0040,
+  HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH                = 0x0080
+
+} hb_buffer_diff_flags_t;
+
+/* Compare the contents of two buffers, report types of differences. */
+HB_EXTERN hb_buffer_diff_flags_t
+hb_buffer_diff (hb_buffer_t *buffer,
+               hb_buffer_t *reference,
+               hb_codepoint_t dottedcircle_glyph,
+               unsigned int position_fuzz);
+
+
+/*
  * Debugging.
  */
 
  * Debugging.
  */
 
diff --git a/src/hb-cache-private.hh b/src/hb-cache-private.hh
deleted file mode 100644 (file)
index 24957e1..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright © 2012  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_CACHE_PRIVATE_HH
-#define HB_CACHE_PRIVATE_HH
-
-#include "hb-private.hh"
-
-
-/* Implements a lock-free cache for int->int functions. */
-
-template <unsigned int key_bits, unsigned int value_bits, unsigned int cache_bits>
-struct hb_cache_t
-{
-  ASSERT_STATIC (key_bits >= cache_bits);
-  ASSERT_STATIC (key_bits + value_bits - cache_bits < 8 * sizeof (unsigned int));
-
-  inline void clear (void)
-  {
-    memset (values, 255, sizeof (values));
-  }
-
-  inline bool get (unsigned int key, unsigned int *value)
-  {
-    unsigned int k = key & ((1u<<cache_bits)-1);
-    unsigned int v = values[k];
-    if ((v >> value_bits) != (key >> cache_bits))
-      return false;
-    *value = v & ((1u<<value_bits)-1);
-    return true;
-  }
-
-  inline bool set (unsigned int key, unsigned int value)
-  {
-    if (unlikely ((key >> key_bits) || (value >> value_bits)))
-      return false; /* Overflows */
-    unsigned int k = key & ((1u<<cache_bits)-1);
-    unsigned int v = ((key>>cache_bits)<<value_bits) | value;
-    values[k] = v;
-    return true;
-  }
-
-  private:
-  unsigned int values[1u<<cache_bits];
-};
-
-typedef hb_cache_t<21, 16, 8> hb_cmap_cache_t;
-typedef hb_cache_t<16, 24, 8> hb_advance_cache_t;
-
-
-#endif /* HB_CACHE_PRIVATE_HH */
index 3900623..d1fcf79 100644 (file)
@@ -32,6 +32,9 @@
 #include "hb-object-private.hh"
 
 #include <locale.h>
 #include "hb-object-private.hh"
 
 #include <locale.h>
+#ifdef HAVE_XLOCALE_H
+#include <xlocale.h>
+#endif
 
 
 /* hb_options_t */
 
 
 /* hb_options_t */
@@ -82,7 +85,7 @@ hb_tag_from_string (const char *str, int len)
   for (; i < 4; i++)
     tag[i] = ' ';
 
   for (; i < 4; i++)
     tag[i] = ' ';
 
-  return HB_TAG_CHAR4 (tag);
+  return HB_TAG (tag[0], tag[1], tag[2], tag[3]);
 }
 
 /**
 }
 
 /**
@@ -221,9 +224,18 @@ struct hb_language_item_t {
   }
 
   inline hb_language_item_t & operator = (const char *s) {
   }
 
   inline hb_language_item_t & operator = (const char *s) {
-    lang = (hb_language_t) strdup (s);
-    for (unsigned char *p = (unsigned char *) lang; *p; p++)
-      *p = canon_map[*p];
+    /* If a custom allocated is used calling strdup() pairs
+    badly with a call to the custom free() in finish() below.
+    Therefore don't call strdup(), implement its behavior.
+    */
+    size_t len = strlen(s) + 1;
+    lang = (hb_language_t) malloc(len);
+    if (likely (lang))
+    {
+      memcpy((unsigned char *) lang, s, len);
+      for (unsigned char *p = (unsigned char *) lang; *p; p++)
+       *p = canon_map[*p];
+    }
 
     return *this;
   }
 
     return *this;
   }
@@ -237,8 +249,8 @@ struct hb_language_item_t {
 static hb_language_item_t *langs;
 
 #ifdef HB_USE_ATEXIT
 static hb_language_item_t *langs;
 
 #ifdef HB_USE_ATEXIT
-static
-void free_langs (void)
+static void
+free_langs (void)
 {
   while (langs) {
     hb_language_item_t *next = langs->next;
 {
   while (langs) {
     hb_language_item_t *next = langs->next;
@@ -262,9 +274,14 @@ retry:
   /* Not found; allocate one. */
   hb_language_item_t *lang = (hb_language_item_t *) calloc (1, sizeof (hb_language_item_t));
   if (unlikely (!lang))
   /* Not found; allocate one. */
   hb_language_item_t *lang = (hb_language_item_t *) calloc (1, sizeof (hb_language_item_t));
   if (unlikely (!lang))
-    return NULL;
+    return nullptr;
   lang->next = first_lang;
   *lang = key;
   lang->next = first_lang;
   *lang = key;
+  if (unlikely (!lang->lang))
+  {
+    free (lang);
+    return nullptr;
+  }
 
   if (!hb_atomic_ptr_cmpexch (&langs, first_lang, lang)) {
     lang->finish ();
 
   if (!hb_atomic_ptr_cmpexch (&langs, first_lang, lang)) {
     lang->finish ();
@@ -301,7 +318,7 @@ hb_language_from_string (const char *str, int len)
   if (!str || !len || !*str)
     return HB_LANGUAGE_INVALID;
 
   if (!str || !len || !*str)
     return HB_LANGUAGE_INVALID;
 
-  hb_language_item_t *item = NULL;
+  hb_language_item_t *item = nullptr;
   if (len >= 0)
   {
     /* NUL-terminate it. */
   if (len >= 0)
   {
     /* NUL-terminate it. */
@@ -332,7 +349,7 @@ hb_language_from_string (const char *str, int len)
 const char *
 hb_language_to_string (hb_language_t language)
 {
 const char *
 hb_language_to_string (hb_language_t language)
 {
-  /* This is actually NULL-safe! */
+  /* This is actually nullptr-safe! */
   return language->s;
 }
 
   return language->s;
 }
 
@@ -352,7 +369,7 @@ hb_language_get_default (void)
 
   hb_language_t language = (hb_language_t) hb_atomic_ptr_get (&default_language);
   if (unlikely (language == HB_LANGUAGE_INVALID)) {
 
   hb_language_t language = (hb_language_t) hb_atomic_ptr_get (&default_language);
   if (unlikely (language == HB_LANGUAGE_INVALID)) {
-    language = hb_language_from_string (setlocale (LC_CTYPE, NULL), -1);
+    language = hb_language_from_string (setlocale (LC_CTYPE, nullptr), -1);
     (void) hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language);
   }
 
     (void) hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language);
   }
 
@@ -507,6 +524,7 @@ hb_script_get_horizontal_direction (hb_script_t script)
     case HB_SCRIPT_PSALTER_PAHLAVI:
 
     /* Unicode-8.0 additions */
     case HB_SCRIPT_PSALTER_PAHLAVI:
 
     /* Unicode-8.0 additions */
+    case HB_SCRIPT_HATRAN:
     case HB_SCRIPT_OLD_HUNGARIAN:
 
     /* Unicode-9.0 additions */
     case HB_SCRIPT_OLD_HUNGARIAN:
 
     /* Unicode-9.0 additions */
@@ -545,9 +563,9 @@ hb_user_data_array_t::set (hb_user_data_key_t *key,
 void *
 hb_user_data_array_t::get (hb_user_data_key_t *key)
 {
 void *
 hb_user_data_array_t::get (hb_user_data_key_t *key)
 {
-  hb_user_data_item_t item = {NULL, NULL, NULL};
+  hb_user_data_item_t item = {nullptr, nullptr, nullptr};
 
 
-  return items.find (key, &item, lock) ? item.data : NULL;
+  return items.find (key, &item, lock) ? item.data : nullptr;
 }
 
 
 }
 
 
@@ -657,6 +675,81 @@ parse_uint (const char **pp, const char *end, unsigned int *pv)
 }
 
 static bool
 }
 
 static bool
+parse_uint32 (const char **pp, const char *end, uint32_t *pv)
+{
+  char buf[32];
+  unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp));
+  strncpy (buf, *pp, len);
+  buf[len] = '\0';
+
+  char *p = buf;
+  char *pend = p;
+  unsigned int v;
+
+  /* Intentionally use strtol instead of strtoul, such that
+   * -1 turns into "big number"... */
+  errno = 0;
+  v = strtol (p, &pend, 0);
+  if (errno || p == pend)
+    return false;
+
+  *pv = v;
+  *pp += pend - p;
+  return true;
+}
+
+#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
+
+static HB_LOCALE_T C_locale;
+
+#ifdef HB_USE_ATEXIT
+static void
+free_C_locale (void)
+{
+  if (C_locale)
+    HB_FREE_LOCALE (C_locale);
+}
+#endif
+
+static HB_LOCALE_T
+get_C_locale (void)
+{
+retry:
+  HB_LOCALE_T C = (HB_LOCALE_T) hb_atomic_ptr_get (&C_locale);
+
+  if (unlikely (!C))
+  {
+    C = HB_CREATE_LOCALE ("C");
+
+    if (!hb_atomic_ptr_cmpexch (&C_locale, nullptr, C))
+    {
+      HB_FREE_LOCALE (C_locale);
+      goto retry;
+    }
+
+#ifdef HB_USE_ATEXIT
+    atexit (free_C_locale); /* First person registers atexit() callback. */
+#endif
+  }
+
+  return C;
+}
+#endif
+
+static bool
 parse_float (const char **pp, const char *end, float *pv)
 {
   char buf[32];
 parse_float (const char **pp, const char *end, float *pv)
 {
   char buf[32];
@@ -669,7 +762,11 @@ parse_float (const char **pp, const char *end, float *pv)
   float v;
 
   errno = 0;
   float v;
 
   errno = 0;
+#ifdef USE_XLOCALE
+  v = strtod_l (p, &pend, get_C_locale ());
+#else
   v = strtod (p, &pend);
   v = strtod (p, &pend);
+#endif
   if (errno || p == pend)
     return false;
 
   if (errno || p == pend)
     return false;
 
@@ -679,7 +776,7 @@ parse_float (const char **pp, const char *end, float *pv)
 }
 
 static bool
 }
 
 static bool
-parse_bool (const char **pp, const char *end, unsigned int *pv)
+parse_bool (const char **pp, const char *end, uint32_t *pv)
 {
   parse_space (pp, end);
 
 {
   parse_space (pp, end);
 
@@ -688,9 +785,9 @@ parse_bool (const char **pp, const char *end, unsigned int *pv)
     (*pp)++;
 
   /* CSS allows on/off as aliases 1/0. */
     (*pp)++;
 
   /* CSS allows on/off as aliases 1/0. */
-  if (*pp - p == 2 || 0 == strncmp (p, "on", 2))
+  if (*pp - p == 2 && 0 == strncmp (p, "on", 2))
     *pv = 1;
     *pv = 1;
-  else if (*pp - p == 3 || 0 == strncmp (p, "off", 2))
+  else if (*pp - p == 3 && 0 == strncmp (p, "off", 3))
     *pv = 0;
   else
     return false;
     *pv = 0;
   else
     return false;
@@ -778,11 +875,11 @@ static bool
 parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *feature)
 {
   bool had_equal = parse_char (pp, end, '=');
 parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *feature)
 {
   bool had_equal = parse_char (pp, end, '=');
-  bool had_value = parse_uint (pp, end, &feature->value) ||
+  bool had_value = parse_uint32 (pp, end, &feature->value) ||
                    parse_bool (pp, end, &feature->value);
   /* CSS doesn't use equal-sign between tag and value.
    * If there was an equal-sign, then there *must* be a value.
                    parse_bool (pp, end, &feature->value);
   /* CSS doesn't use equal-sign between tag and value.
    * If there was an equal-sign, then there *must* be a value.
-   * A value without an eqaul-sign is ok, but not required. */
+   * A value without an equal-sign is ok, but not required. */
   return !had_equal || had_value;
 }
 
   return !had_equal || had_value;
 }
 
index 634cb96..26200ce 100644 (file)
 # endif /* !__cplusplus */
 #endif
 
 # endif /* !__cplusplus */
 #endif
 
-#if !defined (HB_DONT_DEFINE_STDINT)
-
 #if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \
     defined (_sgi) || defined (__sun) || defined (sun) || \
     defined (__digital__) || defined (__HP_cc)
 #  include <inttypes.h>
 #elif defined (_AIX)
 #  include <sys/inttypes.h>
 #if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \
     defined (_sgi) || defined (__sun) || defined (sun) || \
     defined (__digital__) || defined (__HP_cc)
 #  include <inttypes.h>
 #elif defined (_AIX)
 #  include <sys/inttypes.h>
-/* VS 2010 (_MSC_VER 1600) has stdint.h */
-#elif defined (_MSC_VER) && _MSC_VER < 1600
-typedef __int8 int8_t;
-typedef unsigned __int8 uint8_t;
-typedef __int16 int16_t;
-typedef unsigned __int16 uint16_t;
-typedef __int32 int32_t;
-typedef unsigned __int32 uint32_t;
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
 #else
 #  include <stdint.h>
 #endif
 
 #else
 #  include <stdint.h>
 #endif
 
-#endif
-
 HB_BEGIN_DECLS
 
 
 HB_BEGIN_DECLS
 
 
@@ -148,7 +134,7 @@ hb_language_from_string (const char *str, int len);
 HB_EXTERN const char *
 hb_language_to_string (hb_language_t language);
 
 HB_EXTERN const char *
 hb_language_to_string (hb_language_t language);
 
-#define HB_LANGUAGE_INVALID ((hb_language_t) NULL)
+#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
 
 HB_EXTERN hb_language_t
 hb_language_get_default (void);
 
 HB_EXTERN hb_language_t
 hb_language_get_default (void);
@@ -321,6 +307,14 @@ typedef enum
   /*9.0*/ HB_SCRIPT_TANGUT                     = HB_TAG ('T','a','n','g'),
   /*9.0*/ HB_SCRIPT_NEWA                       = HB_TAG ('N','e','w','a'),
 
   /*9.0*/ HB_SCRIPT_TANGUT                     = HB_TAG ('T','a','n','g'),
   /*9.0*/ HB_SCRIPT_NEWA                       = HB_TAG ('N','e','w','a'),
 
+  /*
+   * Since 1.6.0
+   */
+  /*10.0*/HB_SCRIPT_MASARAM_GONDI              = HB_TAG ('G','o','n','m'),
+  /*10.0*/HB_SCRIPT_NUSHU                      = HB_TAG ('N','s','h','u'),
+  /*10.0*/HB_SCRIPT_SOYOMBO                    = HB_TAG ('S','o','y','o'),
+  /*10.0*/HB_SCRIPT_ZANABAZAR_SQUARE           = HB_TAG ('Z','a','n','b'),
+
   /* No script set. */
   HB_SCRIPT_INVALID                            = HB_TAG_NONE,
 
   /* No script set. */
   HB_SCRIPT_INVALID                            = HB_TAG_NONE,
 
index 8f2483b..aba7cf4 100644 (file)
  */
 
 #define HB_SHAPER coretext
  */
 
 #define HB_SHAPER coretext
+
+#include "hb-private.hh"
+#include "hb-debug.hh"
 #include "hb-shaper-impl-private.hh"
 
 #include "hb-coretext.h"
 #include "hb-shaper-impl-private.hh"
 
 #include "hb-coretext.h"
+#include <math.h>
 
 
+/* https://developer.apple.com/documentation/coretext/1508745-ctfontcreatewithgraphicsfont */
+#define HB_CORETEXT_DEFAULT_FONT_SIZE 12.f
 
 
-#ifndef HB_DEBUG_CORETEXT
-#define HB_DEBUG_CORETEXT (HB_DEBUG+0)
-#endif
-
+static CGFloat
+coretext_font_size_from_ptem (float ptem)
+{
+  /* CoreText points are CSS pixels (96 per inch),
+   * NOT typographic points (72 per inch).
+   *
+   * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html
+   */
+  ptem *= 96.f / 72.f;
+  return ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : ptem;
+}
+static float
+coretext_font_size_to_ptem (CGFloat size)
+{
+  size *= 72.f / 96.f;
+  return size <= 0.f ? 0 : size;
+}
 
 static void
 release_table_data (void *user_data)
 
 static void
 release_table_data (void *user_data)
@@ -50,32 +69,32 @@ reference_table  (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
   CGFontRef cg_font = reinterpret_cast<CGFontRef> (user_data);
   CFDataRef cf_data = CGFontCopyTableForTag (cg_font, tag);
   if (unlikely (!cf_data))
   CGFontRef cg_font = reinterpret_cast<CGFontRef> (user_data);
   CFDataRef cf_data = CGFontCopyTableForTag (cg_font, tag);
   if (unlikely (!cf_data))
-    return NULL;
+    return nullptr;
 
   const char *data = reinterpret_cast<const char*> (CFDataGetBytePtr (cf_data));
   const size_t length = CFDataGetLength (cf_data);
   if (!data || !length)
 
   const char *data = reinterpret_cast<const char*> (CFDataGetBytePtr (cf_data));
   const size_t length = CFDataGetLength (cf_data);
   if (!data || !length)
-    return NULL;
+  {
+    CFRelease (cf_data);
+    return nullptr;
+  }
 
   return hb_blob_create (data, length, HB_MEMORY_MODE_READONLY,
                         reinterpret_cast<void *> (const_cast<__CFData *> (cf_data)),
                         release_table_data);
 }
 
 
   return hb_blob_create (data, length, HB_MEMORY_MODE_READONLY,
                         reinterpret_cast<void *> (const_cast<__CFData *> (cf_data)),
                         release_table_data);
 }
 
-hb_face_t *
-hb_coretext_face_create (CGFontRef cg_font)
+static void
+_hb_cg_font_release (void *data)
 {
 {
-  return hb_face_create_for_tables (reference_table, CGFontRetain (cg_font), (hb_destroy_func_t) CGFontRelease);
+  CGFontRelease ((CGFontRef) data);
 }
 
 
 HB_SHAPER_DATA_ENSURE_DEFINE(coretext, face)
 }
 
 
 HB_SHAPER_DATA_ENSURE_DEFINE(coretext, face)
-HB_SHAPER_DATA_ENSURE_DEFINE(coretext, font)
-
-
-/*
- * shaper face data
- */
+HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(coretext, font,
+       fabs (CTFontGetSize((CTFontRef) data) - coretext_font_size_from_ptem (font->ptem)) <= .5
+)
 
 static CTFontDescriptorRef
 get_last_resort_font_desc (void)
 
 static CTFontDescriptorRef
 get_last_resort_font_desc (void)
@@ -104,7 +123,7 @@ static void
 release_data (void *info, const void *data, size_t size)
 {
   assert (hb_blob_get_length ((hb_blob_t *) info) == size &&
 release_data (void *info, const void *data, size_t size)
 {
   assert (hb_blob_get_length ((hb_blob_t *) info) == size &&
-          hb_blob_get_data ((hb_blob_t *) info, NULL) == data);
+          hb_blob_get_data ((hb_blob_t *) info, nullptr) == data);
 
   hb_blob_destroy ((hb_blob_t *) info);
 }
 
   hb_blob_destroy ((hb_blob_t *) info);
 }
@@ -112,8 +131,8 @@ release_data (void *info, const void *data, size_t size)
 static CGFontRef
 create_cg_font (hb_face_t *face)
 {
 static CGFontRef
 create_cg_font (hb_face_t *face)
 {
-  CGFontRef cg_font = NULL;
-  if (face->destroy == (hb_destroy_func_t) CGFontRelease)
+  CGFontRef cg_font = nullptr;
+  if (face->destroy == _hb_cg_font_release)
   {
     cg_font = CGFontRetain ((CGFontRef) face->user_data);
   }
   {
     cg_font = CGFontRetain ((CGFontRef) face->user_data);
   }
@@ -140,10 +159,36 @@ create_cg_font (hb_face_t *face)
 static CTFontRef
 create_ct_font (CGFontRef cg_font, CGFloat font_size)
 {
 static CTFontRef
 create_ct_font (CGFontRef cg_font, CGFloat font_size)
 {
-  CTFontRef ct_font = CTFontCreateWithGraphicsFont (cg_font, font_size, NULL, NULL);
+  CTFontRef ct_font = nullptr;
+
+  /* CoreText does not enable trak table usage / tracking when creating a CTFont
+   * using CTFontCreateWithGraphicsFont. The only way of enabling tracking seems
+   * to be through the CTFontCreateUIFontForLanguage call. */
+  CFStringRef cg_postscript_name = CGFontCopyPostScriptName (cg_font);
+  if (CFStringHasPrefix (cg_postscript_name, CFSTR (".SFNSText")) ||
+      CFStringHasPrefix (cg_postscript_name, CFSTR (".SFNSDisplay")))
+  {
+    CTFontUIFontType font_type = kCTFontUIFontSystem;
+    if (CFStringHasSuffix (cg_postscript_name, CFSTR ("-Bold")))
+      font_type = kCTFontUIFontEmphasizedSystem;
+
+    ct_font = CTFontCreateUIFontForLanguage (font_type, font_size, nullptr);
+    CFStringRef ct_result_name = CTFontCopyPostScriptName(ct_font);
+    if (CFStringCompare (ct_result_name, cg_postscript_name, 0) != kCFCompareEqualTo)
+    {
+      CFRelease(ct_font);
+      ct_font = nullptr;
+    }
+    CFRelease (ct_result_name);
+  }
+  CFRelease (cg_postscript_name);
+
+  if (!ct_font)
+    ct_font = CTFontCreateWithGraphicsFont (cg_font, font_size, nullptr, nullptr);
+
   if (unlikely (!ct_font)) {
     DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed");
   if (unlikely (!ct_font)) {
     DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed");
-    return NULL;
+    return nullptr;
   }
 
   /* crbug.com/576941 and crbug.com/625902 and the investigation in the latter
   }
 
   /* crbug.com/576941 and crbug.com/625902 and the investigation in the latter
@@ -153,7 +198,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
    * reconfiguring the cascade list causes CoreText crashes. For details, see
    * crbug.com/549610 */
   // 0x00070000 stands for "kCTVersionNumber10_10", see CoreText.h
    * reconfiguring the cascade list causes CoreText crashes. For details, see
    * crbug.com/549610 */
   // 0x00070000 stands for "kCTVersionNumber10_10", see CoreText.h
-  if (&CTGetCoreTextVersion != NULL && CTGetCoreTextVersion() < 0x00070000) {
+  if (&CTGetCoreTextVersion != nullptr && CTGetCoreTextVersion() < 0x00070000) {
     CFStringRef fontName = CTFontCopyPostScriptName (ct_font);
     bool isEmojiFont = CFStringCompare (fontName, CFSTR("AppleColorEmoji"), 0) == kCFCompareEqualTo;
     CFRelease (fontName);
     CFStringRef fontName = CTFontCopyPostScriptName (ct_font);
     bool isEmojiFont = CFStringCompare (fontName, CFSTR("AppleColorEmoji"), 0) == kCFCompareEqualTo;
     CFRelease (fontName);
@@ -167,7 +212,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
    * font fallback which we don't need anyway. */
   {
     CTFontDescriptorRef last_resort_font_desc = get_last_resort_font_desc ();
    * font fallback which we don't need anyway. */
   {
     CTFontDescriptorRef last_resort_font_desc = get_last_resort_font_desc ();
-    CTFontRef new_ct_font = CTFontCreateCopyWithAttributes (ct_font, 0.0, NULL, last_resort_font_desc);
+    CTFontRef new_ct_font = CTFontCreateCopyWithAttributes (ct_font, 0.0, nullptr, last_resort_font_desc);
     CFRelease (last_resort_font_desc);
     if (new_ct_font)
     {
     CFRelease (last_resort_font_desc);
     if (new_ct_font)
     {
@@ -202,51 +247,30 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size)
   return ct_font;
 }
 
   return ct_font;
 }
 
-struct hb_coretext_shaper_face_data_t {
-  CGFontRef cg_font;
-  CTFontRef ct_font;
-};
-
 hb_coretext_shaper_face_data_t *
 _hb_coretext_shaper_face_data_create (hb_face_t *face)
 {
 hb_coretext_shaper_face_data_t *
 _hb_coretext_shaper_face_data_create (hb_face_t *face)
 {
-  hb_coretext_shaper_face_data_t *data = (hb_coretext_shaper_face_data_t *) calloc (1, sizeof (hb_coretext_shaper_face_data_t));
-  if (unlikely (!data))
-    return NULL;
+  CGFontRef cg_font = create_cg_font (face);
 
 
-  data->cg_font = create_cg_font (face);
-  if (unlikely (!data->cg_font))
+  if (unlikely (!cg_font))
   {
     DEBUG_MSG (CORETEXT, face, "CGFont creation failed..");
   {
     DEBUG_MSG (CORETEXT, face, "CGFont creation failed..");
-    free (data);
-    return NULL;
+    return nullptr;
   }
 
   }
 
-  /* We use 36pt size instead of UPEM, because CoreText implements the 'trak' table,
-   * which can make the font too tight at large sizes.  36pt should be a good semi-neutral
-   * size.
-   *
-   * Since we always create CTFont at a fixed size, our CTFont lives in face_data
-   * instead of font_data.  Which is good, because when people change scale on
-   * hb_font_t, we won't need to update our CTFont. */
-  data->ct_font = create_ct_font (data->cg_font, 36.);
-  if (unlikely (!data->ct_font))
-  {
-    DEBUG_MSG (CORETEXT, face, "CTFont creation failed.");
-    CFRelease (data->cg_font);
-    free (data);
-    return NULL;
-  }
-
-  return data;
+  return (hb_coretext_shaper_face_data_t *) cg_font;
 }
 
 void
 _hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data)
 {
 }
 
 void
 _hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data)
 {
-  CFRelease (data->ct_font);
-  CFRelease (data->cg_font);
-  free (data);
+  CFRelease ((CGFontRef) data);
+}
+
+hb_face_t *
+hb_coretext_face_create (CGFontRef cg_font)
+{
+  return hb_face_create_for_tables (reference_table, CGFontRetain (cg_font), _hb_cg_font_release);
 }
 
 /*
 }
 
 /*
@@ -255,30 +279,67 @@ _hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data)
 CGFontRef
 hb_coretext_face_get_cg_font (hb_face_t *face)
 {
 CGFontRef
 hb_coretext_face_get_cg_font (hb_face_t *face)
 {
-  if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL;
-  hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
-  return face_data->cg_font;
+  if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return nullptr;
+  return (CGFontRef) HB_SHAPER_DATA_GET (face);
 }
 
 
 }
 
 
-/*
- * shaper font data
- */
-
-struct hb_coretext_shaper_font_data_t {};
-
 hb_coretext_shaper_font_data_t *
 hb_coretext_shaper_font_data_t *
-_hb_coretext_shaper_font_data_create (hb_font_t *font HB_UNUSED)
+_hb_coretext_shaper_font_data_create (hb_font_t *font)
 {
 {
-  return (hb_coretext_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+  hb_face_t *face = font->face;
+  if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return nullptr;
+  CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face);
+
+  CTFontRef ct_font = create_ct_font (cg_font, coretext_font_size_from_ptem (font->ptem));
+
+  if (unlikely (!ct_font))
+  {
+    DEBUG_MSG (CORETEXT, font, "CGFont creation failed..");
+    return nullptr;
+  }
+
+  return (hb_coretext_shaper_font_data_t *) ct_font;
 }
 
 void
 _hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data)
 {
 }
 
 void
 _hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data)
 {
+  CFRelease ((CTFontRef) data);
+}
+
+/*
+ * Since: 1.7.2
+ */
+hb_font_t *
+hb_coretext_font_create (CTFontRef ct_font)
+{
+  CGFontRef cg_font = CTFontCopyGraphicsFont (ct_font, nullptr);
+  hb_face_t *face = hb_coretext_face_create (cg_font);
+  CFRelease (cg_font);
+  hb_font_t *font = hb_font_create (face);
+  hb_face_destroy (face);
+
+  if (unlikely (hb_object_is_inert (font)))
+    return font;
+
+  hb_font_set_ptem (font, coretext_font_size_to_ptem (CTFontGetSize(ct_font)));
+
+  /* Let there be dragons here... */
+  HB_SHAPER_DATA_GET (font) = (hb_coretext_shaper_font_data_t *) CFRetain (ct_font);
+
+  return font;
+}
+
+CTFontRef
+hb_coretext_font_get_ct_font (hb_font_t *font)
+{
+  if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return nullptr;
+  return (CTFontRef) HB_SHAPER_DATA_GET (font);
 }
 
 
 }
 
 
+
 /*
  * shaper shape_plan data
  */
 /*
  * shaper shape_plan data
  */
@@ -300,15 +361,6 @@ _hb_coretext_shaper_shape_plan_data_destroy (hb_coretext_shaper_shape_plan_data_
 {
 }
 
 {
 }
 
-CTFontRef
-hb_coretext_font_get_ct_font (hb_font_t *font)
-{
-  hb_face_t *face = font->face;
-  if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL;
-  hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
-  return face_data->ct_font;
-}
-
 
 /*
  * shaper
 
 /*
  * shaper
@@ -323,7 +375,9 @@ struct active_feature_t {
   feature_record_t rec;
   unsigned int order;
 
   feature_record_t rec;
   unsigned int order;
 
-  static int cmp (const active_feature_t *a, const active_feature_t *b) {
+  static int cmp (const void *pa, const void *pb) {
+    const active_feature_t *a = (const active_feature_t *) pa;
+    const active_feature_t *b = (const active_feature_t *) pb;
     return a->rec.feature < b->rec.feature ? -1 : a->rec.feature > b->rec.feature ? 1 :
           a->order < b->order ? -1 : a->order > b->order ? 1 :
           a->rec.setting < b->rec.setting ? -1 : a->rec.setting > b->rec.setting ? 1 :
     return a->rec.feature < b->rec.feature ? -1 : a->rec.feature > b->rec.feature ? 1 :
           a->order < b->order ? -1 : a->order > b->order ? 1 :
           a->rec.setting < b->rec.setting ? -1 : a->rec.setting > b->rec.setting ? 1 :
@@ -339,7 +393,9 @@ struct feature_event_t {
   bool start;
   active_feature_t feature;
 
   bool start;
   active_feature_t feature;
 
-  static int cmp (const feature_event_t *a, const feature_event_t *b) {
+  static int cmp (const void *pa, const void *pb) {
+    const feature_event_t *a = (const feature_event_t *) pa;
+    const feature_event_t *b = (const feature_event_t *) pb;
     return a->index < b->index ? -1 : a->index > b->index ? 1 :
           a->start < b->start ? -1 : a->start > b->start ? 1 :
           active_feature_t::cmp (&a->feature, &b->feature);
     return a->index < b->index ? -1 : a->index > b->index ? 1 :
           a->start < b->start ? -1 : a->start > b->start ? 1 :
           active_feature_t::cmp (&a->feature, &b->feature);
@@ -538,9 +594,10 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
                     unsigned int        num_features)
 {
   hb_face_t *face = font->face;
                     unsigned int        num_features)
 {
   hb_face_t *face = font->face;
-  hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
+  CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face);
+  CTFontRef ct_font = (CTFontRef) HB_SHAPER_DATA_GET (font);
 
 
-  CGFloat ct_font_size = CTFontGetSize (face_data->ct_font);
+  CGFloat ct_font_size = CTFontGetSize (ct_font);
   CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
   CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
 
   CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
   CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
 
@@ -641,22 +698,23 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
          /* active_features.qsort (); */
          for (unsigned int j = 0; j < active_features.len; j++)
          {
          /* active_features.qsort (); */
          for (unsigned int j = 0; j < active_features.len; j++)
          {
-           CFStringRef keys[2] = {
+           CFStringRef keys[] = {
              kCTFontFeatureTypeIdentifierKey,
              kCTFontFeatureSelectorIdentifierKey
            };
              kCTFontFeatureTypeIdentifierKey,
              kCTFontFeatureSelectorIdentifierKey
            };
-           CFNumberRef values[2] = {
+           CFNumberRef values[] = {
              CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &active_features[j].rec.feature),
              CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &active_features[j].rec.setting)
            };
              CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &active_features[j].rec.feature),
              CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &active_features[j].rec.setting)
            };
+           static_assert ((ARRAY_LENGTH_CONST (keys) == ARRAY_LENGTH_CONST (values)), "");
            CFDictionaryRef dict = CFDictionaryCreate (kCFAllocatorDefault,
                                                       (const void **) keys,
                                                       (const void **) values,
            CFDictionaryRef dict = CFDictionaryCreate (kCFAllocatorDefault,
                                                       (const void **) keys,
                                                       (const void **) values,
-                                                      2,
+                                                      ARRAY_LENGTH (keys),
                                                       &kCFTypeDictionaryKeyCallBacks,
                                                       &kCFTypeDictionaryValueCallBacks);
                                                       &kCFTypeDictionaryKeyCallBacks,
                                                       &kCFTypeDictionaryValueCallBacks);
-           CFRelease (values[0]);
-           CFRelease (values[1]);
+           for (unsigned int i = 0; i < ARRAY_LENGTH (values); i++)
+             CFRelease (values[i]);
 
            CFArrayAppendValue (features_array, dict);
            CFRelease (dict);
 
            CFArrayAppendValue (features_array, dict);
            CFRelease (dict);
@@ -674,12 +732,12 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
          CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
          CFRelease (attributes);
 
          CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
          CFRelease (attributes);
 
-         range->font = CTFontCreateCopyWithAttributes (face_data->ct_font, 0.0, NULL, font_desc);
+         range->font = CTFontCreateCopyWithAttributes (ct_font, 0.0, nullptr, font_desc);
          CFRelease (font_desc);
        }
        else
        {
          CFRelease (font_desc);
        }
        else
        {
-         range->font = NULL;
+         range->font = nullptr;
        }
 
        range->index_first = last_index;
        }
 
        range->index_first = last_index;
@@ -699,9 +757,6 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
          active_features.remove (feature - active_features.array);
       }
     }
          active_features.remove (feature - active_features.array);
       }
     }
-
-    if (!range_records.len) /* No active feature found. */
-      goto fail_features;
   }
   else
   {
   }
   else
   {
@@ -752,14 +807,14 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
 
 #define FAIL(...) \
   HB_STMT_START { \
 
 #define FAIL(...) \
   HB_STMT_START { \
-    DEBUG_MSG (CORETEXT, NULL, __VA_ARGS__); \
+    DEBUG_MSG (CORETEXT, nullptr, __VA_ARGS__); \
     ret = false; \
     goto fail; \
   } HB_STMT_END;
 
   bool ret = true;
     ret = false; \
     goto fail; \
   } HB_STMT_END;
 
   bool ret = true;
-  CFStringRef string_ref = NULL;
-  CTLineRef line = NULL;
+  CFStringRef string_ref = nullptr;
+  CTLineRef line = nullptr;
 
   if (0)
   {
 
   if (0)
   {
@@ -771,8 +826,8 @@ resize_and_retry:
     assert (line);
     CFRelease (string_ref);
     CFRelease (line);
     assert (line);
     CFRelease (string_ref);
     CFRelease (line);
-    string_ref = NULL;
-    line = NULL;
+    string_ref = nullptr;
+    line = nullptr;
 
     /* Get previous start-of-scratch-area, that we use later for readjusting
      * our existing scratch arrays. */
 
     /* Get previous start-of-scratch-area, that we use later for readjusting
      * our existing scratch arrays. */
@@ -793,7 +848,7 @@ resize_and_retry:
     scratch_size -= old_scratch_used;
   }
   {
     scratch_size -= old_scratch_used;
   }
   {
-    string_ref = CFStringCreateWithCharactersNoCopy (NULL,
+    string_ref = CFStringCreateWithCharactersNoCopy (nullptr,
                                                     pchars, chars_len,
                                                     kCFAllocatorNull);
     if (unlikely (!string_ref))
                                                     pchars, chars_len,
                                                     kCFAllocatorNull);
     if (unlikely (!string_ref))
@@ -825,15 +880,18 @@ resize_and_retry:
                                                            kCFStringEncodingUTF8,
                                                            kCFAllocatorNull);
        if (unlikely (!lang))
                                                            kCFStringEncodingUTF8,
                                                            kCFAllocatorNull);
        if (unlikely (!lang))
+        {
+         CFRelease (attr_string);
          FAIL ("CFStringCreateWithCStringNoCopy failed");
          FAIL ("CFStringCreateWithCStringNoCopy failed");
+        }
        CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
                                        kCTLanguageAttributeName, lang);
        CFRelease (lang);
       }
       CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
        CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
                                        kCTLanguageAttributeName, lang);
        CFRelease (lang);
       }
       CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
-                                     kCTFontAttributeName, face_data->ct_font);
+                                     kCTFontAttributeName, ct_font);
 
 
-      if (num_features)
+      if (num_features && range_records.len)
       {
        unsigned int start = 0;
        range_record_t *last_range = &range_records[0];
       {
        unsigned int start = 0;
        range_record_t *last_range = &range_records[0];
@@ -859,6 +917,30 @@ resize_and_retry:
          CFAttributedStringSetAttribute (attr_string, CFRangeMake (start, chars_len - start),
                                          kCTFontAttributeName, last_range->font);
       }
          CFAttributedStringSetAttribute (attr_string, CFRangeMake (start, chars_len - start),
                                          kCTFontAttributeName, last_range->font);
       }
+      /* Enable/disable kern if requested.
+       *
+       * Note: once kern is disabled, reenabling it doesn't currently seem to work in CoreText.
+       */
+      if (num_features)
+      {
+       unsigned int zeroint = 0;
+       CFNumberRef zero = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &zeroint);
+       for (unsigned int i = 0; i < num_features; i++)
+       {
+         const hb_feature_t &feature = features[i];
+         if (feature.tag == HB_TAG('k','e','r','n') &&
+             feature.start < chars_len && feature.start < feature.end)
+         {
+           CFRange feature_range = CFRangeMake (feature.start,
+                                                MIN (feature.end, chars_len) - feature.start);
+           if (feature.value)
+             CFAttributedStringRemoveAttribute (attr_string, feature_range, kCTKernAttributeName);
+           else
+             CFAttributedStringSetAttribute (attr_string, feature_range, kCTKernAttributeName, zero);
+         }
+       }
+       CFRelease (zero);
+      }
 
       int level = HB_DIRECTION_IS_FORWARD (buffer->props.direction) ? 0 : 1;
       CFNumberRef level_number = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &level);
 
       int level = HB_DIRECTION_IS_FORWARD (buffer->props.direction) ? 0 : 1;
       CFNumberRef level_number = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &level);
@@ -868,8 +950,12 @@ resize_and_retry:
                                                    1,
                                                    &kCFTypeDictionaryKeyCallBacks,
                                                    &kCFTypeDictionaryValueCallBacks);
                                                    1,
                                                    &kCFTypeDictionaryKeyCallBacks,
                                                    &kCFTypeDictionaryValueCallBacks);
+      CFRelease (level_number);
       if (unlikely (!options))
       if (unlikely (!options))
+      {
+        CFRelease (attr_string);
         FAIL ("CFDictionaryCreate failed");
         FAIL ("CFDictionaryCreate failed");
+      }
 
       CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedStringAndOptions (attr_string, options);
       CFRelease (options);
 
       CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedStringAndOptions (attr_string, options);
       CFRelease (options);
@@ -885,7 +971,7 @@ resize_and_retry:
 
     CFArrayRef glyph_runs = CTLineGetGlyphRuns (line);
     unsigned int num_runs = CFArrayGetCount (glyph_runs);
 
     CFArrayRef glyph_runs = CTLineGetGlyphRuns (line);
     unsigned int num_runs = CFArrayGetCount (glyph_runs);
-    DEBUG_MSG (CORETEXT, NULL, "Num runs: %d", num_runs);
+    DEBUG_MSG (CORETEXT, nullptr, "Num runs: %d", num_runs);
 
     buffer->len = 0;
     uint32_t status_and = ~0, status_or = 0;
 
     buffer->len = 0;
     uint32_t status_and = ~0, status_or = 0;
@@ -911,7 +997,7 @@ resize_and_retry:
       status_or  |= run_status;
       status_and &= run_status;
       DEBUG_MSG (CORETEXT, run, "CTRunStatus: %x", run_status);
       status_or  |= run_status;
       status_and &= run_status;
       DEBUG_MSG (CORETEXT, run, "CTRunStatus: %x", run_status);
-      double run_advance = CTRunGetTypographicBounds (run, range_all, NULL, NULL, NULL);
+      double run_advance = CTRunGetTypographicBounds (run, range_all, nullptr, nullptr, nullptr);
       if (HB_DIRECTION_IS_VERTICAL (buffer->props.direction))
          run_advance = -run_advance;
       DEBUG_MSG (CORETEXT, run, "Run advance: %g", run_advance);
       if (HB_DIRECTION_IS_VERTICAL (buffer->props.direction))
          run_advance = -run_advance;
       DEBUG_MSG (CORETEXT, run, "Run advance: %g", run_advance);
@@ -924,7 +1010,7 @@ resize_and_retry:
        */
       CFDictionaryRef attributes = CTRunGetAttributes (run);
       CTFontRef run_ct_font = static_cast<CTFontRef>(CFDictionaryGetValue (attributes, kCTFontAttributeName));
        */
       CFDictionaryRef attributes = CTRunGetAttributes (run);
       CTFontRef run_ct_font = static_cast<CTFontRef>(CFDictionaryGetValue (attributes, kCTFontAttributeName));
-      if (!CFEqual (run_ct_font, face_data->ct_font))
+      if (!CFEqual (run_ct_font, ct_font))
       {
        /* The run doesn't use our main font instance.  We have to figure out
         * whether font fallback happened, or this is just CoreText giving us
       {
        /* The run doesn't use our main font instance.  We have to figure out
         * whether font fallback happened, or this is just CoreText giving us
@@ -946,7 +1032,7 @@ resize_and_retry:
         * However, even that wouldn't work if we were passed in the CGFont to
         * construct a hb_face to begin with.
         *
         * However, even that wouldn't work if we were passed in the CGFont to
         * construct a hb_face to begin with.
         *
-        * See: http://github.com/behdad/harfbuzz/pull/36
+        * See: http://github.com/harfbuzz/harfbuzz/pull/36
         *
         * Also see: https://bugs.chromium.org/p/chromium/issues/detail?id=597098
         */
         *
         * Also see: https://bugs.chromium.org/p/chromium/issues/detail?id=597098
         */
@@ -959,16 +1045,16 @@ resize_and_retry:
          }
        if (!matched)
        {
          }
        if (!matched)
        {
-         CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, 0);
+         CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, nullptr);
          if (run_cg_font)
          {
          if (run_cg_font)
          {
-           matched = CFEqual (run_cg_font, face_data->cg_font);
+           matched = CFEqual (run_cg_font, cg_font);
            CFRelease (run_cg_font);
          }
        }
        if (!matched)
        {
            CFRelease (run_cg_font);
          }
        }
        if (!matched)
        {
-         CFStringRef font_ps_name = CTFontCopyName (face_data->ct_font, kCTFontPostScriptNameKey);
+         CFStringRef font_ps_name = CTFontCopyName (ct_font, kCTFontPostScriptNameKey);
          CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey);
          CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0);
          CFRelease (run_ps_name);
          CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey);
          CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0);
          CFRelease (run_ps_name);
@@ -1037,7 +1123,7 @@ resize_and_retry:
 
       /* Testing used to indicate that CTRunGetGlyphsPtr, etc (almost?) always
        * succeed, and so copying data to our own buffer will be rare.  Reports
 
       /* Testing used to indicate that CTRunGetGlyphsPtr, etc (almost?) always
        * succeed, and so copying data to our own buffer will be rare.  Reports
-       * have it that this changed in OS X 10.10 Yosemite, and NULL is returned
+       * have it that this changed in OS X 10.10 Yosemite, and nullptr is returned
        * frequently.  At any rate, we can test that codepath by setting USE_PTR
        * to false. */
 
        * frequently.  At any rate, we can test that codepath by setting USE_PTR
        * to false. */
 
@@ -1053,13 +1139,13 @@ resize_and_retry:
 
       { /* Setup glyphs */
         SCRATCH_SAVE();
 
       { /* Setup glyphs */
         SCRATCH_SAVE();
-       const CGGlyph* glyphs = USE_PTR ? CTRunGetGlyphsPtr (run) : NULL;
+       const CGGlyph* glyphs = USE_PTR ? CTRunGetGlyphsPtr (run) : nullptr;
        if (!glyphs) {
          ALLOCATE_ARRAY (CGGlyph, glyph_buf, num_glyphs, goto resize_and_retry);
          CTRunGetGlyphs (run, range_all, glyph_buf);
          glyphs = glyph_buf;
        }
        if (!glyphs) {
          ALLOCATE_ARRAY (CGGlyph, glyph_buf, num_glyphs, goto resize_and_retry);
          CTRunGetGlyphs (run, range_all, glyph_buf);
          glyphs = glyph_buf;
        }
-       const CFIndex* string_indices = USE_PTR ? CTRunGetStringIndicesPtr (run) : NULL;
+       const CFIndex* string_indices = USE_PTR ? CTRunGetStringIndicesPtr (run) : nullptr;
        if (!string_indices) {
          ALLOCATE_ARRAY (CFIndex, index_buf, num_glyphs, goto resize_and_retry);
          CTRunGetStringIndices (run, range_all, index_buf);
        if (!string_indices) {
          ALLOCATE_ARRAY (CFIndex, index_buf, num_glyphs, goto resize_and_retry);
          CTRunGetStringIndices (run, range_all, index_buf);
@@ -1081,7 +1167,7 @@ resize_and_retry:
         * advance (in the advance direction only), and for last glyph we set
         * whatever is needed to make the whole run's advance add up. */
         SCRATCH_SAVE();
         * advance (in the advance direction only), and for last glyph we set
         * whatever is needed to make the whole run's advance add up. */
         SCRATCH_SAVE();
-       const CGPoint* positions = USE_PTR ? CTRunGetPositionsPtr (run) : NULL;
+       const CGPoint* positions = USE_PTR ? CTRunGetPositionsPtr (run) : nullptr;
        if (!positions) {
          ALLOCATE_ARRAY (CGPoint, position_buf, num_glyphs, goto resize_and_retry);
          CTRunGetPositions (run, range_all, position_buf);
        if (!positions) {
          ALLOCATE_ARRAY (CGPoint, position_buf, num_glyphs, goto resize_and_retry);
          CTRunGetPositions (run, range_all, position_buf);
@@ -1132,7 +1218,7 @@ resize_and_retry:
     }
 
     /* Mac OS 10.6 doesn't have kCTTypesetterOptionForcedEmbeddingLevel,
     }
 
     /* Mac OS 10.6 doesn't have kCTTypesetterOptionForcedEmbeddingLevel,
-     * or if it does, it doesn't resepct it.  So we get runs with wrong
+     * or if it does, it doesn't respect it.  So we get runs with wrong
      * directions.  As such, disable the assert...  It wouldn't crash, but
      * cursoring will be off...
      *
      * directions.  As such, disable the assert...  It wouldn't crash, but
      * cursoring will be off...
      *
@@ -1157,6 +1243,7 @@ resize_and_retry:
        pos->x_advance = info->mask;
        pos->x_offset = info->var1.i32;
        pos->y_offset = info->var2.i32;
        pos->x_advance = info->mask;
        pos->x_offset = info->var1.i32;
        pos->y_offset = info->var2.i32;
+
        info++, pos++;
       }
     else
        info++, pos++;
       }
     else
@@ -1165,6 +1252,7 @@ resize_and_retry:
        pos->y_advance = info->mask;
        pos->x_offset = info->var1.i32;
        pos->y_offset = info->var2.i32;
        pos->y_advance = info->mask;
        pos->x_offset = info->var1.i32;
        pos->y_offset = info->var2.i32;
+
        info++, pos++;
       }
 
        info++, pos++;
       }
 
@@ -1202,6 +1290,8 @@ resize_and_retry:
     }
   }
 
     }
   }
 
+  buffer->unsafe_to_break_all ();
+
 #undef FAIL
 
 fail:
 #undef FAIL
 
 fail:
@@ -1234,22 +1324,20 @@ struct hb_coretext_aat_shaper_face_data_t {};
 hb_coretext_aat_shaper_face_data_t *
 _hb_coretext_aat_shaper_face_data_create (hb_face_t *face)
 {
 hb_coretext_aat_shaper_face_data_t *
 _hb_coretext_aat_shaper_face_data_create (hb_face_t *face)
 {
-  hb_blob_t *mort_blob = face->reference_table (HB_CORETEXT_TAG_MORT);
-  /* Umm, we just reference the table to check whether it exists.
-   * Maybe add better API for this? */
-  if (!hb_blob_get_length (mort_blob))
+  static const hb_tag_t tags[] = {HB_CORETEXT_TAG_MORX, HB_CORETEXT_TAG_MORT, HB_CORETEXT_TAG_KERX};
+
+  for (unsigned int i = 0; i < ARRAY_LENGTH (tags); i++)
   {
   {
-    hb_blob_destroy (mort_blob);
-    mort_blob = face->reference_table (HB_CORETEXT_TAG_MORX);
-    if (!hb_blob_get_length (mort_blob))
+    hb_blob_t *blob = face->reference_table (tags[i]);
+    if (hb_blob_get_length (blob))
     {
     {
-      hb_blob_destroy (mort_blob);
-      return NULL;
+      hb_blob_destroy (blob);
+      return hb_coretext_shaper_face_data_ensure (face) ? (hb_coretext_aat_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr;
     }
     }
+    hb_blob_destroy (blob);
   }
   }
-  hb_blob_destroy (mort_blob);
 
 
-  return hb_coretext_shaper_face_data_ensure (face) ? (hb_coretext_aat_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED : NULL;
+  return nullptr;
 }
 
 void
 }
 
 void
@@ -1267,7 +1355,7 @@ struct hb_coretext_aat_shaper_font_data_t {};
 hb_coretext_aat_shaper_font_data_t *
 _hb_coretext_aat_shaper_font_data_create (hb_font_t *font)
 {
 hb_coretext_aat_shaper_font_data_t *
 _hb_coretext_aat_shaper_font_data_create (hb_font_t *font)
 {
-  return hb_coretext_shaper_font_data_ensure (font) ? (hb_coretext_aat_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED : NULL;
+  return hb_coretext_shaper_font_data_ensure (font) ? (hb_coretext_aat_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr;
 }
 
 void
 }
 
 void
index 82066e4..4b0a6f0 100644 (file)
@@ -42,11 +42,15 @@ HB_BEGIN_DECLS
 
 #define HB_CORETEXT_TAG_MORT HB_TAG('m','o','r','t')
 #define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x')
 
 #define HB_CORETEXT_TAG_MORT HB_TAG('m','o','r','t')
 #define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x')
+#define HB_CORETEXT_TAG_KERX HB_TAG('k','e','r','x')
 
 
 HB_EXTERN hb_face_t *
 hb_coretext_face_create (CGFontRef cg_font);
 
 
 
 HB_EXTERN hb_face_t *
 hb_coretext_face_create (CGFontRef cg_font);
 
+HB_EXTERN hb_font_t *
+hb_coretext_font_create (CTFontRef ct_font);
+
 
 HB_EXTERN CGFontRef
 hb_coretext_face_get_cg_font (hb_face_t *face);
 
 HB_EXTERN CGFontRef
 hb_coretext_face_get_cg_font (hb_face_t *face);
diff --git a/src/hb-debug.hh b/src/hb-debug.hh
new file mode 100644 (file)
index 0000000..c244347
--- /dev/null
@@ -0,0 +1,444 @@
+/*
+ * Copyright © 2017  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_DEBUG_HH
+#define HB_DEBUG_HH
+
+#include "hb-private.hh"
+
+
+#ifndef HB_DEBUG
+#define HB_DEBUG 0
+#endif
+
+static inline bool
+_hb_debug (unsigned int level,
+          unsigned int max_level)
+{
+  return level < max_level;
+}
+
+#define DEBUG_LEVEL_ENABLED(WHAT, LEVEL) (_hb_debug ((LEVEL), HB_DEBUG_##WHAT))
+#define DEBUG_ENABLED(WHAT) (DEBUG_LEVEL_ENABLED (WHAT, 0))
+
+static inline void
+_hb_print_func (const char *func)
+{
+  if (func)
+  {
+    unsigned int func_len = strlen (func);
+    /* Skip "static" */
+    if (0 == strncmp (func, "static ", 7))
+      func += 7;
+    /* Skip "typename" */
+    if (0 == strncmp (func, "typename ", 9))
+      func += 9;
+    /* Skip return type */
+    const char *space = strchr (func, ' ');
+    if (space)
+      func = space + 1;
+    /* Skip parameter list */
+    const char *paren = strchr (func, '(');
+    if (paren)
+      func_len = paren - func;
+    fprintf (stderr, "%.*s", func_len, func);
+  }
+}
+
+template <int max_level> static inline void
+_hb_debug_msg_va (const char *what,
+                 const void *obj,
+                 const char *func,
+                 bool indented,
+                 unsigned int level,
+                 int level_dir,
+                 const char *message,
+                 va_list ap) HB_PRINTF_FUNC(7, 0);
+template <int max_level> static inline void
+_hb_debug_msg_va (const char *what,
+                 const void *obj,
+                 const char *func,
+                 bool indented,
+                 unsigned int level,
+                 int level_dir,
+                 const char *message,
+                 va_list ap)
+{
+  if (!_hb_debug (level, max_level))
+    return;
+
+  fprintf (stderr, "%-10s", what ? what : "");
+
+  if (obj)
+    fprintf (stderr, "(%*p) ", (unsigned int) (2 * sizeof (void *)), obj);
+  else
+    fprintf (stderr, " %*s  ", (unsigned int) (2 * sizeof (void *)), "");
+
+  if (indented) {
+#define VBAR   "\342\224\202"  /* U+2502 BOX DRAWINGS LIGHT VERTICAL */
+#define VRBAR  "\342\224\234"  /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+#define DLBAR  "\342\225\256"  /* U+256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT */
+#define ULBAR  "\342\225\257"  /* U+256F BOX DRAWINGS LIGHT ARC UP AND LEFT */
+#define LBAR   "\342\225\264"  /* U+2574 BOX DRAWINGS LIGHT LEFT */
+    static const char bars[] =
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR;
+    fprintf (stderr, "%2u %s" VRBAR "%s",
+            level,
+            bars + sizeof (bars) - 1 - MIN ((unsigned int) sizeof (bars) - 1, (unsigned int) (sizeof (VBAR) - 1) * level),
+            level_dir ? (level_dir > 0 ? DLBAR : ULBAR) : LBAR);
+  } else
+    fprintf (stderr, "   " VRBAR LBAR);
+
+  _hb_print_func (func);
+
+  if (message)
+  {
+    fprintf (stderr, ": ");
+    vfprintf (stderr, message, ap);
+  }
+
+  fprintf (stderr, "\n");
+}
+template <> inline void
+_hb_debug_msg_va<0> (const char *what HB_UNUSED,
+                    const void *obj HB_UNUSED,
+                    const char *func HB_UNUSED,
+                    bool indented HB_UNUSED,
+                    unsigned int level HB_UNUSED,
+                    int level_dir HB_UNUSED,
+                    const char *message HB_UNUSED,
+                    va_list ap HB_UNUSED) {}
+
+template <int max_level> static inline void
+_hb_debug_msg (const char *what,
+              const void *obj,
+              const char *func,
+              bool indented,
+              unsigned int level,
+              int level_dir,
+              const char *message,
+              ...) HB_PRINTF_FUNC(7, 8);
+template <int max_level> static inline void
+_hb_debug_msg (const char *what,
+              const void *obj,
+              const char *func,
+              bool indented,
+              unsigned int level,
+              int level_dir,
+              const char *message,
+              ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  _hb_debug_msg_va<max_level> (what, obj, func, indented, level, level_dir, message, ap);
+  va_end (ap);
+}
+template <> inline void
+_hb_debug_msg<0> (const char *what HB_UNUSED,
+                 const void *obj HB_UNUSED,
+                 const char *func HB_UNUSED,
+                 bool indented HB_UNUSED,
+                 unsigned int level HB_UNUSED,
+                 int level_dir HB_UNUSED,
+                 const char *message HB_UNUSED,
+                 ...) HB_PRINTF_FUNC(7, 8);
+template <> inline void
+_hb_debug_msg<0> (const char *what HB_UNUSED,
+                 const void *obj HB_UNUSED,
+                 const char *func HB_UNUSED,
+                 bool indented HB_UNUSED,
+                 unsigned int level HB_UNUSED,
+                 int level_dir HB_UNUSED,
+                 const char *message 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_FUNC(WHAT, OBJ, ...)                         _hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
+
+
+/*
+ * Printer
+ */
+
+template <typename T>
+struct hb_printer_t {
+  const char *print (const T&) { return "something"; }
+};
+
+template <>
+struct hb_printer_t<bool> {
+  const char *print (bool v) { return v ? "true" : "false"; }
+};
+
+template <>
+struct hb_printer_t<hb_void_t> {
+  const char *print (hb_void_t) { return ""; }
+};
+
+
+/*
+ * Trace
+ */
+
+template <typename T>
+static inline void _hb_warn_no_return (bool returned)
+{
+  if (unlikely (!returned)) {
+    fprintf (stderr, "OUCH, returned with no call to return_trace().  This is a bug, please report.\n");
+  }
+}
+template <>
+/*static*/ inline void _hb_warn_no_return<hb_void_t> (bool returned HB_UNUSED)
+{}
+
+template <int max_level, typename ret_t>
+struct hb_auto_trace_t
+{
+  explicit inline hb_auto_trace_t (unsigned int *plevel_,
+                                  const char *what_,
+                                  const void *obj_,
+                                  const char *func,
+                                  const char *message,
+                                  ...) HB_PRINTF_FUNC(6, 7)
+                                  : plevel (plevel_), what (what_), obj (obj_), returned (false)
+  {
+    if (plevel) ++*plevel;
+
+    va_list ap;
+    va_start (ap, message);
+    _hb_debug_msg_va<max_level> (what, obj, func, true, plevel ? *plevel : 0, +1, message, ap);
+    va_end (ap);
+  }
+  inline ~hb_auto_trace_t (void)
+  {
+    _hb_warn_no_return<ret_t> (returned);
+    if (!returned) {
+      _hb_debug_msg<max_level> (what, obj, nullptr, true, plevel ? *plevel : 1, -1, " ");
+    }
+    if (plevel) --*plevel;
+  }
+
+  inline ret_t ret (ret_t v, unsigned int line = 0)
+  {
+    if (unlikely (returned)) {
+      fprintf (stderr, "OUCH, double calls to return_trace().  This is a bug, please report.\n");
+      return v;
+    }
+
+    _hb_debug_msg<max_level> (what, obj, nullptr, true, plevel ? *plevel : 1, -1,
+                             "return %s (line %d)",
+                             hb_printer_t<ret_t>().print (v), line);
+    if (plevel) --*plevel;
+    plevel = nullptr;
+    returned = true;
+    return v;
+  }
+
+  private:
+  unsigned int *plevel;
+  const char *what;
+  const void *obj;
+  bool returned;
+};
+template <typename ret_t> /* Make sure we don't use hb_auto_trace_t when not tracing. */
+struct hb_auto_trace_t<0, ret_t>
+{
+  explicit inline hb_auto_trace_t (unsigned int *plevel_,
+                                  const char *what_,
+                                  const void *obj_,
+                                  const char *func,
+                                  const char *message,
+                                  ...) HB_PRINTF_FUNC(6, 7) {}
+
+  inline ret_t ret (ret_t v, unsigned int line HB_UNUSED = 0) { return v; }
+};
+
+/* For disabled tracing; optimize out everything.
+ * https://github.com/harfbuzz/harfbuzz/pull/605 */
+template <typename ret_t>
+struct hb_no_trace_t {
+  inline ret_t ret (ret_t v, unsigned int line HB_UNUSED = 0) { return v; }
+};
+
+#define return_trace(RET) return trace.ret (RET, __LINE__)
+
+
+/*
+ * Instances.
+ */
+
+#ifndef HB_DEBUG_ARABIC
+#define HB_DEBUG_ARABIC (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_BLOB
+#define HB_DEBUG_BLOB (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_CORETEXT
+#define HB_DEBUG_CORETEXT (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_DIRECTWRITE
+#define HB_DEBUG_DIRECTWRITE (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_FT
+#define HB_DEBUG_FT (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_GET_COVERAGE
+#define HB_DEBUG_GET_COVERAGE (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_OBJECT
+#define HB_DEBUG_OBJECT (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_SHAPE_PLAN
+#define HB_DEBUG_SHAPE_PLAN (HB_DEBUG+0)
+#endif
+
+#ifndef HB_DEBUG_UNISCRIBE
+#define HB_DEBUG_UNISCRIBE (HB_DEBUG+0)
+#endif
+
+/*
+ * With tracing.
+ */
+
+#ifndef HB_DEBUG_APPLY
+#define HB_DEBUG_APPLY (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_APPLY
+#define TRACE_APPLY(this) \
+       hb_auto_trace_t<HB_DEBUG_APPLY, bool> trace \
+       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+        "idx %d gid %u lookup %d", \
+        c->buffer->idx, c->buffer->cur().codepoint, (int) c->lookup_index)
+#else
+#define TRACE_APPLY(this) hb_no_trace_t<bool> trace
+#endif
+
+#ifndef HB_DEBUG_CLOSURE
+#define HB_DEBUG_CLOSURE (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_CLOSURE
+#define TRACE_CLOSURE(this) \
+       hb_auto_trace_t<HB_DEBUG_CLOSURE, hb_void_t> trace \
+       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+        " ")
+#else
+#define TRACE_CLOSURE(this) hb_no_trace_t<hb_void_t> trace HB_UNUSED
+#endif
+
+#ifndef HB_DEBUG_COLLECT_GLYPHS
+#define HB_DEBUG_COLLECT_GLYPHS (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_COLLECT_GLYPHS
+#define TRACE_COLLECT_GLYPHS(this) \
+       hb_auto_trace_t<HB_DEBUG_COLLECT_GLYPHS, hb_void_t> trace \
+       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+        " ")
+#else
+#define TRACE_COLLECT_GLYPHS(this) hb_no_trace_t<hb_void_t> trace HB_UNUSED
+#endif
+
+#ifndef HB_DEBUG_SANITIZE
+#define HB_DEBUG_SANITIZE (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_SANITIZE
+#define TRACE_SANITIZE(this) \
+       hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace \
+       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+        " ");
+#else
+#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
+#endif
+
+#ifndef HB_DEBUG_SERIALIZE
+#define HB_DEBUG_SERIALIZE (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_SERIALIZE
+#define TRACE_SERIALIZE(this) \
+       hb_auto_trace_t<HB_DEBUG_SERIALIZE, bool> trace \
+       (&c->debug_depth, "SERIALIZE", c, HB_FUNC, \
+        " ");
+#else
+#define TRACE_SERIALIZE(this) hb_no_trace_t<bool> trace
+#endif
+
+#ifndef HB_DEBUG_SUBSET
+#define HB_DEBUG_SUBSET (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_SUBSET
+#define TRACE_SUBSET(this) \
+  hb_auto_trace_t<HB_DEBUG_SUBSET, bool> trace \
+  (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+   " ");
+#else
+#define TRACE_SUBSET(this) hb_no_trace_t<bool> trace
+#endif
+
+#ifndef HB_DEBUG_WOULD_APPLY
+#define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_WOULD_APPLY
+#define TRACE_WOULD_APPLY(this) \
+       hb_auto_trace_t<HB_DEBUG_WOULD_APPLY, bool> trace \
+       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+        "%d glyphs", c->len);
+#else
+#define TRACE_WOULD_APPLY(this) hb_no_trace_t<bool> trace
+#endif
+
+#ifndef HB_DEBUG_DISPATCH
+#define HB_DEBUG_DISPATCH ( \
+       HB_DEBUG_APPLY + \
+       HB_DEBUG_CLOSURE + \
+       HB_DEBUG_COLLECT_GLYPHS + \
+       HB_DEBUG_SANITIZE + \
+       HB_DEBUG_SERIALIZE + \
+  HB_DEBUG_SUBSET + \
+       HB_DEBUG_WOULD_APPLY + \
+       0)
+#endif
+#if HB_DEBUG_DISPATCH
+#define TRACE_DISPATCH(this, format) \
+       hb_auto_trace_t<context_t::max_debug_depth, typename context_t::return_t> trace \
+       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+        "format %d", (int) format);
+#else
+#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
+#endif
+
+
+#endif /* HB_DEBUG_HH */
index 0398dfa..eac7efb 100644 (file)
@@ -34,6 +34,7 @@
 #include "hb-common.h"
 #include "hb-unicode.h"
 #include "hb-font.h"
 #include "hb-common.h"
 #include "hb-unicode.h"
 #include "hb-font.h"
+#include "hb-set.h"
 
 HB_BEGIN_DECLS
 
 
 HB_BEGIN_DECLS
 
@@ -54,6 +55,9 @@ hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
                              hb_font_get_glyph_func_t func,
                              void *user_data, hb_destroy_func_t destroy);
 
                              hb_font_get_glyph_func_t func,
                              void *user_data, hb_destroy_func_t destroy);
 
+HB_EXTERN void
+hb_set_invert (hb_set_t *set);
+
 #endif
 
 HB_END_DECLS
 #endif
 
 HB_END_DECLS
index ab07d8a..69a8aa2 100644 (file)
@@ -22,6 +22,8 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
+#include "hb-private.hh"
+#include "hb-debug.hh"
 #define HB_SHAPER directwrite
 #include "hb-shaper-impl-private.hh"
 
 #define HB_SHAPER directwrite
 #include "hb-shaper-impl-private.hh"
 
 #include "hb-directwrite.h"
 
 
 #include "hb-directwrite.h"
 
 
-#ifndef HB_DEBUG_DIRECTWRITE
-#define HB_DEBUG_DIRECTWRITE (HB_DEBUG+0)
-#endif
-
 HB_SHAPER_DATA_ENSURE_DEFINE(directwrite, face)
 HB_SHAPER_DATA_ENSURE_DEFINE(directwrite, font)
 
 HB_SHAPER_DATA_ENSURE_DEFINE(directwrite, face)
 HB_SHAPER_DATA_ENSURE_DEFINE(directwrite, font)
 
@@ -140,7 +138,7 @@ _hb_directwrite_shaper_face_data_create(hb_face_t *face)
   hb_directwrite_shaper_face_data_t *data =
     (hb_directwrite_shaper_face_data_t *) malloc (sizeof (hb_directwrite_shaper_face_data_t));
   if (unlikely (!data))
   hb_directwrite_shaper_face_data_t *data =
     (hb_directwrite_shaper_face_data_t *) malloc (sizeof (hb_directwrite_shaper_face_data_t));
   if (unlikely (!data))
-    return NULL;
+    return nullptr;
 
   // TODO: factory and fontFileLoader should be cached separately
   IDWriteFactory* dwriteFactory;
 
   // TODO: factory and fontFileLoader should be cached separately
   IDWriteFactory* dwriteFactory;
@@ -153,7 +151,7 @@ _hb_directwrite_shaper_face_data_create(hb_face_t *face)
   HRESULT hr;
   hb_blob_t *blob = hb_face_reference_blob (face);
   IDWriteFontFileStream *fontFileStream = new DWriteFontFileStream (
   HRESULT hr;
   hb_blob_t *blob = hb_face_reference_blob (face);
   IDWriteFontFileStream *fontFileStream = new DWriteFontFileStream (
-    (uint8_t*) hb_blob_get_data (blob, NULL), hb_blob_get_length (blob));
+    (uint8_t*) hb_blob_get_data (blob, nullptr), hb_blob_get_length (blob));
 
   IDWriteFontFileLoader *fontFileLoader = new DWriteFontFileLoader (fontFileStream);
   dwriteFactory->RegisterFontFileLoader (fontFileLoader);
 
   IDWriteFontFileLoader *fontFileLoader = new DWriteFontFileLoader (fontFileStream);
   dwriteFactory->RegisterFontFileLoader (fontFileLoader);
@@ -165,7 +163,7 @@ _hb_directwrite_shaper_face_data_create(hb_face_t *face)
 
 #define FAIL(...) \
   HB_STMT_START { \
 
 #define FAIL(...) \
   HB_STMT_START { \
-    DEBUG_MSG (DIRECTWRITE, NULL, __VA_ARGS__); \
+    DEBUG_MSG (DIRECTWRITE, nullptr, __VA_ARGS__); \
     return false; \
   } HB_STMT_END;
 
     return false; \
   } HB_STMT_END;
 
@@ -233,12 +231,12 @@ struct hb_directwrite_shaper_font_data_t {
 hb_directwrite_shaper_font_data_t *
 _hb_directwrite_shaper_font_data_create (hb_font_t *font)
 {
 hb_directwrite_shaper_font_data_t *
 _hb_directwrite_shaper_font_data_create (hb_font_t *font)
 {
-  if (unlikely (!hb_directwrite_shaper_face_data_ensure (font->face))) return NULL;
+  if (unlikely (!hb_directwrite_shaper_face_data_ensure (font->face))) return nullptr;
 
   hb_directwrite_shaper_font_data_t *data =
     (hb_directwrite_shaper_font_data_t *) malloc (sizeof (hb_directwrite_shaper_font_data_t));
   if (unlikely (!data))
 
   hb_directwrite_shaper_font_data_t *data =
     (hb_directwrite_shaper_font_data_t *) malloc (sizeof (hb_directwrite_shaper_font_data_t));
   if (unlikely (!data))
-    return NULL;
+    return nullptr;
 
   return data;
 }
 
   return data;
 }
@@ -313,7 +311,7 @@ public:
     , mTextLength(textLength)
     , mLocaleName(localeName)
     , mReadingDirection(readingDirection)
     , mTextLength(textLength)
     , mLocaleName(localeName)
     , mReadingDirection(readingDirection)
-    , mCurrentRun(NULL) { };
+    , mCurrentRun(nullptr) { };
 
   ~TextAnalysis() {
     // delete runs, except mRunHead which is part of the TextAnalysis object
 
   ~TextAnalysis() {
     // delete runs, except mRunHead which is part of the TextAnalysis object
@@ -337,7 +335,7 @@ public:
     mRunHead.mTextLength = mTextLength;
     mRunHead.mBidiLevel =
       (mReadingDirection == DWRITE_READING_DIRECTION_RIGHT_TO_LEFT);
     mRunHead.mTextLength = mTextLength;
     mRunHead.mBidiLevel =
       (mReadingDirection == DWRITE_READING_DIRECTION_RIGHT_TO_LEFT);
-    mRunHead.nextRun = NULL;
+    mRunHead.nextRun = nullptr;
     mCurrentRun = &mRunHead;
 
     // Call each of the analyzers in sequence, recording their results.
     mCurrentRun = &mRunHead;
 
     // Call each of the analyzers in sequence, recording their results.
@@ -356,7 +354,7 @@ public:
   {
     if (textPosition >= mTextLength) {
       // No text at this position, valid query though.
   {
     if (textPosition >= mTextLength) {
       // No text at this position, valid query though.
-      *textString = NULL;
+      *textString = nullptr;
       *textLength = 0;
     }
     else {
       *textLength = 0;
     }
     else {
@@ -372,8 +370,8 @@ public:
   {
     if (textPosition == 0 || textPosition > mTextLength) {
       // Either there is no text before here (== 0), or this
   {
     if (textPosition == 0 || textPosition > mTextLength) {
       // Either there is no text before here (== 0), or this
-      // is an invalid position. The query is considered valid thouh.
-      *textString = NULL;
+      // is an invalid position. The query is considered valid though.
+      *textString = nullptr;
       *textLength = 0;
     }
     else {
       *textLength = 0;
     }
     else {
@@ -399,7 +397,7 @@ public:
     OUT IDWriteNumberSubstitution** numberSubstitution)
   {
     // We do not support number substitution.
     OUT IDWriteNumberSubstitution** numberSubstitution)
   {
     // We do not support number substitution.
-    *numberSubstitution = NULL;
+    *numberSubstitution = nullptr;
     *textLength = mTextLength - textPosition;
 
     return S_OK;
     *textLength = mTextLength - textPosition;
 
     return S_OK;
@@ -617,14 +615,14 @@ _hb_directwrite_shape_full(hb_shape_plan_t    *shape_plan,
   */
   uint32_t textLength = buffer->len;
 
   */
   uint32_t textLength = buffer->len;
 
-  TextAnalysis analysis(textString, textLength, NULL, readingDirection);
+  TextAnalysis analysis(textString, textLength, nullptr, readingDirection);
   TextAnalysis::Run *runHead;
   HRESULT hr;
   hr = analysis.GenerateResults(analyzer, &runHead);
 
 #define FAIL(...) \
   HB_STMT_START { \
   TextAnalysis::Run *runHead;
   HRESULT hr;
   hr = analysis.GenerateResults(analyzer, &runHead);
 
 #define FAIL(...) \
   HB_STMT_START { \
-    DEBUG_MSG (DIRECTWRITE, NULL, __VA_ARGS__); \
+    DEBUG_MSG (DIRECTWRITE, nullptr, __VA_ARGS__); \
     return false; \
   } HB_STMT_END;
 
     return false; \
   } HB_STMT_END;
 
@@ -639,7 +637,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};
   bool isRightToLeft = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
 
   const wchar_t localeName[20] = {0};
-  if (buffer->props.language != NULL)
+  if (buffer->props.language != nullptr)
   {
     mbstowcs ((wchar_t*) localeName,
       hb_language_to_string (buffer->props.language), 20);
   {
     mbstowcs ((wchar_t*) localeName,
       hb_language_to_string (buffer->props.language), 20);
@@ -672,7 +670,7 @@ retry_getglyphs:
     malloc (maxGlyphCount * sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES));
 
   hr = analyzer->GetGlyphs (textString, textLength, fontFace, false,
     malloc (maxGlyphCount * sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES));
 
   hr = analyzer->GetGlyphs (textString, textLength, fontFace, false,
-    isRightToLeft, &runHead->mScript, localeName, NULL, &dwFeatures,
+    isRightToLeft, &runHead->mScript, localeName, nullptr, &dwFeatures,
     featureRangeLengths, 1, maxGlyphCount, clusterMap, textProperties, glyphIndices,
     glyphProperties, &glyphCount);
 
     featureRangeLengths, 1, maxGlyphCount, clusterMap, textProperties, glyphIndices,
     glyphProperties, &glyphCount);
 
@@ -927,8 +925,7 @@ hb_directwrite_shape_experimental_width(hb_font_t          *font,
   hb_bool_t res = _hb_directwrite_shape_full (shape_plan, font, buffer,
     features, num_features, width);
 
   hb_bool_t res = _hb_directwrite_shape_full (shape_plan, font, buffer,
     features, num_features, width);
 
-  if (res)
-    buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
+  buffer->unsafe_to_break_all ();
 
   return res;
 }
 
   return res;
 }
diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh
new file mode 100644 (file)
index 0000000..e413847
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * Copyright © 2017  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_DSALGS_HH
+#define HB_DSALGS_HH
+
+#include "hb-private.hh"
+
+
+static inline void *
+hb_bsearch_r (const void *key, const void *base,
+             size_t nmemb, size_t size,
+             int (*compar)(const void *_key, const void *_item, void *_arg),
+             void *arg)
+{
+  int min = 0, max = (int) nmemb - 1;
+  while (min <= max)
+  {
+    int mid = (min + max) / 2;
+    const void *p = (const void *) (((const char *) base) + (mid * size));
+    int c = compar (key, p, arg);
+    if (c < 0)
+      max = mid - 1;
+    else if (c > 0)
+      min = mid + 1;
+    else
+      return (void *) p;
+  }
+  return NULL;
+}
+
+
+
+/* From https://github.com/noporpoise/sort_r */
+
+/* Isaac Turner 29 April 2014 Public Domain */
+
+/*
+
+hb_sort_r function to be exported.
+
+Parameters:
+  base is the array to be sorted
+  nel is the number of elements in the array
+  width is the size in bytes of each element of the array
+  compar is the comparison function
+  arg is a pointer to be passed to the comparison function
+
+void hb_sort_r(void *base, size_t nel, size_t width,
+               int (*compar)(const void *_a, const void *_b, void *_arg),
+               void *arg);
+*/
+
+
+/* swap a, b iff a>b */
+/* __restrict is same as restrict but better support on old machines */
+static int sort_r_cmpswap(char *__restrict a, char *__restrict b, size_t w,
+                         int (*compar)(const void *_a, const void *_b,
+                                       void *_arg),
+                         void *arg)
+{
+  char tmp, *end = a+w;
+  if(compar(a, b, arg) > 0) {
+    for(; a < end; a++, b++) { tmp = *a; *a = *b; *b = tmp; }
+    return 1;
+  }
+  return 0;
+}
+
+/* Note: quicksort is not stable, equivalent values may be swapped */
+static inline void sort_r_simple(void *base, size_t nel, size_t w,
+                                int (*compar)(const void *_a, const void *_b,
+                                              void *_arg),
+                                void *arg)
+{
+  char *b = (char *)base, *end = b + nel*w;
+  if(nel < 7) {
+    /* Insertion sort for arbitrarily small inputs */
+    char *pi, *pj;
+    for(pi = b+w; pi < end; pi += w) {
+      for(pj = pi; pj > b && sort_r_cmpswap(pj-w,pj,w,compar,arg); pj -= w) {}
+    }
+  }
+  else
+  {
+    /* nel > 6; Quicksort */
+
+    /* Use median of first, middle and last items as pivot */
+    char *x, *y, *xend, ch;
+    char *pl, *pr;
+    char *last = b+w*(nel-1), *tmp;
+    char *l[3];
+    l[0] = b;
+    l[1] = b+w*(nel/2);
+    l[2] = last;
+
+    if(compar(l[0],l[1],arg) > 0) { tmp=l[0]; l[0]=l[1]; l[1]=tmp; }
+    if(compar(l[1],l[2],arg) > 0) {
+      tmp=l[1]; l[1]=l[2]; l[2]=tmp; /* swap(l[1],l[2]) */
+      if(compar(l[0],l[1],arg) > 0) { tmp=l[0]; l[0]=l[1]; l[1]=tmp; }
+    }
+
+    /* swap l[id], l[2] to put pivot as last element */
+    for(x = l[1], y = last, xend = x+w; x<xend; x++, y++) {
+      ch = *x; *x = *y; *y = ch;
+    }
+
+    pl = b;
+    pr = last;
+
+    while(pl < pr) {
+      for(; pl < pr; pl += w) {
+        if(sort_r_cmpswap(pl, pr, w, compar, arg)) {
+          pr -= w; /* pivot now at pl */
+          break;
+        }
+      }
+      for(; pl < pr; pr -= w) {
+        if(sort_r_cmpswap(pl, pr, w, compar, arg)) {
+          pl += w; /* pivot now at pr */
+          break;
+        }
+      }
+    }
+
+    sort_r_simple(b, (pl-b)/w, w, compar, arg);
+    sort_r_simple(pl+w, (end-(pl+w))/w, w, compar, arg);
+  }
+}
+
+static inline void hb_sort_r(void *base, size_t nel, size_t width,
+                            int (*compar)(const void *_a, const void *_b, void *_arg),
+                            void *arg)
+{
+    sort_r_simple(base, nel, width, compar, arg);
+}
+
+#endif /* HB_DSALGS_HH */
index eb0e850..43e7b1c 100644 (file)
@@ -54,13 +54,6 @@ struct hb_face_t {
   mutable unsigned int upem;           /* Units-per-EM. */
   mutable unsigned int num_glyphs;     /* Number of glyphs. */
 
   mutable unsigned int upem;           /* Units-per-EM. */
   mutable unsigned int num_glyphs;     /* Number of glyphs. */
 
-  enum dirty_t {
-    NOTHING    = 0x0000,
-    INDEX      = 0x0001,
-    UPEM       = 0x0002,
-    NUM_GLYPHS = 0x0004,
-  } dirty;
-
   struct hb_shaper_data_t shaper_data; /* Various shaper data. */
 
   /* Various non-shaping data. */
   struct hb_shaper_data_t shaper_data; /* Various shaper data. */
 
   /* Various non-shaping data. */
@@ -106,8 +99,6 @@ struct hb_face_t {
   HB_INTERNAL void load_num_glyphs (void) const;
 };
 
   HB_INTERNAL void load_num_glyphs (void) const;
 };
 
-HB_MARK_AS_FLAG_T (hb_face_t::dirty_t);
-
 extern HB_INTERNAL const hb_face_t _hb_face_nil;
 
 #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
 extern HB_INTERNAL const hb_face_t _hb_face_nil;
 
 #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
index 1800c99..d8af8c1 100644 (file)
@@ -43,23 +43,21 @@ const hb_face_t _hb_face_nil = {
 
   true, /* immutable */
 
 
   true, /* immutable */
 
-  NULL, /* reference_table_func */
-  NULL, /* user_data */
-  NULL, /* destroy */
+  nullptr, /* reference_table_func */
+  nullptr, /* user_data */
+  nullptr, /* destroy */
 
   0,    /* index */
   1000, /* upem */
   0,    /* num_glyphs */
 
 
   0,    /* index */
   1000, /* upem */
   0,    /* num_glyphs */
 
-  hb_face_t::NOTHING, /* dirty */
-
   {
 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
 #include "hb-shaper-list.hh"
 #undef HB_SHAPER_IMPLEMENT
   },
 
   {
 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
 #include "hb-shaper-list.hh"
 #undef HB_SHAPER_IMPLEMENT
   },
 
-  NULL, /* shape_plans */
+  nullptr, /* shape_plans */
 };
 
 
 };
 
 
@@ -111,7 +109,7 @@ _hb_face_for_data_closure_create (hb_blob_t *blob, unsigned int index)
 
   closure = (hb_face_for_data_closure_t *) calloc (1, sizeof (hb_face_for_data_closure_t));
   if (unlikely (!closure))
 
   closure = (hb_face_for_data_closure_t *) calloc (1, sizeof (hb_face_for_data_closure_t));
   if (unlikely (!closure))
-    return NULL;
+    return nullptr;
 
   closure->blob = blob;
   closure->index = index;
 
   closure->blob = blob;
   closure->index = index;
@@ -120,8 +118,10 @@ _hb_face_for_data_closure_create (hb_blob_t *blob, unsigned int index)
 }
 
 static void
 }
 
 static void
-_hb_face_for_data_closure_destroy (hb_face_for_data_closure_t *closure)
+_hb_face_for_data_closure_destroy (void *data)
 {
 {
+  hb_face_for_data_closure_t *closure = (hb_face_for_data_closure_t *) data;
+
   hb_blob_destroy (closure->blob);
   free (closure);
 }
   hb_blob_destroy (closure->blob);
   free (closure);
 }
@@ -164,14 +164,14 @@ hb_face_create (hb_blob_t    *blob,
   if (unlikely (!blob))
     blob = hb_blob_get_empty ();
 
   if (unlikely (!blob))
     blob = hb_blob_get_empty ();
 
-  hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (OT::Sanitizer<OT::OpenTypeFontFile>::sanitize (hb_blob_reference (blob)), index);
+  hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (OT::Sanitizer<OT::OpenTypeFontFile>().sanitize (hb_blob_reference (blob)), index);
 
   if (unlikely (!closure))
     return hb_face_get_empty ();
 
   face = hb_face_create_for_tables (_hb_face_for_data_reference_table,
                                    closure,
 
   if (unlikely (!closure))
     return hb_face_get_empty ();
 
   face = hb_face_create_for_tables (_hb_face_for_data_reference_table,
                                    closure,
-                                   (hb_destroy_func_t) _hb_face_for_data_closure_destroy);
+                                   _hb_face_for_data_closure_destroy);
 
   face->index = index;
 
 
   face->index = index;
 
@@ -367,11 +367,6 @@ hb_face_set_index (hb_face_t    *face,
   if (face->immutable)
     return;
 
   if (face->immutable)
     return;
 
-  if (face->index == index)
-    return;
-
-  face->dirty |= face->INDEX;
-
   face->index = index;
 }
 
   face->index = index;
 }
 
@@ -407,11 +402,6 @@ hb_face_set_upem (hb_face_t    *face,
   if (face->immutable)
     return;
 
   if (face->immutable)
     return;
 
-  if (face->upem == upem)
-    return;
-
-  face->dirty |= face->UPEM;
-
   face->upem = upem;
 }
 
   face->upem = upem;
 }
 
@@ -434,7 +424,7 @@ hb_face_get_upem (hb_face_t *face)
 void
 hb_face_t::load_upem (void) const
 {
 void
 hb_face_t::load_upem (void) const
 {
-  hb_blob_t *head_blob = OT::Sanitizer<OT::head>::sanitize (reference_table (HB_OT_TAG_head));
+  hb_blob_t *head_blob = OT::Sanitizer<OT::head>().sanitize (reference_table (HB_OT_TAG_head));
   const OT::head *head_table = OT::Sanitizer<OT::head>::lock_instance (head_blob);
   upem = head_table->get_upem ();
   hb_blob_destroy (head_blob);
   const OT::head *head_table = OT::Sanitizer<OT::head>::lock_instance (head_blob);
   upem = head_table->get_upem ();
   hb_blob_destroy (head_blob);
@@ -456,11 +446,6 @@ hb_face_set_glyph_count (hb_face_t    *face,
   if (face->immutable)
     return;
 
   if (face->immutable)
     return;
 
-  if (face->num_glyphs == glyph_count)
-    return;
-
-  face->dirty |= face->NUM_GLYPHS;
-
   face->num_glyphs = glyph_count;
 }
 
   face->num_glyphs = glyph_count;
 }
 
@@ -483,10 +468,39 @@ hb_face_get_glyph_count (hb_face_t *face)
 void
 hb_face_t::load_num_glyphs (void) const
 {
 void
 hb_face_t::load_num_glyphs (void) const
 {
-  hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>::sanitize (reference_table (HB_OT_TAG_maxp));
+  hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>().sanitize (reference_table (HB_OT_TAG_maxp));
   const OT::maxp *maxp_table = OT::Sanitizer<OT::maxp>::lock_instance (maxp_blob);
   num_glyphs = maxp_table->get_num_glyphs ();
   hb_blob_destroy (maxp_blob);
 }
 
   const OT::maxp *maxp_table = OT::Sanitizer<OT::maxp>::lock_instance (maxp_blob);
   num_glyphs = maxp_table->get_num_glyphs ();
   hb_blob_destroy (maxp_blob);
 }
 
+/**
+ * hb_face_get_table_tags:
+ * @face: a face.
+ *
+ * Retrieves table tags for a face, if possible.
+ *
+ * Return value: total number of tables, or 0 if not possible to list.
+ *
+ * Since: 1.6.0
+ **/
+unsigned int
+hb_face_get_table_tags (hb_face_t    *face,
+                       unsigned int  start_offset,
+                       unsigned int *table_count, /* IN/OUT */
+                       hb_tag_t     *table_tags /* OUT */)
+{
+  if (face->destroy != _hb_face_for_data_closure_destroy)
+  {
+    if (table_count)
+      *table_count = 0;
+    return 0;
+  }
+
+  hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) face->user_data;
+
+  const OT::OpenTypeFontFile &ot_file = *OT::Sanitizer<OT::OpenTypeFontFile>::lock_instance (data->blob);
+  const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index);
 
 
+  return ot_face.get_table_tags (start_offset, table_count, table_tags);
+}
index 91237b7..0ce8d04 100644 (file)
@@ -71,7 +71,6 @@ hb_face_set_user_data (hb_face_t          *face,
                       hb_destroy_func_t   destroy,
                       hb_bool_t           replace);
 
                       hb_destroy_func_t   destroy,
                       hb_bool_t           replace);
 
-
 HB_EXTERN void *
 hb_face_get_user_data (hb_face_t          *face,
                       hb_user_data_key_t *key);
 HB_EXTERN void *
 hb_face_get_user_data (hb_face_t          *face,
                       hb_user_data_key_t *key);
@@ -111,6 +110,11 @@ hb_face_set_glyph_count (hb_face_t    *face,
 HB_EXTERN unsigned int
 hb_face_get_glyph_count (hb_face_t *face);
 
 HB_EXTERN unsigned int
 hb_face_get_glyph_count (hb_face_t *face);
 
+HB_EXTERN unsigned int
+hb_face_get_table_tags (hb_face_t    *face,
+                       unsigned int  start_offset,
+                       unsigned int *table_count, /* IN/OUT */
+                       hb_tag_t     *table_tags /* OUT */);
 
 HB_END_DECLS
 
 
 HB_END_DECLS
 
index 4b60c6c..3f09c3f 100644 (file)
@@ -143,5 +143,7 @@ _hb_fallback_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
   if (HB_DIRECTION_IS_BACKWARD (direction))
     hb_buffer_reverse (buffer);
 
   if (HB_DIRECTION_IS_BACKWARD (direction))
     hb_buffer_reverse (buffer);
 
+  buffer->safe_to_break_all ();
+
   return true;
 }
   return true;
 }
index fbb16a0..992152f 100644 (file)
@@ -108,6 +108,8 @@ struct hb_font_t {
   unsigned int x_ppem;
   unsigned int y_ppem;
 
   unsigned int x_ppem;
   unsigned int y_ppem;
 
+  float ptem;
+
   /* Font variation coordinates. */
   unsigned int num_coords;
   int *coords;
   /* Font variation coordinates. */
   unsigned int num_coords;
   int *coords;
@@ -116,16 +118,6 @@ struct hb_font_t {
   void              *user_data;
   hb_destroy_func_t  destroy;
 
   void              *user_data;
   hb_destroy_func_t  destroy;
 
-  enum dirty_t {
-    NOTHING    = 0x0000,
-    FACE       = 0x0001,
-    PARENT     = 0x0002,
-    FUNCS      = 0x0004,
-    SCALE      = 0x0008,
-    PPEM       = 0x0010,
-    VARIATIONS = 0x0020,
-  } dirty;
-
   struct hb_shaper_data_t shaper_data;
 
 
   struct hb_shaper_data_t shaper_data;
 
 
@@ -136,6 +128,8 @@ struct hb_font_t {
   inline hb_position_t em_scale_y (int16_t v) { return em_scale (v, y_scale); }
   inline hb_position_t em_scalef_x (float v) { return em_scalef (v, this->x_scale); }
   inline hb_position_t em_scalef_y (float v) { return em_scalef (v, this->y_scale); }
   inline hb_position_t em_scale_y (int16_t v) { return em_scale (v, y_scale); }
   inline hb_position_t em_scalef_x (float v) { return em_scalef (v, this->x_scale); }
   inline hb_position_t em_scalef_y (float v) { return em_scalef (v, this->y_scale); }
+  inline float em_fscale_x (int16_t v) { return em_fscale (v, x_scale); }
+  inline float em_fscale_y (int16_t v) { return em_fscale (v, y_scale); }
   inline hb_position_t em_scale_dir (int16_t v, hb_direction_t direction)
   { return em_scale (v, dir_scale (direction)); }
 
   inline hb_position_t em_scale_dir (int16_t v, hb_direction_t direction)
   { return em_scale (v, dir_scale (direction)); }
 
@@ -549,12 +543,14 @@ struct hb_font_t {
   }
   inline hb_position_t em_scalef (float v, int scale)
   {
   }
   inline hb_position_t em_scalef (float v, int scale)
   {
-    return (hb_position_t) (v * scale / face->get_upem ());
+    return (hb_position_t) round (v * scale / face->get_upem ());
+  }
+  inline float em_fscale (int16_t v, int scale)
+  {
+    return (float) v * scale / face->get_upem ();
   }
 };
 
   }
 };
 
-HB_MARK_AS_FLAG_T (hb_font_t::dirty_t);
-
 #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font);
 #include "hb-shaper-list.hh"
 #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font);
 #include "hb-shaper-list.hh"
index e900bd3..f3534b6 100644 (file)
@@ -36,7 +36,7 @@
  */
 
 static hb_bool_t
  */
 
 static hb_bool_t
-hb_font_get_font_h_extents_nil (hb_font_t *font,
+hb_font_get_font_h_extents_nil (hb_font_t *font HB_UNUSED,
                                void *font_data HB_UNUSED,
                                hb_font_extents_t *metrics,
                                void *user_data HB_UNUSED)
                                void *font_data HB_UNUSED,
                                hb_font_extents_t *metrics,
                                void *user_data HB_UNUSED)
@@ -60,7 +60,7 @@ hb_font_get_font_h_extents_parent (hb_font_t *font,
 }
 
 static hb_bool_t
 }
 
 static hb_bool_t
-hb_font_get_font_v_extents_nil (hb_font_t *font,
+hb_font_get_font_v_extents_nil (hb_font_t *font HB_UNUSED,
                                void *font_data HB_UNUSED,
                                hb_font_extents_t *metrics,
                                void *user_data HB_UNUSED)
                                void *font_data HB_UNUSED,
                                hb_font_extents_t *metrics,
                                void *user_data HB_UNUSED)
@@ -347,12 +347,12 @@ static const hb_font_funcs_t _hb_font_funcs_nil = {
   true, /* immutable */
 
   {
   true, /* immutable */
 
   {
-#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
   },
   {
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
   },
   {
-#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
   },
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
   },
@@ -370,12 +370,12 @@ static const hb_font_funcs_t _hb_font_funcs_parent = {
   true, /* immutable */
 
   {
   true, /* immutable */
 
   {
-#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
   },
   {
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
   },
   {
-#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
   },
     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_FONT_FUNC_IMPLEMENT
   },
@@ -563,8 +563,8 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t             *ffuncs,    \
     ffuncs->destroy.name = destroy;                                      \
   } else {                                                               \
     ffuncs->get.f.name = hb_font_get_##name##_parent;                    \
     ffuncs->destroy.name = destroy;                                      \
   } else {                                                               \
     ffuncs->get.f.name = hb_font_get_##name##_parent;                    \
-    ffuncs->user_data.name = NULL;                                       \
-    ffuncs->destroy.name = NULL;                                         \
+    ffuncs->user_data.name = nullptr;                                       \
+    ffuncs->destroy.name = nullptr;                                         \
   }                                                                      \
 }
 
   }                                                                      \
 }
 
@@ -1157,8 +1157,20 @@ hb_font_create_sub_font (hb_font_t *parent)
   font->y_scale = parent->y_scale;
   font->x_ppem = parent->x_ppem;
   font->y_ppem = parent->y_ppem;
   font->y_scale = parent->y_scale;
   font->x_ppem = parent->x_ppem;
   font->y_ppem = parent->y_ppem;
+  font->ptem = parent->ptem;
 
 
-  /* TODO: copy variation coordinates. */
+  font->num_coords = parent->num_coords;
+  if (!font->num_coords)
+    font->coords = nullptr;
+  else
+  {
+    unsigned int size = parent->num_coords * sizeof (parent->coords[0]);
+    font->coords = (int *) malloc (size);
+    if (unlikely (!font->coords))
+      font->num_coords = 0;
+    else
+      memcpy (font->coords, parent->coords, size);
+  }
 
   return font;
 }
 
   return font;
 }
@@ -1180,7 +1192,7 @@ hb_font_get_empty (void)
 
     true, /* immutable */
 
 
     true, /* immutable */
 
-    NULL, /* parent */
+    nullptr, /* parent */
     const_cast<hb_face_t *> (&_hb_face_nil),
 
     1000, /* x_scale */
     const_cast<hb_face_t *> (&_hb_face_nil),
 
     1000, /* x_scale */
@@ -1188,15 +1200,14 @@ hb_font_get_empty (void)
 
     0, /* x_ppem */
     0, /* y_ppem */
 
     0, /* x_ppem */
     0, /* y_ppem */
+    0, /* ptem */
 
     0, /* num_coords */
 
     0, /* num_coords */
-    NULL, /* coords */
+    nullptr, /* coords */
 
     const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil), /* klass */
 
     const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil), /* klass */
-    NULL, /* user_data */
-    NULL, /* destroy */
-
-    hb_font_t::NOTHING, /* dirty */
+    nullptr, /* user_data */
+    nullptr, /* destroy */
 
     {
 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
 
     {
 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
@@ -1350,11 +1361,6 @@ hb_font_set_parent (hb_font_t *font,
   if (!parent)
     parent = hb_font_get_empty ();
 
   if (!parent)
     parent = hb_font_get_empty ();
 
-  if (parent == font->parent)
-    return;
-
-  font->dirty |= font->PARENT;
-
   hb_font_t *old = font->parent;
 
   font->parent = hb_font_reference (parent);
   hb_font_t *old = font->parent;
 
   font->parent = hb_font_reference (parent);
@@ -1397,11 +1403,6 @@ hb_font_set_face (hb_font_t *font,
   if (unlikely (!face))
     face = hb_face_get_empty ();
 
   if (unlikely (!face))
     face = hb_face_get_empty ();
 
-  if (font->face == face)
-    return;
-
-  font->dirty |= font->FACE;
-
   hb_face_t *old = font->face;
 
   font->face = hb_face_reference (face);
   hb_face_t *old = font->face;
 
   font->face = hb_face_reference (face);
@@ -1455,8 +1456,6 @@ hb_font_set_funcs (hb_font_t         *font,
   if (!klass)
     klass = hb_font_funcs_get_empty ();
 
   if (!klass)
     klass = hb_font_funcs_get_empty ();
 
-  font->dirty |= font->FUNCS;
-
   hb_font_funcs_reference (klass);
   hb_font_funcs_destroy (font->klass);
   font->klass = klass;
   hb_font_funcs_reference (klass);
   hb_font_funcs_destroy (font->klass);
   font->klass = klass;
@@ -1512,11 +1511,6 @@ hb_font_set_scale (hb_font_t *font,
   if (font->immutable)
     return;
 
   if (font->immutable)
     return;
 
-  if (font->x_scale == x_scale && font->y_scale == y_scale)
-    return;
-
-  font->dirty |= font->SCALE;
-
   font->x_scale = x_scale;
   font->y_scale = y_scale;
 }
   font->x_scale = x_scale;
   font->y_scale = y_scale;
 }
@@ -1558,11 +1552,6 @@ hb_font_set_ppem (hb_font_t *font,
   if (font->immutable)
     return;
 
   if (font->immutable)
     return;
 
-  if (font->x_ppem == x_ppem && font->y_ppem == y_ppem)
-    return;
-
-  font->dirty |= font->PPEM;
-
   font->x_ppem = x_ppem;
   font->y_ppem = y_ppem;
 }
   font->x_ppem = x_ppem;
   font->y_ppem = y_ppem;
 }
@@ -1586,6 +1575,40 @@ hb_font_get_ppem (hb_font_t *font,
   if (y_ppem) *y_ppem = font->y_ppem;
 }
 
   if (y_ppem) *y_ppem = font->y_ppem;
 }
 
+/**
+ * hb_font_set_ptem:
+ * @font: a font.
+ * @ptem: 
+ *
+ * Sets "point size" of the font.
+ *
+ * Since: 1.6.0
+ **/
+void
+hb_font_set_ptem (hb_font_t *font, float ptem)
+{
+  if (font->immutable)
+    return;
+
+  font->ptem = ptem;
+}
+
+/**
+ * hb_font_get_ptem:
+ * @font: a font.
+ *
+ * Gets the "point size" of the font.  A value of 0 means unset.
+ *
+ * Return value: Point size.
+ *
+ * Since: 0.9.2
+ **/
+float
+hb_font_get_ptem (hb_font_t *font)
+{
+  return font->ptem;
+}
+
 /*
  * Variations
  */
 /*
  * Variations
  */
@@ -1595,16 +1618,6 @@ _hb_font_adopt_var_coords_normalized (hb_font_t *font,
                                      int *coords, /* 2.14 normalized */
                                      unsigned int coords_length)
 {
                                      int *coords, /* 2.14 normalized */
                                      unsigned int coords_length)
 {
-  if (font->num_coords == coords_length &&
-      (coords_length == 0 ||
-       0 == memcmp (font->coords, coords, coords_length * sizeof (coords[0]))))
-  {
-    free (coords);
-    return;
-  }
-
-  font->dirty |= font->VARIATIONS;
-
   free (font->coords);
 
   font->coords = coords;
   free (font->coords);
 
   font->coords = coords;
@@ -1626,13 +1639,13 @@ hb_font_set_variations (hb_font_t *font,
 
   if (!variations_length)
   {
 
   if (!variations_length)
   {
-    hb_font_set_var_coords_normalized (font, NULL, 0);
+    hb_font_set_var_coords_normalized (font, nullptr, 0);
     return;
   }
 
   unsigned int coords_length = hb_ot_var_get_axis_count (font->face);
 
     return;
   }
 
   unsigned int coords_length = hb_ot_var_get_axis_count (font->face);
 
-  int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : NULL;
+  int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr;
   if (unlikely (coords_length && !normalized))
     return;
 
   if (unlikely (coords_length && !normalized))
     return;
 
@@ -1655,7 +1668,7 @@ hb_font_set_var_coords_design (hb_font_t *font,
   if (font->immutable)
     return;
 
   if (font->immutable)
     return;
 
-  int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : NULL;
+  int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr;
   if (unlikely (coords_length && !normalized))
     return;
 
   if (unlikely (coords_length && !normalized))
     return;
 
@@ -1676,7 +1689,7 @@ hb_font_set_var_coords_normalized (hb_font_t *font,
   if (font->immutable)
     return;
 
   if (font->immutable)
     return;
 
-  int *copy = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : NULL;
+  int *copy = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : nullptr;
   if (unlikely (coords_length && !copy))
     return;
 
   if (unlikely (coords_length && !copy))
     return;
 
@@ -1736,7 +1749,7 @@ trampoline_create (FuncType           func,
   trampoline_t *trampoline = (trampoline_t *) calloc (1, sizeof (trampoline_t));
 
   if (unlikely (!trampoline))
   trampoline_t *trampoline = (trampoline_t *) calloc (1, sizeof (trampoline_t));
 
   if (unlikely (!trampoline))
-    return NULL;
+    return nullptr;
 
   trampoline->closure.user_data = user_data;
   trampoline->closure.destroy = destroy;
 
   trampoline->closure.user_data = user_data;
   trampoline->closure.destroy = destroy;
index 85fb56d..c95b61d 100644 (file)
@@ -456,7 +456,7 @@ hb_font_get_glyph_from_name (hb_font_t *font,
 /* high-level funcs, with fallback */
 
 /* Calls either hb_font_get_nominal_glyph() if variation_selector is 0,
 /* high-level funcs, with fallback */
 
 /* Calls either hb_font_get_nominal_glyph() if variation_selector is 0,
- * otherwise callse hb_font_get_variation_glyph(). */
+ * otherwise calls hb_font_get_variation_glyph(). */
 HB_EXTERN hb_bool_t
 hb_font_get_glyph (hb_font_t *font,
                   hb_codepoint_t unicode, hb_codepoint_t variation_selector,
 HB_EXTERN hb_bool_t
 hb_font_get_glyph (hb_font_t *font,
                   hb_codepoint_t unicode, hb_codepoint_t variation_selector,
@@ -607,6 +607,16 @@ hb_font_get_ppem (hb_font_t *font,
                  unsigned int *x_ppem,
                  unsigned int *y_ppem);
 
                  unsigned int *x_ppem,
                  unsigned int *y_ppem);
 
+/*
+ * Point size per EM.  Used for optical-sizing in CoreText.
+ * A value of zero means "not set".
+ */
+HB_EXTERN void
+hb_font_set_ptem (hb_font_t *font, float ptem);
+
+HB_EXTERN float
+hb_font_get_ptem (hb_font_t *font);
+
 HB_EXTERN void
 hb_font_set_variations (hb_font_t *font,
                        const hb_variation_t *variations,
 HB_EXTERN void
 hb_font_set_variations (hb_font_t *font,
                        const hb_variation_t *variations,
index 48d6a0e..fc4b112 100644 (file)
  */
 
 #include "hb-private.hh"
  */
 
 #include "hb-private.hh"
+#include "hb-debug.hh"
 
 #include "hb-ft.h"
 
 #include "hb-font-private.hh"
 
 
 #include "hb-ft.h"
 
 #include "hb-font-private.hh"
 
-#include "hb-cache-private.hh" // Maybe use in the future?
-
 #include FT_ADVANCES_H
 #include FT_MULTIPLE_MASTERS_H
 #include FT_TRUETYPE_TABLES_H
 
 
 #include FT_ADVANCES_H
 #include FT_MULTIPLE_MASTERS_H
 #include FT_TRUETYPE_TABLES_H
 
 
-
-#ifndef HB_DEBUG_FT
-#define HB_DEBUG_FT (HB_DEBUG+0)
-#endif
-
-
 /* TODO:
  *
  * In general, this file does a fine job of what it's supposed to do.
 /* TODO:
  *
  * In general, this file does a fine job of what it's supposed to do.
@@ -65,7 +58,7 @@
  *
  *   - In the future, we should add constructors to create fonts in font space?
  *
  *
  *   - In the future, we should add constructors to create fonts in font space?
  *
- *   - FT_Load_Glyph() is exteremely costly.  Do something about it?
+ *   - FT_Load_Glyph() is extremely costly.  Do something about it?
  */
 
 
  */
 
 
@@ -83,7 +76,7 @@ _hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref)
   hb_ft_font_t *ft_font = (hb_ft_font_t *) calloc (1, sizeof (hb_ft_font_t));
 
   if (unlikely (!ft_font))
   hb_ft_font_t *ft_font = (hb_ft_font_t *) calloc (1, sizeof (hb_ft_font_t));
 
   if (unlikely (!ft_font))
-    return NULL;
+    return nullptr;
 
   ft_font->ft_face = ft_face;
   ft_font->symbol = symbol;
 
   ft_font->ft_face = ft_face;
   ft_font->symbol = symbol;
@@ -95,14 +88,16 @@ _hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref)
 }
 
 static void
 }
 
 static void
-_hb_ft_face_destroy (FT_Face ft_face)
+_hb_ft_face_destroy (void *data)
 {
 {
-  FT_Done_Face (ft_face);
+  FT_Done_Face ((FT_Face) data);
 }
 
 static void
 }
 
 static void
-_hb_ft_font_destroy (hb_ft_font_t *ft_font)
+_hb_ft_font_destroy (void *data)
 {
 {
+  hb_ft_font_t *ft_font = (hb_ft_font_t *) data;
+
   if (ft_font->unref)
     _hb_ft_face_destroy (ft_font->ft_face);
 
   if (ft_font->unref)
     _hb_ft_face_destroy (ft_font->ft_face);
 
@@ -124,7 +119,7 @@ hb_ft_font_set_load_flags (hb_font_t *font, int load_flags)
   if (font->immutable)
     return;
 
   if (font->immutable)
     return;
 
-  if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+  if (font->destroy != _hb_ft_font_destroy)
     return;
 
   hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data;
     return;
 
   hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data;
@@ -144,7 +139,7 @@ hb_ft_font_set_load_flags (hb_font_t *font, int load_flags)
 int
 hb_ft_font_get_load_flags (hb_font_t *font)
 {
 int
 hb_ft_font_get_load_flags (hb_font_t *font)
 {
-  if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
+  if (font->destroy != _hb_ft_font_destroy)
     return 0;
 
   const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
     return 0;
 
   const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
@@ -155,8 +150,8 @@ hb_ft_font_get_load_flags (hb_font_t *font)
 FT_Face
 hb_ft_font_get_face (hb_font_t *font)
 {
 FT_Face
 hb_ft_font_get_face (hb_font_t *font)
 {
-  if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy)
-    return NULL;
+  if (font->destroy != _hb_ft_font_destroy)
+    return nullptr;
 
   const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
 
 
   const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data;
 
@@ -422,7 +417,7 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED,
   return true;
 }
 
   return true;
 }
 
-static hb_font_funcs_t *static_ft_funcs = NULL;
+static hb_font_funcs_t *static_ft_funcs = nullptr;
 
 #ifdef HB_USE_ATEXIT
 static
 
 #ifdef HB_USE_ATEXIT
 static
@@ -442,24 +437,24 @@ retry:
   {
     funcs = hb_font_funcs_create ();
 
   {
     funcs = hb_font_funcs_create ();
 
-    hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, NULL, NULL);
-    //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, NULL, NULL);
-    hb_font_funcs_set_nominal_glyph_func (funcs, hb_ft_get_nominal_glyph, NULL, NULL);
-    hb_font_funcs_set_variation_glyph_func (funcs, hb_ft_get_variation_glyph, NULL, NULL);
-    hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ft_get_glyph_h_advance, NULL, NULL);
-    hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, NULL, NULL);
-    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ft_get_glyph_h_origin, NULL, NULL);
-    hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ft_get_glyph_v_origin, NULL, NULL);
-    hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ft_get_glyph_h_kerning, NULL, NULL);
-    //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ft_get_glyph_v_kerning, NULL, NULL);
-    hb_font_funcs_set_glyph_extents_func (funcs, hb_ft_get_glyph_extents, NULL, NULL);
-    hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ft_get_glyph_contour_point, NULL, NULL);
-    hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, NULL, NULL);
-    hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, NULL, NULL);
+    hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, nullptr, nullptr);
+    //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, nullptr, nullptr);
+    hb_font_funcs_set_nominal_glyph_func (funcs, hb_ft_get_nominal_glyph, nullptr, nullptr);
+    hb_font_funcs_set_variation_glyph_func (funcs, hb_ft_get_variation_glyph, nullptr, nullptr);
+    hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ft_get_glyph_h_advance, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, nullptr, nullptr);
+    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ft_get_glyph_h_origin, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ft_get_glyph_v_origin, nullptr, nullptr);
+    hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ft_get_glyph_h_kerning, nullptr, nullptr);
+    //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ft_get_glyph_v_kerning, nullptr, nullptr);
+    hb_font_funcs_set_glyph_extents_func (funcs, hb_ft_get_glyph_extents, nullptr, nullptr);
+    hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ft_get_glyph_contour_point, nullptr, nullptr);
+    hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, nullptr, nullptr);
+    hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, nullptr, nullptr);
 
     hb_font_funcs_make_immutable (funcs);
 
 
     hb_font_funcs_make_immutable (funcs);
 
-    if (!hb_atomic_ptr_cmpexch (&static_ft_funcs, NULL, funcs)) {
+    if (!hb_atomic_ptr_cmpexch (&static_ft_funcs, nullptr, funcs)) {
       hb_font_funcs_destroy (funcs);
       goto retry;
     }
       hb_font_funcs_destroy (funcs);
       goto retry;
     }
@@ -474,7 +469,7 @@ retry:
   hb_font_set_funcs (font,
                     funcs,
                     _hb_ft_font_create (ft_face, symbol, unref),
   hb_font_set_funcs (font,
                     funcs,
                     _hb_ft_font_create (ft_face, symbol, unref),
-                    (hb_destroy_func_t) _hb_ft_font_destroy);
+                    _hb_ft_font_destroy);
 }
 
 
 }
 
 
@@ -488,17 +483,17 @@ reference_table  (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
 
   /* Note: FreeType like HarfBuzz uses the NONE tag for fetching the entire blob */
 
 
   /* Note: FreeType like HarfBuzz uses the NONE tag for fetching the entire blob */
 
-  error = FT_Load_Sfnt_Table (ft_face, tag, 0, NULL, &length);
+  error = FT_Load_Sfnt_Table (ft_face, tag, 0, nullptr, &length);
   if (error)
   if (error)
-    return NULL;
+    return nullptr;
 
   buffer = (FT_Byte *) malloc (length);
 
   buffer = (FT_Byte *) malloc (length);
-  if (buffer == NULL)
-    return NULL;
+  if (!buffer)
+    return nullptr;
 
   error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length);
   if (error)
 
   error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length);
   if (error)
-    return NULL;
+    return nullptr;
 
   return hb_blob_create ((const char *) buffer, length,
                         HB_MEMORY_MODE_WRITABLE,
 
   return hb_blob_create ((const char *) buffer, length,
                         HB_MEMORY_MODE_WRITABLE,
@@ -521,7 +516,7 @@ hb_ft_face_create (FT_Face           ft_face,
 {
   hb_face_t *face;
 
 {
   hb_face_t *face;
 
-  if (ft_face->stream->read == NULL) {
+  if (!ft_face->stream->read) {
     hb_blob_t *blob;
 
     blob = hb_blob_create ((const char *) ft_face->stream->base,
     hb_blob_t *blob;
 
     blob = hb_blob_create ((const char *) ft_face->stream->base,
@@ -553,7 +548,7 @@ hb_face_t *
 hb_ft_face_create_referenced (FT_Face ft_face)
 {
   FT_Reference_Face (ft_face);
 hb_ft_face_create_referenced (FT_Face ft_face)
 {
   FT_Reference_Face (ft_face);
-  return hb_ft_face_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy);
+  return hb_ft_face_create (ft_face, _hb_ft_face_destroy);
 }
 
 static void
 }
 
 static void
@@ -579,7 +574,7 @@ hb_ft_face_create_cached (FT_Face ft_face)
     if (ft_face->generic.finalizer)
       ft_face->generic.finalizer (ft_face);
 
     if (ft_face->generic.finalizer)
       ft_face->generic.finalizer (ft_face);
 
-    ft_face->generic.data = hb_ft_face_create (ft_face, NULL);
+    ft_face->generic.data = hb_ft_face_create (ft_face, nullptr);
     ft_face->generic.finalizer = (FT_Generic_Finalizer) hb_ft_face_finalize;
   }
 
     ft_face->generic.finalizer = (FT_Generic_Finalizer) hb_ft_face_finalize;
   }
 
@@ -608,6 +603,19 @@ hb_ft_font_create (FT_Face           ft_face,
   font = hb_font_create (face);
   hb_face_destroy (face);
   _hb_ft_font_set_funcs (font, ft_face, false);
   font = hb_font_create (face);
   hb_face_destroy (face);
   _hb_ft_font_set_funcs (font, ft_face, false);
+  hb_ft_font_changed (font);
+  return font;
+}
+
+void
+hb_ft_font_changed (hb_font_t *font)
+{
+  if (font->destroy != _hb_ft_font_destroy)
+    return;
+
+  hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data;
+  FT_Face ft_face = ft_font->ft_face;
+
   hb_font_set_scale (font,
                     (int) (((uint64_t) ft_face->size->metrics.x_scale * (uint64_t) ft_face->units_per_EM + (1u<<15)) >> 16),
                     (int) (((uint64_t) ft_face->size->metrics.y_scale * (uint64_t) ft_face->units_per_EM + (1u<<15)) >> 16));
   hb_font_set_scale (font,
                     (int) (((uint64_t) ft_face->size->metrics.x_scale * (uint64_t) ft_face->units_per_EM + (1u<<15)) >> 16),
                     (int) (((uint64_t) ft_face->size->metrics.y_scale * (uint64_t) ft_face->units_per_EM + (1u<<15)) >> 16));
@@ -618,7 +626,7 @@ hb_ft_font_create (FT_Face           ft_face,
 #endif
 
 #ifdef HAVE_FT_GET_VAR_BLEND_COORDINATES
 #endif
 
 #ifdef HAVE_FT_GET_VAR_BLEND_COORDINATES
-  FT_MM_Var *mm_var = NULL;
+  FT_MM_Var *mm_var = nullptr;
   if (!FT_Get_MM_Var (ft_face, &mm_var))
   {
     FT_Fixed *ft_coords = (FT_Fixed *) calloc (mm_var->num_axis, sizeof (FT_Fixed));
   if (!FT_Get_MM_Var (ft_face, &mm_var))
   {
     FT_Fixed *ft_coords = (FT_Fixed *) calloc (mm_var->num_axis, sizeof (FT_Fixed));
@@ -627,19 +635,29 @@ hb_ft_font_create (FT_Face           ft_face,
     {
       if (!FT_Get_Var_Blend_Coordinates (ft_face, mm_var->num_axis, ft_coords))
       {
     {
       if (!FT_Get_Var_Blend_Coordinates (ft_face, mm_var->num_axis, ft_coords))
       {
+       bool nonzero = false;
+
        for (unsigned int i = 0; i < mm_var->num_axis; ++i)
        for (unsigned int i = 0; i < mm_var->num_axis; ++i)
+        {
          coords[i] = ft_coords[i] >>= 2;
          coords[i] = ft_coords[i] >>= 2;
+         nonzero = nonzero || coords[i];
+        }
 
 
-       hb_font_set_var_coords_normalized (font, coords, mm_var->num_axis);
+       if (nonzero)
+         hb_font_set_var_coords_normalized (font, coords, mm_var->num_axis);
+       else
+         hb_font_set_var_coords_normalized (font, nullptr, 0);
       }
       }
-      free (coords);
-      free (ft_coords);
     }
     }
+    free (coords);
+    free (ft_coords);
+#ifdef HAVE_FT_DONE_MM_VAR
+    FT_Done_MM_Var (ft_face->glyph->library, mm_var);
+#else
     free (mm_var);
     free (mm_var);
+#endif
   }
 #endif
   }
 #endif
-
-  return font;
 }
 
 /**
 }
 
 /**
@@ -655,7 +673,7 @@ hb_font_t *
 hb_ft_font_create_referenced (FT_Face ft_face)
 {
   FT_Reference_Face (ft_face);
 hb_ft_font_create_referenced (FT_Face ft_face)
 {
   FT_Reference_Face (ft_face);
-  return hb_ft_font_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy);
+  return hb_ft_font_create (ft_face, _hb_ft_face_destroy);
 }
 
 
 }
 
 
@@ -681,9 +699,9 @@ retry:
   {
     /* Not found; allocate one. */
     if (FT_Init_FreeType (&library))
   {
     /* Not found; allocate one. */
     if (FT_Init_FreeType (&library))
-      return NULL;
+      return nullptr;
 
 
-    if (!hb_atomic_ptr_cmpexch (&ft_library, NULL, library)) {
+    if (!hb_atomic_ptr_cmpexch (&ft_library, nullptr, library)) {
       FT_Done_FreeType (library);
       goto retry;
     }
       FT_Done_FreeType (library);
       goto retry;
     }
@@ -711,7 +729,7 @@ hb_ft_font_set_funcs (hb_font_t *font)
   if (unlikely (!blob_length))
     DEBUG_MSG (FT, font, "Font face has empty blob");
 
   if (unlikely (!blob_length))
     DEBUG_MSG (FT, font, "Font face has empty blob");
 
-  FT_Face ft_face = NULL;
+  FT_Face ft_face = nullptr;
   FT_Error err = FT_New_Memory_Face (get_ft_library (),
                                     (const FT_Byte *) blob_data,
                                     blob_length,
   FT_Error err = FT_New_Memory_Face (get_ft_library (),
                                     (const FT_Byte *) blob_data,
                                     blob_length,
@@ -738,9 +756,10 @@ hb_ft_font_set_funcs (hb_font_t *font)
   {
     FT_Matrix matrix = { font->x_scale < 0 ? -1 : +1, 0,
                          0, font->y_scale < 0 ? -1 : +1};
   {
     FT_Matrix matrix = { font->x_scale < 0 ? -1 : +1, 0,
                          0, font->y_scale < 0 ? -1 : +1};
-    FT_Set_Transform (ft_face, &matrix, NULL);
+    FT_Set_Transform (ft_face, &matrix, nullptr);
   }
 
   }
 
+#ifdef HAVE_FT_SET_VAR_BLEND_COORDINATES
   unsigned int num_coords;
   const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
   if (num_coords)
   unsigned int num_coords;
   const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
   if (num_coords)
@@ -754,6 +773,7 @@ hb_ft_font_set_funcs (hb_font_t *font)
       free (ft_coords);
     }
   }
       free (ft_coords);
     }
   }
+#endif
 
   ft_face->generic.data = blob;
   ft_face->generic.finalizer = (FT_Generic_Finalizer) _release_blob;
 
   ft_face->generic.data = blob;
   ft_face->generic.finalizer = (FT_Generic_Finalizer) _release_blob;
index dc8ef85..94013ee 100644 (file)
@@ -116,7 +116,13 @@ hb_ft_font_set_load_flags (hb_font_t *font, int load_flags);
 HB_EXTERN int
 hb_ft_font_get_load_flags (hb_font_t *font);
 
 HB_EXTERN int
 hb_ft_font_get_load_flags (hb_font_t *font);
 
-/* Makes an hb_font_t use FreeType internally to implement font functions. */
+/* Call when size or variations settings on underlying FT_Face change. */
+HB_EXTERN void
+hb_ft_font_changed (hb_font_t *font);
+
+/* Makes an hb_font_t use FreeType internally to implement font functions.
+ * Note: this internally creates an FT_Face.  Use it when you create your
+ * hb_face_t using hb_face_create(). */
 HB_EXTERN void
 hb_ft_font_set_funcs (hb_font_t *font);
 
 HB_EXTERN void
 hb_ft_font_set_funcs (hb_font_t *font);
 
index 2b91b5b..50c30e9 100644 (file)
@@ -364,25 +364,54 @@ hb_glib_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs HB_UNUSED,
   return utf8_decomposed_len;
 }
 
   return utf8_decomposed_len;
 }
 
+static hb_unicode_funcs_t *static_glib_funcs = nullptr;
+
+#ifdef HB_USE_ATEXIT
+static
+void free_static_glib_funcs (void)
+{
+  hb_unicode_funcs_destroy (static_glib_funcs);
+}
+#endif
+
 hb_unicode_funcs_t *
 hb_glib_get_unicode_funcs (void)
 {
 hb_unicode_funcs_t *
 hb_glib_get_unicode_funcs (void)
 {
-  static const hb_unicode_funcs_t _hb_glib_unicode_funcs = {
-    HB_OBJECT_HEADER_STATIC,
+retry:
+  hb_unicode_funcs_t *funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_glib_funcs);
+
+  if (unlikely (!funcs))
+  {
+    funcs = hb_unicode_funcs_create (nullptr);
 
 
-    NULL, /* parent */
-    true, /* immutable */
-    {
-#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_glib_unicode_##name,
+#define HB_UNICODE_FUNC_IMPLEMENT(name) \
+    hb_unicode_funcs_set_##name##_func (funcs, hb_glib_unicode_##name, nullptr, nullptr);
       HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_UNICODE_FUNC_IMPLEMENT
       HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_UNICODE_FUNC_IMPLEMENT
+
+    hb_unicode_funcs_make_immutable (funcs);
+
+    if (!hb_atomic_ptr_cmpexch (&static_glib_funcs, nullptr, funcs)) {
+      hb_unicode_funcs_destroy (funcs);
+      goto retry;
     }
     }
+
+#ifdef HB_USE_ATEXIT
+    atexit (free_static_glib_funcs); /* First person registers atexit() callback. */
+#endif
   };
 
   };
 
-  return const_cast<hb_unicode_funcs_t *> (&_hb_glib_unicode_funcs);
+  return hb_unicode_funcs_reference (funcs);
 }
 
 #if GLIB_CHECK_VERSION(2,31,10)
 }
 
 #if GLIB_CHECK_VERSION(2,31,10)
+
+static void
+_hb_g_bytes_unref (void *data)
+{
+  g_bytes_unref ((GBytes *) data);
+}
+
 /**
  * hb_glib_blob_create:
  *
 /**
  * hb_glib_blob_create:
  *
@@ -397,6 +426,6 @@ hb_glib_blob_create (GBytes *gbytes)
                         size,
                         HB_MEMORY_MODE_READONLY,
                         g_bytes_ref (gbytes),
                         size,
                         HB_MEMORY_MODE_READONLY,
                         g_bytes_ref (gbytes),
-                        (hb_destroy_func_t) g_bytes_unref);
+                        _hb_g_bytes_unref);
 }
 #endif
 }
 #endif
index e28510c..606727c 100644 (file)
@@ -42,7 +42,8 @@ HB_BEGIN_DECLS
 /*** END file-header ***/
 
 /*** BEGIN value-header ***/
 /*** END file-header ***/
 
 /*** BEGIN value-header ***/
-HB_EXTERN GType @enum_name@_get_type (void) G_GNUC_CONST;
+HB_EXTERN GType
+@enum_name@_get_type (void) G_GNUC_CONST;
 #define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())
 
 /*** END value-header ***/
 #define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())
 
 /*** END value-header ***/
index fef0024..a96c358 100644 (file)
@@ -58,7 +58,7 @@ hb_gobject_##name##_get_type (void) \
        static hb_##name##_t *_hb_##name##_reference (const hb_##name##_t *l) \
        { \
          hb_##name##_t *c = (hb_##name##_t *) calloc (1, sizeof (hb_##name##_t)); \
        static hb_##name##_t *_hb_##name##_reference (const hb_##name##_t *l) \
        { \
          hb_##name##_t *c = (hb_##name##_t *) calloc (1, sizeof (hb_##name##_t)); \
-         if (unlikely (!c)) return NULL; \
+         if (unlikely (!c)) return nullptr; \
          *c = *l; \
          return c; \
        } \
          *c = *l; \
          return c; \
        } \
index 1c30321..302dc95 100644 (file)
@@ -45,7 +45,8 @@ HB_BEGIN_DECLS
  *
  * Since: 0.9.2
  **/
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_blob_get_type (void);
+HB_EXTERN GType
+hb_gobject_blob_get_type (void);
 #define HB_GOBJECT_TYPE_BLOB (hb_gobject_blob_get_type ())
 
 /**
 #define HB_GOBJECT_TYPE_BLOB (hb_gobject_blob_get_type ())
 
 /**
@@ -53,7 +54,8 @@ HB_EXTERN GType hb_gobject_blob_get_type (void);
  *
  * Since: 0.9.2
  **/
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_buffer_get_type (void);
+HB_EXTERN GType
+hb_gobject_buffer_get_type (void);
 #define HB_GOBJECT_TYPE_BUFFER (hb_gobject_buffer_get_type ())
 
 /**
 #define HB_GOBJECT_TYPE_BUFFER (hb_gobject_buffer_get_type ())
 
 /**
@@ -61,7 +63,8 @@ HB_EXTERN GType hb_gobject_buffer_get_type (void);
  *
  * Since: 0.9.2
  **/
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_face_get_type (void);
+HB_EXTERN GType
+hb_gobject_face_get_type (void);
 #define HB_GOBJECT_TYPE_FACE (hb_gobject_face_get_type ())
 
 /**
 #define HB_GOBJECT_TYPE_FACE (hb_gobject_face_get_type ())
 
 /**
@@ -69,7 +72,8 @@ HB_EXTERN GType hb_gobject_face_get_type (void);
  *
  * Since: 0.9.2
  **/
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_font_get_type (void);
+HB_EXTERN GType
+hb_gobject_font_get_type (void);
 #define HB_GOBJECT_TYPE_FONT (hb_gobject_font_get_type ())
 
 /**
 #define HB_GOBJECT_TYPE_FONT (hb_gobject_font_get_type ())
 
 /**
@@ -77,13 +81,16 @@ HB_EXTERN GType hb_gobject_font_get_type (void);
  *
  * Since: 0.9.2
  **/
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_font_funcs_get_type (void);
+HB_EXTERN GType
+hb_gobject_font_funcs_get_type (void);
 #define HB_GOBJECT_TYPE_FONT_FUNCS (hb_gobject_font_funcs_get_type ())
 
 #define HB_GOBJECT_TYPE_FONT_FUNCS (hb_gobject_font_funcs_get_type ())
 
-HB_EXTERN GType hb_gobject_set_get_type (void);
+HB_EXTERN GType
+hb_gobject_set_get_type (void);
 #define HB_GOBJECT_TYPE_SET (hb_gobject_set_get_type ())
 
 #define HB_GOBJECT_TYPE_SET (hb_gobject_set_get_type ())
 
-HB_EXTERN GType hb_gobject_shape_plan_get_type (void);
+HB_EXTERN GType
+hb_gobject_shape_plan_get_type (void);
 #define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ())
 
 /**
 #define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ())
 
 /**
@@ -91,26 +98,40 @@ HB_EXTERN GType hb_gobject_shape_plan_get_type (void);
  *
  * Since: 0.9.2
  **/
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_unicode_funcs_get_type (void);
+HB_EXTERN GType
+hb_gobject_unicode_funcs_get_type (void);
 #define HB_GOBJECT_TYPE_UNICODE_FUNCS (hb_gobject_unicode_funcs_get_type ())
 
 /* Value types */
 
 #define HB_GOBJECT_TYPE_UNICODE_FUNCS (hb_gobject_unicode_funcs_get_type ())
 
 /* Value types */
 
-HB_EXTERN GType hb_gobject_feature_get_type (void);
+HB_EXTERN GType
+hb_gobject_feature_get_type (void);
 #define HB_GOBJECT_TYPE_FEATURE (hb_gobject_feature_get_type ())
 
 #define HB_GOBJECT_TYPE_FEATURE (hb_gobject_feature_get_type ())
 
-HB_EXTERN GType hb_gobject_glyph_info_get_type (void);
+HB_EXTERN GType
+hb_gobject_glyph_info_get_type (void);
 #define HB_GOBJECT_TYPE_GLYPH_INFO (hb_gobject_glyph_info_get_type ())
 
 #define HB_GOBJECT_TYPE_GLYPH_INFO (hb_gobject_glyph_info_get_type ())
 
-HB_EXTERN GType hb_gobject_glyph_position_get_type (void);
+HB_EXTERN GType
+hb_gobject_glyph_position_get_type (void);
 #define HB_GOBJECT_TYPE_GLYPH_POSITION (hb_gobject_glyph_position_get_type ())
 
 #define HB_GOBJECT_TYPE_GLYPH_POSITION (hb_gobject_glyph_position_get_type ())
 
-HB_EXTERN GType hb_gobject_segment_properties_get_type (void);
+HB_EXTERN GType
+hb_gobject_segment_properties_get_type (void);
 #define HB_GOBJECT_TYPE_SEGMENT_PROPERTIES (hb_gobject_segment_properties_get_type ())
 
 #define HB_GOBJECT_TYPE_SEGMENT_PROPERTIES (hb_gobject_segment_properties_get_type ())
 
-HB_EXTERN GType hb_gobject_user_data_key_get_type (void);
+HB_EXTERN GType
+hb_gobject_user_data_key_get_type (void);
 #define HB_GOBJECT_TYPE_USER_DATA_KEY (hb_gobject_user_data_key_get_type ())
 
 #define HB_GOBJECT_TYPE_USER_DATA_KEY (hb_gobject_user_data_key_get_type ())
 
+HB_EXTERN GType
+hb_gobject_ot_math_glyph_variant_get_type (void);
+#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT (hb_gobject_ot_math_glyph_variant_get_type ())
+
+HB_EXTERN GType
+hb_gobject_ot_math_glyph_part_get_type (void);
+#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART (hb_gobject_ot_math_glyph_part_get_type ())
+
 
 HB_END_DECLS
 
 
 HB_END_DECLS
 
index c9799e9..46fe139 100644 (file)
@@ -59,7 +59,7 @@ static const void *hb_graphite2_get_table (const void *data, unsigned int tag, s
   hb_graphite2_shaper_face_data_t *face_data = (hb_graphite2_shaper_face_data_t *) data;
   hb_graphite2_tablelist_t *tlist = face_data->tlist;
 
   hb_graphite2_shaper_face_data_t *face_data = (hb_graphite2_shaper_face_data_t *) data;
   hb_graphite2_tablelist_t *tlist = face_data->tlist;
 
-  hb_blob_t *blob = NULL;
+  hb_blob_t *blob = nullptr;
 
   for (hb_graphite2_tablelist_t *p = tlist; p; p = p->next)
     if (p->tag == tag) {
 
   for (hb_graphite2_tablelist_t *p = tlist; p; p = p->next)
     if (p->tag == tag) {
@@ -74,13 +74,13 @@ static const void *hb_graphite2_get_table (const void *data, unsigned int tag, s
     hb_graphite2_tablelist_t *p = (hb_graphite2_tablelist_t *) calloc (1, sizeof (hb_graphite2_tablelist_t));
     if (unlikely (!p)) {
       hb_blob_destroy (blob);
     hb_graphite2_tablelist_t *p = (hb_graphite2_tablelist_t *) calloc (1, sizeof (hb_graphite2_tablelist_t));
     if (unlikely (!p)) {
       hb_blob_destroy (blob);
-      return NULL;
+      return nullptr;
     }
     p->blob = blob;
     p->tag = tag;
 
     /* TODO Not thread-safe, but fairly harmless.
     }
     p->blob = blob;
     p->tag = tag;
 
     /* TODO Not thread-safe, but fairly harmless.
-     * We can do the double-chcked pointer cmpexch thing here. */
+     * We can do the double-checked pointer cmpexch thing here. */
     p->next = face_data->tlist;
     face_data->tlist = p;
   }
     p->next = face_data->tlist;
     face_data->tlist = p;
   }
@@ -100,20 +100,20 @@ _hb_graphite2_shaper_face_data_create (hb_face_t *face)
   if (!hb_blob_get_length (silf_blob))
   {
     hb_blob_destroy (silf_blob);
   if (!hb_blob_get_length (silf_blob))
   {
     hb_blob_destroy (silf_blob);
-    return NULL;
+    return nullptr;
   }
   hb_blob_destroy (silf_blob);
 
   hb_graphite2_shaper_face_data_t *data = (hb_graphite2_shaper_face_data_t *) calloc (1, sizeof (hb_graphite2_shaper_face_data_t));
   if (unlikely (!data))
   }
   hb_blob_destroy (silf_blob);
 
   hb_graphite2_shaper_face_data_t *data = (hb_graphite2_shaper_face_data_t *) calloc (1, sizeof (hb_graphite2_shaper_face_data_t));
   if (unlikely (!data))
-    return NULL;
+    return nullptr;
 
   data->face = face;
   data->grface = gr_make_face (data, &hb_graphite2_get_table, gr_face_preloadAll);
 
   if (unlikely (!data->grface)) {
     free (data);
 
   data->face = face;
   data->grface = gr_make_face (data, &hb_graphite2_get_table, gr_face_preloadAll);
 
   if (unlikely (!data->grface)) {
     free (data);
-    return NULL;
+    return nullptr;
   }
 
   return data;
   }
 
   return data;
@@ -143,7 +143,7 @@ _hb_graphite2_shaper_face_data_destroy (hb_graphite2_shaper_face_data_t *data)
 gr_face *
 hb_graphite2_face_get_gr_face (hb_face_t *face)
 {
 gr_face *
 hb_graphite2_face_get_gr_face (hb_face_t *face)
 {
-  if (unlikely (!hb_graphite2_shaper_face_data_ensure (face))) return NULL;
+  if (unlikely (!hb_graphite2_shaper_face_data_ensure (face))) return nullptr;
   return HB_SHAPER_DATA_GET (face)->grface;
 }
 
   return HB_SHAPER_DATA_GET (face)->grface;
 }
 
@@ -171,7 +171,7 @@ _hb_graphite2_shaper_font_data_destroy (hb_graphite2_shaper_font_data_t *data HB
 gr_font *
 hb_graphite2_font_get_gr_font (hb_font_t *font)
 {
 gr_font *
 hb_graphite2_font_get_gr_font (hb_font_t *font)
 {
-  return NULL;
+  return nullptr;
 }
 
 
 }
 
 
@@ -221,7 +221,7 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
   gr_face *grface = HB_SHAPER_DATA_GET (face)->grface;
 
   const char *lang = hb_language_to_string (hb_buffer_get_language (buffer));
   gr_face *grface = HB_SHAPER_DATA_GET (face)->grface;
 
   const char *lang = hb_language_to_string (hb_buffer_get_language (buffer));
-  const char *lang_end = lang ? strchr (lang, '-') : NULL;
+  const char *lang_end = lang ? strchr (lang, '-') : nullptr;
   int lang_len = lang_end ? lang_end - lang : -1;
   gr_feature_val *feats = gr_face_featureval_for_lang (grface, lang ? hb_tag_from_string (lang, lang_len) : 0);
 
   int lang_len = lang_end ? lang_end - lang : -1;
   gr_feature_val *feats = gr_face_featureval_for_lang (grface, lang ? hb_tag_from_string (lang, lang_len) : 0);
 
@@ -232,7 +232,7 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
       gr_fref_set_feature_value (fref, features[i].value, feats);
   }
 
       gr_fref_set_feature_value (fref, features[i].value, feats);
   }
 
-  gr_segment *seg = NULL;
+  gr_segment *seg = nullptr;
   const gr_slot *is;
   unsigned int ci = 0, ic = 0;
   float curradvx = 0., curradvy = 0.;
   const gr_slot *is;
   unsigned int ci = 0, ic = 0;
   float curradvx = 0., curradvy = 0.;
@@ -250,7 +250,7 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
   hb_tag_t script_tag[2];
   hb_ot_tags_from_script (hb_buffer_get_script (buffer), &script_tag[0], &script_tag[1]);
 
   hb_tag_t script_tag[2];
   hb_ot_tags_from_script (hb_buffer_get_script (buffer), &script_tag[0], &script_tag[1]);
 
-  seg = gr_make_seg (NULL, grface,
+  seg = gr_make_seg (nullptr, grface,
                     script_tag[1] == HB_TAG_NONE ? script_tag[0] : script_tag[1],
                     feats,
                     gr_utf32, chars, buffer->len,
                     script_tag[1] == HB_TAG_NONE ? script_tag[0] : script_tag[1],
                     feats,
                     gr_utf32, chars, buffer->len,
@@ -307,6 +307,8 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
     curradv = gr_slot_origin_X(gr_seg_first_slot(seg));
     clusters[0].advance = gr_seg_advance_X(seg) - curradv;
   }
     curradv = gr_slot_origin_X(gr_seg_first_slot(seg));
     clusters[0].advance = gr_seg_advance_X(seg) - curradv;
   }
+  else
+    clusters[0].advance = 0;
   for (is = gr_seg_first_slot (seg), ic = 0; is; is = gr_slot_next_in_segment (is), ic++)
   {
     unsigned int before = gr_slot_before (is);
   for (is = gr_seg_first_slot (seg), ic = 0; is; is = gr_slot_next_in_segment (is), ic++)
   {
     unsigned int before = gr_slot_before (is);
@@ -332,7 +334,10 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
       if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
         c->advance = curradv - gr_slot_origin_X(is);
       else
       if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
         c->advance = curradv - gr_slot_origin_X(is);
       else
-        clusters[ci].advance = gr_slot_origin_X(is) - curradv;
+      {
+        c->advance = 0;
+        clusters[ci].advance += gr_slot_origin_X(is) - curradv;
+      }
       ci++;
       curradv = gr_slot_origin_X(is);
     }
       ci++;
       curradv = gr_slot_origin_X(is);
     }
@@ -345,7 +350,7 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
   if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
     clusters[ci].advance += curradv;
   else
   if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
     clusters[ci].advance += curradv;
   else
-    clusters[ci].advance = gr_seg_advance_X(seg) - curradv;
+    clusters[ci].advance += gr_seg_advance_X(seg) - curradv;
   ci++;
 
   for (unsigned int i = 0; i < ci; ++i)
   ci++;
 
   for (unsigned int i = 0; i < ci; ++i)
@@ -365,9 +370,9 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
   float yscale = (float) font->y_scale / upem;
   yscale *= yscale / xscale;
   /* Positioning. */
   float yscale = (float) font->y_scale / upem;
   yscale *= yscale / xscale;
   /* Positioning. */
-  int currclus = -1;
+  unsigned int currclus = (unsigned int) -1;
   const hb_glyph_info_t *info = buffer->info;
   const hb_glyph_info_t *info = buffer->info;
-  hb_glyph_position_t *pPos = hb_buffer_get_glyph_positions (buffer, NULL);
+  hb_glyph_position_t *pPos = hb_buffer_get_glyph_positions (buffer, nullptr);
   if (!HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
   {
     curradvx = 0;
   if (!HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
   {
     curradvx = 0;
@@ -382,13 +387,13 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
       } else
         pPos->x_advance = 0.;
 
       } else
         pPos->x_advance = 0.;
 
-      pPos->y_advance = gr_slot_advance_Y (is, grface, NULL) * yscale;
+      pPos->y_advance = gr_slot_advance_Y (is, grface, nullptr) * yscale;
       curradvy += pPos->y_advance;
     }
   }
   else
   {
       curradvy += pPos->y_advance;
     }
   }
   else
   {
-    curradvx = gr_seg_advance_X(seg);
+    curradvx = gr_seg_advance_X(seg) * xscale;
     for (is = gr_seg_first_slot (seg); is; pPos++, info++, is = gr_slot_next_in_segment (is))
     {
       if (info->cluster != currclus)
     for (is = gr_seg_first_slot (seg); is; pPos++, info++, is = gr_slot_next_in_segment (is))
     {
       if (info->cluster != currclus)
@@ -399,7 +404,7 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
       } else
         pPos->x_advance = 0.;
 
       } else
         pPos->x_advance = 0.;
 
-      pPos->y_advance = gr_slot_advance_Y (is, grface, NULL) * yscale;
+      pPos->y_advance = gr_slot_advance_Y (is, grface, nullptr) * yscale;
       curradvy -= pPos->y_advance;
       pPos->x_offset = (gr_slot_origin_X (is) - info->var1.i32) * xscale - curradvx + pPos->x_advance;
       pPos->y_offset = gr_slot_origin_Y (is) * yscale - curradvy;
       curradvy -= pPos->y_advance;
       pPos->x_offset = (gr_slot_origin_X (is) - info->var1.i32) * xscale - curradvx + pPos->x_advance;
       pPos->y_offset = gr_slot_origin_Y (is) * yscale - curradvy;
@@ -410,5 +415,7 @@ _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
   if (feats) gr_featureval_destroy (feats);
   gr_seg_destroy (seg);
 
   if (feats) gr_featureval_destroy (feats);
   gr_seg_destroy (seg);
 
+  buffer->unsafe_to_break_all ();
+
   return true;
 }
   return true;
 }
index ee54721..552eaec 100644 (file)
@@ -34,7 +34,7 @@
 #include "hb-unicode-private.hh"
 
 #include <unicode/uchar.h>
 #include "hb-unicode-private.hh"
 
 #include <unicode/uchar.h>
-#include <unicode/unorm.h>
+#include <unicode/unorm2.h>
 #include <unicode/ustring.h>
 #include <unicode/utf16.h>
 #include <unicode/uversion.h>
 #include <unicode/ustring.h>
 #include <unicode/utf16.h>
 #include <unicode/uversion.h>
@@ -200,7 +200,7 @@ hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
   if (err) return false;
 
   icu_err = U_ZERO_ERROR;
   if (err) return false;
 
   icu_err = U_ZERO_ERROR;
-  len = unorm_normalize (utf16, len, UNORM_NFC, 0, normalized, ARRAY_LENGTH (normalized), &icu_err);
+  len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
   if (U_FAILURE (icu_err))
     return false;
   if (u_countChar32 (normalized, len) == 1) {
   if (U_FAILURE (icu_err))
     return false;
   if (u_countChar32 (normalized, len) == 1) {
@@ -261,7 +261,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
   if (err) return false;
 
   icu_err = U_ZERO_ERROR;
   if (err) return false;
 
   icu_err = U_ZERO_ERROR;
-  len = unorm_normalize (utf16, len, UNORM_NFD, 0, normalized, ARRAY_LENGTH (normalized), &icu_err);
+  len = unorm2_normalize (unorm2_getNFDInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
   if (U_FAILURE (icu_err))
     return false;
 
   if (U_FAILURE (icu_err))
     return false;
 
@@ -281,7 +281,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
      * the second part :-(. */
     UChar recomposed[20];
     icu_err = U_ZERO_ERROR;
      * the second part :-(. */
     UChar recomposed[20];
     icu_err = U_ZERO_ERROR;
-    unorm_normalize (normalized, len, UNORM_NFC, 0, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
+    unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
     if (U_FAILURE (icu_err))
       return false;
     hb_codepoint_t c;
     if (U_FAILURE (icu_err))
       return false;
     hb_codepoint_t c;
@@ -297,7 +297,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
     U16_PREV_UNSAFE (normalized, len, *b); /* Changes len in-place. */
     UChar recomposed[18 * 2];
     icu_err = U_ZERO_ERROR;
     U16_PREV_UNSAFE (normalized, len, *b); /* Changes len in-place. */
     UChar recomposed[18 * 2];
     icu_err = U_ZERO_ERROR;
-    len = unorm_normalize (normalized, len, UNORM_NFC, 0, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
+    len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
     if (U_FAILURE (icu_err))
       return false;
     /* We expect that recomposed has exactly one character now. */
     if (U_FAILURE (icu_err))
       return false;
     /* We expect that recomposed has exactly one character now. */
@@ -331,41 +331,64 @@ hb_icu_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs HB_UNUSED,
 
   /* Normalise the codepoint using NFKD mode. */
   icu_err = U_ZERO_ERROR;
 
   /* Normalise the codepoint using NFKD mode. */
   icu_err = U_ZERO_ERROR;
-  len = unorm_normalize (utf16, len, UNORM_NFKD, 0, normalized, ARRAY_LENGTH (normalized), &icu_err);
-  if (icu_err)
+  len = unorm2_normalize (unorm2_getNFKDInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
+  if (U_FAILURE (icu_err))
     return 0;
 
   /* Convert the decomposed form from UTF-16 to UTF-32. */
   icu_err = U_ZERO_ERROR;
   u_strToUTF32 ((UChar32*) decomposed, HB_UNICODE_MAX_DECOMPOSITION_LEN, &utf32_len, normalized, len, &icu_err);
     return 0;
 
   /* Convert the decomposed form from UTF-16 to UTF-32. */
   icu_err = U_ZERO_ERROR;
   u_strToUTF32 ((UChar32*) decomposed, HB_UNICODE_MAX_DECOMPOSITION_LEN, &utf32_len, normalized, len, &icu_err);
-  if (icu_err)
+  if (U_FAILURE (icu_err))
     return 0;
 
   return utf32_len;
 }
 
 
     return 0;
 
   return utf32_len;
 }
 
 
+static hb_unicode_funcs_t *static_icu_funcs = nullptr;
+
+#ifdef HB_USE_ATEXIT
+static
+void free_static_icu_funcs (void)
+{
+  hb_unicode_funcs_destroy (static_icu_funcs);
+}
+#endif
+
 hb_unicode_funcs_t *
 hb_icu_get_unicode_funcs (void)
 {
 hb_unicode_funcs_t *
 hb_icu_get_unicode_funcs (void)
 {
-  static const hb_unicode_funcs_t _hb_icu_unicode_funcs = {
-    HB_OBJECT_HEADER_STATIC,
+retry:
+  hb_unicode_funcs_t *funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_icu_funcs);
 
 
-    NULL, /* parent */
-    true, /* immutable */
-    {
-#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_icu_unicode_##name,
+  if (unlikely (!funcs))
+  {
+#if U_ICU_VERSION_MAJOR_NUM >= 49
+    if (!hb_atomic_ptr_get (&normalizer)) {
+      UErrorCode icu_err = U_ZERO_ERROR;
+      /* We ignore failure in getNFCInstace(). */
+      (void) hb_atomic_ptr_cmpexch (&normalizer, nullptr, unorm2_getNFCInstance (&icu_err));
+    }
+#endif
+
+    funcs = hb_unicode_funcs_create (nullptr);
+
+#define HB_UNICODE_FUNC_IMPLEMENT(name) \
+    hb_unicode_funcs_set_##name##_func (funcs, hb_icu_unicode_##name, nullptr, nullptr);
       HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_UNICODE_FUNC_IMPLEMENT
       HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_UNICODE_FUNC_IMPLEMENT
+
+    hb_unicode_funcs_make_immutable (funcs);
+
+    if (!hb_atomic_ptr_cmpexch (&static_icu_funcs, nullptr, funcs)) {
+      hb_unicode_funcs_destroy (funcs);
+      goto retry;
     }
     }
-  };
 
 
-#if U_ICU_VERSION_MAJOR_NUM >= 49
-  if (!hb_atomic_ptr_get (&normalizer)) {
-    UErrorCode icu_err = U_ZERO_ERROR;
-    /* We ignore failure in getNFCInstace(). */
-    (void) hb_atomic_ptr_cmpexch (&normalizer, NULL, unorm2_getNFCInstance (&icu_err));
-  }
+#ifdef HB_USE_ATEXIT
+    atexit (free_static_icu_funcs); /* First person registers atexit() callback. */
 #endif
 #endif
-  return const_cast<hb_unicode_funcs_t *> (&_hb_icu_unicode_funcs);
+  };
+
+  return hb_unicode_funcs_reference (funcs);
 }
 }
index ed27035..49ed10e 100644 (file)
@@ -68,7 +68,7 @@ typedef CRITICAL_SECTION hb_mutex_impl_t;
 #include <pthread.h>
 typedef pthread_mutex_t hb_mutex_impl_t;
 #define HB_MUTEX_IMPL_INIT     PTHREAD_MUTEX_INITIALIZER
 #include <pthread.h>
 typedef pthread_mutex_t hb_mutex_impl_t;
 #define HB_MUTEX_IMPL_INIT     PTHREAD_MUTEX_INITIALIZER
-#define hb_mutex_impl_init(M)  pthread_mutex_init (M, NULL)
+#define hb_mutex_impl_init(M)  pthread_mutex_init (M, nullptr)
 #define hb_mutex_impl_lock(M)  pthread_mutex_lock (M)
 #define hb_mutex_impl_unlock(M)        pthread_mutex_unlock (M)
 #define hb_mutex_impl_finish(M)        pthread_mutex_destroy (M)
 #define hb_mutex_impl_lock(M)  pthread_mutex_lock (M)
 #define hb_mutex_impl_unlock(M)        pthread_mutex_unlock (M)
 #define hb_mutex_impl_finish(M)        pthread_mutex_destroy (M)
index 6b73ff9..baa1f8f 100644 (file)
 #define HB_OBJECT_PRIVATE_HH
 
 #include "hb-private.hh"
 #define HB_OBJECT_PRIVATE_HH
 
 #include "hb-private.hh"
+#include "hb-debug.hh"
 
 #include "hb-atomic-private.hh"
 #include "hb-mutex-private.hh"
 
 
 
 #include "hb-atomic-private.hh"
 #include "hb-mutex-private.hh"
 
 
-/* Debug */
-
-#ifndef HB_DEBUG_OBJECT
-#define HB_DEBUG_OBJECT (HB_DEBUG+0)
-#endif
-
-
 /* reference_count */
 
 #define HB_REFERENCE_COUNT_INERT_VALUE -1
 /* reference_count */
 
 #define HB_REFERENCE_COUNT_INERT_VALUE -1
@@ -193,7 +187,7 @@ static inline void *hb_object_get_user_data (Type               *obj,
                                             hb_user_data_key_t *key)
 {
   if (unlikely (!obj || hb_object_is_inert (obj)))
                                             hb_user_data_key_t *key)
 {
   if (unlikely (!obj || hb_object_is_inert (obj)))
-    return NULL;
+    return nullptr;
   assert (hb_object_is_valid (obj));
   return obj->header.user_data.get (key);
 }
   assert (hb_object_is_valid (obj));
   return obj->header.user_data.get (key);
 }
index f208419..e2644ea 100644 (file)
@@ -30,6 +30,7 @@
 #define HB_OPEN_FILE_PRIVATE_HH
 
 #include "hb-open-type-private.hh"
 #define HB_OPEN_FILE_PRIVATE_HH
 
 #include "hb-open-type-private.hh"
+#include "hb-ot-head-table.hh"
 
 
 namespace OT {
 
 
 namespace OT {
@@ -53,6 +54,16 @@ struct TTCHeader;
 
 typedef struct TableRecord
 {
 
 typedef struct TableRecord
 {
+  int cmp (Tag t) const
+  { return -t.cmp (tag); }
+
+  static int cmp (const void *pa, const void *pb)
+  {
+    const TableRecord *a = (const TableRecord *) pa;
+    const TableRecord *b = (const TableRecord *) pb;
+    return b->cmp (a->tag);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -61,9 +72,9 @@ typedef struct TableRecord
 
   Tag          tag;            /* 4-byte identifier. */
   CheckSum     checkSum;       /* CheckSum for this table. */
 
   Tag          tag;            /* 4-byte identifier. */
   CheckSum     checkSum;       /* CheckSum for this table. */
-  ULONG                offset;         /* Offset from beginning of TrueType font
+  Offset32     offset;         /* Offset from beginning of TrueType font
                                 * file. */
                                 * file. */
-  ULONG                length;         /* Length of this table. */
+  HBUINT32     length;         /* Length of this table. */
   public:
   DEFINE_SIZE_STATIC (16);
 } OpenTypeTable;
   public:
   DEFINE_SIZE_STATIC (16);
 } OpenTypeTable;
@@ -73,27 +84,39 @@ typedef struct OffsetTable
   friend struct OpenTypeFontFile;
 
   inline unsigned int get_table_count (void) const
   friend struct OpenTypeFontFile;
 
   inline unsigned int get_table_count (void) const
-  { return numTables; }
+  { return tables.len; }
   inline const TableRecord& get_table (unsigned int i) const
   {
   inline const TableRecord& get_table (unsigned int i) const
   {
-    if (unlikely (i >= numTables)) return Null(TableRecord);
     return tables[i];
   }
     return tables[i];
   }
+  inline unsigned int get_table_tags (unsigned int  start_offset,
+                                     unsigned int *table_count, /* IN/OUT */
+                                     hb_tag_t     *table_tags /* OUT */) const
+  {
+    if (table_count)
+    {
+      if (start_offset >= tables.len)
+        *table_count = 0;
+      else
+        *table_count = MIN<unsigned int> (*table_count, tables.len - start_offset);
+
+      const TableRecord *sub_tables = tables.array + start_offset;
+      unsigned int count = *table_count;
+      for (unsigned int i = 0; i < count; i++)
+       table_tags[i] = sub_tables[i].tag;
+    }
+    return tables.len;
+  }
   inline bool find_table_index (hb_tag_t tag, unsigned int *table_index) const
   {
     Tag t;
     t.set (tag);
   inline bool find_table_index (hb_tag_t tag, unsigned int *table_index) const
   {
     Tag t;
     t.set (tag);
-    unsigned int count = numTables;
-    for (unsigned int i = 0; i < count; i++)
-    {
-      if (t == tables[i].tag)
-      {
-        if (table_index) *table_index = i;
-        return true;
-      }
-    }
-    if (table_index) *table_index = Index::NOT_FOUND_INDEX;
-    return false;
+    /* Linear-search for small tables to work around fonts with unsorted
+     * table list. */
+    int i = tables.len < 64 ? tables.lsearch (t) : tables.bsearch (t);
+    if (table_index)
+      *table_index = i == -1 ? Index::NOT_FOUND_INDEX : (unsigned int) i;
+    return i != -1;
   }
   inline const TableRecord& get_table_by_tag (hb_tag_t tag) const
   {
   }
   inline const TableRecord& get_table_by_tag (hb_tag_t tag) const
   {
@@ -103,19 +126,88 @@ typedef struct OffsetTable
   }
 
   public:
   }
 
   public:
+
+  inline bool serialize (hb_serialize_context_t *c,
+                        hb_tag_t sfnt_tag,
+                        Supplier<hb_tag_t> &tags,
+                        Supplier<hb_blob_t *> &blobs,
+                        unsigned int table_count)
+  {
+    TRACE_SERIALIZE (this);
+    /* Alloc 12 for the OTHeader. */
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    /* Write sfntVersion (bytes 0..3). */
+    sfnt_version.set (sfnt_tag);
+    /* Take space for numTables, searchRange, entrySelector, RangeShift
+     * and the TableRecords themselves.  */
+    if (unlikely (!tables.serialize (c, table_count))) return_trace (false);
+
+    const char *dir_end = (const char *) c->head;
+    HBUINT32 *checksum_adjustment = nullptr;
+
+    /* Write OffsetTables, alloc for and write actual table blobs. */
+    for (unsigned int i = 0; i < table_count; i++)
+    {
+      TableRecord &rec = tables.array[i];
+      hb_blob_t *blob = blobs[i];
+      rec.tag.set (tags[i]);
+      rec.length.set (hb_blob_get_length (blob));
+      rec.offset.serialize (c, this);
+
+      /* Allocate room for the table and copy it. */
+      char *start = (char *) c->allocate_size<void> (rec.length);
+      if (unlikely (!start)) {return false;}
+
+      memcpy (start, hb_blob_get_data (blob, nullptr), rec.length);
+
+      /* 4-byte allignment. */
+      if (rec.length % 4)
+       c->allocate_size<void> (4 - rec.length % 4);
+      const char *end = (const char *) c->head;
+
+      if (tags[i] == HB_OT_TAG_head && end - start >= head::static_size)
+      {
+       head *h = (head *) start;
+       checksum_adjustment = &h->checkSumAdjustment;
+       checksum_adjustment->set (0);
+      }
+
+      rec.checkSum.set_for_data (start, end - start);
+    }
+    tags += table_count;
+    blobs += table_count;
+
+    tables.qsort ();
+
+    if (checksum_adjustment)
+    {
+      CheckSum checksum;
+
+      /* The following line is a slower version of the following block. */
+      //checksum.set_for_data (this, (const char *) c->head - (const char *) this);
+      checksum.set_for_data (this, dir_end - (const char *) this);
+      for (unsigned int i = 0; i < table_count; i++)
+      {
+       TableRecord &rec = tables.array[i];
+       checksum.set (checksum + rec.checkSum);
+      }
+
+      checksum_adjustment->set (0xB1B0AFBAu - checksum);
+    }
+
+    return_trace (true);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && c->check_array (tables, TableRecord::static_size, numTables));
+    return_trace (c->check_struct (this) && tables.sanitize (c));
   }
 
   protected:
   Tag          sfnt_version;   /* '\0\001\0\00' if TrueType / 'OTTO' if CFF */
   }
 
   protected:
   Tag          sfnt_version;   /* '\0\001\0\00' if TrueType / 'OTTO' if CFF */
-  USHORT       numTables;      /* Number of tables. */
-  USHORT       searchRangeZ;   /* (Maximum power of 2 <= numTables) x 16 */
-  USHORT       entrySelectorZ; /* Log2(maximum power of 2 <= numTables). */
-  USHORT       rangeShiftZ;    /* NumTables x 16-searchRange. */
-  TableRecord  tables[VAR];    /* TableRecord entries. numTables items */
+  BinSearchArrayOf<TableRecord>
+               tables;
   public:
   DEFINE_SIZE_ARRAY (12, tables);
 } OpenTypeFontFace;
   public:
   DEFINE_SIZE_ARRAY (12, tables);
 } OpenTypeFontFace;
@@ -142,7 +234,7 @@ struct TTCHeaderVersion1
   Tag          ttcTag;         /* TrueType Collection ID string: 'ttcf' */
   FixedVersion<>version;       /* Version of the TTC Header (1.0),
                                 * 0x00010000u */
   Tag          ttcTag;         /* TrueType Collection ID string: 'ttcf' */
   FixedVersion<>version;       /* Version of the TTC Header (1.0),
                                 * 0x00010000u */
-  ArrayOf<LOffsetTo<OffsetTable>, ULONG>
+  ArrayOf<LOffsetTo<OffsetTable>, HBUINT32>
                table;          /* Array of offsets to the OffsetTable for each font
                                 * from the beginning of the file */
   public:
                table;          /* Array of offsets to the OffsetTable for each font
                                 * from the beginning of the file */
   public:
@@ -237,6 +329,18 @@ struct OpenTypeFontFile
     }
   }
 
     }
   }
 
+  inline bool serialize_single (hb_serialize_context_t *c,
+                               hb_tag_t sfnt_tag,
+                               Supplier<hb_tag_t> &tags,
+                               Supplier<hb_blob_t *> &blobs,
+                               unsigned int table_count)
+  {
+    TRACE_SERIALIZE (this);
+    assert (sfnt_tag != TTCTag);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    return_trace (u.fontFace.serialize (c, sfnt_tag, tags, blobs, table_count));
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
index d90d68c..5d33199 100644 (file)
@@ -30,6 +30,7 @@
 #define HB_OPEN_TYPE_PRIVATE_HH
 
 #include "hb-private.hh"
 #define HB_OPEN_TYPE_PRIVATE_HH
 
 #include "hb-private.hh"
+#include "hb-debug.hh"
 #include "hb-face-private.hh"
 
 
 #include "hb-face-private.hh"
 
 
@@ -85,7 +86,7 @@ static inline Type& StructAfter(TObject &X)
 #define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \
   inline void _instance_assertion_on_line_##_line (void) const \
   { \
 #define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \
   inline void _instance_assertion_on_line_##_line (void) const \
   { \
-    ASSERT_STATIC (_assertion); \
+    static_assert ((_assertion), ""); \
     ASSERT_INSTANCE_POD (*this); /* Make sure it's POD. */ \
   }
 # define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion)
     ASSERT_INSTANCE_POD (*this); /* Make sure it's POD. */ \
   }
 # define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion)
@@ -130,14 +131,26 @@ static inline Type& StructAfter(TObject &X)
  */
 
 /* Global nul-content Null pool.  Enlarge as necessary. */
  */
 
 /* Global nul-content Null pool.  Enlarge as necessary. */
-/* TODO This really should be a extern HB_INTERNAL and defined somewhere... */
-static const void *_NullPool[(256+8) / sizeof (void *)];
+
+#define HB_NULL_POOL_SIZE 264
+static_assert (HB_NULL_POOL_SIZE % sizeof (void *) == 0, "Align HB_NULL_POOL_SIZE.");
+
+#ifdef HB_NO_VISIBILITY
+static
+#else
+extern HB_INTERNAL
+#endif
+const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)]
+#ifdef HB_NO_VISIBILITY
+= {}
+#endif
+;
 
 /* Generic nul-content Null objects. */
 template <typename Type>
 static inline const Type& Null (void) {
 
 /* Generic nul-content Null objects. */
 template <typename Type>
 static inline const Type& Null (void) {
-  ASSERT_STATIC (sizeof (Type) <= sizeof (_NullPool));
-  return *CastP<Type> (_NullPool);
+  static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+  return *CastP<Type> (_hb_NullPool);
 }
 
 /* Specializaiton for arbitrary-content arbitrary-sized Null objects. */
 }
 
 /* Specializaiton for arbitrary-content arbitrary-sized Null objects. */
@@ -147,7 +160,7 @@ template <> \
 /*static*/ inline const Type& Null<Type> (void) { \
   return *CastP<Type> (_Null##Type); \
 } /* The following line really exists such that we end in a place needing semicolon */ \
 /*static*/ inline const Type& Null<Type> (void) { \
   return *CastP<Type> (_Null##Type); \
 } /* The following line really exists such that we end in a place needing semicolon */ \
-ASSERT_STATIC (Type::min_size + 1 <= sizeof (_Null##Type))
+static_assert (Type::min_size + 1 <= sizeof (_Null##Type), "Null pool too small.  Enlarge.")
 
 /* Accessor macro. */
 #define Null(Type) Null<Type>()
 
 /* Accessor macro. */
 #define Null(Type) Null<Type>()
@@ -172,29 +185,26 @@ struct hb_dispatch_context_t
  * Sanitize
  */
 
  * Sanitize
  */
 
-#ifndef HB_DEBUG_SANITIZE
-#define HB_DEBUG_SANITIZE (HB_DEBUG+0)
-#endif
-
-
-#define TRACE_SANITIZE(this) \
-       hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace \
-       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-        "");
-
 /* This limits sanitizing time on really broken fonts. */
 #ifndef HB_SANITIZE_MAX_EDITS
 #define HB_SANITIZE_MAX_EDITS 32
 #endif
 /* This limits sanitizing time on really broken fonts. */
 #ifndef HB_SANITIZE_MAX_EDITS
 #define HB_SANITIZE_MAX_EDITS 32
 #endif
+#ifndef HB_SANITIZE_MAX_OPS_FACTOR
+#define HB_SANITIZE_MAX_OPS_FACTOR 8
+#endif
+#ifndef HB_SANITIZE_MAX_OPS_MIN
+#define HB_SANITIZE_MAX_OPS_MIN 16384
+#endif
 
 struct hb_sanitize_context_t :
        hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE>
 {
   inline hb_sanitize_context_t (void) :
        debug_depth (0),
 
 struct hb_sanitize_context_t :
        hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE>
 {
   inline hb_sanitize_context_t (void) :
        debug_depth (0),
-       start (NULL), end (NULL),
-       writable (false), edit_count (0),
-       blob (NULL) {}
+       start (nullptr), end (nullptr),
+       writable (false), edit_count (0), max_ops (0),
+       blob (nullptr),
+       num_glyphs (0) {}
 
   inline const char *get_name (void) { return "SANITIZE"; }
   template <typename T, typename F>
 
   inline const char *get_name (void) { return "SANITIZE"; }
   template <typename T, typename F>
@@ -214,9 +224,11 @@ struct hb_sanitize_context_t :
 
   inline void start_processing (void)
   {
 
   inline void start_processing (void)
   {
-    this->start = hb_blob_get_data (this->blob, NULL);
+    this->start = hb_blob_get_data (this->blob, nullptr);
     this->end = this->start + hb_blob_get_length (this->blob);
     assert (this->start <= this->end); /* Must not overflow. */
     this->end = this->start + hb_blob_get_length (this->blob);
     assert (this->start <= this->end); /* Must not overflow. */
+    this->max_ops = MAX ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR,
+                        (unsigned) HB_SANITIZE_MAX_OPS_MIN);
     this->edit_count = 0;
     this->debug_depth = 0;
 
     this->edit_count = 0;
     this->debug_depth = 0;
 
@@ -233,14 +245,17 @@ struct hb_sanitize_context_t :
                     this->start, this->end, this->edit_count);
 
     hb_blob_destroy (this->blob);
                     this->start, this->end, this->edit_count);
 
     hb_blob_destroy (this->blob);
-    this->blob = NULL;
-    this->start = this->end = NULL;
+    this->blob = nullptr;
+    this->start = this->end = nullptr;
   }
 
   inline bool check_range (const void *base, unsigned int len) const
   {
     const char *p = (const char *) base;
   }
 
   inline bool check_range (const void *base, unsigned int len) const
   {
     const char *p = (const char *) base;
-    bool ok = this->start <= p && p <= this->end && (unsigned int) (this->end - p) >= len;
+    bool ok = this->max_ops-- > 0 &&
+             this->start <= p &&
+             p <= this->end &&
+             (unsigned int) (this->end - p) >= len;
 
     DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
        "check_range [%p..%p] (%d bytes) in [%p..%p] -> %s",
 
     DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
        "check_range [%p..%p] (%d bytes) in [%p..%p] -> %s",
@@ -304,7 +319,9 @@ struct hb_sanitize_context_t :
   const char *start, *end;
   bool writable;
   unsigned int edit_count;
   const char *start, *end;
   bool writable;
   unsigned int edit_count;
+  mutable int max_ops;
   hb_blob_t *blob;
   hb_blob_t *blob;
+  unsigned int num_glyphs;
 };
 
 
 };
 
 
@@ -313,8 +330,9 @@ struct hb_sanitize_context_t :
 template <typename Type>
 struct Sanitizer
 {
 template <typename Type>
 struct Sanitizer
 {
-  static hb_blob_t *sanitize (hb_blob_t *blob) {
-    hb_sanitize_context_t c[1];
+  inline Sanitizer (void) {}
+
+  inline hb_blob_t *sanitize (hb_blob_t *blob) {
     bool sane;
 
     /* TODO is_sane() stuff */
     bool sane;
 
     /* TODO is_sane() stuff */
@@ -349,7 +367,7 @@ struct Sanitizer
     } else {
       unsigned int edit_count = c->edit_count;
       if (edit_count && !c->writable) {
     } else {
       unsigned int edit_count = c->edit_count;
       if (edit_count && !c->writable) {
-        c->start = hb_blob_get_data_writable (blob, NULL);
+        c->start = hb_blob_get_data_writable (blob, nullptr);
        c->end = c->start + hb_blob_get_length (blob);
 
        if (c->start) {
        c->end = c->start + hb_blob_get_length (blob);
 
        if (c->start) {
@@ -374,9 +392,14 @@ struct Sanitizer
 
   static const Type* lock_instance (hb_blob_t *blob) {
     hb_blob_make_immutable (blob);
 
   static const Type* lock_instance (hb_blob_t *blob) {
     hb_blob_make_immutable (blob);
-    const char *base = hb_blob_get_data (blob, NULL);
+    const char *base = hb_blob_get_data (blob, nullptr);
     return unlikely (!base) ? &Null(Type) : CastP<Type> (base);
   }
     return unlikely (!base) ? &Null(Type) : CastP<Type> (base);
   }
+
+  inline void set_num_glyphs (unsigned int num_glyphs) { c->num_glyphs = num_glyphs; }
+
+  private:
+  hb_sanitize_context_t c[1];
 };
 
 
 };
 
 
@@ -385,16 +408,6 @@ struct Sanitizer
  * Serialize
  */
 
  * Serialize
  */
 
-#ifndef HB_DEBUG_SERIALIZE
-#define HB_DEBUG_SERIALIZE (HB_DEBUG+0)
-#endif
-
-
-#define TRACE_SERIALIZE(this) \
-       hb_auto_trace_t<HB_DEBUG_SERIALIZE, bool> trace \
-       (&c->debug_depth, "SERIALIZE", c, HB_FUNC, \
-        "");
-
 
 struct hb_serialize_context_t
 {
 
 struct hb_serialize_context_t
 {
@@ -445,7 +458,7 @@ struct hb_serialize_context_t
   {
     if (unlikely (this->ran_out_of_room || this->end - this->head < ptrdiff_t (size))) {
       this->ran_out_of_room = true;
   {
     if (unlikely (this->ran_out_of_room || this->end - this->head < ptrdiff_t (size))) {
       this->ran_out_of_room = true;
-      return NULL;
+      return nullptr;
     }
     memset (this->head, 0, size);
     char *ret = this->head;
     }
     memset (this->head, 0, size);
     char *ret = this->head;
@@ -471,7 +484,7 @@ struct hb_serialize_context_t
   {
     unsigned int size = obj.get_size ();
     Type *ret = this->allocate_size<Type> (size);
   {
     unsigned int size = obj.get_size ();
     Type *ret = this->allocate_size<Type> (size);
-    if (unlikely (!ret)) return NULL;
+    if (unlikely (!ret)) return nullptr;
     memcpy (ret, obj, size);
     return ret;
   }
     memcpy (ret, obj, size);
     return ret;
   }
@@ -481,7 +494,7 @@ struct hb_serialize_context_t
   {
     unsigned int size = obj.min_size;
     assert (this->start <= (char *) &obj && (char *) &obj <= this->head && (char *) &obj + size >= this->head);
   {
     unsigned int size = obj.min_size;
     assert (this->start <= (char *) &obj && (char *) &obj <= this->head && (char *) &obj + size >= this->head);
-    if (unlikely (!this->allocate_size<Type> (((char *) &obj) + size - this->head))) return NULL;
+    if (unlikely (!this->allocate_size<Type> (((char *) &obj) + size - this->head))) return nullptr;
     return reinterpret_cast<Type *> (&obj);
   }
 
     return reinterpret_cast<Type *> (&obj);
   }
 
@@ -490,7 +503,7 @@ struct hb_serialize_context_t
   {
     unsigned int size = obj.get_size ();
     assert (this->start < (char *) &obj && (char *) &obj <= this->head && (char *) &obj + size >= this->head);
   {
     unsigned int size = obj.get_size ();
     assert (this->start < (char *) &obj && (char *) &obj <= this->head && (char *) &obj + size >= this->head);
-    if (unlikely (!this->allocate_size<Type> (((char *) &obj) + size - this->head))) return NULL;
+    if (unlikely (!this->allocate_size<Type> (((char *) &obj) + size - this->head))) return nullptr;
     return reinterpret_cast<Type *> (&obj);
   }
 
     return reinterpret_cast<Type *> (&obj);
   }
 
@@ -508,23 +521,25 @@ struct hb_serialize_context_t
 template <typename Type>
 struct Supplier
 {
 template <typename Type>
 struct Supplier
 {
-  inline Supplier (const Type *array, unsigned int len_)
+  inline Supplier (const Type *array, unsigned int len_, unsigned int stride_=sizeof(Type))
   {
     head = array;
     len = len_;
   {
     head = array;
     len = len_;
+    stride = stride_;
   }
   inline const Type operator [] (unsigned int i) const
   {
     if (unlikely (i >= len)) return Type ();
   }
   inline const Type operator [] (unsigned int i) const
   {
     if (unlikely (i >= len)) return Type ();
-    return head[i];
+    return * (const Type *) (const void *) ((const char *) head + stride * i);
   }
 
   }
 
-  inline void advance (unsigned int count)
+  inline Supplier<Type> & operator += (unsigned int count)
   {
     if (unlikely (count > len))
       count = len;
     len -= count;
   {
     if (unlikely (count > len))
       count = len;
     len -= count;
-    head += count;
+    head = (const Type *) (const void *) ((const char *) head + stride * count);
+    return *this;
   }
 
   private:
   }
 
   private:
@@ -532,12 +547,11 @@ struct Supplier
   inline Supplier<Type>& operator= (const Supplier<Type> &); /* Disallow copy */
 
   unsigned int len;
   inline Supplier<Type>& operator= (const Supplier<Type> &); /* Disallow copy */
 
   unsigned int len;
+  unsigned int stride;
   const Type *head;
 };
 
 
   const Type *head;
 };
 
 
-
-
 /*
  *
  * The OpenType Font File: Data Types
 /*
  *
  * The OpenType Font File: Data Types
@@ -632,10 +646,11 @@ struct IntType
   inline bool operator == (const IntType<Type,Size> &o) const { return (Type) v == (Type) o.v; }
   inline bool operator != (const IntType<Type,Size> &o) const { return !(*this == o); }
   static inline int cmp (const IntType<Type,Size> *a, const IntType<Type,Size> *b) { return b->cmp (*a); }
   inline bool operator == (const IntType<Type,Size> &o) const { return (Type) v == (Type) o.v; }
   inline bool operator != (const IntType<Type,Size> &o) const { return !(*this == o); }
   static inline int cmp (const IntType<Type,Size> *a, const IntType<Type,Size> *b) { return b->cmp (*a); }
-  inline int cmp (Type a) const
+  template <typename Type2>
+  inline int cmp (Type2 a) const
   {
     Type b = v;
   {
     Type b = v;
-    if (sizeof (Type) < sizeof (int))
+    if (sizeof (Type) < sizeof (int) && sizeof (Type2) < sizeof (int))
       return (int) a - (int) b;
     else
       return a < b ? -1 : a == b ? 0 : +1;
       return (int) a - (int) b;
     else
       return a < b ? -1 : a == b ? 0 : +1;
@@ -651,23 +666,22 @@ struct IntType
   DEFINE_SIZE_STATIC (Size);
 };
 
   DEFINE_SIZE_STATIC (Size);
 };
 
-typedef        IntType<int8_t  , 1> CHAR;      /* 8-bit signed integer. */
-typedef        IntType<uint8_t , 1> BYTE;      /* 8-bit unsigned integer. */
-typedef        IntType<int8_t  , 1> INT8;      /* 8-bit signed integer. */
-typedef IntType<uint16_t, 2> USHORT;   /* 16-bit unsigned integer. */
-typedef IntType<int16_t,  2> SHORT;    /* 16-bit signed integer. */
-typedef IntType<uint32_t, 4> ULONG;    /* 32-bit unsigned integer. */
-typedef IntType<int32_t,  4> LONG;     /* 32-bit signed integer. */
+typedef IntType<uint8_t,  1> HBUINT8;  /* 8-bit unsigned integer. */
+typedef IntType<int8_t,   1> HBINT8;   /* 8-bit signed integer. */
+typedef IntType<uint16_t, 2> HBUINT16; /* 16-bit unsigned integer. */
+typedef IntType<int16_t,  2> HBINT16;  /* 16-bit signed integer. */
+typedef IntType<uint32_t, 4> HBUINT32; /* 32-bit unsigned integer. */
+typedef IntType<int32_t,  4> HBINT32;  /* 32-bit signed integer. */
 typedef IntType<uint32_t, 3> UINT24;   /* 24-bit unsigned integer. */
 
 typedef IntType<uint32_t, 3> UINT24;   /* 24-bit unsigned integer. */
 
-/* 16-bit signed integer (SHORT) that describes a quantity in FUnits. */
-typedef SHORT FWORD;
+/* 16-bit signed integer (HBINT16) that describes a quantity in FUnits. */
+typedef HBINT16 FWORD;
 
 
-/* 16-bit unsigned integer (USHORT) that describes a quantity in FUnits. */
-typedef USHORT UFWORD;
+/* 16-bit unsigned integer (HBUINT16) that describes a quantity in FUnits. */
+typedef HBUINT16 UFWORD;
 
 /* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */
 
 /* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */
-struct F2DOT14 : SHORT
+struct F2DOT14 : HBINT16
 {
   //inline float to_float (void) const { return ???; }
   //inline void set_float (float f) { v.set (f * ???); }
 {
   //inline float to_float (void) const { return ???; }
   //inline void set_float (float f) { v.set (f * ???); }
@@ -676,10 +690,10 @@ struct F2DOT14 : SHORT
 };
 
 /* 32-bit signed fixed-point number (16.16). */
 };
 
 /* 32-bit signed fixed-point number (16.16). */
-struct Fixed: LONG
+struct Fixed: HBINT32
 {
 {
-  //inline float to_float (void) const { return ???; }
-  //inline void set_float (float f) { v.set (f * ???); }
+  inline float to_float (void) const { return ((int32_t) v) / 65536.0; }
+  inline void set_float (float f) { v.set (round (f * 65536.0)); }
   public:
   DEFINE_SIZE_STATIC (4);
 };
   public:
   DEFINE_SIZE_STATIC (4);
 };
@@ -694,15 +708,15 @@ struct LONGDATETIME
     return_trace (likely (c->check_struct (this)));
   }
   protected:
     return_trace (likely (c->check_struct (this)));
   }
   protected:
-  LONG major;
-  ULONG minor;
+  HBINT32 major;
+  HBUINT32 minor;
   public:
   DEFINE_SIZE_STATIC (8);
 };
 
 /* Array of four uint8s (length = 32 bits) used to identify a script, language
  * system, feature, or baseline */
   public:
   DEFINE_SIZE_STATIC (8);
 };
 
 /* Array of four uint8s (length = 32 bits) used to identify a script, language
  * system, feature, or baseline */
-struct Tag : ULONG
+struct Tag : HBUINT32
 {
   /* What the char* converters return is NOT nul-terminated.  Print using "%.4s" */
   inline operator const char* (void) const { return reinterpret_cast<const char *> (&this->v); }
 {
   /* What the char* converters return is NOT nul-terminated.  Print using "%.4s" */
   inline operator const char* (void) const { return reinterpret_cast<const char *> (&this->v); }
@@ -713,35 +727,44 @@ struct Tag : ULONG
 DEFINE_NULL_DATA (Tag, "    ");
 
 /* Glyph index number, same as uint16 (length = 16 bits) */
 DEFINE_NULL_DATA (Tag, "    ");
 
 /* Glyph index number, same as uint16 (length = 16 bits) */
-struct GlyphID : USHORT {
-  static inline int cmp (const GlyphID *a, const GlyphID *b) { return b->USHORT::cmp (*a); }
-  inline int cmp (hb_codepoint_t a) const { return (int) a - (int) *this; }
-};
+typedef HBUINT16 GlyphID;
 
 /* Script/language-system/feature index */
 
 /* Script/language-system/feature index */
-struct Index : USHORT {
+struct Index : HBUINT16 {
   static const unsigned int NOT_FOUND_INDEX = 0xFFFFu;
 };
 DEFINE_NULL_DATA (Index, "\xff\xff");
 
 /* Offset, Null offset = 0 */
   static const unsigned int NOT_FOUND_INDEX = 0xFFFFu;
 };
 DEFINE_NULL_DATA (Index, "\xff\xff");
 
 /* Offset, Null offset = 0 */
-template <typename Type=USHORT>
+template <typename Type>
 struct Offset : Type
 {
   inline bool is_null (void) const { return 0 == *this; }
 struct Offset : Type
 {
   inline bool is_null (void) const { return 0 == *this; }
+
+  inline void *serialize (hb_serialize_context_t *c, const void *base)
+  {
+    void *t = c->start_embed<void> ();
+    this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */
+    return t;
+  }
+
   public:
   DEFINE_SIZE_STATIC (sizeof(Type));
 };
 
   public:
   DEFINE_SIZE_STATIC (sizeof(Type));
 };
 
+typedef Offset<HBUINT16> Offset16;
+typedef Offset<HBUINT32> Offset32;
+
 
 /* CheckSum */
 
 /* CheckSum */
-struct CheckSum : ULONG
+struct CheckSum : HBUINT32
 {
   /* This is reference implementation from the spec. */
 {
   /* This is reference implementation from the spec. */
-  static inline uint32_t CalcTableChecksum (const ULONG *Table, uint32_t Length)
+  static inline uint32_t CalcTableChecksum (const HBUINT32 *Table, uint32_t Length)
   {
     uint32_t Sum = 0L;
   {
     uint32_t Sum = 0L;
-    const ULONG *EndPtr = Table+((Length+3) & ~3) / ULONG::static_size;
+    assert (0 == (Length & 3));
+    const HBUINT32 *EndPtr = Table + Length / HBUINT32::static_size;
 
     while (Table < EndPtr)
       Sum += *Table++;
 
     while (Table < EndPtr)
       Sum += *Table++;
@@ -750,7 +773,7 @@ struct CheckSum : ULONG
 
   /* Note: data should be 4byte aligned and have 4byte padding at the end. */
   inline void set_for_data (const void *data, unsigned int length)
 
   /* Note: data should be 4byte aligned and have 4byte padding at the end. */
   inline void set_for_data (const void *data, unsigned int length)
-  { set (CalcTableChecksum ((const ULONG *) data, length)); }
+  { set (CalcTableChecksum ((const HBUINT32 *) data, length)); }
 
   public:
   DEFINE_SIZE_STATIC (4);
 
   public:
   DEFINE_SIZE_STATIC (4);
@@ -761,7 +784,7 @@ struct CheckSum : ULONG
  * Version Numbers
  */
 
  * Version Numbers
  */
 
-template <typename FixedType=USHORT>
+template <typename FixedType=HBUINT16>
 struct FixedVersion
 {
   inline uint32_t to_int (void) const { return (major << (sizeof(FixedType) * 8)) + minor; }
 struct FixedVersion
 {
   inline uint32_t to_int (void) const { return (major << (sizeof(FixedType) * 8)) + minor; }
@@ -785,7 +808,7 @@ struct FixedVersion
  * Use: (base+offset)
  */
 
  * Use: (base+offset)
  */
 
-template <typename Type, typename OffsetType=USHORT>
+template <typename Type, typename OffsetType=HBUINT16>
 struct OffsetTo : Offset<OffsetType>
 {
   inline const Type& operator () (const void *base) const
 struct OffsetTo : Offset<OffsetType>
 {
   inline const Type& operator () (const void *base) const
@@ -797,9 +820,7 @@ struct OffsetTo : Offset<OffsetType>
 
   inline Type& serialize (hb_serialize_context_t *c, const void *base)
   {
 
   inline Type& serialize (hb_serialize_context_t *c, const void *base)
   {
-    Type *t = c->start_embed<Type> ();
-    this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */
-    return *t;
+    return * (Type *) Offset<OffsetType>::serialize (c, base);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
   }
 
   inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
@@ -830,7 +851,7 @@ struct OffsetTo : Offset<OffsetType>
   }
   DEFINE_SIZE_STATIC (sizeof(OffsetType));
 };
   }
   DEFINE_SIZE_STATIC (sizeof(OffsetType));
 };
-template <typename Type> struct LOffsetTo : OffsetTo<Type, ULONG> {};
+template <typename Type> struct LOffsetTo : OffsetTo<Type, HBUINT32> {};
 template <typename Base, typename OffsetType, typename Type>
 static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType> &offset) { return offset (base); }
 template <typename Base, typename OffsetType, typename Type>
 template <typename Base, typename OffsetType, typename Type>
 static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType> &offset) { return offset (base); }
 template <typename Base, typename OffsetType, typename Type>
@@ -842,7 +863,7 @@ static inline Type& operator + (Base &base, OffsetTo<Type, OffsetType> &offset)
  */
 
 /* An array with a number of elements. */
  */
 
 /* An array with a number of elements. */
-template <typename Type, typename LenType=USHORT>
+template <typename Type, typename LenType=HBUINT16>
 struct ArrayOf
 {
   const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const
 struct ArrayOf
 {
   const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const
@@ -887,7 +908,7 @@ struct ArrayOf
     if (unlikely (!serialize (c, items_len))) return_trace (false);
     for (unsigned int i = 0; i < items_len; i++)
       array[i] = items[i];
     if (unlikely (!serialize (c, items_len))) return_trace (false);
     for (unsigned int i = 0; i < items_len; i++)
       array[i] = items[i];
-    items.advance (items_len);
+    items += items_len;
     return_trace (true);
   }
 
     return_trace (true);
   }
 
@@ -939,11 +960,16 @@ struct ArrayOf
     return -1;
   }
 
     return -1;
   }
 
+  inline void qsort (void)
+  {
+    ::qsort (array, len, sizeof (Type), Type::cmp);
+  }
+
   private:
   inline bool sanitize_shallow (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   private:
   inline bool sanitize_shallow (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && c->check_array (array, Type::static_size, len));
+    return_trace (len.sanitize (c) && c->check_array (array, Type::static_size, len));
   }
 
   public:
   }
 
   public:
@@ -952,10 +978,10 @@ struct ArrayOf
   public:
   DEFINE_SIZE_ARRAY (sizeof (LenType), array);
 };
   public:
   DEFINE_SIZE_ARRAY (sizeof (LenType), array);
 };
-template <typename Type> struct LArrayOf : ArrayOf<Type, ULONG> {};
+template <typename Type> struct LArrayOf : ArrayOf<Type, HBUINT32> {};
 
 /* Array of Offset's */
 
 /* Array of Offset's */
-template <typename Type, typename OffsetType=USHORT>
+template <typename Type, typename OffsetType=HBUINT16>
 struct OffsetArrayOf : ArrayOf<OffsetTo<Type, OffsetType> > {};
 
 /* Array of offsets relative to the beginning of the array itself. */
 struct OffsetArrayOf : ArrayOf<OffsetTo<Type, OffsetType> > {};
 
 /* Array of offsets relative to the beginning of the array itself. */
@@ -983,7 +1009,7 @@ struct OffsetListOf : OffsetArrayOf<Type>
 
 
 /* An array starting at second element. */
 
 
 /* An array starting at second element. */
-template <typename Type, typename LenType=USHORT>
+template <typename Type, typename LenType=HBUINT16>
 struct HeadlessArrayOf
 {
   inline const Type& operator [] (unsigned int i) const
 struct HeadlessArrayOf
 {
   inline const Type& operator [] (unsigned int i) const
@@ -1005,16 +1031,10 @@ struct HeadlessArrayOf
     if (unlikely (!c->extend (*this))) return_trace (false);
     for (unsigned int i = 0; i < items_len - 1; i++)
       array[i] = items[i];
     if (unlikely (!c->extend (*this))) return_trace (false);
     for (unsigned int i = 0; i < items_len - 1; i++)
       array[i] = items[i];
-    items.advance (items_len - 1);
+    items += items_len - 1;
     return_trace (true);
   }
 
     return_trace (true);
   }
 
-  inline bool sanitize_shallow (hb_sanitize_context_t *c) const
-  {
-    return c->check_struct (this)
-       && c->check_array (this, Type::static_size, len);
-  }
-
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -1032,6 +1052,15 @@ struct HeadlessArrayOf
     return_trace (true);
   }
 
     return_trace (true);
   }
 
+  private:
+  inline bool sanitize_shallow (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (len.sanitize (c) &&
+                 (!len || c->check_array (array, Type::static_size, len - 1)));
+  }
+
+  public:
   LenType len;
   Type array[VAR];
   public:
   LenType len;
   Type array[VAR];
   public:
@@ -1039,19 +1068,22 @@ struct HeadlessArrayOf
 };
 
 
 };
 
 
-/* An array with sorted elements.  Supports binary searching. */
-template <typename Type, typename LenType=USHORT>
+/*
+ * An array with sorted elements.  Supports binary searching.
+ */
+template <typename Type, typename LenType=HBUINT16>
 struct SortedArrayOf : ArrayOf<Type, LenType>
 {
   template <typename SearchType>
   inline int bsearch (const SearchType &x) const
   {
     /* Hand-coded bsearch here since this is in the hot inner loop. */
 struct SortedArrayOf : ArrayOf<Type, LenType>
 {
   template <typename SearchType>
   inline int bsearch (const SearchType &x) const
   {
     /* Hand-coded bsearch here since this is in the hot inner loop. */
+    const Type *arr = this->array;
     int min = 0, max = (int) this->len - 1;
     while (min <= max)
     {
       int mid = (min + max) / 2;
     int min = 0, max = (int) this->len - 1;
     while (min <= max)
     {
       int mid = (min + max) / 2;
-      int c = this->array[mid].cmp (x);
+      int c = arr[mid].cmp (x);
       if (c < 0)
         max = mid - 1;
       else if (c > 0)
       if (c < 0)
         max = mid - 1;
       else if (c > 0)
@@ -1063,6 +1095,44 @@ struct SortedArrayOf : ArrayOf<Type, LenType>
   }
 };
 
   }
 };
 
+/*
+ * Binary-search arrays
+ */
+
+struct BinSearchHeader
+{
+  inline operator uint32_t (void) const { return len; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  inline void set (unsigned int v)
+  {
+    len.set (v);
+    assert (len == v);
+    entrySelectorZ.set (MAX (1u, _hb_bit_storage (v)) - 1);
+    searchRangeZ.set (16 * (1u << entrySelectorZ));
+    rangeShiftZ.set (v * 16 > searchRangeZ
+                     ? 16 * v - searchRangeZ
+                     : 0);
+  }
+
+  protected:
+  HBUINT16     len;
+  HBUINT16     searchRangeZ;
+  HBUINT16     entrySelectorZ;
+  HBUINT16     rangeShiftZ;
+
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+template <typename Type>
+struct BinSearchArrayOf : SortedArrayOf<Type, BinSearchHeader> {};
+
 
 /* Lazy struct and blob loaders. */
 
 
 /* Lazy struct and blob loaders. */
 
@@ -1073,7 +1143,7 @@ struct hb_lazy_loader_t
   inline void init (hb_face_t *face_)
   {
     face = face_;
   inline void init (hb_face_t *face_)
   {
     face = face_;
-    instance = NULL;
+    instance = nullptr;
   }
 
   inline void fini (void)
   }
 
   inline void fini (void)
@@ -1096,7 +1166,7 @@ struct hb_lazy_loader_t
         p = const_cast<T *> (&OT::Null(T));
       else
        p->init (face);
         p = const_cast<T *> (&OT::Null(T));
       else
        p->init (face);
-      if (unlikely (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), NULL, p)))
+      if (unlikely (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), nullptr, p)))
       {
        if (p != &OT::Null(T))
          p->fini ();
       {
        if (p != &OT::Null(T))
          p->fini ();
@@ -1123,8 +1193,8 @@ struct hb_lazy_table_loader_t
   inline void init (hb_face_t *face_)
   {
     face = face_;
   inline void init (hb_face_t *face_)
   {
     face = face_;
-    instance = NULL;
-    blob = NULL;
+    blob = nullptr;
+    instance = nullptr;
   }
 
   inline void fini (void)
   }
 
   inline void fini (void)
@@ -1138,9 +1208,9 @@ struct hb_lazy_table_loader_t
     T *p = (T *) hb_atomic_ptr_get (&instance);
     if (unlikely (!p))
     {
     T *p = (T *) hb_atomic_ptr_get (&instance);
     if (unlikely (!p))
     {
-      hb_blob_t *blob_ = OT::Sanitizer<T>::sanitize (face->reference_table (T::tableTag));
+      hb_blob_t *blob_ = OT::Sanitizer<T>().sanitize (face->reference_table (T::tableTag));
       p = const_cast<T *>(OT::Sanitizer<T>::lock_instance (blob_));
       p = const_cast<T *>(OT::Sanitizer<T>::lock_instance (blob_));
-      if (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), NULL, p))
+      if (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), nullptr, p))
       {
        hb_blob_destroy (blob_);
        goto retry;
       {
        hb_blob_destroy (blob_);
        goto retry;
@@ -1155,10 +1225,10 @@ struct hb_lazy_table_loader_t
     return get();
   }
 
     return get();
   }
 
-  private:
   hb_face_t *face;
   hb_face_t *face;
-  T *instance;
   mutable hb_blob_t *blob;
   mutable hb_blob_t *blob;
+  private:
+  mutable T *instance;
 };
 
 
 };
 
 
index 3a53a1c..0207989 100644 (file)
@@ -28,7 +28,7 @@
 #define HB_OT_CMAP_TABLE_HH
 
 #include "hb-open-type-private.hh"
 #define HB_OT_CMAP_TABLE_HH
 
 #include "hb-open-type-private.hh"
-
+#include "hb-subset-plan.hh"
 
 namespace OT {
 
 
 namespace OT {
 
@@ -58,10 +58,10 @@ struct CmapSubtableFormat0
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;         /* Format number is set to 0. */
-  USHORT       lengthZ;        /* Byte length of this subtable. */
-  USHORT       languageZ;      /* Ignore. */
-  BYTE         glyphIdArray[256];/* An array that maps character
+  HBUINT16     format;         /* Format number is set to 0. */
+  HBUINT16     lengthZ;        /* Byte length of this subtable. */
+  HBUINT16     languageZ;      /* Ignore. */
+  HBUINT8      glyphIdArray[256];/* An array that maps character
                                 * code to glyph index values. */
   public:
   DEFINE_SIZE_STATIC (6 + 256);
                                 * code to glyph index values. */
   public:
   DEFINE_SIZE_STATIC (6 + 256);
@@ -88,8 +88,8 @@ struct CmapSubtableFormat4
 
       /* Custom two-array bsearch. */
       int min = 0, max = (int) thiz->segCount - 1;
 
       /* Custom two-array bsearch. */
       int min = 0, max = (int) thiz->segCount - 1;
-      const USHORT *startCount = thiz->startCount;
-      const USHORT *endCount = thiz->endCount;
+      const HBUINT16 *startCount = thiz->startCount;
+      const HBUINT16 *endCount = thiz->endCount;
       unsigned int i;
       while (min <= max)
       {
       unsigned int i;
       while (min <= max)
       {
@@ -127,11 +127,11 @@ struct CmapSubtableFormat4
       return true;
     }
 
       return true;
     }
 
-    const USHORT *endCount;
-    const USHORT *startCount;
-    const USHORT *idDelta;
-    const USHORT *idRangeOffset;
-    const USHORT *glyphIdArray;
+    const HBUINT16 *endCount;
+    const HBUINT16 *startCount;
+    const HBUINT16 *idDelta;
+    const HBUINT16 *idRangeOffset;
+    const HBUINT16 *glyphIdArray;
     unsigned int segCount;
     unsigned int glyphIdArrayLength;
   };
     unsigned int segCount;
     unsigned int glyphIdArrayLength;
   };
@@ -165,24 +165,24 @@ struct CmapSubtableFormat4
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;         /* Format number is set to 4. */
-  USHORT       length;         /* This is the length in bytes of the
+  HBUINT16     format;         /* Format number is set to 4. */
+  HBUINT16     length;         /* This is the length in bytes of the
                                 * subtable. */
                                 * subtable. */
-  USHORT       languageZ;      /* Ignore. */
-  USHORT       segCountX2;     /* 2 x segCount. */
-  USHORT       searchRangeZ;   /* 2 * (2**floor(log2(segCount))) */
-  USHORT       entrySelectorZ; /* log2(searchRange/2) */
-  USHORT       rangeShiftZ;    /* 2 x segCount - searchRange */
+  HBUINT16     languageZ;      /* Ignore. */
+  HBUINT16     segCountX2;     /* 2 x segCount. */
+  HBUINT16     searchRangeZ;   /* 2 * (2**floor(log2(segCount))) */
+  HBUINT16     entrySelectorZ; /* log2(searchRange/2) */
+  HBUINT16     rangeShiftZ;    /* 2 x segCount - searchRange */
 
 
-  USHORT       values[VAR];
+  HBUINT16     values[VAR];
 #if 0
 #if 0
-  USHORT       endCount[segCount];     /* End characterCode for each segment,
+  HBUINT16     endCount[segCount];     /* End characterCode for each segment,
                                         * last=0xFFFFu. */
                                         * last=0xFFFFu. */
-  USHORT       reservedPad;            /* Set to 0. */
-  USHORT       startCount[segCount];   /* Start character code for each segment. */
-  SHORT                idDelta[segCount];      /* Delta for all character codes in segment. */
-  USHORT       idRangeOffset[segCount];/* Offsets into glyphIdArray or 0 */
-  USHORT       glyphIdArray[VAR];      /* Glyph index array (arbitrary length) */
+  HBUINT16     reservedPad;            /* Set to 0. */
+  HBUINT16     startCount[segCount];   /* Start character code for each segment. */
+  HBINT16              idDelta[segCount];      /* Delta for all character codes in segment. */
+  HBUINT16     idRangeOffset[segCount];/* Offsets into glyphIdArray or 0 */
+  HBUINT16     glyphIdArray[VAR];      /* Glyph index array (arbitrary length) */
 #endif
 
   public:
 #endif
 
   public:
@@ -193,6 +193,7 @@ struct CmapSubtableLongGroup
 {
   friend struct CmapSubtableFormat12;
   friend struct CmapSubtableFormat13;
 {
   friend struct CmapSubtableFormat12;
   friend struct CmapSubtableFormat13;
+  friend struct cmap;
 
   int cmp (hb_codepoint_t codepoint) const
   {
 
   int cmp (hb_codepoint_t codepoint) const
   {
@@ -208,9 +209,9 @@ struct CmapSubtableLongGroup
   }
 
   private:
   }
 
   private:
-  ULONG                startCharCode;  /* First character code in this group. */
-  ULONG                endCharCode;    /* Last character code in this group. */
-  ULONG                glyphID;        /* Glyph index; interpretation depends on
+  HBUINT32             startCharCode;  /* First character code in this group. */
+  HBUINT32             endCharCode;    /* Last character code in this group. */
+  HBUINT32             glyphID;        /* Glyph index; interpretation depends on
                                 * subtable format. */
   public:
   DEFINE_SIZE_STATIC (12);
                                 * subtable format. */
   public:
   DEFINE_SIZE_STATIC (12);
@@ -247,12 +248,14 @@ struct CmapSubtableTrimmed
   DEFINE_SIZE_ARRAY (5 * sizeof (UINT), glyphIdArray);
 };
 
   DEFINE_SIZE_ARRAY (5 * sizeof (UINT), glyphIdArray);
 };
 
-struct CmapSubtableFormat6  : CmapSubtableTrimmed<USHORT> {};
-struct CmapSubtableFormat10 : CmapSubtableTrimmed<ULONG > {};
+struct CmapSubtableFormat6  : CmapSubtableTrimmed<HBUINT16> {};
+struct CmapSubtableFormat10 : CmapSubtableTrimmed<HBUINT32 > {};
 
 template <typename T>
 struct CmapSubtableLongSegmented
 {
 
 template <typename T>
 struct CmapSubtableLongSegmented
 {
+  friend struct cmap;
+
   inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
   {
     int i = groups.bsearch (codepoint);
   inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
   {
     int i = groups.bsearch (codepoint);
@@ -268,12 +271,22 @@ struct CmapSubtableLongSegmented
     return_trace (c->check_struct (this) && groups.sanitize (c));
   }
 
     return_trace (c->check_struct (this) && groups.sanitize (c));
   }
 
+  inline bool serialize (hb_serialize_context_t *c,
+                         hb_prealloced_array_t<CmapSubtableLongGroup> &group_data)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    Supplier<CmapSubtableLongGroup> supplier (group_data.array, group_data.len);
+    if (unlikely (!groups.serialize (c, supplier, group_data.len))) return_trace (false);
+    return true;
+  }
+
   protected:
   protected:
-  USHORT       format;         /* Subtable format; set to 12. */
-  USHORT       reservedZ;      /* Reserved; set to 0. */
-  ULONG                lengthZ;        /* Byte length of this subtable. */
-  ULONG                languageZ;      /* Ignore. */
-  SortedArrayOf<CmapSubtableLongGroup, ULONG>
+  HBUINT16     format;         /* Subtable format; set to 12. */
+  HBUINT16     reservedZ;      /* Reserved; set to 0. */
+  HBUINT32             lengthZ;        /* Byte length of this subtable. */
+  HBUINT32             languageZ;      /* Ignore. */
+  SortedArrayOf<CmapSubtableLongGroup, HBUINT32>
                groups;         /* Groupings. */
   public:
   DEFINE_SIZE_ARRAY (16, groups);
                groups;         /* Groupings. */
   public:
   DEFINE_SIZE_ARRAY (16, groups);
@@ -316,13 +329,13 @@ struct UnicodeValueRange
   }
 
   UINT24       startUnicodeValue;      /* First value in this range. */
   }
 
   UINT24       startUnicodeValue;      /* First value in this range. */
-  BYTE         additionalCount;        /* Number of additional values in this
+  HBUINT8              additionalCount;        /* Number of additional values in this
                                         * range. */
   public:
   DEFINE_SIZE_STATIC (4);
 };
 
                                         * range. */
   public:
   DEFINE_SIZE_STATIC (4);
 };
 
-typedef SortedArrayOf<UnicodeValueRange, ULONG> DefaultUVS;
+typedef SortedArrayOf<UnicodeValueRange, HBUINT32> DefaultUVS;
 
 struct UVSMapping
 {
 
 struct UVSMapping
 {
@@ -343,7 +356,7 @@ struct UVSMapping
   DEFINE_SIZE_STATIC (5);
 };
 
   DEFINE_SIZE_STATIC (5);
 };
 
-typedef SortedArrayOf<UVSMapping, ULONG> NonDefaultUVS;
+typedef SortedArrayOf<UVSMapping, HBUINT32> NonDefaultUVS;
 
 struct VariationSelectorRecord
 {
 
 struct VariationSelectorRecord
 {
@@ -405,9 +418,9 @@ struct CmapSubtableFormat14
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;         /* Format number is set to 14. */
-  ULONG                lengthZ;        /* Byte length of this subtable. */
-  SortedArrayOf<VariationSelectorRecord, ULONG>
+  HBUINT16     format;         /* Format number is set to 14. */
+  HBUINT32             lengthZ;        /* Byte length of this subtable. */
+  SortedArrayOf<VariationSelectorRecord, HBUINT32>
                record;         /* Variation selector records; sorted
                                 * in increasing order of `varSelector'. */
   public:
                record;         /* Variation selector records; sorted
                                 * in increasing order of `varSelector'. */
   public:
@@ -422,12 +435,12 @@ struct CmapSubtable
                         hb_codepoint_t *glyph) const
   {
     switch (u.format) {
                         hb_codepoint_t *glyph) const
   {
     switch (u.format) {
-    case  0: return u.format0 .get_glyph(codepoint, glyph);
-    case  4: return u.format4 .get_glyph(codepoint, glyph);
-    case  6: return u.format6 .get_glyph(codepoint, glyph);
-    case 10: return u.format10.get_glyph(codepoint, glyph);
-    case 12: return u.format12.get_glyph(codepoint, glyph);
-    case 13: return u.format13.get_glyph(codepoint, glyph);
+    case  0: return u.format0 .get_glyph (codepoint, glyph);
+    case  4: return u.format4 .get_glyph (codepoint, glyph);
+    case  6: return u.format6 .get_glyph (codepoint, glyph);
+    case 10: return u.format10.get_glyph (codepoint, glyph);
+    case 12: return u.format12.get_glyph (codepoint, glyph);
+    case 13: return u.format13.get_glyph (codepoint, glyph);
     case 14:
     default: return false;
     }
     case 14:
     default: return false;
     }
@@ -451,7 +464,7 @@ struct CmapSubtable
 
   public:
   union {
 
   public:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   CmapSubtableFormat0  format0;
   CmapSubtableFormat4  format4;
   CmapSubtableFormat6  format6;
   CmapSubtableFormat0  format0;
   CmapSubtableFormat4  format4;
   CmapSubtableFormat6  format6;
@@ -484,8 +497,8 @@ struct EncodingRecord
                  subtable.sanitize (c, base));
   }
 
                  subtable.sanitize (c, base));
   }
 
-  USHORT       platformID;     /* Platform ID. */
-  USHORT       encodingID;     /* Platform-specific encoding ID. */
+  HBUINT16     platformID;     /* Platform ID. */
+  HBUINT16     encodingID;     /* Platform-specific encoding ID. */
   LOffsetTo<CmapSubtable>
                subtable;       /* Byte offset from beginning of table to the subtable for this encoding. */
   public:
   LOffsetTo<CmapSubtable>
                subtable;       /* Byte offset from beginning of table to the subtable for this encoding. */
   public:
@@ -496,6 +509,254 @@ struct cmap
 {
   static const hb_tag_t tableTag       = HB_OT_TAG_cmap;
 
 {
   static const hb_tag_t tableTag       = HB_OT_TAG_cmap;
 
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                 likely (version == 0) &&
+                 encodingRecord.sanitize (c, this));
+  }
+
+  inline bool populate_groups (hb_subset_plan_t *plan,
+                              hb_prealloced_array_t<CmapSubtableLongGroup> *groups) const
+  {
+    CmapSubtableLongGroup *group = nullptr;
+    for (unsigned int i = 0; i < plan->codepoints.len; i++) {
+
+      hb_codepoint_t cp = plan->codepoints[i];
+      if (!group || cp - 1 != group->endCharCode)
+      {
+        group = groups->push ();
+        group->startCharCode.set (cp);
+        group->endCharCode.set (cp);
+        hb_codepoint_t new_gid;
+        if (unlikely (!hb_subset_plan_new_gid_for_codepoint (plan, cp, &new_gid)))
+        {
+          DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp);
+          return false;
+        }
+        group->glyphID.set (new_gid);
+      } else
+      {
+        group->endCharCode.set (cp);
+      }
+    }
+
+    DEBUG_MSG(SUBSET, nullptr, "cmap");
+    for (unsigned int i = 0; i < groups->len; i++) {
+      CmapSubtableLongGroup& group = (*groups)[i];
+      DEBUG_MSG(SUBSET, nullptr, "  %d: U+%04X-U+%04X, gid %d-%d", i, (uint32_t) group.startCharCode, (uint32_t) group.endCharCode, (uint32_t) group.glyphID, (uint32_t) group.glyphID + ((uint32_t) group.endCharCode - (uint32_t) group.startCharCode));
+    }
+
+    return true;
+  }
+
+  inline bool _subset (hb_prealloced_array_t<CmapSubtableLongGroup> &groups,
+                      size_t dest_sz,
+                      void *dest) const
+  {
+    hb_serialize_context_t c (dest, dest_sz);
+
+    OT::cmap *cmap = c.start_serialize<OT::cmap> ();
+    if (unlikely (!c.extend_min (*cmap)))
+    {
+      return false;
+    }
+
+    cmap->version.set (0);
+
+    if (unlikely (!cmap->encodingRecord.serialize (&c, /* numTables */ 1))) return false;
+
+    EncodingRecord &rec = cmap->encodingRecord[0];
+    rec.platformID.set (3); // Windows
+    rec.encodingID.set (10); // Unicode UCS-4
+
+    /* capture offset to subtable */
+    CmapSubtable &subtable = rec.subtable.serialize (&c, cmap);
+
+    subtable.u.format.set (12);
+
+    CmapSubtableFormat12 &format12 = subtable.u.format12;
+    if (unlikely (!c.extend_min (format12))) return false;
+
+    format12.format.set (12);
+    format12.reservedZ.set (0);
+    format12.lengthZ.set (16 + 12 * groups.len);
+
+    if (unlikely (!format12.serialize (&c, groups))) return false;
+
+    c.end_serialize ();
+
+    return true;
+  }
+
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_auto_array_t<CmapSubtableLongGroup> groups;
+
+    if (unlikely (!populate_groups (plan, &groups))) return false;
+
+    // We now know how big our blob needs to be
+    // TODO use APIs from the structs to get size?
+    size_t dest_sz = 4 // header
+                   + 8 // 1 EncodingRecord
+                   + 16 // Format 12 header
+                   + 12 * groups.len; // SequentialMapGroup records
+    void *dest = malloc (dest_sz);
+    if (unlikely (!dest)) {
+      DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for cmap subset output", (unsigned long) dest_sz);
+      return false;
+    }
+
+    if (unlikely (!_subset (groups, dest_sz, dest)))
+    {
+      free (dest);
+      return false;
+    }
+
+    // all done, write the blob into dest
+    hb_blob_t *cmap_prime = hb_blob_create ((const char *)dest,
+                                            dest_sz,
+                                            HB_MEMORY_MODE_READONLY,
+                                            dest,
+                                            free);
+    bool result =  hb_subset_plan_add_table (plan, HB_OT_TAG_cmap, cmap_prime);
+    hb_blob_destroy (cmap_prime);
+    return result;
+  }
+
+  struct accelerator_t
+  {
+    inline void init (hb_face_t *face)
+    {
+      this->blob = OT::Sanitizer<OT::cmap>().sanitize (face->reference_table (HB_OT_TAG_cmap));
+      const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (this->blob);
+      const OT::CmapSubtable *subtable = nullptr;
+      const OT::CmapSubtableFormat14 *subtable_uvs = nullptr;
+
+      bool symbol = false;
+      /* 32-bit subtables. */
+      if (!subtable) subtable = cmap->find_subtable (3, 10);
+      if (!subtable) subtable = cmap->find_subtable (0, 6);
+      if (!subtable) subtable = cmap->find_subtable (0, 4);
+      /* 16-bit subtables. */
+      if (!subtable) subtable = cmap->find_subtable (3, 1);
+      if (!subtable) subtable = cmap->find_subtable (0, 3);
+      if (!subtable) subtable = cmap->find_subtable (0, 2);
+      if (!subtable) subtable = cmap->find_subtable (0, 1);
+      if (!subtable) subtable = cmap->find_subtable (0, 0);
+      if (!subtable)
+      {
+       subtable = cmap->find_subtable (3, 0);
+       if (subtable) symbol = true;
+      }
+      /* Meh. */
+      if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
+
+      /* UVS subtable. */
+      if (!subtable_uvs)
+      {
+       const OT::CmapSubtable *st = cmap->find_subtable (0, 5);
+       if (st && st->u.format == 14)
+         subtable_uvs = &st->u.format14;
+      }
+      /* Meh. */
+      if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtableFormat14);
+
+      this->uvs_table = subtable_uvs;
+
+      this->get_glyph_data = subtable;
+      if (unlikely (symbol))
+       this->get_glyph_func = get_glyph_from_symbol<OT::CmapSubtable>;
+      else
+       switch (subtable->u.format) {
+       /* Accelerate format 4 and format 12. */
+       default: this->get_glyph_func = get_glyph_from<OT::CmapSubtable>;               break;
+       case 12: this->get_glyph_func = get_glyph_from<OT::CmapSubtableFormat12>;       break;
+       case  4:
+         {
+           this->format4_accel.init (&subtable->u.format4);
+           this->get_glyph_data = &this->format4_accel;
+           this->get_glyph_func = this->format4_accel.get_glyph_func;
+         }
+         break;
+       }
+    }
+
+    inline void fini (void)
+    {
+      hb_blob_destroy (this->blob);
+    }
+
+    inline bool get_nominal_glyph (hb_codepoint_t  unicode,
+                                  hb_codepoint_t *glyph) const
+    {
+      return this->get_glyph_func (this->get_glyph_data, unicode, glyph);
+    }
+
+    inline bool get_variation_glyph (hb_codepoint_t  unicode,
+                                    hb_codepoint_t  variation_selector,
+                                    hb_codepoint_t *glyph) const
+    {
+      switch (this->uvs_table->get_glyph_variant (unicode,
+                                                 variation_selector,
+                                                 glyph))
+      {
+       case OT::GLYPH_VARIANT_NOT_FOUND:               return false;
+       case OT::GLYPH_VARIANT_FOUND:           return true;
+       case OT::GLYPH_VARIANT_USE_DEFAULT:     break;
+      }
+
+      return get_nominal_glyph (unicode, glyph);
+    }
+
+    protected:
+    typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
+                                             hb_codepoint_t codepoint,
+                                             hb_codepoint_t *glyph);
+
+    template <typename Type>
+    static inline bool get_glyph_from (const void *obj,
+                                      hb_codepoint_t codepoint,
+                                      hb_codepoint_t *glyph)
+    {
+      const Type *typed_obj = (const Type *) obj;
+      return typed_obj->get_glyph (codepoint, glyph);
+    }
+
+    template <typename Type>
+    static inline bool get_glyph_from_symbol (const void *obj,
+                                             hb_codepoint_t codepoint,
+                                             hb_codepoint_t *glyph)
+    {
+      const Type *typed_obj = (const Type *) obj;
+      if (likely (typed_obj->get_glyph (codepoint, glyph)))
+       return true;
+
+      if (codepoint <= 0x00FFu)
+      {
+       /* For symbol-encoded OpenType fonts, we duplicate the
+        * U+F000..F0FF range at U+0000..U+00FF.  That's what
+        * Windows seems to do, and that's hinted about at:
+        * http://www.microsoft.com/typography/otspec/recom.htm
+        * under "Non-Standard (Symbol) Fonts". */
+       return typed_obj->get_glyph (0xF000u + codepoint, glyph);
+      }
+
+      return false;
+    }
+
+    private:
+    hb_cmap_get_glyph_func_t get_glyph_func;
+    const void *get_glyph_data;
+    OT::CmapSubtableFormat4::accelerator_t format4_accel;
+
+    const OT::CmapSubtableFormat14 *uvs_table;
+    hb_blob_t *blob;
+  };
+
+  protected:
+
   inline const CmapSubtable *find_subtable (unsigned int platform_id,
                                            unsigned int encoding_id) const
   {
   inline const CmapSubtable *find_subtable (unsigned int platform_id,
                                            unsigned int encoding_id) const
   {
@@ -508,20 +769,13 @@ struct cmap
      * unsorted subtable list. */
     int result = encodingRecord./*bsearch*/lsearch (key);
     if (result == -1 || !encodingRecord[result].subtable)
      * unsorted subtable list. */
     int result = encodingRecord./*bsearch*/lsearch (key);
     if (result == -1 || !encodingRecord[result].subtable)
-      return NULL;
+      return nullptr;
 
     return &(this+encodingRecord[result].subtable);
   }
 
 
     return &(this+encodingRecord[result].subtable);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-                 likely (version == 0) &&
-                 encodingRecord.sanitize (c, this));
-  }
-
-  USHORT               version;        /* Table version number (0). */
+  protected:
+  HBUINT16             version;        /* Table version number (0). */
   SortedArrayOf<EncodingRecord>
                        encodingRecord; /* Encoding tables. */
   public:
   SortedArrayOf<EncodingRecord>
                        encodingRecord; /* Encoding tables. */
   public:
similarity index 70%
rename from src/hb-ot-cbdt-table.hh
rename to src/hb-ot-color-cbdt-table.hh
index 0a7fbf5..e7ab917 100644 (file)
@@ -24,8 +24,8 @@
  * Google Author(s): Seigo Nonaka
  */
 
  * Google Author(s): Seigo Nonaka
  */
 
-#ifndef HB_OT_CBDT_TABLE_HH
-#define HB_OT_CBDT_TABLE_HH
+#ifndef HB_OT_COLOR_CBDT_TABLE_HH
+#define HB_OT_COLOR_CBDT_TABLE_HH
 
 #include "hb-open-type-private.hh"
 
 
 #include "hb-open-type-private.hh"
 
@@ -47,20 +47,20 @@ struct SmallGlyphMetrics
     extents->height = -height;
   }
 
     extents->height = -height;
   }
 
-  BYTE height;
-  BYTE width;
-  CHAR bearingX;
-  CHAR bearingY;
-  BYTE advance;
+  HBUINT8 height;
+  HBUINT8 width;
+  HBINT8 bearingX;
+  HBINT8 bearingY;
+  HBUINT8 advance;
 
   DEFINE_SIZE_STATIC(5);
 };
 
 struct BigGlyphMetrics : SmallGlyphMetrics
 {
 
   DEFINE_SIZE_STATIC(5);
 };
 
 struct BigGlyphMetrics : SmallGlyphMetrics
 {
-  CHAR vertBearingX;
-  CHAR vertBearingY;
-  BYTE vertAdvance;
+  HBINT8 vertBearingX;
+  HBINT8 vertBearingY;
+  HBUINT8 vertAdvance;
 
   DEFINE_SIZE_STATIC(8);
 };
 
   DEFINE_SIZE_STATIC(8);
 };
@@ -73,18 +73,18 @@ struct SBitLineMetrics
     return_trace (c->check_struct (this));
   }
 
     return_trace (c->check_struct (this));
   }
 
-  CHAR ascender;
-  CHAR decender;
-  BYTE widthMax;
-  CHAR caretSlopeNumerator;
-  CHAR caretSlopeDenominator;
-  CHAR caretOffset;
-  CHAR minOriginSB;
-  CHAR minAdvanceSB;
-  CHAR maxBeforeBL;
-  CHAR minAfterBL;
-  CHAR padding1;
-  CHAR padding2;
+  HBINT8 ascender;
+  HBINT8 decender;
+  HBUINT8 widthMax;
+  HBINT8 caretSlopeNumerator;
+  HBINT8 caretSlopeDenominator;
+  HBINT8 caretOffset;
+  HBINT8 minOriginSB;
+  HBINT8 minAdvanceSB;
+  HBINT8 maxBeforeBL;
+  HBINT8 minAfterBL;
+  HBINT8 padding1;
+  HBINT8 padding2;
 
   DEFINE_SIZE_STATIC(12);
 };
 
   DEFINE_SIZE_STATIC(12);
 };
@@ -102,9 +102,9 @@ struct IndexSubtableHeader
     return_trace (c->check_struct (this));
   }
 
     return_trace (c->check_struct (this));
   }
 
-  USHORT indexFormat;
-  USHORT imageFormat;
-  ULONG imageDataOffset;
+  HBUINT16 indexFormat;
+  HBUINT16 imageFormat;
+  HBUINT32 imageDataOffset;
 
   DEFINE_SIZE_STATIC(8);
 };
 
   DEFINE_SIZE_STATIC(8);
 };
@@ -137,8 +137,8 @@ struct IndexSubtableFormat1Or3
   DEFINE_SIZE_ARRAY(8, offsetArrayZ);
 };
 
   DEFINE_SIZE_ARRAY(8, offsetArrayZ);
 };
 
-struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<ULONG> {};
-struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<USHORT> {};
+struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<HBUINT32> {};
+struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<HBUINT16> {};
 
 struct IndexSubtable
 {
 
 struct IndexSubtable
 {
@@ -214,8 +214,8 @@ struct IndexSubtableRecord
                                                   offset, length, format);
   }
 
                                                   offset, length, format);
   }
 
-  USHORT firstGlyphIndex;
-  USHORT lastGlyphIndex;
+  HBUINT16 firstGlyphIndex;
+  HBUINT16 lastGlyphIndex;
   LOffsetTo<IndexSubtable> offsetToSubtable;
 
   DEFINE_SIZE_STATIC(8);
   LOffsetTo<IndexSubtable> offsetToSubtable;
 
   DEFINE_SIZE_STATIC(8);
@@ -245,7 +245,7 @@ struct IndexSubtableArray
         return &indexSubtablesZ[i];
       }
     }
         return &indexSubtablesZ[i];
       }
     }
-    return NULL;
+    return nullptr;
   }
 
   protected:
   }
 
   protected:
@@ -276,19 +276,19 @@ struct BitmapSizeTable
 
   protected:
   LOffsetTo<IndexSubtableArray> indexSubtableArrayOffset;
 
   protected:
   LOffsetTo<IndexSubtableArray> indexSubtableArrayOffset;
-  ULONG indexTablesSize;
-  ULONG numberOfIndexSubtables;
-  ULONG colorRef;
+  HBUINT32 indexTablesSize;
+  HBUINT32 numberOfIndexSubtables;
+  HBUINT32 colorRef;
   SBitLineMetrics horizontal;
   SBitLineMetrics vertical;
   SBitLineMetrics horizontal;
   SBitLineMetrics vertical;
-  USHORT startGlyphIndex;
-  USHORT endGlyphIndex;
-  BYTE ppemX;
-  BYTE ppemY;
-  BYTE bitDepth;
-  CHAR flags;
-
-public:
+  HBUINT16 startGlyphIndex;
+  HBUINT16 endGlyphIndex;
+  HBUINT8 ppemX;
+  HBUINT8 ppemY;
+  HBUINT8 bitDepth;
+  HBINT8 flags;
+
+  public:
   DEFINE_SIZE_STATIC(48);
 };
 
   DEFINE_SIZE_STATIC(48);
 };
 
@@ -300,8 +300,8 @@ public:
 struct GlyphBitmapDataFormat17
 {
   SmallGlyphMetrics glyphMetrics;
 struct GlyphBitmapDataFormat17
 {
   SmallGlyphMetrics glyphMetrics;
-  ULONG dataLen;
-  BYTE dataZ[VAR];
+  HBUINT32 dataLen;
+  HBUINT8 dataZ[VAR];
 
   DEFINE_SIZE_ARRAY(9, dataZ);
 };
 
   DEFINE_SIZE_ARRAY(9, dataZ);
 };
@@ -315,6 +315,8 @@ struct GlyphBitmapDataFormat17
 
 struct CBLC
 {
 
 struct CBLC
 {
+  friend struct CBDT;
+
   static const hb_tag_t tableTag = HB_OT_TAG_CBLC;
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   static const hb_tag_t tableTag = HB_OT_TAG_CBLC;
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -325,7 +327,7 @@ struct CBLC
                  sizeTables.sanitize (c, this));
   }
 
                  sizeTables.sanitize (c, this));
   }
 
-  public:
+  protected:
   const IndexSubtableRecord *find_table (hb_codepoint_t glyph,
                                         unsigned int *x_ppem, unsigned int *y_ppem) const
   {
   const IndexSubtableRecord *find_table (hb_codepoint_t glyph,
                                         unsigned int *x_ppem, unsigned int *y_ppem) const
   {
@@ -344,7 +346,7 @@ struct CBLC
       }
     }
 
       }
     }
 
-    return NULL;
+    return nullptr;
   }
 
   protected:
   }
 
   protected:
@@ -371,9 +373,94 @@ struct CBDT
                  likely (version.major == 2 || version.major == 3));
   }
 
                  likely (version.major == 2 || version.major == 3));
   }
 
+  struct accelerator_t
+  {
+    inline void init (hb_face_t *face)
+    {
+      upem = hb_face_get_upem (face);
+
+      cblc_blob = Sanitizer<CBLC>().sanitize (face->reference_table (HB_OT_TAG_CBLC));
+      cbdt_blob = Sanitizer<CBDT>().sanitize (face->reference_table (HB_OT_TAG_CBDT));
+      cbdt_len = hb_blob_get_length (cbdt_blob);
+
+      if (hb_blob_get_length (cblc_blob) == 0) {
+       cblc = nullptr;
+       cbdt = nullptr;
+       return;  /* Not a bitmap font. */
+      }
+      cblc = Sanitizer<CBLC>::lock_instance (cblc_blob);
+      cbdt = Sanitizer<CBDT>::lock_instance (cbdt_blob);
+
+    }
+
+    inline void fini (void)
+    {
+      hb_blob_destroy (this->cblc_blob);
+      hb_blob_destroy (this->cbdt_blob);
+    }
+
+    inline bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
+    {
+      unsigned int x_ppem = upem, y_ppem = upem; /* TODO Use font ppem if available. */
+
+      if (!cblc)
+       return false;  // Not a color bitmap font.
+
+      const IndexSubtableRecord *subtable_record = this->cblc->find_table(glyph, &x_ppem, &y_ppem);
+      if (!subtable_record || !x_ppem || !y_ppem)
+       return false;
+
+      if (subtable_record->get_extents (extents))
+       return true;
+
+      unsigned int image_offset = 0, image_length = 0, image_format = 0;
+      if (!subtable_record->get_image_data (glyph, &image_offset, &image_length, &image_format))
+       return false;
+
+      {
+       if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+         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 (extents);
+         }
+         break;
+         default:
+           // TODO: Support other image formats.
+           return false;
+       }
+      }
+
+      /* Convert to the font units. */
+      extents->x_bearing *= upem / (float) x_ppem;
+      extents->y_bearing *= upem / (float) y_ppem;
+      extents->width *= upem / (float) x_ppem;
+      extents->height *= upem / (float) y_ppem;
+
+      return true;
+    }
+
+    private:
+    hb_blob_t *cblc_blob;
+    hb_blob_t *cbdt_blob;
+    const CBLC *cblc;
+    const CBDT *cbdt;
+
+    unsigned int cbdt_len;
+    unsigned int upem;
+  };
+
+
   protected:
   FixedVersion<>version;
   protected:
   FixedVersion<>version;
-  BYTE dataZ[VAR];
+  HBUINT8 dataZ[VAR];
 
   public:
   DEFINE_SIZE_ARRAY(4, dataZ);
 
   public:
   DEFINE_SIZE_ARRAY(4, dataZ);
@@ -381,4 +468,4 @@ struct CBDT
 
 } /* namespace OT */
 
 
 } /* namespace OT */
 
-#endif /* HB_OT_CBDT_TABLE_HH */
+#endif /* HB_OT_COLOR_CBDT_TABLE_HH */
diff --git a/src/hb-ot-color-colr-table.hh b/src/hb-ot-color-colr-table.hh
new file mode 100644 (file)
index 0000000..2c3b1cc
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_COLOR_COLR_TABLE_HH
+#define HB_OT_COLOR_COLR_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+/*
+ * Color Palette
+ * http://www.microsoft.com/typography/otspec/colr.htm
+ */
+
+#define HB_OT_TAG_COLR HB_TAG('C','O','L','R')
+
+namespace OT {
+
+
+struct LayerRecord
+{
+  friend struct COLR;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  GlyphID gID;                 /* Glyph ID of layer glyph */
+  HBUINT16 paletteIndex;       /* Index value to use with a selected color palette */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct BaseGlyphRecord
+{
+  friend struct COLR;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  GlyphID gID;                 /* Glyph ID of reference glyph */
+  HBUINT16 firstLayerIndex;    /* Index to the layer record */
+  HBUINT16 numLayers;          /* Number of color layers associated with this glyph */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct COLR
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_COLR;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!(c->check_struct (this) &&
+        c->check_array ((const void*) &layerRecordsOffsetZ, sizeof (LayerRecord), numLayerRecords) &&
+        c->check_array ((const void*) &baseGlyphRecordsZ, sizeof (BaseGlyphRecord), numBaseGlyphRecords)))
+      return_trace (false);
+
+    const BaseGlyphRecord* base_glyph_records = &baseGlyphRecordsZ (this);
+    for (unsigned int i = 0; i < numBaseGlyphRecords; ++i)
+      if (base_glyph_records[i].firstLayerIndex +
+          base_glyph_records[i].numLayers > numLayerRecords)
+        return_trace (false);
+
+    return_trace (true);
+  }
+
+  inline bool get_base_glyph_record (
+    hb_codepoint_t glyph_id, unsigned int &first_layer, unsigned int &num_layers) const
+  {
+    const BaseGlyphRecord* base_glyph_records = &baseGlyphRecordsZ (this);
+    unsigned int min = 0, max = numBaseGlyphRecords - 1;
+    while (min <= max)
+    {
+      unsigned int mid = (min + max) / 2;
+      hb_codepoint_t gID = base_glyph_records[mid].gID;
+      if (gID > glyph_id)
+        max = mid - 1;
+      else if (gID < glyph_id)
+        min = mid + 1;
+      else
+      {
+        first_layer = base_glyph_records[mid].firstLayerIndex;
+        num_layers = base_glyph_records[mid].numLayers;
+        return true;
+      }
+    }
+    return false;
+  }
+
+  inline void get_layer_record (int layer,
+    hb_codepoint_t &glyph_id, unsigned int &palette_index) const
+  {
+    const LayerRecord* records = &layerRecordsOffsetZ (this);
+    glyph_id = records[layer].gID;
+    palette_index = records[layer].paletteIndex;
+  }
+
+  protected:
+  HBUINT16     version;                /* Table version number */
+  HBUINT16     numBaseGlyphRecords;    /* Number of Base Glyph Records */
+  LOffsetTo<BaseGlyphRecord>
+               baseGlyphRecordsZ;      /* Offset to Base Glyph records. */
+  LOffsetTo<LayerRecord>
+               layerRecordsOffsetZ;    /* Offset to Layer Records */
+  HBUINT16     numLayerRecords;        /* Number of Layer Records */
+  public:
+  DEFINE_SIZE_STATIC (14);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLOR_COLR_TABLE_HH */
diff --git a/src/hb-ot-color-cpal-table.hh b/src/hb-ot-color-cpal-table.hh
new file mode 100644 (file)
index 0000000..e364c8a
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ * Copyright © 2016  Google, Inc.
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Sascha Brawer
+ */
+
+#ifndef HB_OT_COLOR_CPAL_TABLE_HH
+#define HB_OT_COLOR_CPAL_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+
+/*
+ * Following parts to be moved to a public header.
+ */
+
+/**
+ * hb_ot_color_t:
+ * ARGB data type for holding color values.
+ *
+ * Since: REPLACEME
+ */
+typedef uint32_t hb_ot_color_t;
+
+
+/**
+ * hb_ot_color_palette_flags_t:
+ * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special to note about a color palette.
+ * @HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND: flag indicating that the color palette is suitable for rendering text on light background.
+ * @HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND: flag indicating that the color palette is suitable for rendering text on dark background.
+ *
+ * Since: REPLACEME
+ */
+typedef enum { /*< flags >*/
+  HB_OT_COLOR_PALETTE_FLAG_DEFAULT = 0x00000000u,
+  HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND = 0x00000001u,
+  HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND = 0x00000002u,
+} hb_ot_color_palette_flags_t;
+
+// HB_EXTERN unsigned int
+// hb_ot_color_get_palette_count (hb_face_t *face);
+
+// HB_EXTERN unsigned int
+// hb_ot_color_get_palette_name_id (hb_face_t *face, unsigned int palette);
+
+// HB_EXTERN hb_ot_color_palette_flags_t
+// hb_ot_color_get_palette_flags (hb_face_t *face, unsigned int palette);
+
+// HB_EXTERN unsigned int
+// hb_ot_color_get_palette_colors (hb_face_t       *face,
+//                             unsigned int     palette, /* default=0 */
+//                             unsigned int     start_offset,
+//                             unsigned int    *color_count /* IN/OUT */,
+//                             hb_ot_color_t   *colors /* OUT */);
+
+
+
+
+
+/*
+ * Color Palette
+ * http://www.microsoft.com/typography/otspec/cpal.htm
+ */
+
+#define HB_OT_TAG_CPAL HB_TAG('C','P','A','L')
+
+namespace OT {
+
+
+struct CPALV1Tail
+{
+  friend struct CPAL;
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int palettes) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (
+      c->check_struct (this) &&
+      c->check_array ((const void*) &paletteFlags, sizeof (HBUINT32), palettes) &&
+      c->check_array ((const void*) &paletteLabel, sizeof (HBUINT16), palettes) &&
+      c->check_array ((const void*) &paletteEntryLabel, sizeof (HBUINT16), palettes));
+  }
+
+  private:
+  inline hb_ot_color_palette_flags_t
+  get_palette_flags (const void *base, unsigned int palette) const
+  {
+    const HBUINT32* flags = &paletteFlags (base);
+    return (hb_ot_color_palette_flags_t) (uint32_t) flags[palette];
+  }
+
+  inline unsigned int
+  get_palette_name_id (const void *base, unsigned int palette) const
+  {
+    const HBUINT16* name_ids = &paletteLabel (base);
+    return name_ids[palette];
+  }
+
+  protected:
+  LOffsetTo<HBUINT32> paletteFlags;
+  LOffsetTo<HBUINT16> paletteLabel;
+  LOffsetTo<HBUINT16> paletteEntryLabel;
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+typedef HBUINT32 BGRAColor;
+
+struct CPAL
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_CPAL;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!(c->check_struct (this) && // This checks colorRecordIndicesX sanity also, see #get_size
+        c->check_array ((const void*) &colorRecordsZ, sizeof (BGRAColor), numColorRecords)))
+      return_trace (false);
+
+    // Check for indices sanity so no need for doing it runtime
+    for (unsigned int i = 0; i < numPalettes; ++i)
+      if (colorRecordIndicesX[i] + numPaletteEntries > numColorRecords)
+        return_trace (false);
+
+    // If version is zero, we are done here; otherwise we need to check tail also
+    if (version == 0)
+      return_trace (true);
+
+    const CPALV1Tail &v1 = StructAfter<CPALV1Tail> (*this);
+    return_trace (v1.sanitize (c, numPalettes));
+  }
+
+  inline unsigned int get_size (void) const
+  {
+    return min_size + numPalettes * sizeof (HBUINT16);
+  }
+
+  inline hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette) const
+  {
+    if (version == 0 || palette >= numPalettes)
+      return HB_OT_COLOR_PALETTE_FLAG_DEFAULT;
+
+    const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this);
+    return cpal1.get_palette_flags (this, palette);
+  }
+
+  inline unsigned int get_palette_name_id (unsigned int palette) const
+  {
+    if (version == 0 || palette >= numPalettes)
+      return 0xFFFF;
+
+    const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this);
+    return cpal1.get_palette_name_id (this, palette);
+  }
+
+  inline unsigned int get_palette_count () const
+  {
+    return numPalettes;
+  }
+
+  inline hb_ot_color_t get_color_record_argb (unsigned int color_index, unsigned int palette) const
+  {
+    if (color_index >= numPaletteEntries || palette >= numPalettes)
+      return 0;
+
+    const BGRAColor* records = &colorRecordsZ(this);
+    // No need for more range check as it is already done on #sanitize
+    return records[colorRecordIndicesX[palette] + color_index];
+  }
+
+  protected:
+  HBUINT16     version;
+  /* Version 0 */
+  HBUINT16     numPaletteEntries;
+  HBUINT16     numPalettes;
+  HBUINT16     numColorRecords;
+  LOffsetTo<HBUINT32>  colorRecordsZ;
+  HBUINT16     colorRecordIndicesX[VAR];  // VAR=numPalettes
+/*CPALV1Tail   v1[VAR];*/
+  public:
+  DEFINE_SIZE_ARRAY (12, colorRecordIndicesX);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLOR_CPAL_TABLE_HH */
diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc
new file mode 100644 (file)
index 0000000..ceebe0b
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * Copyright © 2016  Google, Inc.
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Sascha Brawer
+ */
+
+#include "hb-open-type-private.hh"
+#include "hb-ot-color-colr-table.hh"
+#include "hb-ot-color-cpal-table.hh"
+#include "hb-ot.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "hb-ot-layout-private.hh"
+#include "hb-shaper-private.hh"
+
+#if 0
+HB_MARK_AS_FLAG_T (hb_ot_color_palette_flags_t)
+//HB_SHAPER_DATA_ENSURE_DECLARE(ot, face) Hmm?
+
+
+static inline const OT::COLR&
+_get_colr (hb_face_t *face)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::COLR);
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  return *(layout->colr.get ());
+}
+
+static inline const OT::CPAL&
+_get_cpal (hb_face_t *face)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::CPAL);
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  return *(layout->cpal.get ());
+}
+
+
+/**
+ * hb_ot_color_get_palette_count:
+ * @face: a font face.
+ *
+ * Returns: the number of color palettes in @face, or zero if @face has
+ * no colors.
+ *
+ * Since: REPLACEME
+ */
+unsigned int
+hb_ot_color_get_palette_count (hb_face_t *face)
+{
+  const OT::CPAL& cpal = _get_cpal (face);
+  return cpal.get_palette_count ();
+}
+
+
+/**
+ * hb_ot_color_get_palette_name_id:
+ * @face: a font face.
+ * @palette: the index of the color palette whose name is being requested.
+ *
+ * Retrieves the name id of a color palette. For example, a color font can
+ * have themed palettes like "Spring", "Summer", "Fall", and "Winter".
+ *
+ * Returns: an identifier within @face's `name` table.
+ * If the requested palette has no name, or if @face has no colors,
+ * or if @palette is not between 0 and hb_ot_color_get_palette_count(),
+ * the result is 0xFFFF. The implementation does not check whether
+ * the returned palette name id is actually in @face's `name` table.
+ *
+ * Since: REPLACEME
+ */
+unsigned int
+hb_ot_color_get_palette_name_id (hb_face_t *face, unsigned int palette)
+{
+  const OT::CPAL& cpal = _get_cpal (face);
+  return cpal.get_palette_name_id (palette);
+}
+
+
+/**
+ * hb_ot_color_get_palette_flags:
+ * @face: a font face
+ * @palette: the index of the color palette whose flags are being requested
+ *
+ * Returns: the flags for the requested color palette.  If @face has no colors,
+ * or if @palette is not between 0 and hb_ot_color_get_palette_count(),
+ * the result is #HB_OT_COLOR_PALETTE_FLAG_DEFAULT.
+ *
+ * Since: REPLACEME
+ */
+hb_ot_color_palette_flags_t
+hb_ot_color_get_palette_flags (hb_face_t *face, unsigned int palette)
+{
+  const OT::CPAL& cpal = _get_cpal(face);
+  return cpal.get_palette_flags (palette);
+}
+
+
+/**
+ * hb_ot_color_get_palette_colors:
+ * @face:         a font face.
+ * @palette:      the index of the color palette whose colors
+ *                are being requested.
+ * @start_offset: the index of the first color being requested.
+ * @color_count:  (inout) (optional): on input, how many colors
+ *                can be maximally stored into the @colors array;
+ *                on output, how many colors were actually stored.
+ * @colors: (array length=color_count) (optional):
+ *                an array of #hb_ot_color_t records. After calling
+ *                this function, @colors will be filled with
+ *                the palette colors. If @colors is NULL, the function
+ *                will just return the number of total colors
+ *                without storing any actual colors; this can be used
+ *                for allocating a buffer of suitable size before calling
+ *                hb_ot_color_get_palette_colors() a second time.
+ *
+ * Retrieves the colors in a color palette.
+ *
+ * Returns: the total number of colors in the palette. All palettes in
+ * a font have the same number of colors. If @face has no colors, or if
+ * @palette is not between 0 and hb_ot_color_get_palette_count(),
+ * the result is zero.
+ *
+ * Since: REPLACEME
+ */
+unsigned int
+hb_ot_color_get_palette_colors (hb_face_t       *face,
+                               unsigned int     palette, /* default=0 */
+                               unsigned int     start_offset,
+                               unsigned int    *color_count /* IN/OUT */,
+                               hb_ot_color_t   *colors /* OUT */)
+{
+  const OT::CPAL& cpal = _get_cpal(face);
+  if (unlikely (palette >= cpal.numPalettes))
+  {
+    if (color_count) *color_count = 0;
+    return 0;
+  }
+
+  const OT::ColorRecord* crec = &cpal.offsetFirstColorRecord (&cpal);
+  crec += cpal.colorRecordIndices[palette];
+
+  unsigned int num_results = 0;
+  if (likely (color_count && colors))
+  {
+    for (unsigned int i = start_offset;
+        i < cpal.numPaletteEntries && num_results < *color_count; ++i)
+    {
+      hb_ot_color_t* result = &colors[num_results];
+      result->red = crec[i].red;
+      result->green = crec[i].green;
+      result->blue = crec[i].blue;
+      result->alpha = crec[i].alpha;
+      ++num_results;
+    }
+  }
+
+  if (likely (color_count)) *color_count = num_results;
+  return cpal.numPaletteEntries;
+}
+#endif
index 009db20..0e373d3 100644 (file)
 #include "hb-font-private.hh"
 
 #include "hb-ot-cmap-table.hh"
 #include "hb-font-private.hh"
 
 #include "hb-ot-cmap-table.hh"
-#include "hb-ot-cbdt-table.hh"
 #include "hb-ot-glyf-table.hh"
 #include "hb-ot-glyf-table.hh"
-#include "hb-ot-head-table.hh"
-#include "hb-ot-hhea-table.hh"
 #include "hb-ot-hmtx-table.hh"
 #include "hb-ot-hmtx-table.hh"
-#include "hb-ot-os2-table.hh"
-#include "hb-ot-var-hvar-table.hh"
-//#include "hb-ot-post-table.hh"
+#include "hb-ot-kern-table.hh"
+#include "hb-ot-post-table.hh"
 
 
+#include "hb-ot-color-cbdt-table.hh"
 
 
-struct hb_ot_face_metrics_accelerator_t
-{
-  unsigned int num_metrics;
-  unsigned int num_advances;
-  unsigned int default_advance;
-  unsigned short ascender;
-  unsigned short descender;
-  unsigned short line_gap;
-  bool has_font_extents;
-
-  const OT::hmtxvmtx *table;
-  hb_blob_t *blob;
-
-  const OT::HVARVVAR *var;
-  hb_blob_t *var_blob;
-
-  inline void init (hb_face_t *face,
-                   hb_tag_t _hea_tag,
-                   hb_tag_t _mtx_tag,
-                   hb_tag_t _var_tag,
-                   hb_tag_t os2_tag,
-                   unsigned int default_advance = 0)
-  {
-    this->default_advance = default_advance ? default_advance : face->get_upem ();
-
-    bool got_font_extents = false;
-    if (os2_tag)
-    {
-      hb_blob_t *os2_blob = OT::Sanitizer<OT::os2>::sanitize (face->reference_table (os2_tag));
-      const OT::os2 *os2 = OT::Sanitizer<OT::os2>::lock_instance (os2_blob);
-#define USE_TYPO_METRICS (1u<<7)
-      if (0 != (os2->fsSelection & USE_TYPO_METRICS))
-      {
-       this->ascender = os2->sTypoAscender;
-       this->descender = os2->sTypoDescender;
-       this->line_gap = os2->sTypoLineGap;
-       got_font_extents = (this->ascender | this->descender) != 0;
-      }
-      hb_blob_destroy (os2_blob);
-    }
-
-    hb_blob_t *_hea_blob = OT::Sanitizer<OT::_hea>::sanitize (face->reference_table (_hea_tag));
-    const OT::_hea *_hea = OT::Sanitizer<OT::_hea>::lock_instance (_hea_blob);
-    this->num_advances = _hea->numberOfLongMetrics;
-    if (!got_font_extents)
-    {
-      this->ascender = _hea->ascender;
-      this->descender = _hea->descender;
-      this->line_gap = _hea->lineGap;
-      got_font_extents = (this->ascender | this->descender) != 0;
-    }
-    hb_blob_destroy (_hea_blob);
-
-    this->has_font_extents = got_font_extents;
-
-    this->blob = OT::Sanitizer<OT::hmtxvmtx>::sanitize (face->reference_table (_mtx_tag));
-
-    /* Cap num_metrics() and num_advances() based on table length. */
-    unsigned int len = hb_blob_get_length (this->blob);
-    if (unlikely (this->num_advances * 4 > len))
-      this->num_advances = len / 4;
-    this->num_metrics = this->num_advances + (len - 4 * this->num_advances) / 2;
-
-    /* We MUST set num_metrics to zero if num_advances is zero.
-     * Our get_advance() depends on that. */
-    if (unlikely (!this->num_advances))
-    {
-      this->num_metrics = this->num_advances = 0;
-      hb_blob_destroy (this->blob);
-      this->blob = hb_blob_get_empty ();
-    }
-    this->table = OT::Sanitizer<OT::hmtxvmtx>::lock_instance (this->blob);
-
-    this->var_blob = OT::Sanitizer<OT::HVARVVAR>::sanitize (face->reference_table (_var_tag));
-    this->var = OT::Sanitizer<OT::HVARVVAR>::lock_instance (this->var_blob);
-  }
-
-  inline void fini (void)
-  {
-    hb_blob_destroy (this->blob);
-    hb_blob_destroy (this->var_blob);
-  }
-
-  inline unsigned int get_advance (hb_codepoint_t  glyph,
-                                  hb_font_t      *font) const
-  {
-    if (unlikely (glyph >= this->num_metrics))
-    {
-      /* If this->num_metrics is zero, it means we don't have the metrics table
-       * for this direction: return default advance.  Otherwise, it means that the
-       * glyph index is out of bound: return zero. */
-      if (this->num_metrics)
-       return 0;
-      else
-       return this->default_advance;
-    }
-
-    return this->table->longMetric[MIN (glyph, this->num_advances - 1)].advance
-        + this->var->get_advance_var (glyph, font->coords, font->num_coords); // TODO Optimize?!
-  }
-};
-
-struct hb_ot_face_glyf_accelerator_t
-{
-  bool short_offset;
-  unsigned int num_glyphs;
-  const OT::loca *loca;
-  const OT::glyf *glyf;
-  hb_blob_t *loca_blob;
-  hb_blob_t *glyf_blob;
-  unsigned int glyf_len;
-
-  inline void init (hb_face_t *face)
-  {
-    hb_blob_t *head_blob = OT::Sanitizer<OT::head>::sanitize (face->reference_table (HB_OT_TAG_head));
-    const OT::head *head = OT::Sanitizer<OT::head>::lock_instance (head_blob);
-    if ((unsigned int) head->indexToLocFormat > 1 || head->glyphDataFormat != 0)
-    {
-      /* Unknown format.  Leave num_glyphs=0, that takes care of disabling us. */
-      hb_blob_destroy (head_blob);
-      return;
-    }
-    this->short_offset = 0 == head->indexToLocFormat;
-    hb_blob_destroy (head_blob);
-
-    this->loca_blob = OT::Sanitizer<OT::loca>::sanitize (face->reference_table (HB_OT_TAG_loca));
-    this->loca = OT::Sanitizer<OT::loca>::lock_instance (this->loca_blob);
-    this->glyf_blob = OT::Sanitizer<OT::glyf>::sanitize (face->reference_table (HB_OT_TAG_glyf));
-    this->glyf = OT::Sanitizer<OT::glyf>::lock_instance (this->glyf_blob);
-
-    this->num_glyphs = MAX (1u, hb_blob_get_length (this->loca_blob) / (this->short_offset ? 2 : 4)) - 1;
-    this->glyf_len = hb_blob_get_length (this->glyf_blob);
-  }
-
-  inline void fini (void)
-  {
-    hb_blob_destroy (this->loca_blob);
-    hb_blob_destroy (this->glyf_blob);
-  }
-
-  inline bool get_extents (hb_codepoint_t glyph,
-                          hb_glyph_extents_t *extents) const
-  {
-    if (unlikely (glyph >= this->num_glyphs))
-      return false;
-
-    unsigned int start_offset, end_offset;
-    if (this->short_offset)
-    {
-      start_offset = 2 * this->loca->u.shortsZ[glyph];
-      end_offset   = 2 * this->loca->u.shortsZ[glyph + 1];
-    }
-    else
-    {
-      start_offset = this->loca->u.longsZ[glyph];
-      end_offset   = this->loca->u.longsZ[glyph + 1];
-    }
-
-    if (start_offset > end_offset || end_offset > this->glyf_len)
-      return false;
-
-    if (end_offset - start_offset < OT::glyfGlyphHeader::static_size)
-      return true; /* Empty glyph; zero extents. */
-
-    const OT::glyfGlyphHeader &glyph_header = OT::StructAtOffset<OT::glyfGlyphHeader> (this->glyf, start_offset);
-
-    extents->x_bearing = MIN (glyph_header.xMin, glyph_header.xMax);
-    extents->y_bearing = MAX (glyph_header.yMin, glyph_header.yMax);
-    extents->width     = MAX (glyph_header.xMin, glyph_header.xMax) - extents->x_bearing;
-    extents->height    = MIN (glyph_header.yMin, glyph_header.yMax) - extents->y_bearing;
-
-    return true;
-  }
-};
-
-struct hb_ot_face_cbdt_accelerator_t
-{
-  hb_blob_t *cblc_blob;
-  hb_blob_t *cbdt_blob;
-  const OT::CBLC *cblc;
-  const OT::CBDT *cbdt;
-
-  unsigned int cbdt_len;
-  float upem;
-
-  inline void init (hb_face_t *face)
-  {
-    upem = face->get_upem();
-
-    cblc_blob = OT::Sanitizer<OT::CBLC>::sanitize (face->reference_table (HB_OT_TAG_CBLC));
-    cbdt_blob = OT::Sanitizer<OT::CBDT>::sanitize (face->reference_table (HB_OT_TAG_CBDT));
-    cbdt_len = hb_blob_get_length (cbdt_blob);
-
-    if (hb_blob_get_length (cblc_blob) == 0) {
-      cblc = NULL;
-      cbdt = NULL;
-      return;  /* Not a bitmap font. */
-    }
-    cblc = OT::Sanitizer<OT::CBLC>::lock_instance (cblc_blob);
-    cbdt = OT::Sanitizer<OT::CBDT>::lock_instance (cbdt_blob);
-
-  }
-
-  inline void fini (void)
-  {
-    hb_blob_destroy (this->cblc_blob);
-    hb_blob_destroy (this->cbdt_blob);
-  }
-
-  inline bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
-  {
-    unsigned int x_ppem = upem, y_ppem = upem; /* TODO Use font ppem if available. */
-
-    if (cblc == NULL)
-      return false;  // Not a color bitmap font.
-
-    const OT::IndexSubtableRecord *subtable_record = this->cblc->find_table(glyph, &x_ppem, &y_ppem);
-    if (subtable_record == NULL)
-      return false;
-
-    if (subtable_record->get_extents (extents))
-      return true;
-
-    unsigned int image_offset = 0, image_length = 0, image_format = 0;
-    if (!subtable_record->get_image_data (glyph, &image_offset, &image_length, &image_format))
-      return false;
-
-    {
-      /* TODO Move the following into CBDT struct when adding more formats. */
-
-      if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
-       return false;
-
-      switch (image_format)
-      {
-       case 17: {
-         if (unlikely (image_length < OT::GlyphBitmapDataFormat17::min_size))
-           return false;
-
-         const OT::GlyphBitmapDataFormat17& glyphFormat17 =
-             OT::StructAtOffset<OT::GlyphBitmapDataFormat17> (this->cbdt, image_offset);
-         glyphFormat17.glyphMetrics.get_extents (extents);
-       }
-       break;
-       default:
-         // TODO: Support other image formats.
-         return false;
-      }
-    }
-
-    /* Convert to the font units. */
-    extents->x_bearing *= upem / (float) x_ppem;
-    extents->y_bearing *= upem / (float) y_ppem;
-    extents->width *= upem / (float) x_ppem;
-    extents->height *= upem / (float) y_ppem;
-
-    return true;
-  }
-};
-
-typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
-                                         hb_codepoint_t codepoint,
-                                         hb_codepoint_t *glyph);
-
-template <typename Type>
-static inline bool get_glyph_from (const void *obj,
-                                  hb_codepoint_t codepoint,
-                                  hb_codepoint_t *glyph)
-{
-  const Type *typed_obj = (const Type *) obj;
-  return typed_obj->get_glyph (codepoint, glyph);
-}
-
-template <typename Type>
-static inline bool get_glyph_from_symbol (const void *obj,
-                                         hb_codepoint_t codepoint,
-                                         hb_codepoint_t *glyph)
-{
-  const Type *typed_obj = (const Type *) obj;
-  if (likely (typed_obj->get_glyph (codepoint, glyph)))
-    return true;
-
-  if (codepoint <= 0x00FFu)
-  {
-    /* For symbol-encoded OpenType fonts, we duplicate the
-     * U+F000..F0FF range at U+0000..U+00FF.  That's what
-     * Windows seems to do, and that's hinted about at:
-     * http://www.microsoft.com/typography/otspec/recom.htm
-     * under "Non-Standard (Symbol) Fonts". */
-    return typed_obj->get_glyph (0xF000u + codepoint, glyph);
-  }
-
-  return false;
-}
-
-struct hb_ot_face_cmap_accelerator_t
-{
-  hb_cmap_get_glyph_func_t get_glyph_func;
-  const void *get_glyph_data;
-  OT::CmapSubtableFormat4::accelerator_t format4_accel;
-
-  const OT::CmapSubtableFormat14 *uvs_table;
-  hb_blob_t *blob;
-
-  inline void init (hb_face_t *face)
-  {
-    this->blob = OT::Sanitizer<OT::cmap>::sanitize (face->reference_table (HB_OT_TAG_cmap));
-    const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (this->blob);
-    const OT::CmapSubtable *subtable = NULL;
-    const OT::CmapSubtableFormat14 *subtable_uvs = NULL;
-
-    bool symbol = false;
-    /* 32-bit subtables. */
-    if (!subtable) subtable = cmap->find_subtable (3, 10);
-    if (!subtable) subtable = cmap->find_subtable (0, 6);
-    if (!subtable) subtable = cmap->find_subtable (0, 4);
-    /* 16-bit subtables. */
-    if (!subtable) subtable = cmap->find_subtable (3, 1);
-    if (!subtable) subtable = cmap->find_subtable (0, 3);
-    if (!subtable) subtable = cmap->find_subtable (0, 2);
-    if (!subtable) subtable = cmap->find_subtable (0, 1);
-    if (!subtable) subtable = cmap->find_subtable (0, 0);
-    if (!subtable)
-    {
-      subtable = cmap->find_subtable (3, 0);
-      if (subtable) symbol = true;
-    }
-    /* Meh. */
-    if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
-
-    /* UVS subtable. */
-    if (!subtable_uvs)
-    {
-      const OT::CmapSubtable *st = cmap->find_subtable (0, 5);
-      if (st && st->u.format == 14)
-        subtable_uvs = &st->u.format14;
-    }
-    /* Meh. */
-    if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtableFormat14);
-
-    this->uvs_table = subtable_uvs;
-
-    this->get_glyph_data = subtable;
-    if (unlikely (symbol))
-      this->get_glyph_func = get_glyph_from_symbol<OT::CmapSubtable>;
-    else
-      switch (subtable->u.format) {
-      /* Accelerate format 4 and format 12. */
-      default: this->get_glyph_func = get_glyph_from<OT::CmapSubtable>;                break;
-      case 12: this->get_glyph_func = get_glyph_from<OT::CmapSubtableFormat12>;        break;
-      case  4:
-       {
-         this->format4_accel.init (&subtable->u.format4);
-         this->get_glyph_data = &this->format4_accel;
-         this->get_glyph_func = this->format4_accel.get_glyph_func;
-       }
-       break;
-      }
-  }
-
-  inline void fini (void)
-  {
-    hb_blob_destroy (this->blob);
-  }
-
-  inline bool get_nominal_glyph (hb_codepoint_t  unicode,
-                                hb_codepoint_t *glyph) const
-  {
-    return this->get_glyph_func (this->get_glyph_data, unicode, glyph);
-  }
-
-  inline bool get_variation_glyph (hb_codepoint_t  unicode,
-                                  hb_codepoint_t  variation_selector,
-                                  hb_codepoint_t *glyph) const
-  {
-    switch (this->uvs_table->get_glyph_variant (unicode,
-                                               variation_selector,
-                                               glyph))
-    {
-      case OT::GLYPH_VARIANT_NOT_FOUND:                return false;
-      case OT::GLYPH_VARIANT_FOUND:            return true;
-      case OT::GLYPH_VARIANT_USE_DEFAULT:      break;
-    }
-
-    return get_nominal_glyph (unicode, glyph);
-  }
-};
 
 struct hb_ot_font_t
 {
 
 struct hb_ot_font_t
 {
-  hb_ot_face_cmap_accelerator_t cmap;
-  hb_ot_face_metrics_accelerator_t h_metrics;
-  hb_ot_face_metrics_accelerator_t v_metrics;
-  OT::hb_lazy_loader_t<hb_ot_face_glyf_accelerator_t> glyf;
-  OT::hb_lazy_loader_t<hb_ot_face_cbdt_accelerator_t> cbdt;
+  OT::cmap::accelerator_t cmap;
+  OT::hmtx::accelerator_t h_metrics;
+  OT::vmtx::accelerator_t v_metrics;
+  OT::hb_lazy_loader_t<OT::glyf::accelerator_t> glyf;
+  OT::hb_lazy_loader_t<OT::CBDT::accelerator_t> cbdt;
+  OT::hb_lazy_loader_t<OT::post::accelerator_t> post;
+  OT::hb_lazy_loader_t<OT::kern::accelerator_t> kern;
 };
 
 
 };
 
 
@@ -445,26 +57,31 @@ _hb_ot_font_create (hb_face_t *face)
   hb_ot_font_t *ot_font = (hb_ot_font_t *) calloc (1, sizeof (hb_ot_font_t));
 
   if (unlikely (!ot_font))
   hb_ot_font_t *ot_font = (hb_ot_font_t *) calloc (1, sizeof (hb_ot_font_t));
 
   if (unlikely (!ot_font))
-    return NULL;
+    return nullptr;
 
   ot_font->cmap.init (face);
 
   ot_font->cmap.init (face);
-  ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, HB_OT_TAG_HVAR, HB_OT_TAG_os2);
-  ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, HB_OT_TAG_VVAR, HB_TAG_NONE,
-                          ot_font->h_metrics.ascender - ot_font->h_metrics.descender); /* TODO Can we do this lazily? */
+  ot_font->h_metrics.init (face);
+  ot_font->v_metrics.init (face, ot_font->h_metrics.ascender - ot_font->h_metrics.descender); /* TODO Can we do this lazily? */
   ot_font->glyf.init (face);
   ot_font->cbdt.init (face);
   ot_font->glyf.init (face);
   ot_font->cbdt.init (face);
+  ot_font->post.init (face);
+  ot_font->kern.init (face);
 
   return ot_font;
 }
 
 static void
 
   return ot_font;
 }
 
 static void
-_hb_ot_font_destroy (hb_ot_font_t *ot_font)
+_hb_ot_font_destroy (void *data)
 {
 {
+  hb_ot_font_t *ot_font = (hb_ot_font_t *) data;
+
   ot_font->cmap.fini ();
   ot_font->h_metrics.fini ();
   ot_font->v_metrics.fini ();
   ot_font->glyf.fini ();
   ot_font->cbdt.fini ();
   ot_font->cmap.fini ();
   ot_font->h_metrics.fini ();
   ot_font->v_metrics.fini ();
   ot_font->glyf.fini ();
   ot_font->cbdt.fini ();
+  ot_font->post.fini ();
+  ot_font->kern.fini ();
 
   free (ot_font);
 }
 
   free (ot_font);
 }
@@ -514,6 +131,17 @@ hb_ot_get_glyph_v_advance (hb_font_t *font,
   return font->em_scale_y (-(int) ot_font->v_metrics.get_advance (glyph, font));
 }
 
   return font->em_scale_y (-(int) ot_font->v_metrics.get_advance (glyph, font));
 }
 
+static hb_position_t
+hb_ot_get_glyph_h_kerning (hb_font_t *font,
+                          void *font_data,
+                          hb_codepoint_t left_glyph,
+                          hb_codepoint_t right_glyph,
+                          void *user_data HB_UNUSED)
+{
+  const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+  return font->em_scale_x (ot_font->kern->get_h_kerning (left_glyph, right_glyph));
+}
+
 static hb_bool_t
 hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
                         void *font_data,
 static hb_bool_t
 hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
                         void *font_data,
@@ -534,6 +162,28 @@ hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
 }
 
 static hb_bool_t
 }
 
 static hb_bool_t
+hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED,
+                      void *font_data,
+                      hb_codepoint_t glyph,
+                      char *name, unsigned int size,
+                      void *user_data HB_UNUSED)
+{
+  const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+  return ot_font->post->get_glyph_name (glyph, name, size);
+}
+
+static hb_bool_t
+hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED,
+                           void *font_data,
+                           const char *name, int len,
+                           hb_codepoint_t *glyph,
+                           void *user_data HB_UNUSED)
+{
+  const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+  return ot_font->post->get_glyph_from_name (name, len, glyph);
+}
+
+static hb_bool_t
 hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED,
                          void *font_data,
                          hb_font_extents_t *metrics,
 hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED,
                          void *font_data,
                          hb_font_extents_t *metrics,
@@ -561,7 +211,7 @@ hb_ot_get_font_v_extents (hb_font_t *font HB_UNUSED,
   return ot_font->v_metrics.has_font_extents;
 }
 
   return ot_font->v_metrics.has_font_extents;
 }
 
-static hb_font_funcs_t *static_ot_funcs = NULL;
+static hb_font_funcs_t *static_ot_funcs = nullptr;
 
 #ifdef HB_USE_ATEXIT
 static
 
 #ifdef HB_USE_ATEXIT
 static
@@ -581,24 +231,24 @@ retry:
   {
     funcs = hb_font_funcs_create ();
 
   {
     funcs = hb_font_funcs_create ();
 
-    hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, NULL, NULL);
-    hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, NULL, NULL);
-    hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, NULL, NULL);
-    hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, NULL, NULL);
-    hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ot_get_glyph_h_advance, NULL, NULL);
-    hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ot_get_glyph_v_advance, NULL, NULL);
-    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, NULL, NULL);
-    //hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, NULL, NULL);
-    //hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ot_get_glyph_h_kerning, NULL, NULL); TODO
-    //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ot_get_glyph_v_kerning, NULL, NULL);
-    hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, NULL, NULL);
-    //hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, NULL, NULL); TODO
-    //hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, NULL, NULL); TODO
-    //hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, NULL, NULL); TODO
+    hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, nullptr, nullptr);
+    hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, nullptr, nullptr);
+    hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, nullptr, nullptr);
+    hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, nullptr, nullptr);
+    hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ot_get_glyph_h_advance, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ot_get_glyph_v_advance, nullptr, nullptr);
+    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, nullptr, nullptr);
+    //hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, nullptr, nullptr);
+    hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ot_get_glyph_h_kerning, nullptr, nullptr);
+    //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ot_get_glyph_v_kerning, nullptr, nullptr);
+    hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, nullptr, nullptr);
+    //hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, nullptr, nullptr);
+    hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, nullptr, nullptr);
+    hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, nullptr, nullptr);
 
     hb_font_funcs_make_immutable (funcs);
 
 
     hb_font_funcs_make_immutable (funcs);
 
-    if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, NULL, funcs)) {
+    if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, nullptr, funcs)) {
       hb_font_funcs_destroy (funcs);
       goto retry;
     }
       hb_font_funcs_destroy (funcs);
       goto retry;
     }
@@ -627,5 +277,5 @@ hb_ot_font_set_funcs (hb_font_t *font)
   hb_font_set_funcs (font,
                     _hb_ot_get_font_funcs (),
                     ot_font,
   hb_font_set_funcs (font,
                     _hb_ot_get_font_funcs (),
                     ot_font,
-                    (hb_destroy_func_t) _hb_ot_font_destroy);
+                    _hb_ot_font_destroy);
 }
 }
index dc7aa84..d62f24b 100644 (file)
 #define HB_OT_GLYF_TABLE_HH
 
 #include "hb-open-type-private.hh"
 #define HB_OT_GLYF_TABLE_HH
 
 #include "hb-open-type-private.hh"
-
+#include "hb-ot-head-table.hh"
+#include "hb-subset-glyf.hh"
+#include "hb-subset-plan.hh"
+#include "hb-subset-private.hh"
 
 namespace OT {
 
 
 namespace OT {
 
@@ -42,6 +45,8 @@ namespace OT {
 
 struct loca
 {
 
 struct loca
 {
+  friend struct glyf;
+
   static const hb_tag_t tableTag = HB_OT_TAG_loca;
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   static const hb_tag_t tableTag = HB_OT_TAG_loca;
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -50,12 +55,9 @@ struct loca
     return_trace (true);
   }
 
     return_trace (true);
   }
 
-  public:
-  union {
-    USHORT     shortsZ[VAR];           /* Location offset divided by 2. */
-    ULONG      longsZ[VAR];            /* Location offset. */
-  } u;
-  DEFINE_SIZE_ARRAY (0, u.longsZ);
+  protected:
+  HBUINT8              dataX[VAR];             /* Location data. */
+  DEFINE_SIZE_ARRAY (0, dataX);
 };
 
 
 };
 
 
@@ -78,24 +80,391 @@ struct glyf
     return_trace (true);
   }
 
     return_trace (true);
   }
 
-  public:
-  BYTE         dataX[VAR];             /* Glyphs data. */
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *glyf_prime = nullptr;
+    hb_blob_t *loca_prime = nullptr;
 
 
-  DEFINE_SIZE_ARRAY (0, dataX);
-};
+    bool success = true;
+    bool use_short_loca = false;
+    if (hb_subset_glyf_and_loca (plan, &use_short_loca, &glyf_prime, &loca_prime)) {
+      success = success && hb_subset_plan_add_table (plan, HB_OT_TAG_glyf, glyf_prime);
+      success = success && hb_subset_plan_add_table (plan, HB_OT_TAG_loca, loca_prime);
+      success = success && _add_head_and_set_loca_version (plan->source, use_short_loca, plan->dest);
+    } else {
+      success = false;
+    }
+    hb_blob_destroy (loca_prime);
+    hb_blob_destroy (glyf_prime);
 
 
-struct glyfGlyphHeader
-{
-  SHORT                numberOfContours;       /* If the number of contours is
-                                        * greater than or equal to zero,
-                                        * this is a simple glyph; if negative,
-                                        * this is a composite glyph. */
-  FWORD                xMin;                   /* Minimum x for coordinate data. */
-  FWORD                yMin;                   /* Minimum y for coordinate data. */
-  FWORD                xMax;                   /* Maximum x for coordinate data. */
-  FWORD                yMax;                   /* Maximum y for coordinate data. */
-
-  DEFINE_SIZE_STATIC (10);
+    return success;
+  }
+
+  static bool
+  _add_head_and_set_loca_version (hb_face_t *source, bool use_short_loca, hb_face_t *dest)
+  {
+    hb_blob_t *head_blob = OT::Sanitizer<OT::head>().sanitize (hb_face_reference_table (source, HB_OT_TAG_head));
+    hb_blob_t *head_prime_blob = hb_blob_copy_writable_or_fail (head_blob);
+    hb_blob_destroy (head_blob);
+
+    if (unlikely (!head_prime_blob))
+      return false;
+
+    OT::head *head_prime = (OT::head *) hb_blob_get_data_writable (head_prime_blob, nullptr);
+    head_prime->indexToLocFormat.set (use_short_loca ? 0 : 1);
+    bool success = hb_subset_face_add_table (dest, HB_OT_TAG_head, head_prime_blob);
+
+    hb_blob_destroy (head_prime_blob);
+    return success;
+  }
+
+  struct GlyphHeader
+  {
+    HBINT16            numberOfContours;       /* If the number of contours is
+                                                 * greater than or equal to zero,
+                                                 * this is a simple glyph; if negative,
+                                                 * this is a composite glyph. */
+    FWORD              xMin;                   /* Minimum x for coordinate data. */
+    FWORD              yMin;                   /* Minimum y for coordinate data. */
+    FWORD              xMax;                   /* Maximum x for coordinate data. */
+    FWORD              yMax;                   /* Maximum y for coordinate data. */
+
+    DEFINE_SIZE_STATIC (10);
+  };
+
+  struct CompositeGlyphHeader
+  {
+    static const uint16_t ARG_1_AND_2_ARE_WORDS =      0x0001;
+    static const uint16_t ARGS_ARE_XY_VALUES =         0x0002;
+    static const uint16_t ROUND_XY_TO_GRID =           0x0004;
+    static const uint16_t WE_HAVE_A_SCALE =            0x0008;
+    static const uint16_t MORE_COMPONENTS =            0x0020;
+    static const uint16_t WE_HAVE_AN_X_AND_Y_SCALE =   0x0040;
+    static const uint16_t WE_HAVE_A_TWO_BY_TWO =       0x0080;
+    static const uint16_t WE_HAVE_INSTRUCTIONS =       0x0100;
+    static const uint16_t USE_MY_METRICS =             0x0200;
+    static const uint16_t OVERLAP_COMPOUND =           0x0400;
+    static const uint16_t SCALED_COMPONENT_OFFSET =    0x0800;
+    static const uint16_t UNSCALED_COMPONENT_OFFSET =  0x1000;
+
+    HBUINT16 flags;
+    HBUINT16 glyphIndex;
+
+    inline unsigned int get_size (void) const
+    {
+      unsigned int size = min_size;
+      if (flags & ARG_1_AND_2_ARE_WORDS) {
+        // arg1 and 2 are int16
+        size += 4;
+      } else {
+        // arg1 and 2 are int8
+        size += 2;
+      }
+      if (flags & WE_HAVE_A_SCALE) {
+        // One x 16 bit (scale)
+        size += 2;
+      } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
+        // Two x 16 bit (xscale, yscale)
+        size += 4;
+      } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
+        // Four x 16 bit (xscale, scale01, scale10, yscale)
+        size += 8;
+      }
+      return size;
+    }
+
+    struct Iterator
+    {
+      const char *glyph_start;
+      const char *glyph_end;
+      const CompositeGlyphHeader *current;
+
+      inline bool move_to_next ()
+      {
+       if (current->flags & CompositeGlyphHeader::MORE_COMPONENTS)
+       {
+         const CompositeGlyphHeader *possible =
+           &StructAfter<CompositeGlyphHeader, CompositeGlyphHeader> (*current);
+         if (!in_range (possible))
+           return false;
+         current = possible;
+         return true;
+       }
+       return false;
+      }
+
+      inline bool in_range (const CompositeGlyphHeader *composite) const
+      {
+       return (const char *) composite >= glyph_start
+         && ((const char *) composite + CompositeGlyphHeader::min_size) <= glyph_end
+         && ((const char *) composite + composite->get_size()) <= glyph_end;
+      }
+    };
+
+    static inline bool get_iterator (const char * glyph_data,
+                                    unsigned int length,
+                                    CompositeGlyphHeader::Iterator *iterator /* OUT */)
+    {
+      if (length < GlyphHeader::static_size)
+       return false; /* Empty glyph; zero extents. */
+
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyph_data, 0);
+      if (glyph_header.numberOfContours < 0)
+      {
+        const CompositeGlyphHeader *possible =
+         &StructAfter<CompositeGlyphHeader, GlyphHeader> (glyph_header);
+
+       iterator->glyph_start = glyph_data;
+       iterator->glyph_end = (const char *) glyph_data + length;
+       if (!iterator->in_range (possible))
+          return false;
+        iterator->current = possible;
+        return true;
+      }
+
+      return false;
+    }
+
+    DEFINE_SIZE_MIN (4);
+  };
+
+  struct accelerator_t
+  {
+    inline void init (hb_face_t *face)
+    {
+      hb_blob_t *head_blob = Sanitizer<head>().sanitize (face->reference_table (HB_OT_TAG_head));
+      const head *head_table = Sanitizer<head>::lock_instance (head_blob);
+      if ((unsigned int) head_table->indexToLocFormat > 1 || head_table->glyphDataFormat != 0)
+      {
+       /* Unknown format.  Leave num_glyphs=0, that takes care of disabling us. */
+       hb_blob_destroy (head_blob);
+       return;
+      }
+      short_offset = 0 == head_table->indexToLocFormat;
+      hb_blob_destroy (head_blob);
+
+      loca_blob = Sanitizer<loca>().sanitize (face->reference_table (HB_OT_TAG_loca));
+      loca_table = Sanitizer<loca>::lock_instance (loca_blob);
+      glyf_blob = Sanitizer<glyf>().sanitize (face->reference_table (HB_OT_TAG_glyf));
+      glyf_table = Sanitizer<glyf>::lock_instance (glyf_blob);
+
+      num_glyphs = MAX (1u, hb_blob_get_length (loca_blob) / (short_offset ? 2 : 4)) - 1;
+      glyf_len = hb_blob_get_length (glyf_blob);
+    }
+
+    inline void fini (void)
+    {
+      hb_blob_destroy (loca_blob);
+      hb_blob_destroy (glyf_blob);
+    }
+
+    /*
+     * Returns true if the referenced glyph is a valid glyph and a composite glyph.
+     * If true is returned a pointer to the composite glyph will be written into
+     * composite.
+     */
+    inline bool get_composite (hb_codepoint_t glyph,
+                              CompositeGlyphHeader::Iterator *composite /* OUT */) const
+    {
+      unsigned int start_offset, end_offset;
+      if (!get_offsets (glyph, &start_offset, &end_offset))
+        return false; /* glyph not found */
+
+      return CompositeGlyphHeader::get_iterator ((const char*) this->glyf_table + start_offset,
+                                                end_offset - start_offset,
+                                                composite);
+    }
+
+    /* based on FontTools _g_l_y_f.py::trim */
+    inline bool remove_padding(unsigned int start_offset,
+                               unsigned int *end_offset) const
+    {
+      static const int FLAG_X_SHORT = 0x02;
+      static const int FLAG_Y_SHORT = 0x04;
+      static const int FLAG_REPEAT = 0x08;
+      static const int FLAG_X_SAME = 0x10;
+      static const int FLAG_Y_SAME = 0x20;
+
+      if (*end_offset - start_offset < GlyphHeader::static_size)
+        return true;
+
+      const char *glyph = ((const char *) glyf_table) + start_offset;
+      const char * const glyph_end = glyph + (*end_offset - start_offset);
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyph, 0);
+      int16_t num_contours = (int16_t) glyph_header.numberOfContours;
+
+      if (num_contours < 0)
+        /* Trimming for composites not implemented.
+         * If removing hints it falls out of that. */
+        return true;
+      else if (num_contours > 0)
+      {
+        /* simple glyph w/contours, possibly trimmable */
+        glyph += GlyphHeader::static_size + 2 * num_contours;
+
+        if (unlikely (glyph + 2 >= glyph_end)) return false;
+        uint16_t nCoordinates = (uint16_t) StructAtOffset<HBUINT16>(glyph - 2, 0) + 1;
+        uint16_t nInstructions = (uint16_t) StructAtOffset<HBUINT16>(glyph, 0);
+
+        glyph += 2 + nInstructions;
+        if (unlikely (glyph + 2 >= glyph_end)) return false;
+
+        unsigned int coordBytes = 0;
+        unsigned int coordsWithFlags = 0;
+        while (glyph < glyph_end)
+        {
+          uint8_t flag = (uint8_t) *glyph;
+          glyph++;
+
+          unsigned int repeat = 1;
+          if (flag & FLAG_REPEAT)
+          {
+            if (glyph >= glyph_end)
+            {
+              DEBUG_MSG(SUBSET, nullptr, "Bad flag");
+              return false;
+            }
+            repeat = ((uint8_t) *glyph) + 1;
+            glyph++;
+          }
+
+          unsigned int xBytes, yBytes;
+          xBytes = yBytes = 0;
+          if (flag & FLAG_X_SHORT)
+            xBytes = 1;
+          else if ((flag & FLAG_X_SAME) == 0)
+            xBytes = 2;
+
+          if (flag & FLAG_Y_SHORT)
+            yBytes = 1;
+          else if ((flag & FLAG_Y_SAME) == 0)
+            yBytes = 2;
+
+          coordBytes += (xBytes + yBytes) * repeat;
+          coordsWithFlags += repeat;
+          if (coordsWithFlags >= nCoordinates)
+            break;
+        }
+
+        if (coordsWithFlags != nCoordinates)
+        {
+          DEBUG_MSG(SUBSET, nullptr, "Expect %d coords to have flags, got flags for %d", nCoordinates, coordsWithFlags);
+          return false;
+        }
+        glyph += coordBytes;
+
+        if (glyph < glyph_end)
+          *end_offset -= glyph_end - glyph;
+      }
+      return true;
+    }
+
+    inline bool get_offsets (hb_codepoint_t  glyph,
+                             unsigned int   *start_offset /* OUT */,
+                             unsigned int   *end_offset   /* OUT */) const
+    {
+      if (unlikely (glyph >= num_glyphs))
+       return false;
+
+      if (short_offset)
+      {
+        const HBUINT16 *offsets = (const HBUINT16 *) loca_table->dataX;
+       *start_offset = 2 * offsets[glyph];
+       *end_offset   = 2 * offsets[glyph + 1];
+      }
+      else
+      {
+        const HBUINT32 *offsets = (const HBUINT32 *) loca_table->dataX;
+
+       *start_offset = offsets[glyph];
+       *end_offset   = offsets[glyph + 1];
+      }
+
+      if (*start_offset > *end_offset || *end_offset > glyf_len)
+       return false;
+
+      return true;
+    }
+
+    inline bool get_instruction_offsets(unsigned int start_offset,
+                                        unsigned int end_offset,
+                                        unsigned int *instruction_start /* OUT */,
+                                        unsigned int *instruction_end /* OUT */) const
+    {
+      if (end_offset - start_offset < GlyphHeader::static_size)
+      {
+        *instruction_start = 0;
+        *instruction_end = 0;
+        return true; /* Empty glyph; no instructions. */
+      }
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyf_table, start_offset);
+      int16_t num_contours = (int16_t) glyph_header.numberOfContours;
+      if (num_contours < 0)
+      {
+        CompositeGlyphHeader::Iterator composite_it;
+        if (unlikely (!CompositeGlyphHeader::get_iterator (
+            (const char*) this->glyf_table + start_offset,
+             end_offset - start_offset, &composite_it))) return false;
+        const CompositeGlyphHeader *last;
+        do {
+          last = composite_it.current;
+        } while (composite_it.move_to_next());
+
+        if ( (uint16_t) last->flags & CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS)
+          *instruction_start = ((char *) last - (char *) glyf_table->dataX) + last->get_size();
+        else
+          *instruction_start = end_offset;
+        *instruction_end = end_offset;
+        if (unlikely (*instruction_start > *instruction_end))
+        {
+          DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside [%d, %d]", *instruction_start, start_offset, end_offset);
+          return false;
+        }
+      }
+      else
+      {
+        unsigned int instruction_length_offset = start_offset + GlyphHeader::static_size + 2 * num_contours;
+        const HBUINT16 &instruction_length = StructAtOffset<HBUINT16> (glyf_table, instruction_length_offset);
+        *instruction_start = instruction_length_offset + 2;
+        *instruction_end = *instruction_start + (uint16_t) instruction_length;
+      }
+      return true;
+    }
+
+    inline bool get_extents (hb_codepoint_t glyph,
+                            hb_glyph_extents_t *extents) const
+    {
+      unsigned int start_offset, end_offset;
+      if (!get_offsets (glyph, &start_offset, &end_offset))
+        return false;
+
+      if (end_offset - start_offset < GlyphHeader::static_size)
+       return true; /* Empty glyph; zero extents. */
+
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyf_table, start_offset);
+
+      extents->x_bearing = MIN (glyph_header.xMin, glyph_header.xMax);
+      extents->y_bearing = MAX (glyph_header.yMin, glyph_header.yMax);
+      extents->width     = MAX (glyph_header.xMin, glyph_header.xMax) - extents->x_bearing;
+      extents->height    = MIN (glyph_header.yMin, glyph_header.yMax) - extents->y_bearing;
+
+      return true;
+    }
+
+    private:
+    bool short_offset;
+    unsigned int num_glyphs;
+    const loca *loca_table;
+    const glyf *glyf_table;
+    hb_blob_t *loca_blob;
+    hb_blob_t *glyf_blob;
+    unsigned int glyf_len;
+  };
+
+  protected:
+  HBUINT8              dataX[VAR];             /* Glyphs data. */
+
+  DEFINE_SIZE_ARRAY (0, dataX);
 };
 
 } /* namespace OT */
 };
 
 } /* namespace OT */
diff --git a/src/hb-ot-hdmx-table.hh b/src/hb-ot-hdmx-table.hh
new file mode 100644 (file)
index 0000000..f08fe39
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#ifndef HB_OT_HDMX_TABLE_HH
+#define HB_OT_HDMX_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+namespace OT {
+
+
+/*
+ * hdmx - Horizontal Device Metric
+ */
+
+#define HB_OT_TAG_hdmx HB_TAG('h','d','m','x')
+
+struct DeviceRecord
+{
+  struct SubsetView
+  {
+    const DeviceRecord *source_device_record;
+    hb_subset_plan_t *subset_plan;
+
+    inline void init(const DeviceRecord *source_device_record,
+                    hb_subset_plan_t   *subset_plan)
+    {
+      this->source_device_record = source_device_record;
+      this->subset_plan = subset_plan;
+    }
+
+    inline unsigned int len () const
+    {
+      return this->subset_plan->gids_to_retain_sorted.len;
+    }
+
+    inline const HBUINT8& operator [] (unsigned int i) const
+    {
+      if (unlikely (i >= len())) return Null(HBUINT8);
+      hb_codepoint_t gid = this->subset_plan->gids_to_retain_sorted [i];
+      return this->source_device_record->widths[gid];
+    }
+  };
+
+  static inline unsigned int get_size (unsigned int count)
+  {
+    unsigned int raw_size = min_size + count * HBUINT8::static_size;
+    if (raw_size % 4)
+      /* Align to 32 bits */
+      return raw_size + (4 - (raw_size % 4));
+    return raw_size;
+  }
+
+  inline bool serialize (hb_serialize_context_t *c, const SubsetView &subset_view)
+  {
+    TRACE_SERIALIZE (this);
+
+    if (unlikely (!c->allocate_size<DeviceRecord> (get_size (subset_view.len()))))
+      return_trace (false);
+
+    this->pixel_size.set (subset_view.source_device_record->pixel_size);
+    this->max_width.set (subset_view.source_device_record->max_width);
+
+    for (unsigned int i = 0; i < subset_view.len(); i++)
+      widths[i].set (subset_view[i]);
+
+    return_trace (true);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int size_device_record) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+                         c->check_range (this, size_device_record)));
+  }
+
+  HBUINT8 pixel_size;   /* Pixel size for following widths (as ppem). */
+  HBUINT8 max_width;    /* Maximum width. */
+  HBUINT8 widths[VAR];  /* Array of widths (numGlyphs is from the 'maxp' table). */
+  public:
+  DEFINE_SIZE_ARRAY (2, widths);
+};
+
+
+struct hdmx
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_hdmx;
+
+  inline unsigned int get_size (void) const
+  {
+    return min_size + num_records * size_device_record;
+  }
+
+  inline const DeviceRecord& operator [] (unsigned int i) const
+  {
+    if (unlikely (i >= num_records)) return Null(DeviceRecord);
+    return StructAtOffset<DeviceRecord> (this, min_size + i * size_device_record);
+  }
+
+  inline bool serialize (hb_serialize_context_t *c, const hdmx *source_hdmx, hb_subset_plan_t *plan)
+  {
+    TRACE_SERIALIZE (this);
+
+    if (unlikely (!c->extend_min ((*this))))  return_trace (false);
+
+    this->version.set (source_hdmx->version);
+    this->num_records.set (source_hdmx->num_records);
+    this->size_device_record.set (DeviceRecord::get_size (plan->gids_to_retain_sorted.len));
+
+    for (unsigned int i = 0; i < source_hdmx->num_records; i++)
+    {
+      DeviceRecord::SubsetView subset_view;
+      subset_view.init (&(*source_hdmx)[i], plan);
+
+      c->start_embed<DeviceRecord> ()->serialize (c, subset_view);
+    }
+
+    return_trace (true);
+  }
+
+  static inline size_t get_subsetted_size (hb_subset_plan_t *plan)
+  {
+    return min_size + DeviceRecord::get_size (plan->gids_to_retain_sorted.len);
+  }
+
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    size_t dest_size = get_subsetted_size (plan);
+    hdmx *dest = (hdmx *) malloc (dest_size);
+    if (unlikely (!dest))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for hdmx subset output.", (unsigned long) dest_size);
+      return false;
+    }
+
+    hb_serialize_context_t c (dest, dest_size);
+    hdmx *hdmx_prime = c.start_serialize<hdmx> ();
+    if (!hdmx_prime || !hdmx_prime->serialize (&c, this, plan)) {
+      free (dest);
+      return false;
+    }
+    c.end_serialize ();
+
+    hb_blob_t *hdmx_prime_blob = hb_blob_create ((const char *) dest,
+                                                dest_size,
+                                                HB_MEMORY_MODE_READONLY,
+                                                dest,
+                                                free);
+    bool result = hb_subset_plan_add_table (plan, HB_OT_TAG_hdmx, hdmx_prime_blob);
+    hb_blob_destroy (hdmx_prime_blob);
+
+    return result;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && version == 0 &&
+                 !_hb_unsigned_int_mul_overflows (num_records, size_device_record) &&
+                 c->check_range (this, get_size()));
+  }
+
+  protected:
+  HBUINT16     version;                /* Table version number (0) */
+  HBUINT16     num_records;            /* Number of device records. */
+  HBUINT32     size_device_record;     /* Size of a device record, 32-bit aligned. */
+  HBUINT8      data[VAR];              /* Array of device records. */
+  public:
+  DEFINE_SIZE_ARRAY (8, data);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_HDMX_TABLE_HH */
index 9c3e51e..1d45840 100644 (file)
@@ -43,6 +43,8 @@ namespace OT {
 
 struct head
 {
 
 struct head
 {
+  friend struct OffsetTable;
+
   static const hb_tag_t tableTag       = HB_OT_TAG_head;
 
   inline unsigned int get_upem (void) const
   static const hb_tag_t tableTag       = HB_OT_TAG_head;
 
   inline unsigned int get_upem (void) const
@@ -64,11 +66,11 @@ struct head
   FixedVersion<>version;               /* Version of the head table--currently
                                         * 0x00010000u for version 1.0. */
   FixedVersion<>fontRevision;          /* Set by font manufacturer. */
   FixedVersion<>version;               /* Version of the head table--currently
                                         * 0x00010000u for version 1.0. */
   FixedVersion<>fontRevision;          /* Set by font manufacturer. */
-  ULONG                checkSumAdjustment;     /* To compute: set it to 0, sum the
-                                        * entire font as ULONG, then store
+  HBUINT32     checkSumAdjustment;     /* To compute: set it to 0, sum the
+                                        * entire font as HBUINT32, then store
                                         * 0xB1B0AFBAu - sum. */
                                         * 0xB1B0AFBAu - sum. */
-  ULONG                magicNumber;            /* Set to 0x5F0F3CF5u. */
-  USHORT       flags;                  /* Bit 0: Baseline for font at y=0;
+  HBUINT32     magicNumber;            /* Set to 0x5F0F3CF5u. */
+  HBUINT16     flags;                  /* Bit 0: Baseline for font at y=0;
                                         * Bit 1: Left sidebearing point at x=0;
                                         * Bit 2: Instructions may depend on point size;
                                         * Bit 3: Force ppem to integer values for all
                                         * Bit 1: Left sidebearing point at x=0;
                                         * Bit 2: Instructions may depend on point size;
                                         * Bit 3: Force ppem to integer values for all
@@ -76,7 +78,6 @@ struct head
                                         *   ppem sizes if this bit is clear;
                                         * Bit 4: Instructions may alter advance width
                                         *   (the advance widths might not scale linearly);
                                         *   ppem sizes if this bit is clear;
                                         * Bit 4: Instructions may alter advance width
                                         *   (the advance widths might not scale linearly);
-
                                         * Bits 5-10: These should be set according to
                                         *   Apple's specification. However, they are not
                                         *   implemented in OpenType.
                                         * Bits 5-10: These should be set according to
                                         *   Apple's specification. However, they are not
                                         *   implemented in OpenType.
@@ -96,7 +97,6 @@ struct head
                                         *   contains any strong right-to-left glyphs.
                                         * Bit 10: This bit should be set if the font
                                         *   contains Indic-style rearrangement effects.
                                         *   contains any strong right-to-left glyphs.
                                         * Bit 10: This bit should be set if the font
                                         *   contains Indic-style rearrangement effects.
-
                                         * Bit 11: Font data is 'lossless,' as a result
                                         *   of having been compressed and decompressed
                                         *   with the Agfa MicroType Express engine.
                                         * Bit 11: Font data is 'lossless,' as a result
                                         *   of having been compressed and decompressed
                                         *   with the Agfa MicroType Express engine.
@@ -114,18 +114,18 @@ struct head
                                         * encoded in the cmap subtables represent proper
                                         * support for those code points.
                                         * Bit 15: Reserved, set to 0. */
                                         * encoded in the cmap subtables represent proper
                                         * support for those code points.
                                         * Bit 15: Reserved, set to 0. */
-  USHORT       unitsPerEm;             /* Valid range is from 16 to 16384. This value
+  HBUINT16     unitsPerEm;             /* Valid range is from 16 to 16384. This value
                                         * should be a power of 2 for fonts that have
                                         * TrueType outlines. */
   LONGDATETIME created;                /* Number of seconds since 12:00 midnight,
                                           January 1, 1904. 64-bit integer */
   LONGDATETIME modified;               /* Number of seconds since 12:00 midnight,
                                           January 1, 1904. 64-bit integer */
                                         * should be a power of 2 for fonts that have
                                         * TrueType outlines. */
   LONGDATETIME created;                /* Number of seconds since 12:00 midnight,
                                           January 1, 1904. 64-bit integer */
   LONGDATETIME modified;               /* Number of seconds since 12:00 midnight,
                                           January 1, 1904. 64-bit integer */
-  SHORT                xMin;                   /* For all glyph bounding boxes. */
-  SHORT                yMin;                   /* For all glyph bounding boxes. */
-  SHORT                xMax;                   /* For all glyph bounding boxes. */
-  SHORT                yMax;                   /* For all glyph bounding boxes. */
-  USHORT       macStyle;               /* Bit 0: Bold (if set to 1);
+  HBINT16      xMin;                   /* For all glyph bounding boxes. */
+  HBINT16      yMin;                   /* For all glyph bounding boxes. */
+  HBINT16      xMax;                   /* For all glyph bounding boxes. */
+  HBINT16      yMax;                   /* For all glyph bounding boxes. */
+  HBUINT16     macStyle;               /* Bit 0: Bold (if set to 1);
                                         * Bit 1: Italic (if set to 1)
                                         * Bit 2: Underline (if set to 1)
                                         * Bit 3: Outline (if set to 1)
                                         * Bit 1: Italic (if set to 1)
                                         * Bit 2: Underline (if set to 1)
                                         * Bit 3: Outline (if set to 1)
@@ -133,16 +133,16 @@ struct head
                                         * Bit 5: Condensed (if set to 1)
                                         * Bit 6: Extended (if set to 1)
                                         * Bits 7-15: Reserved (set to 0). */
                                         * Bit 5: Condensed (if set to 1)
                                         * Bit 6: Extended (if set to 1)
                                         * Bits 7-15: Reserved (set to 0). */
-  USHORT       lowestRecPPEM;          /* Smallest readable size in pixels. */
-  SHORT                fontDirectionHint;      /* Deprecated (Set to 2).
+  HBUINT16     lowestRecPPEM;          /* Smallest readable size in pixels. */
+  HBINT16      fontDirectionHint;      /* Deprecated (Set to 2).
                                         * 0: Fully mixed directional glyphs;
                                         * 1: Only strongly left to right;
                                         * 2: Like 1 but also contains neutrals;
                                         * -1: Only strongly right to left;
                                         * -2: Like -1 but also contains neutrals. */
   public:
                                         * 0: Fully mixed directional glyphs;
                                         * 1: Only strongly left to right;
                                         * 2: Like 1 but also contains neutrals;
                                         * -1: Only strongly right to left;
                                         * -2: Like -1 but also contains neutrals. */
   public:
-  SHORT                indexToLocFormat;       /* 0 for short offsets, 1 for long. */
-  SHORT                glyphDataFormat;        /* 0 for current format. */
+  HBINT16      indexToLocFormat;       /* 0 for short offsets, 1 for long. */
+  HBINT16      glyphDataFormat;        /* 0 for current format. */
 
   DEFINE_SIZE_STATIC (54);
 };
 
   DEFINE_SIZE_STATIC (54);
 };
index c8e9536..97952b4 100644 (file)
@@ -41,14 +41,9 @@ namespace OT {
 #define HB_OT_TAG_hhea HB_TAG('h','h','e','a')
 #define HB_OT_TAG_vhea HB_TAG('v','h','e','a')
 
 #define HB_OT_TAG_hhea HB_TAG('h','h','e','a')
 #define HB_OT_TAG_vhea HB_TAG('v','h','e','a')
 
-
+template <typename T>
 struct _hea
 {
 struct _hea
 {
-  static const hb_tag_t tableTag = HB_TAG('_','h','e','a');
-
-  static const hb_tag_t hheaTag        = HB_OT_TAG_hhea;
-  static const hb_tag_t vheaTag        = HB_OT_TAG_vhea;
-
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -69,30 +64,30 @@ struct _hea
                                         * (xMax - xMin)) for horizontal. */
   FWORD                maxExtent;              /* horizontal: Max(lsb + (xMax - xMin)),
                                         * vertical: minLeadingBearing+(yMax-yMin). */
                                         * (xMax - xMin)) for horizontal. */
   FWORD                maxExtent;              /* horizontal: Max(lsb + (xMax - xMin)),
                                         * vertical: minLeadingBearing+(yMax-yMin). */
-  SHORT                caretSlopeRise;         /* Used to calculate the slope of the
+  HBINT16              caretSlopeRise;         /* Used to calculate the slope of the
                                         * cursor (rise/run); 1 for vertical caret,
                                         * 0 for horizontal.*/
                                         * cursor (rise/run); 1 for vertical caret,
                                         * 0 for horizontal.*/
-  SHORT                caretSlopeRun;          /* 0 for vertical caret, 1 for horizontal. */
-  SHORT                caretOffset;            /* The amount by which a slanted
+  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. */
                                         * highlight on a glyph needs
                                         * to be shifted to produce the
                                         * best appearance. Set to 0 for
                                         * non-slanted fonts. */
-  SHORT                reserved1;              /* Set to 0. */
-  SHORT                reserved2;              /* Set to 0. */
-  SHORT                reserved3;              /* Set to 0. */
-  SHORT                reserved4;              /* Set to 0. */
-  SHORT                metricDataFormat;       /* 0 for current format. */
-  USHORT       numberOfLongMetrics;    /* Number of LongMetric entries in metric
+  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);
 };
 
                                         * table. */
   public:
   DEFINE_SIZE_STATIC (36);
 };
 
-struct hhea : _hea {
+struct hhea : _hea<hhea> {
   static const hb_tag_t tableTag       = HB_OT_TAG_hhea;
 };
   static const hb_tag_t tableTag       = HB_OT_TAG_hhea;
 };
-struct vhea : _hea {
+struct vhea : _hea<vhea> {
   static const hb_tag_t tableTag       = HB_OT_TAG_vhea;
 };
 
   static const hb_tag_t tableTag       = HB_OT_TAG_vhea;
 };
 
index 30aa625..3cd48a6 100644 (file)
  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
- * Google Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod, Roderick Sheeter
  */
 
 #ifndef HB_OT_HMTX_TABLE_HH
 #define HB_OT_HMTX_TABLE_HH
 
 #include "hb-open-type-private.hh"
  */
 
 #ifndef HB_OT_HMTX_TABLE_HH
 #define HB_OT_HMTX_TABLE_HH
 
 #include "hb-open-type-private.hh"
+#include "hb-ot-hhea-table.hh"
+#include "hb-ot-os2-table.hh"
+#include "hb-ot-var-hvar-table.hh"
 
 
 namespace OT {
 
 
 namespace OT {
@@ -50,11 +53,9 @@ struct LongMetric
   DEFINE_SIZE_STATIC (4);
 };
 
   DEFINE_SIZE_STATIC (4);
 };
 
+template <typename T, typename H>
 struct hmtxvmtx
 {
 struct hmtxvmtx
 {
-  static const hb_tag_t hmtxTag        = HB_OT_TAG_hmtx;
-  static const hb_tag_t vmtxTag        = HB_OT_TAG_vmtx;
-
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -63,7 +64,228 @@ struct hmtxvmtx
     return_trace (true);
   }
 
     return_trace (true);
   }
 
-  public:
+
+  inline bool subset_update_header (hb_subset_plan_t *plan,
+                                    unsigned int num_hmetrics) const
+  {
+    hb_blob_t *src_blob = OT::Sanitizer<H> ().sanitize (plan->source->reference_table (H::tableTag));
+    hb_blob_t *dest_blob = hb_blob_copy_writable_or_fail(src_blob);
+    hb_blob_destroy (src_blob);
+
+    if (unlikely (!dest_blob)) {
+      return false;
+    }
+
+    unsigned int length;
+    H *table = (H *) hb_blob_get_data (dest_blob, &length);
+    table->numberOfLongMetrics.set (num_hmetrics);
+
+    bool result = hb_subset_plan_add_table (plan, H::tableTag, dest_blob);
+    hb_blob_destroy (dest_blob);
+
+    return result;
+  }
+
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    typename T::accelerator_t _mtx;
+    _mtx.init (plan->source);
+
+    /* All the trailing glyphs with the same advance can use one LongMetric
+     * and just keep LSB */
+    hb_prealloced_array_t<hb_codepoint_t> &gids = plan->gids_to_retain_sorted;
+    unsigned int num_advances = gids.len;
+    unsigned int last_advance = _mtx.get_advance (gids[num_advances - 1]);
+    while (num_advances > 1
+        && last_advance == _mtx.get_advance (gids[num_advances - 2]))
+    {
+      num_advances--;
+    }
+
+    /* alloc the new table */
+    size_t dest_sz = num_advances * 4
+                  + (gids.len - num_advances) * 2;
+    void *dest = (void *) malloc (dest_sz);
+    if (unlikely (!dest))
+    {
+      return false;
+    }
+    DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in src has %d advances, %d lsbs", HB_UNTAG(T::tableTag), _mtx.num_advances, _mtx.num_metrics - _mtx.num_advances);
+    DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in dest has %d advances, %d lsbs, %u bytes", HB_UNTAG(T::tableTag), num_advances, gids.len - num_advances, (unsigned int) dest_sz);
+
+    const char *source_table = hb_blob_get_data (_mtx.blob, nullptr);
+    // Copy everything over
+    LongMetric * old_metrics = (LongMetric *) source_table;
+    FWORD *lsbs = (FWORD *) (old_metrics + _mtx.num_advances);
+    char * dest_pos = (char *) dest;
+    for (unsigned int i = 0; i < gids.len; i++)
+    {
+      /* the last metric or the one for gids[i] */
+      LongMetric *src_metric = old_metrics + MIN ((hb_codepoint_t) _mtx.num_advances - 1, gids[i]);
+      if (gids[i] < _mtx.num_advances)
+      {
+        /* src is a LongMetric */
+        if (i < num_advances)
+        {
+          /* dest is a LongMetric, copy it */
+          *((LongMetric *) dest_pos) = *src_metric;
+        }
+        else
+        {
+          /* dest just lsb */
+          *((FWORD *) dest_pos) = src_metric->lsb;
+        }
+      }
+      else
+      {
+        FWORD src_lsb = *(lsbs + gids[i] - _mtx.num_advances);
+        if (i < num_advances)
+        {
+          /* dest needs a full LongMetric */
+          LongMetric *metric = (LongMetric *)dest_pos;
+          metric->advance = src_metric->advance;
+          metric->lsb = src_lsb;
+        }
+        else
+        {
+          /* dest just needs an lsb */
+          *((FWORD *) dest_pos) = src_lsb;
+        }
+      }
+      dest_pos += (i < num_advances ? 4 : 2);
+    }
+    _mtx.fini ();
+
+    // Amend header num hmetrics
+    if (unlikely (!subset_update_header (plan, num_advances)))
+    {
+      free (dest);
+      return false;
+    }
+
+    hb_blob_t *result = hb_blob_create ((const char *)dest,
+                                        dest_sz,
+                                        HB_MEMORY_MODE_READONLY,
+                                        dest,
+                                        free);
+    bool success = hb_subset_plan_add_table (plan, T::tableTag, result);
+    hb_blob_destroy (result);
+    return success;
+  }
+
+  struct accelerator_t
+  {
+    friend struct hmtxvmtx;
+
+    inline void init (hb_face_t *face,
+                     unsigned int default_advance_ = 0)
+    {
+      default_advance = default_advance_ ? default_advance_ : hb_face_get_upem (face);
+
+      bool got_font_extents = false;
+      if (T::os2Tag)
+      {
+       hb_blob_t *os2_blob = Sanitizer<os2> ().sanitize (face->reference_table (T::os2Tag));
+       const os2 *os2_table = Sanitizer<os2>::lock_instance (os2_blob);
+#define USE_TYPO_METRICS (1u<<7)
+       if (0 != (os2_table->fsSelection & USE_TYPO_METRICS))
+       {
+         ascender = os2_table->sTypoAscender;
+         descender = os2_table->sTypoDescender;
+         line_gap = os2_table->sTypoLineGap;
+         got_font_extents = (ascender | descender) != 0;
+       }
+       hb_blob_destroy (os2_blob);
+      }
+
+      hb_blob_t *_hea_blob = Sanitizer<H> ().sanitize (face->reference_table (H::tableTag));
+      const H *_hea_table = Sanitizer<H>::lock_instance (_hea_blob);
+      num_advances = _hea_table->numberOfLongMetrics;
+      if (!got_font_extents)
+      {
+       ascender = _hea_table->ascender;
+       descender = _hea_table->descender;
+       line_gap = _hea_table->lineGap;
+       got_font_extents = (ascender | descender) != 0;
+      }
+      hb_blob_destroy (_hea_blob);
+
+      has_font_extents = got_font_extents;
+
+      blob = Sanitizer<hmtxvmtx> ().sanitize (face->reference_table (T::tableTag));
+
+      /* Cap num_metrics() and num_advances() based on table length. */
+      unsigned int len = hb_blob_get_length (blob);
+      if (unlikely (num_advances * 4 > len))
+       num_advances = len / 4;
+      num_metrics = num_advances + (len - 4 * num_advances) / 2;
+
+      /* We MUST set num_metrics to zero if num_advances is zero.
+       * Our get_advance() depends on that. */
+      if (unlikely (!num_advances))
+      {
+       num_metrics = num_advances = 0;
+       hb_blob_destroy (blob);
+       blob = hb_blob_get_empty ();
+      }
+      table = Sanitizer<hmtxvmtx>::lock_instance (blob);
+
+      var_blob = Sanitizer<HVARVVAR> ().sanitize (face->reference_table (T::variationsTag));
+      var_table = Sanitizer<HVARVVAR>::lock_instance (var_blob);
+    }
+
+    inline void fini (void)
+    {
+      hb_blob_destroy (blob);
+      hb_blob_destroy (var_blob);
+    }
+
+    inline unsigned int get_advance (hb_codepoint_t  glyph) const
+    {
+      if (unlikely (glyph >= num_metrics))
+      {
+        /* If num_metrics is zero, it means we don't have the metrics table
+         * for this direction: return default advance.  Otherwise, it means that the
+         * glyph index is out of bound: return zero. */
+        if (num_metrics)
+          return 0;
+        else
+          return default_advance;
+      }
+
+      return table->longMetric[MIN (glyph, (uint32_t) num_advances - 1)].advance;
+    }
+
+    inline unsigned int get_advance (hb_codepoint_t  glyph,
+                                     hb_font_t      *font) const
+    {
+      unsigned int advance = get_advance (glyph);
+      if (likely(glyph < num_metrics))
+      {
+        advance += (font->num_coords ? var_table->get_advance_var (glyph, font->coords, font->num_coords) : 0); // TODO Optimize?!
+      }
+      return advance;          
+    }
+
+    public:
+    bool has_font_extents;
+    unsigned short ascender;
+    unsigned short descender;
+    unsigned short line_gap;
+
+    protected:
+    unsigned int num_metrics;
+    unsigned int num_advances;
+    unsigned int default_advance;
+
+    private:
+    const hmtxvmtx *table;
+    hb_blob_t *blob;
+    const HVARVVAR *var_table;
+    hb_blob_t *var_blob;
+  };
+
+  protected:
   LongMetric   longMetric[VAR];        /* Paired advance width and leading
                                         * bearing values for each glyph. The
                                         * value numOfHMetrics comes from
   LongMetric   longMetric[VAR];        /* Paired advance width and leading
                                         * bearing values for each glyph. The
                                         * value numOfHMetrics comes from
@@ -72,7 +294,7 @@ struct hmtxvmtx
                                         * be in the array, but that entry is
                                         * required. The last entry applies to
                                         * all subsequent glyphs. */
                                         * be in the array, but that entry is
                                         * required. The last entry applies to
                                         * all subsequent glyphs. */
-  FWORD                leadingBearingX[VAR];   /* Here the advance is assumed
+/*FWORD                leadingBearingX[VAR];*/ /* 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
                                         * to be the same as the advance
                                         * for the last entry above. The
                                         * number of entries in this array is
@@ -86,14 +308,18 @@ struct hmtxvmtx
                                         * font to vary the side bearing
                                         * values for each glyph. */
   public:
                                         * font to vary the side bearing
                                         * values for each glyph. */
   public:
-  DEFINE_SIZE_ARRAY2 (0, longMetric, leadingBearingX);
+  DEFINE_SIZE_ARRAY (0, longMetric);
 };
 
 };
 
-struct hmtx : hmtxvmtx {
+struct hmtx : hmtxvmtx<hmtx, hhea> {
   static const hb_tag_t tableTag       = HB_OT_TAG_hmtx;
   static const hb_tag_t tableTag       = HB_OT_TAG_hmtx;
+  static const hb_tag_t variationsTag  = HB_OT_TAG_HVAR;
+  static const hb_tag_t os2Tag         = HB_OT_TAG_os2;
 };
 };
-struct vmtx : hmtxvmtx {
+struct vmtx : hmtxvmtx<vmtx, vhea> {
   static const hb_tag_t tableTag       = HB_OT_TAG_vmtx;
   static const hb_tag_t tableTag       = HB_OT_TAG_vmtx;
+  static const hb_tag_t variationsTag  = HB_OT_TAG_VVAR;
+  static const hb_tag_t os2Tag         = HB_TAG_NONE;
 };
 
 } /* namespace OT */
 };
 
 } /* namespace OT */
diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh
new file mode 100644 (file)
index 0000000..368f547
--- /dev/null
@@ -0,0 +1,394 @@
+/*
+ * Copyright © 2017  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_KERN_TABLE_HH
+#define HB_OT_KERN_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+namespace OT {
+
+
+/*
+ * kern -- Kerning
+ */
+
+#define HB_OT_TAG_kern HB_TAG('k','e','r','n')
+
+struct hb_glyph_pair_t
+{
+  hb_codepoint_t left;
+  hb_codepoint_t right;
+};
+
+struct KernPair
+{
+  inline int get_kerning (void) const
+  { return value; }
+
+  inline int cmp (const hb_glyph_pair_t &o) const
+  {
+    int ret = left.cmp (o.left);
+    if (ret) return ret;
+    return right.cmp (o.right);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  GlyphID      left;
+  GlyphID      right;
+  FWORD                value;
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct KernSubTableFormat0
+{
+  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+  {
+    hb_glyph_pair_t pair = {left, right};
+    int i = pairs.bsearch (pair);
+    if (i == -1)
+      return 0;
+    return pairs[i].get_kerning ();
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (pairs.sanitize (c));
+  }
+
+  protected:
+  BinSearchArrayOf<KernPair> pairs;    /* Array of kerning pairs. */
+  public:
+  DEFINE_SIZE_ARRAY (8, pairs);
+};
+
+struct KernClassTable
+{
+  inline unsigned int get_class (hb_codepoint_t g) const { return classes[g - firstGlyph]; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (firstGlyph.sanitize (c) && classes.sanitize (c));
+  }
+
+  protected:
+  HBUINT16             firstGlyph;     /* First glyph in class range. */
+  ArrayOf<HBUINT16>    classes;        /* Glyph classes. */
+  public:
+  DEFINE_SIZE_ARRAY (4, classes);
+};
+
+struct KernSubTableFormat2
+{
+  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const
+  {
+    unsigned int l = (this+leftClassTable).get_class (left);
+    unsigned int r = (this+rightClassTable).get_class (right);
+    unsigned int offset = l * rowWidth + r * sizeof (FWORD);
+    const FWORD *arr = &(this+array);
+    if (unlikely ((const void *) arr < (const void *) this || (const void *) arr >= (const void *) end))
+      return 0;
+    const FWORD *v = &StructAtOffset<FWORD> (arr, offset);
+    if (unlikely ((const void *) v < (const void *) arr || (const void *) (v + 1) > (const void *) end))
+      return 0;
+    return *v;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (rowWidth.sanitize (c) &&
+                 leftClassTable.sanitize (c, this) &&
+                 rightClassTable.sanitize (c, this) &&
+                 array.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16     rowWidth;       /* The width, in bytes, of a row in the table. */
+  OffsetTo<KernClassTable>
+               leftClassTable; /* Offset from beginning of this subtable to
+                                * left-hand class table. */
+  OffsetTo<KernClassTable>
+               rightClassTable;/* Offset from beginning of this subtable to
+                                * right-hand class table. */
+  OffsetTo<FWORD>
+               array;          /* Offset from beginning of this subtable to
+                                * the start of the kerning array. */
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+struct KernSubTable
+{
+  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end, unsigned int format) const
+  {
+    switch (format) {
+    case 0: return u.format0.get_kerning (left, right);
+    case 2: return u.format2.get_kerning (left, right, end);
+    default:return 0;
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int format) const
+  {
+    TRACE_SANITIZE (this);
+    switch (format) {
+    case 0: return_trace (u.format0.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  KernSubTableFormat0  format0;
+  KernSubTableFormat2  format2;
+  } u;
+  public:
+  DEFINE_SIZE_MIN (0);
+};
+
+
+template <typename T>
+struct KernSubTableWrapper
+{
+  /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
+  inline const T* thiz (void) const { return static_cast<const T *> (this); }
+
+  inline bool is_horizontal (void) const
+  { return (thiz()->coverage & T::COVERAGE_CHECK_FLAGS) == T::COVERAGE_CHECK_HORIZONTAL; }
+
+  inline bool is_override (void) const
+  { return bool (thiz()->coverage & T::COVERAGE_OVERRIDE_FLAG); }
+
+  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const
+  { return thiz()->subtable.get_kerning (left, right, end, thiz()->format); }
+
+  inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const
+  { return is_horizontal () ? get_kerning (left, right, end) : 0; }
+
+  inline unsigned int get_size (void) const { return thiz()->length; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (thiz()) &&
+                 thiz()->length >= thiz()->min_size &&
+                 c->check_array (thiz(), 1, thiz()->length) &&
+                 thiz()->subtable.sanitize (c, thiz()->format));
+  }
+};
+
+template <typename T>
+struct KernTable
+{
+  /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
+  inline const T* thiz (void) const { return static_cast<const T *> (this); }
+
+  inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right, unsigned int table_length) const
+  {
+    int v = 0;
+    const typename T::SubTableWrapper *st = CastP<typename T::SubTableWrapper> (thiz()->data);
+    unsigned int count = thiz()->nTables;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (st->is_override ())
+        v = 0;
+      v += st->get_h_kerning (left, right, table_length + (const char *) this);
+      st = &StructAfter<typename T::SubTableWrapper> (*st);
+    }
+    return v;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (thiz()) ||
+                 thiz()->version != T::VERSION))
+      return_trace (false);
+
+    const typename T::SubTableWrapper *st = CastP<typename T::SubTableWrapper> (thiz()->data);
+    unsigned int count = thiz()->nTables;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (unlikely (!st->sanitize (c)))
+       return_trace (false);
+      st = &StructAfter<typename T::SubTableWrapper> (*st);
+    }
+
+    return_trace (true);
+  }
+};
+
+struct KernOT : KernTable<KernOT>
+{
+  friend struct KernTable<KernOT>;
+
+  static const uint16_t VERSION = 0x0000u;
+
+  struct SubTableWrapper : KernSubTableWrapper<SubTableWrapper>
+  {
+    friend struct KernSubTableWrapper<SubTableWrapper>;
+
+    enum coverage_flags_t {
+      COVERAGE_DIRECTION_FLAG  = 0x01u,
+      COVERAGE_MINIMUM_FLAG    = 0x02u,
+      COVERAGE_CROSSSTREAM_FLAG        = 0x04u,
+      COVERAGE_OVERRIDE_FLAG   = 0x08u,
+
+      COVERAGE_VARIATION_FLAG  = 0x00u, /* Not supported. */
+
+      COVERAGE_CHECK_FLAGS     = 0x07u,
+      COVERAGE_CHECK_HORIZONTAL        = 0x01u
+    };
+
+    protected:
+    HBUINT16   versionZ;       /* Unused. */
+    HBUINT16   length;         /* Length of the subtable (including this header). */
+    HBUINT8    format;         /* Subtable format. */
+    HBUINT8    coverage;       /* Coverage bits. */
+    KernSubTable subtable;     /* Subtable data. */
+    public:
+    DEFINE_SIZE_MIN (6);
+  };
+
+  protected:
+  HBUINT16     version;        /* Version--0x0000u */
+  HBUINT16     nTables;        /* Number of subtables in the kerning table. */
+  HBUINT8              data[VAR];
+  public:
+  DEFINE_SIZE_ARRAY (4, data);
+};
+
+struct KernAAT : KernTable<KernAAT>
+{
+  friend struct KernTable<KernAAT>;
+
+  static const uint32_t VERSION = 0x00010000u;
+
+  struct SubTableWrapper : KernSubTableWrapper<SubTableWrapper>
+  {
+    friend struct KernSubTableWrapper<SubTableWrapper>;
+
+    enum coverage_flags_t {
+      COVERAGE_DIRECTION_FLAG  = 0x80u,
+      COVERAGE_CROSSSTREAM_FLAG        = 0x40u,
+      COVERAGE_VARIATION_FLAG  = 0x20u,
+
+      COVERAGE_OVERRIDE_FLAG   = 0x00u, /* Not supported. */
+
+      COVERAGE_CHECK_FLAGS     = 0xE0u,
+      COVERAGE_CHECK_HORIZONTAL        = 0x00u
+    };
+
+    protected:
+    HBUINT32   length;         /* Length of the subtable (including this header). */
+    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. */
+    KernSubTable subtable;     /* Subtable data. */
+    public:
+    DEFINE_SIZE_MIN (8);
+  };
+
+  protected:
+  HBUINT32             version;        /* Version--0x00010000u */
+  HBUINT32             nTables;        /* Number of subtables in the kerning table. */
+  HBUINT8              data[VAR];
+  public:
+  DEFINE_SIZE_ARRAY (8, data);
+};
+
+struct kern
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_kern;
+
+  inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right, unsigned int table_length) const
+  {
+    switch (u.major) {
+    case 0: return u.ot.get_h_kerning (left, right, table_length);
+    case 1: return u.aat.get_h_kerning (left, right, table_length);
+    default:return 0;
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.major.sanitize (c)) return_trace (false);
+    switch (u.major) {
+    case 0: return_trace (u.ot.sanitize (c));
+    case 1: return_trace (u.aat.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  struct accelerator_t
+  {
+    inline void init (hb_face_t *face)
+    {
+      blob = Sanitizer<kern>().sanitize (face->reference_table (HB_OT_TAG_kern));
+      table = Sanitizer<kern>::lock_instance (blob);
+      table_length = hb_blob_get_length (blob);
+    }
+    inline void fini (void)
+    {
+      hb_blob_destroy (blob);
+    }
+
+    inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+    { return table->get_h_kerning (left, right, table_length); }
+
+    private:
+    hb_blob_t *blob;
+    const kern *table;
+    unsigned int table_length;
+  };
+
+  protected:
+  union {
+  HBUINT16             major;
+  KernOT               ot;
+  KernAAT              aat;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, major);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_KERN_TABLE_HH */
diff --git a/src/hb-ot-layout-base-table.hh b/src/hb-ot-layout-base-table.hh
new file mode 100644 (file)
index 0000000..20b8bd7
--- /dev/null
@@ -0,0 +1,655 @@
+/*
+ * Copyright © 2016 Elie Roux <elie.roux@telecom-bretagne.eu>
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_LAYOUT_BASE_TABLE_HH
+#define HB_OT_LAYOUT_BASE_TABLE_HH
+
+#include "hb-open-type-private.hh"
+#include "hb-ot-layout-common-private.hh"
+
+namespace OT {
+
+#define NOT_INDEXED   ((unsigned int) -1)
+
+/*
+ * BASE -- The BASE Table
+ */
+
+struct BaseCoordFormat1
+{
+  inline int get_coord (void) const { return coordinate; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16     format;         /* Format identifier--format = 1 */
+  HBINT16      coordinate;     /* X or Y value, in design units */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct BaseCoordFormat2
+{
+  inline int get_coord (void) const
+  {
+    /* TODO */
+    return coordinate;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16     format;         /* Format identifier--format = 2 */
+  HBINT16      coordinate;     /* X or Y value, in design units */
+  GlyphID      referenceGlyph; /* Glyph ID of control glyph */
+  HBUINT16     coordPoint;     /* Index of contour point on the
+                                * reference glyph */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct BaseCoordFormat3
+{
+  inline int get_coord (void) const
+  {
+    /* TODO */
+    return coordinate;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && deviceTable.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16             format;         /* Format identifier--format = 3 */
+  HBINT16              coordinate;     /* X or Y value, in design units */
+  OffsetTo<Device>     deviceTable;    /* Offset to Device table for X or
+                                        * Y value, from beginning of
+                                        * BaseCoord table (may be NULL). */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct BaseCoord
+{
+  inline int get_coord (void) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.get_coord ();
+    case 2: return u.format2.get_coord ();
+    case 3: return u.format3.get_coord ();
+    default:return 0;
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 1: return_trace (u.format1.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    case 3: return_trace (u.format3.sanitize (c));
+    default:return_trace (false);
+    }
+  }
+
+  protected:
+  union {
+    HBUINT16           format;
+    BaseCoordFormat1   format1;
+    BaseCoordFormat2   format2;
+    BaseCoordFormat3   format3;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+struct FeatMinMaxRecord
+{
+  inline int get_min_value (void) const
+  { return (this+minCoord).get_coord(); }
+
+  inline int get_max_value (void) const
+  { return (this+maxCoord).get_coord(); }
+
+  inline const Tag &get_tag () const
+  { return tag; }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                 minCoord.sanitize (c, base) &&
+                 maxCoord.sanitize (c, base));
+  }
+
+  protected:
+  Tag                   tag;           /* 4-byte feature identification tag--must
+                                        * match feature tag in FeatureList */
+  OffsetTo<BaseCoord>   minCoord;      /* Offset to BaseCoord table that defines
+                                        * the minimum extent value, from beginning
+                                        * of MinMax table (may be NULL) */
+  OffsetTo<BaseCoord>   maxCoord;      /* Offset to BaseCoord table that defines
+                                        * the maximum extent value, from beginning
+                                        * of MinMax table (may be NULL) */
+  public:
+  DEFINE_SIZE_STATIC (8);
+
+};
+
+struct MinMax
+{
+  inline unsigned int get_feature_tag_index (Tag featureTableTag) const
+  {
+    /* TODO bsearch */
+    unsigned int count = featMinMaxRecords.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      Tag tag = featMinMaxRecords[i].get_tag();
+      int cmp = tag.cmp(featureTableTag);
+      if (cmp == 0) return i;
+      if (cmp > 0)  return NOT_INDEXED;
+    }
+    return NOT_INDEXED;
+  }
+
+  inline int get_min_value (unsigned int featureTableTagIndex) const
+  {
+    if (featureTableTagIndex == NOT_INDEXED)
+      return (this+minCoord).get_coord();
+    return featMinMaxRecords[featureTableTagIndex].get_min_value();
+  }
+
+  inline int get_max_value (unsigned int featureTableTagIndex) const
+  {
+    if (featureTableTagIndex == NOT_INDEXED)
+      return (this+maxCoord).get_coord();
+    return featMinMaxRecords[featureTableTagIndex].get_max_value();
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                 minCoord.sanitize (c, this) &&
+                 maxCoord.sanitize (c, this) &&
+                 featMinMaxRecords.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<BaseCoord>  minCoord;       /* Offset to BaseCoord table that defines
+                                        * minimum extent value, from the beginning
+                                        * of MinMax table (may be NULL) */
+  OffsetTo<BaseCoord>  maxCoord;       /* Offset to BaseCoord table that defines
+                                        * maximum extent value, from the beginning
+                                        * of MinMax table (may be NULL) */
+  ArrayOf<FeatMinMaxRecord>
+               featMinMaxRecords;      /* Array of FeatMinMaxRecords, in alphabetical
+                                        * order by featureTableTag */
+  public:
+  DEFINE_SIZE_ARRAY (6, featMinMaxRecords);
+};
+
+/* TODO... */
+struct BaseLangSysRecord
+{
+  inline const Tag& get_tag(void) const
+  { return baseLangSysTag; }
+
+  inline unsigned int get_feature_tag_index (Tag featureTableTag) const
+  { return (this+minMax).get_feature_tag_index(featureTableTag); }
+
+  inline int get_min_value (unsigned int featureTableTagIndex) const
+  { return (this+minMax).get_min_value(featureTableTagIndex); }
+
+  inline int get_max_value (unsigned int featureTableTagIndex) const
+  { return (this+minMax).get_max_value(featureTableTagIndex); }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                 minMax.sanitize (c, base));
+  }
+
+  protected:
+  Tag                  baseLangSysTag;
+  OffsetTo<MinMax>     minMax;
+  public:
+  DEFINE_SIZE_STATIC (6);
+
+};
+
+struct BaseValues
+{
+  inline unsigned int get_default_base_tag_index (void) const
+  { return defaultIndex; }
+
+  inline int get_base_coord (unsigned int baselineTagIndex) const
+  {
+    return (this+baseCoords[baselineTagIndex]).get_coord();
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      defaultIndex <= baseCoordCount &&
+      baseCoords.sanitize (c, this));
+  }
+
+  protected:
+  Index                                defaultIndex;
+  HBUINT16                     baseCoordCount;
+  OffsetArrayOf<BaseCoord>     baseCoords;
+  public:
+  DEFINE_SIZE_ARRAY (6, baseCoords);
+
+};
+
+struct BaseScript {
+
+  inline unsigned int get_lang_tag_index (Tag baseLangSysTag) const
+  {
+    Tag tag;
+    int cmp;
+    for (unsigned int i = 0; i < baseLangSysCount; i++) {
+      tag = baseLangSysRecords[i].get_tag();
+      // taking advantage of alphabetical order
+      cmp = tag.cmp(baseLangSysTag);
+      if (cmp == 0) return i;
+      if (cmp > 0)  return NOT_INDEXED;
+    }
+    return NOT_INDEXED;
+  }
+
+  inline unsigned int get_feature_tag_index (unsigned int baseLangSysIndex, Tag featureTableTag) const
+  {
+    if (baseLangSysIndex == NOT_INDEXED) {
+      if (unlikely(defaultMinMax)) return NOT_INDEXED;
+      return (this+defaultMinMax).get_feature_tag_index(featureTableTag);
+    }
+    if (unlikely(baseLangSysIndex >= baseLangSysCount)) return NOT_INDEXED;
+    return baseLangSysRecords[baseLangSysIndex].get_feature_tag_index(featureTableTag);
+  }
+
+  inline int get_min_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    if (baseLangSysIndex == NOT_INDEXED)
+      return (this+defaultMinMax).get_min_value(featureTableTagIndex);
+    return baseLangSysRecords[baseLangSysIndex].get_max_value(featureTableTagIndex);
+  }
+
+  inline int get_max_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    if (baseLangSysIndex == NOT_INDEXED)
+      return (this+defaultMinMax).get_min_value(featureTableTagIndex);
+    return baseLangSysRecords[baseLangSysIndex].get_max_value(featureTableTagIndex);
+  }
+
+  inline unsigned int get_default_base_tag_index (void) const
+  { return (this+baseValues).get_default_base_tag_index(); }
+
+  inline int get_base_coord (unsigned int baselineTagIndex) const
+  { return (this+baseValues).get_base_coord(baselineTagIndex); }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      baseValues.sanitize (c, this) &&
+      defaultMinMax.sanitize (c, this) &&
+      baseLangSysRecords.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<BaseValues>        baseValues;
+  OffsetTo<MinMax>            defaultMinMax;
+  HBUINT16                      baseLangSysCount;
+  ArrayOf<BaseLangSysRecord>  baseLangSysRecords;
+
+  public:
+    DEFINE_SIZE_ARRAY (8, baseLangSysRecords);
+};
+
+
+struct BaseScriptRecord {
+
+  inline const Tag& get_tag (void) const
+  { return baseScriptTag; }
+
+  inline unsigned int get_default_base_tag_index(void) const
+  { return (this+baseScript).get_default_base_tag_index(); }
+
+  inline int get_base_coord(unsigned int baselineTagIndex) const
+  { return (this+baseScript).get_base_coord(baselineTagIndex); }
+
+  inline unsigned int get_lang_tag_index (Tag baseLangSysTag) const
+  { return (this+baseScript).get_lang_tag_index(baseLangSysTag); }
+
+  inline unsigned int get_feature_tag_index (unsigned int baseLangSysIndex, Tag featureTableTag) const
+  { return (this+baseScript).get_feature_tag_index(baseLangSysIndex, featureTableTag); }
+
+  inline int get_max_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  { return (this+baseScript).get_max_value(baseLangSysIndex, featureTableTagIndex); }
+
+  inline int get_min_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  { return (this+baseScript).get_min_value(baseLangSysIndex, featureTableTagIndex); }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      baseScript != Null(OffsetTo<BaseScript>) &&
+      baseScript.sanitize (c, base));
+  }
+
+  protected:
+  Tag                   baseScriptTag;
+  OffsetTo<BaseScript>  baseScript;
+
+  public:
+    DEFINE_SIZE_STATIC (6);
+};
+
+struct BaseScriptList {
+
+  inline unsigned int get_base_script_index (Tag baseScriptTag) const
+  {
+    for (unsigned int i = 0; i < baseScriptCount; i++)
+      if (baseScriptRecords[i].get_tag() == baseScriptTag)
+        return i;
+    return NOT_INDEXED;
+  }
+
+  inline unsigned int get_default_base_tag_index (unsigned int baseScriptIndex) const
+  {
+    if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED;
+    return baseScriptRecords[baseScriptIndex].get_default_base_tag_index();
+  }
+
+  inline int get_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const
+  {
+    return baseScriptRecords[baseScriptIndex].get_base_coord(baselineTagIndex);
+  }
+
+  inline unsigned int get_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const
+  {
+    if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED;
+    return baseScriptRecords[baseScriptIndex].get_lang_tag_index(baseLangSysTag);
+  }
+
+  inline unsigned int get_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const
+  {
+    if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED;
+    return baseScriptRecords[baseScriptIndex].get_feature_tag_index(baseLangSysIndex, featureTableTag);
+  }
+
+  inline int get_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return baseScriptRecords[baseScriptIndex].get_max_value(baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline int get_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return baseScriptRecords[baseScriptIndex].get_min_value(baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      baseScriptRecords.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16                    baseScriptCount;
+  ArrayOf<BaseScriptRecord> baseScriptRecords;
+
+  public:
+  DEFINE_SIZE_ARRAY (4, baseScriptRecords);
+
+};
+
+struct BaseTagList
+{
+
+  inline unsigned int get_tag_index(Tag baselineTag) const
+  {
+    for (unsigned int i = 0; i < baseTagCount; i++)
+      if (baselineTags[i] == baselineTag)
+        return i;
+    return NOT_INDEXED;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16        baseTagCount;
+  SortedArrayOf<Tag>  baselineTags;
+
+  public:
+  DEFINE_SIZE_ARRAY (4, baselineTags);
+};
+
+struct Axis
+{
+
+  inline unsigned int get_base_tag_index(Tag baselineTag) const
+  {
+    if (unlikely(baseTagList == Null(OffsetTo<BaseTagList>))) return NOT_INDEXED;
+    return (this+baseTagList).get_tag_index(baselineTag);
+  }
+
+  inline unsigned int get_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const
+  {
+    if (unlikely(baseScriptList == Null(OffsetTo<BaseScriptList>))) return NOT_INDEXED;
+    return (this+baseScriptList).get_default_base_tag_index(baseScriptIndex);
+  }
+
+  inline int get_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const
+  {
+    return (this+baseScriptList).get_base_coord(baseScriptIndex, baselineTagIndex);
+  }
+
+  inline unsigned int get_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const
+  {
+    if (unlikely(baseScriptList == Null(OffsetTo<BaseScriptList>))) return NOT_INDEXED;
+    return (this+baseScriptList).get_lang_tag_index(baseScriptIndex, baseLangSysTag);
+  }
+
+  inline unsigned int get_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const
+  {
+    if (unlikely(baseScriptList == Null(OffsetTo<BaseScriptList>))) return NOT_INDEXED;
+    return (this+baseScriptList).get_feature_tag_index(baseScriptIndex, baseLangSysIndex, featureTableTag);
+  }
+
+  inline int get_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+baseScriptList).get_max_value(baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline int get_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+baseScriptList).get_min_value(baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      baseTagList.sanitize (c, this) &&
+      baseScriptList.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<BaseTagList>     baseTagList;
+  OffsetTo<BaseScriptList>  baseScriptList;
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct BASE
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_BASE;
+
+  inline bool has_vert_axis(void)
+  { return vertAxis != Null(OffsetTo<Axis>); }
+
+  inline bool has_horiz_axis(void)
+  { return horizAxis != Null(OffsetTo<Axis>); }
+
+  // horizontal axis base coords:
+
+  inline unsigned int get_horiz_base_tag_index(Tag baselineTag) const
+  {
+    if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+horizAxis).get_base_tag_index(baselineTag);
+  }
+
+  inline unsigned int get_horiz_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const
+  {
+    if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+horizAxis).get_default_base_tag_index_for_script_index(baseScriptIndex);
+  }
+
+  inline int get_horiz_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const
+  {
+    return (this+horizAxis).get_base_coord(baseScriptIndex, baselineTagIndex);
+  }
+
+  // vertical axis base coords:
+
+  inline unsigned int get_vert_base_tag_index(Tag baselineTag) const
+  {
+    if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+vertAxis).get_base_tag_index(baselineTag);
+  }
+
+  inline unsigned int get_vert_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const
+  {
+    if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+vertAxis).get_default_base_tag_index_for_script_index(baseScriptIndex);
+  }
+
+  inline int get_vert_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const
+  {
+    return (this+vertAxis).get_base_coord(baseScriptIndex, baselineTagIndex);
+  }
+
+  // horizontal axis min/max coords:
+
+  inline unsigned int get_horiz_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const
+  {
+    if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+horizAxis).get_lang_tag_index (baseScriptIndex, baseLangSysTag);
+  }
+
+  inline unsigned int get_horiz_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const
+  {
+    if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+horizAxis).get_feature_tag_index (baseScriptIndex, baseLangSysIndex, featureTableTag);
+  }
+
+  inline int get_horiz_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+horizAxis).get_max_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline int get_horiz_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+horizAxis).get_min_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+    // vertical axis min/max coords:
+
+  inline unsigned int get_vert_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const
+  {
+    if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+vertAxis).get_lang_tag_index (baseScriptIndex, baseLangSysTag);
+  }
+
+  inline unsigned int get_vert_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const
+  {
+    if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+vertAxis).get_feature_tag_index (baseScriptIndex, baseLangSysIndex, featureTableTag);
+  }
+
+  inline int get_vert_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+vertAxis).get_max_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline int get_vert_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+vertAxis).get_min_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                 likely (version.major == 1) &&
+                 horizAxis.sanitize (c, this) &&
+                 vertAxis.sanitize (c, this) &&
+                 (version.to_int () < 0x00010001u || varStore.sanitize (c, this)));
+  }
+
+  protected:
+  FixedVersion<>  version;
+  OffsetTo<Axis>  horizAxis;
+  OffsetTo<Axis>  vertAxis;
+  LOffsetTo<VariationStore>
+               varStore;               /* Offset to the table of Item Variation
+                                        * Store--from beginning of BASE
+                                        * header (may be NULL).  Introduced
+                                        * in version 0x00010001. */
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_BASE_TABLE_HH */
index 180e5f0..c5e7f52 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef HB_OT_LAYOUT_COMMON_PRIVATE_HH
 #define HB_OT_LAYOUT_COMMON_PRIVATE_HH
 
 #ifndef HB_OT_LAYOUT_COMMON_PRIVATE_HH
 #define HB_OT_LAYOUT_COMMON_PRIVATE_HH
 
+#include "hb-private.hh"
+#include "hb-debug.hh"
 #include "hb-ot-layout-private.hh"
 #include "hb-open-type-private.hh"
 #include "hb-set-private.hh"
 #include "hb-ot-layout-private.hh"
 #include "hb-open-type-private.hh"
 #include "hb-set-private.hh"
 namespace OT {
 
 
 namespace OT {
 
 
-#define TRACE_DISPATCH(this, format) \
-       hb_auto_trace_t<context_t::max_debug_depth, typename context_t::return_t> trace \
-       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-        "format %d", (int) format);
-
-
 #define NOT_COVERED            ((unsigned int) -1)
 
 
 #define NOT_COVERED            ((unsigned int) -1)
 
 
@@ -159,13 +155,13 @@ struct RangeRecord
   }
 
   template <typename set_t>
   }
 
   template <typename set_t>
-  inline void add_coverage (set_t *glyphs) const {
-    glyphs->add_range (start, end);
+  inline bool add_coverage (set_t *glyphs) const {
+    return glyphs->add_range (start, end);
   }
 
   GlyphID      start;          /* First GlyphID in the range */
   GlyphID      end;            /* Last GlyphID in the range */
   }
 
   GlyphID      start;          /* First GlyphID in the range */
   GlyphID      end;            /* Last GlyphID in the range */
-  USHORT       value;          /* Value */
+  HBUINT16     value;          /* Value */
   public:
   DEFINE_SIZE_STATIC (6);
 };
   public:
   DEFINE_SIZE_STATIC (6);
 };
@@ -179,7 +175,7 @@ struct IndexArray : ArrayOf<Index>
                                   unsigned int *_indexes /* OUT */) const
   {
     if (_count) {
                                   unsigned int *_indexes /* OUT */) const
   {
     if (_count) {
-      const USHORT *arr = this->sub_array (start_offset, _count);
+      const HBUINT16 *arr = this->sub_array (start_offset, _count);
       unsigned int count = *_count;
       for (unsigned int i = 0; i < count; i++)
        _indexes[i] = arr[i];
       unsigned int count = *_count;
       for (unsigned int i = 0; i < count; i++)
        _indexes[i] = arr[i];
@@ -214,15 +210,15 @@ struct LangSys
   }
 
   inline bool sanitize (hb_sanitize_context_t *c,
   }
 
   inline bool sanitize (hb_sanitize_context_t *c,
-                       const Record<LangSys>::sanitize_closure_t * = NULL) const
+                       const Record<LangSys>::sanitize_closure_t * = nullptr) const
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) && featureIndex.sanitize (c));
   }
 
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) && featureIndex.sanitize (c));
   }
 
-  Offset<>     lookupOrderZ;   /* = Null (reserved for an offset to a
+  Offset16     lookupOrderZ;   /* = Null (reserved for an offset to a
                                 * reordering table) */
                                 * reordering table) */
-  USHORT       reqFeatureIndex;/* Index of a feature required for this
+  HBUINT16     reqFeatureIndex;/* Index of a feature required for this
                                 * language system--if no required features
                                 * = 0xFFFFu */
   IndexArray   featureIndex;   /* Array of indices into the FeatureList */
                                 * language system--if no required features
                                 * = 0xFFFFu */
   IndexArray   featureIndex;   /* Array of indices into the FeatureList */
@@ -254,7 +250,7 @@ struct Script
   inline const LangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
 
   inline bool sanitize (hb_sanitize_context_t *c,
   inline const LangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
 
   inline bool sanitize (hb_sanitize_context_t *c,
-                       const Record<Script>::sanitize_closure_t * = NULL) const
+                       const Record<Script>::sanitize_closure_t * = nullptr) const
   {
     TRACE_SANITIZE (this);
     return_trace (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
   {
     TRACE_SANITIZE (this);
     return_trace (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
@@ -303,7 +299,7 @@ struct FeatureParamsSize
      * better.
      *
      * Assume that the offset to the size feature is according to specification,
      * better.
      *
      * Assume that the offset to the size feature is according to specification,
-     * and make the following value checks. If it fails, assume the the size
+     * and make the following value checks. If it fails, assume the size
      * feature is calculated as versions of MakeOTF before the AFDKO 2.0 built it.
      * If this fails, reject the 'size' feature. The older makeOTF's calculated the
      * offset from the beginning of the FeatureList table, rather than from the
      * feature is calculated as versions of MakeOTF before the AFDKO 2.0 built it.
      * If this fails, reject the 'size' feature. The older makeOTF's calculated the
      * offset from the beginning of the FeatureList table, rather than from the
@@ -347,12 +343,12 @@ struct FeatureParamsSize
       return_trace (true);
   }
 
       return_trace (true);
   }
 
-  USHORT       designSize;     /* Represents the design size in 720/inch
+  HBUINT16     designSize;     /* Represents the design size in 720/inch
                                 * units (decipoints).  The design size entry
                                 * must be non-zero.  When there is a design
                                 * size but no recommended size range, the
                                 * rest of the array will consist of zeros. */
                                 * units (decipoints).  The design size entry
                                 * must be non-zero.  When there is a design
                                 * size but no recommended size range, the
                                 * rest of the array will consist of zeros. */
-  USHORT       subfamilyID;    /* Has no independent meaning, but serves
+  HBUINT16     subfamilyID;    /* Has no independent meaning, but serves
                                 * as an identifier that associates fonts
                                 * in a subfamily. All fonts which share a
                                 * Preferred or Font Family name and which
                                 * as an identifier that associates fonts
                                 * in a subfamily. All fonts which share a
                                 * Preferred or Font Family name and which
@@ -362,7 +358,7 @@ struct FeatureParamsSize
                                 * same subfamily value. If this value is
                                 * zero, the remaining fields in the array
                                 * will be ignored. */
                                 * same subfamily value. If this value is
                                 * zero, the remaining fields in the array
                                 * will be ignored. */
-  USHORT       subfamilyNameID;/* If the preceding value is non-zero, this
+  HBUINT16     subfamilyNameID;/* If the preceding value is non-zero, this
                                 * value must be set in the range 256 - 32767
                                 * (inclusive). It records the value of a
                                 * field in the name table, which must
                                 * value must be set in the range 256 - 32767
                                 * (inclusive). It records the value of a
                                 * field in the name table, which must
@@ -376,10 +372,10 @@ struct FeatureParamsSize
                                 * subfamily in a menu.  Applications will
                                 * choose the appropriate version based on
                                 * their selection criteria. */
                                 * subfamily in a menu.  Applications will
                                 * choose the appropriate version based on
                                 * their selection criteria. */
-  USHORT       rangeStart;     /* Large end of the recommended usage range
+  HBUINT16     rangeStart;     /* Large end of the recommended usage range
                                 * (inclusive), stored in 720/inch units
                                 * (decipoints). */
                                 * (inclusive), stored in 720/inch units
                                 * (decipoints). */
-  USHORT       rangeEnd;       /* Small end of the recommended usage range
+  HBUINT16     rangeEnd;       /* Small end of the recommended usage range
                                   (exclusive), stored in 720/inch units
                                 * (decipoints). */
   public:
                                   (exclusive), stored in 720/inch units
                                 * (decipoints). */
   public:
@@ -397,12 +393,12 @@ struct FeatureParamsStylisticSet
     return_trace (c->check_struct (this));
   }
 
     return_trace (c->check_struct (this));
   }
 
-  USHORT       version;        /* (set to 0): This corresponds to a “minor”
+  HBUINT16     version;        /* (set to 0): This corresponds to a “minor”
                                 * version number. Additional data may be
                                 * added to the end of this Feature Parameters
                                 * table in the future. */
 
                                 * version number. Additional data may be
                                 * added to the end of this Feature Parameters
                                 * table in the future. */
 
-  USHORT       uiNameID;       /* The 'name' table name ID that specifies a
+  HBUINT16     uiNameID;       /* The 'name' table name ID that specifies a
                                 * string (or strings, for multiple languages)
                                 * for a user-interface label for this
                                 * feature.  The values of uiLabelNameId and
                                 * string (or strings, for multiple languages)
                                 * for a user-interface label for this
                                 * feature.  The values of uiLabelNameId and
@@ -430,25 +426,25 @@ struct FeatureParamsCharacterVariants
                  characters.sanitize (c));
   }
 
                  characters.sanitize (c));
   }
 
-  USHORT       format;                 /* Format number is set to 0. */
-  USHORT       featUILableNameID;      /* The ‘name’ table name ID that
+  HBUINT16     format;                 /* Format number is set to 0. */
+  HBUINT16     featUILableNameID;      /* The ‘name’ table name ID that
                                         * specifies a string (or strings,
                                         * for multiple languages) for a
                                         * user-interface label for this
                                         * specifies a string (or strings,
                                         * for multiple languages) for a
                                         * user-interface label for this
-                                        * feature. (May be NULL.) */
-  USHORT       featUITooltipTextNameID;/* The ‘name’ table name ID that
+                                        * feature. (May be nullptr.) */
+  HBUINT16     featUITooltipTextNameID;/* The ‘name’ table name ID that
                                         * specifies a string (or strings,
                                         * for multiple languages) that an
                                         * application can use for tooltip
                                         * text for this feature. (May be
                                         * specifies a string (or strings,
                                         * for multiple languages) that an
                                         * application can use for tooltip
                                         * text for this feature. (May be
-                                        * NULL.) */
-  USHORT       sampleTextNameID;       /* The ‘name’ table name ID that
+                                        * nullptr.) */
+  HBUINT16     sampleTextNameID;       /* The ‘name’ table name ID that
                                         * specifies sample text that
                                         * illustrates the effect of this
                                         * specifies sample text that
                                         * illustrates the effect of this
-                                        * feature. (May be NULL.) */
-  USHORT       numNamedParameters;     /* Number of named parameters. (May
+                                        * feature. (May be nullptr.) */
+  HBUINT16     numNamedParameters;     /* Number of named parameters. (May
                                         * be zero.) */
                                         * be zero.) */
-  USHORT       firstParamUILabelNameID;/* The first ‘name’ table name ID
+  HBUINT16     firstParamUILabelNameID;/* The first ‘name’ table name ID
                                         * used to specify strings for
                                         * user-interface labels for the
                                         * feature parameters. (Must be zero
                                         * used to specify strings for
                                         * user-interface labels for the
                                         * feature parameters. (Must be zero
@@ -507,7 +503,7 @@ struct Feature
   { return this+featureParams; }
 
   inline bool sanitize (hb_sanitize_context_t *c,
   { return this+featureParams; }
 
   inline bool sanitize (hb_sanitize_context_t *c,
-                       const Record<Feature>::sanitize_closure_t *closure = NULL) const
+                       const Record<Feature>::sanitize_closure_t *closure = nullptr) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
   {
     TRACE_SANITIZE (this);
     if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
@@ -566,7 +562,7 @@ struct Feature
 typedef RecordListOf<Feature> FeatureList;
 
 
 typedef RecordListOf<Feature> FeatureList;
 
 
-struct LookupFlag : USHORT
+struct LookupFlag : HBUINT16
 {
   enum Flags {
     RightToLeft                = 0x0001u,
 {
   enum Flags {
     RightToLeft                = 0x0001u,
@@ -612,7 +608,7 @@ struct Lookup
     unsigned int flag = lookupFlag;
     if (unlikely (flag & LookupFlag::UseMarkFilteringSet))
     {
     unsigned int flag = lookupFlag;
     if (unlikely (flag & LookupFlag::UseMarkFilteringSet))
     {
-      const USHORT &markFilteringSet = StructAfter<USHORT> (subTable);
+      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
       flag += (markFilteringSet << 16);
     }
     return flag;
       flag += (markFilteringSet << 16);
     }
     return flag;
@@ -644,7 +640,7 @@ struct Lookup
     if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false);
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
     if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false);
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
-      USHORT &markFilteringSet = StructAfter<USHORT> (subTable);
+      HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
       markFilteringSet.set (lookup_props >> 16);
     }
     return_trace (true);
       markFilteringSet.set (lookup_props >> 16);
     }
     return_trace (true);
@@ -657,18 +653,18 @@ struct Lookup
     if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
     if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
-      const USHORT &markFilteringSet = StructAfter<USHORT> (subTable);
+      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
       if (!markFilteringSet.sanitize (c)) return_trace (false);
     }
     return_trace (true);
   }
 
   private:
       if (!markFilteringSet.sanitize (c)) return_trace (false);
     }
     return_trace (true);
   }
 
   private:
-  USHORT       lookupType;             /* Different enumerations for GSUB and GPOS */
-  USHORT       lookupFlag;             /* Lookup qualifiers */
-  ArrayOf<Offset<> >
+  HBUINT16     lookupType;             /* Different enumerations for GSUB and GPOS */
+  HBUINT16     lookupFlag;             /* Lookup qualifiers */
+  ArrayOf<Offset16>
                subTable;               /* Array of SubTables */
                subTable;               /* Array of SubTables */
-  USHORT       markFilteringSetX[VAR]; /* Index (base 0) into GDEF mark glyph sets
+  HBUINT16     markFilteringSetX[VAR]; /* Index (base 0) into GDEF mark glyph sets
                                         * structure. This field is only present if bit
                                         * UseMarkFilteringSet of lookup flags is set. */
   public:
                                         * structure. This field is only present if bit
                                         * UseMarkFilteringSet of lookup flags is set. */
   public:
@@ -690,7 +686,7 @@ struct CoverageFormat1
   inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
     int i = glyphArray.bsearch (glyph_id);
   inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
     int i = glyphArray.bsearch (glyph_id);
-    ASSERT_STATIC (((unsigned int) -1) == NOT_COVERED);
+    static_assert ((((unsigned int) -1) == NOT_COVERED), "");
     return i;
   }
 
     return i;
   }
 
@@ -704,7 +700,7 @@ struct CoverageFormat1
     if (unlikely (!c->extend (glyphArray))) return_trace (false);
     for (unsigned int i = 0; i < num_glyphs; i++)
       glyphArray[i] = glyphs[i];
     if (unlikely (!c->extend (glyphArray))) return_trace (false);
     for (unsigned int i = 0; i < num_glyphs; i++)
       glyphArray[i] = glyphs[i];
-    glyphs.advance (num_glyphs);
+    glyphs += num_glyphs;
     return_trace (true);
   }
 
     return_trace (true);
   }
 
@@ -719,10 +715,8 @@ struct CoverageFormat1
   }
 
   template <typename set_t>
   }
 
   template <typename set_t>
-  inline void add_coverage (set_t *glyphs) const {
-    unsigned int count = glyphArray.len;
-    for (unsigned int i = 0; i < count; i++)
-      glyphs->add (glyphArray[i]);
+  inline bool add_coverage (set_t *glyphs) const {
+    return glyphs->add_sorted_array (glyphArray.array, glyphArray.len);
   }
 
   public:
   }
 
   public:
@@ -741,7 +735,7 @@ struct CoverageFormat1
   private:
 
   protected:
   private:
 
   protected:
-  USHORT       coverageFormat; /* Format identifier--format = 1 */
+  HBUINT16     coverageFormat; /* Format identifier--format = 1 */
   SortedArrayOf<GlyphID>
                glyphArray;     /* Array of GlyphIDs--in numerical order */
   public:
   SortedArrayOf<GlyphID>
                glyphArray;     /* Array of GlyphIDs--in numerical order */
   public:
@@ -795,7 +789,7 @@ struct CoverageFormat2
       } else {
         rangeRecord[range].end = glyphs[i];
       }
       } else {
         rangeRecord[range].end = glyphs[i];
       }
-    glyphs.advance (num_glyphs);
+    glyphs += num_glyphs;
     return_trace (true);
   }
 
     return_trace (true);
   }
 
@@ -821,10 +815,12 @@ struct CoverageFormat2
   }
 
   template <typename set_t>
   }
 
   template <typename set_t>
-  inline void add_coverage (set_t *glyphs) const {
+  inline bool add_coverage (set_t *glyphs) const {
     unsigned int count = rangeRecord.len;
     for (unsigned int i = 0; i < count; i++)
     unsigned int count = rangeRecord.len;
     for (unsigned int i = 0; i < count; i++)
-      rangeRecord[i].add_coverage (glyphs);
+      if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+        return false;
+    return true;
   }
 
   public:
   }
 
   public:
@@ -864,7 +860,7 @@ struct CoverageFormat2
   private:
 
   protected:
   private:
 
   protected:
-  USHORT       coverageFormat; /* Format identifier--format = 2 */
+  HBUINT16     coverageFormat; /* Format identifier--format = 2 */
   SortedArrayOf<RangeRecord>
                rangeRecord;    /* Array of glyph ranges--ordered by
                                 * Start GlyphID. rangeCount entries
   SortedArrayOf<RangeRecord>
                rangeRecord;    /* Array of glyph ranges--ordered by
                                 * Start GlyphID. rangeCount entries
@@ -878,8 +874,8 @@ struct Coverage
   inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
     switch (u.format) {
   inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
     switch (u.format) {
-    case 1: return u.format1.get_coverage(glyph_id);
-    case 2: return u.format2.get_coverage(glyph_id);
+    case 1: return u.format1.get_coverage (glyph_id);
+    case 2: return u.format2.get_coverage (glyph_id);
     default:return NOT_COVERED;
     }
   }
     default:return NOT_COVERED;
     }
   }
@@ -931,17 +927,19 @@ struct Coverage
     }
   }
 
     }
   }
 
+  /* Might return false if array looks unsorted.
+   * Used for faster rejection of corrupt data. */
   template <typename set_t>
   template <typename set_t>
-  inline void add_coverage (set_t *glyphs) const {
+  inline bool add_coverage (set_t *glyphs) const {
     switch (u.format) {
     switch (u.format) {
-    case 1: u.format1.add_coverage (glyphs); break;
-    case 2: u.format2.add_coverage (glyphs); break;
-    default:                                 break;
+    case 1: return u.format1.add_coverage (glyphs);
+    case 2: return u.format2.add_coverage (glyphs);
+    default:return false;
     }
   }
 
   struct Iter {
     }
   }
 
   struct Iter {
-    Iter (void) : format (0) {};
+    Iter (void) : format (0), u () {};
     inline void init (const Coverage &c_) {
       format = c_.u.format;
       switch (format) {
     inline void init (const Coverage &c_) {
       format = c_.u.format;
       switch (format) {
@@ -982,14 +980,14 @@ struct Coverage
     private:
     unsigned int format;
     union {
     private:
     unsigned int format;
     union {
+    CoverageFormat2::Iter      format2; /* Put this one first since it's larger; helps shut up compiler. */
     CoverageFormat1::Iter      format1;
     CoverageFormat1::Iter      format1;
-    CoverageFormat2::Iter      format2;
     } u;
   };
 
   protected:
   union {
     } u;
   };
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   CoverageFormat1      format1;
   CoverageFormat2      format2;
   } u;
   CoverageFormat1      format1;
   CoverageFormat2      format2;
   } u;
@@ -1022,11 +1020,36 @@ struct ClassDefFormat1
   }
 
   template <typename set_t>
   }
 
   template <typename set_t>
-  inline void add_class (set_t *glyphs, unsigned int klass) const {
+  inline bool add_coverage (set_t *glyphs) const {
+    unsigned int start = 0;
     unsigned int count = classValue.len;
     for (unsigned int i = 0; i < count; i++)
     unsigned int count = classValue.len;
     for (unsigned int i = 0; i < count; i++)
+    {
+      if (classValue[i])
+        continue;
+
+      if (start != i)
+       if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + i)))
+         return false;
+
+      start = i + 1;
+    }
+    if (start != count)
+      if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + count)))
+       return false;
+
+    return true;
+  }
+
+  template <typename set_t>
+  inline bool add_class (set_t *glyphs, unsigned int klass) const {
+    unsigned int count = classValue.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
       if (classValue[i] == klass)
         glyphs->add (startGlyph + i);
       if (classValue[i] == klass)
         glyphs->add (startGlyph + i);
+    }
+    return true;
   }
 
   inline bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const {
   }
 
   inline bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const {
@@ -1034,7 +1057,7 @@ struct ClassDefFormat1
     if (klass == 0)
     {
       /* Match if there's any glyph that is not listed! */
     if (klass == 0)
     {
       /* Match if there's any glyph that is not listed! */
-      hb_codepoint_t g = -1;
+      hb_codepoint_t g = HB_SET_VALUE_INVALID;
       if (!hb_set_next (glyphs, &g))
         return false;
       if (g < startGlyph)
       if (!hb_set_next (glyphs, &g))
         return false;
       if (g < startGlyph)
@@ -1051,9 +1074,9 @@ struct ClassDefFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       classFormat;            /* Format identifier--format = 1 */
+  HBUINT16     classFormat;            /* Format identifier--format = 1 */
   GlyphID      startGlyph;             /* First GlyphID of the classValueArray */
   GlyphID      startGlyph;             /* First GlyphID of the classValueArray */
-  ArrayOf<USHORT>
+  ArrayOf<HBUINT16>
                classValue;             /* Array of Class Values--one per GlyphID */
   public:
   DEFINE_SIZE_ARRAY (6, classValue);
                classValue;             /* Array of Class Values--one per GlyphID */
   public:
   DEFINE_SIZE_ARRAY (6, classValue);
@@ -1079,11 +1102,25 @@ struct ClassDefFormat2
   }
 
   template <typename set_t>
   }
 
   template <typename set_t>
-  inline void add_class (set_t *glyphs, unsigned int klass) const {
+  inline bool add_coverage (set_t *glyphs) const {
     unsigned int count = rangeRecord.len;
     for (unsigned int i = 0; i < count; i++)
     unsigned int count = rangeRecord.len;
     for (unsigned int i = 0; i < count; i++)
+      if (rangeRecord[i].value)
+       if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+         return false;
+    return true;
+  }
+
+  template <typename set_t>
+  inline bool add_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 (rangeRecord[i].value == klass)
-        rangeRecord[i].add_coverage (glyphs);
+        if (unlikely (!rangeRecord[i].add_coverage (glyphs)))
+         return false;
+    }
+    return true;
   }
 
   inline bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const {
   }
 
   inline bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const {
@@ -1091,7 +1128,7 @@ struct ClassDefFormat2
     if (klass == 0)
     {
       /* Match if there's any glyph that is not listed! */
     if (klass == 0)
     {
       /* Match if there's any glyph that is not listed! */
-      hb_codepoint_t g = (hb_codepoint_t) -1;
+      hb_codepoint_t g = HB_SET_VALUE_INVALID;
       for (unsigned int i = 0; i < count; i++)
       {
        if (!hb_set_next (glyphs, &g))
       for (unsigned int i = 0; i < count; i++)
       {
        if (!hb_set_next (glyphs, &g))
@@ -1100,7 +1137,7 @@ struct ClassDefFormat2
          return true;
        g = rangeRecord[i].end;
       }
          return true;
        g = rangeRecord[i].end;
       }
-      if (g != (hb_codepoint_t) -1 && hb_set_next (glyphs, &g))
+      if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g))
         return true;
       /* Fall through. */
     }
         return true;
       /* Fall through. */
     }
@@ -1111,7 +1148,7 @@ struct ClassDefFormat2
   }
 
   protected:
   }
 
   protected:
-  USHORT       classFormat;    /* Format identifier--format = 2 */
+  HBUINT16     classFormat;    /* Format identifier--format = 2 */
   SortedArrayOf<RangeRecord>
                rangeRecord;    /* Array of glyph ranges--ordered by
                                 * Start GlyphID */
   SortedArrayOf<RangeRecord>
                rangeRecord;    /* Array of glyph ranges--ordered by
                                 * Start GlyphID */
@@ -1124,8 +1161,8 @@ struct ClassDef
   inline unsigned int get_class (hb_codepoint_t glyph_id) const
   {
     switch (u.format) {
   inline unsigned int get_class (hb_codepoint_t glyph_id) const
   {
     switch (u.format) {
-    case 1: return u.format1.get_class(glyph_id);
-    case 2: return u.format2.get_class(glyph_id);
+    case 1: return u.format1.get_class (glyph_id);
+    case 2: return u.format2.get_class (glyph_id);
     default:return 0;
     }
   }
     default:return 0;
     }
   }
@@ -1141,11 +1178,25 @@ struct ClassDef
     }
   }
 
     }
   }
 
-  inline void add_class (hb_set_t *glyphs, unsigned int klass) const {
+  /* Might return false if array looks unsorted.
+   * Used for faster rejection of corrupt data. */
+  template <typename set_t>
+  inline bool add_coverage (set_t *glyphs) const {
     switch (u.format) {
     switch (u.format) {
-    case 1: u.format1.add_class (glyphs, klass); return;
-    case 2: u.format2.add_class (glyphs, klass); return;
-    default:return;
+    case 1: return u.format1.add_coverage (glyphs);
+    case 2: return u.format2.add_coverage (glyphs);
+    default:return false;
+    }
+  }
+
+  /* Might return false if array looks unsorted.
+   * Used for faster rejection of corrupt data. */
+  template <typename set_t>
+  inline bool add_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);
+    default:return false;
     }
   }
 
     }
   }
 
@@ -1159,7 +1210,7 @@ struct ClassDef
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   ClassDefFormat1      format1;
   ClassDefFormat2      format2;
   } u;
   ClassDefFormat1      format1;
   ClassDefFormat2      format2;
   } u;
@@ -1224,10 +1275,11 @@ struct VarRegionList
     const VarRegionAxis *axes = axesZ + (region_index * axisCount);
 
     float v = 1.;
     const VarRegionAxis *axes = axesZ + (region_index * axisCount);
 
     float v = 1.;
-    unsigned int count = MIN (coord_len, (unsigned int) axisCount);
+    unsigned int count = axisCount;
     for (unsigned int i = 0; i < count; i++)
     {
     for (unsigned int i = 0; i < count; i++)
     {
-      float factor = axes[i].evaluate (coords[i]);
+      int coord = i < coord_len ? coords[i] : 0;
+      float factor = axes[i].evaluate (coord);
       if (factor == 0.)
         return 0.;
       v *= factor;
       if (factor == 0.)
         return 0.;
       v *= factor;
@@ -1244,8 +1296,8 @@ struct VarRegionList
   }
 
   protected:
   }
 
   protected:
-  USHORT       axisCount;
-  USHORT       regionCount;
+  HBUINT16     axisCount;
+  HBUINT16     regionCount;
   VarRegionAxis        axesZ[VAR];
   public:
   DEFINE_SIZE_ARRAY (4, axesZ);
   VarRegionAxis        axesZ[VAR];
   public:
   DEFINE_SIZE_ARRAY (4, axesZ);
@@ -1269,19 +1321,19 @@ struct VarData
    unsigned int count = regionIndices.len;
    unsigned int scount = shortCount;
 
    unsigned int count = regionIndices.len;
    unsigned int scount = shortCount;
 
-   const BYTE *bytes = &StructAfter<BYTE> (regionIndices);
-   const BYTE *row = bytes + inner * (scount + count);
+   const HBUINT8 *bytes = &StructAfter<HBUINT8> (regionIndices);
+   const HBUINT8 *row = bytes + inner * (scount + count);
 
    float delta = 0.;
    unsigned int i = 0;
 
 
    float delta = 0.;
    unsigned int i = 0;
 
-   const SHORT *scursor = reinterpret_cast<const SHORT *> (row);
+   const HBINT16 *scursor = reinterpret_cast<const HBINT16 *> (row);
    for (; i < scount; i++)
    {
      float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count);
      delta += scalar * *scursor++;
    }
    for (; i < scount; i++)
    {
      float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count);
      delta += scalar * *scursor++;
    }
-   const INT8 *bcursor = reinterpret_cast<const INT8 *> (scursor);
+   const HBINT8 *bcursor = reinterpret_cast<const HBINT8 *> (scursor);
    for (; i < count; i++)
    {
      float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count);
    for (; i < count; i++)
    {
      float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count);
@@ -1297,15 +1349,15 @@ struct VarData
     return_trace (c->check_struct (this) &&
                  regionIndices.sanitize(c) &&
                  shortCount <= regionIndices.len &&
     return_trace (c->check_struct (this) &&
                  regionIndices.sanitize(c) &&
                  shortCount <= regionIndices.len &&
-                 c->check_array (&StructAfter<BYTE> (regionIndices),
+                 c->check_array (&StructAfter<HBUINT8> (regionIndices),
                                  get_row_size (), itemCount));
   }
 
   protected:
                                  get_row_size (), itemCount));
   }
 
   protected:
-  USHORT               itemCount;
-  USHORT               shortCount;
-  ArrayOf<USHORT>      regionIndices;
-  BYTE                 bytesX[VAR];
+  HBUINT16             itemCount;
+  HBUINT16             shortCount;
+  ArrayOf<HBUINT16>    regionIndices;
+  HBUINT8                      bytesX[VAR];
   public:
   DEFINE_SIZE_ARRAY2 (6, regionIndices, bytesX);
 };
   public:
   DEFINE_SIZE_ARRAY2 (6, regionIndices, bytesX);
 };
@@ -1341,9 +1393,9 @@ struct VariationStore
   }
 
   protected:
   }
 
   protected:
-  USHORT                               format;
+  HBUINT16                             format;
   LOffsetTo<VarRegionList>             regions;
   LOffsetTo<VarRegionList>             regions;
-  OffsetArrayOf<VarData, ULONG>                dataSets;
+  OffsetArrayOf<VarData, HBUINT32>     dataSets;
   public:
   DEFINE_SIZE_ARRAY (8, dataSets);
 };
   public:
   DEFINE_SIZE_ARRAY (8, dataSets);
 };
@@ -1370,8 +1422,8 @@ struct ConditionFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;         /* Format identifier--format = 1 */
-  USHORT       axisIndex;
+  HBUINT16     format;         /* Format identifier--format = 1 */
+  HBUINT16     axisIndex;
   F2DOT14      filterRangeMinValue;
   F2DOT14      filterRangeMaxValue;
   public:
   F2DOT14      filterRangeMinValue;
   F2DOT14      filterRangeMaxValue;
   public:
@@ -1400,7 +1452,7 @@ struct Condition
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   ConditionFormat1     format1;
   } u;
   public:
   ConditionFormat1     format1;
   } u;
   public:
@@ -1425,7 +1477,7 @@ struct ConditionSet
   }
 
   protected:
   }
 
   protected:
-  OffsetArrayOf<Condition, ULONG> conditions;
+  OffsetArrayOf<Condition, HBUINT32> conditions;
   public:
   DEFINE_SIZE_ARRAY (2, conditions);
 };
   public:
   DEFINE_SIZE_ARRAY (2, conditions);
 };
@@ -1441,7 +1493,7 @@ struct FeatureTableSubstitutionRecord
   }
 
   protected:
   }
 
   protected:
-  USHORT               featureIndex;
+  HBUINT16             featureIndex;
   LOffsetTo<Feature>   feature;
   public:
   DEFINE_SIZE_STATIC (6);
   LOffsetTo<Feature>   feature;
   public:
   DEFINE_SIZE_STATIC (6);
@@ -1458,7 +1510,7 @@ struct FeatureTableSubstitution
       if (record.featureIndex == feature_index)
        return &(this+record.feature);
     }
       if (record.featureIndex == feature_index)
        return &(this+record.feature);
     }
-    return NULL;
+    return nullptr;
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -1561,8 +1613,8 @@ struct HintingDevice
   inline unsigned int get_size (void) const
   {
     unsigned int f = deltaFormat;
   inline unsigned int get_size (void) const
   {
     unsigned int f = deltaFormat;
-    if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * USHORT::static_size;
-    return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f)));
+    if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * HBUINT16::static_size;
+    return HBUINT16::static_size * (4 + ((endSize - startSize) >> (4 - f)));
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -1607,14 +1659,14 @@ struct HintingDevice
   }
 
   protected:
   }
 
   protected:
-  USHORT       startSize;              /* Smallest size to correct--in ppem */
-  USHORT       endSize;                /* Largest size to correct--in ppem */
-  USHORT       deltaFormat;            /* Format of DeltaValue array data: 1, 2, or 3
+  HBUINT16     startSize;              /* Smallest size to correct--in ppem */
+  HBUINT16     endSize;                /* Largest size to correct--in ppem */
+  HBUINT16     deltaFormat;            /* Format of DeltaValue array data: 1, 2, or 3
                                         * 1    Signed 2-bit value, 8 values per uint16
                                         * 2    Signed 4-bit value, 4 values per uint16
                                         * 3    Signed 8-bit value, 2 values per uint16
                                         */
                                         * 1    Signed 2-bit value, 8 values per uint16
                                         * 2    Signed 4-bit value, 4 values per uint16
                                         * 3    Signed 8-bit value, 2 values per uint16
                                         */
-  USHORT       deltaValue[VAR];        /* Array of compressed data */
+  HBUINT16     deltaValue[VAR];        /* Array of compressed data */
   public:
   DEFINE_SIZE_ARRAY (6, deltaValue);
 };
   public:
   DEFINE_SIZE_ARRAY (6, deltaValue);
 };
@@ -1645,9 +1697,9 @@ struct VariationDevice
   }
 
   protected:
   }
 
   protected:
-  USHORT       outerIndex;
-  USHORT       innerIndex;
-  USHORT       deltaFormat;    /* Format identifier for this table: 0x0x8000 */
+  HBUINT16     outerIndex;
+  HBUINT16     innerIndex;
+  HBUINT16     deltaFormat;    /* Format identifier for this table: 0x0x8000 */
   public:
   DEFINE_SIZE_STATIC (6);
 };
   public:
   DEFINE_SIZE_STATIC (6);
 };
@@ -1655,10 +1707,10 @@ struct VariationDevice
 struct DeviceHeader
 {
   protected:
 struct DeviceHeader
 {
   protected:
-  USHORT               reserved1;
-  USHORT               reserved2;
+  HBUINT16             reserved1;
+  HBUINT16             reserved2;
   public:
   public:
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   public:
   DEFINE_SIZE_STATIC (6);
 };
   public:
   DEFINE_SIZE_STATIC (6);
 };
index 552df0f..2d6c66e 100644 (file)
@@ -41,7 +41,7 @@ namespace OT {
  * Attachment List Table
  */
 
  * Attachment List Table
  */
 
-typedef ArrayOf<USHORT> AttachPoint;   /* Array of contour point indices--in
+typedef ArrayOf<HBUINT16> AttachPoint; /* Array of contour point indices--in
                                         * increasing numerical order */
 
 struct AttachList
                                         * increasing numerical order */
 
 struct AttachList
@@ -62,7 +62,7 @@ struct AttachList
     const AttachPoint &points = this+attachPoint[index];
 
     if (point_count) {
     const AttachPoint &points = this+attachPoint[index];
 
     if (point_count) {
-      const USHORT *array = points.sub_array (start_offset, point_count);
+      const HBUINT16 *array = points.sub_array (start_offset, point_count);
       unsigned int count = *point_count;
       for (unsigned int i = 0; i < count; i++)
        point_array[i] = array[i];
       unsigned int count = *point_count;
       for (unsigned int i = 0; i < count; i++)
        point_array[i] = array[i];
@@ -109,8 +109,8 @@ struct CaretValueFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       caretValueFormat;       /* Format identifier--format = 1 */
-  SHORT                coordinate;             /* X or Y value, in design units */
+  HBUINT16     caretValueFormat;       /* Format identifier--format = 1 */
+  FWORD                coordinate;             /* X or Y value, in design units */
   public:
   DEFINE_SIZE_STATIC (4);
 };
   public:
   DEFINE_SIZE_STATIC (4);
 };
@@ -136,8 +136,8 @@ struct CaretValueFormat2
   }
 
   protected:
   }
 
   protected:
-  USHORT       caretValueFormat;       /* Format identifier--format = 2 */
-  USHORT       caretValuePoint;        /* Contour point index on glyph */
+  HBUINT16     caretValueFormat;       /* Format identifier--format = 2 */
+  HBUINT16     caretValuePoint;        /* Contour point index on glyph */
   public:
   DEFINE_SIZE_STATIC (4);
 };
   public:
   DEFINE_SIZE_STATIC (4);
 };
@@ -160,8 +160,8 @@ struct CaretValueFormat3
   }
 
   protected:
   }
 
   protected:
-  USHORT       caretValueFormat;       /* Format identifier--format = 3 */
-  SHORT                coordinate;             /* X or Y value, in design units */
+  HBUINT16     caretValueFormat;       /* Format identifier--format = 3 */
+  FWORD                coordinate;             /* X or Y value, in design units */
   OffsetTo<Device>
                deviceTable;            /* Offset to Device table for X or Y
                                         * value--from beginning of CaretValue
   OffsetTo<Device>
                deviceTable;            /* Offset to Device table for X or Y
                                         * value--from beginning of CaretValue
@@ -199,7 +199,7 @@ struct CaretValue
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   CaretValueFormat1    format1;
   CaretValueFormat2    format2;
   CaretValueFormat3    format3;
   CaretValueFormat1    format1;
   CaretValueFormat2    format2;
   CaretValueFormat3    format3;
@@ -294,7 +294,7 @@ struct MarkGlyphSetsFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   ArrayOf<LOffsetTo<Coverage> >
                coverage;               /* Array of long offsets to mark set
                                         * coverage tables */
   ArrayOf<LOffsetTo<Coverage> >
                coverage;               /* Array of long offsets to mark set
                                         * coverage tables */
@@ -324,7 +324,7 @@ struct MarkGlyphSets
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   MarkGlyphSetsFormat1 format1;
   } u;
   public:
   MarkGlyphSetsFormat1 format1;
   } u;
   public:
@@ -404,9 +404,9 @@ struct GDEF
   {
     unsigned int klass = get_glyph_class (glyph);
 
   {
     unsigned int klass = get_glyph_class (glyph);
 
-    ASSERT_STATIC ((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH == (unsigned int) LookupFlag::IgnoreBaseGlyphs);
-    ASSERT_STATIC ((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE == (unsigned int) LookupFlag::IgnoreLigatures);
-    ASSERT_STATIC ((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_MARK == (unsigned int) LookupFlag::IgnoreMarks);
+    static_assert (((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH == (unsigned int) LookupFlag::IgnoreBaseGlyphs), "");
+    static_assert (((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE == (unsigned int) LookupFlag::IgnoreLigatures), "");
+    static_assert (((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_MARK == (unsigned int) LookupFlag::IgnoreMarks), "");
 
     switch (klass) {
     default:                   return 0;
 
     switch (klass) {
     default:                   return 0;
index 952fd60..46ffcc6 100644 (file)
@@ -51,11 +51,11 @@ enum attach_type_t {
 
 /* Shared Tables: ValueRecord, Anchor Table, and MarkArray */
 
 
 /* Shared Tables: ValueRecord, Anchor Table, and MarkArray */
 
-typedef USHORT Value;
+typedef HBUINT16 Value;
 
 typedef Value ValueRecord[VAR];
 
 
 typedef Value ValueRecord[VAR];
 
-struct ValueFormat : USHORT
+struct ValueFormat : HBUINT16
 {
   enum Flags {
     xPlacement = 0x0001u,      /* Includes horizontal adjustment for placement */
 {
   enum Flags {
     xPlacement = 0x0001u,      /* Includes horizontal adjustment for placement */
@@ -74,14 +74,14 @@ struct ValueFormat : USHORT
 
 /* All fields are options.  Only those available advance the value pointer. */
 #if 0
 
 /* All fields are options.  Only those available advance the value pointer. */
 #if 0
-  SHORT                xPlacement;             /* Horizontal adjustment for
+  HBINT16              xPlacement;             /* Horizontal adjustment for
                                         * placement--in design units */
                                         * placement--in design units */
-  SHORT                yPlacement;             /* Vertical adjustment for
+  HBINT16              yPlacement;             /* Vertical adjustment for
                                         * placement--in design units */
                                         * placement--in design units */
-  SHORT                xAdvance;               /* Horizontal adjustment for
+  HBINT16              xAdvance;               /* Horizontal adjustment for
                                         * advance--in design units (only used
                                         * for horizontal writing) */
                                         * advance--in design units (only used
                                         * for horizontal writing) */
-  SHORT                yAdvance;               /* Vertical adjustment for advance--in
+  HBINT16              yAdvance;               /* Vertical adjustment for advance--in
                                         * design units (only used for vertical
                                         * writing) */
   Offset       xPlaDevice;             /* Offset to Device table for
                                         * design units (only used for vertical
                                         * writing) */
   Offset       xPlaDevice;             /* Offset to Device table for
@@ -99,11 +99,11 @@ struct ValueFormat : USHORT
 #endif
 
   inline unsigned int get_len (void) const
 #endif
 
   inline unsigned int get_len (void) const
-  { return _hb_popcount32 ((unsigned int) *this); }
+  { return _hb_popcount ((unsigned int) *this); }
   inline unsigned int get_size (void) const
   { return get_len () * Value::static_size; }
 
   inline unsigned int get_size (void) const
   { return get_len () * Value::static_size; }
 
-  void apply_value (hb_apply_context_t   *c,
+  void apply_value (hb_ot_apply_context_t   *c,
                    const void           *base,
                    const Value          *values,
                    hb_glyph_position_t  &glyph_pos) const
                    const void           *base,
                    const Value          *values,
                    hb_glyph_position_t  &glyph_pos) const
@@ -178,8 +178,8 @@ struct ValueFormat : USHORT
   static inline const OffsetTo<Device>& get_device (const Value* value)
   { return *CastP<OffsetTo<Device> > (value); }
 
   static inline const OffsetTo<Device>& get_device (const Value* value)
   { return *CastP<OffsetTo<Device> > (value); }
 
-  static inline const SHORT& get_short (const Value* value)
-  { return *CastP<SHORT> (value); }
+  static inline const HBINT16& get_short (const Value* value)
+  { return *CastP<HBINT16> (value); }
 
   public:
 
 
   public:
 
@@ -232,12 +232,12 @@ struct ValueFormat : USHORT
 
 struct AnchorFormat1
 {
 
 struct AnchorFormat1
 {
-  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
-                         hb_position_t *x, hb_position_t *y) const
+  inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
+                         float *x, float *y) const
   {
     hb_font_t *font = c->font;
   {
     hb_font_t *font = c->font;
-    *x = font->em_scale_x (xCoordinate);
-    *y = font->em_scale_y (yCoordinate);
+    *x = font->em_fscale_x (xCoordinate);
+    *y = font->em_fscale_y (yCoordinate);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -247,17 +247,17 @@ struct AnchorFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
-  SHORT                xCoordinate;            /* Horizontal value--in design units */
-  SHORT                yCoordinate;            /* Vertical value--in design units */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
+  FWORD                xCoordinate;            /* Horizontal value--in design units */
+  FWORD                yCoordinate;            /* Vertical value--in design units */
   public:
   DEFINE_SIZE_STATIC (6);
 };
 
 struct AnchorFormat2
 {
   public:
   DEFINE_SIZE_STATIC (6);
 };
 
 struct AnchorFormat2
 {
-  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id,
-                         hb_position_t *x, hb_position_t *y) const
+  inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id,
+                         float *x, float *y) const
   {
     hb_font_t *font = c->font;
     unsigned int x_ppem = font->x_ppem;
   {
     hb_font_t *font = c->font;
     unsigned int x_ppem = font->x_ppem;
@@ -267,8 +267,8 @@ struct AnchorFormat2
 
     ret = (x_ppem || y_ppem) &&
           font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy);
 
     ret = (x_ppem || y_ppem) &&
           font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy);
-    *x = ret && x_ppem ? cx : font->em_scale_x (xCoordinate);
-    *y = ret && y_ppem ? cy : font->em_scale_y (yCoordinate);
+    *x = ret && x_ppem ? cx : font->em_fscale_x (xCoordinate);
+    *y = ret && y_ppem ? cy : font->em_fscale_y (yCoordinate);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -278,22 +278,22 @@ struct AnchorFormat2
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 2 */
-  SHORT                xCoordinate;            /* Horizontal value--in design units */
-  SHORT                yCoordinate;            /* Vertical value--in design units */
-  USHORT       anchorPoint;            /* Index to glyph contour point */
+  HBUINT16     format;                 /* Format identifier--format = 2 */
+  FWORD                xCoordinate;            /* Horizontal value--in design units */
+  FWORD                yCoordinate;            /* Vertical value--in design units */
+  HBUINT16     anchorPoint;            /* Index to glyph contour point */
   public:
   DEFINE_SIZE_STATIC (8);
 };
 
 struct AnchorFormat3
 {
   public:
   DEFINE_SIZE_STATIC (8);
 };
 
 struct AnchorFormat3
 {
-  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
-                         hb_position_t *x, hb_position_t *y) const
+  inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
+                         float *x, float *y) const
   {
     hb_font_t *font = c->font;
   {
     hb_font_t *font = c->font;
-    *x = font->em_scale_x (xCoordinate);
-    *y = font->em_scale_y (yCoordinate);
+    *x = font->em_fscale_x (xCoordinate);
+    *y = font->em_fscale_y (yCoordinate);
 
     if (font->x_ppem || font->num_coords)
       *x += (this+xDeviceTable).get_x_delta (font, c->var_store);
 
     if (font->x_ppem || font->num_coords)
       *x += (this+xDeviceTable).get_x_delta (font, c->var_store);
@@ -308,9 +308,9 @@ struct AnchorFormat3
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 3 */
-  SHORT                xCoordinate;            /* Horizontal value--in design units */
-  SHORT                yCoordinate;            /* Vertical value--in design units */
+  HBUINT16     format;                 /* Format identifier--format = 3 */
+  FWORD                xCoordinate;            /* Horizontal value--in design units */
+  FWORD                yCoordinate;            /* Vertical value--in design units */
   OffsetTo<Device>
                xDeviceTable;           /* Offset to Device table for X
                                         * coordinate-- from beginning of
   OffsetTo<Device>
                xDeviceTable;           /* Offset to Device table for X
                                         * coordinate-- from beginning of
@@ -325,15 +325,15 @@ struct AnchorFormat3
 
 struct Anchor
 {
 
 struct Anchor
 {
-  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id,
-                         hb_position_t *x, hb_position_t *y) const
+  inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id,
+                         float *x, float *y) const
   {
     *x = *y = 0;
     switch (u.format) {
     case 1: u.format1.get_anchor (c, glyph_id, x, y); return;
     case 2: u.format2.get_anchor (c, glyph_id, x, y); return;
     case 3: u.format3.get_anchor (c, glyph_id, x, y); return;
   {
     *x = *y = 0;
     switch (u.format) {
     case 1: u.format1.get_anchor (c, glyph_id, x, y); return;
     case 2: u.format2.get_anchor (c, glyph_id, x, y); return;
     case 3: u.format3.get_anchor (c, glyph_id, x, y); return;
-    default:                                            return;
+    default:                                         return;
     }
   }
 
     }
   }
 
@@ -351,7 +351,7 @@ struct Anchor
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   AnchorFormat1                format1;
   AnchorFormat2                format2;
   AnchorFormat3                format3;
   AnchorFormat1                format1;
   AnchorFormat2                format2;
   AnchorFormat3                format3;
@@ -382,7 +382,7 @@ struct AnchorMatrix
     return_trace (true);
   }
 
     return_trace (true);
   }
 
-  USHORT       rows;                   /* Number of rows */
+  HBUINT16     rows;                   /* Number of rows */
   protected:
   OffsetTo<Anchor>
                matrixZ[VAR];           /* Matrix of offsets to Anchor tables--
   protected:
   OffsetTo<Anchor>
                matrixZ[VAR];           /* Matrix of offsets to Anchor tables--
@@ -403,7 +403,7 @@ struct MarkRecord
   }
 
   protected:
   }
 
   protected:
-  USHORT       klass;                  /* Class defined for this mark */
+  HBUINT16     klass;                  /* Class defined for this mark */
   OffsetTo<Anchor>
                markAnchor;             /* Offset to Anchor table--from
                                         * beginning of MarkArray table */
   OffsetTo<Anchor>
                markAnchor;             /* Offset to Anchor table--from
                                         * beginning of MarkArray table */
@@ -413,7 +413,7 @@ struct MarkRecord
 
 struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage order */
 {
 
 struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage order */
 {
-  inline bool apply (hb_apply_context_t *c,
+  inline bool apply (hb_ot_apply_context_t *c,
                     unsigned int mark_index, unsigned int glyph_index,
                     const AnchorMatrix &anchors, unsigned int class_count,
                     unsigned int glyph_pos) const
                     unsigned int mark_index, unsigned int glyph_index,
                     const AnchorMatrix &anchors, unsigned int class_count,
                     unsigned int glyph_pos) const
@@ -430,14 +430,15 @@ struct MarkArray : ArrayOf<MarkRecord>    /* Array of MarkRecords--in Coverage orde
      * return false such that the subsequent subtables have a chance at it. */
     if (unlikely (!found)) return_trace (false);
 
      * return false such that the subsequent subtables have a chance at it. */
     if (unlikely (!found)) return_trace (false);
 
-    hb_position_t mark_x, mark_y, base_x, base_y;
+    float mark_x, mark_y, base_x, base_y;
 
 
+    buffer->unsafe_to_break (glyph_pos, buffer->idx);
     mark_anchor.get_anchor (c, buffer->cur().codepoint, &mark_x, &mark_y);
     glyph_anchor.get_anchor (c, buffer->info[glyph_pos].codepoint, &base_x, &base_y);
 
     hb_glyph_position_t &o = buffer->cur_pos();
     mark_anchor.get_anchor (c, buffer->cur().codepoint, &mark_x, &mark_y);
     glyph_anchor.get_anchor (c, buffer->info[glyph_pos].codepoint, &base_x, &base_y);
 
     hb_glyph_position_t &o = buffer->cur_pos();
-    o.x_offset = base_x - mark_x;
-    o.y_offset = base_y - mark_y;
+    o.x_offset = round (base_x - mark_x);
+    o.y_offset = round (base_y - mark_y);
     o.attach_type() = ATTACH_TYPE_MARK;
     o.attach_chain() = (int) glyph_pos - (int) buffer->idx;
     buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
     o.attach_type() = ATTACH_TYPE_MARK;
     o.attach_chain() = (int) glyph_pos - (int) buffer->idx;
     buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
@@ -461,7 +462,7 @@ struct SinglePosFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    (this+coverage).add_coverage (c->input);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
   }
 
   inline const Coverage &get_coverage (void) const
   }
 
   inline const Coverage &get_coverage (void) const
@@ -469,7 +470,7 @@ struct SinglePosFormat1
     return this+coverage;
   }
 
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -491,7 +492,7 @@ struct SinglePosFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
@@ -509,7 +510,7 @@ struct SinglePosFormat2
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    (this+coverage).add_coverage (c->input);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
   }
 
   inline const Coverage &get_coverage (void) const
   }
 
   inline const Coverage &get_coverage (void) const
@@ -517,7 +518,7 @@ struct SinglePosFormat2
     return this+coverage;
   }
 
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -543,13 +544,13 @@ struct SinglePosFormat2
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 2 */
+  HBUINT16     format;                 /* Format identifier--format = 2 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
   ValueFormat  valueFormat;            /* Defines the types of data in the
                                         * ValueRecord */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
   ValueFormat  valueFormat;            /* Defines the types of data in the
                                         * ValueRecord */
-  USHORT       valueCount;             /* Number of ValueRecords */
+  HBUINT16     valueCount;             /* Number of ValueRecords */
   ValueRecord  values;                 /* Array of ValueRecords--positioning
                                         * values applied to glyphs */
   public:
   ValueRecord  values;                 /* Array of ValueRecords--positioning
                                         * values applied to glyphs */
   public:
@@ -572,7 +573,7 @@ struct SinglePos
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   SinglePosFormat1     format1;
   SinglePosFormat2     format2;
   } u;
   SinglePosFormat1     format1;
   SinglePosFormat2     format2;
   } u;
@@ -603,18 +604,13 @@ struct PairSet
     TRACE_COLLECT_GLYPHS (this);
     unsigned int len1 = valueFormats[0].get_len ();
     unsigned int len2 = valueFormats[1].get_len ();
     TRACE_COLLECT_GLYPHS (this);
     unsigned int len1 = valueFormats[0].get_len ();
     unsigned int len2 = valueFormats[1].get_len ();
-    unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
+    unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
 
     const PairValueRecord *record = CastP<PairValueRecord> (arrayZ);
 
     const PairValueRecord *record = CastP<PairValueRecord> (arrayZ);
-    unsigned int count = len;
-    for (unsigned int i = 0; i < count; i++)
-    {
-      c->input->add (record->secondGlyph);
-      record = &StructAtOffset<PairValueRecord> (record, record_size);
-    }
+    c->input->add_array (&record->secondGlyph, len, record_size);
   }
 
   }
 
-  inline bool apply (hb_apply_context_t *c,
+  inline bool apply (hb_ot_apply_context_t *c,
                     const ValueFormat *valueFormats,
                     unsigned int pos) const
   {
                     const ValueFormat *valueFormats,
                     unsigned int pos) const
   {
@@ -622,7 +618,7 @@ struct PairSet
     hb_buffer_t *buffer = c->buffer;
     unsigned int len1 = valueFormats[0].get_len ();
     unsigned int len2 = valueFormats[1].get_len ();
     hb_buffer_t *buffer = c->buffer;
     unsigned int len1 = valueFormats[0].get_len ();
     unsigned int len2 = valueFormats[1].get_len ();
-    unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
+    unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
 
     const PairValueRecord *record_array = CastP<PairValueRecord> (arrayZ);
     unsigned int count = len;
 
     const PairValueRecord *record_array = CastP<PairValueRecord> (arrayZ);
     unsigned int count = len;
@@ -643,6 +639,7 @@ struct PairSet
         min = mid + 1;
       else
       {
         min = mid + 1;
       else
       {
+        buffer->unsafe_to_break (buffer->idx, pos + 1);
        valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos());
        valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]);
        if (len2)
        valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos());
        valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]);
        if (len2)
@@ -666,7 +663,7 @@ struct PairSet
   {
     TRACE_SANITIZE (this);
     if (!(c->check_struct (this)
   {
     TRACE_SANITIZE (this);
     if (!(c->check_struct (this)
-       && c->check_array (arrayZ, USHORT::static_size * closure->stride, len))) return_trace (false);
+       && c->check_array (arrayZ, HBUINT16::static_size * closure->stride, len))) return_trace (false);
 
     unsigned int count = len;
     const PairValueRecord *record = CastP<PairValueRecord> (arrayZ);
 
     unsigned int count = len;
     const PairValueRecord *record = CastP<PairValueRecord> (arrayZ);
@@ -675,8 +672,8 @@ struct PairSet
   }
 
   protected:
   }
 
   protected:
-  USHORT       len;                    /* Number of PairValueRecords */
-  USHORT       arrayZ[VAR];            /* Array of PairValueRecords--ordered
+  HBUINT16     len;                    /* Number of PairValueRecords */
+  HBUINT16     arrayZ[VAR];            /* Array of PairValueRecords--ordered
                                         * by GlyphID of the second glyph */
   public:
   DEFINE_SIZE_ARRAY (2, arrayZ);
                                         * by GlyphID of the second glyph */
   public:
   DEFINE_SIZE_ARRAY (2, arrayZ);
@@ -687,7 +684,7 @@ struct PairPosFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    (this+coverage).add_coverage (c->input);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     unsigned int count = pairSet.len;
     for (unsigned int i = 0; i < count; i++)
       (this+pairSet[i]).collect_glyphs (c, valueFormat);
     unsigned int count = pairSet.len;
     for (unsigned int i = 0; i < count; i++)
       (this+pairSet[i]).collect_glyphs (c, valueFormat);
@@ -698,14 +695,14 @@ struct PairPosFormat1
     return this+coverage;
   }
 
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return_trace (false);
 
     skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return_trace (false);
 
@@ -731,7 +728,7 @@ struct PairPosFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
@@ -753,17 +750,8 @@ struct PairPosFormat2
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    (this+coverage).add_coverage (c->input);
-
-    unsigned int count1 = class1Count;
-    const ClassDef &klass1 = this+classDef1;
-    for (unsigned int i = 0; i < count1; i++)
-      klass1.add_class (c->input, i);
-
-    unsigned int count2 = class2Count;
-    const ClassDef &klass2 = this+classDef2;
-    for (unsigned int i = 0; i < count2; i++)
-      klass2.add_class (c->input, i);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+classDef2).add_coverage (c->input))) return;
   }
 
   inline const Coverage &get_coverage (void) const
   }
 
   inline const Coverage &get_coverage (void) const
@@ -771,14 +759,14 @@ struct PairPosFormat2
     return this+coverage;
   }
 
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return_trace (false);
 
     skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return_trace (false);
 
@@ -790,6 +778,7 @@ struct PairPosFormat2
     unsigned int klass2 = (this+classDef2).get_class (buffer->info[skippy_iter.idx].codepoint);
     if (unlikely (klass1 >= class1Count || klass2 >= class2Count)) return_trace (false);
 
     unsigned int klass2 = (this+classDef2).get_class (buffer->info[skippy_iter.idx].codepoint);
     if (unlikely (klass1 >= class1Count || klass2 >= class2Count)) return_trace (false);
 
+    buffer->unsafe_to_break (buffer->idx, skippy_iter.idx + 1);
     const Value *v = &values[record_len * (klass1 * class2Count + klass2)];
     valueFormat1.apply_value (c, this, v, buffer->cur_pos());
     valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]);
     const Value *v = &values[record_len * (klass1 * class2Count + klass2)];
     valueFormat1.apply_value (c, this, v, buffer->cur_pos());
     valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]);
@@ -820,7 +809,7 @@ struct PairPosFormat2
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 2 */
+  HBUINT16     format;                 /* Format identifier--format = 2 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
@@ -838,9 +827,9 @@ struct PairPosFormat2
                classDef2;              /* Offset to ClassDef table--from
                                         * beginning of PairPos subtable--for
                                         * the second glyph of the pair */
                classDef2;              /* Offset to ClassDef table--from
                                         * beginning of PairPos subtable--for
                                         * the second glyph of the pair */
-  USHORT       class1Count;            /* Number of classes in ClassDef1
+  HBUINT16     class1Count;            /* Number of classes in ClassDef1
                                         * table--includes Class0 */
                                         * table--includes Class0 */
-  USHORT       class2Count;            /* Number of classes in ClassDef2
+  HBUINT16     class2Count;            /* Number of classes in ClassDef2
                                         * table--includes Class0 */
   ValueRecord  values;                 /* Matrix of value pairs:
                                         * class1-major, class2-minor,
                                         * table--includes Class0 */
   ValueRecord  values;                 /* Matrix of value pairs:
                                         * class1-major, class2-minor,
@@ -865,7 +854,7 @@ struct PairPos
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   PairPosFormat1       format1;
   PairPosFormat2       format2;
   } u;
   PairPosFormat1       format1;
   PairPosFormat2       format2;
   } u;
@@ -903,7 +892,7 @@ struct CursivePosFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    (this+coverage).add_coverage (c->input);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
   }
 
   inline const Coverage &get_coverage (void) const
   }
 
   inline const Coverage &get_coverage (void) const
@@ -911,7 +900,7 @@ struct CursivePosFormat1
     return this+coverage;
   }
 
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -919,7 +908,7 @@ struct CursivePosFormat1
     const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage  (buffer->cur().codepoint)];
     if (!this_record.exitAnchor) return_trace (false);
 
     const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage  (buffer->cur().codepoint)];
     if (!this_record.exitAnchor) return_trace (false);
 
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return_trace (false);
 
     skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return_trace (false);
 
@@ -929,7 +918,8 @@ struct CursivePosFormat1
     unsigned int i = buffer->idx;
     unsigned int j = skippy_iter.idx;
 
     unsigned int i = buffer->idx;
     unsigned int j = skippy_iter.idx;
 
-    hb_position_t entry_x, entry_y, exit_x, exit_y;
+    buffer->unsafe_to_break (i, j);
+    float entry_x, entry_y, exit_x, exit_y;
     (this+this_record.exitAnchor).get_anchor (c, buffer->info[i].codepoint, &exit_x, &exit_y);
     (this+next_record.entryAnchor).get_anchor (c, buffer->info[j].codepoint, &entry_x, &entry_y);
 
     (this+this_record.exitAnchor).get_anchor (c, buffer->info[i].codepoint, &exit_x, &exit_y);
     (this+next_record.entryAnchor).get_anchor (c, buffer->info[j].codepoint, &entry_x, &entry_y);
 
@@ -939,32 +929,32 @@ struct CursivePosFormat1
     /* Main-direction adjustment */
     switch (c->direction) {
       case HB_DIRECTION_LTR:
     /* Main-direction adjustment */
     switch (c->direction) {
       case HB_DIRECTION_LTR:
-       pos[i].x_advance  =  exit_x + pos[i].x_offset;
+       pos[i].x_advance  = round (exit_x) + pos[i].x_offset;
 
 
-       d = entry_x + pos[j].x_offset;
+       d = round (entry_x) + pos[j].x_offset;
        pos[j].x_advance -= d;
        pos[j].x_offset  -= d;
        break;
       case HB_DIRECTION_RTL:
        pos[j].x_advance -= d;
        pos[j].x_offset  -= d;
        break;
       case HB_DIRECTION_RTL:
-       d = exit_x + pos[i].x_offset;
+       d = round (exit_x) + pos[i].x_offset;
        pos[i].x_advance -= d;
        pos[i].x_offset  -= d;
 
        pos[i].x_advance -= d;
        pos[i].x_offset  -= d;
 
-       pos[j].x_advance  =  entry_x + pos[j].x_offset;
+       pos[j].x_advance  = round (entry_x) + pos[j].x_offset;
        break;
       case HB_DIRECTION_TTB:
        break;
       case HB_DIRECTION_TTB:
-       pos[i].y_advance  =  exit_y + pos[i].y_offset;
+       pos[i].y_advance  = round (exit_y) + pos[i].y_offset;
 
 
-       d = entry_y + pos[j].y_offset;
+       d = round (entry_y) + pos[j].y_offset;
        pos[j].y_advance -= d;
        pos[j].y_offset  -= d;
        break;
       case HB_DIRECTION_BTT:
        pos[j].y_advance -= d;
        pos[j].y_offset  -= d;
        break;
       case HB_DIRECTION_BTT:
-       d = exit_y + pos[i].y_offset;
+       d = round (exit_y) + pos[i].y_offset;
        pos[i].y_advance -= d;
        pos[i].y_offset  -= d;
 
        pos[i].y_advance -= d;
        pos[i].y_offset  -= d;
 
-       pos[j].y_advance  =  entry_y;
+       pos[j].y_advance  = round (entry_y);
        break;
       case HB_DIRECTION_INVALID:
       default:
        break;
       case HB_DIRECTION_INVALID:
       default:
@@ -1018,7 +1008,7 @@ struct CursivePosFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of subtable */
@@ -1044,7 +1034,7 @@ struct CursivePos
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   CursivePosFormat1    format1;
   } u;
 };
   CursivePosFormat1    format1;
   } u;
 };
@@ -1060,8 +1050,8 @@ struct MarkBasePosFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    (this+markCoverage).add_coverage (c->input);
-    (this+baseCoverage).add_coverage (c->input);
+    if (unlikely (!(this+markCoverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+baseCoverage).add_coverage (c->input))) return;
   }
 
   inline const Coverage &get_coverage (void) const
   }
 
   inline const Coverage &get_coverage (void) const
@@ -1069,7 +1059,7 @@ struct MarkBasePosFormat1
     return this+markCoverage;
   }
 
     return this+markCoverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -1077,13 +1067,23 @@ struct MarkBasePosFormat1
     if (likely (mark_index == NOT_COVERED)) return_trace (false);
 
     /* Now we search backwards for a non-mark glyph */
     if (likely (mark_index == NOT_COVERED)) return_trace (false);
 
     /* Now we search backwards for a non-mark glyph */
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     do {
       if (!skippy_iter.prev ()) return_trace (false);
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     do {
       if (!skippy_iter.prev ()) return_trace (false);
-      /* We only want to attach to the first of a MultipleSubst sequence.  Reject others. */
-      if (0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx])) break;
+      /* We only want to attach to the first of a MultipleSubst sequence.
+       * https://github.com/harfbuzz/harfbuzz/issues/740
+       * Reject others. */
+      if (!_hb_glyph_info_multiplied (&buffer->info[skippy_iter.idx]) ||
+         0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) ||
+         (skippy_iter.idx == 0 ||
+          _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]) !=
+          _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx - 1]) ||
+          _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) !=
+          _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx - 1]) + 1
+          ))
+       break;
       skippy_iter.reject ();
     } while (1);
 
       skippy_iter.reject ();
     } while (1);
 
@@ -1107,14 +1107,14 @@ struct MarkBasePosFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                markCoverage;           /* Offset to MarkCoverage table--from
                                         * beginning of MarkBasePos subtable */
   OffsetTo<Coverage>
                baseCoverage;           /* Offset to BaseCoverage table--from
                                         * beginning of MarkBasePos subtable */
   OffsetTo<Coverage>
                markCoverage;           /* Offset to MarkCoverage table--from
                                         * beginning of MarkBasePos subtable */
   OffsetTo<Coverage>
                baseCoverage;           /* Offset to BaseCoverage table--from
                                         * beginning of MarkBasePos subtable */
-  USHORT       classCount;             /* Number of classes defined for marks */
+  HBUINT16     classCount;             /* Number of classes defined for marks */
   OffsetTo<MarkArray>
                markArray;              /* Offset to MarkArray table--from
                                         * beginning of MarkBasePos subtable */
   OffsetTo<MarkArray>
                markArray;              /* Offset to MarkArray table--from
                                         * beginning of MarkBasePos subtable */
@@ -1140,7 +1140,7 @@ struct MarkBasePos
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   MarkBasePosFormat1   format1;
   } u;
 };
   MarkBasePosFormat1   format1;
   } u;
 };
@@ -1161,8 +1161,8 @@ struct MarkLigPosFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    (this+markCoverage).add_coverage (c->input);
-    (this+ligatureCoverage).add_coverage (c->input);
+    if (unlikely (!(this+markCoverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+ligatureCoverage).add_coverage (c->input))) return;
   }
 
   inline const Coverage &get_coverage (void) const
   }
 
   inline const Coverage &get_coverage (void) const
@@ -1170,7 +1170,7 @@ struct MarkLigPosFormat1
     return this+markCoverage;
   }
 
     return this+markCoverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -1178,7 +1178,7 @@ struct MarkLigPosFormat1
     if (likely (mark_index == NOT_COVERED)) return_trace (false);
 
     /* Now we search backwards for a non-mark glyph */
     if (likely (mark_index == NOT_COVERED)) return_trace (false);
 
     /* Now we search backwards for a non-mark glyph */
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     if (!skippy_iter.prev ()) return_trace (false);
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     if (!skippy_iter.prev ()) return_trace (false);
@@ -1224,7 +1224,7 @@ struct MarkLigPosFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                markCoverage;           /* Offset to Mark Coverage table--from
                                         * beginning of MarkLigPos subtable */
   OffsetTo<Coverage>
                markCoverage;           /* Offset to Mark Coverage table--from
                                         * beginning of MarkLigPos subtable */
@@ -1232,7 +1232,7 @@ struct MarkLigPosFormat1
                ligatureCoverage;       /* Offset to Ligature Coverage
                                         * table--from beginning of MarkLigPos
                                         * subtable */
                ligatureCoverage;       /* Offset to Ligature Coverage
                                         * table--from beginning of MarkLigPos
                                         * subtable */
-  USHORT       classCount;             /* Number of defined mark classes */
+  HBUINT16     classCount;             /* Number of defined mark classes */
   OffsetTo<MarkArray>
                markArray;              /* Offset to MarkArray table--from
                                         * beginning of MarkLigPos subtable */
   OffsetTo<MarkArray>
                markArray;              /* Offset to MarkArray table--from
                                         * beginning of MarkLigPos subtable */
@@ -1258,7 +1258,7 @@ struct MarkLigPos
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   MarkLigPosFormat1    format1;
   } u;
 };
   MarkLigPosFormat1    format1;
   } u;
 };
@@ -1274,8 +1274,8 @@ struct MarkMarkPosFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    (this+mark1Coverage).add_coverage (c->input);
-    (this+mark2Coverage).add_coverage (c->input);
+    if (unlikely (!(this+mark1Coverage).add_coverage (c->input))) return;
+    if (unlikely (!(this+mark2Coverage).add_coverage (c->input))) return;
   }
 
   inline const Coverage &get_coverage (void) const
   }
 
   inline const Coverage &get_coverage (void) const
@@ -1283,7 +1283,7 @@ struct MarkMarkPosFormat1
     return this+mark1Coverage;
   }
 
     return this+mark1Coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
@@ -1291,7 +1291,7 @@ struct MarkMarkPosFormat1
     if (likely (mark1_index == NOT_COVERED)) return_trace (false);
 
     /* now we search backwards for a suitable mark glyph until a non-mark glyph */
     if (likely (mark1_index == NOT_COVERED)) return_trace (false);
 
     /* now we search backwards for a suitable mark glyph until a non-mark glyph */
-    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags);
     if (!skippy_iter.prev ()) return_trace (false);
     skippy_iter.reset (buffer->idx, 1);
     skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags);
     if (!skippy_iter.prev ()) return_trace (false);
@@ -1338,7 +1338,7 @@ struct MarkMarkPosFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                mark1Coverage;          /* Offset to Combining Mark1 Coverage
                                         * table--from beginning of MarkMarkPos
   OffsetTo<Coverage>
                mark1Coverage;          /* Offset to Combining Mark1 Coverage
                                         * table--from beginning of MarkMarkPos
@@ -1347,7 +1347,7 @@ struct MarkMarkPosFormat1
                mark2Coverage;          /* Offset to Combining Mark2 Coverage
                                         * table--from beginning of MarkMarkPos
                                         * subtable */
                mark2Coverage;          /* Offset to Combining Mark2 Coverage
                                         * table--from beginning of MarkMarkPos
                                         * subtable */
-  USHORT       classCount;             /* Number of defined mark classes */
+  HBUINT16     classCount;             /* Number of defined mark classes */
   OffsetTo<MarkArray>
                mark1Array;             /* Offset to Mark1Array table--from
                                         * beginning of MarkMarkPos subtable */
   OffsetTo<MarkArray>
                mark1Array;             /* Offset to Mark1Array table--from
                                         * beginning of MarkMarkPos subtable */
@@ -1373,7 +1373,7 @@ struct MarkMarkPos
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   MarkMarkPosFormat1   format1;
   } u;
 };
   MarkMarkPosFormat1   format1;
   } u;
 };
@@ -1432,7 +1432,7 @@ struct PosLookupSubTable
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               sub_format;
+  HBUINT16             sub_format;
   SinglePos            single;
   PairPos              pair;
   CursivePos           cursive;
   SinglePos            single;
   PairPos              pair;
   CursivePos           cursive;
@@ -1458,7 +1458,7 @@ struct PosLookup : Lookup
     return false;
   }
 
     return false;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     return_trace (dispatch (c));
   {
     TRACE_APPLY (this);
     return_trace (dispatch (c));
@@ -1477,7 +1477,7 @@ struct PosLookup : Lookup
     dispatch (&c);
   }
 
     dispatch (&c);
   }
 
-  static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
+  static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
 
   template <typename context_t>
   static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
 
   template <typename context_t>
   static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
@@ -1629,7 +1629,7 @@ template <typename context_t>
   return l.dispatch (c);
 }
 
   return l.dispatch (c);
 }
 
-/*static*/ inline bool PosLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
+/*static*/ inline bool PosLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
 {
   const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
   const PosLookup &l = gpos.get_lookup (lookup_index);
 {
   const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
   const PosLookup &l = gpos.get_lookup (lookup_index);
index 66fcb3f..5f67aed 100644 (file)
@@ -44,7 +44,7 @@ struct SingleSubstFormat1
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       /* TODO Switch to range-based API to work around malicious fonts.
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       /* TODO Switch to range-based API to work around malicious fonts.
-       * https://github.com/behdad/harfbuzz/issues/363 */
+       * https://github.com/harfbuzz/harfbuzz/issues/363 */
       hb_codepoint_t glyph_id = iter.get_glyph ();
       if (c->glyphs->has (glyph_id))
        c->glyphs->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
       hb_codepoint_t glyph_id = iter.get_glyph ();
       if (c->glyphs->has (glyph_id))
        c->glyphs->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
@@ -54,13 +54,13 @@ struct SingleSubstFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     Coverage::Iter iter;
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       /* TODO Switch to range-based API to work around malicious fonts.
     Coverage::Iter iter;
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       /* TODO Switch to range-based API to work around malicious fonts.
-       * https://github.com/behdad/harfbuzz/issues/363 */
+       * https://github.com/harfbuzz/harfbuzz/issues/363 */
       hb_codepoint_t glyph_id = iter.get_glyph ();
       hb_codepoint_t glyph_id = iter.get_glyph ();
-      c->input->add (glyph_id);
       c->output->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
     }
   }
       c->output->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
     }
   }
@@ -76,7 +76,7 @@ struct SingleSubstFormat1
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
@@ -110,11 +110,11 @@ struct SingleSubstFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
-  SHORT                deltaGlyphID;           /* Add to original GlyphID to get
+  HBINT16      deltaGlyphID;           /* Add to original GlyphID to get
                                         * substitute GlyphID */
   public:
   DEFINE_SIZE_STATIC (6);
                                         * substitute GlyphID */
   public:
   DEFINE_SIZE_STATIC (6);
@@ -130,7 +130,7 @@ struct SingleSubstFormat2
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
-        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
       if (c->glyphs->has (iter.get_glyph ()))
        c->glyphs->add (substitute[iter.get_coverage ()]);
     }
       if (c->glyphs->has (iter.get_glyph ()))
        c->glyphs->add (substitute[iter.get_coverage ()]);
     }
@@ -139,13 +139,13 @@ struct SingleSubstFormat2
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     Coverage::Iter iter;
     unsigned int count = substitute.len;
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
     Coverage::Iter iter;
     unsigned int count = substitute.len;
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
-        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
-      c->input->add (iter.get_glyph ());
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
       c->output->add (substitute[iter.get_coverage ()]);
     }
   }
       c->output->add (substitute[iter.get_coverage ()]);
     }
   }
@@ -161,7 +161,7 @@ struct SingleSubstFormat2
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
@@ -195,7 +195,7 @@ struct SingleSubstFormat2
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 2 */
+  HBUINT16     format;                 /* Format identifier--format = 2 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
@@ -249,7 +249,7 @@ struct SingleSubst
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   SingleSubstFormat1   format1;
   SingleSubstFormat2   format2;
   } u;
   SingleSubstFormat1   format1;
   SingleSubstFormat2   format2;
   } u;
@@ -269,12 +269,10 @@ struct Sequence
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    unsigned int count = substitute.len;
-    for (unsigned int i = 0; i < count; i++)
-      c->output->add (substitute[i]);
+    c->output->add_array (substitute.array, substitute.len);
   }
 
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int count = substitute.len;
   {
     TRACE_APPLY (this);
     unsigned int count = substitute.len;
@@ -287,7 +285,7 @@ struct Sequence
       return_trace (true);
     }
     /* Spec disallows this, but Uniscribe allows it.
       return_trace (true);
     }
     /* Spec disallows this, but Uniscribe allows it.
-     * https://github.com/behdad/harfbuzz/issues/253 */
+     * https://github.com/harfbuzz/harfbuzz/issues/253 */
     else if (unlikely (count == 0))
     {
       c->buffer->delete_glyph ();
     else if (unlikely (count == 0))
     {
       c->buffer->delete_glyph ();
@@ -339,7 +337,7 @@ struct MultipleSubstFormat1
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
-        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
       if (c->glyphs->has (iter.get_glyph ()))
        (this+sequence[iter.get_coverage ()]).closure (c);
     }
       if (c->glyphs->has (iter.get_glyph ()))
        (this+sequence[iter.get_coverage ()]).closure (c);
     }
@@ -348,7 +346,7 @@ struct MultipleSubstFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    (this+coverage).add_coverage (c->input);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     unsigned int count = sequence.len;
     for (unsigned int i = 0; i < count; i++)
        (this+sequence[i]).collect_glyphs (c);
     unsigned int count = sequence.len;
     for (unsigned int i = 0; i < count; i++)
        (this+sequence[i]).collect_glyphs (c);
@@ -365,7 +363,7 @@ struct MultipleSubstFormat1
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
 
   {
     TRACE_APPLY (this);
 
@@ -388,7 +386,7 @@ struct MultipleSubstFormat1
       if (unlikely (!sequence[i].serialize (c, this).serialize (c,
                                                                substitute_glyphs_list,
                                                                substitute_len_list[i]))) return_trace (false);
       if (unlikely (!sequence[i].serialize (c, this).serialize (c,
                                                                substitute_glyphs_list,
                                                                substitute_len_list[i]))) return_trace (false);
-    substitute_len_list.advance (num_glyphs);
+    substitute_len_list += num_glyphs;
     if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false);
     return_trace (true);
   }
     if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false);
     return_trace (true);
   }
@@ -400,7 +398,7 @@ struct MultipleSubstFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
@@ -442,7 +440,7 @@ struct MultipleSubst
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   MultipleSubstFormat1 format1;
   } u;
 };
   MultipleSubstFormat1 format1;
   } u;
 };
@@ -461,7 +459,7 @@ struct AlternateSubstFormat1
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
-        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
       if (c->glyphs->has (iter.get_glyph ())) {
        const AlternateSet &alt_set = this+alternateSet[iter.get_coverage ()];
        unsigned int count = alt_set.len;
       if (c->glyphs->has (iter.get_glyph ())) {
        const AlternateSet &alt_set = this+alternateSet[iter.get_coverage ()];
        unsigned int count = alt_set.len;
@@ -474,17 +472,15 @@ struct AlternateSubstFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     Coverage::Iter iter;
     unsigned int count = alternateSet.len;
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
     Coverage::Iter iter;
     unsigned int count = alternateSet.len;
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
-        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
-      c->input->add (iter.get_glyph ());
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
       const AlternateSet &alt_set = this+alternateSet[iter.get_coverage ()];
       const AlternateSet &alt_set = this+alternateSet[iter.get_coverage ()];
-      unsigned int count = alt_set.len;
-      for (unsigned int i = 0; i < count; i++)
-       c->output->add (alt_set[i]);
+      c->output->add_array (alt_set.array, alt_set.len);
     }
   }
 
     }
   }
 
@@ -499,7 +495,7 @@ struct AlternateSubstFormat1
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
@@ -540,7 +536,7 @@ struct AlternateSubstFormat1
       if (unlikely (!alternateSet[i].serialize (c, this).serialize (c,
                                                                    alternate_glyphs_list,
                                                                    alternate_len_list[i]))) return_trace (false);
       if (unlikely (!alternateSet[i].serialize (c, this).serialize (c,
                                                                    alternate_glyphs_list,
                                                                    alternate_len_list[i]))) return_trace (false);
-    alternate_len_list.advance (num_glyphs);
+    alternate_len_list += num_glyphs;
     if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false);
     return_trace (true);
   }
     if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false);
     return_trace (true);
   }
@@ -552,7 +548,7 @@ struct AlternateSubstFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
@@ -594,7 +590,7 @@ struct AlternateSubst
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   AlternateSubstFormat1        format1;
   } u;
 };
   AlternateSubstFormat1        format1;
   } u;
 };
@@ -615,9 +611,7 @@ struct Ligature
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    unsigned int count = component.len;
-    for (unsigned int i = 1; i < count; i++)
-      c->input->add (component[i]);
+    c->input->add_array (component.array, component.len ? component.len - 1 : 0);
     c->output->add (ligGlyph);
   }
 
     c->output->add (ligGlyph);
   }
 
@@ -634,7 +628,7 @@ struct Ligature
     return_trace (true);
   }
 
     return_trace (true);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int count = component.len;
   {
     TRACE_APPLY (this);
     unsigned int count = component.len;
@@ -658,7 +652,7 @@ struct Ligature
     if (likely (!match_input (c, count,
                              &component[1],
                              match_glyph,
     if (likely (!match_input (c, count,
                              &component[1],
                              match_glyph,
-                             NULL,
+                             nullptr,
                              &match_length,
                              match_positions,
                              &is_mark_ligature,
                              &match_length,
                              match_positions,
                              &is_mark_ligature,
@@ -736,7 +730,7 @@ struct LigatureSet
     return_trace (false);
   }
 
     return_trace (false);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int num_ligs = ligature.len;
   {
     TRACE_APPLY (this);
     unsigned int num_ligs = ligature.len;
@@ -763,8 +757,8 @@ struct LigatureSet
                                                                ligatures[i],
                                                                component_list,
                                                                component_count_list[i]))) return_trace (false);
                                                                ligatures[i],
                                                                component_list,
                                                                component_count_list[i]))) return_trace (false);
-    ligatures.advance (num_ligatures);
-    component_count_list.advance (num_ligatures);
+    ligatures += num_ligatures;
+    component_count_list += num_ligatures;
     return_trace (true);
   }
 
     return_trace (true);
   }
 
@@ -792,7 +786,7 @@ struct LigatureSubstFormat1
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
-        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
       if (c->glyphs->has (iter.get_glyph ()))
        (this+ligatureSet[iter.get_coverage ()]).closure (c);
     }
       if (c->glyphs->has (iter.get_glyph ()))
        (this+ligatureSet[iter.get_coverage ()]).closure (c);
     }
@@ -801,13 +795,13 @@ struct LigatureSubstFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     Coverage::Iter iter;
     unsigned int count = ligatureSet.len;
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
     Coverage::Iter iter;
     unsigned int count = ligatureSet.len;
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
-        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
-      c->input->add (iter.get_glyph ());
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
       (this+ligatureSet[iter.get_coverage ()]).collect_glyphs (c);
     }
   }
       (this+ligatureSet[iter.get_coverage ()]).collect_glyphs (c);
     }
   }
@@ -827,7 +821,7 @@ struct LigatureSubstFormat1
     return_trace (lig_set.would_apply (c));
   }
 
     return_trace (lig_set.would_apply (c));
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
   {
     TRACE_APPLY (this);
     hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
@@ -856,7 +850,7 @@ struct LigatureSubstFormat1
                                                                   component_count_list,
                                                                   ligature_per_first_glyph_count_list[i],
                                                                   component_list))) return_trace (false);
                                                                   component_count_list,
                                                                   ligature_per_first_glyph_count_list[i],
                                                                   component_list))) return_trace (false);
-    ligature_per_first_glyph_count_list.advance (num_first_glyphs);
+    ligature_per_first_glyph_count_list += num_first_glyphs;
     if (unlikely (!coverage.serialize (c, this).serialize (c, first_glyphs, num_first_glyphs))) return_trace (false);
     return_trace (true);
   }
     if (unlikely (!coverage.serialize (c, this).serialize (c, first_glyphs, num_first_glyphs))) return_trace (false);
     return_trace (true);
   }
@@ -868,7 +862,7 @@ struct LigatureSubstFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of Substitution table */
@@ -918,7 +912,7 @@ struct LigatureSubst
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   LigatureSubstFormat1 format1;
   } u;
 };
   LigatureSubstFormat1 format1;
   } u;
 };
@@ -961,7 +955,7 @@ struct ReverseChainSingleSubstFormat1
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
     for (iter.init (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
-        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
+        break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
       if (c->glyphs->has (iter.get_glyph ()))
        c->glyphs->add (substitute[iter.get_coverage ()]);
     }
       if (c->glyphs->has (iter.get_glyph ()))
        c->glyphs->add (substitute[iter.get_coverage ()]);
     }
@@ -970,25 +964,22 @@ struct ReverseChainSingleSubstFormat1
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-
-    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    if (unlikely (!(this+coverage).add_coverage (c->input))) return;
 
     unsigned int count;
 
 
     unsigned int count;
 
-    (this+coverage).add_coverage (c->input);
-
     count = backtrack.len;
     for (unsigned int i = 0; i < count; i++)
     count = backtrack.len;
     for (unsigned int i = 0; i < count; i++)
-      (this+backtrack[i]).add_coverage (c->before);
+      if (unlikely (!(this+backtrack[i]).add_coverage (c->before))) return;
 
 
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
     count = lookahead.len;
     for (unsigned int i = 0; i < count; i++)
     count = lookahead.len;
     for (unsigned int i = 0; i < count; i++)
-      (this+lookahead[i]).add_coverage (c->after);
+      if (unlikely (!(this+lookahead[i]).add_coverage (c->after))) return;
 
     const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
     count = substitute.len;
 
     const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
     count = substitute.len;
-    for (unsigned int i = 0; i < count; i++)
-      c->output->add (substitute[i]);
+    c->output->add_array (substitute.array, substitute.len);
   }
 
   inline const Coverage &get_coverage (void) const
   }
 
   inline const Coverage &get_coverage (void) const
@@ -1002,7 +993,7 @@ struct ReverseChainSingleSubstFormat1
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
     return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
   {
     TRACE_APPLY (this);
     if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
@@ -1014,14 +1005,17 @@ struct ReverseChainSingleSubstFormat1
     const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
     const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
 
     const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
     const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
 
+  unsigned int start_index = 0, end_index = 0;
     if (match_backtrack (c,
     if (match_backtrack (c,
-                        backtrack.len, (USHORT *) backtrack.array,
-                        match_coverage, this) &&
+                        backtrack.len, (HBUINT16 *) backtrack.array,
+                        match_coverage, this,
+                        &start_index) &&
         match_lookahead (c,
         match_lookahead (c,
-                        lookahead.len, (USHORT *) lookahead.array,
+                        lookahead.len, (HBUINT16 *) lookahead.array,
                         match_coverage, this,
                         match_coverage, this,
-                        1))
+                        1, &end_index))
     {
     {
+      c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index);
       c->replace_glyph_inplace (substitute[index]);
       /* Note: We DON'T decrease buffer->idx.  The main loop does it
        * for us.  This is useful for preventing surprises if someone
       c->replace_glyph_inplace (substitute[index]);
       /* Note: We DON'T decrease buffer->idx.  The main loop does it
        * for us.  This is useful for preventing surprises if someone
@@ -1045,7 +1039,7 @@ struct ReverseChainSingleSubstFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
@@ -1079,7 +1073,7 @@ struct ReverseChainSingleSubst
 
   protected:
   union {
 
   protected:
   union {
-  USHORT                               format;         /* Format identifier */
+  HBUINT16                             format;         /* Format identifier */
   ReverseChainSingleSubstFormat1       format1;
   } u;
 };
   ReverseChainSingleSubstFormat1       format1;
   } u;
 };
@@ -1125,7 +1119,7 @@ struct SubstLookupSubTable
 
   protected:
   union {
 
   protected:
   union {
-  USHORT                       sub_format;
+  HBUINT16                     sub_format;
   SingleSubst                  single;
   MultipleSubst                        multiple;
   AlternateSubst               alternate;
   SingleSubst                  single;
   MultipleSubst                        multiple;
   AlternateSubst               alternate;
@@ -1156,7 +1150,7 @@ struct SubstLookup : Lookup
     return lookup_type_is_reverse (type);
   }
 
     return lookup_type_is_reverse (type);
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     return_trace (dispatch (c));
   {
     TRACE_APPLY (this);
     return_trace (dispatch (c));
@@ -1192,7 +1186,7 @@ struct SubstLookup : Lookup
       return_trace (dispatch (c));
   }
 
       return_trace (dispatch (c));
   }
 
-  static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
+  static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index);
 
   inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
                                                  unsigned int i)
 
   inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
                                                  unsigned int i)
@@ -1277,8 +1271,9 @@ struct SubstLookup : Lookup
     if (unlikely (get_type () == SubstLookupSubTable::Extension))
     {
       /* The spec says all subtables of an Extension lookup should
     if (unlikely (get_type () == SubstLookupSubTable::Extension))
     {
       /* The spec says all subtables of an Extension lookup should
-       * have the same type.  This is specially important if one has
-       * a reverse type! */
+       * have the same type, which shall not be the Extension type
+       * itself (but we already checked for that).
+       * This is specially important if one has a reverse type! */
       unsigned int type = get_subtable (0).u.extension.get_type ();
       unsigned int count = get_subtable_count ();
       for (unsigned int i = 1; i < count; i++)
       unsigned int type = get_subtable (0).u.extension.get_type ();
       unsigned int count = get_subtable_count ();
       for (unsigned int i = 1; i < count; i++)
@@ -1348,7 +1343,7 @@ template <typename context_t>
   return l.dispatch (c);
 }
 
   return l.dispatch (c);
 }
 
-/*static*/ inline bool SubstLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
+/*static*/ inline bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
 {
   const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
   const SubstLookup &l = gsub.get_lookup (lookup_index);
 {
   const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
   const SubstLookup &l = gsub.get_lookup (lookup_index);
index 921859a..9054634 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH
 #define HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH
 
 #ifndef HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH
 #define HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH
 
+#include "hb-private.hh"
+#include "hb-debug.hh"
 #include "hb-buffer-private.hh"
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-set-private.hh"
 #include "hb-buffer-private.hh"
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-set-private.hh"
 namespace OT {
 
 
 namespace OT {
 
 
-#ifndef HB_DEBUG_CLOSURE
-#define HB_DEBUG_CLOSURE (HB_DEBUG+0)
-#endif
-
-#define TRACE_CLOSURE(this) \
-       hb_auto_trace_t<HB_DEBUG_CLOSURE, hb_void_t> trace \
-       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-        "");
-
 struct hb_closure_context_t :
        hb_dispatch_context_t<hb_closure_context_t, hb_void_t, HB_DEBUG_CLOSURE>
 {
 struct hb_closure_context_t :
        hb_dispatch_context_t<hb_closure_context_t, hb_void_t, HB_DEBUG_CLOSURE>
 {
@@ -77,7 +70,7 @@ struct hb_closure_context_t :
                        unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
                          face (face_),
                          glyphs (glyphs_),
                        unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
                          face (face_),
                          glyphs (glyphs_),
-                         recurse_func (NULL),
+                         recurse_func (nullptr),
                          nesting_level_left (nesting_level_left_),
                          debug_depth (0) {}
 
                          nesting_level_left (nesting_level_left_),
                          debug_depth (0) {}
 
@@ -85,16 +78,6 @@ struct hb_closure_context_t :
 };
 
 
 };
 
 
-
-#ifndef HB_DEBUG_WOULD_APPLY
-#define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0)
-#endif
-
-#define TRACE_WOULD_APPLY(this) \
-       hb_auto_trace_t<HB_DEBUG_WOULD_APPLY, bool> trace \
-       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-        "%d glyphs", c->len);
-
 struct hb_would_apply_context_t :
        hb_dispatch_context_t<hb_would_apply_context_t, bool, HB_DEBUG_WOULD_APPLY>
 {
 struct hb_would_apply_context_t :
        hb_dispatch_context_t<hb_would_apply_context_t, bool, HB_DEBUG_WOULD_APPLY>
 {
@@ -122,16 +105,6 @@ struct hb_would_apply_context_t :
 };
 
 
 };
 
 
-
-#ifndef HB_DEBUG_COLLECT_GLYPHS
-#define HB_DEBUG_COLLECT_GLYPHS (HB_DEBUG+0)
-#endif
-
-#define TRACE_COLLECT_GLYPHS(this) \
-       hb_auto_trace_t<HB_DEBUG_COLLECT_GLYPHS, hb_void_t> trace \
-       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-        "");
-
 struct hb_collect_glyphs_context_t :
        hb_dispatch_context_t<hb_collect_glyphs_context_t, hb_void_t, HB_DEBUG_COLLECT_GLYPHS>
 {
 struct hb_collect_glyphs_context_t :
        hb_dispatch_context_t<hb_collect_glyphs_context_t, hb_void_t, HB_DEBUG_COLLECT_GLYPHS>
 {
@@ -146,7 +119,7 @@ struct hb_collect_glyphs_context_t :
     if (unlikely (nesting_level_left == 0 || !recurse_func))
       return default_return_value ();
 
     if (unlikely (nesting_level_left == 0 || !recurse_func))
       return default_return_value ();
 
-    /* Note that GPOS sets recurse_func to NULL already, so it doesn't get
+    /* Note that GPOS sets recurse_func to nullptr already, so it doesn't get
      * past the previous check.  For GSUB, we only want to collect the output
      * glyphs in the recursion.  If output is not requested, we can go home now.
      *
      * past the previous check.  For GSUB, we only want to collect the output
      * glyphs in the recursion.  If output is not requested, we can go home now.
      *
@@ -160,7 +133,7 @@ struct hb_collect_glyphs_context_t :
       return HB_VOID;
 
     /* Return if new lookup was recursed to before. */
       return HB_VOID;
 
     /* Return if new lookup was recursed to before. */
-    if (recursed_lookups.has (lookup_index))
+    if (recursed_lookups->has (lookup_index))
       return HB_VOID;
 
     hb_set_t *old_before = before;
       return HB_VOID;
 
     hb_set_t *old_before = before;
@@ -176,7 +149,7 @@ struct hb_collect_glyphs_context_t :
     input  = old_input;
     after  = old_after;
 
     input  = old_input;
     after  = old_after;
 
-    recursed_lookups.add (lookup_index);
+    recursed_lookups->add (lookup_index);
 
     return HB_VOID;
   }
 
     return HB_VOID;
   }
@@ -187,31 +160,31 @@ struct hb_collect_glyphs_context_t :
   hb_set_t *after;
   hb_set_t *output;
   recurse_func_t recurse_func;
   hb_set_t *after;
   hb_set_t *output;
   recurse_func_t recurse_func;
-  hb_set_t recursed_lookups;
+  hb_set_t *recursed_lookups;
   unsigned int nesting_level_left;
   unsigned int debug_depth;
 
   hb_collect_glyphs_context_t (hb_face_t *face_,
   unsigned int nesting_level_left;
   unsigned int debug_depth;
 
   hb_collect_glyphs_context_t (hb_face_t *face_,
-                              hb_set_t  *glyphs_before, /* OUT. May be NULL */
-                              hb_set_t  *glyphs_input,  /* OUT. May be NULL */
-                              hb_set_t  *glyphs_after,  /* OUT. May be NULL */
-                              hb_set_t  *glyphs_output, /* OUT. May be NULL */
+                              hb_set_t  *glyphs_before, /* OUT. May be nullptr */
+                              hb_set_t  *glyphs_input,  /* OUT. May be nullptr */
+                              hb_set_t  *glyphs_after,  /* OUT. May be nullptr */
+                              hb_set_t  *glyphs_output, /* OUT. May be nullptr */
                               unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
                              face (face_),
                              before (glyphs_before ? glyphs_before : hb_set_get_empty ()),
                              input  (glyphs_input  ? glyphs_input  : hb_set_get_empty ()),
                              after  (glyphs_after  ? glyphs_after  : hb_set_get_empty ()),
                              output (glyphs_output ? glyphs_output : hb_set_get_empty ()),
                               unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
                              face (face_),
                              before (glyphs_before ? glyphs_before : hb_set_get_empty ()),
                              input  (glyphs_input  ? glyphs_input  : hb_set_get_empty ()),
                              after  (glyphs_after  ? glyphs_after  : hb_set_get_empty ()),
                              output (glyphs_output ? glyphs_output : hb_set_get_empty ()),
-                             recurse_func (NULL),
-                             recursed_lookups (),
+                             recurse_func (nullptr),
+                             recursed_lookups (nullptr),
                              nesting_level_left (nesting_level_left_),
                              debug_depth (0)
   {
                              nesting_level_left (nesting_level_left_),
                              debug_depth (0)
   {
-    recursed_lookups.init ();
+    recursed_lookups = hb_set_create ();
   }
   ~hb_collect_glyphs_context_t (void)
   {
   }
   ~hb_collect_glyphs_context_t (void)
   {
-    recursed_lookups.fini ();
+    hb_set_destroy (recursed_lookups);
   }
 
   void set_recurse_func (recurse_func_t func) { recurse_func = func; }
   }
 
   void set_recurse_func (recurse_func_t func) { recurse_func = func; }
@@ -219,10 +192,6 @@ struct hb_collect_glyphs_context_t :
 
 
 
 
 
 
-#ifndef HB_DEBUG_GET_COVERAGE
-#define HB_DEBUG_GET_COVERAGE (HB_DEBUG+0)
-#endif
-
 /* XXX Can we remove this? */
 
 template <typename set_t>
 /* XXX Can we remove this? */
 
 template <typename set_t>
@@ -249,19 +218,8 @@ struct hb_add_coverage_context_t :
 };
 
 
 };
 
 
-
-#ifndef HB_DEBUG_APPLY
-#define HB_DEBUG_APPLY (HB_DEBUG+0)
-#endif
-
-#define TRACE_APPLY(this) \
-       hb_auto_trace_t<HB_DEBUG_APPLY, bool> trace \
-       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-        "idx %d gid %u lookup %d", \
-        c->buffer->idx, c->buffer->cur().codepoint, (int) c->lookup_index);
-
-struct hb_apply_context_t :
-       hb_dispatch_context_t<hb_apply_context_t, bool, HB_DEBUG_APPLY>
+struct hb_ot_apply_context_t :
+       hb_dispatch_context_t<hb_ot_apply_context_t, bool, HB_DEBUG_APPLY>
 {
   struct matcher_t
   {
 {
   struct matcher_t
   {
@@ -273,10 +231,10 @@ struct hb_apply_context_t :
 #define arg1(arg) (arg) /* Remove the macro to see why it's needed! */
             syllable arg1(0),
 #undef arg1
 #define arg1(arg) (arg) /* Remove the macro to see why it's needed! */
             syllable arg1(0),
 #undef arg1
-            match_func (NULL),
-            match_data (NULL) {};
+            match_func (nullptr),
+            match_data (nullptr) {};
 
 
-    typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const void *data);
+    typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data);
 
     inline void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; }
     inline void set_ignore_zwj (bool ignore_zwj_) { ignore_zwj = ignore_zwj_; }
 
     inline void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; }
     inline void set_ignore_zwj (bool ignore_zwj_) { ignore_zwj = ignore_zwj_; }
@@ -294,7 +252,7 @@ struct hb_apply_context_t :
     };
 
     inline may_match_t may_match (const hb_glyph_info_t &info,
     };
 
     inline may_match_t may_match (const hb_glyph_info_t &info,
-                                 const USHORT          *glyph_data) const
+                                 const HBUINT16          *glyph_data) const
     {
       if (!(info.mask & mask) ||
          (syllable && syllable != info.syllable ()))
     {
       if (!(info.mask & mask) ||
          (syllable && syllable != info.syllable ()))
@@ -313,13 +271,13 @@ struct hb_apply_context_t :
     };
 
     inline may_skip_t
     };
 
     inline may_skip_t
-    may_skip (const hb_apply_context_t *c,
+    may_skip (const hb_ot_apply_context_t *c,
              const hb_glyph_info_t    &info) const
     {
       if (!c->check_glyph_property (&info, lookup_props))
        return SKIP_YES;
 
              const hb_glyph_info_t    &info) const
     {
       if (!c->check_glyph_property (&info, lookup_props))
        return SKIP_YES;
 
-      if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_fvs (&info) &&
+      if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_hidden (&info) &&
                    (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
                    (ignore_zwj || !_hb_glyph_info_is_zwj (&info))))
        return SKIP_MAYBE;
                    (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
                    (ignore_zwj || !_hb_glyph_info_is_zwj (&info))))
        return SKIP_MAYBE;
@@ -339,16 +297,16 @@ struct hb_apply_context_t :
 
   struct skipping_iterator_t
   {
 
   struct skipping_iterator_t
   {
-    inline void init (hb_apply_context_t *c_, bool context_match = false)
+    inline void init (hb_ot_apply_context_t *c_, bool context_match = false)
     {
       c = c_;
     {
       c = c_;
-      match_glyph_data = NULL;
-      matcher.set_match_func (NULL, NULL);
+      match_glyph_data = nullptr;
+      matcher.set_match_func (nullptr, nullptr);
       matcher.set_lookup_props (c->lookup_props);
       /* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */
       matcher.set_lookup_props (c->lookup_props);
       /* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */
-      matcher.set_ignore_zwnj (context_match || c->table_index == 1);
+      matcher.set_ignore_zwnj (c->table_index == 1 || (context_match && c->auto_zwnj));
       /* Ignore ZWJ if we are matching GSUB context, or matching GPOS, or if asked to. */
       /* Ignore ZWJ if we are matching GSUB context, or matching GPOS, or if asked to. */
-      matcher.set_ignore_zwj (context_match || c->table_index == 1 || c->auto_zwj);
+      matcher.set_ignore_zwj  (c->table_index == 1 || (context_match || c->auto_zwj));
       matcher.set_mask (context_match ? -1 : c->lookup_mask);
     }
     inline void set_lookup_props (unsigned int lookup_props)
       matcher.set_mask (context_match ? -1 : c->lookup_mask);
     }
     inline void set_lookup_props (unsigned int lookup_props)
@@ -357,7 +315,7 @@ struct hb_apply_context_t :
     }
     inline void set_match_func (matcher_t::match_func_t match_func_,
                                const void *match_data_,
     }
     inline void set_match_func (matcher_t::match_func_t match_func_,
                                const void *match_data_,
-                               const USHORT glyph_data[])
+                               const HBUINT16 glyph_data[])
     {
       matcher.set_match_func (match_func_, match_data_);
       match_glyph_data = glyph_data;
     {
       matcher.set_match_func (match_func_, match_data_);
       match_glyph_data = glyph_data;
@@ -374,6 +332,12 @@ struct hb_apply_context_t :
 
     inline void reject (void) { num_items++; match_glyph_data--; }
 
 
     inline void reject (void) { num_items++; match_glyph_data--; }
 
+    inline matcher_t::may_skip_t
+    may_skip (const hb_glyph_info_t    &info) const
+    {
+      return matcher.may_skip (c, info);
+    }
+
     inline bool next (void)
     {
       assert (num_items > 0);
     inline bool next (void)
     {
       assert (num_items > 0);
@@ -431,9 +395,9 @@ struct hb_apply_context_t :
 
     unsigned int idx;
     protected:
 
     unsigned int idx;
     protected:
-    hb_apply_context_t *c;
+    hb_ot_apply_context_t *c;
     matcher_t matcher;
     matcher_t matcher;
-    const USHORT *match_glyph_data;
+    const HBUINT16 *match_glyph_data;
 
     unsigned int num_items;
     unsigned int end;
 
     unsigned int num_items;
     unsigned int end;
@@ -441,61 +405,66 @@ struct hb_apply_context_t :
 
 
   inline const char *get_name (void) { return "APPLY"; }
 
 
   inline const char *get_name (void) { return "APPLY"; }
-  typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
+  typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index);
   template <typename T>
   inline return_t dispatch (const T &obj) { return obj.apply (this); }
   static return_t default_return_value (void) { return false; }
   bool stop_sublookup_iteration (return_t r) const { return r; }
   template <typename T>
   inline return_t dispatch (const T &obj) { return obj.apply (this); }
   static return_t default_return_value (void) { return false; }
   bool stop_sublookup_iteration (return_t r) const { return r; }
-  return_t recurse (unsigned int lookup_index)
+  return_t recurse (unsigned int sub_lookup_index)
   {
   {
-    if (unlikely (nesting_level_left == 0 || !recurse_func))
+    if (unlikely (nesting_level_left == 0 || !recurse_func || buffer->max_ops-- <= 0))
       return default_return_value ();
 
     nesting_level_left--;
       return default_return_value ();
 
     nesting_level_left--;
-    bool ret = recurse_func (this, lookup_index);
+    bool ret = recurse_func (this, sub_lookup_index);
     nesting_level_left++;
     return ret;
   }
 
     nesting_level_left++;
     return ret;
   }
 
-  unsigned int table_index; /* GSUB/GPOS */
+  skipping_iterator_t iter_input, iter_context;
+
   hb_font_t *font;
   hb_face_t *face;
   hb_buffer_t *buffer;
   hb_font_t *font;
   hb_face_t *face;
   hb_buffer_t *buffer;
-  hb_direction_t direction;
-  hb_mask_t lookup_mask;
-  bool auto_zwj;
   recurse_func_t recurse_func;
   recurse_func_t recurse_func;
-  unsigned int nesting_level_left;
-  unsigned int lookup_props;
   const GDEF &gdef;
   const GDEF &gdef;
-  bool has_glyph_classes;
   const VariationStore &var_store;
   const VariationStore &var_store;
-  skipping_iterator_t iter_input, iter_context;
+
+  hb_direction_t direction;
+  hb_mask_t lookup_mask;
+  unsigned int table_index; /* GSUB/GPOS */
   unsigned int lookup_index;
   unsigned int lookup_index;
+  unsigned int lookup_props;
+  unsigned int nesting_level_left;
   unsigned int debug_depth;
 
   unsigned int debug_depth;
 
+  bool auto_zwnj;
+  bool auto_zwj;
+  bool has_glyph_classes;
 
 
-  hb_apply_context_t (unsigned int table_index_,
+
+  hb_ot_apply_context_t (unsigned int table_index_,
                      hb_font_t *font_,
                      hb_buffer_t *buffer_) :
                      hb_font_t *font_,
                      hb_buffer_t *buffer_) :
-                       table_index (table_index_),
+                       iter_input (), iter_context (),
                        font (font_), face (font->face), buffer (buffer_),
                        font (font_), face (font->face), buffer (buffer_),
-                       direction (buffer_->props.direction),
-                       lookup_mask (1),
-                       auto_zwj (true),
-                       recurse_func (NULL),
-                       nesting_level_left (HB_MAX_NESTING_LEVEL),
-                       lookup_props (0),
+                       recurse_func (nullptr),
                        gdef (*hb_ot_layout_from_face (face)->gdef),
                        gdef (*hb_ot_layout_from_face (face)->gdef),
-                       has_glyph_classes (gdef.has_glyph_classes ()),
                        var_store (gdef.get_var_store ()),
                        var_store (gdef.get_var_store ()),
-                       iter_input (),
-                       iter_context (),
+                       direction (buffer_->props.direction),
+                       lookup_mask (1),
+                       table_index (table_index_),
                        lookup_index ((unsigned int) -1),
                        lookup_index ((unsigned int) -1),
-                       debug_depth (0) {}
+                       lookup_props (0),
+                       nesting_level_left (HB_MAX_NESTING_LEVEL),
+                       debug_depth (0),
+                       auto_zwnj (true),
+                       auto_zwj (true),
+                       has_glyph_classes (gdef.has_glyph_classes ()) {}
 
   inline void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; }
   inline void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; }
 
   inline void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; }
   inline void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; }
+  inline void set_auto_zwnj (bool auto_zwnj_) { auto_zwnj = auto_zwnj_; }
   inline void set_recurse_func (recurse_func_t func) { recurse_func = func; }
   inline void set_lookup_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
   inline void set_lookup_props (unsigned int lookup_props_)
   inline void set_recurse_func (recurse_func_t func) { recurse_func = func; }
   inline void set_lookup_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
   inline void set_lookup_props (unsigned int lookup_props_)
@@ -598,9 +567,9 @@ struct hb_apply_context_t :
 
 
 
 
 
 
-typedef bool (*intersects_func_t) (hb_set_t *glyphs, const USHORT &value, const void *data);
-typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const USHORT &value, const void *data);
-typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const void *data);
+typedef bool (*intersects_func_t) (hb_set_t *glyphs, const HBUINT16 &value, const void *data);
+typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const HBUINT16 &value, const void *data);
+typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data);
 
 struct ContextClosureFuncs
 {
 
 struct ContextClosureFuncs
 {
@@ -616,16 +585,16 @@ struct ContextApplyFuncs
 };
 
 
 };
 
 
-static inline bool intersects_glyph (hb_set_t *glyphs, const USHORT &value, const void *data HB_UNUSED)
+static inline bool intersects_glyph (hb_set_t *glyphs, const HBUINT16 &value, const void *data HB_UNUSED)
 {
   return glyphs->has (value);
 }
 {
   return glyphs->has (value);
 }
-static inline bool intersects_class (hb_set_t *glyphs, const USHORT &value, const void *data)
+static inline bool intersects_class (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
 {
   const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
   return class_def.intersects_class (glyphs, value);
 }
 {
   const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
   return class_def.intersects_class (glyphs, value);
 }
-static inline bool intersects_coverage (hb_set_t *glyphs, const USHORT &value, const void *data)
+static inline bool intersects_coverage (hb_set_t *glyphs, const HBUINT16 &value, const void *data)
 {
   const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
   return (data+coverage).intersects (glyphs);
 {
   const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
   return (data+coverage).intersects (glyphs);
@@ -633,7 +602,7 @@ static inline bool intersects_coverage (hb_set_t *glyphs, const USHORT &value, c
 
 static inline bool intersects_array (hb_closure_context_t *c,
                                     unsigned int count,
 
 static inline bool intersects_array (hb_closure_context_t *c,
                                     unsigned int count,
-                                    const USHORT values[],
+                                    const HBUINT16 values[],
                                     intersects_func_t intersects_func,
                                     const void *intersects_data)
 {
                                     intersects_func_t intersects_func,
                                     const void *intersects_data)
 {
@@ -644,16 +613,16 @@ static inline bool intersects_array (hb_closure_context_t *c,
 }
 
 
 }
 
 
-static inline void collect_glyph (hb_set_t *glyphs, const USHORT &value, const void *data HB_UNUSED)
+static inline void collect_glyph (hb_set_t *glyphs, const HBUINT16 &value, const void *data HB_UNUSED)
 {
   glyphs->add (value);
 }
 {
   glyphs->add (value);
 }
-static inline void collect_class (hb_set_t *glyphs, const USHORT &value, const void *data)
+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);
 }
 {
   const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
   class_def.add_class (glyphs, value);
 }
-static inline void collect_coverage (hb_set_t *glyphs, const USHORT &value, const void *data)
+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);
 {
   const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
   (data+coverage).add_coverage (glyphs);
@@ -661,7 +630,7 @@ static inline void collect_coverage (hb_set_t *glyphs, const USHORT &value, cons
 static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
                                  hb_set_t *glyphs,
                                  unsigned int count,
 static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
                                  hb_set_t *glyphs,
                                  unsigned int count,
-                                 const USHORT values[],
+                                 const HBUINT16 values[],
                                  collect_glyphs_func_t collect_func,
                                  const void *collect_data)
 {
                                  collect_glyphs_func_t collect_func,
                                  const void *collect_data)
 {
@@ -670,16 +639,16 @@ static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED,
 }
 
 
 }
 
 
-static inline bool match_glyph (hb_codepoint_t glyph_id, const USHORT &value, const void *data HB_UNUSED)
+static inline bool match_glyph (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data HB_UNUSED)
 {
   return glyph_id == value;
 }
 {
   return glyph_id == value;
 }
-static inline bool match_class (hb_codepoint_t glyph_id, const USHORT &value, const void *data)
+static inline bool match_class (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data)
 {
   const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
   return class_def.get_class (glyph_id) == value;
 }
 {
   const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
   return class_def.get_class (glyph_id) == value;
 }
-static inline bool match_coverage (hb_codepoint_t glyph_id, const USHORT &value, const void *data)
+static inline bool match_coverage (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data)
 {
   const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
   return (data+coverage).get_coverage (glyph_id) != NOT_COVERED;
 {
   const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value;
   return (data+coverage).get_coverage (glyph_id) != NOT_COVERED;
@@ -687,7 +656,7 @@ static inline bool match_coverage (hb_codepoint_t glyph_id, const USHORT &value,
 
 static inline bool would_match_input (hb_would_apply_context_t *c,
                                      unsigned int count, /* Including the first glyph (not matched) */
 
 static inline bool would_match_input (hb_would_apply_context_t *c,
                                      unsigned int count, /* Including the first glyph (not matched) */
-                                     const USHORT input[], /* Array of input values--start with second glyph */
+                                     const HBUINT16 input[], /* Array of input values--start with second glyph */
                                      match_func_t match_func,
                                      const void *match_data)
 {
                                      match_func_t match_func,
                                      const void *match_data)
 {
@@ -700,23 +669,23 @@ static inline bool would_match_input (hb_would_apply_context_t *c,
 
   return true;
 }
 
   return true;
 }
-static inline bool match_input (hb_apply_context_t *c,
+static inline bool match_input (hb_ot_apply_context_t *c,
                                unsigned int count, /* Including the first glyph (not matched) */
                                unsigned int count, /* Including the first glyph (not matched) */
-                               const USHORT input[], /* Array of input values--start with second glyph */
+                               const HBUINT16 input[], /* Array of input values--start with second glyph */
                                match_func_t match_func,
                                const void *match_data,
                                unsigned int *end_offset,
                                unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
                                match_func_t match_func,
                                const void *match_data,
                                unsigned int *end_offset,
                                unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
-                               bool *p_is_mark_ligature = NULL,
-                               unsigned int *p_total_component_count = NULL)
+                               bool *p_is_mark_ligature = nullptr,
+                               unsigned int *p_total_component_count = nullptr)
 {
 {
-  TRACE_APPLY (NULL);
+  TRACE_APPLY (nullptr);
 
   if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false);
 
   hb_buffer_t *buffer = c->buffer;
 
 
   if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false);
 
   hb_buffer_t *buffer = c->buffer;
 
-  hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
   skippy_iter.reset (buffer->idx, count - 1);
   skippy_iter.set_match_func (match_func, match_data, input);
 
   skippy_iter.reset (buffer->idx, count - 1);
   skippy_iter.set_match_func (match_func, match_data, input);
 
@@ -731,11 +700,17 @@ static inline bool match_input (hb_apply_context_t *c,
    * - Ligatures cannot be formed across glyphs attached to different components
    *   of previous ligatures.  Eg. the sequence is LAM,SHADDA,LAM,FATHA,HEH, and
    *   LAM,LAM,HEH form a ligature, leaving SHADDA,FATHA next to eachother.
    * - Ligatures cannot be formed across glyphs attached to different components
    *   of previous ligatures.  Eg. the sequence is LAM,SHADDA,LAM,FATHA,HEH, and
    *   LAM,LAM,HEH form a ligature, leaving SHADDA,FATHA next to eachother.
-   *   However, it would be wrong to ligate that SHADDA,FATHA sequence.o
-   *   There is an exception to this: If a ligature tries ligating with marks that
-   *   belong to it itself, go ahead, assuming that the font designer knows what
-   *   they are doing (otherwise it can break Indic stuff when a matra wants to
-   *   ligate with a conjunct...)
+   *   However, it would be wrong to ligate that SHADDA,FATHA sequence.
+   *   There are a couple of exceptions to this:
+   *
+   *   o If a ligature tries ligating with marks that belong to it itself, go ahead,
+   *     assuming that the font designer knows what they are doing (otherwise it can
+   *     break Indic stuff when a matra wants to ligate with a conjunct,
+   *
+   *   o If two marks want to ligate and they belong to different components of the
+   *     same ligature glyph, and said ligature glyph is to be ignored according to
+   *     mark-filtering rules, then allow.
+   *     https://github.com/harfbuzz/harfbuzz/issues/545
    */
 
   bool is_mark_ligature = _hb_glyph_info_is_mark (&buffer->cur());
    */
 
   bool is_mark_ligature = _hb_glyph_info_is_mark (&buffer->cur());
@@ -746,6 +721,12 @@ static inline bool match_input (hb_apply_context_t *c,
   unsigned int first_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
   unsigned int first_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
 
   unsigned int first_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
   unsigned int first_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
 
+  enum {
+    LIGBASE_NOT_CHECKED,
+    LIGBASE_MAY_NOT_SKIP,
+    LIGBASE_MAY_SKIP
+  } ligbase = LIGBASE_NOT_CHECKED;
+
   match_positions[0] = buffer->idx;
   for (unsigned int i = 1; i < count; i++)
   {
   match_positions[0] = buffer->idx;
   for (unsigned int i = 1; i < count; i++)
   {
@@ -756,13 +737,43 @@ static inline bool match_input (hb_apply_context_t *c,
     unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]);
     unsigned int this_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]);
 
     unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]);
     unsigned int this_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]);
 
-    if (first_lig_id && first_lig_comp) {
+    if (first_lig_id && first_lig_comp)
+    {
       /* If first component was attached to a previous ligature component,
        * all subsequent components should be attached to the same ligature
       /* If first component was attached to a previous ligature component,
        * all subsequent components should be attached to the same ligature
-       * component, otherwise we shouldn't ligate them. */
+       * component, otherwise we shouldn't ligate them... */
       if (first_lig_id != this_lig_id || first_lig_comp != this_lig_comp)
       if (first_lig_id != this_lig_id || first_lig_comp != this_lig_comp)
-       return_trace (false);
-    } else {
+      {
+        /* ...unless, we are attached to a base ligature and that base
+        * ligature is ignorable. */
+        if (ligbase == LIGBASE_NOT_CHECKED)
+       {
+         bool found = false;
+         const hb_glyph_info_t *out = buffer->out_info;
+         unsigned int j = buffer->out_len;
+         while (j && _hb_glyph_info_get_lig_id (&out[j - 1]) == first_lig_id)
+         {
+           if (_hb_glyph_info_get_lig_comp (&out[j - 1]) == 0)
+           {
+             j--;
+             found = true;
+             break;
+           }
+           j--;
+         }
+
+         if (found && skippy_iter.may_skip (out[j]) == hb_ot_apply_context_t::matcher_t::SKIP_YES)
+           ligbase = LIGBASE_MAY_SKIP;
+         else
+           ligbase = LIGBASE_MAY_NOT_SKIP;
+       }
+
+        if (ligbase == LIGBASE_MAY_NOT_SKIP)
+         return_trace (false);
+      }
+    }
+    else
+    {
       /* If first component was NOT attached to a previous ligature component,
        * all subsequent components should also NOT be attached to any ligature
        * component, unless they are attached to the first component itself! */
       /* If first component was NOT attached to a previous ligature component,
        * all subsequent components should also NOT be attached to any ligature
        * component, unless they are attached to the first component itself! */
@@ -784,7 +795,7 @@ static inline bool match_input (hb_apply_context_t *c,
 
   return_trace (true);
 }
 
   return_trace (true);
 }
-static inline bool ligate_input (hb_apply_context_t *c,
+static inline bool ligate_input (hb_ot_apply_context_t *c,
                                 unsigned int count, /* Including the first glyph */
                                 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
                                 unsigned int match_length,
                                 unsigned int count, /* Including the first glyph */
                                 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
                                 unsigned int match_length,
@@ -792,7 +803,7 @@ static inline bool ligate_input (hb_apply_context_t *c,
                                 bool is_mark_ligature,
                                 unsigned int total_component_count)
 {
                                 bool is_mark_ligature,
                                 unsigned int total_component_count)
 {
-  TRACE_APPLY (NULL);
+  TRACE_APPLY (nullptr);
 
   hb_buffer_t *buffer = c->buffer;
 
 
   hb_buffer_t *buffer = c->buffer;
 
@@ -882,15 +893,16 @@ static inline bool ligate_input (hb_apply_context_t *c,
   return_trace (true);
 }
 
   return_trace (true);
 }
 
-static inline bool match_backtrack (hb_apply_context_t *c,
+static inline bool match_backtrack (hb_ot_apply_context_t *c,
                                    unsigned int count,
                                    unsigned int count,
-                                   const USHORT backtrack[],
+                                   const HBUINT16 backtrack[],
                                    match_func_t match_func,
                                    match_func_t match_func,
-                                   const void *match_data)
+                                   const void *match_data,
+                                   unsigned int *match_start)
 {
 {
-  TRACE_APPLY (NULL);
+  TRACE_APPLY (nullptr);
 
 
-  hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
+  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
   skippy_iter.reset (c->buffer->backtrack_len (), count);
   skippy_iter.set_match_func (match_func, match_data, backtrack);
 
   skippy_iter.reset (c->buffer->backtrack_len (), count);
   skippy_iter.set_match_func (match_func, match_data, backtrack);
 
@@ -898,19 +910,22 @@ static inline bool match_backtrack (hb_apply_context_t *c,
     if (!skippy_iter.prev ())
       return_trace (false);
 
     if (!skippy_iter.prev ())
       return_trace (false);
 
+  *match_start = skippy_iter.idx;
+
   return_trace (true);
 }
 
   return_trace (true);
 }
 
-static inline bool match_lookahead (hb_apply_context_t *c,
+static inline bool match_lookahead (hb_ot_apply_context_t *c,
                                    unsigned int count,
                                    unsigned int count,
-                                   const USHORT lookahead[],
+                                   const HBUINT16 lookahead[],
                                    match_func_t match_func,
                                    const void *match_data,
                                    match_func_t match_func,
                                    const void *match_data,
-                                   unsigned int offset)
+                                   unsigned int offset,
+                                   unsigned int *end_index)
 {
 {
-  TRACE_APPLY (NULL);
+  TRACE_APPLY (nullptr);
 
 
-  hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
+  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
   skippy_iter.reset (c->buffer->idx + offset - 1, count);
   skippy_iter.set_match_func (match_func, match_data, lookahead);
 
   skippy_iter.reset (c->buffer->idx + offset - 1, count);
   skippy_iter.set_match_func (match_func, match_data, lookahead);
 
@@ -918,6 +933,8 @@ static inline bool match_lookahead (hb_apply_context_t *c,
     if (!skippy_iter.next ())
       return_trace (false);
 
     if (!skippy_iter.next ())
       return_trace (false);
 
+  *end_index = skippy_iter.idx + 1;
+
   return_trace (true);
 }
 
   return_trace (true);
 }
 
@@ -931,9 +948,9 @@ struct LookupRecord
     return_trace (c->check_struct (this));
   }
 
     return_trace (c->check_struct (this));
   }
 
-  USHORT       sequenceIndex;          /* Index into current glyph
+  HBUINT16     sequenceIndex;          /* Index into current glyph
                                         * sequence--first glyph = 0 */
                                         * sequence--first glyph = 0 */
-  USHORT       lookupListIndex;        /* Lookup to apply to that
+  HBUINT16     lookupListIndex;        /* Lookup to apply to that
                                         * position--zero--based */
   public:
   DEFINE_SIZE_STATIC (4);
                                         * position--zero--based */
   public:
   DEFINE_SIZE_STATIC (4);
@@ -949,14 +966,14 @@ static inline void recurse_lookups (context_t *c,
     c->recurse (lookupRecord[i].lookupListIndex);
 }
 
     c->recurse (lookupRecord[i].lookupListIndex);
 }
 
-static inline bool apply_lookup (hb_apply_context_t *c,
+static inline bool apply_lookup (hb_ot_apply_context_t *c,
                                 unsigned int count, /* Including the first glyph */
                                 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
                                 unsigned int lookupCount,
                                 const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
                                 unsigned int match_length)
 {
                                 unsigned int count, /* Including the first glyph */
                                 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
                                 unsigned int lookupCount,
                                 const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
                                 unsigned int match_length)
 {
-  TRACE_APPLY (NULL);
+  TRACE_APPLY (nullptr);
 
   hb_buffer_t *buffer = c->buffer;
   int end;
 
   hb_buffer_t *buffer = c->buffer;
   int end;
@@ -984,7 +1001,11 @@ static inline bool apply_lookup (hb_apply_context_t *c,
     if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)
       continue;
 
     if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)
       continue;
 
-    buffer->move_to (match_positions[idx]);
+    if (unlikely (!buffer->move_to (match_positions[idx])))
+      break;
+
+    if (unlikely (buffer->max_ops <= 0))
+      break;
 
     unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
     if (!c->recurse (lookupRecord[i].lookupListIndex))
 
     unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
     if (!c->recurse (lookupRecord[i].lookupListIndex))
@@ -1090,7 +1111,7 @@ struct ContextApplyLookupContext
 
 static inline void context_closure_lookup (hb_closure_context_t *c,
                                           unsigned int inputCount, /* Including the first glyph (not matched) */
 
 static inline void context_closure_lookup (hb_closure_context_t *c,
                                           unsigned int inputCount, /* Including the first glyph (not matched) */
-                                          const USHORT input[], /* Array of input values--start with second glyph */
+                                          const HBUINT16 input[], /* Array of input values--start with second glyph */
                                           unsigned int lookupCount,
                                           const LookupRecord lookupRecord[],
                                           ContextClosureLookupContext &lookup_context)
                                           unsigned int lookupCount,
                                           const LookupRecord lookupRecord[],
                                           ContextClosureLookupContext &lookup_context)
@@ -1104,7 +1125,7 @@ static inline void context_closure_lookup (hb_closure_context_t *c,
 
 static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
                                                  unsigned int inputCount, /* Including the first glyph (not matched) */
 
 static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
                                                  unsigned int inputCount, /* Including the first glyph (not matched) */
-                                                 const USHORT input[], /* Array of input values--start with second glyph */
+                                                 const HBUINT16 input[], /* Array of input values--start with second glyph */
                                                  unsigned int lookupCount,
                                                  const LookupRecord lookupRecord[],
                                                  ContextCollectGlyphsLookupContext &lookup_context)
                                                  unsigned int lookupCount,
                                                  const LookupRecord lookupRecord[],
                                                  ContextCollectGlyphsLookupContext &lookup_context)
@@ -1118,7 +1139,7 @@ static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c
 
 static inline bool context_would_apply_lookup (hb_would_apply_context_t *c,
                                               unsigned int inputCount, /* Including the first glyph (not matched) */
 
 static inline bool context_would_apply_lookup (hb_would_apply_context_t *c,
                                               unsigned int inputCount, /* Including the first glyph (not matched) */
-                                              const USHORT input[], /* Array of input values--start with second glyph */
+                                              const HBUINT16 input[], /* Array of input values--start with second glyph */
                                               unsigned int lookupCount HB_UNUSED,
                                               const LookupRecord lookupRecord[] HB_UNUSED,
                                               ContextApplyLookupContext &lookup_context)
                                               unsigned int lookupCount HB_UNUSED,
                                               const LookupRecord lookupRecord[] HB_UNUSED,
                                               ContextApplyLookupContext &lookup_context)
@@ -1127,9 +1148,9 @@ static inline bool context_would_apply_lookup (hb_would_apply_context_t *c,
                            inputCount, input,
                            lookup_context.funcs.match, lookup_context.match_data);
 }
                            inputCount, input,
                            lookup_context.funcs.match, lookup_context.match_data);
 }
-static inline bool context_apply_lookup (hb_apply_context_t *c,
+static inline bool context_apply_lookup (hb_ot_apply_context_t *c,
                                         unsigned int inputCount, /* Including the first glyph (not matched) */
                                         unsigned int inputCount, /* Including the first glyph (not matched) */
-                                        const USHORT input[], /* Array of input values--start with second glyph */
+                                        const HBUINT16 input[], /* Array of input values--start with second glyph */
                                         unsigned int lookupCount,
                                         const LookupRecord lookupRecord[],
                                         ContextApplyLookupContext &lookup_context)
                                         unsigned int lookupCount,
                                         const LookupRecord lookupRecord[],
                                         ContextApplyLookupContext &lookup_context)
@@ -1140,10 +1161,11 @@ static inline bool context_apply_lookup (hb_apply_context_t *c,
                      inputCount, input,
                      lookup_context.funcs.match, lookup_context.match_data,
                      &match_length, match_positions)
                      inputCount, input,
                      lookup_context.funcs.match, lookup_context.match_data,
                      &match_length, match_positions)
-      && apply_lookup (c,
+      && (c->buffer->unsafe_to_break (c->buffer->idx, c->buffer->idx + match_length),
+         apply_lookup (c,
                       inputCount, match_positions,
                       lookupCount, lookupRecord,
                       inputCount, match_positions,
                       lookupCount, lookupRecord,
-                      match_length);
+                      match_length));
 }
 
 struct Rule
 }
 
 struct Rule
@@ -1175,7 +1197,7 @@ struct Rule
     return_trace (context_would_apply_lookup (c, inputCount, inputZ, lookupCount, lookupRecord, lookup_context));
   }
 
     return_trace (context_would_apply_lookup (c, inputCount, inputZ, lookupCount, lookupRecord, lookup_context));
   }
 
-  inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
+  inline bool apply (hb_ot_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
     const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
   {
     TRACE_APPLY (this);
     const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
@@ -1186,24 +1208,24 @@ struct Rule
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return inputCount.sanitize (c)
-       && lookupCount.sanitize (c)
-       && c->check_range (inputZ,
-                          inputZ[0].static_size * inputCount
-                          + lookupRecordX[0].static_size * lookupCount);
+    return_trace (inputCount.sanitize (c) &&
+                 lookupCount.sanitize (c) &&
+                 c->check_range (inputZ,
+                                 inputZ[0].static_size * inputCount +
+                                 LookupRecord::static_size * lookupCount));
   }
 
   protected:
   }
 
   protected:
-  USHORT       inputCount;             /* Total number of glyphs in input
+  HBUINT16     inputCount;             /* Total number of glyphs in input
                                         * glyph sequence--includes the first
                                         * glyph */
                                         * glyph sequence--includes the first
                                         * glyph */
-  USHORT       lookupCount;            /* Number of LookupRecords */
-  USHORT       inputZ[VAR];            /* Array of match inputs--start with
+  HBUINT16     lookupCount;            /* Number of LookupRecords */
+  HBUINT16     inputZ[VAR];            /* Array of match inputs--start with
                                         * second glyph */
                                         * second glyph */
-  LookupRecord lookupRecordX[VAR];     /* Array of LookupRecords--in
+/*LookupRecord lookupRecordX[VAR];*/   /* Array of LookupRecords--in
                                         * design order */
   public:
                                         * design order */
   public:
-  DEFINE_SIZE_ARRAY2 (4, inputZ, lookupRecordX);
+  DEFINE_SIZE_ARRAY (4, inputZ);
 };
 
 struct RuleSet
 };
 
 struct RuleSet
@@ -1236,7 +1258,7 @@ struct RuleSet
     return_trace (false);
   }
 
     return_trace (false);
   }
 
-  inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
+  inline bool apply (hb_ot_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
     unsigned int num_rules = rule.len;
   {
     TRACE_APPLY (this);
     unsigned int num_rules = rule.len;
@@ -1273,7 +1295,7 @@ struct ContextFormat1
 
     struct ContextClosureLookupContext lookup_context = {
       {intersects_glyph},
 
     struct ContextClosureLookupContext lookup_context = {
       {intersects_glyph},
-      NULL
+      nullptr
     };
 
     unsigned int count = ruleSet.len;
     };
 
     unsigned int count = ruleSet.len;
@@ -1291,7 +1313,7 @@ struct ContextFormat1
 
     struct ContextCollectGlyphsLookupContext lookup_context = {
       {collect_glyph},
 
     struct ContextCollectGlyphsLookupContext lookup_context = {
       {collect_glyph},
-      NULL
+      nullptr
     };
 
     unsigned int count = ruleSet.len;
     };
 
     unsigned int count = ruleSet.len;
@@ -1306,7 +1328,7 @@ struct ContextFormat1
     const RuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
     struct ContextApplyLookupContext lookup_context = {
       {match_glyph},
     const RuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
     struct ContextApplyLookupContext lookup_context = {
       {match_glyph},
-      NULL
+      nullptr
     };
     return_trace (rule_set.would_apply (c, lookup_context));
   }
     };
     return_trace (rule_set.would_apply (c, lookup_context));
   }
@@ -1316,7 +1338,7 @@ struct ContextFormat1
     return this+coverage;
   }
 
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -1326,7 +1348,7 @@ struct ContextFormat1
     const RuleSet &rule_set = this+ruleSet[index];
     struct ContextApplyLookupContext lookup_context = {
       {match_glyph},
     const RuleSet &rule_set = this+ruleSet[index];
     struct ContextApplyLookupContext lookup_context = {
       {match_glyph},
-      NULL
+      nullptr
     };
     return_trace (rule_set.apply (c, lookup_context));
   }
     };
     return_trace (rule_set.apply (c, lookup_context));
   }
@@ -1338,7 +1360,7 @@ struct ContextFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
@@ -1408,7 +1430,7 @@ struct ContextFormat2
     return this+coverage;
   }
 
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -1431,7 +1453,7 @@ struct ContextFormat2
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 2 */
+  HBUINT16     format;                 /* Format identifier--format = 2 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
@@ -1460,7 +1482,7 @@ struct ContextFormat3
       this
     };
     context_closure_lookup (c,
       this
     };
     context_closure_lookup (c,
-                           glyphCount, (const USHORT *) (coverageZ + 1),
+                           glyphCount, (const HBUINT16 *) (coverageZ + 1),
                            lookupCount, lookupRecord,
                            lookup_context);
   }
                            lookupCount, lookupRecord,
                            lookup_context);
   }
@@ -1477,7 +1499,7 @@ struct ContextFormat3
     };
 
     context_collect_glyphs_lookup (c,
     };
 
     context_collect_glyphs_lookup (c,
-                                  glyphCount, (const USHORT *) (coverageZ + 1),
+                                  glyphCount, (const HBUINT16 *) (coverageZ + 1),
                                   lookupCount, lookupRecord,
                                   lookup_context);
   }
                                   lookupCount, lookupRecord,
                                   lookup_context);
   }
@@ -1491,7 +1513,7 @@ struct ContextFormat3
       {match_coverage},
       this
     };
       {match_coverage},
       this
     };
-    return_trace (context_would_apply_lookup (c, glyphCount, (const USHORT *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
+    return_trace (context_would_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
   }
 
   inline const Coverage &get_coverage (void) const
   }
 
   inline const Coverage &get_coverage (void) const
@@ -1499,7 +1521,7 @@ struct ContextFormat3
     return this+coverageZ[0];
   }
 
     return this+coverageZ[0];
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint);
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint);
@@ -1510,7 +1532,7 @@ struct ContextFormat3
       {match_coverage},
       this
     };
       {match_coverage},
       this
     };
-    return_trace (context_apply_lookup (c, glyphCount, (const USHORT *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
+    return_trace (context_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -1527,17 +1549,17 @@ struct ContextFormat3
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 3 */
-  USHORT       glyphCount;             /* Number of glyphs in the input glyph
+  HBUINT16     format;                 /* Format identifier--format = 3 */
+  HBUINT16     glyphCount;             /* Number of glyphs in the input glyph
                                         * sequence */
                                         * sequence */
-  USHORT       lookupCount;            /* Number of LookupRecords */
+  HBUINT16     lookupCount;            /* Number of LookupRecords */
   OffsetTo<Coverage>
                coverageZ[VAR];         /* Array of offsets to Coverage
                                         * table in glyph sequence order */
   OffsetTo<Coverage>
                coverageZ[VAR];         /* Array of offsets to Coverage
                                         * table in glyph sequence order */
-  LookupRecord lookupRecordX[VAR];     /* Array of LookupRecords--in
+/*LookupRecord lookupRecordX[VAR];*/   /* Array of LookupRecords--in
                                         * design order */
   public:
                                         * design order */
   public:
-  DEFINE_SIZE_ARRAY2 (6, coverageZ, lookupRecordX);
+  DEFINE_SIZE_ARRAY (6, coverageZ);
 };
 
 struct Context
 };
 
 struct Context
@@ -1557,7 +1579,7 @@ struct Context
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   ContextFormat1       format1;
   ContextFormat2       format2;
   ContextFormat3       format3;
   ContextFormat1       format1;
   ContextFormat2       format2;
   ContextFormat3       format3;
@@ -1587,11 +1609,11 @@ struct ChainContextApplyLookupContext
 
 static inline void chain_context_closure_lookup (hb_closure_context_t *c,
                                                 unsigned int backtrackCount,
 
 static inline void chain_context_closure_lookup (hb_closure_context_t *c,
                                                 unsigned int backtrackCount,
-                                                const USHORT backtrack[],
+                                                const HBUINT16 backtrack[],
                                                 unsigned int inputCount, /* Including the first glyph (not matched) */
                                                 unsigned int inputCount, /* Including the first glyph (not matched) */
-                                                const USHORT input[], /* Array of input values--start with second glyph */
+                                                const HBUINT16 input[], /* Array of input values--start with second glyph */
                                                 unsigned int lookaheadCount,
                                                 unsigned int lookaheadCount,
-                                                const USHORT lookahead[],
+                                                const HBUINT16 lookahead[],
                                                 unsigned int lookupCount,
                                                 const LookupRecord lookupRecord[],
                                                 ChainContextClosureLookupContext &lookup_context)
                                                 unsigned int lookupCount,
                                                 const LookupRecord lookupRecord[],
                                                 ChainContextClosureLookupContext &lookup_context)
@@ -1611,11 +1633,11 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c,
 
 static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
                                                        unsigned int backtrackCount,
 
 static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
                                                        unsigned int backtrackCount,
-                                                       const USHORT backtrack[],
+                                                       const HBUINT16 backtrack[],
                                                        unsigned int inputCount, /* Including the first glyph (not matched) */
                                                        unsigned int inputCount, /* Including the first glyph (not matched) */
-                                                       const USHORT input[], /* Array of input values--start with second glyph */
+                                                       const HBUINT16 input[], /* Array of input values--start with second glyph */
                                                        unsigned int lookaheadCount,
                                                        unsigned int lookaheadCount,
-                                                       const USHORT lookahead[],
+                                                       const HBUINT16 lookahead[],
                                                        unsigned int lookupCount,
                                                        const LookupRecord lookupRecord[],
                                                        ChainContextCollectGlyphsLookupContext &lookup_context)
                                                        unsigned int lookupCount,
                                                        const LookupRecord lookupRecord[],
                                                        ChainContextCollectGlyphsLookupContext &lookup_context)
@@ -1635,11 +1657,11 @@ static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_contex
 
 static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
                                                     unsigned int backtrackCount,
 
 static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
                                                     unsigned int backtrackCount,
-                                                    const USHORT backtrack[] HB_UNUSED,
+                                                    const HBUINT16 backtrack[] HB_UNUSED,
                                                     unsigned int inputCount, /* Including the first glyph (not matched) */
                                                     unsigned int inputCount, /* Including the first glyph (not matched) */
-                                                    const USHORT input[], /* Array of input values--start with second glyph */
+                                                    const HBUINT16 input[], /* Array of input values--start with second glyph */
                                                     unsigned int lookaheadCount,
                                                     unsigned int lookaheadCount,
-                                                    const USHORT lookahead[] HB_UNUSED,
+                                                    const HBUINT16 lookahead[] HB_UNUSED,
                                                     unsigned int lookupCount HB_UNUSED,
                                                     const LookupRecord lookupRecord[] HB_UNUSED,
                                                     ChainContextApplyLookupContext &lookup_context)
                                                     unsigned int lookupCount HB_UNUSED,
                                                     const LookupRecord lookupRecord[] HB_UNUSED,
                                                     ChainContextApplyLookupContext &lookup_context)
@@ -1650,18 +1672,18 @@ static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c
                            lookup_context.funcs.match, lookup_context.match_data[1]);
 }
 
                            lookup_context.funcs.match, lookup_context.match_data[1]);
 }
 
-static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
+static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
                                               unsigned int backtrackCount,
                                               unsigned int backtrackCount,
-                                              const USHORT backtrack[],
+                                              const HBUINT16 backtrack[],
                                               unsigned int inputCount, /* Including the first glyph (not matched) */
                                               unsigned int inputCount, /* Including the first glyph (not matched) */
-                                              const USHORT input[], /* Array of input values--start with second glyph */
+                                              const HBUINT16 input[], /* Array of input values--start with second glyph */
                                               unsigned int lookaheadCount,
                                               unsigned int lookaheadCount,
-                                              const USHORT lookahead[],
+                                              const HBUINT16 lookahead[],
                                               unsigned int lookupCount,
                                               const LookupRecord lookupRecord[],
                                               ChainContextApplyLookupContext &lookup_context)
 {
                                               unsigned int lookupCount,
                                               const LookupRecord lookupRecord[],
                                               ChainContextApplyLookupContext &lookup_context)
 {
-  unsigned int match_length = 0;
+  unsigned int start_index = 0, match_length = 0, end_index = 0;
   unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
   return match_input (c,
                      inputCount, input,
   unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
   return match_input (c,
                      inputCount, input,
@@ -1669,15 +1691,17 @@ static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
                      &match_length, match_positions)
       && match_backtrack (c,
                          backtrackCount, backtrack,
                      &match_length, match_positions)
       && match_backtrack (c,
                          backtrackCount, backtrack,
-                         lookup_context.funcs.match, lookup_context.match_data[0])
+                         lookup_context.funcs.match, lookup_context.match_data[0],
+                         &start_index)
       && match_lookahead (c,
                          lookaheadCount, lookahead,
                          lookup_context.funcs.match, lookup_context.match_data[2],
       && match_lookahead (c,
                          lookaheadCount, lookahead,
                          lookup_context.funcs.match, lookup_context.match_data[2],
-                         match_length)
-      && apply_lookup (c,
+                         match_length, &end_index)
+      && (c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index),
+          apply_lookup (c,
                       inputCount, match_positions,
                       lookupCount, lookupRecord,
                       inputCount, match_positions,
                       lookupCount, lookupRecord,
-                      match_length);
+                      match_length));
 }
 
 struct ChainRule
 }
 
 struct ChainRule
@@ -1685,8 +1709,8 @@ struct ChainRule
   inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
   {
     TRACE_CLOSURE (this);
   inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
   {
     TRACE_CLOSURE (this);
-    const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
-    const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     chain_context_closure_lookup (c,
                                  backtrack.len, backtrack.array,
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     chain_context_closure_lookup (c,
                                  backtrack.len, backtrack.array,
@@ -1699,8 +1723,8 @@ struct ChainRule
   inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
-    const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     chain_context_collect_glyphs_lookup (c,
                                         backtrack.len, backtrack.array,
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     chain_context_collect_glyphs_lookup (c,
                                         backtrack.len, backtrack.array,
@@ -1713,8 +1737,8 @@ struct ChainRule
   inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
   {
     TRACE_WOULD_APPLY (this);
   inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
   {
     TRACE_WOULD_APPLY (this);
-    const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
-    const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return_trace (chain_context_would_apply_lookup (c,
                                                    backtrack.len, backtrack.array,
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return_trace (chain_context_would_apply_lookup (c,
                                                    backtrack.len, backtrack.array,
@@ -1723,11 +1747,11 @@ struct ChainRule
                                                    lookup.array, lookup_context));
   }
 
                                                    lookup.array, lookup_context));
   }
 
-  inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
+  inline bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
   {
     TRACE_APPLY (this);
-    const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
-    const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return_trace (chain_context_apply_lookup (c,
                                              backtrack.len, backtrack.array,
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return_trace (chain_context_apply_lookup (c,
                                              backtrack.len, backtrack.array,
@@ -1740,23 +1764,23 @@ struct ChainRule
   {
     TRACE_SANITIZE (this);
     if (!backtrack.sanitize (c)) return_trace (false);
   {
     TRACE_SANITIZE (this);
     if (!backtrack.sanitize (c)) return_trace (false);
-    const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
+    const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack);
     if (!input.sanitize (c)) return_trace (false);
     if (!input.sanitize (c)) return_trace (false);
-    const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
+    const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input);
     if (!lookahead.sanitize (c)) return_trace (false);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return_trace (lookup.sanitize (c));
   }
 
   protected:
     if (!lookahead.sanitize (c)) return_trace (false);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return_trace (lookup.sanitize (c));
   }
 
   protected:
-  ArrayOf<USHORT>
+  ArrayOf<HBUINT16>
                backtrack;              /* Array of backtracking values
                                         * (to be matched before the input
                                         * sequence) */
                backtrack;              /* Array of backtracking values
                                         * (to be matched before the input
                                         * sequence) */
-  HeadlessArrayOf<USHORT>
+  HeadlessArrayOf<HBUINT16>
                inputX;                 /* Array of input values (start with
                                         * second glyph) */
                inputX;                 /* Array of input values (start with
                                         * second glyph) */
-  ArrayOf<USHORT>
+  ArrayOf<HBUINT16>
                lookaheadX;             /* Array of lookahead values's (to be
                                         * matched after the input sequence) */
   ArrayOf<LookupRecord>
                lookaheadX;             /* Array of lookahead values's (to be
                                         * matched after the input sequence) */
   ArrayOf<LookupRecord>
@@ -1795,7 +1819,7 @@ struct ChainRuleSet
     return_trace (false);
   }
 
     return_trace (false);
   }
 
-  inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
+  inline bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
     unsigned int num_rules = rule.len;
   {
     TRACE_APPLY (this);
     unsigned int num_rules = rule.len;
@@ -1829,7 +1853,7 @@ struct ChainContextFormat1
 
     struct ChainContextClosureLookupContext lookup_context = {
       {intersects_glyph},
 
     struct ChainContextClosureLookupContext lookup_context = {
       {intersects_glyph},
-      {NULL, NULL, NULL}
+      {nullptr, nullptr, nullptr}
     };
 
     unsigned int count = ruleSet.len;
     };
 
     unsigned int count = ruleSet.len;
@@ -1847,7 +1871,7 @@ struct ChainContextFormat1
 
     struct ChainContextCollectGlyphsLookupContext lookup_context = {
       {collect_glyph},
 
     struct ChainContextCollectGlyphsLookupContext lookup_context = {
       {collect_glyph},
-      {NULL, NULL, NULL}
+      {nullptr, nullptr, nullptr}
     };
 
     unsigned int count = ruleSet.len;
     };
 
     unsigned int count = ruleSet.len;
@@ -1862,7 +1886,7 @@ struct ChainContextFormat1
     const ChainRuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
     struct ChainContextApplyLookupContext lookup_context = {
       {match_glyph},
     const ChainRuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])];
     struct ChainContextApplyLookupContext lookup_context = {
       {match_glyph},
-      {NULL, NULL, NULL}
+      {nullptr, nullptr, nullptr}
     };
     return_trace (rule_set.would_apply (c, lookup_context));
   }
     };
     return_trace (rule_set.would_apply (c, lookup_context));
   }
@@ -1872,7 +1896,7 @@ struct ChainContextFormat1
     return this+coverage;
   }
 
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -1881,7 +1905,7 @@ struct ChainContextFormat1
     const ChainRuleSet &rule_set = this+ruleSet[index];
     struct ChainContextApplyLookupContext lookup_context = {
       {match_glyph},
     const ChainRuleSet &rule_set = this+ruleSet[index];
     struct ChainContextApplyLookupContext lookup_context = {
       {match_glyph},
-      {NULL, NULL, NULL}
+      {nullptr, nullptr, nullptr}
     };
     return_trace (rule_set.apply (c, lookup_context));
   }
     };
     return_trace (rule_set.apply (c, lookup_context));
   }
@@ -1893,7 +1917,7 @@ struct ChainContextFormat1
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 1 */
+  HBUINT16     format;                 /* Format identifier--format = 1 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
@@ -1976,7 +2000,7 @@ struct ChainContextFormat2
     return this+coverage;
   }
 
     return this+coverage;
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
   {
     TRACE_APPLY (this);
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -2008,7 +2032,7 @@ struct ChainContextFormat2
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 2 */
+  HBUINT16     format;                 /* Format identifier--format = 2 */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
   OffsetTo<Coverage>
                coverage;               /* Offset to Coverage table--from
                                         * beginning of table */
@@ -2048,9 +2072,9 @@ struct ChainContextFormat3
       {this, this, this}
     };
     chain_context_closure_lookup (c,
       {this, this, this}
     };
     chain_context_closure_lookup (c,
-                                 backtrack.len, (const USHORT *) backtrack.array,
-                                 input.len, (const USHORT *) input.array + 1,
-                                 lookahead.len, (const USHORT *) lookahead.array,
+                                 backtrack.len, (const HBUINT16 *) backtrack.array,
+                                 input.len, (const HBUINT16 *) input.array + 1,
+                                 lookahead.len, (const HBUINT16 *) lookahead.array,
                                  lookup.len, lookup.array,
                                  lookup_context);
   }
                                  lookup.len, lookup.array,
                                  lookup_context);
   }
@@ -2069,9 +2093,9 @@ struct ChainContextFormat3
       {this, this, this}
     };
     chain_context_collect_glyphs_lookup (c,
       {this, this, this}
     };
     chain_context_collect_glyphs_lookup (c,
-                                        backtrack.len, (const USHORT *) backtrack.array,
-                                        input.len, (const USHORT *) input.array + 1,
-                                        lookahead.len, (const USHORT *) lookahead.array,
+                                        backtrack.len, (const HBUINT16 *) backtrack.array,
+                                        input.len, (const HBUINT16 *) input.array + 1,
+                                        lookahead.len, (const HBUINT16 *) lookahead.array,
                                         lookup.len, lookup.array,
                                         lookup_context);
   }
                                         lookup.len, lookup.array,
                                         lookup_context);
   }
@@ -2088,9 +2112,9 @@ struct ChainContextFormat3
       {this, this, this}
     };
     return_trace (chain_context_would_apply_lookup (c,
       {this, this, this}
     };
     return_trace (chain_context_would_apply_lookup (c,
-                                                   backtrack.len, (const USHORT *) backtrack.array,
-                                                   input.len, (const USHORT *) input.array + 1,
-                                                   lookahead.len, (const USHORT *) lookahead.array,
+                                                   backtrack.len, (const HBUINT16 *) backtrack.array,
+                                                   input.len, (const HBUINT16 *) input.array + 1,
+                                                   lookahead.len, (const HBUINT16 *) lookahead.array,
                                                    lookup.len, lookup.array, lookup_context));
   }
 
                                                    lookup.len, lookup.array, lookup_context));
   }
 
@@ -2100,7 +2124,7 @@ struct ChainContextFormat3
     return this+input[0];
   }
 
     return this+input[0];
   }
 
-  inline bool apply (hb_apply_context_t *c) const
+  inline bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
     const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
   {
     TRACE_APPLY (this);
     const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
@@ -2115,9 +2139,9 @@ struct ChainContextFormat3
       {this, this, this}
     };
     return_trace (chain_context_apply_lookup (c,
       {this, this, this}
     };
     return_trace (chain_context_apply_lookup (c,
-                                             backtrack.len, (const USHORT *) backtrack.array,
-                                             input.len, (const USHORT *) input.array + 1,
-                                             lookahead.len, (const USHORT *) lookahead.array,
+                                             backtrack.len, (const HBUINT16 *) backtrack.array,
+                                             input.len, (const HBUINT16 *) input.array + 1,
+                                             lookahead.len, (const HBUINT16 *) lookahead.array,
                                              lookup.len, lookup.array, lookup_context));
   }
 
                                              lookup.len, lookup.array, lookup_context));
   }
 
@@ -2135,7 +2159,7 @@ struct ChainContextFormat3
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier--format = 3 */
+  HBUINT16     format;                 /* Format identifier--format = 3 */
   OffsetArrayOf<Coverage>
                backtrack;              /* Array of coverage tables
                                         * in backtracking sequence, in  glyph
   OffsetArrayOf<Coverage>
                backtrack;              /* Array of coverage tables
                                         * in backtracking sequence, in  glyph
@@ -2172,7 +2196,7 @@ struct ChainContext
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format; /* Format identifier */
+  HBUINT16             format; /* Format identifier */
   ChainContextFormat1  format1;
   ChainContextFormat2  format2;
   ChainContextFormat3  format3;
   ChainContextFormat1  format1;
   ChainContextFormat2  format2;
   ChainContextFormat3  format3;
@@ -2205,15 +2229,17 @@ struct ExtensionFormat1
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && extensionOffset != 0);
+    return_trace (c->check_struct (this) &&
+                 extensionOffset != 0 &&
+                 extensionLookupType != T::LookupSubTable::Extension);
   }
 
   protected:
   }
 
   protected:
-  USHORT       format;                 /* Format identifier. Set to 1. */
-  USHORT       extensionLookupType;    /* Lookup type of subtable referenced
+  HBUINT16     format;                 /* Format identifier. Set to 1. */
+  HBUINT16     extensionLookupType;    /* Lookup type of subtable referenced
                                         * by ExtensionOffset (i.e. the
                                         * extension subtable). */
                                         * by ExtensionOffset (i.e. the
                                         * extension subtable). */
-  ULONG                extensionOffset;        /* Offset to the extension subtable,
+  HBUINT32     extensionOffset;        /* Offset to the extension subtable,
                                         * of lookup type subtable. */
   public:
   DEFINE_SIZE_STATIC (8);
                                         * of lookup type subtable. */
   public:
   DEFINE_SIZE_STATIC (8);
@@ -2251,7 +2277,7 @@ struct Extension
 
   protected:
   union {
 
   protected:
   union {
-  USHORT               format;         /* Format identifier */
+  HBUINT16             format;         /* Format identifier */
   ExtensionFormat1<T>  format1;
   } u;
 };
   ExtensionFormat1<T>  format1;
   } u;
 };
@@ -2263,9 +2289,6 @@ struct Extension
 
 struct GSUBGPOS
 {
 
 struct GSUBGPOS
 {
-  static const hb_tag_t GSUBTag        = HB_OT_TAG_GSUB;
-  static const hb_tag_t GPOSTag        = HB_OT_TAG_GPOS;
-
   inline unsigned int get_script_count (void) const
   { return (this+scriptList).len; }
   inline const Tag& get_script_tag (unsigned int i) const
   inline unsigned int get_script_count (void) const
   { return (this+scriptList).len; }
   inline const Tag& get_script_tag (unsigned int i) const
index c306849..adbaad6 100644 (file)
@@ -124,7 +124,7 @@ struct JstfPriority
 struct JstfLangSys : OffsetListOf<JstfPriority>
 {
   inline bool sanitize (hb_sanitize_context_t *c,
 struct JstfLangSys : OffsetListOf<JstfPriority>
 {
   inline bool sanitize (hb_sanitize_context_t *c,
-                       const Record<JstfLangSys>::sanitize_closure_t * = NULL) const
+                       const Record<JstfLangSys>::sanitize_closure_t * = nullptr) const
   {
     TRACE_SANITIZE (this);
     return_trace (OffsetListOf<JstfPriority>::sanitize (c));
   {
     TRACE_SANITIZE (this);
     return_trace (OffsetListOf<JstfPriority>::sanitize (c));
@@ -165,7 +165,7 @@ struct JstfScript
   inline const JstfLangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
 
   inline bool sanitize (hb_sanitize_context_t *c,
   inline const JstfLangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
 
   inline bool sanitize (hb_sanitize_context_t *c,
-                       const Record<JstfScript>::sanitize_closure_t * = NULL) const
+                       const Record<JstfScript>::sanitize_closure_t * = nullptr) const
   {
     TRACE_SANITIZE (this);
     return_trace (extenderGlyphs.sanitize (c, this) &&
   {
     TRACE_SANITIZE (this);
     return_trace (extenderGlyphs.sanitize (c, this) &&
index 071a439..870ba73 100644 (file)
@@ -33,7 +33,7 @@
 
 #include "hb-font-private.hh"
 #include "hb-buffer-private.hh"
 
 #include "hb-font-private.hh"
 #include "hb-buffer-private.hh"
-#include "hb-set-private.hh"
+#include "hb-set-digest-private.hh"
 #include "hb-open-type-private.hh"
 
 
 #include "hb-open-type-private.hh"
 
 
@@ -90,12 +90,12 @@ hb_ot_layout_substitute_start (hb_font_t    *font,
 struct hb_ot_layout_lookup_accelerator_t;
 
 namespace OT {
 struct hb_ot_layout_lookup_accelerator_t;
 
 namespace OT {
-  struct hb_apply_context_t;
+  struct hb_ot_apply_context_t;
   struct SubstLookup;
 }
 
 HB_INTERNAL void
   struct SubstLookup;
 }
 
 HB_INTERNAL void
-hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c,
+hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
                                const OT::SubstLookup &lookup,
                                const hb_ot_layout_lookup_accelerator_t &accel);
 
                                const OT::SubstLookup &lookup,
                                const hb_ot_layout_lookup_accelerator_t &accel);
 
@@ -122,6 +122,9 @@ hb_ot_layout_position_finish_offsets (hb_font_t    *font,
  */
 
 namespace OT {
  */
 
 namespace OT {
+  struct BASE;
+  struct COLR;
+  struct CPAL;
   struct GDEF;
   struct GSUB;
   struct GPOS;
   struct GDEF;
   struct GSUB;
   struct GPOS;
@@ -130,6 +133,13 @@ namespace OT {
   struct avar;
 }
 
   struct avar;
 }
 
+namespace AAT {
+  struct ankr;
+  struct kerx;
+  struct morx;
+  struct trak;
+}
+
 struct hb_ot_layout_lookup_accelerator_t
 {
   template <typename TLookup>
 struct hb_ot_layout_lookup_accelerator_t
 {
   template <typename TLookup>
@@ -162,9 +172,16 @@ struct hb_ot_layout_t
   const struct OT::GPOS *gpos;
 
   /* TODO Move the following out of this struct. */
   const struct OT::GPOS *gpos;
 
   /* TODO Move the following out of this struct. */
+  OT::hb_lazy_table_loader_t<struct OT::BASE> base;
+  OT::hb_lazy_table_loader_t<struct OT::COLR> colr;
+  OT::hb_lazy_table_loader_t<struct OT::CPAL> cpal;
   OT::hb_lazy_table_loader_t<struct OT::MATH> math;
   OT::hb_lazy_table_loader_t<struct OT::fvar> fvar;
   OT::hb_lazy_table_loader_t<struct OT::avar> avar;
   OT::hb_lazy_table_loader_t<struct OT::MATH> math;
   OT::hb_lazy_table_loader_t<struct OT::fvar> fvar;
   OT::hb_lazy_table_loader_t<struct OT::avar> avar;
+  OT::hb_lazy_table_loader_t<struct AAT::ankr> ankr;
+  OT::hb_lazy_table_loader_t<struct AAT::kerx> kerx;
+  OT::hb_lazy_table_loader_t<struct AAT::morx> morx;
+  OT::hb_lazy_table_loader_t<struct AAT::trak> trak;
 
   unsigned int gsub_lookup_count;
   unsigned int gpos_lookup_count;
 
   unsigned int gsub_lookup_count;
   unsigned int gpos_lookup_count;
@@ -197,8 +214,7 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout);
 #define syllable()             var1.u8[3] /* GSUB/GPOS shaping boundaries */
 
 
 #define syllable()             var1.u8[3] /* GSUB/GPOS shaping boundaries */
 
 
-/* loop over syllables */
-
+/* Loop over syllables. Based on foreach_cluster(). */
 #define foreach_syllable(buffer, start, end) \
   for (unsigned int \
        _count = buffer->len, \
 #define foreach_syllable(buffer, start, end) \
   for (unsigned int \
        _count = buffer->len, \
@@ -227,7 +243,9 @@ _next_syllable (hb_buffer_t *buffer, unsigned int start)
  * - General_Category: 5 bits.
  * - A bit each for:
  *   * Is it Default_Ignorable(); we have a modified Default_Ignorable().
  * - General_Category: 5 bits.
  * - A bit each for:
  *   * Is it Default_Ignorable(); we have a modified Default_Ignorable().
- *   * Whether it's one of the three Mongolian Free Variation Selectors.
+ *   * Whether it's one of the three Mongolian Free Variation Selectors,
+ *     CGJ, or other characters that are hidden but should not be ignored
+ *     like most other Default_Ignorable()s do during matching.
  *   * One free bit right now.
  *
  * The high-byte has different meanings, switched by the Gen-Cat:
  *   * One free bit right now.
  *
  * The high-byte has different meanings, switched by the Gen-Cat:
@@ -240,7 +258,8 @@ _next_syllable (hb_buffer_t *buffer, unsigned int start)
 enum hb_unicode_props_flags_t {
   UPROPS_MASK_GEN_CAT  = 0x001Fu,
   UPROPS_MASK_IGNORABLE        = 0x0020u,
 enum hb_unicode_props_flags_t {
   UPROPS_MASK_GEN_CAT  = 0x001Fu,
   UPROPS_MASK_IGNORABLE        = 0x0020u,
-  UPROPS_MASK_FVS      = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3 */
+  UPROPS_MASK_HIDDEN   = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3,
+                                    * or TAG characters */
 
   /* If GEN_CAT=FORMAT, top byte masks: */
   UPROPS_MASK_Cf_ZWJ   = 0x0100u,
 
   /* If GEN_CAT=FORMAT, top byte masks: */
   UPROPS_MASK_Cf_ZWJ   = 0x0100u,
@@ -264,16 +283,25 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
       buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
       props |=  UPROPS_MASK_IGNORABLE;
       if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
       buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
       props |=  UPROPS_MASK_IGNORABLE;
       if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
-      if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
+      else if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
       /* Mongolian Free Variation Selectors need to be remembered
        * because although we need to hide them like default-ignorables,
        * they need to non-ignorable during shaping.  This is similar to
        * what we do for joiners in Indic-like shapers, but since the
        * FVSes are GC=Mn, we have use a separate bit to remember them.
        * Fixes:
       /* Mongolian Free Variation Selectors need to be remembered
        * because although we need to hide them like default-ignorables,
        * they need to non-ignorable during shaping.  This is similar to
        * what we do for joiners in Indic-like shapers, but since the
        * FVSes are GC=Mn, we have use a separate bit to remember them.
        * Fixes:
-       * https://github.com/behdad/harfbuzz/issues/234
-       */
-      if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_FVS;
+       * https://github.com/harfbuzz/harfbuzz/issues/234 */
+      else if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_HIDDEN;
+      /* TAG characters need similar treatment. Fixes:
+       * https://github.com/harfbuzz/harfbuzz/issues/463 */
+      else if (unlikely (hb_in_range (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN;
+      /* COMBINING GRAPHEME JOINER should not be skipped; at least some times.
+       * https://github.com/harfbuzz/harfbuzz/issues/554 */
+      else if (unlikely (u == 0x034Fu))
+      {
+       buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CGJ;
+       props |= UPROPS_MASK_HIDDEN;
+      }
     }
     else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat)))
     {
     }
     else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat)))
     {
@@ -298,7 +326,7 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
       /* Recategorize emoji skin-tone modifiers as Unicode mark, so they
        * behave correctly in non-native directionality.  They originally
        * are MODIFIER_SYMBOL.  Fixes:
       /* Recategorize emoji skin-tone modifiers as Unicode mark, so they
        * behave correctly in non-native directionality.  They originally
        * are MODIFIER_SYMBOL.  Fixes:
-       * https://github.com/behdad/harfbuzz/issues/169
+       * https://github.com/harfbuzz/harfbuzz/issues/169
        */
       if (unlikely (hb_in_range (u, 0x1F3FBu, 0x1F3FFu)))
       {
        */
       if (unlikely (hb_in_range (u, 0x1F3FBu, 0x1F3FFu)))
       {
@@ -343,6 +371,30 @@ _hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
   return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
 }
 
   return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
 }
 
+
+/* Loop over grapheme. Based on foreach_cluster(). */
+#define foreach_grapheme(buffer, start, end) \
+  for (unsigned int \
+       _count = buffer->len, \
+       start = 0, end = _count ? _next_grapheme (buffer, 0) : 0; \
+       start < _count; \
+       start = end, end = _next_grapheme (buffer, start))
+
+static inline unsigned int
+_next_grapheme (hb_buffer_t *buffer, unsigned int start)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+
+  while (++start < count && _hb_glyph_info_is_unicode_mark (&info[start]))
+    ;
+
+  return start;
+}
+
+
+#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
+
 static inline bool
 _hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info)
 {
 static inline bool
 _hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info)
 {
@@ -373,12 +425,17 @@ _hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
         !_hb_glyph_info_ligated (info);
 }
 static inline hb_bool_t
         !_hb_glyph_info_ligated (info);
 }
 static inline hb_bool_t
-_hb_glyph_info_is_default_ignorable_and_not_fvs (const hb_glyph_info_t *info)
+_hb_glyph_info_is_default_ignorable_and_not_hidden (const hb_glyph_info_t *info)
 {
 {
-  return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_FVS))
+  return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_HIDDEN))
          == UPROPS_MASK_IGNORABLE) &&
         !_hb_glyph_info_ligated (info);
 }
          == UPROPS_MASK_IGNORABLE) &&
         !_hb_glyph_info_ligated (info);
 }
+static inline void
+_hb_glyph_info_unhide (hb_glyph_info_t *info)
+{
+  info->unicode_props() &= ~ UPROPS_MASK_HIDDEN;
+}
 
 static inline bool
 _hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
 
 static inline bool
 _hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
index 7f4e018..1c9e950 100644 (file)
 #include "hb-open-type-private.hh"
 #include "hb-ot-layout-private.hh"
 
 #include "hb-open-type-private.hh"
 #include "hb-ot-layout-private.hh"
 
+#include "hb-ot-layout-base-table.hh"
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-ot-layout-gsub-table.hh"
 #include "hb-ot-layout-gpos-table.hh"
 #include "hb-ot-layout-jstf-table.hh" // Just so we compile it; unused otherwise.
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-ot-layout-gsub-table.hh"
 #include "hb-ot-layout-gpos-table.hh"
 #include "hb-ot-layout-jstf-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-ot-name-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-ot-color-colr-table.hh"
+#include "hb-ot-color-cpal-table.hh"
 
 #include "hb-ot-map-private.hh"
 
 
 
 #include "hb-ot-map-private.hh"
 
 
+#ifndef HB_NO_VISIBILITY
+const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+#endif
+
+
 hb_ot_layout_t *
 _hb_ot_layout_create (hb_face_t *face)
 {
   hb_ot_layout_t *layout = (hb_ot_layout_t *) calloc (1, sizeof (hb_ot_layout_t));
   if (unlikely (!layout))
 hb_ot_layout_t *
 _hb_ot_layout_create (hb_face_t *face)
 {
   hb_ot_layout_t *layout = (hb_ot_layout_t *) calloc (1, sizeof (hb_ot_layout_t));
   if (unlikely (!layout))
-    return NULL;
+    return nullptr;
 
 
-  layout->gdef_blob = OT::Sanitizer<OT::GDEF>::sanitize (face->reference_table (HB_OT_TAG_GDEF));
+  layout->gdef_blob = OT::Sanitizer<OT::GDEF>().sanitize (face->reference_table (HB_OT_TAG_GDEF));
   layout->gdef = OT::Sanitizer<OT::GDEF>::lock_instance (layout->gdef_blob);
 
   layout->gdef = OT::Sanitizer<OT::GDEF>::lock_instance (layout->gdef_blob);
 
-  layout->gsub_blob = OT::Sanitizer<OT::GSUB>::sanitize (face->reference_table (HB_OT_TAG_GSUB));
+  layout->gsub_blob = OT::Sanitizer<OT::GSUB>().sanitize (face->reference_table (HB_OT_TAG_GSUB));
   layout->gsub = OT::Sanitizer<OT::GSUB>::lock_instance (layout->gsub_blob);
 
   layout->gsub = OT::Sanitizer<OT::GSUB>::lock_instance (layout->gsub_blob);
 
-  layout->gpos_blob = OT::Sanitizer<OT::GPOS>::sanitize (face->reference_table (HB_OT_TAG_GPOS));
+  layout->gpos_blob = OT::Sanitizer<OT::GPOS>().sanitize (face->reference_table (HB_OT_TAG_GPOS));
   layout->gpos = OT::Sanitizer<OT::GPOS>::lock_instance (layout->gpos_blob);
 
   layout->gpos = OT::Sanitizer<OT::GPOS>::lock_instance (layout->gpos_blob);
 
+  layout->base.init (face);
+  layout->colr.init (face);
+  layout->cpal.init (face);
   layout->math.init (face);
   layout->fvar.init (face);
   layout->avar.init (face);
   layout->math.init (face);
   layout->fvar.init (face);
   layout->avar.init (face);
+  layout->ankr.init (face);
+  layout->kerx.init (face);
+  layout->morx.init (face);
+  layout->trak.init (face);
 
   {
     /*
 
   {
     /*
@@ -176,7 +192,7 @@ _hb_ot_layout_create (hb_face_t *face)
                (layout->gpos_lookup_count && !layout->gpos_accels)))
   {
     _hb_ot_layout_destroy (layout);
                (layout->gpos_lookup_count && !layout->gpos_accels)))
   {
     _hb_ot_layout_destroy (layout);
-    return NULL;
+    return nullptr;
   }
 
   for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
   }
 
   for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
@@ -190,10 +206,12 @@ _hb_ot_layout_create (hb_face_t *face)
 void
 _hb_ot_layout_destroy (hb_ot_layout_t *layout)
 {
 void
 _hb_ot_layout_destroy (hb_ot_layout_t *layout)
 {
-  for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
-    layout->gsub_accels[i].fini ();
-  for (unsigned int i = 0; i < layout->gpos_lookup_count; i++)
-    layout->gpos_accels[i].fini ();
+  if (layout->gsub_accels)
+    for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
+      layout->gsub_accels[i].fini ();
+  if (layout->gpos_accels)
+    for (unsigned int i = 0; i < layout->gpos_lookup_count; i++)
+      layout->gpos_accels[i].fini ();
 
   free (layout->gsub_accels);
   free (layout->gpos_accels);
 
   free (layout->gsub_accels);
   free (layout->gpos_accels);
@@ -202,13 +220,28 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout)
   hb_blob_destroy (layout->gsub_blob);
   hb_blob_destroy (layout->gpos_blob);
 
   hb_blob_destroy (layout->gsub_blob);
   hb_blob_destroy (layout->gpos_blob);
 
+  layout->base.fini ();
+  layout->colr.fini ();
+  layout->cpal.fini ();
   layout->math.fini ();
   layout->fvar.fini ();
   layout->avar.fini ();
   layout->math.fini ();
   layout->fvar.fini ();
   layout->avar.fini ();
+  layout->ankr.fini ();
+  layout->kerx.fini ();
+  layout->morx.fini ();
+  layout->trak.fini ();
 
   free (layout);
 }
 
 
   free (layout);
 }
 
+// static inline const OT::BASE&
+// _get_base (hb_face_t *face)
+// {
+//   if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::BASE);
+//   hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+//   return *(layout->base.get ());
+// }
+
 static inline const OT::GDEF&
 _get_gdef (hb_face_t *face)
 {
 static inline const OT::GDEF&
 _get_gdef (hb_face_t *face)
 {
@@ -279,7 +312,7 @@ hb_ot_layout_get_ligature_carets (hb_font_t      *font,
                                  hb_codepoint_t  glyph,
                                  unsigned int    start_offset,
                                  unsigned int   *caret_count /* IN/OUT */,
                                  hb_codepoint_t  glyph,
                                  unsigned int    start_offset,
                                  unsigned int   *caret_count /* IN/OUT */,
-                                 int            *caret_array /* OUT */)
+                                 hb_position_t  *caret_array /* OUT */)
 {
   return _get_gdef (font->face).get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array);
 }
 {
   return _get_gdef (font->face).get_lig_carets (font, direction, glyph, start_offset, caret_count, caret_array);
 }
@@ -321,7 +354,7 @@ hb_ot_layout_table_find_script (hb_face_t    *face,
                                hb_tag_t      script_tag,
                                unsigned int *script_index)
 {
                                hb_tag_t      script_tag,
                                unsigned int *script_index)
 {
-  ASSERT_STATIC (OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX);
+  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX), "");
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 
   if (g.find_script_index (script_tag, script_index))
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 
   if (g.find_script_index (script_tag, script_index))
@@ -352,7 +385,7 @@ hb_ot_layout_table_choose_script (hb_face_t      *face,
                                  unsigned int   *script_index,
                                  hb_tag_t       *chosen_script)
 {
                                  unsigned int   *script_index,
                                  hb_tag_t       *chosen_script)
 {
-  ASSERT_STATIC (OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX);
+  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX), "");
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 
   while (*script_tags)
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 
   while (*script_tags)
@@ -411,7 +444,7 @@ hb_ot_layout_table_find_feature (hb_face_t    *face,
                                 hb_tag_t      feature_tag,
                                 unsigned int *feature_index)
 {
                                 hb_tag_t      feature_tag,
                                 unsigned int *feature_index)
 {
-  ASSERT_STATIC (OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_FEATURE_INDEX);
+  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_FEATURE_INDEX), "");
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 
   unsigned int num_features = g.get_feature_count ();
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 
   unsigned int num_features = g.get_feature_count ();
@@ -448,7 +481,7 @@ hb_ot_layout_script_find_language (hb_face_t    *face,
                                   hb_tag_t      language_tag,
                                   unsigned int *language_index)
 {
                                   hb_tag_t      language_tag,
                                   unsigned int *language_index)
 {
-  ASSERT_STATIC (OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX);
+  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX), "");
   const OT::Script &s = get_gsubgpos_table (face, table_tag).get_script (script_index);
 
   if (s.find_lang_sys_index (language_tag, language_index))
   const OT::Script &s = get_gsubgpos_table (face, table_tag).get_script (script_index);
 
   if (s.find_lang_sys_index (language_tag, language_index))
@@ -474,7 +507,7 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t    *face,
                                                     script_index,
                                                     language_index,
                                                     feature_index,
                                                     script_index,
                                                     language_index,
                                                     feature_index,
-                                                    NULL);
+                                                    nullptr);
 }
 
 /**
 }
 
 /**
@@ -527,7 +560,7 @@ hb_ot_layout_language_get_feature_tags (hb_face_t    *face,
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
   const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
 
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
   const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
 
-  ASSERT_STATIC (sizeof (unsigned int) == sizeof (hb_tag_t));
+  static_assert ((sizeof (unsigned int) == sizeof (hb_tag_t)), "");
   unsigned int ret = l.get_feature_indexes (start_offset, feature_count, (unsigned int *) feature_tags);
 
   if (feature_tags) {
   unsigned int ret = l.get_feature_indexes (start_offset, feature_count, (unsigned int *) feature_tags);
 
   if (feature_tags) {
@@ -548,7 +581,7 @@ hb_ot_layout_language_find_feature (hb_face_t    *face,
                                    hb_tag_t      feature_tag,
                                    unsigned int *feature_index)
 {
                                    hb_tag_t      feature_tag,
                                    unsigned int *feature_index)
 {
-  ASSERT_STATIC (OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_FEATURE_INDEX);
+  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_FEATURE_INDEX), "");
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
   const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
 
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
   const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
 
@@ -597,6 +630,7 @@ unsigned int
 hb_ot_layout_table_get_lookup_count (hb_face_t    *face,
                                     hb_tag_t      table_tag)
 {
 hb_ot_layout_table_get_lookup_count (hb_face_t    *face,
                                     hb_tag_t      table_tag)
 {
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return 0;
   switch (table_tag)
   {
     case HB_OT_TAG_GSUB:
   switch (table_tag)
   {
     case HB_OT_TAG_GSUB:
@@ -652,7 +686,7 @@ _hb_ot_layout_collect_lookups_features (hb_face_t      *face,
                                                    script_index,
                                                    language_index,
                                                    &required_feature_index,
                                                    script_index,
                                                    language_index,
                                                    &required_feature_index,
-                                                   NULL))
+                                                   nullptr))
       _hb_ot_layout_collect_lookups_lookups (face,
                                             table_tag,
                                             required_feature_index,
       _hb_ot_layout_collect_lookups_lookups (face,
                                             table_tag,
                                             required_feature_index,
@@ -721,7 +755,7 @@ _hb_ot_layout_collect_lookups_languages (hb_face_t      *face,
     unsigned int count = hb_ot_layout_script_get_language_tags (face,
                                                                table_tag,
                                                                script_index,
     unsigned int count = hb_ot_layout_script_get_language_tags (face,
                                                                table_tag,
                                                                script_index,
-                                                               0, NULL, NULL);
+                                                               0, nullptr, nullptr);
     for (unsigned int language_index = 0; language_index < count; language_index++)
       _hb_ot_layout_collect_lookups_features (face,
                                              table_tag,
     for (unsigned int language_index = 0; language_index < count; language_index++)
       _hb_ot_layout_collect_lookups_features (face,
                                              table_tag,
@@ -768,7 +802,7 @@ hb_ot_layout_collect_lookups (hb_face_t      *face,
     /* All scripts */
     unsigned int count = hb_ot_layout_table_get_script_tags (face,
                                                             table_tag,
     /* All scripts */
     unsigned int count = hb_ot_layout_table_get_script_tags (face,
                                                             table_tag,
-                                                            0, NULL, NULL);
+                                                            0, nullptr, nullptr);
     for (unsigned int script_index = 0; script_index < count; script_index++)
       _hb_ot_layout_collect_lookups_languages (face,
                                               table_tag,
     for (unsigned int script_index = 0; script_index < count; script_index++)
       _hb_ot_layout_collect_lookups_languages (face,
                                               table_tag,
@@ -805,10 +839,10 @@ void
 hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
                                    hb_tag_t      table_tag,
                                    unsigned int  lookup_index,
 hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
                                    hb_tag_t      table_tag,
                                    unsigned int  lookup_index,
-                                   hb_set_t     *glyphs_before, /* OUT. May be NULL */
-                                   hb_set_t     *glyphs_input,  /* OUT. May be NULL */
-                                   hb_set_t     *glyphs_after,  /* OUT. May be NULL */
-                                   hb_set_t     *glyphs_output  /* OUT. May be NULL */)
+                                   hb_set_t     *glyphs_before, /* OUT. May be nullptr */
+                                   hb_set_t     *glyphs_input,  /* OUT. May be nullptr */
+                                   hb_set_t     *glyphs_after,  /* OUT. May be nullptr */
+                                   hb_set_t     *glyphs_output  /* OUT. May be nullptr */)
 {
   if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return;
 
 {
   if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return;
 
@@ -859,7 +893,7 @@ hb_ot_layout_feature_with_variations_get_lookups (hb_face_t    *face,
                                                  unsigned int *lookup_count /* IN/OUT */,
                                                  unsigned int *lookup_indexes /* OUT */)
 {
                                                  unsigned int *lookup_count /* IN/OUT */,
                                                  unsigned int *lookup_indexes /* OUT */)
 {
-  ASSERT_STATIC (OT::FeatureVariations::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_VARIATIONS_INDEX);
+  static_assert ((OT::FeatureVariations::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_VARIATIONS_INDEX), "");
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 
   const OT::Feature &f = g.get_feature_variation (feature_index, variations_index);
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 
   const OT::Feature &f = g.get_feature_variation (feature_index, variations_index);
@@ -967,11 +1001,11 @@ hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer)
  **/
 hb_bool_t
 hb_ot_layout_get_size_params (hb_face_t    *face,
  **/
 hb_bool_t
 hb_ot_layout_get_size_params (hb_face_t    *face,
-                             unsigned int *design_size,       /* OUT.  May be NULL */
-                             unsigned int *subfamily_id,      /* OUT.  May be NULL */
-                             unsigned int *subfamily_name_id, /* OUT.  May be NULL */
-                             unsigned int *range_start,       /* OUT.  May be NULL */
-                             unsigned int *range_end          /* OUT.  May be NULL */)
+                             unsigned int *design_size,       /* OUT.  May be nullptr */
+                             unsigned int *subfamily_id,      /* OUT.  May be nullptr */
+                             unsigned int *subfamily_name_id, /* OUT.  May be nullptr */
+                             unsigned int *range_start,       /* OUT.  May be nullptr */
+                             unsigned int *range_end          /* OUT.  May be nullptr */)
 {
   const OT::GPOS &gpos = _get_gpos (face);
   const hb_tag_t tag = HB_TAG ('s','i','z','e');
 {
   const OT::GPOS &gpos = _get_gpos (face);
   const hb_tag_t tag = HB_TAG ('s','i','z','e');
@@ -1050,13 +1084,13 @@ struct hb_get_subtables_context_t :
        OT::hb_dispatch_context_t<hb_get_subtables_context_t, hb_void_t, HB_DEBUG_APPLY>
 {
   template <typename Type>
        OT::hb_dispatch_context_t<hb_get_subtables_context_t, hb_void_t, HB_DEBUG_APPLY>
 {
   template <typename Type>
-  static inline bool apply_to (const void *obj, OT::hb_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);
   }
 
   {
     const Type *typed_obj = (const Type *) obj;
     return typed_obj->apply (c);
   }
 
-  typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_apply_context_t *c);
+  typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_ot_apply_context_t *c);
 
   struct hb_applicable_t
   {
 
   struct hb_applicable_t
   {
@@ -1066,7 +1100,7 @@ struct hb_get_subtables_context_t :
       apply_func = apply_func_;
     }
 
       apply_func = apply_func_;
     }
 
-    inline bool apply (OT::hb_apply_context_t *c) const { return apply_func (obj, c); }
+    inline bool apply (OT::hb_ot_apply_context_t *c) const { return apply_func (obj, c); }
 
     private:
     const void *obj;
 
     private:
     const void *obj;
@@ -1097,7 +1131,7 @@ struct hb_get_subtables_context_t :
 };
 
 static inline bool
 };
 
 static inline bool
-apply_forward (OT::hb_apply_context_t *c,
+apply_forward (OT::hb_ot_apply_context_t *c,
               const hb_ot_layout_lookup_accelerator_t &accel,
               const hb_get_subtables_context_t::array_t &subtables)
 {
               const hb_ot_layout_lookup_accelerator_t &accel,
               const hb_get_subtables_context_t::array_t &subtables)
 {
@@ -1127,7 +1161,7 @@ apply_forward (OT::hb_apply_context_t *c,
 }
 
 static inline bool
 }
 
 static inline bool
-apply_backward (OT::hb_apply_context_t *c,
+apply_backward (OT::hb_ot_apply_context_t *c,
               const hb_ot_layout_lookup_accelerator_t &accel,
               const hb_get_subtables_context_t::array_t &subtables)
 {
               const hb_ot_layout_lookup_accelerator_t &accel,
               const hb_get_subtables_context_t::array_t &subtables)
 {
@@ -1156,7 +1190,7 @@ apply_backward (OT::hb_apply_context_t *c,
 
 template <typename Proxy>
 static inline void
 
 template <typename Proxy>
 static inline void
-apply_string (OT::hb_apply_context_t *c,
+apply_string (OT::hb_ot_apply_context_t *c,
              const typename Proxy::Lookup &lookup,
              const hb_ot_layout_lookup_accelerator_t &accel)
 {
              const typename Proxy::Lookup &lookup,
              const hb_ot_layout_lookup_accelerator_t &accel)
 {
@@ -1207,7 +1241,7 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
 {
   const unsigned int table_index = proxy.table_index;
   unsigned int i = 0;
 {
   const unsigned int table_index = proxy.table_index;
   unsigned int i = 0;
-  OT::hb_apply_context_t c (table_index, font, buffer);
+  OT::hb_ot_apply_context_t c (table_index, font, buffer);
   c.set_recurse_func (Proxy::Lookup::apply_recurse_func);
 
   for (unsigned int stage_index = 0; stage_index < stages[table_index].len; stage_index++) {
   c.set_recurse_func (Proxy::Lookup::apply_recurse_func);
 
   for (unsigned int stage_index = 0; stage_index < stages[table_index].len; stage_index++) {
@@ -1219,6 +1253,7 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
       c.set_lookup_index (lookup_index);
       c.set_lookup_mask (lookups[table_index][i].mask);
       c.set_auto_zwj (lookups[table_index][i].auto_zwj);
       c.set_lookup_index (lookup_index);
       c.set_lookup_mask (lookups[table_index][i].mask);
       c.set_auto_zwj (lookups[table_index][i].auto_zwj);
+      c.set_auto_zwnj (lookups[table_index][i].auto_zwnj);
       apply_string<Proxy> (&c,
                           proxy.table.get_lookup (lookup_index),
                           proxy.accels[lookup_index]);
       apply_string<Proxy> (&c,
                           proxy.table.get_lookup (lookup_index),
                           proxy.accels[lookup_index]);
@@ -1245,10 +1280,34 @@ void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_
   apply (proxy, plan, font, buffer);
 }
 
   apply (proxy, plan, font, buffer);
 }
 
-HB_INTERNAL void
-hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c,
+void
+hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
                                const OT::SubstLookup &lookup,
                                const hb_ot_layout_lookup_accelerator_t &accel)
 {
   apply_string<GSUBProxy> (c, lookup, accel);
 }
                                const OT::SubstLookup &lookup,
                                const hb_ot_layout_lookup_accelerator_t &accel)
 {
   apply_string<GSUBProxy> (c, lookup, accel);
 }
+
+
+
+
+/*
+ * OT::BASE
+ */
+
+// /**
+//  * hb_ot_base_has_data:
+//  * @face: #hb_face_t to test
+//  *
+//  * This function allows to verify the presence of an OpenType BASE table on the
+//  * face.
+//  *
+//  * Return value: true if face has a BASE table, false otherwise
+//  *
+//  * Since: XXX
+//  **/
+// hb_bool_t
+// hb_ot_base_has_data (hb_face_t *face)
+// {
+//   return &_get_base (face) != &OT::Null(OT::BASE);
+// }
index 9861f0f..85938ba 100644 (file)
@@ -38,6 +38,7 @@
 HB_BEGIN_DECLS
 
 
 HB_BEGIN_DECLS
 
 
+#define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
 #define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
 #define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
 #define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
 #define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
 #define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
 #define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
@@ -316,6 +317,22 @@ hb_ot_layout_get_size_params (hb_face_t    *face,
                              unsigned int *range_end          /* OUT.  May be NULL */);
 
 
                              unsigned int *range_end          /* OUT.  May be NULL */);
 
 
+/*
+ * BASE
+ */
+#if 0
+
+#define HB_OT_TAG_BASE_HANG HB_TAG('h','a','n','g')
+#define HB_OT_TAG_BASE_ICFB HB_TAG('i','c','f','b')
+#define HB_OT_TAG_BASE_ICFT HB_TAG('i','c','f','t')
+#define HB_OT_TAG_BASE_IDEO HB_TAG('i','d','e','o')
+#define HB_OT_TAG_BASE_IDTB HB_TAG('i','d','t','b')
+#define HB_OT_TAG_BASE_MATH HB_TAG('m','a','t','h')
+#define HB_OT_TAG_BASE_ROMN HB_TAG('r','o','m','n')
+
+#endif
+
+
 HB_END_DECLS
 
 #endif /* HB_OT_LAYOUT_H */
 HB_END_DECLS
 
 #endif /* HB_OT_LAYOUT_H */
index b69e534..e6bd8ea 100644 (file)
@@ -50,19 +50,25 @@ struct hb_ot_map_t
     hb_mask_t mask;
     hb_mask_t _1_mask; /* mask for value=1, for quick access */
     unsigned int needs_fallback : 1;
     hb_mask_t mask;
     hb_mask_t _1_mask; /* mask for value=1, for quick access */
     unsigned int needs_fallback : 1;
+    unsigned int auto_zwnj : 1;
     unsigned int auto_zwj : 1;
 
     unsigned int auto_zwj : 1;
 
-    static int cmp (const feature_map_t *a, const feature_map_t *b)
-    { return a->tag < b->tag ? -1 : a->tag > b->tag ? 1 : 0; }
+    inline int cmp (const hb_tag_t *tag_) const
+    { return *tag_ < tag ? -1 : *tag_ > tag ? 1 : 0; }
   };
 
   struct lookup_map_t {
     unsigned short index;
   };
 
   struct lookup_map_t {
     unsigned short index;
+    unsigned short auto_zwnj : 1;
     unsigned short auto_zwj : 1;
     hb_mask_t mask;
 
     unsigned short auto_zwj : 1;
     hb_mask_t mask;
 
-    static int cmp (const lookup_map_t *a, const lookup_map_t *b)
-    { return a->index < b->index ? -1 : a->index > b->index ? 1 : 0; }
+    static int cmp (const void *pa, const void *pb)
+    {
+      const lookup_map_t *a = (const lookup_map_t *) pa;
+      const lookup_map_t *b = (const lookup_map_t *) pb;
+      return a->index < b->index ? -1 : a->index > b->index ? 1 : 0;
+    }
   };
 
   typedef void (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer);
   };
 
   typedef void (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer);
@@ -77,43 +83,43 @@ struct hb_ot_map_t
 
   inline hb_mask_t get_global_mask (void) const { return global_mask; }
 
 
   inline hb_mask_t get_global_mask (void) const { return global_mask; }
 
-  inline hb_mask_t get_mask (hb_tag_t feature_tag, unsigned int *shift = NULL) const {
-    const feature_map_t *map = features.bsearch (&feature_tag);
+  inline hb_mask_t get_mask (hb_tag_t feature_tag, unsigned int *shift = nullptr) const {
+    const feature_map_t *map = features.bsearch (feature_tag);
     if (shift) *shift = map ? map->shift : 0;
     return map ? map->mask : 0;
   }
 
   inline bool needs_fallback (hb_tag_t feature_tag) const {
     if (shift) *shift = map ? map->shift : 0;
     return map ? map->mask : 0;
   }
 
   inline bool needs_fallback (hb_tag_t feature_tag) const {
-    const feature_map_t *map = features.bsearch (&feature_tag);
+    const feature_map_t *map = features.bsearch (feature_tag);
     return map ? map->needs_fallback : false;
   }
 
   inline hb_mask_t get_1_mask (hb_tag_t feature_tag) const {
     return map ? map->needs_fallback : false;
   }
 
   inline hb_mask_t get_1_mask (hb_tag_t feature_tag) const {
-    const feature_map_t *map = features.bsearch (&feature_tag);
+    const feature_map_t *map = features.bsearch (feature_tag);
     return map ? map->_1_mask : 0;
   }
 
   inline unsigned int get_feature_index (unsigned int table_index, hb_tag_t feature_tag) const {
     return map ? map->_1_mask : 0;
   }
 
   inline unsigned int get_feature_index (unsigned int table_index, hb_tag_t feature_tag) const {
-    const feature_map_t *map = features.bsearch (&feature_tag);
+    const feature_map_t *map = features.bsearch (feature_tag);
     return map ? map->index[table_index] : HB_OT_LAYOUT_NO_FEATURE_INDEX;
   }
 
   inline unsigned int get_feature_stage (unsigned int table_index, hb_tag_t feature_tag) const {
     return map ? map->index[table_index] : HB_OT_LAYOUT_NO_FEATURE_INDEX;
   }
 
   inline unsigned int get_feature_stage (unsigned int table_index, hb_tag_t feature_tag) const {
-    const feature_map_t *map = features.bsearch (&feature_tag);
+    const feature_map_t *map = features.bsearch (feature_tag);
     return map ? map->stage[table_index] : (unsigned int) -1;
   }
 
   inline 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)) {
     return map ? map->stage[table_index] : (unsigned int) -1;
   }
 
   inline 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)) {
-      *plookups = NULL;
+      *plookups = nullptr;
       *lookup_count = 0;
       return;
     }
     assert (stage <= stages[table_index].len);
     unsigned int start = stage ? stages[table_index][stage - 1].last_lookup : 0;
     unsigned int end   = stage < stages[table_index].len ? stages[table_index][stage].last_lookup : lookups[table_index].len;
       *lookup_count = 0;
       return;
     }
     assert (stage <= stages[table_index].len);
     unsigned int start = stage ? stages[table_index][stage - 1].last_lookup : 0;
     unsigned int end   = stage < stages[table_index].len ? stages[table_index][stage].last_lookup : lookups[table_index].len;
-    *plookups = end == start ? NULL : &lookups[table_index][start];
+    *plookups = end == start ? nullptr : &lookups[table_index][start];
     *lookup_count = end - start;
   }
 
     *lookup_count = end - start;
   }
 
@@ -150,8 +156,9 @@ enum hb_ot_map_feature_flags_t {
   F_NONE               = 0x0000u,
   F_GLOBAL             = 0x0001u, /* Feature applies to all characters; results in no mask allocated for it. */
   F_HAS_FALLBACK       = 0x0002u, /* Has fallback implementation, so include mask bit even if feature not found. */
   F_NONE               = 0x0000u,
   F_GLOBAL             = 0x0001u, /* Feature applies to all characters; results in no mask allocated for it. */
   F_HAS_FALLBACK       = 0x0002u, /* Has fallback implementation, so include mask bit even if feature not found. */
-  F_MANUAL_ZWJ         = 0x0004u, /* Don't skip over ZWJ when matching. */
-  F_GLOBAL_SEARCH      = 0x0008u  /* If feature not found in LangSys, look for it in global feature list and pick one. */
+  F_MANUAL_ZWNJ                = 0x0004u, /* Don't skip over ZWNJ when matching **context**. */
+  F_MANUAL_ZWJ         = 0x0008u, /* Don't skip over ZWJ when matching **input**. */
+  F_GLOBAL_SEARCH      = 0x0010u  /* If feature not found in LangSys, look for it in global feature list and pick one. */
 };
 HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t);
 /* Macro version for where const is desired. */
 };
 HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t);
 /* Macro version for where const is desired. */
@@ -191,12 +198,12 @@ struct hb_ot_map_builder_t
   private:
 
   HB_INTERNAL void add_lookups (hb_ot_map_t  &m,
   private:
 
   HB_INTERNAL void add_lookups (hb_ot_map_t  &m,
-                               hb_face_t    *face,
                                unsigned int  table_index,
                                unsigned int  feature_index,
                                unsigned int  variations_index,
                                hb_mask_t     mask,
                                unsigned int  table_index,
                                unsigned int  feature_index,
                                unsigned int  variations_index,
                                hb_mask_t     mask,
-                               bool          auto_zwj);
+                               bool          auto_zwnj = true,
+                               bool          auto_zwj = true);
 
   struct feature_info_t {
     hb_tag_t tag;
 
   struct feature_info_t {
     hb_tag_t tag;
@@ -206,9 +213,13 @@ struct hb_ot_map_builder_t
     unsigned int default_value; /* for non-global features, what should the unset glyphs take */
     unsigned int stage[2]; /* GSUB/GPOS */
 
     unsigned int default_value; /* for non-global features, what should the unset glyphs take */
     unsigned int stage[2]; /* GSUB/GPOS */
 
-    static int cmp (const feature_info_t *a, const feature_info_t *b)
-    { return (a->tag != b->tag) ?  (a->tag < b->tag ? -1 : 1) :
-            (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0); }
+    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->tag != b->tag) ?  (a->tag < b->tag ? -1 : 1) :
+            (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
+    }
   };
 
   struct stage_info_t {
   };
 
   struct stage_info_t {
index 9b331d5..54b0ce3 100644 (file)
@@ -80,11 +80,11 @@ void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value,
 
 void
 hb_ot_map_builder_t::add_lookups (hb_ot_map_t  &m,
 
 void
 hb_ot_map_builder_t::add_lookups (hb_ot_map_t  &m,
-                                 hb_face_t    *face,
                                  unsigned int  table_index,
                                  unsigned int  feature_index,
                                  unsigned int  variations_index,
                                  hb_mask_t     mask,
                                  unsigned int  table_index,
                                  unsigned int  feature_index,
                                  unsigned int  variations_index,
                                  hb_mask_t     mask,
+                                 bool          auto_zwnj,
                                  bool          auto_zwj)
 {
   unsigned int lookup_indices[32];
                                  bool          auto_zwj)
 {
   unsigned int lookup_indices[32];
@@ -112,6 +112,7 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t  &m,
         return;
       lookup->mask = mask;
       lookup->index = lookup_indices[i];
         return;
       lookup->mask = mask;
       lookup->index = lookup_indices[i];
+      lookup->auto_zwnj = auto_zwnj;
       lookup->auto_zwj = auto_zwj;
     }
 
       lookup->auto_zwj = auto_zwj;
     }
 
@@ -136,7 +137,11 @@ hb_ot_map_builder_t::compile (hb_ot_map_t  &m,
                              const int    *coords,
                              unsigned int  num_coords)
 {
                              const int    *coords,
                              unsigned int  num_coords)
 {
-  m.global_mask = 1;
+  static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), "");
+  unsigned int global_bit_mask = HB_GLYPH_FLAG_DEFINED + 1;
+  unsigned int global_bit_shift = _hb_popcount (HB_GLYPH_FLAG_DEFINED);
+
+  m.global_mask = global_bit_mask;
 
   unsigned int required_feature_index[2];
   hb_tag_t required_feature_tag[2];
 
   unsigned int required_feature_index[2];
   hb_tag_t required_feature_tag[2];
@@ -188,7 +193,8 @@ hb_ot_map_builder_t::compile (hb_ot_map_t  &m,
 
 
   /* Allocate bits now */
 
 
   /* Allocate bits now */
-  unsigned int next_bit = 1;
+  unsigned int next_bit = global_bit_shift + 1;
+
   for (unsigned int i = 0; i < feature_infos.len; i++)
   {
     const feature_info_t *info = &feature_infos[i];
   for (unsigned int i = 0; i < feature_infos.len; i++)
   {
     const feature_info_t *info = &feature_infos[i];
@@ -243,11 +249,12 @@ hb_ot_map_builder_t::compile (hb_ot_map_t  &m,
     map->index[1] = feature_index[1];
     map->stage[0] = info->stage[0];
     map->stage[1] = info->stage[1];
     map->index[1] = feature_index[1];
     map->stage[0] = info->stage[0];
     map->stage[1] = info->stage[1];
+    map->auto_zwnj = !(info->flags & F_MANUAL_ZWNJ);
     map->auto_zwj = !(info->flags & F_MANUAL_ZWJ);
     if ((info->flags & F_GLOBAL) && info->max_value == 1) {
       /* Uses the global bit */
     map->auto_zwj = !(info->flags & F_MANUAL_ZWJ);
     if ((info->flags & F_GLOBAL) && info->max_value == 1) {
       /* Uses the global bit */
-      map->shift = 0;
-      map->mask = 1;
+      map->shift = global_bit_shift;
+      map->mask = global_bit_mask;
     } else {
       map->shift = next_bit;
       map->mask = (1u << (next_bit + bits_needed)) - (1u << next_bit);
     } else {
       map->shift = next_bit;
       map->mask = (1u << (next_bit + bits_needed)) - (1u << next_bit);
@@ -261,8 +268,8 @@ hb_ot_map_builder_t::compile (hb_ot_map_t  &m,
   feature_infos.shrink (0); /* Done with these */
 
 
   feature_infos.shrink (0); /* Done with these */
 
 
-  add_gsub_pause (NULL);
-  add_gpos_pause (NULL);
+  add_gsub_pause (nullptr);
+  add_gpos_pause (nullptr);
 
   for (unsigned int table_index = 0; table_index < 2; table_index++)
   {
 
   for (unsigned int table_index = 0; table_index < 2; table_index++)
   {
@@ -281,18 +288,18 @@ hb_ot_map_builder_t::compile (hb_ot_map_t  &m,
     {
       if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX &&
          required_feature_stage[table_index] == stage)
     {
       if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX &&
          required_feature_stage[table_index] == stage)
-       add_lookups (m, face, table_index,
+       add_lookups (m, table_index,
                     required_feature_index[table_index],
                     variations_index,
                     required_feature_index[table_index],
                     variations_index,
-                    1 /* mask */,
-                    true /* auto_zwj */);
+                    global_bit_mask);
 
       for (unsigned i = 0; i < m.features.len; i++)
         if (m.features[i].stage[table_index] == stage)
 
       for (unsigned i = 0; i < m.features.len; i++)
         if (m.features[i].stage[table_index] == stage)
-         add_lookups (m, face, table_index,
+         add_lookups (m, table_index,
                       m.features[i].index[table_index],
                       variations_index,
                       m.features[i].mask,
                       m.features[i].index[table_index],
                       variations_index,
                       m.features[i].mask,
+                      m.features[i].auto_zwnj,
                       m.features[i].auto_zwj);
 
       /* Sort lookups and merge duplicates */
                       m.features[i].auto_zwj);
 
       /* Sort lookups and merge duplicates */
@@ -307,6 +314,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t  &m,
          else
          {
            m.lookups[table_index][j].mask |= m.lookups[table_index][i].mask;
          else
          {
            m.lookups[table_index][j].mask |= m.lookups[table_index][i].mask;
+           m.lookups[table_index][j].auto_zwnj &= m.lookups[table_index][i].auto_zwnj;
            m.lookups[table_index][j].auto_zwj &= m.lookups[table_index][i].auto_zwj;
          }
        m.lookups[table_index].shrink (j + 1);
            m.lookups[table_index][j].auto_zwj &= m.lookups[table_index][i].auto_zwj;
          }
        m.lookups[table_index].shrink (j + 1);
index 191d79e..571ce01 100644 (file)
@@ -48,9 +48,9 @@ struct MathValueRecord
   }
 
   protected:
   }
 
   protected:
-  SHORT                        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
   OffsetTo<Device>     deviceTable;    /* Offset to the device table - from the
-                                        * beginning of parent table. May be NULL.
+                                        * beginning of parent table. May be nullptr.
                                         * Suggested format for device table is 1. */
 
   public:
                                         * Suggested format for device table is 1. */
 
   public:
@@ -154,10 +154,10 @@ struct MathConstants
   }
 
   protected:
   }
 
   protected:
-  SHORT percentScaleDown[2];
-  USHORT minHeight[2];
+  HBINT16 percentScaleDown[2];
+  HBUINT16 minHeight[2];
   MathValueRecord mathValueRecords[51];
   MathValueRecord mathValueRecords[51];
-  SHORT radicalDegreeBottomRaisePercent;
+  HBINT16 radicalDegreeBottomRaisePercent;
 
   public:
   DEFINE_SIZE_STATIC (214);
 
   public:
   DEFINE_SIZE_STATIC (214);
@@ -279,7 +279,7 @@ struct MathKern
   }
 
   protected:
   }
 
   protected:
-  USHORT         heightCount;
+  HBUINT16       heightCount;
   MathValueRecord mathValueRecords[VAR]; /* Array of correction heights at
                                          * which the kern value changes.
                                          * Sorted by the height value in
   MathValueRecord mathValueRecords[VAR]; /* Array of correction heights at
                                          * which the kern value changes.
                                          * Sorted by the height value in
@@ -319,7 +319,7 @@ struct MathKernInfoRecord
 
   protected:
   /* Offset to MathKern table for each corner -
 
   protected:
   /* Offset to MathKern table for each corner -
-   * from the beginning of MathKernInfo table. May be NULL. */
+   * from the beginning of MathKernInfo table. May be nullptr. */
   OffsetTo<MathKern> mathKern[4];
 
   public:
   OffsetTo<MathKern> mathKern[4];
 
   public:
@@ -402,7 +402,7 @@ struct MathGlyphInfo
    * from the beginning of MathGlyphInfo table. When the left or right glyph of
    * a box is an extended shape variant, the (ink) box (and not the default
    * position defined by values in MathConstants table) should be used for
    * from the beginning of MathGlyphInfo table. When the left or right glyph of
    * a box is an extended shape variant, the (ink) box (and not the default
    * position defined by values in MathConstants table) should be used for
-   * vertical positioning purposes. May be NULL.. */
+   * vertical positioning purposes. May be nullptr.. */
   OffsetTo<Coverage> extendedShapeCoverage;
 
    /* Offset to MathKernInfo table -
   OffsetTo<Coverage> extendedShapeCoverage;
 
    /* Offset to MathKernInfo table -
@@ -425,7 +425,7 @@ struct MathGlyphVariantRecord
 
   protected:
   GlyphID variantGlyph;       /* Glyph ID for the variant. */
 
   protected:
   GlyphID variantGlyph;       /* Glyph ID for the variant. */
-  USHORT  advanceMeasurement; /* Advance width/height, in design units, of the
+  HBUINT16  advanceMeasurement; /* Advance width/height, in design units, of the
                               * variant, in the direction of requested
                               * glyph extension. */
 
                               * variant, in the direction of requested
                               * glyph extension. */
 
@@ -433,7 +433,7 @@ struct MathGlyphVariantRecord
   DEFINE_SIZE_STATIC (4);
 };
 
   DEFINE_SIZE_STATIC (4);
 };
 
-struct PartFlags : USHORT
+struct PartFlags : HBUINT16
 {
   enum Flags {
     Extender   = 0x0001u, /* If set, the part can be skipped or repeated. */
 {
   enum Flags {
     Extender   = 0x0001u, /* If set, the part can be skipped or repeated. */
@@ -463,8 +463,8 @@ struct MathGlyphPartRecord
     out.end_connector_length   = font->em_scale (endConnectorLength, scale);
     out.full_advance           = font->em_scale (fullAdvance, scale);
 
     out.end_connector_length   = font->em_scale (endConnectorLength, scale);
     out.full_advance           = font->em_scale (fullAdvance, scale);
 
-    ASSERT_STATIC ((unsigned int) HB_MATH_GLYPH_PART_FLAG_EXTENDER ==
-                  (unsigned int) PartFlags::Extender);
+    static_assert ((unsigned int) HB_MATH_GLYPH_PART_FLAG_EXTENDER ==
+                  (unsigned int) PartFlags::Extender, "");
 
     out.flags = (hb_ot_math_glyph_part_flags_t)
                (unsigned int)
 
     out.flags = (hb_ot_math_glyph_part_flags_t)
                (unsigned int)
@@ -473,15 +473,15 @@ struct MathGlyphPartRecord
 
   protected:
   GlyphID   glyph;               /* Glyph ID for the part. */
 
   protected:
   GlyphID   glyph;               /* Glyph ID for the part. */
-  USHORT    startConnectorLength; /* Advance width/ height of the straight bar
+  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. */
                                   * connector material, in design units, is at
                                   * the beginning of the glyph, in the
                                   * direction of the extension. */
-  USHORT    endConnectorLength;   /* Advance width/ height of the straight bar
+  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. */
                                   * connector material, in design units, is at
                                   * the end of the glyph, in the direction of
                                   * the extension. */
-  USHORT    fullAdvance;         /* Full advance width/height for this part,
+  HBUINT16    fullAdvance;       /* Full advance width/height for this part,
                                   * in the direction of the extension.
                                   * In design units. */
   PartFlags partFlags;           /* Part qualifiers. */
                                   * in the direction of the extension.
                                   * In design units. */
   PartFlags partFlags;           /* Part qualifiers. */
@@ -571,7 +571,7 @@ struct MathGlyphConstruction
 
   protected:
   /* Offset to MathGlyphAssembly table for this shape - from the beginning of
 
   protected:
   /* Offset to MathGlyphAssembly table for this shape - from the beginning of
-     MathGlyphConstruction table. May be NULL. */
+     MathGlyphConstruction table. May be nullptr. */
   OffsetTo<MathGlyphAssembly>    glyphAssembly;
 
   /* MathGlyphVariantRecords for alternative variants of the glyphs. */
   OffsetTo<MathGlyphAssembly>    glyphAssembly;
 
   /* MathGlyphVariantRecords for alternative variants of the glyphs. */
@@ -651,7 +651,7 @@ struct MathVariants
   }
 
   protected:
   }
 
   protected:
-  USHORT            minConnectorOverlap; /* Minimum overlap of connecting
+  HBUINT16          minConnectorOverlap; /* Minimum overlap of connecting
                                           * glyphs during glyph construction,
                                           * in design units. */
   OffsetTo<Coverage> vertGlyphCoverage;   /* Offset to Coverage table -
                                           * glyphs during glyph construction,
                                           * in design units. */
   OffsetTo<Coverage> vertGlyphCoverage;   /* Offset to Coverage table -
@@ -660,10 +660,10 @@ struct MathVariants
   OffsetTo<Coverage> horizGlyphCoverage;  /* Offset to Coverage table -
                                           * from the beginning of MathVariants
                                           * table. */
   OffsetTo<Coverage> horizGlyphCoverage;  /* Offset to Coverage table -
                                           * from the beginning of MathVariants
                                           * table. */
-  USHORT            vertGlyphCount;      /* Number of glyphs for which
+  HBUINT16          vertGlyphCount;      /* Number of glyphs for which
                                           * information is provided for
                                           * vertically growing variants. */
                                           * information is provided for
                                           * vertically growing variants. */
-  USHORT            horizGlyphCount;     /* Number of glyphs for which
+  HBUINT16          horizGlyphCount;     /* Number of glyphs for which
                                           * information is provided for
                                           * horizontally growing variants. */
 
                                           * information is provided for
                                           * horizontally growing variants. */
 
index 943e390..881deda 100644 (file)
@@ -28,7 +28,7 @@
 #define HB_OT_MAXP_TABLE_HH
 
 #include "hb-open-type-private.hh"
 #define HB_OT_MAXP_TABLE_HH
 
 #include "hb-open-type-private.hh"
-
+#include "hb-subset-plan.hh"
 
 namespace OT {
 
 
 namespace OT {
 
@@ -39,28 +39,104 @@ namespace OT {
 
 #define HB_OT_TAG_maxp HB_TAG('m','a','x','p')
 
 
 #define HB_OT_TAG_maxp HB_TAG('m','a','x','p')
 
+struct maxpV1Tail
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16 maxPoints;            /* Maximum points in a non-composite glyph. */
+  HBUINT16 maxContours;                  /* Maximum contours in a non-composite glyph. */
+  HBUINT16 maxCompositePoints;   /* Maximum points in a composite glyph. */
+  HBUINT16 maxCompositeContours;  /* Maximum contours in a composite glyph. */
+  HBUINT16 maxZones;             /* 1 if instructions do not use the twilight zone (Z0),
+                                  * or 2 if instructions do use Z0; should be set to 2 in
+                                  * most cases. */
+  HBUINT16 maxTwilightPoints;    /* Maximum points used in Z0. */
+  HBUINT16 maxStorage;           /* Number of Storage Area locations. */
+  HBUINT16 maxFunctionDefs;      /* Number of FDEFs, equal to the highest function number + 1. */
+  HBUINT16 maxInstructionDefs;   /* Number of IDEFs. */
+  HBUINT16 maxStackElements;     /* Maximum stack depth. (This includes Font and CVT
+                                  * Programs, as well as the instructions for each glyph.) */
+  HBUINT16 maxSizeOfInstructions; /* Maximum byte count for glyph instructions. */
+  HBUINT16 maxComponentElements;  /* Maximum number of components referenced at
+                                  * "top level" for any composite glyph. */
+  HBUINT16 maxComponentDepth;    /* Maximum levels of recursion; 1 for simple components. */
+ public:
+  DEFINE_SIZE_STATIC (26);
+};
+
+
 struct maxp
 {
 struct maxp
 {
-  static const hb_tag_t tableTag       = HB_OT_TAG_maxp;
+  static const hb_tag_t tableTag = HB_OT_TAG_maxp;
 
   inline unsigned int get_num_glyphs (void) const
   {
     return numGlyphs;
   }
 
 
   inline unsigned int get_num_glyphs (void) const
   {
     return numGlyphs;
   }
 
+  inline void set_num_glyphs (unsigned int count)
+  {
+    numGlyphs.set (count);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-                 likely (version.major == 1 ||
-                         (version.major == 0 && version.minor == 0x5000u)));
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+
+    if (version.major == 1)
+    {
+      const maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*this);
+      return v1.sanitize (c);
+    }
+    return_trace (likely (version.major == 0 && version.minor == 0x5000u));
+  }
+
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_maxp));
+    hb_blob_t *maxp_prime_blob = hb_blob_copy_writable_or_fail (maxp_blob);
+    hb_blob_destroy (maxp_blob);
+
+    if (unlikely (!maxp_prime_blob)) {
+      return false;
+    }
+    OT::maxp *maxp_prime = (OT::maxp *) hb_blob_get_data (maxp_prime_blob, nullptr);
+
+    maxp_prime->set_num_glyphs (plan->gids_to_retain_sorted.len);
+    if (plan->drop_hints)
+      drop_hint_fields (plan, maxp_prime);
+
+    bool result = hb_subset_plan_add_table(plan, HB_OT_TAG_maxp, maxp_prime_blob);
+    hb_blob_destroy (maxp_prime_blob);
+    return result;
+  }
+
+  static inline void drop_hint_fields (hb_subset_plan_t *plan, OT::maxp *maxp_prime)
+  {
+    if (maxp_prime->version.major == 1)
+    {
+      maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*maxp_prime);
+      v1.maxZones.set (1);
+      v1.maxTwilightPoints.set (0);
+      v1.maxStorage.set (0);
+      v1.maxFunctionDefs.set (0);
+      v1.maxInstructionDefs.set (0);
+      v1.maxStackElements.set (0);
+      v1.maxSizeOfInstructions.set (0);
+    }
   }
 
   }
 
-  /* We only implement version 0.5 as none of the extra fields in version 1.0 are useful. */
   protected:
   FixedVersion<>version;               /* Version of the maxp table (0.5 or 1.0),
                                         * 0x00005000u or 0x00010000u. */
   protected:
   FixedVersion<>version;               /* Version of the maxp table (0.5 or 1.0),
                                         * 0x00005000u or 0x00010000u. */
-  USHORT       numGlyphs;              /* The number of glyphs in the font. */
+  HBUINT16     numGlyphs;              /* The number of glyphs in the font. */
+/*maxpV1Tail v1Tail[VAR]; */
   public:
   DEFINE_SIZE_STATIC (6);
 };
   public:
   DEFINE_SIZE_STATIC (6);
 };
index 870f123..eb01333 100644 (file)
@@ -42,8 +42,10 @@ namespace OT {
 
 struct NameRecord
 {
 
 struct NameRecord
 {
-  static int cmp (const NameRecord *a, const NameRecord *b)
+  static int cmp (const void *pa, const void *pb)
   {
   {
+    const NameRecord *a = (const NameRecord *) pa;
+    const NameRecord *b = (const NameRecord *) pb;
     int ret;
     ret = b->platformID.cmp (a->platformID);
     if (ret) return ret;
     int ret;
     ret = b->platformID.cmp (a->platformID);
     if (ret) return ret;
@@ -63,12 +65,12 @@ struct NameRecord
     return_trace (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset));
   }
 
     return_trace (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset));
   }
 
-  USHORT       platformID;     /* Platform ID. */
-  USHORT       encodingID;     /* Platform-specific encoding ID. */
-  USHORT       languageID;     /* Language ID. */
-  USHORT       nameID;         /* Name ID. */
-  USHORT       length;         /* String length (in bytes). */
-  USHORT       offset;         /* String offset from start of storage area (in bytes). */
+  HBUINT16     platformID;     /* Platform ID. */
+  HBUINT16     encodingID;     /* Platform-specific encoding ID. */
+  HBUINT16     languageID;     /* Language ID. */
+  HBUINT16     nameID;         /* Name ID. */
+  HBUINT16     length;         /* String length (in bytes). */
+  HBUINT16     offset;         /* String offset from start of storage area (in bytes). */
   public:
   DEFINE_SIZE_STATIC (12);
 };
   public:
   DEFINE_SIZE_STATIC (12);
 };
@@ -89,7 +91,7 @@ struct name
     key.encodingID.set (encoding_id);
     key.languageID.set (language_id);
     key.nameID.set (name_id);
     key.encodingID.set (encoding_id);
     key.languageID.set (language_id);
     key.nameID.set (name_id);
-    NameRecord *match = (NameRecord *) bsearch (&key, nameRecord, count, sizeof (nameRecord[0]), (hb_compare_func_t) NameRecord::cmp);
+    NameRecord *match = (NameRecord *) bsearch (&key, nameRecord, count, sizeof (nameRecord[0]), NameRecord::cmp);
 
     if (!match)
       return 0;
 
     if (!match)
       return 0;
@@ -121,9 +123,9 @@ struct name
   }
 
   /* We only implement format 0 for now. */
   }
 
   /* We only implement format 0 for now. */
-  USHORT       format;                 /* Format selector (=0/1). */
-  USHORT       count;                  /* Number of name records. */
-  Offset<>     stringOffset;           /* Offset to start of string storage (from start of table). */
+  HBUINT16     format;                 /* Format selector (=0/1). */
+  HBUINT16     count;                  /* Number of name records. */
+  Offset16     stringOffset;           /* Offset to start of string storage (from start of table). */
   NameRecord   nameRecord[VAR];        /* The name records where count is the number of records. */
   public:
   DEFINE_SIZE_ARRAY (6, nameRecord);
   NameRecord   nameRecord[VAR];        /* The name records where count is the number of records. */
   public:
   DEFINE_SIZE_ARRAY (6, nameRecord);
index 4709cd6..6cb8d49 100644 (file)
@@ -28,7 +28,7 @@
 #define HB_OT_OS2_TABLE_HH
 
 #include "hb-open-type-private.hh"
 #define HB_OT_OS2_TABLE_HH
 
 #include "hb-open-type-private.hh"
-
+#include "hb-ot-os2-unicode-ranges.hh"
 
 namespace OT {
 
 
 namespace OT {
 
@@ -49,51 +49,127 @@ struct os2
     return_trace (c->check_struct (this));
   }
 
     return_trace (c->check_struct (this));
   }
 
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *os2_blob = OT::Sanitizer<OT::os2>().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_os2));
+    hb_blob_t *os2_prime_blob = hb_blob_create_sub_blob (os2_blob, 0, -1);
+    // TODO(grieger): move to hb_blob_copy_writable_or_fail
+    hb_blob_destroy (os2_blob);
+
+    OT::os2 *os2_prime = (OT::os2 *) hb_blob_get_data_writable (os2_prime_blob, nullptr);
+    if (unlikely (!os2_prime)) {
+      hb_blob_destroy (os2_prime_blob);
+      return false;
+    }
+
+    uint16_t min_cp, max_cp;
+    find_min_and_max_codepoint (plan->codepoints, &min_cp, &max_cp);
+    os2_prime->usFirstCharIndex.set (min_cp);
+    os2_prime->usLastCharIndex.set (max_cp);
+
+    _update_unicode_ranges (plan->codepoints, os2_prime->ulUnicodeRange);
+    bool result = hb_subset_plan_add_table(plan, HB_OT_TAG_os2, os2_prime_blob);
+
+    hb_blob_destroy (os2_prime_blob);
+    return result;
+  }
+
+  inline void _update_unicode_ranges (const hb_prealloced_array_t<hb_codepoint_t> &codepoints,
+                                      HBUINT32 ulUnicodeRange[4]) const
+  {
+    for (unsigned int i = 0; i < 4; i++)
+      ulUnicodeRange[i].set (0);
+
+    for (unsigned int i = 0; i < codepoints.len; i++)
+    {
+      hb_codepoint_t cp = codepoints[i];
+      unsigned int bit = hb_get_unicode_range_bit (cp);
+      if (bit < 128)
+      {
+        unsigned int block = bit / 32;
+        unsigned int bit_in_block = bit % 32;
+        unsigned int mask = 1 << bit_in_block;
+        ulUnicodeRange[block].set (ulUnicodeRange[block] | mask);
+      }
+      if (cp >= 0x10000 && cp <= 0x110000)
+      {
+        /* the spec says that bit 57 ("Non Plane 0") implies that there's
+           at least one codepoint beyond the BMP; so I also include all
+           the non-BMP codepoints here */
+        ulUnicodeRange[1].set (ulUnicodeRange[1] | (1 << 25));
+      }
+    }
+  }
+
+  static inline void find_min_and_max_codepoint (const hb_prealloced_array_t<hb_codepoint_t> &codepoints,
+                                                 uint16_t *min_cp, /* OUT */
+                                                 uint16_t *max_cp  /* OUT */)
+  {
+    hb_codepoint_t min = -1, max = 0;
+
+    for (unsigned int i = 0; i < codepoints.len; i++)
+    {
+      hb_codepoint_t cp = codepoints[i];
+      if (cp < min)
+        min = cp;
+      if (cp > max)
+        max = cp;
+    }
+
+    if (min > 0xFFFF)
+      min = 0xFFFF;
+    if (max > 0xFFFF)
+      max = 0xFFFF;
+
+    *min_cp = min;
+    *max_cp = max;
+  }
+
   public:
   public:
-  USHORT       version;
+  HBUINT16     version;
 
   /* Version 0 */
 
   /* Version 0 */
-  SHORT                xAvgCharWidth;
-  USHORT       usWeightClass;
-  USHORT       usWidthClass;
-  USHORT       fsType;
-  SHORT                ySubscriptXSize;
-  SHORT                ySubscriptYSize;
-  SHORT                ySubscriptXOffset;
-  SHORT                ySubscriptYOffset;
-  SHORT                ySuperscriptXSize;
-  SHORT                ySuperscriptYSize;
-  SHORT                ySuperscriptXOffset;
-  SHORT                ySuperscriptYOffset;
-  SHORT                yStrikeoutSize;
-  SHORT                yStrikeoutPosition;
-  SHORT                sFamilyClass;
-  BYTE         panose[10];
-  ULONG                ulUnicodeRange[4];
+  HBINT16      xAvgCharWidth;
+  HBUINT16     usWeightClass;
+  HBUINT16     usWidthClass;
+  HBUINT16     fsType;
+  HBINT16      ySubscriptXSize;
+  HBINT16      ySubscriptYSize;
+  HBINT16      ySubscriptXOffset;
+  HBINT16      ySubscriptYOffset;
+  HBINT16      ySuperscriptXSize;
+  HBINT16      ySuperscriptYSize;
+  HBINT16      ySuperscriptXOffset;
+  HBINT16      ySuperscriptYOffset;
+  HBINT16      yStrikeoutSize;
+  HBINT16      yStrikeoutPosition;
+  HBINT16      sFamilyClass;
+  HBUINT8      panose[10];
+  HBUINT32     ulUnicodeRange[4];
   Tag          achVendID;
   Tag          achVendID;
-  USHORT       fsSelection;
-  USHORT       usFirstCharIndex;
-  USHORT       usLastCharIndex;
-  SHORT                sTypoAscender;
-  SHORT                sTypoDescender;
-  SHORT                sTypoLineGap;
-  USHORT       usWinAscent;
-  USHORT       usWinDescent;
+  HBUINT16     fsSelection;
+  HBUINT16     usFirstCharIndex;
+  HBUINT16     usLastCharIndex;
+  HBINT16      sTypoAscender;
+  HBINT16      sTypoDescender;
+  HBINT16      sTypoLineGap;
+  HBUINT16     usWinAscent;
+  HBUINT16     usWinDescent;
 
   /* Version 1 */
 
   /* Version 1 */
-  //ULONG ulCodePageRange1;
-  //ULONG ulCodePageRange2;
+  //HBUINT32   ulCodePageRange1;
+  //HBUINT32   ulCodePageRange2;
 
   /* Version 2 */
 
   /* Version 2 */
-  //SHORT sxHeight;
-  //SHORT sCapHeight;
-  //USHORT  usDefaultChar;
-  //USHORT  usBreakChar;
-  //USHORT  usMaxContext;
+  //HBINT16    sxHeight;
+  //HBINT16    sCapHeight;
+  //HBUINT16   usDefaultChar;
+  //HBUINT16   usBreakChar;
+  //HBUINT16   usMaxContext;
 
   /* Version 5 */
 
   /* Version 5 */
-  //USHORT  usLowerOpticalPointSize;
-  //USHORT  usUpperOpticalPointSize;
+  //HBUINT16   usLowerOpticalPointSize;
+  //HBUINT16   usUpperOpticalPointSize;
 
   public:
   DEFINE_SIZE_STATIC (78);
 
   public:
   DEFINE_SIZE_STATIC (78);
diff --git a/src/hb-ot-os2-unicode-ranges.hh b/src/hb-ot-os2-unicode-ranges.hh
new file mode 100644 (file)
index 0000000..2cf168f
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#ifndef HB_OT_OS2_UNICODE_RANGES_HH
+#define HB_OT_OS2_UNICODE_RANGES_HH
+
+#include "hb-private.hh"
+#include "hb-dsalgs.hh"
+
+namespace OT {
+
+struct Range {
+  hb_codepoint_t start;
+  hb_codepoint_t end;
+  unsigned int bit;
+};
+
+/* Note: The contents of this array was generated using src/gen-unicode-ranges.py. */
+static Range os2UnicodeRangesSorted[] =
+{
+  {     0x0,     0x7F,   0}, // Basic Latin
+  {    0x80,     0xFF,   1}, // Latin-1 Supplement
+  {   0x100,    0x17F,   2}, // Latin Extended-A
+  {   0x180,    0x24F,   3}, // Latin Extended-B
+  {   0x250,    0x2AF,   4}, // IPA Extensions
+  {   0x2B0,    0x2FF,   5}, // Spacing Modifier Letters
+  {   0x300,    0x36F,   6}, // Combining Diacritical Marks
+  {   0x370,    0x3FF,   7}, // Greek and Coptic
+  {   0x400,    0x4FF,   9}, // Cyrillic
+  {   0x500,    0x52F,   9}, // Cyrillic Supplement
+  {   0x530,    0x58F,  10}, // Armenian
+  {   0x590,    0x5FF,  11}, // Hebrew
+  {   0x600,    0x6FF,  13}, // Arabic
+  {   0x700,    0x74F,  71}, // Syriac
+  {   0x750,    0x77F,  13}, // Arabic Supplement
+  {   0x780,    0x7BF,  72}, // Thaana
+  {   0x7C0,    0x7FF,  14}, // NKo
+  {   0x900,    0x97F,  15}, // Devanagari
+  {   0x980,    0x9FF,  16}, // Bengali
+  {   0xA00,    0xA7F,  17}, // Gurmukhi
+  {   0xA80,    0xAFF,  18}, // Gujarati
+  {   0xB00,    0xB7F,  19}, // Oriya
+  {   0xB80,    0xBFF,  20}, // Tamil
+  {   0xC00,    0xC7F,  21}, // Telugu
+  {   0xC80,    0xCFF,  22}, // Kannada
+  {   0xD00,    0xD7F,  23}, // Malayalam
+  {   0xD80,    0xDFF,  73}, // Sinhala
+  {   0xE00,    0xE7F,  24}, // Thai
+  {   0xE80,    0xEFF,  25}, // Lao
+  {   0xF00,    0xFFF,  70}, // Tibetan
+  {  0x1000,   0x109F,  74}, // Myanmar
+  {  0x10A0,   0x10FF,  26}, // Georgian
+  {  0x1100,   0x11FF,  28}, // Hangul Jamo
+  {  0x1200,   0x137F,  75}, // Ethiopic
+  {  0x1380,   0x139F,  75}, // Ethiopic Supplement
+  {  0x13A0,   0x13FF,  76}, // Cherokee
+  {  0x1400,   0x167F,  77}, // Unified Canadian Aboriginal Syllabics
+  {  0x1680,   0x169F,  78}, // Ogham
+  {  0x16A0,   0x16FF,  79}, // Runic
+  {  0x1700,   0x171F,  84}, // Tagalog
+  {  0x1720,   0x173F,  84}, // Hanunoo
+  {  0x1740,   0x175F,  84}, // Buhid
+  {  0x1760,   0x177F,  84}, // Tagbanwa
+  {  0x1780,   0x17FF,  80}, // Khmer
+  {  0x1800,   0x18AF,  81}, // Mongolian
+  {  0x1900,   0x194F,  93}, // Limbu
+  {  0x1950,   0x197F,  94}, // Tai Le
+  {  0x1980,   0x19DF,  95}, // New Tai Lue
+  {  0x19E0,   0x19FF,  80}, // Khmer Symbols
+  {  0x1A00,   0x1A1F,  96}, // Buginese
+  {  0x1B00,   0x1B7F,  27}, // Balinese
+  {  0x1B80,   0x1BBF, 112}, // Sundanese
+  {  0x1C00,   0x1C4F, 113}, // Lepcha
+  {  0x1C50,   0x1C7F, 114}, // Ol Chiki
+  {  0x1D00,   0x1D7F,   4}, // Phonetic Extensions
+  {  0x1D80,   0x1DBF,   4}, // Phonetic Extensions Supplement
+  {  0x1DC0,   0x1DFF,   6}, // Combining Diacritical Marks Supplement
+  {  0x1E00,   0x1EFF,  29}, // Latin Extended Additional
+  {  0x1F00,   0x1FFF,  30}, // Greek Extended
+  {  0x2000,   0x206F,  31}, // General Punctuation
+  {  0x2070,   0x209F,  32}, // Superscripts And Subscripts
+  {  0x20A0,   0x20CF,  33}, // Currency Symbols
+  {  0x20D0,   0x20FF,  34}, // Combining Diacritical Marks For Symbols
+  {  0x2100,   0x214F,  35}, // Letterlike Symbols
+  {  0x2150,   0x218F,  36}, // Number Forms
+  {  0x2190,   0x21FF,  37}, // Arrows
+  {  0x2200,   0x22FF,  38}, // Mathematical Operators
+  {  0x2300,   0x23FF,  39}, // Miscellaneous Technical
+  {  0x2400,   0x243F,  40}, // Control Pictures
+  {  0x2440,   0x245F,  41}, // Optical Character Recognition
+  {  0x2460,   0x24FF,  42}, // Enclosed Alphanumerics
+  {  0x2500,   0x257F,  43}, // Box Drawing
+  {  0x2580,   0x259F,  44}, // Block Elements
+  {  0x25A0,   0x25FF,  45}, // Geometric Shapes
+  {  0x2600,   0x26FF,  46}, // Miscellaneous Symbols
+  {  0x2700,   0x27BF,  47}, // Dingbats
+  {  0x27C0,   0x27EF,  38}, // Miscellaneous Mathematical Symbols-A
+  {  0x27F0,   0x27FF,  37}, // Supplemental Arrows-A
+  {  0x2800,   0x28FF,  82}, // Braille Patterns
+  {  0x2900,   0x297F,  37}, // Supplemental Arrows-B
+  {  0x2980,   0x29FF,  38}, // Miscellaneous Mathematical Symbols-B
+  {  0x2A00,   0x2AFF,  38}, // Supplemental Mathematical Operators
+  {  0x2B00,   0x2BFF,  37}, // Miscellaneous Symbols and Arrows
+  {  0x2C00,   0x2C5F,  97}, // Glagolitic
+  {  0x2C60,   0x2C7F,  29}, // Latin Extended-C
+  {  0x2C80,   0x2CFF,   8}, // Coptic
+  {  0x2D00,   0x2D2F,  26}, // Georgian Supplement
+  {  0x2D30,   0x2D7F,  98}, // Tifinagh
+  {  0x2D80,   0x2DDF,  75}, // Ethiopic Extended
+  {  0x2DE0,   0x2DFF,   9}, // Cyrillic Extended-A
+  {  0x2E00,   0x2E7F,  31}, // Supplemental Punctuation
+  {  0x2E80,   0x2EFF,  59}, // CJK Radicals Supplement
+  {  0x2F00,   0x2FDF,  59}, // Kangxi Radicals
+  {  0x2FF0,   0x2FFF,  59}, // Ideographic Description Characters
+  {  0x3000,   0x303F,  48}, // CJK Symbols And Punctuation
+  {  0x3040,   0x309F,  49}, // Hiragana
+  {  0x30A0,   0x30FF,  50}, // Katakana
+  {  0x3100,   0x312F,  51}, // Bopomofo
+  {  0x3130,   0x318F,  52}, // Hangul Compatibility Jamo
+  {  0x3190,   0x319F,  59}, // Kanbun
+  {  0x31A0,   0x31BF,  51}, // Bopomofo Extended
+  {  0x31C0,   0x31EF,  61}, // CJK Strokes
+  {  0x31F0,   0x31FF,  50}, // Katakana Phonetic Extensions
+  {  0x3200,   0x32FF,  54}, // Enclosed CJK Letters And Months
+  {  0x3300,   0x33FF,  55}, // CJK Compatibility
+  {  0x3400,   0x4DBF,  59}, // CJK Unified Ideographs Extension A
+  {  0x4DC0,   0x4DFF,  99}, // Yijing Hexagram Symbols
+  {  0x4E00,   0x9FFF,  59}, // CJK Unified Ideographs
+  {  0xA000,   0xA48F,  83}, // Yi Syllables
+  {  0xA490,   0xA4CF,  83}, // Yi Radicals
+  {  0xA500,   0xA63F,  12}, // Vai
+  {  0xA640,   0xA69F,   9}, // Cyrillic Extended-B
+  {  0xA700,   0xA71F,   5}, // Modifier Tone Letters
+  {  0xA720,   0xA7FF,  29}, // Latin Extended-D
+  {  0xA800,   0xA82F, 100}, // Syloti Nagri
+  {  0xA840,   0xA87F,  53}, // Phags-pa
+  {  0xA880,   0xA8DF, 115}, // Saurashtra
+  {  0xA900,   0xA92F, 116}, // Kayah Li
+  {  0xA930,   0xA95F, 117}, // Rejang
+  {  0xAA00,   0xAA5F, 118}, // Cham
+  {  0xAC00,   0xD7AF,  56}, // Hangul Syllables
+  {  0xD800,   0xDFFF,  57}, // Non-Plane 0 *
+  {  0xE000,   0xF8FF,  60}, // Private Use Area (plane 0)
+  {  0xF900,   0xFAFF,  61}, // CJK Compatibility Ideographs
+  {  0xFB00,   0xFB4F,  62}, // Alphabetic Presentation Forms
+  {  0xFB50,   0xFDFF,  63}, // Arabic Presentation Forms-A
+  {  0xFE00,   0xFE0F,  91}, // Variation Selectors
+  {  0xFE10,   0xFE1F,  65}, // Vertical Forms
+  {  0xFE20,   0xFE2F,  64}, // Combining Half Marks
+  {  0xFE30,   0xFE4F,  65}, // CJK Compatibility Forms
+  {  0xFE50,   0xFE6F,  66}, // Small Form Variants
+  {  0xFE70,   0xFEFF,  67}, // Arabic Presentation Forms-B
+  {  0xFF00,   0xFFEF,  68}, // Halfwidth And Fullwidth Forms
+  {  0xFFF0,   0xFFFF,  69}, // Specials
+  { 0x10000,  0x1007F, 101}, // Linear B Syllabary
+  { 0x10080,  0x100FF, 101}, // Linear B Ideograms
+  { 0x10100,  0x1013F, 101}, // Aegean Numbers
+  { 0x10140,  0x1018F, 102}, // Ancient Greek Numbers
+  { 0x10190,  0x101CF, 119}, // Ancient Symbols
+  { 0x101D0,  0x101FF, 120}, // Phaistos Disc
+  { 0x10280,  0x1029F, 121}, // Lycian
+  { 0x102A0,  0x102DF, 121}, // Carian
+  { 0x10300,  0x1032F,  85}, // Old Italic
+  { 0x10330,  0x1034F,  86}, // Gothic
+  { 0x10380,  0x1039F, 103}, // Ugaritic
+  { 0x103A0,  0x103DF, 104}, // Old Persian
+  { 0x10400,  0x1044F,  87}, // Deseret
+  { 0x10450,  0x1047F, 105}, // Shavian
+  { 0x10480,  0x104AF, 106}, // Osmanya
+  { 0x10800,  0x1083F, 107}, // Cypriot Syllabary
+  { 0x10900,  0x1091F,  58}, // Phoenician
+  { 0x10920,  0x1093F, 121}, // Lydian
+  { 0x10A00,  0x10A5F, 108}, // Kharoshthi
+  { 0x12000,  0x123FF, 110}, // Cuneiform
+  { 0x12400,  0x1247F, 110}, // Cuneiform Numbers and Punctuation
+  { 0x1D000,  0x1D0FF,  88}, // Byzantine Musical Symbols
+  { 0x1D100,  0x1D1FF,  88}, // Musical Symbols
+  { 0x1D200,  0x1D24F,  88}, // Ancient Greek Musical Notation
+  { 0x1D300,  0x1D35F, 109}, // Tai Xuan Jing Symbols
+  { 0x1D360,  0x1D37F, 111}, // Counting Rod Numerals
+  { 0x1D400,  0x1D7FF,  89}, // Mathematical Alphanumeric Symbols
+  { 0x1F000,  0x1F02F, 122}, // Mahjong Tiles
+  { 0x1F030,  0x1F09F, 122}, // Domino Tiles
+  { 0x20000,  0x2A6DF,  59}, // CJK Unified Ideographs Extension B
+  { 0x2F800,  0x2FA1F,  61}, // CJK Compatibility Ideographs Supplement
+  { 0xE0000,  0xE007F,  92}, // Tags
+  { 0xE0100,  0xE01EF,  91}, // Variation Selectors Supplement
+  { 0xF0000,  0xFFFFD,  90}, // Private Use (plane 15)
+  {0x100000, 0x10FFFD,  90}, // Private Use (plane 16)
+};
+
+static int
+_compare_range (const void *_key, const void *_item, void *_arg)
+{
+  hb_codepoint_t cp = *((hb_codepoint_t *) _key);
+  const Range *range = (Range *) _item;
+
+  if (cp < range->start)
+    return -1;
+  else if (cp <= range->end)
+    return 0;
+  else
+    return 1;
+}
+
+/**
+ * hb_get_unicode_range_bit:
+ * Returns the bit to be set in os/2 ulUnicodeRange for a given codepoint.
+ **/
+static unsigned int
+hb_get_unicode_range_bit (hb_codepoint_t cp)
+{
+  Range *range = (Range*) hb_bsearch_r (&cp, os2UnicodeRangesSorted,
+                                        sizeof (os2UnicodeRangesSorted) / sizeof(Range),
+                                        sizeof(Range),
+                                        _compare_range, nullptr);
+  if (range != NULL)
+    return range->bit;
+  return -1;
+}
+
+} /* namespace OT */
+
+#endif /* HB_OT_OS2_UNICODE_RANGES_HH */
diff --git a/src/hb-ot-post-macroman.hh b/src/hb-ot-post-macroman.hh
new file mode 100644 (file)
index 0000000..dbbb97e
--- /dev/null
@@ -0,0 +1,294 @@
+/*
+ * Copyright © 2017  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_POST_MACROMAN_HH
+#if 0 /* Make checks happy. */
+#define HB_OT_POST_MACROMAN_HH
+#include "hb-private.hh"
+#endif
+
+
+_S(".notdef")
+_S(".null")
+_S("nonmarkingreturn")
+_S("space")
+_S("exclam")
+_S("quotedbl")
+_S("numbersign")
+_S("dollar")
+_S("percent")
+_S("ampersand")
+_S("quotesingle")
+_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("grave")
+_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("Adieresis")
+_S("Aring")
+_S("Ccedilla")
+_S("Eacute")
+_S("Ntilde")
+_S("Odieresis")
+_S("Udieresis")
+_S("aacute")
+_S("agrave")
+_S("acircumflex")
+_S("adieresis")
+_S("atilde")
+_S("aring")
+_S("ccedilla")
+_S("eacute")
+_S("egrave")
+_S("ecircumflex")
+_S("edieresis")
+_S("iacute")
+_S("igrave")
+_S("icircumflex")
+_S("idieresis")
+_S("ntilde")
+_S("oacute")
+_S("ograve")
+_S("ocircumflex")
+_S("odieresis")
+_S("otilde")
+_S("uacute")
+_S("ugrave")
+_S("ucircumflex")
+_S("udieresis")
+_S("dagger")
+_S("degree")
+_S("cent")
+_S("sterling")
+_S("section")
+_S("bullet")
+_S("paragraph")
+_S("germandbls")
+_S("registered")
+_S("copyright")
+_S("trademark")
+_S("acute")
+_S("dieresis")
+_S("notequal")
+_S("AE")
+_S("Oslash")
+_S("infinity")
+_S("plusminus")
+_S("lessequal")
+_S("greaterequal")
+_S("yen")
+_S("mu")
+_S("partialdiff")
+_S("summation")
+_S("product")
+_S("pi")
+_S("integral")
+_S("ordfeminine")
+_S("ordmasculine")
+_S("Omega")
+_S("ae")
+_S("oslash")
+_S("questiondown")
+_S("exclamdown")
+_S("logicalnot")
+_S("radical")
+_S("florin")
+_S("approxequal")
+_S("Delta")
+_S("guillemotleft")
+_S("guillemotright")
+_S("ellipsis")
+_S("nonbreakingspace")
+_S("Agrave")
+_S("Atilde")
+_S("Otilde")
+_S("OE")
+_S("oe")
+_S("endash")
+_S("emdash")
+_S("quotedblleft")
+_S("quotedblright")
+_S("quoteleft")
+_S("quoteright")
+_S("divide")
+_S("lozenge")
+_S("ydieresis")
+_S("Ydieresis")
+_S("fraction")
+_S("currency")
+_S("guilsinglleft")
+_S("guilsinglright")
+_S("fi")
+_S("fl")
+_S("daggerdbl")
+_S("periodcentered")
+_S("quotesinglbase")
+_S("quotedblbase")
+_S("perthousand")
+_S("Acircumflex")
+_S("Ecircumflex")
+_S("Aacute")
+_S("Edieresis")
+_S("Egrave")
+_S("Iacute")
+_S("Icircumflex")
+_S("Idieresis")
+_S("Igrave")
+_S("Oacute")
+_S("Ocircumflex")
+_S("apple")
+_S("Ograve")
+_S("Uacute")
+_S("Ucircumflex")
+_S("Ugrave")
+_S("dotlessi")
+_S("circumflex")
+_S("tilde")
+_S("macron")
+_S("breve")
+_S("dotaccent")
+_S("ring")
+_S("cedilla")
+_S("hungarumlaut")
+_S("ogonek")
+_S("caron")
+_S("Lslash")
+_S("lslash")
+_S("Scaron")
+_S("scaron")
+_S("Zcaron")
+_S("zcaron")
+_S("brokenbar")
+_S("Eth")
+_S("eth")
+_S("Yacute")
+_S("yacute")
+_S("Thorn")
+_S("thorn")
+_S("minus")
+_S("multiply")
+_S("onesuperior")
+_S("twosuperior")
+_S("threesuperior")
+_S("onehalf")
+_S("onequarter")
+_S("threequarters")
+_S("franc")
+_S("Gbreve")
+_S("gbreve")
+_S("Idotaccent")
+_S("Scedilla")
+_S("scedilla")
+_S("Cacute")
+_S("cacute")
+_S("Ccaron")
+_S("ccaron")
+_S("dcroat")
+
+
+#endif /* HB_OT_POST_MACROMAN_HH */
index 82ab388..9e47921 100644 (file)
 #define HB_OT_POST_TABLE_HH
 
 #include "hb-open-type-private.hh"
 #define HB_OT_POST_TABLE_HH
 
 #include "hb-open-type-private.hh"
+#include "hb-dsalgs.hh"
 
 
+#define HB_STRING_ARRAY_NAME format1_names
+#define HB_STRING_ARRAY_LIST "hb-ot-post-macroman.hh"
+#include "hb-string-array.hh"
+#undef HB_STRING_ARRAY_LIST
+#undef HB_STRING_ARRAY_NAME
+
+#define NUM_FORMAT1_NAMES 258
 
 namespace OT {
 
 
 namespace OT {
 
@@ -45,16 +53,13 @@ struct postV2Tail
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (numberOfGlyphs.sanitize (c) &&
-                 c->check_array (glyphNameIndex, sizeof (USHORT), numberOfGlyphs));
+    return_trace (glyphNameIndex.sanitize (c));
   }
 
   }
 
-  USHORT       numberOfGlyphs;         /* Number of glyphs (this should be the
-                                        * same as numGlyphs in 'maxp' table). */
-  USHORT       glyphNameIndex[VAR];    /* This is not an offset, but is the
+  ArrayOf<HBUINT16>glyphNameIndex;     /* This is not an offset, but is the
                                         * ordinal number of the glyph in 'post'
                                         * string tables. */
                                         * ordinal number of the glyph in 'post'
                                         * string tables. */
-  BYTE         namesX[VAR];            /* Glyph names with length bytes [variable]
+  HBUINT8              namesX[VAR];            /* Glyph names with length bytes [variable]
                                         * (a Pascal string). */
 
   DEFINE_SIZE_ARRAY2 (2, glyphNameIndex, namesX);
                                         * (a Pascal string). */
 
   DEFINE_SIZE_ARRAY2 (2, glyphNameIndex, namesX);
@@ -71,12 +76,170 @@ struct post
       return_trace (false);
     if (version.to_int () == 0x00020000)
     {
       return_trace (false);
     if (version.to_int () == 0x00020000)
     {
-      const postV2Tail &v2 = StructAfter<postV2Tail>(*this);
+      const postV2Tail &v2 = StructAfter<postV2Tail> (*this);
       return_trace (v2.sanitize (c));
     }
     return_trace (true);
   }
 
       return_trace (v2.sanitize (c));
     }
     return_trace (true);
   }
 
+  struct accelerator_t
+  {
+    inline void init (hb_face_t *face)
+    {
+      blob = Sanitizer<post>().sanitize (face->reference_table (HB_OT_TAG_post));
+      const post *table = Sanitizer<post>::lock_instance (blob);
+      unsigned int table_length = hb_blob_get_length (blob);
+
+      version = table->version.to_int ();
+      index_to_offset.init ();
+      if (version != 0x00020000)
+        return;
+
+      const postV2Tail &v2 = StructAfter<postV2Tail> (*table);
+
+      glyphNameIndex = &v2.glyphNameIndex;
+      pool = &StructAfter<uint8_t> (v2.glyphNameIndex);
+
+      const uint8_t *end = (uint8_t *) table + table_length;
+      for (const uint8_t *data = pool; data < end && data + *data <= end; data += 1 + *data)
+      {
+       uint32_t *offset = index_to_offset.push ();
+       if (unlikely (!offset))
+         break;
+       *offset = data - pool;
+      }
+    }
+    inline void fini (void)
+    {
+      index_to_offset.finish ();
+      free (gids_sorted_by_name);
+    }
+
+    inline bool get_glyph_name (hb_codepoint_t glyph,
+                               char *buf, unsigned int buf_len) const
+    {
+      hb_string_t s = find_glyph_name (glyph);
+      if (!s.len)
+        return false;
+      if (!buf_len)
+       return true;
+      if (buf_len <= s.len) /* What to do with truncation? Returning false for now. */
+        return false;
+      strncpy (buf, s.bytes, s.len);
+      buf[s.len] = '\0';
+      return true;
+    }
+
+    inline bool get_glyph_from_name (const char *name, int len,
+                                    hb_codepoint_t *glyph) const
+    {
+      unsigned int count = get_glyph_count ();
+      if (unlikely (!count))
+        return false;
+
+      if (len < 0)
+       len = strlen (name);
+
+      if (unlikely (!len))
+       return false;
+
+    retry:
+      uint16_t *gids = (uint16_t *) hb_atomic_ptr_get (&gids_sorted_by_name);
+
+      if (unlikely (!gids))
+      {
+       gids = (uint16_t *) malloc (count * sizeof (gids[0]));
+       if (unlikely (!gids))
+         return false; /* Anything better?! */
+
+       for (unsigned int i = 0; i < count; i++)
+         gids[i] = i;
+       hb_sort_r (gids, count, sizeof (gids[0]), cmp_gids, (void *) this);
+
+       if (!hb_atomic_ptr_cmpexch (&gids_sorted_by_name, nullptr, gids)) {
+         free (gids);
+         goto retry;
+       }
+      }
+
+      hb_string_t st (name, len);
+      const uint16_t *gid = (const uint16_t *) hb_bsearch_r (&st, gids, count, sizeof (gids[0]), cmp_key, (void *) this);
+      if (gid)
+      {
+       *glyph = *gid;
+       return true;
+      }
+
+      return false;
+    }
+
+    protected:
+
+    inline unsigned int get_glyph_count (void) const
+    {
+      if (version == 0x00010000)
+        return NUM_FORMAT1_NAMES;
+
+      if (version == 0x00020000)
+        return glyphNameIndex->len;
+
+      return 0;
+    }
+
+    static inline int cmp_gids (const void *pa, const void *pb, void *arg)
+    {
+      const accelerator_t *thiz = (const accelerator_t *) arg;
+      uint16_t a = * (const uint16_t *) pa;
+      uint16_t b = * (const uint16_t *) pb;
+      return thiz->find_glyph_name (b).cmp (thiz->find_glyph_name (a));
+    }
+
+    static inline int cmp_key (const void *pk, const void *po, void *arg)
+    {
+      const accelerator_t *thiz = (const accelerator_t *) arg;
+      const hb_string_t *key = (const hb_string_t *) pk;
+      uint16_t o = * (const uint16_t *) po;
+      return thiz->find_glyph_name (o).cmp (*key);
+    }
+
+    inline hb_string_t find_glyph_name (hb_codepoint_t glyph) const
+    {
+      if (version == 0x00010000)
+      {
+       if (glyph >= NUM_FORMAT1_NAMES)
+         return hb_string_t ();
+
+       return format1_names (glyph);
+      }
+
+      if (version != 0x00020000 || glyph >= glyphNameIndex->len)
+       return hb_string_t ();
+
+      unsigned int index = glyphNameIndex->array[glyph];
+      if (index < NUM_FORMAT1_NAMES)
+       return format1_names (index);
+      index -= NUM_FORMAT1_NAMES;
+
+      if (index >= index_to_offset.len)
+       return hb_string_t ();
+      unsigned int offset = index_to_offset.array[index];
+
+      const uint8_t *data = pool + offset;
+      unsigned int name_length = *data;
+      data++;
+
+      return hb_string_t ((const char *) data, name_length);
+    }
+
+    private:
+    hb_blob_t *blob;
+    uint32_t version;
+    const ArrayOf<HBUINT16> *glyphNameIndex;
+    hb_prealloced_array_t<uint32_t, 1> index_to_offset;
+    const uint8_t *pool;
+    mutable uint16_t *gids_sorted_by_name;
+  };
+
   public:
   FixedVersion<>version;               /* 0x00010000 for version 1.0
                                         * 0x00020000 for version 2.0
   public:
   FixedVersion<>version;               /* 0x00010000 for version 1.0
                                         * 0x00020000 for version 2.0
@@ -98,16 +261,16 @@ struct post
                                         * from the value of this field. */
   FWORD                underlineThickness;     /* Suggested values for the underline
                                           thickness. */
                                         * from the value of this field. */
   FWORD                underlineThickness;     /* Suggested values for the underline
                                           thickness. */
-  ULONG                isFixedPitch;           /* Set to 0 if the font is proportionally
+  HBUINT32     isFixedPitch;           /* Set to 0 if the font is proportionally
                                         * spaced, non-zero if the font is not
                                         * proportionally spaced (i.e. monospaced). */
                                         * spaced, non-zero if the font is not
                                         * proportionally spaced (i.e. monospaced). */
-  ULONG                minMemType42;           /* Minimum memory usage when an OpenType font
+  HBUINT32     minMemType42;           /* Minimum memory usage when an OpenType font
                                         * is downloaded. */
                                         * is downloaded. */
-  ULONG                maxMemType42;           /* Maximum memory usage when an OpenType font
+  HBUINT32     maxMemType42;           /* Maximum memory usage when an OpenType font
                                         * is downloaded. */
                                         * is downloaded. */
-  ULONG                minMemType1;            /* Minimum memory usage when an OpenType font
+  HBUINT32     minMemType1;            /* Minimum memory usage when an OpenType font
                                         * is downloaded as a Type 1 font. */
                                         * is downloaded as a Type 1 font. */
-  ULONG                maxMemType1;            /* Maximum memory usage when an OpenType font
+  HBUINT32     maxMemType1;            /* Maximum memory usage when an OpenType font
                                         * is downloaded as a Type 1 font. */
 /*postV2Tail   v2[VAR];*/
   DEFINE_SIZE_STATIC (32);
                                         * is downloaded as a Type 1 font. */
 /*postV2Tail   v2[VAR];*/
   DEFINE_SIZE_STATIC (32);
index d97d285..5a257f0 100644 (file)
@@ -73,11 +73,11 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS
   }
 
   if (!num_glyphs)
   }
 
   if (!num_glyphs)
-    return NULL;
+    return nullptr;
 
   /* Bubble-sort or something equally good!
    * May not be good-enough for presidential candidate interviews, but good-enough for us... */
 
   /* Bubble-sort or something equally good!
    * May not be good-enough for presidential candidate interviews, but good-enough for us... */
-  hb_stable_sort (&glyphs[0], num_glyphs, OT::GlyphID::cmp, &substitutes[0]);
+  hb_stable_sort (&glyphs[0], num_glyphs, (int(*)(const OT::GlyphID*, const OT::GlyphID *)) OT::GlyphID::cmp, &substitutes[0]);
 
   OT::Supplier<OT::GlyphID> glyphs_supplier      (glyphs, num_glyphs);
   OT::Supplier<OT::GlyphID> substitutes_supplier (substitutes, num_glyphs);
 
   OT::Supplier<OT::GlyphID> glyphs_supplier      (glyphs, num_glyphs);
   OT::Supplier<OT::GlyphID> substitutes_supplier (substitutes, num_glyphs);
@@ -94,7 +94,7 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS
   c.end_serialize ();
   /* TODO sanitize the results? */
 
   c.end_serialize ();
   /* TODO sanitize the results? */
 
-  return ret ? c.copy<OT::SubstLookup> () : NULL;
+  return ret ? c.copy<OT::SubstLookup> () : nullptr;
 }
 
 static OT::SubstLookup *
 }
 
 static OT::SubstLookup *
@@ -126,7 +126,7 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
     first_glyphs_indirection[num_first_glyphs] = first_glyph_idx;
     num_first_glyphs++;
   }
     first_glyphs_indirection[num_first_glyphs] = first_glyph_idx;
     num_first_glyphs++;
   }
-  hb_stable_sort (&first_glyphs[0], num_first_glyphs, OT::GlyphID::cmp, &first_glyphs_indirection[0]);
+  hb_stable_sort (&first_glyphs[0], num_first_glyphs, (int(*)(const OT::GlyphID*, const OT::GlyphID *)) OT::GlyphID::cmp, &first_glyphs_indirection[0]);
 
   /* Now that the first-glyphs are sorted, walk again, populate ligatures. */
   for (unsigned int i = 0; i < num_first_glyphs; i++)
 
   /* Now that the first-glyphs are sorted, walk again, populate ligatures. */
   for (unsigned int i = 0; i < num_first_glyphs; i++)
@@ -153,7 +153,7 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
   }
 
   if (!num_ligatures)
   }
 
   if (!num_ligatures)
-    return NULL;
+    return nullptr;
 
   OT::Supplier<OT::GlyphID>   first_glyphs_supplier                      (first_glyphs, num_first_glyphs);
   OT::Supplier<unsigned int > ligature_per_first_glyph_count_supplier    (ligature_per_first_glyph_count_list, num_first_glyphs);
 
   OT::Supplier<OT::GlyphID>   first_glyphs_supplier                      (first_glyphs, num_first_glyphs);
   OT::Supplier<unsigned int > ligature_per_first_glyph_count_supplier    (ligature_per_first_glyph_count_list, num_first_glyphs);
@@ -177,7 +177,7 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN
   c.end_serialize ();
   /* TODO sanitize the results? */
 
   c.end_serialize ();
   /* TODO sanitize the results? */
 
-  return ret ? c.copy<OT::SubstLookup> () : NULL;
+  return ret ? c.copy<OT::SubstLookup> () : nullptr;
 }
 
 static OT::SubstLookup *
 }
 
 static OT::SubstLookup *
@@ -237,8 +237,8 @@ arabic_fallback_plan_init_win1256 (arabic_fallback_plan_t *fallback_plan,
     return false;
 
   const Manifest &manifest = reinterpret_cast<const Manifest&> (arabic_win1256_gsub_lookups.manifest);
     return false;
 
   const Manifest &manifest = reinterpret_cast<const Manifest&> (arabic_win1256_gsub_lookups.manifest);
-  ASSERT_STATIC (sizeof (arabic_win1256_gsub_lookups.manifestData) / sizeof (ManifestLookup)
-                <= ARABIC_FALLBACK_MAX_LOOKUPS);
+  static_assert (sizeof (arabic_win1256_gsub_lookups.manifestData) / sizeof (ManifestLookup)
+                <= ARABIC_FALLBACK_MAX_LOOKUPS, "");
   /* TODO sanitize the table? */
 
   unsigned j = 0;
   /* TODO sanitize the table? */
 
   unsigned j = 0;
@@ -271,7 +271,7 @@ arabic_fallback_plan_init_unicode (arabic_fallback_plan_t *fallback_plan,
                                   const hb_ot_shape_plan_t *plan,
                                   hb_font_t *font)
 {
                                   const hb_ot_shape_plan_t *plan,
                                   hb_font_t *font)
 {
-  ASSERT_STATIC (ARRAY_LENGTH_CONST(arabic_fallback_features) <= ARABIC_FALLBACK_MAX_LOOKUPS);
+  static_assert ((ARRAY_LENGTH_CONST(arabic_fallback_features) <= ARABIC_FALLBACK_MAX_LOOKUPS), "");
   unsigned int j = 0;
   for (unsigned int i = 0; i < ARRAY_LENGTH(arabic_fallback_features) ; i++)
   {
   unsigned int j = 0;
   for (unsigned int i = 0; i < ARRAY_LENGTH(arabic_fallback_features) ; i++)
   {
@@ -340,7 +340,7 @@ arabic_fallback_plan_shape (arabic_fallback_plan_t *fallback_plan,
                            hb_font_t *font,
                            hb_buffer_t *buffer)
 {
                            hb_font_t *font,
                            hb_buffer_t *buffer)
 {
-  OT::hb_apply_context_t c (0, font, buffer);
+  OT::hb_ot_apply_context_t c (0, font, buffer);
   for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
     if (fallback_plan->lookup_array[i]) {
       c.set_lookup_mask (fallback_plan->mask_array[i]);
   for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
     if (fallback_plan->lookup_array[i]) {
       c.set_lookup_mask (fallback_plan->mask_array[i]);
index 736c7f7..cd6e405 100644 (file)
@@ -6,10 +6,10 @@
  *
  * on files with these headers:
  *
  *
  * on files with these headers:
  *
- * # ArabicShaping-9.0.0.txt
- * # Date: 2016-02-24, 22:25:00 GMT [RP]
- * # Blocks-9.0.0.txt
- * # Date: 2016-02-05, 23:48:00 GMT [KW]
+ * # ArabicShaping-10.0.0.txt
+ * # Date: 2017-02-16, 00:00:00 GMT [RP, KW]
+ * # Blocks-10.0.0.txt
+ * # Date: 2017-04-12, 17:30:00 GMT [KW]
  * UnicodeData.txt does not have a header.
  */
 
  * UnicodeData.txt does not have a header.
  */
 
@@ -72,7 +72,10 @@ 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,
   /* 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,
-  /* 0860 */ 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,
+
+  /* Syriac Supplement */
+
+  /* 0860 */ D,U,D,D,D,D,U,R,D,R,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
   /* 0880 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
 
   /* Arabic Extended-A */
   /* 0880 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
 
   /* Arabic Extended-A */
@@ -130,7 +133,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,
 
   /* 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,
 
-}; /* Table items: 1214; occupancy: 54% */
+}; /* Table items: 1214; occupancy: 55% */
 
 
 static unsigned int
 
 
 static unsigned int
@@ -139,28 +142,28 @@ joining_type (hb_codepoint_t u)
   switch (u >> 12)
   {
     case 0x0u:
   switch (u >> 12)
   {
     case 0x0u:
-      if (hb_in_range (u, 0x0600u, 0x08E2u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0600u, 0x08E2u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
       break;
 
     case 0x1u:
       break;
 
     case 0x1u:
-      if (hb_in_range (u, 0x1806u, 0x18AAu)) return joining_table[u - 0x1806u + joining_offset_0x1806u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1806u, 0x18AAu)) return joining_table[u - 0x1806u + joining_offset_0x1806u];
       break;
 
     case 0x2u:
       break;
 
     case 0x2u:
-      if (hb_in_range (u, 0x200Cu, 0x2069u)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
+      if (hb_in_range<hb_codepoint_t> (u, 0x200Cu, 0x2069u)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
       break;
 
     case 0xAu:
       break;
 
     case 0xAu:
-      if (hb_in_range (u, 0xA840u, 0xA873u)) return joining_table[u - 0xA840u + joining_offset_0xa840u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xA840u, 0xA873u)) return joining_table[u - 0xA840u + joining_offset_0xa840u];
       break;
 
     case 0x10u:
       break;
 
     case 0x10u:
-      if (hb_in_range (u, 0x10AC0u, 0x10AEFu)) return joining_table[u - 0x10AC0u + joining_offset_0x10ac0u];
-      if (hb_in_range (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10AC0u, 0x10AEFu)) return joining_table[u - 0x10AC0u + joining_offset_0x10ac0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
       break;
 
     case 0x1Eu:
       break;
 
     case 0x1Eu:
-      if (hb_in_range (u, 0x1E900u, 0x1E943u)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1E900u, 0x1E943u)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u];
       break;
 
     default:
       break;
 
     default:
index e70c48f..54c6cdc 100644 (file)
 #define OT_TABLE_END                   }
 #define OT_LABEL_START(Name)           unsigned char Name[
 #define OT_LABEL_END                   ];
 #define OT_TABLE_END                   }
 #define OT_LABEL_START(Name)           unsigned char Name[
 #define OT_LABEL_END                   ];
-#define OT_BYTE(u8)                    +1/*byte*/
-#define OT_USHORT(u16)                 +2/*bytes*/
+#define OT_UINT8(u8)                   +1/*byte*/
+#define OT_UINT16(u16)                 +2/*bytes*/
 #else
 #undef  OT_MEASURE
 #define OT_TABLE_START                 TABLE_NAME = {
 #define OT_TABLE_END                   };
 #define OT_LABEL_START(Name)           {
 #define OT_LABEL_END                   },
 #else
 #undef  OT_MEASURE
 #define OT_TABLE_START                 TABLE_NAME = {
 #define OT_TABLE_END                   };
 #define OT_LABEL_START(Name)           {
 #define OT_LABEL_END                   },
-#define OT_BYTE(u8)                    (u8),
-#define OT_USHORT(u16)                 (unsigned char)((u16)>>8), (unsigned char)((u16)&0xFFu),
+#define OT_UINT8(u8)                   (u8),
+#define OT_UINT16(u16)                 (unsigned char)((u16)>>8), (unsigned char)((u16)&0xFFu),
 #define OT_COUNT(Name, ItemSize)       ((unsigned int) sizeof(((struct TABLE_NAME*)0)->Name) \
                                         / (unsigned int)(ItemSize) \
                                         /* OT_ASSERT it's divisible (and positive). */)
 #define OT_COUNT(Name, ItemSize)       ((unsigned int) sizeof(((struct TABLE_NAME*)0)->Name) \
                                         / (unsigned int)(ItemSize) \
                                         /* OT_ASSERT it's divisible (and positive). */)
  */
 
 #define OT_TAG(a,b,c,d) \
  */
 
 #define OT_TAG(a,b,c,d) \
-       OT_BYTE(a) OT_BYTE(b) OT_BYTE(c) OT_BYTE(d)
+       OT_UINT8(a) OT_UINT8(b) OT_UINT8(c) OT_UINT8(d)
 
 #define OT_OFFSET(From, To) /* Offset from From to To in bytes */ \
 
 #define OT_OFFSET(From, To) /* Offset from From to To in bytes */ \
-       OT_USHORT(OT_DISTANCE(From, To))
+       OT_UINT16(OT_DISTANCE(From, To))
 
 #define OT_GLYPHID /* GlyphID */ \
 
 #define OT_GLYPHID /* GlyphID */ \
-       OT_USHORT
+       OT_UINT16
 
 #define OT_UARRAY(Name, Items) \
        OT_LABEL_START(Name) \
 
 #define OT_UARRAY(Name, Items) \
        OT_LABEL_START(Name) \
-       OT_USHORT(OT_COUNT(Name##Data, 2)) \
+       OT_UINT16(OT_COUNT(Name##Data, 2)) \
        OT_LABEL(Name##Data) \
        Items \
        OT_LABEL_END
 
 #define OT_UHEADLESSARRAY(Name, Items) \
        OT_LABEL_START(Name) \
        OT_LABEL(Name##Data) \
        Items \
        OT_LABEL_END
 
 #define OT_UHEADLESSARRAY(Name, Items) \
        OT_LABEL_START(Name) \
-       OT_USHORT(OT_COUNT(Name##Data, 2) + 1) \
+       OT_UINT16(OT_COUNT(Name##Data, 2) + 1) \
        OT_LABEL(Name##Data) \
        Items \
        OT_LABEL_END
        OT_LABEL(Name##Data) \
        Items \
        OT_LABEL_END
 
 #define OT_LOOKUP(Name, LookupType, LookupFlag, SubLookupOffsets) \
        OT_LABEL_START(Name) \
 
 #define OT_LOOKUP(Name, LookupType, LookupFlag, SubLookupOffsets) \
        OT_LABEL_START(Name) \
-       OT_USHORT(LookupType) \
-       OT_USHORT(LookupFlag) \
+       OT_UINT16(LookupType) \
+       OT_UINT16(LookupFlag) \
        OT_LABEL_END \
        OT_UARRAY(Name##SubLookupOffsetsArray, OT_LIST(SubLookupOffsets))
 
 #define OT_SUBLOOKUP(Name, SubFormat, Items) \
        OT_LABEL_START(Name) \
        OT_LABEL_END \
        OT_UARRAY(Name##SubLookupOffsetsArray, OT_LIST(SubLookupOffsets))
 
 #define OT_SUBLOOKUP(Name, SubFormat, Items) \
        OT_LABEL_START(Name) \
-       OT_USHORT(SubFormat) \
+       OT_UINT16(SubFormat) \
        Items
 
 #define OT_COVERAGE1(Name, Items) \
        OT_LABEL_START(Name) \
        Items
 
 #define OT_COVERAGE1(Name, Items) \
        OT_LABEL_START(Name) \
-       OT_USHORT(1) \
+       OT_UINT16(1) \
        OT_LABEL_END \
        OT_UARRAY(Name##Glyphs, OT_LIST(Items))
 
        OT_LABEL_END \
        OT_UARRAY(Name##Glyphs, OT_LIST(Items))
 
 /* Table manifest. */
 #define MANIFEST(Items) \
        OT_LABEL_START(manifest) \
 /* Table manifest. */
 #define MANIFEST(Items) \
        OT_LABEL_START(manifest) \
-       OT_USHORT(OT_COUNT(manifestData, 6)) \
+       OT_UINT16(OT_COUNT(manifestData, 6)) \
        OT_LABEL(manifestData) \
        Items \
        OT_LABEL_END
        OT_LABEL(manifestData) \
        Items \
        OT_LABEL_END
@@ -304,8 +304,8 @@ OT_TABLE_END
 #undef OT_TABLE_END
 #undef OT_LABEL_START
 #undef OT_LABEL_END
 #undef OT_TABLE_END
 #undef OT_LABEL_START
 #undef OT_LABEL_END
-#undef OT_BYTE
-#undef OT_USHORT
+#undef OT_UINT8
+#undef OT_UINT16
 #undef OT_DISTANCE
 #undef OT_COUNT
 
 #undef OT_DISTANCE
 #undef OT_COUNT
 
index 57ffc1d..47961bf 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
+#include "hb-private.hh"
+#include "hb-debug.hh"
 #include "hb-ot-shape-complex-arabic-private.hh"
 #include "hb-ot-shape-private.hh"
 
 
 #include "hb-ot-shape-complex-arabic-private.hh"
 #include "hb-ot-shape-private.hh"
 
 
-#ifndef HB_DEBUG_ARABIC
-#define HB_DEBUG_ARABIC (HB_DEBUG+0)
-#endif
-
-
 /* buffer var allocations */
 #define arabic_shaping_action() complex_var_u8_0() /* arabic shaping action */
 
 #define HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH HB_BUFFER_SCRATCH_FLAG_COMPLEX0
 
 /* See:
 /* buffer var allocations */
 #define arabic_shaping_action() complex_var_u8_0() /* arabic shaping action */
 
 #define HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH HB_BUFFER_SCRATCH_FLAG_COMPLEX0
 
 /* See:
- * https://github.com/behdad/harfbuzz/commit/6e6f82b6f3dde0fc6c3c7d991d9ec6cfff57823d#commitcomment-14248516 */
+ * https://github.com/harfbuzz/harfbuzz/commit/6e6f82b6f3dde0fc6c3c7d991d9ec6cfff57823d#commitcomment-14248516 */
 #define HB_ARABIC_GENERAL_CATEGORY_IS_WORD(gen_cat) \
 #define HB_ARABIC_GENERAL_CATEGORY_IS_WORD(gen_cat) \
-       (FLAG_SAFE (gen_cat) & \
+       (FLAG_UNSAFE (gen_cat) & \
         (FLAG (HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE) | \
          /*FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) |*/ \
         (FLAG (HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE) | \
          /*FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) |*/ \
@@ -90,7 +87,7 @@ static unsigned int get_joining_type (hb_codepoint_t u, hb_unicode_general_categ
   if (likely (j_type != JOINING_TYPE_X))
     return j_type;
 
   if (likely (j_type != JOINING_TYPE_X))
     return j_type;
 
-  return (FLAG_SAFE(gen_cat) &
+  return (FLAG_UNSAFE(gen_cat) &
          (FLAG(HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) |
           FLAG(HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) |
           FLAG(HB_UNICODE_GENERAL_CATEGORY_FORMAT))
          (FLAG(HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) |
           FLAG(HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) |
           FLAG(HB_UNICODE_GENERAL_CATEGORY_FORMAT))
@@ -199,6 +196,9 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
    * work.  However, testing shows that rlig and calt are applied
    * together for Mongolian in Uniscribe.  As such, we only add a
    * pause for Arabic, not other scripts.
    * work.  However, testing shows that rlig and calt are applied
    * together for Mongolian in Uniscribe.  As such, we only add a
    * pause for Arabic, not other scripts.
+   *
+   * A pause after calt is required to make KFGQPC Uthmanic Script HAFS
+   * work correctly.  See https://github.com/harfbuzz/harfbuzz/issues/505
    */
 
   map->add_gsub_pause (nuke_joiners);
    */
 
   map->add_gsub_pause (nuke_joiners);
@@ -209,20 +209,23 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
   map->add_global_bool_feature (HB_TAG('c','c','m','p'));
   map->add_global_bool_feature (HB_TAG('l','o','c','l'));
 
   map->add_global_bool_feature (HB_TAG('c','c','m','p'));
   map->add_global_bool_feature (HB_TAG('l','o','c','l'));
 
-  map->add_gsub_pause (NULL);
+  map->add_gsub_pause (nullptr);
 
   for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++)
   {
     bool has_fallback = plan->props.script == HB_SCRIPT_ARABIC && !FEATURE_IS_SYRIAC (arabic_features[i]);
     map->add_feature (arabic_features[i], 1, has_fallback ? F_HAS_FALLBACK : F_NONE);
 
   for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++)
   {
     bool has_fallback = plan->props.script == HB_SCRIPT_ARABIC && !FEATURE_IS_SYRIAC (arabic_features[i]);
     map->add_feature (arabic_features[i], 1, has_fallback ? F_HAS_FALLBACK : F_NONE);
-    map->add_gsub_pause (NULL);
+    map->add_gsub_pause (nullptr);
   }
 
   map->add_feature (HB_TAG('r','l','i','g'), 1, F_GLOBAL|F_HAS_FALLBACK);
   if (plan->props.script == HB_SCRIPT_ARABIC)
     map->add_gsub_pause (arabic_fallback_shape);
 
   }
 
   map->add_feature (HB_TAG('r','l','i','g'), 1, F_GLOBAL|F_HAS_FALLBACK);
   if (plan->props.script == HB_SCRIPT_ARABIC)
     map->add_gsub_pause (arabic_fallback_shape);
 
+  /* No pause after rclt.  See 98460779bae19e4d64d29461ff154b3527bf8420. */
+  map->add_global_bool_feature (HB_TAG('r','c','l','t'));
   map->add_global_bool_feature (HB_TAG('c','a','l','t'));
   map->add_global_bool_feature (HB_TAG('c','a','l','t'));
+  map->add_gsub_pause (nullptr);
 
   /* The spec includes 'cswh'.  Earlier versions of Windows
    * used to enable this by default, but testing suggests
 
   /* The spec includes 'cswh'.  Earlier versions of Windows
    * used to enable this by default, but testing suggests
@@ -232,7 +235,6 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
    * Note that IranNastaliq uses this feature extensively
    * to fixup broken glyph sequences.  Oh well...
    * Test case: U+0643,U+0640,U+0631. */
    * Note that IranNastaliq uses this feature extensively
    * to fixup broken glyph sequences.  Oh well...
    * Test case: U+0643,U+0640,U+0631. */
-  //map->add_gsub_pause (NULL);
   //map->add_global_bool_feature (HB_TAG('c','s','w','h'));
   map->add_global_bool_feature (HB_TAG('m','s','e','t'));
 }
   //map->add_global_bool_feature (HB_TAG('c','s','w','h'));
   map->add_global_bool_feature (HB_TAG('m','s','e','t'));
 }
@@ -260,7 +262,7 @@ data_create_arabic (const hb_ot_shape_plan_t *plan)
 {
   arabic_shape_plan_t *arabic_plan = (arabic_shape_plan_t *) calloc (1, sizeof (arabic_shape_plan_t));
   if (unlikely (!arabic_plan))
 {
   arabic_shape_plan_t *arabic_plan = (arabic_shape_plan_t *) calloc (1, sizeof (arabic_shape_plan_t));
   if (unlikely (!arabic_plan))
-    return NULL;
+    return nullptr;
 
   arabic_plan->do_fallback = plan->props.script == HB_SCRIPT_ARABIC;
   arabic_plan->has_stch = !!plan->map.get_1_mask (HB_TAG ('s','t','c','h'));
 
   arabic_plan->do_fallback = plan->props.script == HB_SCRIPT_ARABIC;
   arabic_plan->has_stch = !!plan->map.get_1_mask (HB_TAG ('s','t','c','h'));
@@ -316,7 +318,10 @@ 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)
     const arabic_state_table_entry *entry = &arabic_state_table[state][this_type];
 
     if (entry->prev_action != NONE && prev != (unsigned int) -1)
+    {
       info[prev].arabic_shaping_action() = entry->prev_action;
       info[prev].arabic_shaping_action() = entry->prev_action;
+      buffer->unsafe_to_break (prev, i + 1);
+    }
 
     info[i].arabic_shaping_action() = entry->curr_action;
 
 
     info[i].arabic_shaping_action() = entry->curr_action;
 
@@ -345,7 +350,7 @@ mongolian_variation_selectors (hb_buffer_t *buffer)
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 1; i < count; i++)
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 1; i < count; i++)
-    if (unlikely (hb_in_range (info[i].codepoint, 0x180Bu, 0x180Du)))
+    if (unlikely (hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x180Bu, 0x180Du)))
       info[i].arabic_shaping_action() = info[i - 1].arabic_shaping_action();
 }
 
       info[i].arabic_shaping_action() = info[i - 1].arabic_shaping_action();
 }
 
@@ -404,7 +409,7 @@ retry:
   {
     /* This sucks.  We need a font to build the fallback plan... */
     fallback_plan = arabic_fallback_plan_create (plan, font);
   {
     /* This sucks.  We need a font to build the fallback plan... */
     fallback_plan = arabic_fallback_plan_create (plan, font);
-    if (unlikely (!hb_atomic_ptr_cmpexch (&(const_cast<arabic_shape_plan_t *> (arabic_plan))->fallback_plan, NULL, fallback_plan))) {
+    if (unlikely (!hb_atomic_ptr_cmpexch (&(const_cast<arabic_shape_plan_t *> (arabic_plan))->fallback_plan, nullptr, fallback_plan))) {
       arabic_fallback_plan_destroy (fallback_plan);
       goto retry;
     }
       arabic_fallback_plan_destroy (fallback_plan);
       goto retry;
     }
@@ -524,11 +529,11 @@ apply_stch (const hb_ot_shape_plan_t *plan,
       }
       i++; // Don't touch i again.
 
       }
       i++; // Don't touch i again.
 
-      DEBUG_MSG (ARABIC, NULL, "%s stretch at (%d,%d,%d)",
+      DEBUG_MSG (ARABIC, nullptr, "%s stretch at (%d,%d,%d)",
                 step == MEASURE ? "measuring" : "cutting", context, start, end);
                 step == MEASURE ? "measuring" : "cutting", context, start, end);
-      DEBUG_MSG (ARABIC, NULL, "rest of word:    count=%d width %d", start - context, w_total);
-      DEBUG_MSG (ARABIC, NULL, "fixed tiles:     count=%d width=%d", n_fixed, w_fixed);
-      DEBUG_MSG (ARABIC, NULL, "repeating tiles: count=%d width=%d", n_repeating, w_repeating);
+      DEBUG_MSG (ARABIC, nullptr, "rest of word:    count=%d width %d", start - context, w_total);
+      DEBUG_MSG (ARABIC, nullptr, "fixed tiles:     count=%d width=%d", n_fixed, w_fixed);
+      DEBUG_MSG (ARABIC, nullptr, "repeating tiles: count=%d width=%d", n_repeating, w_repeating);
 
       /* Number of additional times to repeat each repeating tile. */
       int n_copies = 0;
 
       /* Number of additional times to repeat each repeating tile. */
       int n_copies = 0;
@@ -551,10 +556,11 @@ apply_stch (const hb_ot_shape_plan_t *plan,
       if (step == MEASURE)
       {
        extra_glyphs_needed += n_copies * n_repeating;
       if (step == MEASURE)
       {
        extra_glyphs_needed += n_copies * n_repeating;
-       DEBUG_MSG (ARABIC, NULL, "will add extra %d copies of repeating tiles", n_copies);
+       DEBUG_MSG (ARABIC, nullptr, "will add extra %d copies of repeating tiles", n_copies);
       }
       else
       {
       }
       else
       {
+       buffer->unsafe_to_break (context, end);
        hb_position_t x_offset = 0;
        for (unsigned int k = end; k > start; k--)
        {
        hb_position_t x_offset = 0;
        for (unsigned int k = end; k > start; k--)
        {
@@ -564,7 +570,7 @@ apply_stch (const hb_ot_shape_plan_t *plan,
          if (info[k - 1].arabic_shaping_action() == STCH_REPEATING)
            repeat += n_copies;
 
          if (info[k - 1].arabic_shaping_action() == STCH_REPEATING)
            repeat += n_copies;
 
-         DEBUG_MSG (ARABIC, NULL, "appending %d copies of glyph %d; j=%d",
+         DEBUG_MSG (ARABIC, nullptr, "appending %d copies of glyph %d; j=%d",
                     repeat, info[k - 1].codepoint, j);
          for (unsigned int n = 0; n < repeat; n++)
          {
                     repeat, info[k - 1].codepoint, j);
          for (unsigned int n = 0; n < repeat; n++)
          {
@@ -605,20 +611,111 @@ postprocess_glyphs_arabic (const hb_ot_shape_plan_t *plan,
   HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
 }
 
   HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
 }
 
+/* http://www.unicode.org/reports/tr53/tr53-1.pdf */
+
+static hb_codepoint_t
+modifier_combining_marks[] =
+{
+  0x0654u, /* ARABIC HAMZA ABOVE */
+  0x0655u, /* ARABIC HAMZA BELOW */
+  0x0658u, /* ARABIC MARK NOON GHUNNA */
+  0x06DCu, /* ARABIC SMALL HIGH SEEN */
+  0x06E3u, /* ARABIC SMALL LOW SEEN */
+  0x06E7u, /* ARABIC SMALL HIGH YEH */
+  0x06E8u, /* ARABIC SMALL HIGH NOON */
+  0x08F3u, /* ARABIC SMALL HIGH WAW */
+};
+
+static inline bool
+info_is_mcm (const hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  for (unsigned int i = 0; i < ARRAY_LENGTH (modifier_combining_marks); i++)
+    if (u == modifier_combining_marks[i])
+      return true;
+  return false;
+}
+
+static void
+reorder_marks_arabic (const hb_ot_shape_plan_t *plan,
+                     hb_buffer_t              *buffer,
+                     unsigned int              start,
+                     unsigned int              end)
+{
+  hb_glyph_info_t *info = buffer->info;
+
+  DEBUG_MSG (ARABIC, buffer, "Reordering marks from %d to %d", start, end);
+
+  unsigned int i = start;
+  for (unsigned int cc = 220; cc <= 230; cc += 10)
+  {
+    DEBUG_MSG (ARABIC, buffer, "Looking for %d's starting at %d", cc, i);
+    while (i < end && info_cc(info[i]) < cc)
+      i++;
+    DEBUG_MSG (ARABIC, buffer, "Looking for %d's stopped at %d", cc, i);
+
+    if (i == end)
+      break;
+
+    if (info_cc(info[i]) > cc)
+      continue;
+
+    unsigned int j = i;
+    while (j < end && info_cc(info[j]) == cc && info_is_mcm (info[j]))
+      j++;
+
+    if (i == j)
+      continue;
+
+    DEBUG_MSG (ARABIC, buffer, "Found %d's from %d to %d", cc, i, j);
+
+    /* Shift it! */
+    DEBUG_MSG (ARABIC, buffer, "Shifting %d's: %d %d", cc, i, j);
+    hb_glyph_info_t temp[HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS];
+    assert (j - i <= ARRAY_LENGTH (temp));
+    buffer->merge_clusters (start, j);
+    memmove (temp, &info[i], (j - i) * sizeof (hb_glyph_info_t));
+    memmove (&info[start + j - i], &info[start], (i - start) * sizeof (hb_glyph_info_t));
+    memmove (&info[start], temp, (j - i) * sizeof (hb_glyph_info_t));
+
+    /* Renumber CC such that the reordered sequence is still sorted.
+     * 22 and 26 are chosen because they are smaller than all Arabic categories,
+     * and are folded back to 220/230 respectively during fallback mark positioning.
+     *
+     * We do this because the CGJ-handling logic in the normalizer relies on
+     * mark sequences having an increasing order even after this reordering.
+     * https://github.com/harfbuzz/harfbuzz/issues/554
+     * This, however, does break some obscure sequences, where the normalizer
+     * might compose a sequence that it should not.  For example, in the seequence
+     * ALEF, HAMZAH, MADDAH, we should NOT try to compose ALEF+MADDAH, but with this
+     * renumbering, we will.
+     */
+    unsigned int new_start = start + j - i;
+    unsigned int new_cc = cc == 220 ? HB_MODIFIED_COMBINING_CLASS_CCC22 : HB_MODIFIED_COMBINING_CLASS_CCC26;
+    while (start < new_start)
+    {
+      _hb_glyph_info_set_modified_combining_class (&info[start], new_cc);
+      start++;
+    }
+
+    i = j;
+  }
+}
+
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
 {
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
 {
-  "arabic",
   collect_features_arabic,
   collect_features_arabic,
-  NULL, /* override_features */
+  nullptr, /* override_features */
   data_create_arabic,
   data_destroy_arabic,
   data_create_arabic,
   data_destroy_arabic,
-  NULL, /* preprocess_text */
+  nullptr, /* preprocess_text */
   postprocess_glyphs_arabic,
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   postprocess_glyphs_arabic,
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
-  NULL, /* decompose */
-  NULL, /* compose */
+  nullptr, /* decompose */
+  nullptr, /* compose */
   setup_masks_arabic,
   setup_masks_arabic,
-  NULL, /* disable_otl */
+  nullptr, /* disable_otl */
+  reorder_marks_arabic,
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
index 42830ab..68a62a1 100644 (file)
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
 {
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
 {
-  "default",
-  NULL, /* collect_features */
-  NULL, /* override_features */
-  NULL, /* data_create */
-  NULL, /* data_destroy */
-  NULL, /* preprocess_text */
-  NULL, /* postprocess_glyphs */
+  nullptr, /* collect_features */
+  nullptr, /* override_features */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
-  NULL, /* decompose */
-  NULL, /* compose */
-  NULL, /* setup_masks */
-  NULL, /* disable_otl */
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  nullptr, /* setup_masks */
+  nullptr, /* disable_otl */
+  nullptr, /* reorder_marks */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
index af50565..7508c22 100644 (file)
@@ -80,7 +80,7 @@ data_create_hangul (const hb_ot_shape_plan_t *plan)
 {
   hangul_shape_plan_t *hangul_plan = (hangul_shape_plan_t *) calloc (1, sizeof (hangul_shape_plan_t));
   if (unlikely (!hangul_plan))
 {
   hangul_shape_plan_t *hangul_plan = (hangul_shape_plan_t *) calloc (1, sizeof (hangul_shape_plan_t));
   if (unlikely (!hangul_plan))
-    return NULL;
+    return nullptr;
 
   for (unsigned int i = 0; i < HANGUL_FEATURE_COUNT; i++)
     hangul_plan->mask_array[i] = plan->map.get_1_mask (hangul_features[i]);
 
   for (unsigned int i = 0; i < HANGUL_FEATURE_COUNT; i++)
     hangul_plan->mask_array[i] = plan->map.get_1_mask (hangul_features[i]);
@@ -105,16 +105,16 @@ data_destroy_hangul (void *data)
 #define NCount (VCount * TCount)
 #define SCount (LCount * NCount)
 
 #define NCount (VCount * TCount)
 #define SCount (LCount * NCount)
 
-#define isCombiningL(u) (hb_in_range ((u), LBase, LBase+LCount-1))
-#define isCombiningV(u) (hb_in_range ((u), VBase, VBase+VCount-1))
-#define isCombiningT(u) (hb_in_range ((u), TBase+1, TBase+TCount-1))
-#define isCombinedS(u) (hb_in_range ((u), SBase, SBase+SCount-1))
+#define isCombiningL(u) (hb_in_range<hb_codepoint_t> ((u), LBase, LBase+LCount-1))
+#define isCombiningV(u) (hb_in_range<hb_codepoint_t> ((u), VBase, VBase+VCount-1))
+#define isCombiningT(u) (hb_in_range<hb_codepoint_t> ((u), TBase+1, TBase+TCount-1))
+#define isCombinedS(u) (hb_in_range<hb_codepoint_t> ((u), SBase, SBase+SCount-1))
 
 
-#define isL(u) (hb_in_ranges ((u), 0x1100u, 0x115Fu, 0xA960u, 0xA97Cu))
-#define isV(u) (hb_in_ranges ((u), 0x1160u, 0x11A7u, 0xD7B0u, 0xD7C6u))
-#define isT(u) (hb_in_ranges ((u), 0x11A8u, 0x11FFu, 0xD7CBu, 0xD7FBu))
+#define isL(u) (hb_in_ranges<hb_codepoint_t> ((u), 0x1100u, 0x115Fu, 0xA960u, 0xA97Cu))
+#define isV(u) (hb_in_ranges<hb_codepoint_t> ((u), 0x1160u, 0x11A7u, 0xD7B0u, 0xD7C6u))
+#define isT(u) (hb_in_ranges<hb_codepoint_t> ((u), 0x11A8u, 0x11FFu, 0xD7CBu, 0xD7FBu))
 
 
-#define isHangulTone(u) (hb_in_range ((u), 0x302Eu, 0x302Fu))
+#define isHangulTone(u) (hb_in_range<hb_codepoint_t> ((u), 0x302Eu, 0x302Fu))
 
 /* buffer var allocations */
 #define hangul_shaping_feature() complex_var_u8_0() /* hangul jamo shaping feature */
 
 /* buffer var allocations */
 #define hangul_shaping_feature() complex_var_u8_0() /* hangul jamo shaping feature */
@@ -202,6 +202,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
       if (start < end && end == buffer->out_len)
       {
        /* Tone mark follows a valid syllable; move it in front, unless it's zero width. */
       if (start < end && end == buffer->out_len)
       {
        /* Tone mark follows a valid syllable; move it in front, unless it's zero width. */
+        buffer->unsafe_to_break_from_outbuffer (start, buffer->idx);
        buffer->next_glyph ();
        if (!is_zero_width_char (font, u))
        {
        buffer->next_glyph ();
        if (!is_zero_width_char (font, u))
        {
@@ -258,6 +259,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
          else
            t = 0; /* The next character was not a trailing jamo. */
        }
          else
            t = 0; /* The next character was not a trailing jamo. */
        }
+       buffer->unsafe_to_break (buffer->idx, buffer->idx + (t ? 3 : 2));
 
        /* We've got a syllable <L,V,T?>; see if it can potentially be composed. */
        if (isCombiningL (l) && isCombiningV (v) && (t == 0 || isCombiningT (t)))
 
        /* We've got a syllable <L,V,T?>; see if it can potentially be composed. */
        if (isCombiningL (l) && isCombiningV (v) && (t == 0 || isCombiningT (t)))
@@ -322,6 +324,8 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
          end = start + 1;
          continue;
        }
          end = start + 1;
          continue;
        }
+       else
+         buffer->unsafe_to_break (buffer->idx, buffer->idx + 2); /* Mark unsafe between LV and T. */
       }
 
       /* Otherwise, decompose if font doesn't support <LV> or <LVT>,
       }
 
       /* Otherwise, decompose if font doesn't support <LV> or <LVT>,
@@ -368,6 +372,8 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
            buffer->merge_out_clusters (start, end);
          continue;
        }
            buffer->merge_out_clusters (start, end);
          continue;
        }
+       else if ((!tindex && buffer->idx + 1 < count && isT (buffer->cur(+1).codepoint)))
+         buffer->unsafe_to_break (buffer->idx, buffer->idx + 2); /* Mark unsafe between LV and T. */
       }
 
       if (has_glyph)
       }
 
       if (has_glyph)
@@ -408,18 +414,18 @@ setup_masks_hangul (const hb_ot_shape_plan_t *plan,
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul =
 {
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul =
 {
-  "hangul",
   collect_features_hangul,
   override_features_hangul,
   data_create_hangul,
   data_destroy_hangul,
   preprocess_text_hangul,
   collect_features_hangul,
   override_features_hangul,
   data_create_hangul,
   data_destroy_hangul,
   preprocess_text_hangul,
-  NULL, /* postprocess_glyphs */
+  nullptr, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
   HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
-  NULL, /* decompose */
-  NULL, /* compose */
+  nullptr, /* decompose */
+  nullptr, /* compose */
   setup_masks_hangul,
   setup_masks_hangul,
-  NULL, /* disable_otl */
+  nullptr, /* disable_otl */
+  nullptr, /* reorder_marks */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
   false, /* fallback_position */
 };
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
   false, /* fallback_position */
 };
index 96f2494..34cf28b 100644 (file)
@@ -161,7 +161,7 @@ disable_otl_hebrew (const hb_ot_shape_plan_t *plan)
    * script.  This matches Uniscribe better, and makes fonts like
    * Arial that have GSUB/GPOS/GDEF but no data for Hebrew work.
    * See:
    * script.  This matches Uniscribe better, and makes fonts like
    * Arial that have GSUB/GPOS/GDEF but no data for Hebrew work.
    * See:
-   * https://github.com/behdad/harfbuzz/issues/347#issuecomment-267838368
+   * https://github.com/harfbuzz/harfbuzz/issues/347#issuecomment-267838368
    */
   return plan->map.chosen_script[1] != HB_TAG ('h','e','b','r');
 }
    */
   return plan->map.chosen_script[1] != HB_TAG ('h','e','b','r');
 }
@@ -169,18 +169,18 @@ disable_otl_hebrew (const hb_ot_shape_plan_t *plan)
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew =
 {
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew =
 {
-  "hebrew",
-  NULL, /* collect_features */
-  NULL, /* override_features */
-  NULL, /* data_create */
-  NULL, /* data_destroy */
-  NULL, /* preprocess_text */
-  NULL, /* postprocess_glyphs */
+  nullptr, /* collect_features */
+  nullptr, /* override_features */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
-  NULL, /* decompose */
+  nullptr, /* decompose */
   compose_hebrew,
   compose_hebrew,
-  NULL, /* setup_masks */
+  nullptr, /* setup_masks */
   disable_otl_hebrew,
   disable_otl_hebrew,
+  nullptr, /* reorder_marks */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
index 5a7a265..f3cea22 100644 (file)
 
 #line 36 "hb-ot-shape-complex-indic-machine.hh"
 static const unsigned char _indic_syllable_machine_trans_keys[] = {
 
 #line 36 "hb-ot-shape-complex-indic-machine.hh"
 static const unsigned char _indic_syllable_machine_trans_keys[] = {
-       8u, 8u, 1u, 16u, 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 
-       7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 
-       6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 
-       4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 
-       4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 8u, 13u, 
-       5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 
-       7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 
-       6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 
-       4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 
-       4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 
-       5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 
-       7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 
-       6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 
-       4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 
-       8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
+       8u, 8u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
        5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 
        4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
        5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 
        4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
-       16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 
-       4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 5u, 8u, 4u, 14u, 4u, 14u, 5u, 8u, 
-       5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
-       5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u, 
+       16u, 16u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 
+       4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
+       5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 
        4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
        4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
-       16u, 16u, 8u, 8u, 1u, 18u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 
+       16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 
+       4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 5u, 8u, 
+       5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 
+       5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
+       16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 
+       4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 
+       8u, 8u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 
+       5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 
+       4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
+       16u, 16u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 
+       4u, 13u, 4u, 8u, 4u, 13u, 4u, 13u, 5u, 8u, 5u, 8u, 5u, 7u, 5u, 8u, 
+       5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 
+       8u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 
+       6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 8u, 8u, 1u, 19u, 3u, 17u, 
        3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 
        3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 
-       3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 
-       5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
-       3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-       3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
-       5u, 14u, 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 
-       1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
+       3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 
+       3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 
+       5u, 10u, 3u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 
+       3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 
+       3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 
+       1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-       1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 
        4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 
        3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 
        4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 
-       4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 
-       9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 
-       5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 
-       4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-       3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
-       1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-       1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-       3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u, 
-       3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
+       4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 
+       10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 
+       3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 
+       5u, 10u, 3u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
+       1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
+       3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 
+       1u, 16u, 1u, 16u, 1u, 16u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
        3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
        3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
-       3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 
-       9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 
-       3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-       3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, 
-       4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-       3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
-       3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 
-       1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 17u, 4u, 14u, 
+       3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 
+       5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 3u, 10u, 
+       4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 
+       3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 
+       1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
+       1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
+       3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 13u, 3u, 17u, 4u, 8u, 
        3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
        3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
        3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
        3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 
-       3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 
-       9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 
-       3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-       3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, 
-       4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-       3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
-       3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 
-       1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, 
-       1u, 17u, 4u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 
-       5u, 10u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 3u, 17u, 3u, 17u, 1u, 16u, 
-       3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
-       5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 
-       3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 
-       9u, 10u, 9u, 9u, 5u, 10u, 0
+       3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 
+       10u, 10u, 5u, 10u, 3u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 
+       5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 
+       4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 
+       3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 
+       1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 
+       1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, 1u, 17u, 4u, 13u, 5u, 10u, 10u, 10u, 
+       10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 
+       4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 
+       3u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 
+       0
 };
 
 static const char _indic_syllable_machine_key_spans[] = {
 };
 
 static const char _indic_syllable_machine_key_spans[] = {
-       1, 16, 6, 4, 3, 1, 4, 3, 
-       1, 4, 3, 1, 4, 3, 1, 5, 
-       1, 1, 5, 1, 1, 5, 1, 1, 
-       5, 1, 1, 11, 11, 11, 11, 11, 
-       11, 11, 11, 11, 11, 1, 16, 6, 
-       4, 3, 1, 4, 3, 1, 4, 3, 
-       1, 4, 3, 1, 5, 1, 1, 5, 
-       1, 1, 5, 1, 1, 5, 1, 1, 
-       11, 11, 11, 11, 11, 11, 11, 11, 
-       11, 11, 1, 16, 6, 4, 3, 1, 
-       4, 3, 1, 4, 3, 1, 4, 3, 
-       1, 5, 1, 1, 5, 1, 1, 5, 
-       1, 1, 5, 1, 1, 11, 11, 11, 
-       11, 11, 11, 11, 11, 11, 1, 16, 
-       6, 4, 3, 1, 4, 3, 1, 4, 
+       1, 4, 3, 1, 4, 3, 1, 4, 
        3, 1, 4, 3, 1, 5, 1, 1, 
        5, 1, 1, 5, 1, 1, 5, 1, 
        3, 1, 4, 3, 1, 5, 1, 1, 
        5, 1, 1, 5, 1, 1, 5, 1, 
-       1, 11, 11, 11, 11, 11, 11, 11, 
-       11, 11, 11, 11, 4, 11, 11, 4, 
-       3, 4, 3, 1, 4, 3, 1, 4, 
-       3, 1, 1, 16, 6, 5, 1, 1, 
+       1, 5, 10, 5, 10, 5, 10, 5, 
+       10, 5, 10, 1, 4, 3, 1, 4, 
+       3, 1, 4, 3, 1, 4, 3, 1, 
        5, 1, 1, 5, 1, 1, 5, 1, 
        5, 1, 1, 5, 1, 1, 5, 1, 
-       1, 1, 18, 15, 15, 14, 16, 15, 
+       1, 5, 1, 1, 5, 10, 5, 10, 
+       5, 10, 5, 10, 5, 10, 1, 4, 
+       3, 1, 4, 3, 1, 4, 3, 1, 
+       4, 3, 1, 5, 1, 1, 5, 1, 
+       1, 5, 1, 1, 5, 1, 1, 5, 
+       10, 5, 10, 5, 10, 5, 10, 5, 
+       1, 4, 3, 1, 4, 3, 1, 4, 
+       3, 1, 4, 3, 1, 5, 1, 1, 
+       5, 1, 1, 5, 1, 1, 5, 1, 
+       1, 5, 10, 5, 10, 5, 10, 5, 
+       10, 5, 10, 10, 4, 4, 3, 4, 
+       3, 1, 4, 3, 1, 4, 3, 1, 
+       1, 5, 1, 1, 5, 1, 1, 5, 
+       1, 1, 5, 1, 1, 1, 19, 15, 
        15, 14, 16, 15, 15, 14, 16, 15, 
        15, 14, 16, 15, 15, 14, 16, 15, 
-       15, 14, 16, 15, 15, 14, 10, 10
-       6, 2, 1, 2, 2, 1, 6, 11, 
-       8, 6, 8, 11, 12, 12, 11, 10
-       12, 11, 10, 12, 11, 10, 12, 11
-       10, 12, 16, 11, 15, 15, 16, 16
-       16, 16, 16, 15, 15, 16, 16, 16, 
+       15, 14, 16, 15, 15, 14, 16, 15
+       15, 14, 6, 6, 6, 1, 1, 1, 
+       6, 8, 8, 7, 6, 8, 7, 6
+       8, 7, 6, 8, 7, 6, 8, 7
+       15, 15, 16, 16, 16, 16, 15, 15
+       16, 16, 16, 16, 15, 15, 16, 16, 
        16, 16, 15, 15, 16, 16, 16, 16, 
        16, 16, 15, 15, 16, 16, 16, 16, 
-       16, 15, 15, 16, 16, 16, 16, 16, 
        15, 15, 15, 15, 14, 16, 15, 15, 
        14, 16, 15, 15, 14, 16, 15, 15, 
        15, 15, 15, 15, 14, 16, 15, 15, 
        14, 16, 15, 15, 14, 16, 15, 15, 
-       14, 16, 15, 15, 14, 10, 10, 6, 
-       2, 1, 2, 2, 1, 6, 11, 8, 
-       6, 8, 11, 12, 12, 11, 10, 12, 
-       11, 10, 12, 11, 10, 12, 11, 10, 
-       12, 16, 11, 15, 15, 16, 16, 16, 
-       16, 16, 15, 15, 16, 16, 16, 16, 
-       16, 15, 15, 16, 16, 16, 16, 16, 
-       15, 15, 16, 16, 16, 16, 11, 16, 
+       14, 16, 15, 15, 14, 6, 6, 6, 
+       1, 1, 1, 6, 8, 8, 7, 6, 
+       8, 7, 6, 8, 7, 6, 8, 7, 
+       6, 8, 7, 15, 15, 16, 16, 16, 
+       16, 15, 15, 16, 16, 16, 16, 15, 
+       15, 16, 16, 16, 16, 15, 15, 16, 
+       16, 16, 16, 5, 15, 15, 14, 16, 
        15, 15, 14, 16, 15, 15, 14, 16, 
        15, 15, 14, 16, 15, 15, 14, 16, 
-       15, 15, 14, 16, 15, 15, 14, 16, 
-       15, 15, 14, 10, 10, 6, 2, 1, 
-       2, 2, 1, 6, 11, 8, 6, 8, 
-       11, 12, 12, 11, 10, 12, 11, 10, 
-       12, 11, 10, 12, 11, 10, 12, 16, 
-       11, 15, 15, 16, 16, 16, 16, 16, 
-       15, 15, 16, 16, 16, 16, 16, 15, 
-       15, 16, 16, 16, 16, 16, 15, 15, 
-       16, 16, 16, 16, 16, 11, 15, 11, 
+       15, 15, 14, 16, 15, 15, 14, 6, 
+       6, 6, 1, 1, 1, 6, 8, 8, 
+       7, 6, 8, 7, 6, 8, 7, 6, 
+       8, 7, 6, 8, 7, 15, 15, 16, 
+       16, 16, 16, 15, 15, 16, 16, 16, 
+       16, 15, 15, 16, 16, 16, 16, 15, 
+       15, 16, 16, 16, 16, 10, 15, 5, 
        15, 15, 14, 16, 15, 15, 14, 16, 
        15, 15, 14, 16, 15, 15, 14, 16, 
        15, 15, 14, 16, 15, 15, 14, 16, 
        15, 15, 14, 16, 15, 15, 14, 16, 
-       15, 15, 14, 10, 10, 6, 2, 1, 
-       2, 2, 1, 6, 11, 8, 6, 8, 
-       11, 12, 12, 11, 10, 12, 11, 10, 
-       12, 11, 10, 12, 11, 10, 12, 16, 
-       11, 15, 15, 16, 16, 16, 16, 16, 
-       15, 15, 16, 16, 16, 16, 16, 15, 
-       15, 16, 16, 16, 16, 16, 15, 15, 
-       16, 16, 16, 16, 16, 15, 17, 15, 
-       17, 11, 6, 2, 1, 2, 2, 1, 
-       6, 16, 15, 15, 14, 15, 15, 16, 
-       12, 11, 10, 12, 11, 10, 12, 11, 
-       10, 12, 11, 10, 11, 8, 6, 8, 
-       11, 16, 8, 6, 6, 2, 1, 2, 
-       2, 1, 6
+       15, 15, 14, 6, 6, 6, 1, 1, 
+       1, 6, 8, 8, 7, 6, 8, 7, 
+       6, 8, 7, 6, 8, 7, 6, 8, 
+       7, 15, 15, 16, 16, 16, 16, 15, 
+       15, 16, 16, 16, 16, 15, 15, 16, 
+       16, 16, 16, 15, 15, 16, 16, 16, 
+       16, 15, 17, 15, 17, 10, 6, 1, 
+       1, 1, 6, 16, 8, 7, 6, 8, 
+       7, 6, 8, 7, 6, 8, 7, 6, 
+       8, 6, 6, 1, 1, 1, 6, 16
 };
 
 static const short _indic_syllable_machine_index_offsets[] = {
 };
 
 static const short _indic_syllable_machine_index_offsets[] = {
-       0, 2, 19, 26, 31, 35, 37, 42, 
-       46, 48, 53, 57, 59, 64, 68, 70, 
-       76, 78, 80, 86, 88, 90, 96, 98, 
-       100, 106, 108, 110, 122, 134, 146, 158, 
-       170, 182, 194, 206, 218, 230, 232, 249, 
-       256, 261, 265, 267, 272, 276, 278, 283, 
-       287, 289, 294, 298, 300, 306, 308, 310, 
-       316, 318, 320, 326, 328, 330, 336, 338, 
-       340, 352, 364, 376, 388, 400, 412, 424, 
-       436, 448, 460, 462, 479, 486, 491, 495, 
-       497, 502, 506, 508, 513, 517, 519, 524, 
-       528, 530, 536, 538, 540, 546, 548, 550, 
-       556, 558, 560, 566, 568, 570, 582, 594, 
-       606, 618, 630, 642, 654, 666, 678, 680, 
-       697, 704, 709, 713, 715, 720, 724, 726, 
-       731, 735, 737, 742, 746, 748, 754, 756, 
-       758, 764, 766, 768, 774, 776, 778, 784, 
-       786, 788, 800, 812, 824, 836, 848, 860, 
-       872, 884, 896, 908, 920, 925, 937, 949, 
-       954, 958, 963, 967, 969, 974, 978, 980, 
-       985, 989, 991, 993, 1010, 1017, 1023, 1025, 
-       1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053, 
-       1055, 1057, 1059, 1078, 1094, 1110, 1125, 1142, 
-       1158, 1174, 1189, 1206, 1222, 1238, 1253, 1270, 
-       1286, 1302, 1317, 1334, 1350, 1366, 1381, 1392, 
-       1403, 1410, 1413, 1415, 1418, 1421, 1423, 1430, 
-       1442, 1451, 1458, 1467, 1479, 1492, 1505, 1517, 
-       1528, 1541, 1553, 1564, 1577, 1589, 1600, 1613, 
-       1625, 1636, 1649, 1666, 1678, 1694, 1710, 1727, 
-       1744, 1761, 1778, 1795, 1811, 1827, 1844, 1861, 
-       1878, 1895, 1912, 1928, 1944, 1961, 1978, 1995, 
-       2012, 2029, 2045, 2061, 2078, 2095, 2112, 2129, 
-       2146, 2162, 2178, 2194, 2210, 2225, 2242, 2258, 
-       2274, 2289, 2306, 2322, 2338, 2353, 2370, 2386, 
-       2402, 2417, 2434, 2450, 2466, 2481, 2492, 2503, 
-       2510, 2513, 2515, 2518, 2521, 2523, 2530, 2542, 
-       2551, 2558, 2567, 2579, 2592, 2605, 2617, 2628, 
-       2641, 2653, 2664, 2677, 2689, 2700, 2713, 2725, 
-       2736, 2749, 2766, 2778, 2794, 2810, 2827, 2844, 
-       2861, 2878, 2895, 2911, 2927, 2944, 2961, 2978, 
-       2995, 3012, 3028, 3044, 3061, 3078, 3095, 3112, 
-       3129, 3145, 3161, 3178, 3195, 3212, 3229, 3241, 
-       3258, 3274, 3290, 3305, 3322, 3338, 3354, 3369, 
-       3386, 3402, 3418, 3433, 3450, 3466, 3482, 3497, 
-       3514, 3530, 3546, 3561, 3572, 3583, 3590, 3593, 
-       3595, 3598, 3601, 3603, 3610, 3622, 3631, 3638, 
-       3647, 3659, 3672, 3685, 3697, 3708, 3721, 3733, 
-       3744, 3757, 3769, 3780, 3793, 3805, 3816, 3829, 
-       3846, 3858, 3874, 3890, 3907, 3924, 3941, 3958, 
-       3975, 3991, 4007, 4024, 4041, 4058, 4075, 4092, 
-       4108, 4124, 4141, 4158, 4175, 4192, 4209, 4225, 
-       4241, 4258, 4275, 4292, 4309, 4326, 4338, 4354, 
-       4366, 4382, 4398, 4413, 4430, 4446, 4462, 4477, 
-       4494, 4510, 4526, 4541, 4558, 4574, 4590, 4605, 
-       4622, 4638, 4654, 4669, 4680, 4691, 4698, 4701, 
-       4703, 4706, 4709, 4711, 4718, 4730, 4739, 4746, 
-       4755, 4767, 4780, 4793, 4805, 4816, 4829, 4841, 
-       4852, 4865, 4877, 4888, 4901, 4913, 4924, 4937, 
-       4954, 4966, 4982, 4998, 5015, 5032, 5049, 5066, 
-       5083, 5099, 5115, 5132, 5149, 5166, 5183, 5200, 
-       5216, 5232, 5249, 5266, 5283, 5300, 5317, 5333, 
-       5349, 5366, 5383, 5400, 5417, 5434, 5450, 5468, 
-       5484, 5502, 5514, 5521, 5524, 5526, 5529, 5532, 
-       5534, 5541, 5558, 5574, 5590, 5605, 5621, 5637, 
-       5654, 5667, 5679, 5690, 5703, 5715, 5726, 5739, 
-       5751, 5762, 5775, 5787, 5798, 5810, 5819, 5826, 
-       5835, 5847, 5864, 5873, 5880, 5887, 5890, 5892, 
-       5895, 5898, 5900
+       0, 2, 7, 11, 13, 18, 22, 24, 
+       29, 33, 35, 40, 44, 46, 52, 54, 
+       56, 62, 64, 66, 72, 74, 76, 82, 
+       84, 86, 92, 103, 109, 120, 126, 137, 
+       143, 154, 160, 171, 173, 178, 182, 184, 
+       189, 193, 195, 200, 204, 206, 211, 215, 
+       217, 223, 225, 227, 233, 235, 237, 243, 
+       245, 247, 253, 255, 257, 263, 274, 280, 
+       291, 297, 308, 314, 325, 331, 342, 344, 
+       349, 353, 355, 360, 364, 366, 371, 375, 
+       377, 382, 386, 388, 394, 396, 398, 404, 
+       406, 408, 414, 416, 418, 424, 426, 428, 
+       434, 445, 451, 462, 468, 479, 485, 496, 
+       502, 504, 509, 513, 515, 520, 524, 526, 
+       531, 535, 537, 542, 546, 548, 554, 556, 
+       558, 564, 566, 568, 574, 576, 578, 584, 
+       586, 588, 594, 605, 611, 622, 628, 639, 
+       645, 656, 662, 673, 684, 689, 694, 698, 
+       703, 707, 709, 714, 718, 720, 725, 729, 
+       731, 733, 739, 741, 743, 749, 751, 753, 
+       759, 761, 763, 769, 771, 773, 775, 795, 
+       811, 827, 842, 859, 875, 891, 906, 923, 
+       939, 955, 970, 987, 1003, 1019, 1034, 1051, 
+       1067, 1083, 1098, 1105, 1112, 1119, 1121, 1123, 
+       1125, 1132, 1141, 1150, 1158, 1165, 1174, 1182, 
+       1189, 1198, 1206, 1213, 1222, 1230, 1237, 1246, 
+       1254, 1270, 1286, 1303, 1320, 1337, 1354, 1370, 
+       1386, 1403, 1420, 1437, 1454, 1470, 1486, 1503, 
+       1520, 1537, 1554, 1570, 1586, 1603, 1620, 1637, 
+       1654, 1670, 1686, 1702, 1718, 1733, 1750, 1766, 
+       1782, 1797, 1814, 1830, 1846, 1861, 1878, 1894, 
+       1910, 1925, 1942, 1958, 1974, 1989, 1996, 2003, 
+       2010, 2012, 2014, 2016, 2023, 2032, 2041, 2049, 
+       2056, 2065, 2073, 2080, 2089, 2097, 2104, 2113, 
+       2121, 2128, 2137, 2145, 2161, 2177, 2194, 2211, 
+       2228, 2245, 2261, 2277, 2294, 2311, 2328, 2345, 
+       2361, 2377, 2394, 2411, 2428, 2445, 2461, 2477, 
+       2494, 2511, 2528, 2545, 2551, 2567, 2583, 2598, 
+       2615, 2631, 2647, 2662, 2679, 2695, 2711, 2726, 
+       2743, 2759, 2775, 2790, 2807, 2823, 2839, 2854, 
+       2861, 2868, 2875, 2877, 2879, 2881, 2888, 2897, 
+       2906, 2914, 2921, 2930, 2938, 2945, 2954, 2962, 
+       2969, 2978, 2986, 2993, 3002, 3010, 3026, 3042, 
+       3059, 3076, 3093, 3110, 3126, 3142, 3159, 3176, 
+       3193, 3210, 3226, 3242, 3259, 3276, 3293, 3310, 
+       3326, 3342, 3359, 3376, 3393, 3410, 3421, 3437, 
+       3443, 3459, 3475, 3490, 3507, 3523, 3539, 3554, 
+       3571, 3587, 3603, 3618, 3635, 3651, 3667, 3682, 
+       3699, 3715, 3731, 3746, 3753, 3760, 3767, 3769, 
+       3771, 3773, 3780, 3789, 3798, 3806, 3813, 3822, 
+       3830, 3837, 3846, 3854, 3861, 3870, 3878, 3885, 
+       3894, 3902, 3918, 3934, 3951, 3968, 3985, 4002, 
+       4018, 4034, 4051, 4068, 4085, 4102, 4118, 4134, 
+       4151, 4168, 4185, 4202, 4218, 4234, 4251, 4268, 
+       4285, 4302, 4318, 4336, 4352, 4370, 4381, 4388, 
+       4390, 4392, 4394, 4401, 4418, 4427, 4435, 4442, 
+       4451, 4459, 4466, 4475, 4483, 4490, 4499, 4507, 
+       4514, 4523, 4530, 4537, 4539, 4541, 4543, 4550
 };
 
 static const short _indic_syllable_machine_indicies[] = {
 };
 
 static const short _indic_syllable_machine_indicies[] = {
-       1, 0, 2, 3, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 2, 0, 1, 0, 0, 0, 0, 
-       4, 0, 5, 5, 6, 1, 0, 7, 
-       7, 6, 0, 6, 0, 8, 8, 9, 
-       1, 0, 10, 10, 9, 0, 9, 0, 
-       11, 11, 12, 1, 0, 13, 13, 12, 
-       0, 12, 0, 14, 14, 15, 1, 0, 
-       16, 16, 15, 0, 15, 0, 17, 0, 
-       0, 0, 1, 0, 18, 0, 19, 0, 
-       20, 14, 14, 15, 1, 0, 21, 0, 
-       22, 0, 23, 11, 11, 12, 1, 0, 
-       24, 0, 25, 0, 26, 8, 8, 9, 
-       1, 0, 27, 0, 28, 0, 29, 5, 
-       5, 6, 1, 0, 0, 0, 0, 0, 
-       29, 0, 29, 5, 5, 6, 1, 0, 
-       0, 0, 0, 30, 29, 0, 31, 5, 
-       5, 6, 1, 0, 0, 0, 0, 0, 
-       31, 0, 31, 5, 5, 6, 1, 0, 
-       0, 0, 0, 32, 31, 0, 33, 5, 
-       5, 6, 1, 0, 0, 0, 0, 0, 
-       33, 0, 33, 5, 5, 6, 1, 0, 
-       0, 0, 0, 34, 33, 0, 35, 5, 
-       5, 6, 1, 0, 0, 0, 0, 0, 
-       35, 0, 35, 5, 5, 6, 1, 0, 
-       0, 0, 0, 36, 35, 0, 37, 5, 
-       5, 6, 1, 0, 0, 0, 0, 0, 
-       37, 0, 37, 5, 5, 6, 1, 0, 
-       0, 0, 0, 38, 37, 0, 40, 39, 
-       41, 42, 39, 39, 39, 39, 39, 39, 
-       39, 39, 39, 39, 39, 39, 39, 41, 
-       39, 40, 39, 39, 39, 39, 43, 39, 
-       44, 44, 45, 40, 39, 46, 46, 45, 
-       39, 45, 39, 47, 47, 48, 40, 39, 
-       49, 49, 48, 39, 48, 39, 50, 50, 
-       51, 40, 39, 52, 52, 51, 39, 51, 
-       39, 53, 53, 54, 40, 39, 55, 55, 
-       54, 39, 54, 39, 56, 39, 39, 39, 
-       40, 39, 57, 39, 58, 39, 59, 53, 
-       53, 54, 40, 39, 60, 39, 61, 39, 
-       62, 50, 50, 51, 40, 39, 63, 39, 
-       64, 39, 65, 47, 47, 48, 40, 39, 
-       66, 39, 67, 39, 68, 44, 44, 45, 
-       40, 39, 39, 39, 39, 39, 68, 39, 
-       68, 44, 44, 45, 40, 39, 39, 39, 
-       39, 69, 68, 39, 70, 44, 44, 45, 
-       40, 39, 39, 39, 39, 39, 70, 39, 
-       70, 44, 44, 45, 40, 39, 39, 39, 
-       39, 71, 70, 39, 72, 44, 44, 45, 
-       40, 39, 39, 39, 39, 39, 72, 39, 
-       72, 44, 44, 45, 40, 39, 39, 39, 
-       39, 73, 72, 39, 74, 44, 44, 45, 
-       40, 39, 39, 39, 39, 39, 74, 39, 
-       74, 44, 44, 45, 40, 39, 39, 39, 
-       39, 75, 74, 39, 76, 44, 44, 45, 
-       40, 39, 39, 39, 39, 39, 76, 39, 
-       76, 44, 44, 45, 40, 39, 39, 39, 
-       39, 77, 76, 39, 79, 78, 80, 81, 
-       78, 78, 78, 78, 78, 78, 78, 78, 
-       78, 78, 78, 78, 78, 80, 78, 79, 
-       78, 78, 78, 78, 82, 78, 83, 83, 
-       84, 79, 78, 86, 86, 84, 85, 84, 
-       85, 87, 87, 88, 79, 78, 89, 89, 
-       88, 78, 88, 78, 90, 90, 91, 79, 
-       78, 92, 92, 91, 78, 91, 78, 93, 
-       93, 94, 79, 78, 95, 95, 94, 78, 
-       94, 78, 96, 78, 78, 78, 79, 78, 
-       97, 78, 98, 78, 99, 93, 93, 94, 
-       79, 78, 100, 78, 101, 78, 102, 90, 
-       90, 91, 79, 78, 103, 78, 104, 78, 
-       105, 87, 87, 88, 79, 78, 106, 78, 
-       107, 78, 108, 83, 83, 84, 79, 78, 
-       78, 78, 78, 78, 108, 78, 108, 83, 
-       83, 84, 79, 78, 78, 78, 78, 109, 
-       108, 78, 110, 83, 83, 84, 79, 78, 
-       78, 78, 78, 78, 110, 78, 110, 83, 
-       83, 84, 79, 78, 78, 78, 78, 111, 
-       110, 78, 112, 83, 83, 84, 79, 78, 
-       78, 78, 78, 78, 112, 78, 112, 83, 
-       83, 84, 79, 78, 78, 78, 78, 113, 
-       112, 78, 114, 83, 83, 84, 79, 78, 
-       78, 78, 78, 78, 114, 78, 114, 83, 
-       83, 84, 79, 78, 78, 78, 78, 115, 
-       114, 78, 116, 83, 83, 84, 79, 78, 
-       78, 78, 78, 78, 116, 78, 118, 117, 
-       119, 120, 117, 117, 117, 117, 117, 117, 
-       117, 117, 117, 117, 117, 117, 117, 119, 
-       117, 118, 117, 117, 117, 117, 121, 117, 
-       122, 122, 123, 118, 117, 124, 124, 123, 
-       117, 123, 117, 125, 125, 126, 118, 117, 
-       127, 127, 126, 117, 126, 117, 128, 128, 
-       129, 118, 117, 130, 130, 129, 117, 129, 
-       117, 131, 131, 132, 118, 117, 133, 133, 
-       132, 117, 132, 117, 134, 117, 117, 117, 
-       118, 117, 135, 117, 136, 117, 137, 131, 
-       131, 132, 118, 117, 138, 117, 139, 117, 
-       140, 128, 128, 129, 118, 117, 141, 117, 
-       142, 117, 143, 125, 125, 126, 118, 117, 
-       144, 117, 145, 117, 146, 122, 122, 123, 
-       118, 117, 117, 117, 117, 117, 146, 117, 
-       146, 122, 122, 123, 118, 117, 117, 117, 
-       117, 147, 146, 117, 148, 122, 122, 123, 
-       118, 117, 117, 117, 117, 117, 148, 117, 
-       148, 122, 122, 123, 118, 117, 117, 117, 
-       117, 149, 148, 117, 150, 122, 122, 123, 
-       118, 117, 117, 117, 117, 117, 150, 117, 
-       150, 122, 122, 123, 118, 117, 117, 117, 
-       117, 151, 150, 117, 152, 122, 122, 123, 
-       118, 117, 117, 117, 117, 117, 152, 117, 
-       152, 122, 122, 123, 118, 117, 117, 117, 
-       117, 153, 152, 117, 154, 122, 122, 123, 
-       118, 117, 117, 117, 117, 117, 154, 117, 
-       154, 122, 122, 123, 118, 117, 117, 117, 
-       117, 155, 154, 117, 116, 83, 83, 84, 
-       79, 78, 78, 78, 78, 156, 116, 78, 
-       86, 86, 84, 1, 0, 114, 83, 83, 
-       84, 157, 0, 0, 0, 0, 0, 114, 
-       0, 114, 83, 83, 84, 157, 0, 0, 
-       0, 0, 158, 114, 0, 159, 159, 160, 
-       1, 0, 7, 7, 160, 0, 161, 161, 
-       162, 157, 0, 163, 163, 162, 0, 162, 
-       0, 164, 164, 165, 157, 0, 166, 166, 
-       165, 0, 165, 0, 167, 167, 168, 157, 
-       0, 169, 169, 168, 0, 168, 0, 157, 
-       0, 170, 171, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       170, 0, 157, 0, 0, 0, 0, 172, 
-       0, 173, 0, 0, 0, 157, 0, 174, 
-       0, 175, 0, 176, 167, 167, 168, 157, 
-       0, 177, 0, 178, 0, 179, 164, 164, 
-       165, 157, 0, 180, 0, 181, 0, 182, 
-       161, 161, 162, 157, 0, 183, 0, 184, 
-       0, 186, 185, 188, 189, 190, 191, 192, 
-       193, 84, 79, 194, 195, 196, 196, 156, 
-       197, 198, 199, 200, 201, 187, 203, 204, 
-       205, 206, 6, 1, 207, 208, 202, 202, 
-       38, 209, 202, 202, 210, 202, 211, 204, 
-       212, 212, 6, 1, 207, 208, 202, 202, 
-       202, 209, 202, 202, 210, 202, 204, 212, 
-       212, 6, 1, 207, 208, 202, 202, 202, 
-       209, 202, 202, 210, 202, 213, 202, 202, 
-       202, 19, 214, 202, 1, 207, 208, 202, 
-       202, 202, 215, 202, 213, 202, 216, 217, 
-       218, 219, 6, 1, 207, 208, 202, 202, 
-       36, 220, 202, 202, 210, 202, 221, 217, 
-       222, 222, 6, 1, 207, 208, 202, 202, 
-       202, 220, 202, 202, 210, 202, 217, 222, 
-       222, 6, 1, 207, 208, 202, 202, 202, 
-       220, 202, 202, 210, 202, 223, 202, 202, 
-       202, 19, 224, 202, 1, 207, 208, 202, 
-       202, 202, 215, 202, 223, 202, 225, 226, 
-       227, 228, 6, 1, 207, 208, 202, 202, 
-       34, 229, 202, 202, 210, 202, 230, 226, 
-       231, 231, 6, 1, 207, 208, 202, 202, 
-       202, 229, 202, 202, 210, 202, 226, 231, 
-       231, 6, 1, 207, 208, 202, 202, 202, 
-       229, 202, 202, 210, 202, 232, 202, 202, 
-       202, 19, 233, 202, 1, 207, 208, 202, 
-       202, 202, 215, 202, 232, 202, 234, 235, 
-       236, 237, 6, 1, 207, 208, 202, 202, 
-       32, 238, 202, 202, 210, 202, 239, 235, 
-       240, 240, 6, 1, 207, 208, 202, 202, 
-       202, 238, 202, 202, 210, 202, 235, 240, 
-       240, 6, 1, 207, 208, 202, 202, 202, 
-       238, 202, 202, 210, 202, 241, 202, 202, 
-       202, 19, 242, 202, 1, 207, 208, 202, 
-       202, 202, 215, 202, 241, 202, 243, 244, 
-       245, 246, 6, 1, 207, 208, 202, 202, 
-       30, 247, 202, 202, 210, 202, 248, 244, 
-       249, 249, 6, 1, 207, 208, 202, 202, 
-       202, 247, 202, 202, 210, 202, 244, 249, 
-       249, 6, 1, 207, 208, 202, 202, 202, 
-       247, 202, 202, 210, 202, 19, 250, 202, 
-       1, 207, 208, 202, 202, 202, 215, 202, 
-       251, 251, 202, 1, 207, 208, 202, 202, 
-       202, 215, 202, 252, 202, 202, 253, 207, 
-       208, 202, 207, 208, 202, 254, 202, 207, 
-       255, 202, 207, 256, 202, 207, 202, 252, 
-       202, 202, 202, 207, 208, 202, 257, 202, 
-       258, 259, 202, 1, 207, 208, 202, 202, 
-       4, 202, 3, 202, 251, 251, 202, 1, 
-       207, 208, 202, 251, 251, 202, 1, 207, 
-       208, 202, 257, 202, 251, 251, 202, 1, 
-       207, 208, 202, 257, 202, 258, 251, 202, 
-       1, 207, 208, 202, 202, 4, 202, 19, 
-       202, 260, 260, 6, 1, 207, 208, 202, 
-       202, 202, 215, 202, 261, 28, 262, 263, 
-       9, 1, 207, 208, 202, 202, 202, 215, 
-       202, 28, 262, 263, 9, 1, 207, 208, 
-       202, 202, 202, 215, 202, 262, 262, 9, 
-       1, 207, 208, 202, 202, 202, 215, 202, 
-       264, 25, 265, 266, 12, 1, 207, 208, 
-       202, 202, 202, 215, 202, 25, 265, 266, 
-       12, 1, 207, 208, 202, 202, 202, 215, 
-       202, 265, 265, 12, 1, 207, 208, 202, 
-       202, 202, 215, 202, 267, 22, 268, 269, 
-       15, 1, 207, 208, 202, 202, 202, 215, 
-       202, 22, 268, 269, 15, 1, 207, 208, 
-       202, 202, 202, 215, 202, 268, 268, 15, 
-       1, 207, 208, 202, 202, 202, 215, 202, 
-       270, 19, 251, 271, 202, 1, 207, 208, 
-       202, 202, 202, 215, 202, 19, 251, 271, 
-       202, 1, 207, 208, 202, 202, 202, 215, 
-       202, 251, 272, 202, 1, 207, 208, 202, 
-       202, 202, 215, 202, 19, 202, 251, 251, 
-       202, 1, 207, 208, 202, 202, 202, 215, 
-       202, 2, 3, 202, 202, 19, 250, 202, 
-       1, 207, 208, 202, 202, 202, 215, 202, 
-       2, 202, 244, 249, 249, 6, 1, 207, 
-       208, 202, 202, 202, 247, 202, 243, 244, 
-       249, 249, 6, 1, 207, 208, 202, 202, 
-       202, 247, 202, 202, 210, 202, 243, 244, 
-       245, 249, 6, 1, 207, 208, 202, 202, 
-       30, 247, 202, 202, 210, 202, 241, 202, 
-       273, 202, 260, 260, 6, 1, 207, 208, 
-       202, 202, 202, 215, 202, 241, 202, 241, 
-       202, 202, 202, 251, 251, 202, 1, 207, 
-       208, 202, 202, 202, 215, 202, 241, 202, 
-       241, 202, 202, 202, 251, 274, 202, 1, 
-       207, 208, 202, 202, 202, 215, 202, 241, 
-       202, 241, 202, 273, 202, 251, 251, 202, 
-       1, 207, 208, 202, 202, 202, 215, 202, 
-       241, 202, 241, 3, 202, 202, 19, 242, 
-       202, 1, 207, 208, 202, 202, 202, 215, 
-       202, 241, 202, 234, 235, 240, 240, 6, 
-       1, 207, 208, 202, 202, 202, 238, 202, 
-       202, 210, 202, 234, 235, 236, 240, 6, 
-       1, 207, 208, 202, 202, 32, 238, 202, 
-       202, 210, 202, 232, 202, 275, 202, 260, 
-       260, 6, 1, 207, 208, 202, 202, 202, 
-       215, 202, 232, 202, 232, 202, 202, 202, 
-       251, 251, 202, 1, 207, 208, 202, 202, 
-       202, 215, 202, 232, 202, 232, 202, 202, 
-       202, 251, 276, 202, 1, 207, 208, 202, 
-       202, 202, 215, 202, 232, 202, 232, 202, 
-       275, 202, 251, 251, 202, 1, 207, 208, 
-       202, 202, 202, 215, 202, 232, 202, 232, 
-       3, 202, 202, 19, 233, 202, 1, 207, 
-       208, 202, 202, 202, 215, 202, 232, 202, 
-       225, 226, 231, 231, 6, 1, 207, 208, 
-       202, 202, 202, 229, 202, 202, 210, 202, 
-       225, 226, 227, 231, 6, 1, 207, 208, 
-       202, 202, 34, 229, 202, 202, 210, 202, 
-       223, 202, 277, 202, 260, 260, 6, 1, 
-       207, 208, 202, 202, 202, 215, 202, 223, 
-       202, 223, 202, 202, 202, 251, 251, 202, 
-       1, 207, 208, 202, 202, 202, 215, 202, 
-       223, 202, 223, 202, 202, 202, 251, 278, 
-       202, 1, 207, 208, 202, 202, 202, 215, 
-       202, 223, 202, 223, 202, 277, 202, 251, 
-       251, 202, 1, 207, 208, 202, 202, 202, 
-       215, 202, 223, 202, 223, 3, 202, 202, 
-       19, 224, 202, 1, 207, 208, 202, 202, 
-       202, 215, 202, 223, 202, 216, 217, 222, 
-       222, 6, 1, 207, 208, 202, 202, 202, 
-       220, 202, 202, 210, 202, 216, 217, 218, 
-       222, 6, 1, 207, 208, 202, 202, 36, 
-       220, 202, 202, 210, 202, 213, 202, 279, 
-       202, 260, 260, 6, 1, 207, 208, 202, 
-       202, 202, 215, 202, 213, 202, 213, 202, 
-       202, 202, 251, 251, 202, 1, 207, 208, 
-       202, 202, 202, 215, 202, 213, 202, 213, 
-       202, 202, 202, 251, 280, 202, 1, 207, 
-       208, 202, 202, 202, 215, 202, 213, 202, 
-       213, 202, 279, 202, 251, 251, 202, 1, 
-       207, 208, 202, 202, 202, 215, 202, 213, 
-       202, 213, 3, 202, 202, 19, 214, 202, 
-       1, 207, 208, 202, 202, 202, 215, 202, 
-       213, 202, 203, 204, 212, 212, 6, 1, 
-       207, 208, 202, 202, 202, 209, 202, 202, 
-       210, 202, 203, 204, 205, 212, 6, 1, 
-       207, 208, 202, 202, 38, 209, 202, 202, 
-       210, 202, 282, 283, 284, 285, 45, 40, 
-       286, 287, 281, 281, 77, 288, 281, 281, 
-       289, 281, 290, 283, 291, 285, 45, 40, 
-       286, 287, 281, 281, 281, 288, 281, 281, 
-       289, 281, 283, 291, 285, 45, 40, 286, 
-       287, 281, 281, 281, 288, 281, 281, 289, 
-       281, 292, 281, 281, 281, 58, 293, 281, 
-       40, 286, 287, 281, 281, 281, 294, 281, 
-       292, 281, 295, 296, 297, 298, 45, 40, 
-       286, 287, 281, 281, 75, 299, 281, 281, 
-       289, 281, 300, 296, 301, 301, 45, 40, 
-       286, 287, 281, 281, 281, 299, 281, 281, 
-       289, 281, 296, 301, 301, 45, 40, 286, 
-       287, 281, 281, 281, 299, 281, 281, 289, 
-       281, 302, 281, 281, 281, 58, 303, 281, 
-       40, 286, 287, 281, 281, 281, 294, 281, 
-       302, 281, 304, 305, 306, 307, 45, 40, 
-       286, 287, 281, 281, 73, 308, 281, 281, 
-       289, 281, 309, 305, 310, 310, 45, 40, 
-       286, 287, 281, 281, 281, 308, 281, 281, 
-       289, 281, 305, 310, 310, 45, 40, 286, 
-       287, 281, 281, 281, 308, 281, 281, 289, 
-       281, 311, 281, 281, 281, 58, 312, 281, 
-       40, 286, 287, 281, 281, 281, 294, 281, 
-       311, 281, 313, 314, 315, 316, 45, 40, 
-       286, 287, 281, 281, 71, 317, 281, 281, 
-       289, 281, 318, 314, 319, 319, 45, 40, 
-       286, 287, 281, 281, 281, 317, 281, 281, 
-       289, 281, 314, 319, 319, 45, 40, 286, 
-       287, 281, 281, 281, 317, 281, 281, 289, 
-       281, 320, 281, 281, 281, 58, 321, 281, 
-       40, 286, 287, 281, 281, 281, 294, 281, 
-       320, 281, 322, 323, 324, 325, 45, 40, 
-       286, 287, 281, 281, 69, 326, 281, 281, 
-       289, 281, 327, 323, 328, 328, 45, 40, 
-       286, 287, 281, 281, 281, 326, 281, 281, 
-       289, 281, 323, 328, 328, 45, 40, 286, 
-       287, 281, 281, 281, 326, 281, 281, 289, 
-       281, 58, 329, 281, 40, 286, 287, 281, 
-       281, 281, 294, 281, 330, 330, 281, 40, 
-       286, 287, 281, 281, 281, 294, 281, 331, 
-       281, 281, 332, 286, 287, 281, 286, 287, 
-       281, 333, 281, 286, 334, 281, 286, 335, 
-       281, 286, 281, 331, 281, 281, 281, 286, 
-       287, 281, 336, 281, 337, 338, 281, 40, 
-       286, 287, 281, 281, 43, 281, 42, 281, 
-       330, 330, 281, 40, 286, 287, 281, 330, 
-       330, 281, 40, 286, 287, 281, 336, 281, 
-       330, 330, 281, 40, 286, 287, 281, 336, 
-       281, 337, 330, 281, 40, 286, 287, 281, 
-       281, 43, 281, 58, 281, 339, 339, 45, 
-       40, 286, 287, 281, 281, 281, 294, 281, 
-       340, 67, 341, 342, 48, 40, 286, 287, 
-       281, 281, 281, 294, 281, 67, 341, 342, 
-       48, 40, 286, 287, 281, 281, 281, 294, 
-       281, 341, 341, 48, 40, 286, 287, 281, 
-       281, 281, 294, 281, 343, 64, 344, 345, 
-       51, 40, 286, 287, 281, 281, 281, 294, 
-       281, 64, 344, 345, 51, 40, 286, 287, 
-       281, 281, 281, 294, 281, 344, 344, 51, 
-       40, 286, 287, 281, 281, 281, 294, 281, 
-       346, 61, 347, 348, 54, 40, 286, 287, 
-       281, 281, 281, 294, 281, 61, 347, 348, 
-       54, 40, 286, 287, 281, 281, 281, 294, 
-       281, 347, 347, 54, 40, 286, 287, 281, 
-       281, 281, 294, 281, 349, 58, 330, 350, 
-       281, 40, 286, 287, 281, 281, 281, 294, 
-       281, 58, 330, 350, 281, 40, 286, 287, 
-       281, 281, 281, 294, 281, 330, 351, 281, 
-       40, 286, 287, 281, 281, 281, 294, 281, 
-       58, 281, 330, 330, 281, 40, 286, 287, 
-       281, 281, 281, 294, 281, 41, 42, 281, 
-       281, 58, 329, 281, 40, 286, 287, 281, 
-       281, 281, 294, 281, 41, 281, 323, 328, 
-       328, 45, 40, 286, 287, 281, 281, 281, 
-       326, 281, 322, 323, 328, 328, 45, 40, 
-       286, 287, 281, 281, 281, 326, 281, 281, 
-       289, 281, 322, 323, 324, 328, 45, 40, 
-       286, 287, 281, 281, 69, 326, 281, 281, 
-       289, 281, 320, 281, 352, 281, 339, 339, 
-       45, 40, 286, 287, 281, 281, 281, 294, 
-       281, 320, 281, 320, 281, 281, 281, 330, 
-       330, 281, 40, 286, 287, 281, 281, 281, 
-       294, 281, 320, 281, 320, 281, 281, 281, 
-       330, 353, 281, 40, 286, 287, 281, 281, 
-       281, 294, 281, 320, 281, 320, 281, 352, 
-       281, 330, 330, 281, 40, 286, 287, 281, 
-       281, 281, 294, 281, 320, 281, 320, 42, 
-       281, 281, 58, 321, 281, 40, 286, 287, 
-       281, 281, 281, 294, 281, 320, 281, 313, 
-       314, 319, 319, 45, 40, 286, 287, 281, 
-       281, 281, 317, 281, 281, 289, 281, 313, 
-       314, 315, 319, 45, 40, 286, 287, 281, 
-       281, 71, 317, 281, 281, 289, 281, 311, 
-       281, 354, 281, 339, 339, 45, 40, 286, 
-       287, 281, 281, 281, 294, 281, 311, 281, 
-       311, 281, 281, 281, 330, 330, 281, 40, 
-       286, 287, 281, 281, 281, 294, 281, 311, 
-       281, 311, 281, 281, 281, 330, 355, 281, 
-       40, 286, 287, 281, 281, 281, 294, 281, 
-       311, 281, 311, 281, 354, 281, 330, 330, 
-       281, 40, 286, 287, 281, 281, 281, 294, 
-       281, 311, 281, 311, 42, 281, 281, 58, 
-       312, 281, 40, 286, 287, 281, 281, 281, 
-       294, 281, 311, 281, 304, 305, 310, 310, 
-       45, 40, 286, 287, 281, 281, 281, 308, 
-       281, 281, 289, 281, 304, 305, 306, 310, 
-       45, 40, 286, 287, 281, 281, 73, 308, 
-       281, 281, 289, 281, 302, 281, 356, 281, 
-       339, 339, 45, 40, 286, 287, 281, 281, 
-       281, 294, 281, 302, 281, 302, 281, 281, 
-       281, 330, 330, 281, 40, 286, 287, 281, 
-       281, 281, 294, 281, 302, 281, 302, 281, 
-       281, 281, 330, 357, 281, 40, 286, 287, 
-       281, 281, 281, 294, 281, 302, 281, 302, 
-       281, 356, 281, 330, 330, 281, 40, 286, 
-       287, 281, 281, 281, 294, 281, 302, 281, 
-       302, 42, 281, 281, 58, 303, 281, 40, 
-       286, 287, 281, 281, 281, 294, 281, 302, 
-       281, 295, 296, 301, 301, 45, 40, 286, 
-       287, 281, 281, 281, 299, 281, 281, 289, 
-       281, 295, 296, 297, 301, 45, 40, 286, 
-       287, 281, 281, 75, 299, 281, 281, 289, 
-       281, 292, 281, 358, 281, 339, 339, 45, 
-       40, 286, 287, 281, 281, 281, 294, 281, 
-       292, 281, 292, 281, 281, 281, 330, 330, 
-       281, 40, 286, 287, 281, 281, 281, 294, 
-       281, 292, 281, 292, 281, 281, 281, 330, 
-       359, 281, 40, 286, 287, 281, 281, 281, 
-       294, 281, 292, 281, 292, 281, 358, 281, 
-       330, 330, 281, 40, 286, 287, 281, 281, 
-       281, 294, 281, 292, 281, 76, 44, 44, 
-       45, 40, 281, 281, 281, 281, 281, 76, 
-       281, 292, 42, 281, 281, 58, 293, 281, 
-       40, 286, 287, 281, 281, 281, 294, 281, 
-       292, 281, 282, 283, 291, 285, 45, 40, 
-       286, 287, 281, 281, 281, 288, 281, 281, 
-       289, 281, 361, 191, 362, 362, 84, 79, 
-       194, 195, 360, 360, 360, 197, 360, 360, 
-       200, 360, 191, 362, 362, 84, 79, 194, 
-       195, 360, 360, 360, 197, 360, 360, 200, 
-       360, 363, 360, 360, 360, 98, 364, 360, 
-       79, 194, 195, 360, 360, 360, 365, 360, 
-       363, 360, 366, 367, 368, 369, 84, 79, 
-       194, 195, 360, 360, 115, 370, 360, 360, 
-       200, 360, 371, 367, 372, 372, 84, 79, 
-       194, 195, 360, 360, 360, 370, 360, 360, 
-       200, 360, 367, 372, 372, 84, 79, 194, 
-       195, 360, 360, 360, 370, 360, 360, 200, 
-       360, 373, 360, 360, 360, 98, 374, 360, 
-       79, 194, 195, 360, 360, 360, 365, 360, 
-       373, 360, 375, 376, 377, 378, 84, 79, 
-       194, 195, 360, 360, 113, 379, 360, 360, 
-       200, 360, 380, 376, 381, 381, 84, 79, 
-       194, 195, 360, 360, 360, 379, 360, 360, 
-       200, 360, 376, 381, 381, 84, 79, 194, 
-       195, 360, 360, 360, 379, 360, 360, 200, 
-       360, 382, 360, 360, 360, 98, 383, 360, 
-       79, 194, 195, 360, 360, 360, 365, 360, 
-       382, 360, 384, 385, 386, 387, 84, 79, 
-       194, 195, 360, 360, 111, 388, 360, 360, 
-       200, 360, 389, 385, 390, 390, 84, 79, 
-       194, 195, 360, 360, 360, 388, 360, 360, 
-       200, 360, 385, 390, 390, 84, 79, 194, 
-       195, 360, 360, 360, 388, 360, 360, 200, 
-       360, 391, 360, 360, 360, 98, 392, 360, 
-       79, 194, 195, 360, 360, 360, 365, 360, 
-       391, 360, 393, 394, 395, 396, 84, 79, 
-       194, 195, 360, 360, 109, 397, 360, 360, 
-       200, 360, 398, 394, 399, 399, 84, 79, 
-       194, 195, 360, 360, 360, 397, 360, 360, 
-       200, 360, 394, 399, 399, 84, 79, 194, 
-       195, 360, 360, 360, 397, 360, 360, 200, 
-       360, 98, 400, 360, 79, 194, 195, 360, 
-       360, 360, 365, 360, 401, 401, 360, 79, 
-       194, 195, 360, 360, 360, 365, 360, 402, 
-       360, 360, 403, 194, 195, 360, 194, 195, 
-       360, 404, 360, 194, 405, 360, 194, 406, 
-       360, 194, 360, 402, 360, 360, 360, 194, 
-       195, 360, 407, 360, 408, 409, 360, 79, 
-       194, 195, 360, 360, 82, 360, 81, 360, 
-       401, 401, 360, 79, 194, 195, 360, 401, 
-       401, 360, 79, 194, 195, 360, 407, 360, 
-       401, 401, 360, 79, 194, 195, 360, 407, 
-       360, 408, 401, 360, 79, 194, 195, 360, 
-       360, 82, 360, 98, 360, 410, 410, 84, 
-       79, 194, 195, 360, 360, 360, 365, 360, 
-       411, 107, 412, 413, 88, 79, 194, 195, 
-       360, 360, 360, 365, 360, 107, 412, 413, 
-       88, 79, 194, 195, 360, 360, 360, 365, 
-       360, 412, 412, 88, 79, 194, 195, 360, 
-       360, 360, 365, 360, 414, 104, 415, 416, 
-       91, 79, 194, 195, 360, 360, 360, 365, 
-       360, 104, 415, 416, 91, 79, 194, 195, 
-       360, 360, 360, 365, 360, 415, 415, 91, 
-       79, 194, 195, 360, 360, 360, 365, 360, 
-       417, 101, 418, 419, 94, 79, 194, 195, 
-       360, 360, 360, 365, 360, 101, 418, 419, 
-       94, 79, 194, 195, 360, 360, 360, 365, 
-       360, 418, 418, 94, 79, 194, 195, 360, 
-       360, 360, 365, 360, 420, 98, 401, 421, 
-       360, 79, 194, 195, 360, 360, 360, 365, 
-       360, 98, 401, 421, 360, 79, 194, 195, 
-       360, 360, 360, 365, 360, 401, 422, 360, 
-       79, 194, 195, 360, 360, 360, 365, 360, 
-       98, 360, 401, 401, 360, 79, 194, 195, 
-       360, 360, 360, 365, 360, 80, 81, 360, 
-       360, 98, 400, 360, 79, 194, 195, 360, 
-       360, 360, 365, 360, 80, 360, 394, 399, 
-       399, 84, 79, 194, 195, 360, 360, 360, 
-       397, 360, 393, 394, 399, 399, 84, 79, 
-       194, 195, 360, 360, 360, 397, 360, 360, 
-       200, 360, 393, 394, 395, 399, 84, 79, 
-       194, 195, 360, 360, 109, 397, 360, 360, 
-       200, 360, 391, 360, 423, 360, 410, 410, 
-       84, 79, 194, 195, 360, 360, 360, 365, 
-       360, 391, 360, 391, 360, 360, 360, 401, 
-       401, 360, 79, 194, 195, 360, 360, 360, 
-       365, 360, 391, 360, 391, 360, 360, 360, 
-       401, 424, 360, 79, 194, 195, 360, 360, 
-       360, 365, 360, 391, 360, 391, 360, 423, 
-       360, 401, 401, 360, 79, 194, 195, 360, 
-       360, 360, 365, 360, 391, 360, 391, 81, 
-       360, 360, 98, 392, 360, 79, 194, 195, 
-       360, 360, 360, 365, 360, 391, 360, 384, 
-       385, 390, 390, 84, 79, 194, 195, 360, 
-       360, 360, 388, 360, 360, 200, 360, 384, 
-       385, 386, 390, 84, 79, 194, 195, 360, 
-       360, 111, 388, 360, 360, 200, 360, 382, 
-       360, 425, 360, 410, 410, 84, 79, 194, 
-       195, 360, 360, 360, 365, 360, 382, 360, 
-       382, 360, 360, 360, 401, 401, 360, 79, 
-       194, 195, 360, 360, 360, 365, 360, 382, 
-       360, 382, 360, 360, 360, 401, 426, 360, 
-       79, 194, 195, 360, 360, 360, 365, 360, 
-       382, 360, 382, 360, 425, 360, 401, 401, 
-       360, 79, 194, 195, 360, 360, 360, 365, 
-       360, 382, 360, 382, 81, 360, 360, 98, 
-       383, 360, 79, 194, 195, 360, 360, 360, 
-       365, 360, 382, 360, 375, 376, 381, 381, 
-       84, 79, 194, 195, 360, 360, 360, 379, 
-       360, 360, 200, 360, 375, 376, 377, 381, 
-       84, 79, 194, 195, 360, 360, 113, 379, 
-       360, 360, 200, 360, 373, 360, 427, 360, 
-       410, 410, 84, 79, 194, 195, 360, 360, 
-       360, 365, 360, 373, 360, 373, 360, 360, 
-       360, 401, 401, 360, 79, 194, 195, 360, 
-       360, 360, 365, 360, 373, 360, 373, 360, 
-       360, 360, 401, 428, 360, 79, 194, 195, 
-       360, 360, 360, 365, 360, 373, 360, 373, 
-       360, 427, 360, 401, 401, 360, 79, 194, 
-       195, 360, 360, 360, 365, 360, 373, 360, 
-       373, 81, 360, 360, 98, 374, 360, 79, 
-       194, 195, 360, 360, 360, 365, 360, 373, 
-       360, 366, 367, 372, 372, 84, 79, 194, 
-       195, 360, 360, 360, 370, 360, 360, 200, 
-       360, 366, 367, 368, 372, 84, 79, 194, 
-       195, 360, 360, 115, 370, 360, 360, 200, 
-       360, 363, 360, 429, 360, 410, 410, 84, 
-       79, 194, 195, 360, 360, 360, 365, 360, 
-       363, 360, 363, 360, 360, 360, 401, 401, 
-       360, 79, 194, 195, 360, 360, 360, 365, 
-       360, 363, 360, 363, 360, 360, 360, 401, 
-       430, 360, 79, 194, 195, 360, 360, 360, 
-       365, 360, 363, 360, 363, 360, 429, 360, 
-       401, 401, 360, 79, 194, 195, 360, 360, 
-       360, 365, 360, 363, 360, 363, 81, 360, 
-       360, 98, 364, 360, 79, 194, 195, 360, 
-       360, 360, 365, 360, 363, 360, 116, 83, 
-       83, 84, 79, 431, 431, 431, 431, 156, 
-       116, 431, 190, 191, 362, 362, 84, 79, 
-       194, 195, 360, 360, 360, 197, 360, 360, 
-       200, 360, 116, 83, 83, 84, 79, 431, 
-       431, 431, 431, 431, 116, 431, 433, 434, 
-       435, 436, 123, 118, 437, 438, 432, 432, 
-       155, 439, 432, 432, 440, 432, 441, 434, 
-       436, 436, 123, 118, 437, 438, 432, 432, 
-       432, 439, 432, 432, 440, 432, 434, 436, 
-       436, 123, 118, 437, 438, 432, 432, 432, 
-       439, 432, 432, 440, 432, 442, 432, 432, 
-       432, 136, 443, 432, 118, 437, 438, 432, 
-       432, 432, 444, 432, 442, 432, 445, 446, 
-       447, 448, 123, 118, 437, 438, 432, 432, 
-       153, 449, 432, 432, 440, 432, 450, 446, 
-       451, 451, 123, 118, 437, 438, 432, 432, 
-       432, 449, 432, 432, 440, 432, 446, 451, 
-       451, 123, 118, 437, 438, 432, 432, 432, 
-       449, 432, 432, 440, 432, 452, 432, 432, 
-       432, 136, 453, 432, 118, 437, 438, 432, 
-       432, 432, 444, 432, 452, 432, 454, 455, 
-       456, 457, 123, 118, 437, 438, 432, 432, 
-       151, 458, 432, 432, 440, 432, 459, 455, 
-       460, 460, 123, 118, 437, 438, 432, 432, 
-       432, 458, 432, 432, 440, 432, 455, 460, 
-       460, 123, 118, 437, 438, 432, 432, 432, 
-       458, 432, 432, 440, 432, 461, 432, 432, 
-       432, 136, 462, 432, 118, 437, 438, 432, 
-       432, 432, 444, 432, 461, 432, 463, 464, 
-       465, 466, 123, 118, 437, 438, 432, 432, 
-       149, 467, 432, 432, 440, 432, 468, 464, 
-       469, 469, 123, 118, 437, 438, 432, 432, 
-       432, 467, 432, 432, 440, 432, 464, 469, 
-       469, 123, 118, 437, 438, 432, 432, 432, 
-       467, 432, 432, 440, 432, 470, 432, 432, 
-       432, 136, 471, 432, 118, 437, 438, 432, 
-       432, 432, 444, 432, 470, 432, 472, 473, 
-       474, 475, 123, 118, 437, 438, 432, 432, 
-       147, 476, 432, 432, 440, 432, 477, 473, 
-       478, 478, 123, 118, 437, 438, 432, 432, 
-       432, 476, 432, 432, 440, 432, 473, 478, 
-       478, 123, 118, 437, 438, 432, 432, 432, 
-       476, 432, 432, 440, 432, 136, 479, 432, 
-       118, 437, 438, 432, 432, 432, 444, 432, 
-       480, 480, 432, 118, 437, 438, 432, 432, 
-       432, 444, 432, 481, 432, 432, 482, 437, 
-       438, 432, 437, 438, 432, 483, 432, 437, 
-       484, 432, 437, 485, 432, 437, 432, 481, 
-       432, 432, 432, 437, 438, 432, 486, 432, 
-       487, 488, 432, 118, 437, 438, 432, 432, 
-       121, 432, 120, 432, 480, 480, 432, 118, 
-       437, 438, 432, 480, 480, 432, 118, 437, 
-       438, 432, 486, 432, 480, 480, 432, 118, 
-       437, 438, 432, 486, 432, 487, 480, 432, 
-       118, 437, 438, 432, 432, 121, 432, 136, 
-       432, 489, 489, 123, 118, 437, 438, 432, 
-       432, 432, 444, 432, 490, 145, 491, 492, 
-       126, 118, 437, 438, 432, 432, 432, 444, 
-       432, 145, 491, 492, 126, 118, 437, 438, 
-       432, 432, 432, 444, 432, 491, 491, 126, 
-       118, 437, 438, 432, 432, 432, 444, 432, 
-       493, 142, 494, 495, 129, 118, 437, 438, 
-       432, 432, 432, 444, 432, 142, 494, 495, 
-       129, 118, 437, 438, 432, 432, 432, 444, 
-       432, 494, 494, 129, 118, 437, 438, 432, 
-       432, 432, 444, 432, 496, 139, 497, 498, 
-       132, 118, 437, 438, 432, 432, 432, 444, 
-       432, 139, 497, 498, 132, 118, 437, 438, 
-       432, 432, 432, 444, 432, 497, 497, 132, 
-       118, 437, 438, 432, 432, 432, 444, 432, 
-       499, 136, 480, 500, 432, 118, 437, 438, 
-       432, 432, 432, 444, 432, 136, 480, 500, 
-       432, 118, 437, 438, 432, 432, 432, 444, 
-       432, 480, 501, 432, 118, 437, 438, 432, 
-       432, 432, 444, 432, 136, 432, 480, 480, 
-       432, 118, 437, 438, 432, 432, 432, 444, 
-       432, 119, 120, 432, 432, 136, 479, 432, 
-       118, 437, 438, 432, 432, 432, 444, 432, 
-       119, 432, 473, 478, 478, 123, 118, 437, 
-       438, 432, 432, 432, 476, 432, 472, 473, 
-       478, 478, 123, 118, 437, 438, 432, 432, 
-       432, 476, 432, 432, 440, 432, 472, 473, 
-       474, 478, 123, 118, 437, 438, 432, 432, 
-       147, 476, 432, 432, 440, 432, 470, 432, 
-       502, 432, 489, 489, 123, 118, 437, 438, 
-       432, 432, 432, 444, 432, 470, 432, 470, 
-       432, 432, 432, 480, 480, 432, 118, 437, 
-       438, 432, 432, 432, 444, 432, 470, 432, 
-       470, 432, 432, 432, 480, 503, 432, 118, 
-       437, 438, 432, 432, 432, 444, 432, 470, 
-       432, 470, 432, 502, 432, 480, 480, 432, 
-       118, 437, 438, 432, 432, 432, 444, 432, 
-       470, 432, 470, 120, 432, 432, 136, 471, 
-       432, 118, 437, 438, 432, 432, 432, 444, 
-       432, 470, 432, 463, 464, 469, 469, 123, 
-       118, 437, 438, 432, 432, 432, 467, 432, 
-       432, 440, 432, 463, 464, 465, 469, 123, 
-       118, 437, 438, 432, 432, 149, 467, 432, 
-       432, 440, 432, 461, 432, 504, 432, 489, 
-       489, 123, 118, 437, 438, 432, 432, 432, 
-       444, 432, 461, 432, 461, 432, 432, 432, 
-       480, 480, 432, 118, 437, 438, 432, 432, 
-       432, 444, 432, 461, 432, 461, 432, 432, 
-       432, 480, 505, 432, 118, 437, 438, 432, 
-       432, 432, 444, 432, 461, 432, 461, 432, 
-       504, 432, 480, 480, 432, 118, 437, 438, 
-       432, 432, 432, 444, 432, 461, 432, 461, 
-       120, 432, 432, 136, 462, 432, 118, 437, 
-       438, 432, 432, 432, 444, 432, 461, 432, 
-       454, 455, 460, 460, 123, 118, 437, 438, 
-       432, 432, 432, 458, 432, 432, 440, 432, 
-       454, 455, 456, 460, 123, 118, 437, 438, 
-       432, 432, 151, 458, 432, 432, 440, 432, 
-       452, 432, 506, 432, 489, 489, 123, 118, 
-       437, 438, 432, 432, 432, 444, 432, 452, 
-       432, 452, 432, 432, 432, 480, 480, 432, 
-       118, 437, 438, 432, 432, 432, 444, 432, 
-       452, 432, 452, 432, 432, 432, 480, 507, 
-       432, 118, 437, 438, 432, 432, 432, 444, 
-       432, 452, 432, 452, 432, 506, 432, 480, 
-       480, 432, 118, 437, 438, 432, 432, 432, 
-       444, 432, 452, 432, 452, 120, 432, 432, 
-       136, 453, 432, 118, 437, 438, 432, 432, 
-       432, 444, 432, 452, 432, 445, 446, 451, 
-       451, 123, 118, 437, 438, 432, 432, 432, 
-       449, 432, 432, 440, 432, 445, 446, 447, 
-       451, 123, 118, 437, 438, 432, 432, 153, 
-       449, 432, 432, 440, 432, 442, 432, 508, 
-       432, 489, 489, 123, 118, 437, 438, 432, 
-       432, 432, 444, 432, 442, 432, 442, 432, 
-       432, 432, 480, 480, 432, 118, 437, 438, 
-       432, 432, 432, 444, 432, 442, 432, 442, 
-       432, 432, 432, 480, 509, 432, 118, 437, 
-       438, 432, 432, 432, 444, 432, 442, 432, 
-       442, 432, 508, 432, 480, 480, 432, 118, 
-       437, 438, 432, 432, 432, 444, 432, 442, 
-       432, 442, 120, 432, 432, 136, 443, 432, 
-       118, 437, 438, 432, 432, 432, 444, 432, 
-       442, 432, 433, 434, 436, 436, 123, 118, 
-       437, 438, 432, 432, 432, 439, 432, 432, 
-       440, 432, 188, 189, 190, 191, 510, 362, 
-       84, 79, 194, 195, 196, 196, 156, 197, 
-       360, 188, 200, 360, 203, 511, 205, 206, 
-       6, 1, 207, 208, 202, 202, 38, 209, 
-       202, 202, 210, 202, 213, 189, 190, 191, 
-       512, 513, 84, 157, 514, 515, 202, 196, 
-       156, 516, 202, 213, 200, 202, 116, 517, 
-       517, 84, 157, 207, 208, 202, 202, 156, 
-       518, 202, 519, 202, 202, 520, 514, 515, 
-       202, 514, 515, 202, 254, 202, 514, 521, 
-       202, 514, 522, 202, 514, 202, 519, 202, 
-       202, 202, 514, 515, 202, 523, 3, 360, 
-       360, 401, 430, 360, 79, 194, 195, 360, 
-       360, 360, 365, 360, 523, 360, 524, 367, 
-       525, 526, 84, 157, 514, 515, 202, 202, 
-       158, 370, 202, 202, 200, 202, 527, 367, 
-       528, 528, 84, 157, 514, 515, 202, 202, 
-       202, 370, 202, 202, 200, 202, 367, 528, 
-       528, 84, 157, 514, 515, 202, 202, 202, 
-       370, 202, 202, 200, 202, 524, 367, 528, 
-       528, 84, 157, 514, 515, 202, 202, 202, 
-       370, 202, 202, 200, 202, 524, 367, 525, 
-       528, 84, 157, 514, 515, 202, 202, 158, 
-       370, 202, 202, 200, 202, 213, 202, 279, 
-       116, 529, 529, 160, 157, 207, 208, 202, 
-       202, 202, 518, 202, 213, 202, 530, 184, 
-       531, 532, 162, 157, 514, 515, 202, 202, 
-       202, 533, 202, 184, 531, 532, 162, 157, 
-       514, 515, 202, 202, 202, 533, 202, 531, 
-       531, 162, 157, 514, 515, 202, 202, 202, 
-       533, 202, 534, 181, 535, 536, 165, 157, 
-       514, 515, 202, 202, 202, 533, 202, 181, 
-       535, 536, 165, 157, 514, 515, 202, 202, 
-       202, 533, 202, 535, 535, 165, 157, 514, 
-       515, 202, 202, 202, 533, 202, 537, 178, 
-       538, 539, 168, 157, 514, 515, 202, 202, 
-       202, 533, 202, 178, 538, 539, 168, 157, 
-       514, 515, 202, 202, 202, 533, 202, 538, 
-       538, 168, 157, 514, 515, 202, 202, 202, 
-       533, 202, 540, 175, 541, 542, 202, 157, 
-       514, 515, 202, 202, 202, 533, 202, 175, 
-       541, 542, 202, 157, 514, 515, 202, 202, 
-       202, 533, 202, 541, 541, 202, 157, 514, 
-       515, 202, 202, 202, 533, 202, 543, 202, 
-       544, 545, 202, 157, 514, 515, 202, 202, 
-       172, 202, 171, 202, 541, 541, 202, 157, 
-       514, 515, 202, 541, 541, 202, 157, 514, 
-       515, 202, 543, 202, 541, 541, 202, 157, 
-       514, 515, 202, 543, 202, 544, 541, 202, 
-       157, 514, 515, 202, 202, 172, 202, 523, 
-       171, 360, 360, 98, 364, 360, 79, 194, 
-       195, 360, 360, 360, 365, 360, 523, 360, 
-       547, 546, 548, 548, 546, 186, 549, 550, 
-       546, 548, 548, 546, 186, 549, 550, 546, 
-       551, 546, 546, 552, 549, 550, 546, 549, 
-       550, 546, 553, 546, 549, 554, 546, 549, 
-       555, 546, 549, 546, 551, 546, 546, 546, 
-       549, 550, 546, 0
+       1, 0, 2, 2, 3, 1, 0, 4, 
+       4, 3, 0, 3, 0, 5, 5, 6, 
+       1, 0, 7, 7, 6, 0, 6, 0, 
+       8, 8, 9, 1, 0, 10, 10, 9, 
+       0, 9, 0, 11, 11, 12, 1, 0, 
+       13, 13, 12, 0, 12, 0, 14, 0, 
+       0, 0, 1, 0, 15, 0, 16, 0, 
+       17, 11, 11, 12, 1, 0, 18, 0, 
+       19, 0, 20, 8, 8, 9, 1, 0, 
+       21, 0, 22, 0, 23, 5, 5, 6, 
+       1, 0, 24, 0, 25, 0, 26, 2, 
+       2, 3, 1, 0, 26, 2, 2, 3, 
+       1, 0, 0, 0, 0, 27, 0, 28, 
+       2, 2, 3, 1, 0, 28, 2, 2, 
+       3, 1, 0, 0, 0, 0, 29, 0, 
+       30, 2, 2, 3, 1, 0, 30, 2, 
+       2, 3, 1, 0, 0, 0, 0, 31, 
+       0, 32, 2, 2, 3, 1, 0, 32, 
+       2, 2, 3, 1, 0, 0, 0, 0, 
+       33, 0, 34, 2, 2, 3, 1, 0, 
+       34, 2, 2, 3, 1, 0, 0, 0, 
+       0, 35, 0, 37, 36, 38, 38, 39, 
+       37, 36, 40, 40, 39, 36, 39, 36, 
+       41, 41, 42, 37, 36, 43, 43, 42, 
+       36, 42, 36, 44, 44, 45, 37, 36, 
+       46, 46, 45, 36, 45, 36, 47, 47, 
+       48, 37, 36, 49, 49, 48, 36, 48, 
+       36, 50, 36, 36, 36, 37, 36, 51, 
+       36, 52, 36, 53, 47, 47, 48, 37, 
+       36, 54, 36, 55, 36, 56, 44, 44, 
+       45, 37, 36, 57, 36, 58, 36, 59, 
+       41, 41, 42, 37, 36, 60, 36, 61, 
+       36, 62, 38, 38, 39, 37, 36, 62, 
+       38, 38, 39, 37, 36, 36, 36, 36, 
+       63, 36, 64, 38, 38, 39, 37, 36, 
+       64, 38, 38, 39, 37, 36, 36, 36, 
+       36, 65, 36, 66, 38, 38, 39, 37, 
+       36, 66, 38, 38, 39, 37, 36, 36, 
+       36, 36, 67, 36, 68, 38, 38, 39, 
+       37, 36, 68, 38, 38, 39, 37, 36, 
+       36, 36, 36, 69, 36, 70, 38, 38, 
+       39, 37, 36, 70, 38, 38, 39, 37, 
+       36, 36, 36, 36, 71, 36, 73, 72, 
+       74, 74, 75, 73, 72, 77, 77, 75, 
+       76, 75, 76, 78, 78, 79, 73, 72, 
+       80, 80, 79, 72, 79, 72, 81, 81, 
+       82, 73, 72, 83, 83, 82, 72, 82, 
+       72, 84, 84, 85, 73, 72, 86, 86, 
+       85, 72, 85, 72, 87, 72, 72, 72, 
+       73, 72, 88, 72, 89, 72, 90, 84, 
+       84, 85, 73, 72, 91, 72, 92, 72, 
+       93, 81, 81, 82, 73, 72, 94, 72, 
+       95, 72, 96, 78, 78, 79, 73, 72, 
+       97, 72, 98, 72, 99, 74, 74, 75, 
+       73, 72, 99, 74, 74, 75, 73, 72, 
+       72, 72, 72, 100, 72, 101, 74, 74, 
+       75, 73, 72, 101, 74, 74, 75, 73, 
+       72, 72, 72, 72, 102, 72, 103, 74, 
+       74, 75, 73, 72, 103, 74, 74, 75, 
+       73, 72, 72, 72, 72, 104, 72, 105, 
+       74, 74, 75, 73, 72, 105, 74, 74, 
+       75, 73, 72, 72, 72, 72, 106, 72, 
+       107, 74, 74, 75, 73, 72, 109, 108, 
+       110, 110, 111, 109, 108, 112, 112, 111, 
+       108, 111, 108, 113, 113, 114, 109, 108, 
+       115, 115, 114, 108, 114, 108, 116, 116, 
+       117, 109, 108, 118, 118, 117, 108, 117, 
+       108, 119, 119, 120, 109, 108, 121, 121, 
+       120, 108, 120, 108, 122, 108, 108, 108, 
+       109, 108, 123, 108, 124, 108, 125, 119, 
+       119, 120, 109, 108, 126, 108, 127, 108, 
+       128, 116, 116, 117, 109, 108, 129, 108, 
+       130, 108, 131, 113, 113, 114, 109, 108, 
+       132, 108, 133, 108, 134, 110, 110, 111, 
+       109, 108, 134, 110, 110, 111, 109, 108, 
+       108, 108, 108, 135, 108, 136, 110, 110, 
+       111, 109, 108, 136, 110, 110, 111, 109, 
+       108, 108, 108, 108, 137, 108, 138, 110, 
+       110, 111, 109, 108, 138, 110, 110, 111, 
+       109, 108, 108, 108, 108, 139, 108, 140, 
+       110, 110, 111, 109, 108, 140, 110, 110, 
+       111, 109, 108, 108, 108, 108, 141, 108, 
+       142, 110, 110, 111, 109, 108, 142, 110, 
+       110, 111, 109, 108, 108, 108, 108, 143, 
+       108, 107, 74, 74, 75, 73, 72, 72, 
+       72, 72, 144, 72, 77, 77, 75, 1, 
+       0, 145, 145, 146, 1, 0, 4, 4, 
+       146, 0, 147, 147, 148, 149, 0, 150, 
+       150, 148, 0, 148, 0, 151, 151, 152, 
+       149, 0, 153, 153, 152, 0, 152, 0, 
+       154, 154, 155, 149, 0, 156, 156, 155, 
+       0, 155, 0, 149, 0, 157, 0, 0, 
+       0, 149, 0, 158, 0, 159, 0, 160, 
+       154, 154, 155, 149, 0, 161, 0, 162, 
+       0, 163, 151, 151, 152, 149, 0, 164, 
+       0, 165, 0, 166, 147, 147, 148, 149, 
+       0, 167, 0, 168, 0, 170, 169, 172, 
+       173, 174, 175, 176, 177, 75, 73, 171, 
+       178, 179, 179, 144, 171, 180, 181, 182, 
+       183, 184, 171, 186, 187, 188, 189, 3, 
+       1, 185, 190, 185, 185, 35, 185, 185, 
+       185, 191, 185, 192, 187, 193, 193, 3, 
+       1, 185, 190, 185, 185, 185, 185, 185, 
+       185, 191, 185, 187, 193, 193, 3, 1, 
+       185, 190, 185, 185, 185, 185, 185, 185, 
+       191, 185, 194, 185, 185, 185, 16, 195, 
+       185, 1, 185, 190, 185, 185, 185, 185, 
+       185, 194, 185, 196, 197, 198, 199, 3, 
+       1, 185, 190, 185, 185, 33, 185, 185, 
+       185, 191, 185, 200, 197, 201, 201, 3, 
+       1, 185, 190, 185, 185, 185, 185, 185, 
+       185, 191, 185, 197, 201, 201, 3, 1, 
+       185, 190, 185, 185, 185, 185, 185, 185, 
+       191, 185, 202, 185, 185, 185, 16, 203, 
+       185, 1, 185, 190, 185, 185, 185, 185, 
+       185, 202, 185, 204, 205, 206, 207, 3, 
+       1, 185, 190, 185, 185, 31, 185, 185, 
+       185, 191, 185, 208, 205, 209, 209, 3, 
+       1, 185, 190, 185, 185, 185, 185, 185, 
+       185, 191, 185, 205, 209, 209, 3, 1, 
+       185, 190, 185, 185, 185, 185, 185, 185, 
+       191, 185, 210, 185, 185, 185, 16, 211, 
+       185, 1, 185, 190, 185, 185, 185, 185, 
+       185, 210, 185, 212, 213, 214, 215, 3, 
+       1, 185, 190, 185, 185, 29, 185, 185, 
+       185, 191, 185, 216, 213, 217, 217, 3, 
+       1, 185, 190, 185, 185, 185, 185, 185, 
+       185, 191, 185, 213, 217, 217, 3, 1, 
+       185, 190, 185, 185, 185, 185, 185, 185, 
+       191, 185, 218, 185, 185, 185, 16, 219, 
+       185, 1, 185, 190, 185, 185, 185, 185, 
+       185, 218, 185, 220, 221, 222, 223, 3, 
+       1, 185, 190, 185, 185, 27, 185, 185, 
+       185, 191, 185, 224, 221, 225, 225, 3, 
+       1, 185, 190, 185, 185, 185, 185, 185, 
+       185, 191, 185, 221, 225, 225, 3, 1, 
+       185, 190, 185, 185, 185, 185, 185, 185, 
+       191, 185, 16, 226, 185, 1, 185, 190, 
+       185, 227, 227, 185, 1, 185, 190, 185, 
+       228, 185, 185, 229, 185, 190, 185, 190, 
+       185, 230, 185, 231, 185, 228, 185, 185, 
+       185, 185, 190, 185, 16, 185, 232, 232, 
+       3, 1, 185, 190, 185, 233, 25, 234, 
+       235, 6, 1, 185, 190, 185, 25, 234, 
+       235, 6, 1, 185, 190, 185, 234, 234, 
+       6, 1, 185, 190, 185, 236, 22, 237, 
+       238, 9, 1, 185, 190, 185, 22, 237, 
+       238, 9, 1, 185, 190, 185, 237, 237, 
+       9, 1, 185, 190, 185, 239, 19, 240, 
+       241, 12, 1, 185, 190, 185, 19, 240, 
+       241, 12, 1, 185, 190, 185, 240, 240, 
+       12, 1, 185, 190, 185, 242, 16, 227, 
+       243, 185, 1, 185, 190, 185, 16, 227, 
+       243, 185, 1, 185, 190, 185, 227, 244, 
+       185, 1, 185, 190, 185, 16, 185, 227, 
+       227, 185, 1, 185, 190, 185, 221, 225, 
+       225, 3, 1, 185, 190, 185, 220, 221, 
+       225, 225, 3, 1, 185, 190, 185, 185, 
+       185, 185, 185, 185, 191, 185, 220, 221, 
+       222, 225, 3, 1, 185, 190, 185, 185, 
+       27, 185, 185, 185, 191, 185, 218, 185, 
+       245, 185, 232, 232, 3, 1, 185, 190, 
+       185, 185, 185, 185, 185, 218, 185, 218, 
+       185, 185, 185, 227, 227, 185, 1, 185, 
+       190, 185, 185, 185, 185, 185, 218, 185, 
+       218, 185, 185, 185, 227, 246, 185, 1, 
+       185, 190, 185, 185, 185, 185, 185, 218, 
+       185, 218, 185, 245, 185, 227, 227, 185, 
+       1, 185, 190, 185, 185, 185, 185, 185, 
+       218, 185, 212, 213, 217, 217, 3, 1, 
+       185, 190, 185, 185, 185, 185, 185, 185, 
+       191, 185, 212, 213, 214, 217, 3, 1, 
+       185, 190, 185, 185, 29, 185, 185, 185, 
+       191, 185, 210, 185, 247, 185, 232, 232, 
+       3, 1, 185, 190, 185, 185, 185, 185, 
+       185, 210, 185, 210, 185, 185, 185, 227, 
+       227, 185, 1, 185, 190, 185, 185, 185, 
+       185, 185, 210, 185, 210, 185, 185, 185, 
+       227, 248, 185, 1, 185, 190, 185, 185, 
+       185, 185, 185, 210, 185, 210, 185, 247, 
+       185, 227, 227, 185, 1, 185, 190, 185, 
+       185, 185, 185, 185, 210, 185, 204, 205, 
+       209, 209, 3, 1, 185, 190, 185, 185, 
+       185, 185, 185, 185, 191, 185, 204, 205, 
+       206, 209, 3, 1, 185, 190, 185, 185, 
+       31, 185, 185, 185, 191, 185, 202, 185, 
+       249, 185, 232, 232, 3, 1, 185, 190, 
+       185, 185, 185, 185, 185, 202, 185, 202, 
+       185, 185, 185, 227, 227, 185, 1, 185, 
+       190, 185, 185, 185, 185, 185, 202, 185, 
+       202, 185, 185, 185, 227, 250, 185, 1, 
+       185, 190, 185, 185, 185, 185, 185, 202, 
+       185, 202, 185, 249, 185, 227, 227, 185, 
+       1, 185, 190, 185, 185, 185, 185, 185, 
+       202, 185, 196, 197, 201, 201, 3, 1, 
+       185, 190, 185, 185, 185, 185, 185, 185, 
+       191, 185, 196, 197, 198, 201, 3, 1, 
+       185, 190, 185, 185, 33, 185, 185, 185, 
+       191, 185, 194, 185, 251, 185, 232, 232, 
+       3, 1, 185, 190, 185, 185, 185, 185, 
+       185, 194, 185, 194, 185, 185, 185, 227, 
+       227, 185, 1, 185, 190, 185, 185, 185, 
+       185, 185, 194, 185, 194, 185, 185, 185, 
+       227, 252, 185, 1, 185, 190, 185, 185, 
+       185, 185, 185, 194, 185, 194, 185, 251, 
+       185, 227, 227, 185, 1, 185, 190, 185, 
+       185, 185, 185, 185, 194, 185, 186, 187, 
+       193, 193, 3, 1, 185, 190, 185, 185, 
+       185, 185, 185, 185, 191, 185, 186, 187, 
+       188, 193, 3, 1, 185, 190, 185, 185, 
+       35, 185, 185, 185, 191, 185, 254, 255, 
+       256, 257, 39, 37, 253, 258, 253, 253, 
+       71, 253, 253, 253, 259, 253, 260, 255, 
+       261, 257, 39, 37, 253, 258, 253, 253, 
+       253, 253, 253, 253, 259, 253, 255, 261, 
+       257, 39, 37, 253, 258, 253, 253, 253, 
+       253, 253, 253, 259, 253, 262, 253, 253, 
+       253, 52, 263, 253, 37, 253, 258, 253, 
+       253, 253, 253, 253, 262, 253, 264, 265, 
+       266, 267, 39, 37, 253, 258, 253, 253, 
+       69, 253, 253, 253, 259, 253, 268, 265, 
+       269, 269, 39, 37, 253, 258, 253, 253, 
+       253, 253, 253, 253, 259, 253, 265, 269, 
+       269, 39, 37, 253, 258, 253, 253, 253, 
+       253, 253, 253, 259, 253, 270, 253, 253, 
+       253, 52, 271, 253, 37, 253, 258, 253, 
+       253, 253, 253, 253, 270, 253, 272, 273, 
+       274, 275, 39, 37, 253, 258, 253, 253, 
+       67, 253, 253, 253, 259, 253, 276, 273, 
+       277, 277, 39, 37, 253, 258, 253, 253, 
+       253, 253, 253, 253, 259, 253, 273, 277, 
+       277, 39, 37, 253, 258, 253, 253, 253, 
+       253, 253, 253, 259, 253, 278, 253, 253, 
+       253, 52, 279, 253, 37, 253, 258, 253, 
+       253, 253, 253, 253, 278, 253, 280, 281, 
+       282, 283, 39, 37, 253, 258, 253, 253, 
+       65, 253, 253, 253, 259, 253, 284, 281, 
+       285, 285, 39, 37, 253, 258, 253, 253, 
+       253, 253, 253, 253, 259, 253, 281, 285, 
+       285, 39, 37, 253, 258, 253, 253, 253, 
+       253, 253, 253, 259, 253, 286, 253, 253, 
+       253, 52, 287, 253, 37, 253, 258, 253, 
+       253, 253, 253, 253, 286, 253, 288, 289, 
+       290, 291, 39, 37, 253, 258, 253, 253, 
+       63, 253, 253, 253, 259, 253, 292, 289, 
+       293, 293, 39, 37, 253, 258, 253, 253, 
+       253, 253, 253, 253, 259, 253, 289, 293, 
+       293, 39, 37, 253, 258, 253, 253, 253, 
+       253, 253, 253, 259, 253, 52, 294, 253, 
+       37, 253, 258, 253, 295, 295, 253, 37, 
+       253, 258, 253, 296, 253, 253, 297, 253, 
+       258, 253, 258, 253, 298, 253, 299, 253, 
+       296, 253, 253, 253, 253, 258, 253, 52, 
+       253, 300, 300, 39, 37, 253, 258, 253, 
+       301, 61, 302, 303, 42, 37, 253, 258, 
+       253, 61, 302, 303, 42, 37, 253, 258, 
+       253, 302, 302, 42, 37, 253, 258, 253, 
+       304, 58, 305, 306, 45, 37, 253, 258, 
+       253, 58, 305, 306, 45, 37, 253, 258, 
+       253, 305, 305, 45, 37, 253, 258, 253, 
+       307, 55, 308, 309, 48, 37, 253, 258, 
+       253, 55, 308, 309, 48, 37, 253, 258, 
+       253, 308, 308, 48, 37, 253, 258, 253, 
+       310, 52, 295, 311, 253, 37, 253, 258, 
+       253, 52, 295, 311, 253, 37, 253, 258, 
+       253, 295, 312, 253, 37, 253, 258, 253, 
+       52, 253, 295, 295, 253, 37, 253, 258, 
+       253, 289, 293, 293, 39, 37, 253, 258, 
+       253, 288, 289, 293, 293, 39, 37, 253, 
+       258, 253, 253, 253, 253, 253, 253, 259, 
+       253, 288, 289, 290, 293, 39, 37, 253, 
+       258, 253, 253, 63, 253, 253, 253, 259, 
+       253, 286, 253, 313, 253, 300, 300, 39, 
+       37, 253, 258, 253, 253, 253, 253, 253, 
+       286, 253, 286, 253, 253, 253, 295, 295, 
+       253, 37, 253, 258, 253, 253, 253, 253, 
+       253, 286, 253, 286, 253, 253, 253, 295, 
+       314, 253, 37, 253, 258, 253, 253, 253, 
+       253, 253, 286, 253, 286, 253, 313, 253, 
+       295, 295, 253, 37, 253, 258, 253, 253, 
+       253, 253, 253, 286, 253, 280, 281, 285, 
+       285, 39, 37, 253, 258, 253, 253, 253, 
+       253, 253, 253, 259, 253, 280, 281, 282, 
+       285, 39, 37, 253, 258, 253, 253, 65, 
+       253, 253, 253, 259, 253, 278, 253, 315, 
+       253, 300, 300, 39, 37, 253, 258, 253, 
+       253, 253, 253, 253, 278, 253, 278, 253, 
+       253, 253, 295, 295, 253, 37, 253, 258, 
+       253, 253, 253, 253, 253, 278, 253, 278, 
+       253, 253, 253, 295, 316, 253, 37, 253, 
+       258, 253, 253, 253, 253, 253, 278, 253, 
+       278, 253, 315, 253, 295, 295, 253, 37, 
+       253, 258, 253, 253, 253, 253, 253, 278, 
+       253, 272, 273, 277, 277, 39, 37, 253, 
+       258, 253, 253, 253, 253, 253, 253, 259, 
+       253, 272, 273, 274, 277, 39, 37, 253, 
+       258, 253, 253, 67, 253, 253, 253, 259, 
+       253, 270, 253, 317, 253, 300, 300, 39, 
+       37, 253, 258, 253, 253, 253, 253, 253, 
+       270, 253, 270, 253, 253, 253, 295, 295, 
+       253, 37, 253, 258, 253, 253, 253, 253, 
+       253, 270, 253, 270, 253, 253, 253, 295, 
+       318, 253, 37, 253, 258, 253, 253, 253, 
+       253, 253, 270, 253, 270, 253, 317, 253, 
+       295, 295, 253, 37, 253, 258, 253, 253, 
+       253, 253, 253, 270, 253, 264, 265, 269, 
+       269, 39, 37, 253, 258, 253, 253, 253, 
+       253, 253, 253, 259, 253, 264, 265, 266, 
+       269, 39, 37, 253, 258, 253, 253, 69, 
+       253, 253, 253, 259, 253, 262, 253, 319, 
+       253, 300, 300, 39, 37, 253, 258, 253, 
+       253, 253, 253, 253, 262, 253, 262, 253, 
+       253, 253, 295, 295, 253, 37, 253, 258, 
+       253, 253, 253, 253, 253, 262, 253, 262, 
+       253, 253, 253, 295, 320, 253, 37, 253, 
+       258, 253, 253, 253, 253, 253, 262, 253, 
+       262, 253, 319, 253, 295, 295, 253, 37, 
+       253, 258, 253, 253, 253, 253, 253, 262, 
+       253, 70, 38, 38, 39, 37, 253, 254, 
+       255, 261, 257, 39, 37, 253, 258, 253, 
+       253, 253, 253, 253, 253, 259, 253, 322, 
+       175, 323, 323, 75, 73, 321, 178, 321, 
+       321, 321, 321, 321, 321, 182, 321, 175, 
+       323, 323, 75, 73, 321, 178, 321, 321, 
+       321, 321, 321, 321, 182, 321, 324, 321, 
+       321, 321, 89, 325, 321, 73, 321, 178, 
+       321, 321, 321, 321, 321, 324, 321, 326, 
+       327, 328, 329, 75, 73, 321, 178, 321, 
+       321, 106, 321, 321, 321, 182, 321, 330, 
+       327, 331, 331, 75, 73, 321, 178, 321, 
+       321, 321, 321, 321, 321, 182, 321, 327, 
+       331, 331, 75, 73, 321, 178, 321, 321, 
+       321, 321, 321, 321, 182, 321, 332, 321, 
+       321, 321, 89, 333, 321, 73, 321, 178, 
+       321, 321, 321, 321, 321, 332, 321, 334, 
+       335, 336, 337, 75, 73, 321, 178, 321, 
+       321, 104, 321, 321, 321, 182, 321, 338, 
+       335, 339, 339, 75, 73, 321, 178, 321, 
+       321, 321, 321, 321, 321, 182, 321, 335, 
+       339, 339, 75, 73, 321, 178, 321, 321, 
+       321, 321, 321, 321, 182, 321, 340, 321, 
+       321, 321, 89, 341, 321, 73, 321, 178, 
+       321, 321, 321, 321, 321, 340, 321, 342, 
+       343, 344, 345, 75, 73, 321, 178, 321, 
+       321, 102, 321, 321, 321, 182, 321, 346, 
+       343, 347, 347, 75, 73, 321, 178, 321, 
+       321, 321, 321, 321, 321, 182, 321, 343, 
+       347, 347, 75, 73, 321, 178, 321, 321, 
+       321, 321, 321, 321, 182, 321, 348, 321, 
+       321, 321, 89, 349, 321, 73, 321, 178, 
+       321, 321, 321, 321, 321, 348, 321, 350, 
+       351, 352, 353, 75, 73, 321, 178, 321, 
+       321, 100, 321, 321, 321, 182, 321, 354, 
+       351, 355, 355, 75, 73, 321, 178, 321, 
+       321, 321, 321, 321, 321, 182, 321, 351, 
+       355, 355, 75, 73, 321, 178, 321, 321, 
+       321, 321, 321, 321, 182, 321, 89, 356, 
+       321, 73, 321, 178, 321, 357, 357, 321, 
+       73, 321, 178, 321, 358, 321, 321, 359, 
+       321, 178, 321, 178, 321, 360, 321, 361, 
+       321, 358, 321, 321, 321, 321, 178, 321, 
+       89, 321, 362, 362, 75, 73, 321, 178, 
+       321, 363, 98, 364, 365, 79, 73, 321, 
+       178, 321, 98, 364, 365, 79, 73, 321, 
+       178, 321, 364, 364, 79, 73, 321, 178, 
+       321, 366, 95, 367, 368, 82, 73, 321, 
+       178, 321, 95, 367, 368, 82, 73, 321, 
+       178, 321, 367, 367, 82, 73, 321, 178, 
+       321, 369, 92, 370, 371, 85, 73, 321, 
+       178, 321, 92, 370, 371, 85, 73, 321, 
+       178, 321, 370, 370, 85, 73, 321, 178, 
+       321, 372, 89, 357, 373, 321, 73, 321, 
+       178, 321, 89, 357, 373, 321, 73, 321, 
+       178, 321, 357, 374, 321, 73, 321, 178, 
+       321, 89, 321, 357, 357, 321, 73, 321, 
+       178, 321, 351, 355, 355, 75, 73, 321, 
+       178, 321, 350, 351, 355, 355, 75, 73, 
+       321, 178, 321, 321, 321, 321, 321, 321, 
+       182, 321, 350, 351, 352, 355, 75, 73, 
+       321, 178, 321, 321, 100, 321, 321, 321, 
+       182, 321, 348, 321, 375, 321, 362, 362, 
+       75, 73, 321, 178, 321, 321, 321, 321, 
+       321, 348, 321, 348, 321, 321, 321, 357, 
+       357, 321, 73, 321, 178, 321, 321, 321, 
+       321, 321, 348, 321, 348, 321, 321, 321, 
+       357, 376, 321, 73, 321, 178, 321, 321, 
+       321, 321, 321, 348, 321, 348, 321, 375, 
+       321, 357, 357, 321, 73, 321, 178, 321, 
+       321, 321, 321, 321, 348, 321, 342, 343, 
+       347, 347, 75, 73, 321, 178, 321, 321, 
+       321, 321, 321, 321, 182, 321, 342, 343, 
+       344, 347, 75, 73, 321, 178, 321, 321, 
+       102, 321, 321, 321, 182, 321, 340, 321, 
+       377, 321, 362, 362, 75, 73, 321, 178, 
+       321, 321, 321, 321, 321, 340, 321, 340, 
+       321, 321, 321, 357, 357, 321, 73, 321, 
+       178, 321, 321, 321, 321, 321, 340, 321, 
+       340, 321, 321, 321, 357, 378, 321, 73, 
+       321, 178, 321, 321, 321, 321, 321, 340, 
+       321, 340, 321, 377, 321, 357, 357, 321, 
+       73, 321, 178, 321, 321, 321, 321, 321, 
+       340, 321, 334, 335, 339, 339, 75, 73, 
+       321, 178, 321, 321, 321, 321, 321, 321, 
+       182, 321, 334, 335, 336, 339, 75, 73, 
+       321, 178, 321, 321, 104, 321, 321, 321, 
+       182, 321, 332, 321, 379, 321, 362, 362, 
+       75, 73, 321, 178, 321, 321, 321, 321, 
+       321, 332, 321, 332, 321, 321, 321, 357, 
+       357, 321, 73, 321, 178, 321, 321, 321, 
+       321, 321, 332, 321, 332, 321, 321, 321, 
+       357, 380, 321, 73, 321, 178, 321, 321, 
+       321, 321, 321, 332, 321, 332, 321, 379, 
+       321, 357, 357, 321, 73, 321, 178, 321, 
+       321, 321, 321, 321, 332, 321, 326, 327, 
+       331, 331, 75, 73, 321, 178, 321, 321, 
+       321, 321, 321, 321, 182, 321, 326, 327, 
+       328, 331, 75, 73, 321, 178, 321, 321, 
+       106, 321, 321, 321, 182, 321, 324, 321, 
+       381, 321, 362, 362, 75, 73, 321, 178, 
+       321, 321, 321, 321, 321, 324, 321, 324, 
+       321, 321, 321, 357, 357, 321, 73, 321, 
+       178, 321, 321, 321, 321, 321, 324, 321, 
+       324, 321, 321, 321, 357, 382, 321, 73, 
+       321, 178, 321, 321, 321, 321, 321, 324, 
+       321, 324, 321, 381, 321, 357, 357, 321, 
+       73, 321, 178, 321, 321, 321, 321, 321, 
+       324, 321, 107, 74, 74, 75, 73, 383, 
+       383, 383, 383, 144, 383, 174, 175, 323, 
+       323, 75, 73, 321, 178, 321, 321, 321, 
+       321, 321, 321, 182, 321, 107, 74, 74, 
+       75, 73, 383, 385, 386, 387, 388, 111, 
+       109, 384, 389, 384, 384, 143, 384, 384, 
+       384, 390, 384, 391, 386, 388, 388, 111, 
+       109, 384, 389, 384, 384, 384, 384, 384, 
+       384, 390, 384, 386, 388, 388, 111, 109, 
+       384, 389, 384, 384, 384, 384, 384, 384, 
+       390, 384, 392, 384, 384, 384, 124, 393, 
+       384, 109, 384, 389, 384, 384, 384, 384, 
+       384, 392, 384, 394, 395, 396, 397, 111, 
+       109, 384, 389, 384, 384, 141, 384, 384, 
+       384, 390, 384, 398, 395, 399, 399, 111, 
+       109, 384, 389, 384, 384, 384, 384, 384, 
+       384, 390, 384, 395, 399, 399, 111, 109, 
+       384, 389, 384, 384, 384, 384, 384, 384, 
+       390, 384, 400, 384, 384, 384, 124, 401, 
+       384, 109, 384, 389, 384, 384, 384, 384, 
+       384, 400, 384, 402, 403, 404, 405, 111, 
+       109, 384, 389, 384, 384, 139, 384, 384, 
+       384, 390, 384, 406, 403, 407, 407, 111, 
+       109, 384, 389, 384, 384, 384, 384, 384, 
+       384, 390, 384, 403, 407, 407, 111, 109, 
+       384, 389, 384, 384, 384, 384, 384, 384, 
+       390, 384, 408, 384, 384, 384, 124, 409, 
+       384, 109, 384, 389, 384, 384, 384, 384, 
+       384, 408, 384, 410, 411, 412, 413, 111, 
+       109, 384, 389, 384, 384, 137, 384, 384, 
+       384, 390, 384, 414, 411, 415, 415, 111, 
+       109, 384, 389, 384, 384, 384, 384, 384, 
+       384, 390, 384, 411, 415, 415, 111, 109, 
+       384, 389, 384, 384, 384, 384, 384, 384, 
+       390, 384, 416, 384, 384, 384, 124, 417, 
+       384, 109, 384, 389, 384, 384, 384, 384, 
+       384, 416, 384, 418, 419, 420, 421, 111, 
+       109, 384, 389, 384, 384, 135, 384, 384, 
+       384, 390, 384, 422, 419, 423, 423, 111, 
+       109, 384, 389, 384, 384, 384, 384, 384, 
+       384, 390, 384, 419, 423, 423, 111, 109, 
+       384, 389, 384, 384, 384, 384, 384, 384, 
+       390, 384, 124, 424, 384, 109, 384, 389, 
+       384, 425, 425, 384, 109, 384, 389, 384, 
+       426, 384, 384, 427, 384, 389, 384, 389, 
+       384, 428, 384, 429, 384, 426, 384, 384, 
+       384, 384, 389, 384, 124, 384, 430, 430, 
+       111, 109, 384, 389, 384, 431, 133, 432, 
+       433, 114, 109, 384, 389, 384, 133, 432, 
+       433, 114, 109, 384, 389, 384, 432, 432, 
+       114, 109, 384, 389, 384, 434, 130, 435, 
+       436, 117, 109, 384, 389, 384, 130, 435, 
+       436, 117, 109, 384, 389, 384, 435, 435, 
+       117, 109, 384, 389, 384, 437, 127, 438, 
+       439, 120, 109, 384, 389, 384, 127, 438, 
+       439, 120, 109, 384, 389, 384, 438, 438, 
+       120, 109, 384, 389, 384, 440, 124, 425, 
+       441, 384, 109, 384, 389, 384, 124, 425, 
+       441, 384, 109, 384, 389, 384, 425, 442, 
+       384, 109, 384, 389, 384, 124, 384, 425, 
+       425, 384, 109, 384, 389, 384, 419, 423, 
+       423, 111, 109, 384, 389, 384, 418, 419, 
+       423, 423, 111, 109, 384, 389, 384, 384, 
+       384, 384, 384, 384, 390, 384, 418, 419, 
+       420, 423, 111, 109, 384, 389, 384, 384, 
+       135, 384, 384, 384, 390, 384, 416, 384, 
+       443, 384, 430, 430, 111, 109, 384, 389, 
+       384, 384, 384, 384, 384, 416, 384, 416, 
+       384, 384, 384, 425, 425, 384, 109, 384, 
+       389, 384, 384, 384, 384, 384, 416, 384, 
+       416, 384, 384, 384, 425, 444, 384, 109, 
+       384, 389, 384, 384, 384, 384, 384, 416, 
+       384, 416, 384, 443, 384, 425, 425, 384, 
+       109, 384, 389, 384, 384, 384, 384, 384, 
+       416, 384, 410, 411, 415, 415, 111, 109, 
+       384, 389, 384, 384, 384, 384, 384, 384, 
+       390, 384, 410, 411, 412, 415, 111, 109, 
+       384, 389, 384, 384, 137, 384, 384, 384, 
+       390, 384, 408, 384, 445, 384, 430, 430, 
+       111, 109, 384, 389, 384, 384, 384, 384, 
+       384, 408, 384, 408, 384, 384, 384, 425, 
+       425, 384, 109, 384, 389, 384, 384, 384, 
+       384, 384, 408, 384, 408, 384, 384, 384, 
+       425, 446, 384, 109, 384, 389, 384, 384, 
+       384, 384, 384, 408, 384, 408, 384, 445, 
+       384, 425, 425, 384, 109, 384, 389, 384, 
+       384, 384, 384, 384, 408, 384, 402, 403, 
+       407, 407, 111, 109, 384, 389, 384, 384, 
+       384, 384, 384, 384, 390, 384, 402, 403, 
+       404, 407, 111, 109, 384, 389, 384, 384, 
+       139, 384, 384, 384, 390, 384, 400, 384, 
+       447, 384, 430, 430, 111, 109, 384, 389, 
+       384, 384, 384, 384, 384, 400, 384, 400, 
+       384, 384, 384, 425, 425, 384, 109, 384, 
+       389, 384, 384, 384, 384, 384, 400, 384, 
+       400, 384, 384, 384, 425, 448, 384, 109, 
+       384, 389, 384, 384, 384, 384, 384, 400, 
+       384, 400, 384, 447, 384, 425, 425, 384, 
+       109, 384, 389, 384, 384, 384, 384, 384, 
+       400, 384, 394, 395, 399, 399, 111, 109, 
+       384, 389, 384, 384, 384, 384, 384, 384, 
+       390, 384, 394, 395, 396, 399, 111, 109, 
+       384, 389, 384, 384, 141, 384, 384, 384, 
+       390, 384, 392, 384, 449, 384, 430, 430, 
+       111, 109, 384, 389, 384, 384, 384, 384, 
+       384, 392, 384, 392, 384, 384, 384, 425, 
+       425, 384, 109, 384, 389, 384, 384, 384, 
+       384, 384, 392, 384, 392, 384, 384, 384, 
+       425, 450, 384, 109, 384, 389, 384, 384, 
+       384, 384, 384, 392, 384, 392, 384, 449, 
+       384, 425, 425, 384, 109, 384, 389, 384, 
+       384, 384, 384, 384, 392, 384, 385, 386, 
+       388, 388, 111, 109, 384, 389, 384, 384, 
+       384, 384, 384, 384, 390, 384, 172, 173, 
+       174, 175, 451, 323, 75, 73, 321, 178, 
+       179, 179, 144, 321, 321, 172, 182, 321, 
+       186, 452, 188, 189, 3, 1, 185, 190, 
+       185, 185, 35, 185, 185, 185, 191, 185, 
+       194, 173, 174, 175, 453, 454, 75, 149, 
+       185, 455, 185, 179, 144, 185, 185, 194, 
+       182, 185, 107, 456, 456, 75, 149, 185, 
+       190, 185, 185, 144, 185, 457, 185, 185, 
+       458, 185, 455, 185, 455, 185, 459, 185, 
+       231, 185, 457, 185, 185, 185, 185, 455, 
+       185, 194, 185, 251, 107, 460, 460, 146, 
+       149, 185, 190, 185, 185, 185, 185, 185, 
+       194, 185, 461, 168, 462, 463, 148, 149, 
+       185, 455, 185, 168, 462, 463, 148, 149, 
+       185, 455, 185, 462, 462, 148, 149, 185, 
+       455, 185, 464, 165, 465, 466, 152, 149, 
+       185, 455, 185, 165, 465, 466, 152, 149, 
+       185, 455, 185, 465, 465, 152, 149, 185, 
+       455, 185, 467, 162, 468, 469, 155, 149, 
+       185, 455, 185, 162, 468, 469, 155, 149, 
+       185, 455, 185, 468, 468, 155, 149, 185, 
+       455, 185, 470, 159, 471, 472, 185, 149, 
+       185, 455, 185, 159, 471, 472, 185, 149, 
+       185, 455, 185, 471, 471, 185, 149, 185, 
+       455, 185, 474, 473, 475, 475, 473, 170, 
+       473, 476, 473, 475, 475, 473, 170, 473, 
+       476, 473, 477, 473, 473, 478, 473, 476, 
+       473, 476, 473, 479, 473, 480, 473, 477, 
+       473, 473, 473, 473, 476, 473, 172, 383, 
+       383, 383, 383, 383, 383, 383, 383, 383, 
+       179, 383, 383, 383, 383, 172, 383, 0
 };
 
 static const short _indic_syllable_machine_trans_targs[] = {
 };
 
 static const short _indic_syllable_machine_trans_targs[] = {
-       178, 200, 207, 209, 210, 4, 213, 5, 
-       7, 216, 8, 10, 219, 11, 13, 222, 
-       14, 16, 17, 199, 19, 20, 221, 22, 
-       23, 218, 25, 26, 215, 224, 228, 232, 
-       235, 239, 242, 246, 249, 253, 256, 178, 
-       279, 286, 288, 289, 41, 292, 42, 44, 
-       295, 45, 47, 298, 48, 50, 301, 51, 
-       53, 54, 278, 56, 57, 300, 59, 60, 
-       297, 62, 63, 294, 303, 307, 311, 314, 
-       318, 321, 325, 328, 332, 336, 178, 357, 
-       364, 366, 367, 78, 370, 178, 79, 81, 
-       373, 82, 84, 376, 85, 87, 379, 88, 
-       90, 91, 356, 93, 94, 378, 96, 97, 
-       375, 99, 100, 372, 381, 385, 389, 392, 
-       396, 399, 403, 406, 410, 178, 437, 444, 
-       446, 447, 114, 450, 115, 117, 453, 118, 
-       120, 456, 121, 123, 459, 124, 126, 127, 
-       436, 129, 130, 458, 132, 133, 455, 135, 
-       136, 452, 461, 465, 469, 472, 476, 479, 
-       483, 486, 490, 493, 414, 498, 509, 152, 
-       512, 154, 515, 155, 157, 518, 158, 160, 
-       521, 161, 524, 526, 527, 166, 167, 523, 
-       169, 170, 520, 172, 173, 517, 175, 176, 
-       514, 178, 532, 178, 179, 258, 337, 339, 
-       413, 415, 359, 360, 416, 412, 494, 495, 
-       384, 530, 178, 180, 182, 36, 257, 202, 
-       203, 255, 227, 181, 35, 183, 251, 1, 
-       184, 186, 34, 250, 248, 185, 33, 187, 
-       244, 188, 190, 32, 243, 241, 189, 31, 
-       191, 237, 192, 194, 30, 236, 234, 193, 
-       29, 195, 230, 196, 198, 28, 229, 226, 
-       197, 27, 212, 0, 201, 206, 178, 204, 
-       205, 208, 2, 211, 3, 214, 6, 24, 
-       217, 9, 21, 220, 12, 18, 223, 15, 
-       225, 231, 233, 238, 240, 245, 247, 252, 
-       254, 178, 259, 261, 73, 334, 281, 282, 
-       335, 306, 260, 72, 262, 330, 38, 263, 
-       265, 71, 329, 327, 264, 70, 266, 323, 
-       267, 269, 69, 322, 320, 268, 68, 270, 
-       316, 271, 273, 67, 315, 313, 272, 66, 
-       274, 309, 275, 277, 65, 308, 305, 276, 
-       64, 291, 37, 280, 285, 178, 283, 284, 
-       287, 39, 290, 40, 293, 43, 61, 296, 
-       46, 58, 299, 49, 55, 302, 52, 304, 
-       310, 312, 317, 319, 324, 326, 331, 333, 
-       178, 338, 109, 340, 408, 75, 341, 343, 
-       108, 407, 405, 342, 107, 344, 401, 345, 
-       347, 106, 400, 398, 346, 105, 348, 394, 
-       349, 351, 104, 393, 391, 350, 103, 352, 
-       387, 353, 355, 102, 386, 383, 354, 101, 
-       369, 74, 358, 363, 178, 361, 362, 365, 
-       76, 368, 77, 371, 80, 98, 374, 83, 
-       95, 377, 86, 92, 380, 89, 382, 388, 
-       390, 395, 397, 402, 404, 409, 411, 178, 
-       178, 417, 419, 146, 145, 439, 440, 492, 
-       464, 418, 420, 488, 111, 421, 423, 144, 
-       487, 485, 422, 143, 424, 481, 425, 427, 
-       142, 480, 478, 426, 141, 428, 474, 429, 
-       431, 140, 473, 471, 430, 139, 432, 467, 
-       433, 435, 138, 466, 463, 434, 137, 449, 
-       110, 438, 443, 178, 441, 442, 445, 112, 
-       448, 113, 451, 116, 134, 454, 119, 131, 
-       457, 122, 128, 460, 125, 462, 468, 470, 
-       475, 477, 482, 484, 489, 491, 147, 496, 
-       497, 511, 500, 501, 529, 148, 505, 499, 
-       504, 502, 503, 506, 507, 150, 510, 508, 
-       149, 151, 513, 153, 174, 163, 516, 156, 
-       171, 519, 159, 168, 522, 162, 165, 525, 
-       164, 528, 178, 531, 177, 534, 535, 533, 
-       538, 178, 536, 537
+       166, 188, 2, 194, 3, 5, 197, 6, 
+       8, 200, 9, 11, 203, 12, 14, 15, 
+       187, 17, 18, 202, 20, 21, 199, 23, 
+       24, 196, 205, 208, 212, 214, 218, 220, 
+       224, 226, 230, 232, 166, 255, 37, 261, 
+       38, 40, 264, 41, 43, 267, 44, 46, 
+       270, 47, 49, 50, 254, 52, 53, 269, 
+       55, 56, 266, 58, 59, 263, 272, 275, 
+       279, 281, 285, 287, 291, 293, 297, 300, 
+       166, 321, 72, 327, 166, 73, 75, 330, 
+       76, 78, 333, 79, 81, 336, 82, 84, 
+       85, 320, 87, 88, 335, 90, 91, 332, 
+       93, 94, 329, 338, 341, 345, 347, 351, 
+       353, 357, 359, 363, 166, 389, 106, 395, 
+       107, 109, 398, 110, 112, 401, 113, 115, 
+       404, 116, 118, 119, 388, 121, 122, 403, 
+       124, 125, 400, 127, 128, 397, 406, 409, 
+       413, 415, 419, 421, 425, 427, 431, 433, 
+       366, 142, 444, 144, 447, 438, 145, 147, 
+       450, 148, 150, 453, 151, 154, 155, 455, 
+       157, 158, 452, 160, 161, 449, 163, 164, 
+       446, 166, 458, 166, 167, 234, 301, 303, 
+       365, 367, 323, 368, 434, 435, 340, 456, 
+       463, 166, 168, 170, 34, 233, 190, 207, 
+       169, 33, 171, 228, 172, 174, 32, 227, 
+       173, 31, 175, 222, 176, 178, 30, 221, 
+       177, 29, 179, 216, 180, 182, 28, 215, 
+       181, 27, 183, 210, 184, 186, 26, 209, 
+       185, 25, 193, 0, 189, 192, 191, 166, 
+       1, 195, 4, 22, 198, 7, 19, 201, 
+       10, 16, 204, 13, 206, 211, 213, 217, 
+       219, 223, 225, 229, 231, 166, 235, 237, 
+       69, 299, 257, 274, 236, 68, 238, 295, 
+       239, 241, 67, 294, 240, 66, 242, 289, 
+       243, 245, 65, 288, 244, 64, 246, 283, 
+       247, 249, 63, 282, 248, 62, 250, 277, 
+       251, 253, 61, 276, 252, 60, 260, 35, 
+       256, 259, 258, 166, 36, 262, 39, 57, 
+       265, 42, 54, 268, 45, 51, 271, 48, 
+       273, 278, 280, 284, 286, 290, 292, 296, 
+       298, 166, 302, 103, 304, 361, 305, 307, 
+       102, 360, 306, 101, 308, 355, 309, 311, 
+       100, 354, 310, 99, 312, 349, 313, 315, 
+       98, 348, 314, 97, 316, 343, 317, 319, 
+       96, 342, 318, 95, 326, 70, 322, 325, 
+       324, 166, 71, 328, 74, 92, 331, 77, 
+       89, 334, 80, 86, 337, 83, 339, 344, 
+       346, 350, 352, 356, 358, 362, 364, 166, 
+       166, 369, 371, 138, 137, 391, 408, 370, 
+       372, 429, 373, 375, 136, 428, 374, 135, 
+       376, 423, 377, 379, 134, 422, 378, 133, 
+       380, 417, 381, 383, 132, 416, 382, 131, 
+       384, 411, 385, 387, 130, 410, 386, 129, 
+       394, 104, 390, 393, 392, 166, 105, 396, 
+       108, 126, 399, 111, 123, 402, 114, 120, 
+       405, 117, 407, 412, 414, 418, 420, 424, 
+       426, 430, 432, 139, 436, 437, 443, 440, 
+       140, 439, 442, 441, 141, 445, 143, 162, 
+       448, 146, 159, 451, 149, 156, 454, 152, 
+       153, 166, 457, 165, 460, 459, 462, 461, 
+       166
 };
 
 static const char _indic_syllable_machine_trans_actions[] = {
 };
 
 static const char _indic_syllable_machine_trans_actions[] = {
-       1, 0, 2, 2, 2, 0, 2, 0, 
-       0, 2, 0, 0, 2, 0, 0, 2, 
-       0, 0, 0, 2, 0, 0, 2, 0, 
-       0, 2, 0, 0, 2, 2, 2, 2, 
-       2, 2, 2, 2, 2, 2, 2, 3, 
-       0, 2, 2, 2, 0, 2, 0, 0, 
-       2, 0, 0, 2, 0, 0, 2, 0, 
-       0, 0, 2, 0, 0, 2, 0, 0, 
-       2, 0, 0, 2, 2, 2, 2, 2, 
-       2, 2, 2, 2, 2, 2, 4, 0, 
-       2, 2, 2, 0, 2, 5, 0, 0, 
-       2, 0, 0, 2, 0, 0, 2, 0, 
-       0, 0, 2, 0, 0, 2, 0, 0, 
-       2, 0, 0, 2, 2, 6, 2, 6, 
-       2, 6, 2, 6, 2, 7, 0, 2, 
-       2, 2, 0, 2, 0, 0, 2, 0, 
+       1, 0, 0, 2, 0, 0, 2, 0, 
        0, 2, 0, 0, 2, 0, 0, 0, 
        2, 0, 0, 2, 0, 0, 2, 0, 
        0, 2, 2, 2, 2, 2, 2, 2, 
        0, 2, 0, 0, 2, 0, 0, 0, 
        2, 0, 0, 2, 0, 0, 2, 0, 
        0, 2, 2, 2, 2, 2, 2, 2, 
-       2, 2, 2, 2, 6, 0, 8, 0, 
-       2, 0, 2, 0, 0, 2, 0, 0, 
-       2, 0, 2, 2, 2, 0, 0, 2, 
+       2, 2, 2, 2, 3, 0, 0, 2, 
        0, 0, 2, 0, 0, 2, 0, 0, 
        0, 0, 2, 0, 0, 2, 0, 0, 
-       2, 9, 0, 12, 2, 2, 6, 2, 
-       13, 13, 0, 0, 2, 2, 6, 2, 
-       6, 2, 14, 2, 2, 0, 2, 0, 
-       0, 2, 2, 2, 0, 2, 2, 0, 
-       2, 2, 0, 2, 2, 2, 0, 2, 
-       2, 2, 2, 0, 2, 2, 2, 0, 
-       2, 2, 2, 2, 0, 2, 2, 2, 
-       0, 2, 2, 2, 2, 0, 2, 2, 
-       2, 0, 2, 0, 0, 0, 15, 0, 
-       0, 2, 0, 2, 0, 2, 0, 0, 
-       2, 0, 0, 2, 0, 0, 2, 0, 
+       2, 0, 0, 0, 2, 0, 0, 2, 
+       0, 0, 2, 0, 0, 2, 2, 2, 
        2, 2, 2, 2, 2, 2, 2, 2, 
        2, 2, 2, 2, 2, 2, 2, 2, 
-       2, 16, 2, 2, 0, 2, 0, 0, 
-       2, 2, 2, 0, 2, 2, 0, 2, 
-       2, 0, 2, 2, 2, 0, 2, 2, 
-       2, 2, 0, 2, 2, 2, 0, 2, 
-       2, 2, 2, 0, 2, 2, 2, 0, 
-       2, 2, 2, 2, 0, 2, 2, 2, 
-       0, 2, 0, 0, 0, 17, 0, 0, 
-       2, 0, 2, 0, 2, 0, 0, 2, 
-       0, 0, 2, 0, 0, 2, 0, 2, 
+       4, 0, 0, 2, 5, 0, 0, 2, 
+       0, 0, 2, 0, 0, 2, 0, 0, 
+       0, 2, 0, 0, 2, 0, 0, 2, 
+       0, 0, 2, 2, 6, 2, 6, 2, 
+       6, 2, 6, 2, 7, 0, 0, 2, 
+       0, 0, 2, 0, 0, 2, 0, 0, 
+       2, 0, 0, 0, 2, 0, 0, 2, 
+       0, 0, 2, 0, 0, 2, 2, 2, 
        2, 2, 2, 2, 2, 2, 2, 2, 
        2, 2, 2, 2, 2, 2, 2, 2, 
-       18, 6, 0, 6, 6, 0, 6, 2, 
-       0, 6, 2, 6, 0, 6, 6, 6, 
-       2, 0, 6, 2, 6, 0, 6, 6, 
-       6, 2, 0, 6, 2, 6, 0, 6, 
-       6, 6, 2, 0, 6, 2, 6, 0, 
-       6, 0, 0, 0, 19, 0, 0, 2, 
-       0, 2, 0, 2, 0, 0, 2, 0, 
-       0, 2, 0, 0, 2, 0, 2, 2, 
-       2, 2, 2, 2, 2, 2, 2, 20, 
-       21, 2, 2, 0, 0, 0, 0, 2, 
-       2, 2, 2, 2, 0, 2, 2, 0, 
-       2, 2, 2, 0, 2, 2, 2, 2, 
-       0, 2, 2, 2, 0, 2, 2, 2, 
-       2, 0, 2, 2, 2, 0, 2, 2, 
-       2, 2, 0, 2, 2, 2, 0, 2, 
-       0, 0, 0, 22, 0, 0, 2, 0, 
-       2, 0, 2, 0, 0, 2, 0, 0, 
-       2, 0, 0, 2, 0, 2, 2, 2, 
-       2, 2, 2, 2, 2, 2, 0, 0, 
-       8, 2, 0, 0, 2, 0, 2, 0, 
-       0, 0, 0, 8, 8, 0, 8, 8, 
-       0, 0, 2, 0, 0, 0, 2, 0, 
+       6, 0, 2, 0, 2, 0, 0, 0, 
+       2, 0, 0, 2, 0, 0, 0, 2, 
+       0, 0, 2, 0, 0, 2, 0, 0, 
+       2, 8, 0, 11, 2, 2, 6, 0, 
+       12, 12, 0, 2, 6, 2, 6, 2, 
+       0, 13, 2, 0, 0, 2, 0, 2, 
+       2, 0, 2, 2, 2, 0, 0, 2, 
+       2, 0, 2, 2, 2, 0, 0, 2, 
+       2, 0, 2, 2, 2, 0, 0, 2, 
+       2, 0, 2, 2, 2, 0, 0, 2, 
+       2, 0, 2, 0, 0, 0, 0, 14, 
        0, 2, 0, 0, 2, 0, 0, 2, 
        0, 2, 0, 0, 2, 0, 0, 2, 
-       0, 2, 23, 2, 0, 0, 0, 0, 
-       0, 24, 0, 0
+       0, 0, 2, 0, 2, 2, 2, 2, 
+       2, 2, 2, 2, 2, 15, 2, 0, 
+       0, 2, 0, 2, 2, 0, 2, 2, 
+       2, 0, 0, 2, 2, 0, 2, 2, 
+       2, 0, 0, 2, 2, 0, 2, 2, 
+       2, 0, 0, 2, 2, 0, 2, 2, 
+       2, 0, 0, 2, 2, 0, 2, 0, 
+       0, 0, 0, 16, 0, 2, 0, 0, 
+       2, 0, 0, 2, 0, 0, 2, 0, 
+       2, 2, 2, 2, 2, 2, 2, 2, 
+       2, 17, 6, 0, 6, 6, 6, 0, 
+       0, 6, 6, 0, 6, 6, 6, 0, 
+       0, 6, 6, 0, 6, 6, 6, 0, 
+       0, 6, 6, 0, 6, 6, 6, 0, 
+       0, 6, 6, 0, 6, 0, 0, 0, 
+       0, 18, 0, 2, 0, 0, 2, 0, 
+       0, 2, 0, 0, 2, 0, 2, 2, 
+       2, 2, 2, 2, 2, 2, 2, 19, 
+       20, 2, 0, 0, 0, 0, 2, 2, 
+       2, 2, 2, 0, 0, 2, 2, 0, 
+       2, 2, 2, 0, 0, 2, 2, 0, 
+       2, 2, 2, 0, 0, 2, 2, 0, 
+       2, 2, 2, 0, 0, 2, 2, 0, 
+       2, 0, 0, 0, 0, 21, 0, 2, 
+       0, 0, 2, 0, 0, 2, 0, 0, 
+       2, 0, 2, 2, 2, 2, 2, 2, 
+       2, 2, 2, 0, 0, 22, 2, 0, 
+       0, 0, 0, 0, 0, 2, 0, 0, 
+       2, 0, 0, 2, 0, 0, 2, 0, 
+       0, 23, 2, 0, 0, 0, 0, 0, 
+       24
 };
 
 static const char _indic_syllable_machine_to_state_actions[] = {
 };
 
 static const char _indic_syllable_machine_to_state_actions[] = {
@@ -1155,9 +940,7 @@ static const char _indic_syllable_machine_to_state_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 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, 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, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
@@ -1194,15 +977,7 @@ static const char _indic_syllable_machine_to_state_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0
+       0, 0, 0, 0, 0, 0, 0, 0
 };
 
 static const char _indic_syllable_machine_from_state_actions[] = {
 };
 
 static const char _indic_syllable_machine_from_state_actions[] = {
@@ -1226,12 +1001,7 @@ static const char _indic_syllable_machine_from_state_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 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, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
@@ -1268,12 +1038,7 @@ static const char _indic_syllable_machine_from_state_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0
+       0, 0, 0, 0, 0, 0, 0, 0
 };
 
 static const short _indic_syllable_machine_eof_trans[] = {
 };
 
 static const short _indic_syllable_machine_eof_trans[] = {
@@ -1281,84 +1046,74 @@ static const short _indic_syllable_machine_eof_trans[] = {
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 40, 40, 40, 
-       40, 40, 40, 40, 40, 40, 40, 40, 
-       40, 40, 40, 40, 40, 40, 40, 40, 
-       40, 40, 40, 40, 40, 40, 40, 40, 
-       40, 40, 40, 40, 40, 40, 40, 40, 
-       40, 40, 79, 79, 79, 79, 86, 86, 
-       79, 79, 79, 79, 79, 79, 79, 79, 
-       79, 79, 79, 79, 79, 79, 79, 79, 
-       79, 79, 79, 79, 79, 79, 79, 79, 
-       79, 79, 79, 79, 79, 79, 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, 118, 
-       118, 118, 118, 79, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 
+       1, 1, 1, 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, 37, 73, 73, 
+       77, 77, 73, 73, 73, 73, 73, 73, 
+       73, 73, 73, 73, 73, 73, 73, 73, 
+       73, 73, 73, 73, 73, 73, 73, 73, 
+       73, 73, 73, 73, 73, 73, 73, 73, 
+       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, 109, 109, 73, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 186, 0, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 203, 282, 282, 282, 282, 282, 282, 
-       282, 282, 282, 282, 282, 282, 282, 282, 
-       282, 282, 282, 282, 282, 282, 282, 282, 
-       282, 282, 282, 282, 282, 282, 282, 282, 
-       282, 282, 282, 282, 282, 282, 282, 282, 
-       282, 282, 282, 282, 282, 282, 282, 282, 
-       282, 282, 282, 282, 282, 282, 282, 282, 
-       282, 282, 282, 282, 282, 282, 282, 282, 
-       282, 282, 282, 282, 282, 282, 282, 282, 
-       282, 282, 282, 282, 282, 282, 282, 282, 
-       282, 361, 361, 361, 361, 361, 361, 361, 
-       361, 361, 361, 361, 361, 361, 361, 361, 
-       361, 361, 361, 361, 361, 361, 361, 361, 
-       361, 361, 361, 361, 361, 361, 361, 361, 
-       361, 361, 361, 361, 361, 361, 361, 361, 
-       361, 361, 361, 361, 361, 361, 361, 361, 
-       361, 361, 361, 361, 361, 361, 361, 361, 
-       361, 361, 361, 361, 361, 361, 361, 361, 
-       361, 361, 361, 361, 361, 361, 361, 361, 
-       361, 361, 361, 361, 361, 432, 361, 432, 
-       433, 433, 433, 433, 433, 433, 433, 433, 
-       433, 433, 433, 433, 433, 433, 433, 433, 
-       433, 433, 433, 433, 433, 433, 433, 433, 
-       433, 433, 433, 433, 433, 433, 433, 433, 
-       433, 433, 433, 433, 433, 433, 433, 433, 
-       433, 433, 433, 433, 433, 433, 433, 433, 
-       433, 433, 433, 433, 433, 433, 433, 433, 
-       433, 433, 433, 433, 433, 433, 433, 433, 
-       433, 433, 433, 433, 433, 433, 433, 433, 
-       433, 433, 433, 433, 433, 433, 361, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 361, 203, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 203, 203, 203, 203, 203, 203, 203, 
-       203, 361, 547, 547, 547, 547, 547, 547, 
-       547, 547, 547
+       1, 1, 1, 1, 1, 170, 0, 186, 
+       186, 186, 186, 186, 186, 186, 186, 186, 
+       186, 186, 186, 186, 186, 186, 186, 186, 
+       186, 186, 186, 186, 186, 186, 186, 186, 
+       186, 186, 186, 186, 186, 186, 186, 186, 
+       186, 186, 186, 186, 186, 186, 186, 186, 
+       186, 186, 186, 186, 186, 186, 186, 186, 
+       186, 186, 186, 186, 186, 186, 186, 186, 
+       186, 186, 186, 186, 186, 186, 186, 186, 
+       186, 186, 254, 254, 254, 254, 254, 254, 
+       254, 254, 254, 254, 254, 254, 254, 254, 
+       254, 254, 254, 254, 254, 254, 254, 254, 
+       254, 254, 254, 254, 254, 254, 254, 254, 
+       254, 254, 254, 254, 254, 254, 254, 254, 
+       254, 254, 254, 254, 254, 254, 254, 254, 
+       254, 254, 254, 254, 254, 254, 254, 254, 
+       254, 254, 254, 254, 254, 254, 254, 254, 
+       254, 254, 254, 254, 254, 322, 322, 322, 
+       322, 322, 322, 322, 322, 322, 322, 322, 
+       322, 322, 322, 322, 322, 322, 322, 322, 
+       322, 322, 322, 322, 322, 322, 322, 322, 
+       322, 322, 322, 322, 322, 322, 322, 322, 
+       322, 322, 322, 322, 322, 322, 322, 322, 
+       322, 322, 322, 322, 322, 322, 322, 322, 
+       322, 322, 322, 322, 322, 322, 322, 322, 
+       322, 322, 322, 322, 322, 384, 322, 384, 
+       385, 385, 385, 385, 385, 385, 385, 385, 
+       385, 385, 385, 385, 385, 385, 385, 385, 
+       385, 385, 385, 385, 385, 385, 385, 385, 
+       385, 385, 385, 385, 385, 385, 385, 385, 
+       385, 385, 385, 385, 385, 385, 385, 385, 
+       385, 385, 385, 385, 385, 385, 385, 385, 
+       385, 385, 385, 385, 385, 385, 385, 385, 
+       385, 385, 385, 385, 385, 385, 385, 385, 
+       385, 385, 322, 186, 186, 186, 186, 186, 
+       186, 186, 186, 186, 186, 186, 186, 186, 
+       186, 186, 186, 186, 186, 186, 186, 186, 
+       474, 474, 474, 474, 474, 474, 474, 384
 };
 
 };
 
-static const int indic_syllable_machine_start = 178;
-static const int indic_syllable_machine_first_final = 178;
+static const int indic_syllable_machine_start = 166;
+static const int indic_syllable_machine_first_final = 166;
 static const int indic_syllable_machine_error = -1;
 
 static const int indic_syllable_machine_error = -1;
 
-static const int indic_syllable_machine_en_main = 178;
+static const int indic_syllable_machine_en_main = 166;
 
 
 #line 36 "hb-ot-shape-complex-indic-machine.rl"
 
 
 
 
 
 #line 36 "hb-ot-shape-complex-indic-machine.rl"
 
 
 
-#line 96 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
 
 
 #define found_syllable(syllable_type) \
 
 
 #define found_syllable(syllable_type) \
@@ -1378,7 +1133,7 @@ find_syllables (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 1382 "hb-ot-shape-complex-indic-machine.hh"
+#line 1137 "hb-ot-shape-complex-indic-machine.hh"
        {
        cs = indic_syllable_machine_start;
        ts = 0;
        {
        cs = indic_syllable_machine_start;
        ts = 0;
@@ -1386,7 +1141,7 @@ find_syllables (hb_buffer_t *buffer)
        act = 0;
        }
 
        act = 0;
        }
 
-#line 117 "hb-ot-shape-complex-indic-machine.rl"
+#line 113 "hb-ot-shape-complex-indic-machine.rl"
 
 
   p = 0;
 
 
   p = 0;
@@ -1395,7 +1150,7 @@ find_syllables (hb_buffer_t *buffer)
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 1399 "hb-ot-shape-complex-indic-machine.hh"
+#line 1154 "hb-ot-shape-complex-indic-machine.hh"
        {
        int _slen;
        int _trans;
        {
        int _slen;
        int _trans;
@@ -1405,11 +1160,11 @@ find_syllables (hb_buffer_t *buffer)
                goto _test_eof;
 _resume:
        switch ( _indic_syllable_machine_from_state_actions[cs] ) {
                goto _test_eof;
 _resume:
        switch ( _indic_syllable_machine_from_state_actions[cs] ) {
-       case 11:
+       case 10:
 #line 1 "NONE"
        {ts = p;}
        break;
 #line 1 "NONE"
        {ts = p;}
        break;
-#line 1413 "hb-ot-shape-complex-indic-machine.hh"
+#line 1168 "hb-ot-shape-complex-indic-machine.hh"
        }
 
        _keys = _indic_syllable_machine_trans_keys + (cs<<1);
        }
 
        _keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -1431,72 +1186,72 @@ _eof_trans:
 #line 1 "NONE"
        {te = p+1;}
        break;
 #line 1 "NONE"
        {te = p+1;}
        break;
-       case 15:
-#line 87 "hb-ot-shape-complex-indic-machine.rl"
+       case 14:
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (consonant_syllable); }}
        break;
        {te = p+1;{ found_syllable (consonant_syllable); }}
        break;
-       case 17:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+       case 16:
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (vowel_syllable); }}
        break;
        {te = p+1;{ found_syllable (vowel_syllable); }}
        break;
-       case 22:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+       case 21:
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (standalone_cluster); }}
        break;
        case 24:
        {te = p+1;{ found_syllable (standalone_cluster); }}
        break;
        case 24:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (symbol_cluster); }}
        break;
        {te = p+1;{ found_syllable (symbol_cluster); }}
        break;
-       case 19:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+       case 18:
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (broken_cluster); }}
        break;
        {te = p+1;{ found_syllable (broken_cluster); }}
        break;
-       case 12:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+       case 11:
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (non_indic_cluster); }}
        break;
        {te = p+1;{ found_syllable (non_indic_cluster); }}
        break;
-       case 14:
-#line 87 "hb-ot-shape-complex-indic-machine.rl"
+       case 13:
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (consonant_syllable); }}
        break;
        {te = p;p--;{ found_syllable (consonant_syllable); }}
        break;
-       case 16:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+       case 15:
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (vowel_syllable); }}
        break;
        {te = p;p--;{ found_syllable (vowel_syllable); }}
        break;
-       case 21:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+       case 20:
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (standalone_cluster); }}
        break;
        case 23:
        {te = p;p--;{ found_syllable (standalone_cluster); }}
        break;
        case 23:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (symbol_cluster); }}
        break;
        {te = p;p--;{ found_syllable (symbol_cluster); }}
        break;
-       case 18:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+       case 17:
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (broken_cluster); }}
        break;
        {te = p;p--;{ found_syllable (broken_cluster); }}
        break;
-       case 20:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+       case 19:
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (non_indic_cluster); }}
        break;
        case 1:
        {te = p;p--;{ found_syllable (non_indic_cluster); }}
        break;
        case 1:
-#line 87 "hb-ot-shape-complex-indic-machine.rl"
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
        {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
        break;
        case 3:
        {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
        break;
        case 3:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 84 "hb-ot-shape-complex-indic-machine.rl"
        {{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
        break;
        case 7:
        {{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
        break;
        case 7:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 85 "hb-ot-shape-complex-indic-machine.rl"
        {{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
        break;
        {{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
        break;
-       case 9:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+       case 8:
+#line 86 "hb-ot-shape-complex-indic-machine.rl"
        {{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
        break;
        case 4:
        {{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
        break;
        case 4:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
        {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
        break;
        case 5:
        {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
        break;
        case 5:
@@ -1514,34 +1269,34 @@ _eof_trans:
        }
        }
        break;
        }
        }
        break;
-       case 8:
+       case 22:
 #line 1 "NONE"
        {te = p+1;}
 #line 1 "NONE"
        {te = p+1;}
-#line 87 "hb-ot-shape-complex-indic-machine.rl"
+#line 83 "hb-ot-shape-complex-indic-machine.rl"
        {act = 1;}
        break;
        case 6:
 #line 1 "NONE"
        {te = p+1;}
        {act = 1;}
        break;
        case 6:
 #line 1 "NONE"
        {te = p+1;}
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
        {act = 5;}
        break;
        {act = 5;}
        break;
-       case 13:
+       case 12:
 #line 1 "NONE"
        {te = p+1;}
 #line 1 "NONE"
        {te = p+1;}
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
        {act = 6;}
        break;
        {act = 6;}
        break;
-#line 1536 "hb-ot-shape-complex-indic-machine.hh"
+#line 1291 "hb-ot-shape-complex-indic-machine.hh"
        }
 
 _again:
        switch ( _indic_syllable_machine_to_state_actions[cs] ) {
        }
 
 _again:
        switch ( _indic_syllable_machine_to_state_actions[cs] ) {
-       case 10:
+       case 9:
 #line 1 "NONE"
        {ts = 0;}
        break;
 #line 1 "NONE"
        {ts = 0;}
        break;
-#line 1545 "hb-ot-shape-complex-indic-machine.hh"
+#line 1300 "hb-ot-shape-complex-indic-machine.hh"
        }
 
        if ( ++p != pe )
        }
 
        if ( ++p != pe )
@@ -1557,7 +1312,7 @@ _again:
 
        }
 
 
        }
 
-#line 126 "hb-ot-shape-complex-indic-machine.rl"
+#line 122 "hb-ot-shape-complex-indic-machine.rl"
 
 }
 
 
 }
 
index 86a7ceb..0ea91c0 100644 (file)
@@ -38,7 +38,6 @@
 %%{
 
 # Same order as enum indic_category_t.  Not sure how to avoid duplication.
 %%{
 
 # Same order as enum indic_category_t.  Not sure how to avoid duplication.
-X    = 0;
 C    = 1;
 V    = 2;
 N    = 3;
 C    = 1;
 V    = 2;
 N    = 3;
@@ -47,38 +46,35 @@ ZWNJ = 5;
 ZWJ  = 6;
 M    = 7;
 SM   = 8;
 ZWJ  = 6;
 M    = 7;
 SM   = 8;
-VD   = 9;
 A    = 10;
 PLACEHOLDER = 11;
 DOTTEDCIRCLE = 12;
 RS    = 13;
 A    = 10;
 PLACEHOLDER = 11;
 DOTTEDCIRCLE = 12;
 RS    = 13;
-Coeng = 14;
 Repha = 15;
 Ra    = 16;
 CM    = 17;
 Symbol= 18;
 Repha = 15;
 Ra    = 16;
 CM    = 17;
 Symbol= 18;
+CS    = 19;
 
 c = (C | Ra);                  # is_consonant
 n = ((ZWNJ?.RS)? (N.N?)?);     # is_consonant_modifier
 z = ZWJ|ZWNJ;                  # is_joiner
 
 c = (C | Ra);                  # is_consonant
 n = ((ZWNJ?.RS)? (N.N?)?);     # is_consonant_modifier
 z = ZWJ|ZWNJ;                  # is_joiner
-h = H | Coeng;                 # is_halant_or_coeng
 reph = (Ra H | Repha);         # possible reph
 
 cn = c.ZWJ?.n?;
 forced_rakar = ZWJ H ZWJ Ra;
 symbol = Symbol.N?;
 matra_group = z{0,3}.M.N?.(H | forced_rakar)?;
 reph = (Ra H | Repha);         # possible reph
 
 cn = c.ZWJ?.n?;
 forced_rakar = ZWJ H ZWJ Ra;
 symbol = Symbol.N?;
 matra_group = z{0,3}.M.N?.(H | forced_rakar)?;
-syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}? VD{0,2};
-place_holder = PLACEHOLDER | DOTTEDCIRCLE;
-halant_group = (z?.h.(ZWJ.N?)?);
-final_halant_group = halant_group | h.ZWNJ;
+syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}?;
+halant_group = (z?.H.(ZWJ.N?)?);
+final_halant_group = halant_group | H.ZWNJ;
 medial_group = CM?;
 medial_group = CM?;
-halant_or_matra_group = (final_halant_group | (h.ZWJ)? matra_group{0,4}) (Coeng (cn|V))?;
+halant_or_matra_group = (final_halant_group | (H.ZWJ)? matra_group{0,4});
 
 
 
 
-consonant_syllable =   Repha? (cn.halant_group){0,4} cn medial_group halant_or_matra_group syllable_tail;
+consonant_syllable =   (Repha|CS)? (cn.halant_group){0,4} cn medial_group halant_or_matra_group syllable_tail;
 vowel_syllable =       reph? V.n? (ZWJ | (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail);
 vowel_syllable =       reph? V.n? (ZWJ | (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail);
-standalone_cluster =   (Repha? PLACEHOLDER | reph? DOTTEDCIRCLE).n? (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail;
+standalone_cluster =   ((Repha|CS)? PLACEHOLDER | reph? DOTTEDCIRCLE).n? (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail;
 symbol_cluster =       symbol syllable_tail;
 broken_cluster =       reph? n? (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail;
 other =                        any;
 symbol_cluster =       symbol syllable_tail;
 broken_cluster =       reph? n? (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail;
 other =                        any;
index 5879c3e..867b936 100644 (file)
 #include "hb-ot-shape-private.hh" /* XXX Remove */
 
 
 #include "hb-ot-shape-private.hh" /* XXX Remove */
 
 
+/* buffer var allocations */
+#define indic_category() complex_var_u8_0() /* indic_category_t */
+#define indic_position() complex_var_u8_1() /* indic_position_t */
+
+
 #define INDIC_TABLE_ELEMENT_TYPE uint16_t
 
 /* Cateories used in the OpenType spec:
 #define INDIC_TABLE_ELEMENT_TYPE uint16_t
 
 /* Cateories used in the OpenType spec:
@@ -51,7 +56,7 @@ enum indic_category_t {
   OT_ZWJ = 6,
   OT_M = 7,
   OT_SM = 8,
   OT_ZWJ = 6,
   OT_M = 7,
   OT_SM = 8,
-  OT_VD = 9,
+  /* OT_VD = 9, UNUSED; we use OT_A instead. */
   OT_A = 10,
   OT_PLACEHOLDER = 11,
   OT_DOTTEDCIRCLE = 12,
   OT_A = 10,
   OT_PLACEHOLDER = 11,
   OT_DOTTEDCIRCLE = 12,
@@ -60,7 +65,8 @@ enum indic_category_t {
   OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
   OT_Ra = 16,
   OT_CM = 17,  /* Consonant-Medial. */
   OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
   OT_Ra = 16,
   OT_CM = 17,  /* Consonant-Medial. */
-  OT_Symbol = 18 /* Avagraha, etc that take marks (SM,A,VD). */
+  OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */
+  OT_CS = 19
 };
 
 #define MEDIAL_FLAGS (FLAG (OT_CM))
 };
 
 #define MEDIAL_FLAGS (FLAG (OT_CM))
@@ -70,36 +76,35 @@ enum indic_category_t {
  * We treat Vowels and placeholders as if they were consonants.  This is safe because Vowels
  * cannot happen in a consonant syllable.  The plus side however is, we can call the
  * consonant syllable logic from the vowel syllable function and get it all right! */
  * We treat Vowels and placeholders as if they were consonants.  This is safe because Vowels
  * cannot happen in a consonant syllable.  The plus side however is, we can call the
  * consonant syllable logic from the vowel syllable function and get it all right! */
-#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE))
+#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CS) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE))
 #define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ))
 #define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ))
-#define HALANT_OR_COENG_FLAGS (FLAG (OT_H) | FLAG (OT_Coeng))
 
 
 /* Visual positions in a syllable from left to right. */
 enum indic_position_t {
 
 
 /* Visual positions in a syllable from left to right. */
 enum indic_position_t {
-  POS_START,
+  POS_START = 0,
 
 
-  POS_RA_TO_BECOME_REPH,
-  POS_PRE_M,
-  POS_PRE_C,
+  POS_RA_TO_BECOME_REPH = 1,
+  POS_PRE_M = 2,
+  POS_PRE_C = 3,
 
 
-  POS_BASE_C,
-  POS_AFTER_MAIN,
+  POS_BASE_C = 4,
+  POS_AFTER_MAIN = 5,
 
 
-  POS_ABOVE_C,
+  POS_ABOVE_C = 6,
 
 
-  POS_BEFORE_SUB,
-  POS_BELOW_C,
-  POS_AFTER_SUB,
+  POS_BEFORE_SUB = 7,
+  POS_BELOW_C = 8,
+  POS_AFTER_SUB = 9,
 
 
-  POS_BEFORE_POST,
-  POS_POST_C,
-  POS_AFTER_POST,
+  POS_BEFORE_POST = 10,
+  POS_POST_C = 11,
+  POS_AFTER_POST = 12,
 
 
-  POS_FINAL_C,
-  POS_SMVD,
+  POS_FINAL_C = 13,
+  POS_SMVD = 14,
 
 
-  POS_END
+  POS_END = 15
 };
 
 /* Categories used in IndicSyllabicCategory.txt from UCD. */
 };
 
 /* Categories used in IndicSyllabicCategory.txt from UCD. */
@@ -121,8 +126,8 @@ enum indic_syllabic_category_t {
   INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED           = OT_X, /* Don't care. */
   INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED          = OT_CM,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA   = OT_N,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED           = OT_X, /* Don't care. */
   INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED          = OT_CM,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA   = OT_N,
-  INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER       = OT_Repha, /* TODO */
-  INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK              = OT_SM,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER       = OT_CS,
+  INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK              = OT_SM, /* https://github.com/harfbuzz/harfbuzz/issues/552 */
   INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER            = OT_Coeng,
   INDIC_SYLLABIC_CATEGORY_JOINER                       = OT_ZWJ,
   INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER             = OT_X,
   INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER            = OT_Coeng,
   INDIC_SYLLABIC_CATEGORY_JOINER                       = OT_ZWJ,
   INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER             = OT_X,
@@ -132,7 +137,7 @@ enum indic_syllabic_category_t {
   INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER                        = OT_PLACEHOLDER, /* Don't care. */
   INDIC_SYLLABIC_CATEGORY_PURE_KILLER                  = OT_M, /* Is like a vowel matra. */
   INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER             = OT_RS,
   INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER                        = OT_PLACEHOLDER, /* Don't care. */
   INDIC_SYLLABIC_CATEGORY_PURE_KILLER                  = OT_M, /* Is like a vowel matra. */
   INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER             = OT_RS,
-  INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER            = OT_M, /* Misc Khmer signs. */
+  INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER            = OT_SM,
   INDIC_SYLLABIC_CATEGORY_TONE_LETTER                  = OT_X,
   INDIC_SYLLABIC_CATEGORY_TONE_MARK                    = OT_N,
   INDIC_SYLLABIC_CATEGORY_VIRAMA                       = OT_H,
   INDIC_SYLLABIC_CATEGORY_TONE_LETTER                  = OT_X,
   INDIC_SYLLABIC_CATEGORY_TONE_MARK                    = OT_N,
   INDIC_SYLLABIC_CATEGORY_VIRAMA                       = OT_H,
@@ -186,4 +191,211 @@ enum indic_matra_category_t {
 HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u);
 
 HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u);
 
+
+static inline bool
+is_one_of (const hb_glyph_info_t &info, unsigned int flags)
+{
+  /* If it ligated, all bets are off. */
+  if (_hb_glyph_info_ligated (&info)) return false;
+  return !!(FLAG_UNSAFE (info.indic_category()) & flags);
+}
+
+static inline bool
+is_joiner (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, JOINER_FLAGS);
+}
+
+static inline bool
+is_consonant (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, CONSONANT_FLAGS);
+}
+
+static inline bool
+is_halant (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, FLAG (OT_H));
+}
+
+#define IN_HALF_BLOCK(u, Base) (((u) & ~0x7Fu) == (Base))
+
+#define IS_DEVA(u) (IN_HALF_BLOCK (u, 0x0900u))
+#define IS_BENG(u) (IN_HALF_BLOCK (u, 0x0980u))
+#define IS_GURU(u) (IN_HALF_BLOCK (u, 0x0A00u))
+#define IS_GUJR(u) (IN_HALF_BLOCK (u, 0x0A80u))
+#define IS_ORYA(u) (IN_HALF_BLOCK (u, 0x0B00u))
+#define IS_TAML(u) (IN_HALF_BLOCK (u, 0x0B80u))
+#define IS_TELU(u) (IN_HALF_BLOCK (u, 0x0C00u))
+#define IS_KNDA(u) (IN_HALF_BLOCK (u, 0x0C80u))
+#define IS_MLYM(u) (IN_HALF_BLOCK (u, 0x0D00u))
+#define IS_SINH(u) (IN_HALF_BLOCK (u, 0x0D80u))
+
+
+#define MATRA_POS_LEFT(u)      POS_PRE_M
+#define MATRA_POS_RIGHT(u)     ( \
+                                 IS_DEVA(u) ? POS_AFTER_SUB  : \
+                                 IS_BENG(u) ? POS_AFTER_POST : \
+                                 IS_GURU(u) ? POS_AFTER_POST : \
+                                 IS_GUJR(u) ? POS_AFTER_POST : \
+                                 IS_ORYA(u) ? POS_AFTER_POST : \
+                                 IS_TAML(u) ? POS_AFTER_POST : \
+                                 IS_TELU(u) ? (u <= 0x0C42u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
+                                 IS_KNDA(u) ? (u < 0x0CC3u || u > 0xCD6u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
+                                 IS_MLYM(u) ? POS_AFTER_POST : \
+                                 IS_SINH(u) ? POS_AFTER_SUB  : \
+                                 /*default*/  POS_AFTER_SUB    \
+                               )
+#define MATRA_POS_TOP(u)       ( /* BENG and MLYM don't have top matras. */ \
+                                 IS_DEVA(u) ? POS_AFTER_SUB  : \
+                                 IS_GURU(u) ? POS_AFTER_POST : /* Deviate from spec */ \
+                                 IS_GUJR(u) ? POS_AFTER_SUB  : \
+                                 IS_ORYA(u) ? POS_AFTER_MAIN : \
+                                 IS_TAML(u) ? POS_AFTER_SUB  : \
+                                 IS_TELU(u) ? POS_BEFORE_SUB : \
+                                 IS_KNDA(u) ? POS_BEFORE_SUB : \
+                                 IS_SINH(u) ? POS_AFTER_SUB  : \
+                                 /*default*/  POS_AFTER_SUB    \
+                               )
+#define MATRA_POS_BOTTOM(u)    ( \
+                                 IS_DEVA(u) ? POS_AFTER_SUB  : \
+                                 IS_BENG(u) ? POS_AFTER_SUB  : \
+                                 IS_GURU(u) ? POS_AFTER_POST : \
+                                 IS_GUJR(u) ? POS_AFTER_POST : \
+                                 IS_ORYA(u) ? POS_AFTER_SUB  : \
+                                 IS_TAML(u) ? POS_AFTER_POST : \
+                                 IS_TELU(u) ? POS_BEFORE_SUB : \
+                                 IS_KNDA(u) ? POS_BEFORE_SUB : \
+                                 IS_MLYM(u) ? POS_AFTER_POST : \
+                                 IS_SINH(u) ? POS_AFTER_SUB  : \
+                                 /*default*/  POS_AFTER_SUB    \
+                               )
+
+static inline indic_position_t
+matra_position_indic (hb_codepoint_t u, indic_position_t side)
+{
+  switch ((int) side)
+  {
+    case POS_PRE_C:    return MATRA_POS_LEFT (u);
+    case POS_POST_C:   return MATRA_POS_RIGHT (u);
+    case POS_ABOVE_C:  return MATRA_POS_TOP (u);
+    case POS_BELOW_C:  return MATRA_POS_BOTTOM (u);
+  };
+  return side;
+}
+
+/* XXX
+ * This is a hack for now.  We should move this data into the main Indic table.
+ * Or completely remove it and just check in the tables.
+ */
+static const hb_codepoint_t ra_chars[] = {
+  0x0930u, /* Devanagari */
+  0x09B0u, /* Bengali */
+  0x09F0u, /* Bengali */
+  0x0A30u, /* Gurmukhi */      /* No Reph */
+  0x0AB0u, /* Gujarati */
+  0x0B30u, /* Oriya */
+  0x0BB0u, /* Tamil */         /* No Reph */
+  0x0C30u, /* Telugu */                /* Reph formed only with ZWJ */
+  0x0CB0u, /* Kannada */
+  0x0D30u, /* Malayalam */     /* No Reph, Logical Repha */
+
+  0x0DBBu, /* Sinhala */               /* Reph formed only with ZWJ */
+};
+
+static inline bool
+is_ra (hb_codepoint_t u)
+{
+  for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++)
+    if (u == ra_chars[i])
+      return true;
+  return false;
+}
+
+static inline void
+set_indic_properties (hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  unsigned int type = hb_indic_get_categories (u);
+  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
+  indic_position_t pos = (indic_position_t) (type >> 8);
+
+
+  /*
+   * Re-assign category
+   */
+
+  /* The following act more like the Bindus. */
+  if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x0953u, 0x0954u)))
+    cat = OT_SM;
+  /* The following act like consonants. */
+  else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x0A72u, 0x0A73u,
+                                     0x1CF5u, 0x1CF6u)))
+    cat = OT_C;
+  /* TODO: The following should only be allowed after a Visarga.
+   * For now, just treat them like regular tone marks. */
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x1CE2u, 0x1CE8u)))
+    cat = OT_A;
+  /* TODO: The following should only be allowed after some of
+   * the nasalization marks, maybe only for U+1CE9..U+1CF1.
+   * For now, just treat them like tone marks. */
+  else if (unlikely (u == 0x1CEDu))
+    cat = OT_A;
+  /* The following take marks in standalone clusters, similar to Avagraha. */
+  else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0xA8F2u, 0xA8F7u,
+                                     0x1CE9u, 0x1CECu,
+                                     0x1CEEu, 0x1CF1u)))
+  {
+    cat = OT_Symbol;
+    static_assert (((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol), "");
+  }
+  else if (unlikely (u == 0x0A51u))
+  {
+    /* https://github.com/harfbuzz/harfbuzz/issues/524 */
+    cat = OT_M;
+    pos = POS_BELOW_C;
+  }
+
+  /* According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil,
+   * so the Indic shaper needs to know their categories. */
+  else if (unlikely (u == 0x11301u || u == 0x11303u)) cat = OT_SM;
+  else if (unlikely (u == 0x1133cu)) cat = OT_N;
+
+  else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */
+
+  else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */
+  else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u)))
+                                   cat = OT_PLACEHOLDER;
+  else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
+
+
+  /*
+   * Re-assign position.
+   */
+
+  if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS))
+  {
+    pos = POS_BASE_C;
+    if (is_ra (u))
+      cat = OT_Ra;
+  }
+  else if (cat == OT_M)
+  {
+    pos = matra_position_indic (u, pos);
+  }
+  else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) /* | FLAG (OT_VD) */ | FLAG (OT_A) | FLAG (OT_Symbol))))
+  {
+    pos = POS_SMVD;
+  }
+
+  if (unlikely (u == 0x0B01u)) pos = POS_BEFORE_SUB; /* Oriya Bindu is BeforeSub in the spec. */
+
+
+
+  info.indic_category() = cat;
+  info.indic_position() = pos;
+}
+
+
 #endif /* HB_OT_SHAPE_COMPLEX_INDIC_PRIVATE_HH */
 #endif /* HB_OT_SHAPE_COMPLEX_INDIC_PRIVATE_HH */
index e10a4d2..867cfb3 100644 (file)
@@ -6,61 +6,62 @@
  *
  * on files with these headers:
  *
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-9.0.0.txt
- * # Date: 2016-05-21, 02:46:00 GMT [RP]
- * # IndicPositionalCategory-9.0.0.txt
- * # Date: 2016-02-25, 00:48:00 GMT [RP]
- * # Blocks-9.0.0.txt
- * # Date: 2016-02-05, 23:48:00 GMT [KW]
+ * # IndicSyllabicCategory-10.0.0.txt
+ * # Date: 2017-05-31, 01:07:00 GMT [KW, RP]
+ * # IndicPositionalCategory-10.0.0.txt
+ * # Date: 2017-05-31, 01:07:00 GMT [RP]
+ * # Blocks-10.0.0.txt
+ * # Date: 2017-04-12, 17:30:00 GMT [KW]
  */
 
 #include "hb-ot-shape-complex-indic-private.hh"
 
 
 #define ISC_A  INDIC_SYLLABIC_CATEGORY_AVAGRAHA                /*  15 chars; Avagraha */
  */
 
 #include "hb-ot-shape-complex-indic-private.hh"
 
 
 #define ISC_A  INDIC_SYLLABIC_CATEGORY_AVAGRAHA                /*  15 chars; Avagraha */
-#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU                   /*  67 chars; Bindu */
+#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU                   /*  80 chars; Bindu */
 #define ISC_BJN        INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER   /*  20 chars; Brahmi_Joining_Number */
 #define ISC_BJN        INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER   /*  20 chars; Brahmi_Joining_Number */
-#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK       /*  53 chars; Cantillation_Mark */
-#define ISC_C  INDIC_SYLLABIC_CATEGORY_CONSONANT               /* 1907 chars; Consonant */
+#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK       /*  57 chars; Cantillation_Mark */
+#define ISC_C  INDIC_SYLLABIC_CATEGORY_CONSONANT               /* 2024 chars; Consonant */
 #define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD          /*  10 chars; Consonant_Dead */
 #define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD          /*  10 chars; Consonant_Dead */
-#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL         /*  62 chars; Consonant_Final */
+#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL         /*  68 chars; Consonant_Final */
 #define ISC_CHL        INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER   /*   5 chars; Consonant_Head_Letter */
 #define ISC_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER        /*   2 chars; Consonant_Killer */
 #define ISC_CHL        INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER   /*   5 chars; Consonant_Head_Letter */
 #define ISC_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER        /*   2 chars; Consonant_Killer */
-#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL        /*  22 chars; Consonant_Medial */
-#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER   /*  16 chars; Consonant_Placeholder */
-#define ISC_CPR        INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA       /*   1 chars; Consonant_Preceding_Repha */
-#define ISC_CPrf       INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED      /*   2 chars; Consonant_Prefixed */
-#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED     /*  90 chars; Consonant_Subjoined */
-#define ISC_CSR        INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA      /*   4 chars; Consonant_Succeeding_Repha */
+#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL        /*  27 chars; Consonant_Medial */
+#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER   /*  18 chars; Consonant_Placeholder */
+#define ISC_CPR        INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA       /*   2 chars; Consonant_Preceding_Repha */
+#define ISC_CPrf       INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED      /*   7 chars; Consonant_Prefixed */
+#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED     /*  95 chars; Consonant_Subjoined */
+#define ISC_CSR        INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA      /*   5 chars; Consonant_Succeeding_Repha */
 #define ISC_CWS        INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER  /*   4 chars; Consonant_With_Stacker */
 #define ISC_CWS        INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER  /*   4 chars; Consonant_With_Stacker */
-#define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK         /*   2 chars; Gemination_Mark */
-#define ISC_IS INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER       /*   7 chars; Invisible_Stacker */
+#define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK         /*   3 chars; Gemination_Mark */
+#define ISC_IS INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER       /*  10 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_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                   /*  24 chars; Nukta */
-#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER                  /* 459 chars; Number */
+#define ISC_N  INDIC_SYLLABIC_CATEGORY_NUKTA                   /*  28 chars; Nukta */
+#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER                  /* 469 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_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             /*  16 chars; Pure_Killer */
+#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER             /*  21 chars; Pure_Killer */
 #define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER        /*   2 chars; Register_Shifter */
 #define ISC_SM INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER       /*  22 chars; Syllable_Modifier */
 #define ISC_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER             /*   7 chars; Tone_Letter */
 #define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK               /*  42 chars; Tone_Mark */
 #define ISC_V  INDIC_SYLLABIC_CATEGORY_VIRAMA                  /*  24 chars; Virama */
 #define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER        /*   2 chars; Register_Shifter */
 #define ISC_SM INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER       /*  22 chars; Syllable_Modifier */
 #define ISC_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER             /*   7 chars; Tone_Letter */
 #define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK               /*  42 chars; Tone_Mark */
 #define ISC_V  INDIC_SYLLABIC_CATEGORY_VIRAMA                  /*  24 chars; Virama */
-#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA                 /*  31 chars; Visarga */
+#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA                 /*  34 chars; Visarga */
 #define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL                   /*  30 chars; Vowel */
 #define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL                   /*  30 chars; Vowel */
-#define ISC_M  INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT         /* 602 chars; Vowel_Dependent */
-#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT       /* 431 chars; Vowel_Independent */
+#define ISC_M  INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT         /* 633 chars; Vowel_Dependent */
+#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT       /* 443 chars; Vowel_Independent */
 
 
-#define IMC_B  INDIC_MATRA_CATEGORY_BOTTOM                     /* 300 chars; Bottom */
+#define IMC_B  INDIC_MATRA_CATEGORY_BOTTOM                     /* 330 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                       /*  57 chars; Left */
 #define IMC_LR INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT             /*  21 chars; Left_And_Right */
 #define IMC_x  INDIC_MATRA_CATEGORY_NOT_APPLICABLE             /*   1 chars; Not_Applicable */
 #define IMC_O  INDIC_MATRA_CATEGORY_OVERSTRUCK                 /*  10 chars; Overstruck */
 #define IMC_BR INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT           /*   2 chars; Bottom_And_Right */
 #define IMC_L  INDIC_MATRA_CATEGORY_LEFT                       /*  57 chars; Left */
 #define IMC_LR INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT             /*  21 chars; Left_And_Right */
 #define IMC_x  INDIC_MATRA_CATEGORY_NOT_APPLICABLE             /*   1 chars; Not_Applicable */
 #define IMC_O  INDIC_MATRA_CATEGORY_OVERSTRUCK                 /*  10 chars; Overstruck */
-#define IMC_R  INDIC_MATRA_CATEGORY_RIGHT                      /* 258 chars; Right */
-#define IMC_T  INDIC_MATRA_CATEGORY_TOP                        /* 342 chars; Top */
+#define IMC_R  INDIC_MATRA_CATEGORY_RIGHT                      /* 262 chars; Right */
+#define IMC_T  INDIC_MATRA_CATEGORY_TOP                        /* 380 chars; Top */
 #define IMC_TB INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM             /*  10 chars; Top_And_Bottom */
 #define IMC_TBR        INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT   /*   1 chars; Top_And_Bottom_And_Right */
 #define IMC_TL INDIC_MATRA_CATEGORY_TOP_AND_LEFT               /*   6 chars; Top_And_Left */
 #define IMC_TB INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM             /*  10 chars; Top_And_Bottom */
 #define IMC_TBR        INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT   /*   1 chars; Top_And_Bottom_And_Right */
 #define IMC_TL INDIC_MATRA_CATEGORY_TOP_AND_LEFT               /*   6 chars; Top_And_Left */
@@ -133,7 +134,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 09E0 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 09E8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 09F0 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 09E0 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 09E8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 09F0 */  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 09F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 09F8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(Bi,x),  _(x,x),  _(x,x),  _(x,x),
 
   /* Gurmukhi */
 
 
   /* Gurmukhi */
 
@@ -171,7 +172,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 0AE0 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0AE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 0AF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* 0AE0 */ _(VI,x), _(VI,x),  _(M,B),  _(M,B),  _(x,x),  _(x,x), _(Nd,x), _(Nd,x),
   /* 0AE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* 0AF0 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* 0AF8 */  _(x,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* 0AF8 */  _(x,x),  _(C,x), _(Ca,T), _(Ca,T), _(Ca,T),  _(N,T),  _(N,T),  _(N,T),
 
   /* Oriya */
 
 
   /* Oriya */
 
@@ -251,14 +252,14 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 
   /* Malayalam */
 
 
   /* Malayalam */
 
-  /* 0D00 */  _(x,x), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,x), _(VI,x), _(VI,x), _(VI,x),
+  /* 0D00 */ _(Bi,T), _(Bi,T), _(Bi,R), _(Vs,R),  _(x,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),
   /* 0D20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D28 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,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),
   /* 0D20 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D28 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
   /* 0D30 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* 0D38 */  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(A,x),  _(M,R),  _(M,R),
+  /* 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),
   /* 0D50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(CD,x), _(CD,x), _(CD,x),  _(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),
   /* 0D50 */  _(x,x),  _(x,x),  _(x,x),  _(x,x), _(CD,x), _(CD,x), _(CD,x),  _(M,R),
@@ -341,7 +342,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B),
   /* 1CE0 */ _(Ca,T), _(Ca,R),  _(x,O),  _(x,O),  _(x,O),  _(x,O),  _(x,O),  _(x,O),
   /* 1CE8 */  _(x,O),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,B),  _(x,x),  _(x,x),
   /* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B),
   /* 1CE0 */ _(Ca,T), _(Ca,R),  _(x,O),  _(x,O),  _(x,O),  _(x,O),  _(x,O),  _(x,O),
   /* 1CE8 */  _(x,O),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,B),  _(x,x),  _(x,x),
-  /* 1CF0 */  _(x,x),  _(x,x), _(Vs,x), _(Vs,x), _(Ca,T),  _(x,x),  _(x,x),  _(x,x),
+  /* 1CF0 */  _(x,x),  _(x,x), _(Vs,x), _(Vs,x), _(Ca,T),  _(x,x),  _(x,x), _(Ca,R),
   /* 1CF8 */ _(Ca,x), _(Ca,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
 #define indic_offset_0x2008u 1656
   /* 1CF8 */ _(Ca,x), _(Ca,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
 #define indic_offset_0x2008u 1656
@@ -368,7 +369,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
 
   /* A8E0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
   /* A8E8 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
 
   /* A8E0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
   /* A8E8 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
-  /* A8F0 */ _(Ca,T), _(Ca,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
+  /* A8F0 */ _(Ca,T), _(Ca,T), _(Bi,x), _(Bi,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
 #define indic_offset_0xa9e0u 1720
 
 
 #define indic_offset_0xa9e0u 1720
 
@@ -390,7 +391,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* AA70 */  _(x,x),  _(C,x),  _(C,x),  _(C,x), _(CP,x), _(CP,x), _(CP,x),  _(x,x),
   /* AA78 */  _(x,x),  _(x,x),  _(C,x), _(TM,R), _(TM,T), _(TM,R),  _(C,x),  _(C,x),
 
   /* AA70 */  _(x,x),  _(C,x),  _(C,x),  _(C,x), _(CP,x), _(CP,x), _(CP,x),  _(x,x),
   /* AA78 */  _(x,x),  _(x,x),  _(C,x), _(TM,R), _(TM,T), _(TM,R),  _(C,x),  _(C,x),
 
-}; /* Table items: 1784; occupancy: 69% */
+}; /* Table items: 1784; occupancy: 70% */
 
 INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u)
 
 INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u)
@@ -398,35 +399,28 @@ hb_indic_get_categories (hb_codepoint_t u)
   switch (u >> 12)
   {
     case 0x0u:
   switch (u >> 12)
   {
     case 0x0u:
-      if (hb_in_range (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
-      if (hb_in_range (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u];
-      if (hb_in_range (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
       if (unlikely (u == 0x00A0u)) return _(CP,x);
       if (unlikely (u == 0x00A0u)) return _(CP,x);
+      if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
       break;
 
     case 0x1u:
       break;
 
     case 0x1u:
-      if (hb_in_range (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u];
-      if (hb_in_range (u, 0x1780u, 0x17EFu)) return indic_table[u - 0x1780u + indic_offset_0x1780u];
-      if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1780u, 0x17EFu)) return indic_table[u - 0x1780u + indic_offset_0x1780u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1CD0u, 0x1CFFu)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
       break;
 
     case 0x2u:
       break;
 
     case 0x2u:
-      if (hb_in_range (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
-      if (hb_in_range (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u];
       if (unlikely (u == 0x25CCu)) return _(CP,x);
       if (unlikely (u == 0x25CCu)) return _(CP,x);
+      if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u];
       break;
 
     case 0xAu:
       break;
 
     case 0xAu:
-      if (hb_in_range (u, 0xA8E0u, 0xA8F7u)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
-      if (hb_in_range (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u];
-      if (hb_in_range (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u];
-      break;
-
-    case 0x11u:
-      // According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil,
-      // so the Indic shaper needs to know their categories.
-      if (unlikely (u == 0x11303)) return _(Vs,R);
-      if (unlikely (u == 0x1133c)) return _(N,B);
+      if (hb_in_range<hb_codepoint_t> (u, 0xA8E0u, 0xA8F7u)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u];
       break;
 
     default:
       break;
 
     default:
@@ -474,6 +468,7 @@ hb_indic_get_categories (hb_codepoint_t u)
 #undef ISC_VI
 
 #undef IMC_B
 #undef ISC_VI
 
 #undef IMC_B
+#undef IMC_BL
 #undef IMC_BR
 #undef IMC_L
 #undef IMC_LR
 #undef IMC_BR
 #undef IMC_L
 #undef IMC_LR
index ec12ce6..32ad86a 100644 (file)
 #include "hb-ot-shape-complex-indic-private.hh"
 #include "hb-ot-layout-private.hh"
 
 #include "hb-ot-shape-complex-indic-private.hh"
 #include "hb-ot-layout-private.hh"
 
-/* buffer var allocations */
-#define indic_category() complex_var_u8_0() /* indic_category_t */
-#define indic_position() complex_var_u8_1() /* indic_position_t */
-
 
 /*
  * Indic shaper.
  */
 
 
 
 /*
  * Indic shaper.
  */
 
 
-#define IN_HALF_BLOCK(u, Base) (((u) & ~0x7Fu) == (Base))
-
-#define IS_DEVA(u) (IN_HALF_BLOCK (u, 0x0900u))
-#define IS_BENG(u) (IN_HALF_BLOCK (u, 0x0980u))
-#define IS_GURU(u) (IN_HALF_BLOCK (u, 0x0A00u))
-#define IS_GUJR(u) (IN_HALF_BLOCK (u, 0x0A80u))
-#define IS_ORYA(u) (IN_HALF_BLOCK (u, 0x0B00u))
-#define IS_TAML(u) (IN_HALF_BLOCK (u, 0x0B80u))
-#define IS_TELU(u) (IN_HALF_BLOCK (u, 0x0C00u))
-#define IS_KNDA(u) (IN_HALF_BLOCK (u, 0x0C80u))
-#define IS_MLYM(u) (IN_HALF_BLOCK (u, 0x0D00u))
-#define IS_SINH(u) (IN_HALF_BLOCK (u, 0x0D80u))
-#define IS_KHMR(u) (IN_HALF_BLOCK (u, 0x1780u))
-
-
-#define MATRA_POS_LEFT(u)      POS_PRE_M
-#define MATRA_POS_RIGHT(u)     ( \
-                                 IS_DEVA(u) ? POS_AFTER_SUB  : \
-                                 IS_BENG(u) ? POS_AFTER_POST : \
-                                 IS_GURU(u) ? POS_AFTER_POST : \
-                                 IS_GUJR(u) ? POS_AFTER_POST : \
-                                 IS_ORYA(u) ? POS_AFTER_POST : \
-                                 IS_TAML(u) ? POS_AFTER_POST : \
-                                 IS_TELU(u) ? (u <= 0x0C42u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
-                                 IS_KNDA(u) ? (u < 0x0CC3u || u > 0xCD6u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
-                                 IS_MLYM(u) ? POS_AFTER_POST : \
-                                 IS_SINH(u) ? POS_AFTER_SUB  : \
-                                 IS_KHMR(u) ? POS_AFTER_POST : \
-                                 /*default*/  POS_AFTER_SUB    \
-                               )
-#define MATRA_POS_TOP(u)       ( /* BENG and MLYM don't have top matras. */ \
-                                 IS_DEVA(u) ? POS_AFTER_SUB  : \
-                                 IS_GURU(u) ? POS_AFTER_POST : /* Deviate from spec */ \
-                                 IS_GUJR(u) ? POS_AFTER_SUB  : \
-                                 IS_ORYA(u) ? POS_AFTER_MAIN : \
-                                 IS_TAML(u) ? POS_AFTER_SUB  : \
-                                 IS_TELU(u) ? POS_BEFORE_SUB : \
-                                 IS_KNDA(u) ? POS_BEFORE_SUB : \
-                                 IS_SINH(u) ? POS_AFTER_SUB  : \
-                                 IS_KHMR(u) ? POS_AFTER_POST : \
-                                 /*default*/  POS_AFTER_SUB    \
-                               )
-#define MATRA_POS_BOTTOM(u)    ( \
-                                 IS_DEVA(u) ? POS_AFTER_SUB  : \
-                                 IS_BENG(u) ? POS_AFTER_SUB  : \
-                                 IS_GURU(u) ? POS_AFTER_POST : \
-                                 IS_GUJR(u) ? POS_AFTER_POST : \
-                                 IS_ORYA(u) ? POS_AFTER_SUB  : \
-                                 IS_TAML(u) ? POS_AFTER_POST : \
-                                 IS_TELU(u) ? POS_BEFORE_SUB : \
-                                 IS_KNDA(u) ? POS_BEFORE_SUB : \
-                                 IS_MLYM(u) ? POS_AFTER_POST : \
-                                 IS_SINH(u) ? POS_AFTER_SUB  : \
-                                 IS_KHMR(u) ? POS_AFTER_POST : \
-                                 /*default*/  POS_AFTER_SUB    \
-                               )
-
-static inline indic_position_t
-matra_position (hb_codepoint_t u, indic_position_t side)
-{
-  switch ((int) side)
-  {
-    case POS_PRE_C:    return MATRA_POS_LEFT (u);
-    case POS_POST_C:   return MATRA_POS_RIGHT (u);
-    case POS_ABOVE_C:  return MATRA_POS_TOP (u);
-    case POS_BELOW_C:  return MATRA_POS_BOTTOM (u);
-  };
-  return side;
-}
-
-/* XXX
- * This is a hack for now.  We should move this data into the main Indic table.
- * Or completely remove it and just check in the tables.
- */
-static const hb_codepoint_t ra_chars[] = {
-  0x0930u, /* Devanagari */
-  0x09B0u, /* Bengali */
-  0x09F0u, /* Bengali */
-  0x0A30u, /* Gurmukhi */      /* No Reph */
-  0x0AB0u, /* Gujarati */
-  0x0B30u, /* Oriya */
-  0x0BB0u, /* Tamil */         /* No Reph */
-  0x0C30u, /* Telugu */                /* Reph formed only with ZWJ */
-  0x0CB0u, /* Kannada */
-  0x0D30u, /* Malayalam */     /* No Reph, Logical Repha */
-
-  0x0DBBu, /* Sinhala */               /* Reph formed only with ZWJ */
-
-  0x179Au, /* Khmer */         /* No Reph, Visual Repha */
-};
-
-static inline bool
-is_ra (hb_codepoint_t u)
-{
-  for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++)
-    if (u == ra_chars[i])
-      return true;
-  return false;
-}
-
-static inline bool
-is_one_of (const hb_glyph_info_t &info, unsigned int flags)
-{
-  /* If it ligated, all bets are off. */
-  if (_hb_glyph_info_ligated (&info)) return false;
-  return !!(FLAG_SAFE (info.indic_category()) & flags);
-}
-
-static inline bool
-is_joiner (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, JOINER_FLAGS);
-}
-
-static inline bool
-is_consonant (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, CONSONANT_FLAGS);
-}
-
-static inline bool
-is_halant_or_coeng (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, HALANT_OR_COENG_FLAGS);
-}
-
-static inline void
-set_indic_properties (hb_glyph_info_t &info)
-{
-  hb_codepoint_t u = info.codepoint;
-  unsigned int type = hb_indic_get_categories (u);
-  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
-  indic_position_t pos = (indic_position_t) (type >> 8);
-
-
-  /*
-   * Re-assign category
-   */
-
-  /* The following act more like the Bindus. */
-  if (unlikely (hb_in_range (u, 0x0953u, 0x0954u)))
-    cat = OT_SM;
-  /* The following act like consonants. */
-  else if (unlikely (hb_in_ranges (u, 0x0A72u, 0x0A73u,
-                                     0x1CF5u, 0x1CF6u)))
-    cat = OT_C;
-  /* TODO: The following should only be allowed after a Visarga.
-   * For now, just treat them like regular tone marks. */
-  else if (unlikely (hb_in_range (u, 0x1CE2u, 0x1CE8u)))
-    cat = OT_A;
-  /* TODO: The following should only be allowed after some of
-   * the nasalization marks, maybe only for U+1CE9..U+1CF1.
-   * For now, just treat them like tone marks. */
-  else if (unlikely (u == 0x1CEDu))
-    cat = OT_A;
-  /* The following take marks in standalone clusters, similar to Avagraha. */
-  else if (unlikely (hb_in_ranges (u, 0xA8F2u, 0xA8F7u,
-                                     0x1CE9u, 0x1CECu,
-                                     0x1CEEu, 0x1CF1u)))
-  {
-    cat = OT_Symbol;
-    ASSERT_STATIC ((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol);
-  }
-  else if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
-  else if (unlikely (hb_in_range (u, 0x2010u, 0x2011u)))
-                                   cat = OT_PLACEHOLDER;
-  else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
-
-
-  /*
-   * Re-assign position.
-   */
-
-  if ((FLAG_SAFE (cat) & CONSONANT_FLAGS))
-  {
-    pos = POS_BASE_C;
-    if (is_ra (u))
-      cat = OT_Ra;
-  }
-  else if (cat == OT_M)
-  {
-    pos = matra_position (u, pos);
-  }
-  else if ((FLAG_SAFE (cat) & (FLAG (OT_SM) | FLAG (OT_VD) | FLAG (OT_A) | FLAG (OT_Symbol))))
-  {
-    pos = POS_SMVD;
-  }
-
-  if (unlikely (u == 0x0B01u)) pos = POS_BEFORE_SUB; /* Oriya Bindu is BeforeSub in the spec. */
-
-
-
-  info.indic_category() = cat;
-  info.indic_position() = pos;
-}
-
-/*
- * Things above this line should ideally be moved to the Indic table itself.
- */
-
-
 /*
  * Indic configurations.  Note that we do not want to keep every single script-specific
  * behavior in these tables necessarily.  This should mainly be used for per-script
 /*
  * Indic configurations.  Note that we do not want to keep every single script-specific
  * behavior in these tables necessarily.  This should mainly be used for per-script
@@ -247,7 +42,6 @@ set_indic_properties (hb_glyph_info_t &info)
  */
 
 enum base_position_t {
  */
 
 enum base_position_t {
-  BASE_POS_FIRST,
   BASE_POS_LAST_SINHALA,
   BASE_POS_LAST
 };
   BASE_POS_LAST_SINHALA,
   BASE_POS_LAST
 };
@@ -256,13 +50,11 @@ enum reph_position_t {
   REPH_POS_BEFORE_SUB  = POS_BEFORE_SUB,
   REPH_POS_AFTER_SUB   = POS_AFTER_SUB,
   REPH_POS_BEFORE_POST = POS_BEFORE_POST,
   REPH_POS_BEFORE_SUB  = POS_BEFORE_SUB,
   REPH_POS_AFTER_SUB   = POS_AFTER_SUB,
   REPH_POS_BEFORE_POST = POS_BEFORE_POST,
-  REPH_POS_AFTER_POST  = POS_AFTER_POST,
-  REPH_POS_DONT_CARE   = POS_RA_TO_BECOME_REPH
+  REPH_POS_AFTER_POST  = POS_AFTER_POST
 };
 enum reph_mode_t {
   REPH_MODE_IMPLICIT,  /* Reph formed out of initial Ra,H sequence. */
   REPH_MODE_EXPLICIT,  /* Reph formed out of initial Ra,H,ZWJ sequence. */
 };
 enum reph_mode_t {
   REPH_MODE_IMPLICIT,  /* Reph formed out of initial Ra,H sequence. */
   REPH_MODE_EXPLICIT,  /* Reph formed out of initial Ra,H,ZWJ sequence. */
-  REPH_MODE_VIS_REPHA, /* Encoded Repha character, no reordering needed. */
   REPH_MODE_LOG_REPHA  /* Encoded Repha character, needs reordering. */
 };
 enum blwf_mode_t {
   REPH_MODE_LOG_REPHA  /* Encoded Repha character, needs reordering. */
 };
 enum blwf_mode_t {
@@ -295,7 +87,6 @@ static const indic_config_t indic_configs[] =
   {HB_SCRIPT_MALAYALAM,        true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST},
   {HB_SCRIPT_SINHALA,  false,0x0DCAu,BASE_POS_LAST_SINHALA,
                                                     REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
   {HB_SCRIPT_MALAYALAM,        true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST},
   {HB_SCRIPT_SINHALA,  false,0x0DCAu,BASE_POS_LAST_SINHALA,
                                                     REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
-  {HB_SCRIPT_KHMER,    false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST},
 };
 
 
 };
 
 
@@ -327,7 +118,6 @@ indic_features[] =
   {HB_TAG('p','s','t','f'), F_NONE},
   {HB_TAG('v','a','t','u'), F_GLOBAL},
   {HB_TAG('c','j','c','t'), F_GLOBAL},
   {HB_TAG('p','s','t','f'), F_NONE},
   {HB_TAG('v','a','t','u'), F_GLOBAL},
   {HB_TAG('c','j','c','t'), F_GLOBAL},
-  {HB_TAG('c','f','a','r'), F_NONE},
   /*
    * Other features.
    * These features are applied all at once, after final_reordering.
   /*
    * Other features.
    * These features are applied all at once, after final_reordering.
@@ -361,7 +151,6 @@ enum {
   PSTF,
   _VATU,
   _CJCT,
   PSTF,
   _VATU,
   _CJCT,
-  CFAR,
 
   INIT,
   _PRES,
 
   INIT,
   _PRES,
@@ -411,12 +200,12 @@ collect_features_indic (hb_ot_shape_planner_t *plan)
   unsigned int i = 0;
   map->add_gsub_pause (initial_reordering);
   for (; i < INDIC_BASIC_FEATURES; i++) {
   unsigned int i = 0;
   map->add_gsub_pause (initial_reordering);
   for (; i < INDIC_BASIC_FEATURES; i++) {
-    map->add_feature (indic_features[i].tag, 1, indic_features[i].flags | F_MANUAL_ZWJ);
-    map->add_gsub_pause (NULL);
+    map->add_feature (indic_features[i].tag, 1, indic_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
+    map->add_gsub_pause (nullptr);
   }
   map->add_gsub_pause (final_reordering);
   for (; i < INDIC_NUM_FEATURES; i++) {
   }
   map->add_gsub_pause (final_reordering);
   for (; i < INDIC_NUM_FEATURES; i++) {
-    map->add_feature (indic_features[i].tag, 1, indic_features[i].flags | F_MANUAL_ZWJ);
+    map->add_feature (indic_features[i].tag, 1, indic_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
   }
 
   map->add_global_bool_feature (HB_TAG('c','a','l','t'));
   }
 
   map->add_global_bool_feature (HB_TAG('c','a','l','t'));
@@ -428,17 +217,6 @@ collect_features_indic (hb_ot_shape_planner_t *plan)
 static void
 override_features_indic (hb_ot_shape_planner_t *plan)
 {
 static void
 override_features_indic (hb_ot_shape_planner_t *plan)
 {
-  /* Uniscribe does not apply 'kern' in Khmer. */
-  if (hb_options ().uniscribe_bug_compatible)
-  {
-    switch ((hb_tag_t) plan->props.script)
-    {
-      case HB_SCRIPT_KHMER:
-       plan->map.add_feature (HB_TAG('k','e','r','n'), 0, F_GLOBAL);
-       break;
-    }
-  }
-
   plan->map.add_feature (HB_TAG('l','i','g','a'), 0, F_GLOBAL);
 }
 
   plan->map.add_feature (HB_TAG('l','i','g','a'), 0, F_GLOBAL);
 }
 
@@ -485,7 +263,7 @@ struct indic_shape_plan_t
 
       /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
        * during shape planning...  Instead, overwrite it here.  It's safe.  Don't worry! */
 
       /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
        * during shape planning...  Instead, overwrite it here.  It's safe.  Don't worry! */
-      (const_cast<indic_shape_plan_t *> (this))->virama_glyph = glyph;
+      virama_glyph = glyph;
     }
 
     *pglyph = glyph;
     }
 
     *pglyph = glyph;
@@ -495,7 +273,7 @@ struct indic_shape_plan_t
   const indic_config_t *config;
 
   bool is_old_spec;
   const indic_config_t *config;
 
   bool is_old_spec;
-  hb_codepoint_t virama_glyph;
+  mutable hb_codepoint_t virama_glyph;
 
   would_substitute_feature_t rphf;
   would_substitute_feature_t pref;
 
   would_substitute_feature_t rphf;
   would_substitute_feature_t pref;
@@ -510,7 +288,7 @@ data_create_indic (const hb_ot_shape_plan_t *plan)
 {
   indic_shape_plan_t *indic_plan = (indic_shape_plan_t *) calloc (1, sizeof (indic_shape_plan_t));
   if (unlikely (!indic_plan))
 {
   indic_shape_plan_t *indic_plan = (indic_shape_plan_t *) calloc (1, sizeof (indic_shape_plan_t));
   if (unlikely (!indic_plan))
-    return NULL;
+    return nullptr;
 
   indic_plan->config = &indic_configs[0];
   for (unsigned int i = 1; i < ARRAY_LENGTH (indic_configs); i++)
 
   indic_plan->config = &indic_configs[0];
   for (unsigned int i = 1; i < ARRAY_LENGTH (indic_configs); i++)
@@ -615,6 +393,8 @@ setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
                 hb_buffer_t *buffer)
 {
   find_syllables (buffer);
                 hb_buffer_t *buffer)
 {
   find_syllables (buffer);
+  foreach_syllable (buffer, start, end)
+    buffer->unsafe_to_break (start, end);
 }
 
 static int
 }
 
 static int
@@ -666,6 +446,21 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
   const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
   hb_glyph_info_t *info = buffer->info;
 
   const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
   hb_glyph_info_t *info = buffer->info;
 
+  /* https://github.com/harfbuzz/harfbuzz/issues/435#issuecomment-335560167
+   * // For compatibility with legacy usage in Kannada,
+   * // Ra+h+ZWJ must behave like Ra+ZWJ+h...
+   */
+  if (buffer->props.script == HB_SCRIPT_KANNADA &&
+      start + 3 <= end &&
+      is_one_of (info[start  ], FLAG (OT_Ra)) &&
+      is_one_of (info[start+1], FLAG (OT_H)) &&
+      is_one_of (info[start+2], FLAG (OT_ZWJ)))
+  {
+    buffer->merge_clusters (start+1, start+3);
+    hb_glyph_info_t tmp = info[start+1];
+    info[start+1] = info[start+2];
+    info[start+2] = tmp;
+  }
 
   /* 1. Find base consonant:
    *
 
   /* 1. Find base consonant:
    *
@@ -673,7 +468,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
    * following algorithm: starting from the end of the syllable, move backwards
    * until a consonant is found that does not have a below-base or post-base
    * form (post-base forms have to follow below-base forms), or that is not a
    * following algorithm: starting from the end of the syllable, move backwards
    * until a consonant is found that does not have a below-base or post-base
    * form (post-base forms have to follow below-base forms), or that is not a
-   * pre-base reordering Ra, or arrive at the first consonant. The consonant
+   * pre-base-reordering Ra, or arrive at the first consonant. The consonant
    * stopped at will be the base.
    *
    *   o If the syllable starts with Ra + Halant (in a script that has Reph)
    * stopped at will be the base.
    *
    *   o If the syllable starts with Ra + Halant (in a script that has Reph)
@@ -689,8 +484,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
      *    and has more than one consonant, Ra is excluded from candidates for
      *    base consonants. */
     unsigned int limit = start;
      *    and has more than one consonant, Ra is excluded from candidates for
      *    base consonants. */
     unsigned int limit = start;
-    if (indic_plan->config->reph_pos != REPH_POS_DONT_CARE &&
-       indic_plan->mask_array[RPHF] &&
+    if (indic_plan->mask_array[RPHF] &&
        start + 3 <= end &&
        (
         (indic_plan->config->reph_mode == REPH_MODE_IMPLICIT && !is_joiner (info[start + 2])) ||
        start + 3 <= end &&
        (
         (indic_plan->config->reph_mode == REPH_MODE_IMPLICIT && !is_joiner (info[start + 2])) ||
@@ -744,11 +538,11 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
            if (info[i].indic_position() == POS_BELOW_C)
              seen_below = true;
 
            if (info[i].indic_position() == POS_BELOW_C)
              seen_below = true;
 
-           /* -> or that is not a pre-base reordering Ra,
+           /* -> or that is not a pre-base-reordering Ra,
             *
             * IMPLEMENTATION NOTES:
             *
             *
             * IMPLEMENTATION NOTES:
             *
-            * Our pre-base reordering Ra's are marked POS_POST_C, so will be skipped
+            * Our pre-base-reordering Ra's are marked POS_POST_C, so will be skipped
             * by the logic above already.
             */
 
             * by the logic above already.
             */
 
@@ -799,22 +593,6 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
            info[i].indic_position() = POS_BELOW_C;
       }
       break;
            info[i].indic_position() = POS_BELOW_C;
       }
       break;
-
-      case BASE_POS_FIRST:
-      {
-       /* The first consonant is always the base. */
-
-       assert (indic_plan->config->reph_mode == REPH_MODE_VIS_REPHA);
-       assert (!has_reph);
-
-       base = start;
-
-       /* Mark all subsequent consonants as below. */
-       for (unsigned int i = base + 1; i < end; i++)
-         if (is_consonant (info[i]))
-           info[i].indic_position() = POS_BELOW_C;
-      }
-      break;
     }
 
     /* -> If the syllable starts with Ra + Halant (in a script that has Reph)
     }
 
     /* -> If the syllable starts with Ra + Halant (in a script that has Reph)
@@ -831,8 +609,8 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
 
   /* 2. Decompose and reorder Matras:
    *
 
   /* 2. Decompose and reorder Matras:
    *
-   * Each matra and any syllable modifier sign in the cluster are moved to the
-   * appropriate position relative to the consonant(s) in the cluster. The
+   * Each matra and any syllable modifier sign in the syllable are moved to the
+   * appropriate position relative to the consonant(s) in the syllable. The
    * shaping engine decomposes two- or three-part matras into their constituent
    * parts before any repositioning. Matra characters are classified by which
    * consonant in a conjunct they have affinity for and are reordered to the
    * shaping engine decomposes two- or three-part matras into their constituent
    * parts before any repositioning. Matra characters are classified by which
    * consonant in a conjunct they have affinity for and are reordered to the
@@ -869,15 +647,15 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
   if (base < end)
     info[base].indic_position() = POS_BASE_C;
 
   if (base < end)
     info[base].indic_position() = POS_BASE_C;
 
-  /* Mark final consonants.  A final consonant is one appearing after a matra,
-   * like in Khmer. */
+  /* Mark final consonants.  A final consonant is one appearing after a matra.
+   * Happens in Sinhala. */
   for (unsigned int i = base + 1; i < end; i++)
     if (info[i].indic_category() == OT_M) {
       for (unsigned int j = i + 1; j < end; j++)
   for (unsigned int i = base + 1; i < end; i++)
     if (info[i].indic_category() == OT_M) {
       for (unsigned int j = i + 1; j < end; j++)
-        if (is_consonant (info[j])) {
-         info[j].indic_position() = POS_FINAL_C;
-         break;
-       }
+       if (is_consonant (info[j])) {
+        info[j].indic_position() = POS_FINAL_C;
+        break;
+       }
       break;
     }
 
       break;
     }
 
@@ -928,7 +706,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
     indic_position_t last_pos = POS_START;
     for (unsigned int i = start; i < end; i++)
     {
     indic_position_t last_pos = POS_START;
     for (unsigned int i = start; i < end; i++)
     {
-      if ((FLAG_SAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | HALANT_OR_COENG_FLAGS)))
+      if ((FLAG_UNSAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | FLAG (OT_H))))
       {
        info[i].indic_position() = last_pos;
        if (unlikely (info[i].indic_category() == OT_H &&
       {
        info[i].indic_position() = last_pos;
        if (unlikely (info[i].indic_category() == OT_H &&
@@ -1083,7 +861,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
   unsigned int pref_len = 2;
   if (indic_plan->mask_array[PREF] && base + pref_len < end)
   {
   unsigned int pref_len = 2;
   if (indic_plan->mask_array[PREF] && base + pref_len < end)
   {
-    /* Find a Halant,Ra sequence and mark it for pre-base reordering processing. */
+    /* Find a Halant,Ra sequence and mark it for pre-base-reordering processing. */
     for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) {
       hb_codepoint_t glyphs[2];
       for (unsigned int j = 0; j < pref_len; j++)
     for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) {
       hb_codepoint_t glyphs[2];
       for (unsigned int j = 0; j < pref_len; j++)
@@ -1092,17 +870,6 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
       {
        for (unsigned int j = 0; j < pref_len; j++)
          info[i++].mask |= indic_plan->mask_array[PREF];
       {
        for (unsigned int j = 0; j < pref_len; j++)
          info[i++].mask |= indic_plan->mask_array[PREF];
-
-       /* Mark the subsequent stuff with 'cfar'.  Used in Khmer.
-        * Read the feature spec.
-        * This allows distinguishing the following cases with MS Khmer fonts:
-        * U+1784,U+17D2,U+179A,U+17D2,U+1782
-        * U+1784,U+17D2,U+1782,U+17D2,U+179A
-        */
-       if (indic_plan->mask_array[CFAR])
-         for (; i < end; i++)
-           info[i].mask |= indic_plan->mask_array[CFAR];
-
        break;
       }
     }
        break;
       }
     }
@@ -1258,7 +1025,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
 
 
   /* This function relies heavily on halant glyphs.  Lots of ligation
 
 
   /* This function relies heavily on halant glyphs.  Lots of ligation
-   * and possibly multiplication substitutions happened prior to this
+   * and possibly multiple substitutions happened prior to this
    * phase, and that might have messed up our properties.  Recover
    * from a particular case of that where we're fairly sure that a
    * class of OT_H is desired but has been lost. */
    * phase, and that might have messed up our properties.  Recover
    * from a particular case of that where we're fairly sure that a
    * class of OT_H is desired but has been lost. */
@@ -1270,7 +1037,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
          _hb_glyph_info_ligated (&info[i]) &&
          _hb_glyph_info_multiplied (&info[i]))
       {
          _hb_glyph_info_ligated (&info[i]) &&
          _hb_glyph_info_multiplied (&info[i]))
       {
-        /* This will make sure that this glyph passes is_halant_or_coeng() test. */
+        /* This will make sure that this glyph passes is_halant() test. */
        info[i].indic_category() = OT_H;
        _hb_glyph_info_clear_ligated_and_multiplied (&info[i]);
       }
        info[i].indic_category() = OT_H;
        _hb_glyph_info_clear_ligated_and_multiplied (&info[i]);
       }
@@ -1282,7 +1049,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
    * After the localized forms and basic shaping forms GSUB features have been
    * applied (see below), the shaping engine performs some final glyph
    * reordering before applying all the remaining font features to the entire
    * After the localized forms and basic shaping forms GSUB features have been
    * applied (see below), the shaping engine performs some final glyph
    * reordering before applying all the remaining font features to the entire
-   * cluster.
+   * syllable.
    */
 
   bool try_pref = !!indic_plan->mask_array[PREF];
    */
 
   bool try_pref = !!indic_plan->mask_array[PREF];
@@ -1303,7 +1070,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
              /* Ok, this was a 'pref' candidate but didn't form any.
               * Base is around here... */
              base = i;
              /* Ok, this was a 'pref' candidate but didn't form any.
               * Base is around here... */
              base = i;
-             while (base < end && is_halant_or_coeng (info[base]))
+             while (base < end && is_halant (info[base]))
                base++;
              info[base].indic_position() = POS_BASE_C;
 
                base++;
              info[base].indic_position() = POS_BASE_C;
 
@@ -1319,7 +1086,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
        {
          while (i < end && is_joiner (info[i]))
            i++;
        {
          while (i < end && is_joiner (info[i]))
            i++;
-         if (i == end || !is_halant_or_coeng (info[i]))
+         if (i == end || !is_halant (info[i]))
            break;
          i++; /* Skip halant. */
          while (i < end && is_joiner (info[i]))
            break;
          i++; /* Skip halant. */
          while (i < end && is_joiner (info[i]))
@@ -1341,7 +1108,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
     base--;
   if (base < end)
     while (start < base &&
     base--;
   if (base < end)
     while (start < base &&
-          is_one_of (info[base], (FLAG (OT_N) | HALANT_OR_COENG_FLAGS)))
+          is_one_of (info[base], (FLAG (OT_N) | FLAG (OT_H))))
       base--;
 
 
       base--;
 
 
@@ -1367,13 +1134,13 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
     if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
     {
       while (new_pos > start &&
     if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
     {
       while (new_pos > start &&
-            !(is_one_of (info[new_pos], (FLAG (OT_M) | HALANT_OR_COENG_FLAGS))))
+            !(is_one_of (info[new_pos], (FLAG (OT_M) | FLAG (OT_H)))))
        new_pos--;
 
       /* If we found no Halant we are done.
        * Otherwise only proceed if the Halant does
        * not belong to the Matra itself! */
        new_pos--;
 
       /* If we found no Halant we are done.
        * Otherwise only proceed if the Halant does
        * not belong to the Matra itself! */
-      if (is_halant_or_coeng (info[new_pos]) &&
+      if (is_halant (info[new_pos]) &&
          info[new_pos].indic_position() != POS_PRE_M)
       {
        /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
          info[new_pos].indic_position() != POS_PRE_M)
       {
        /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
@@ -1440,8 +1207,6 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
     unsigned int new_reph_pos;
     reph_position_t reph_pos = indic_plan->config->reph_pos;
 
     unsigned int new_reph_pos;
     reph_position_t reph_pos = indic_plan->config->reph_pos;
 
-    assert (reph_pos != REPH_POS_DONT_CARE);
-
     /*       1. If reph should be positioned after post-base consonant forms,
      *          proceed to step 5.
      */
     /*       1. If reph should be positioned after post-base consonant forms,
      *          proceed to step 5.
      */
@@ -1463,10 +1228,10 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
      */
     {
       new_reph_pos = start + 1;
      */
     {
       new_reph_pos = start + 1;
-      while (new_reph_pos < base && !is_halant_or_coeng (info[new_reph_pos]))
+      while (new_reph_pos < base && !is_halant (info[new_reph_pos]))
        new_reph_pos++;
 
        new_reph_pos++;
 
-      if (new_reph_pos < base && is_halant_or_coeng (info[new_reph_pos]))
+      if (new_reph_pos < base && is_halant (info[new_reph_pos]))
       {
        /* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */
        if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1]))
       {
        /* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */
        if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1]))
@@ -1477,7 +1242,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
 
     /*       3. If reph should be repositioned after the main consonant: find the
      *          first consonant not ligated with main, or find the first
 
     /*       3. If reph should be repositioned after the main consonant: find the
      *          first consonant not ligated with main, or find the first
-     *          consonant that is not a potential pre-base reordering Ra.
+     *          consonant that is not a potential pre-base-reordering Ra.
      */
     if (reph_pos == REPH_POS_AFTER_MAIN)
     {
      */
     if (reph_pos == REPH_POS_AFTER_MAIN)
     {
@@ -1498,7 +1263,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
     {
       new_reph_pos = base;
       while (new_reph_pos + 1 < end &&
     {
       new_reph_pos = base;
       while (new_reph_pos + 1 < end &&
-            !( FLAG_SAFE (info[new_reph_pos + 1].indic_position()) & (FLAG (POS_POST_C) | FLAG (POS_AFTER_POST) | FLAG (POS_SMVD))))
+            !( FLAG_UNSAFE (info[new_reph_pos + 1].indic_position()) & (FLAG (POS_POST_C) | FLAG (POS_AFTER_POST) | FLAG (POS_SMVD))))
        new_reph_pos++;
       if (new_reph_pos < end)
         goto reph_move;
        new_reph_pos++;
       if (new_reph_pos < end)
         goto reph_move;
@@ -1515,10 +1280,10 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
     {
       /* Copied from step 2. */
       new_reph_pos = start + 1;
     {
       /* Copied from step 2. */
       new_reph_pos = start + 1;
-      while (new_reph_pos < base && !is_halant_or_coeng (info[new_reph_pos]))
+      while (new_reph_pos < base && !is_halant (info[new_reph_pos]))
        new_reph_pos++;
 
        new_reph_pos++;
 
-      if (new_reph_pos < base && is_halant_or_coeng (info[new_reph_pos]))
+      if (new_reph_pos < base && is_halant (info[new_reph_pos]))
       {
        /* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */
        if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1]))
       {
        /* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */
        if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1]))
@@ -1542,7 +1307,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
        * TEST: U+0930,U+094D,U+0915,U+094B,U+094D
        */
       if (!hb_options ().uniscribe_bug_compatible &&
        * TEST: U+0930,U+094D,U+0915,U+094B,U+094D
        */
       if (!hb_options ().uniscribe_bug_compatible &&
-         unlikely (is_halant_or_coeng (info[new_reph_pos]))) {
+         unlikely (is_halant (info[new_reph_pos]))) {
        for (unsigned int i = base + 1; i < new_reph_pos; i++)
          if (info[i].indic_category() == OT_M) {
            /* Ok, got it. */
        for (unsigned int i = base + 1; i < new_reph_pos; i++)
          if (info[i].indic_category() == OT_M) {
            /* Ok, got it. */
@@ -1566,13 +1331,13 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
   }
 
 
   }
 
 
-  /*   o Reorder pre-base reordering consonants:
+  /*   o Reorder pre-base-reordering consonants:
    *
    *
-   *     If a pre-base reordering consonant is found, reorder it according to
+   *     If a pre-base-reordering consonant is found, reorder it according to
    *     the following rules:
    */
 
    *     the following rules:
    */
 
-  if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */
+  if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base-reordering Ra. */
   {
     for (unsigned int i = base + 1; i < end; i++)
       if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
   {
     for (unsigned int i = base + 1; i < end; i++)
       if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
@@ -1603,24 +1368,11 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
          if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
          {
            while (new_pos > start &&
          if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
          {
            while (new_pos > start &&
-                  !(is_one_of (info[new_pos - 1], FLAG(OT_M) | HALANT_OR_COENG_FLAGS)))
+                  !(is_one_of (info[new_pos - 1], FLAG(OT_M) | FLAG (OT_H))))
              new_pos--;
              new_pos--;
-
-           /* In Khmer coeng model, a H,Ra can go *after* matras.  If it goes after a
-            * split matra, it should be reordered to *before* the left part of such matra. */
-           if (new_pos > start && info[new_pos - 1].indic_category() == OT_M)
-           {
-             unsigned int old_pos = i;
-             for (unsigned int j = base + 1; j < old_pos; j++)
-               if (info[j].indic_category() == OT_M)
-               {
-                 new_pos--;
-                 break;
-               }
-           }
          }
 
          }
 
-         if (new_pos > start && is_halant_or_coeng (info[new_pos - 1]))
+         if (new_pos > start && is_halant (info[new_pos - 1]))
          {
            /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
            if (new_pos < end && is_joiner (info[new_pos]))
          {
            /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
            if (new_pos < end && is_joiner (info[new_pos]))
@@ -1646,11 +1398,15 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
 
 
   /* Apply 'init' to the Left Matra if it's a word start. */
 
 
   /* Apply 'init' to the Left Matra if it's a word start. */
-  if (info[start].indic_position () == POS_PRE_M &&
-      (!start ||
-       !(FLAG_SAFE (_hb_glyph_info_get_general_category (&info[start - 1])) &
-        FLAG_RANGE (HB_UNICODE_GENERAL_CATEGORY_FORMAT, HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))))
-    info[start].mask |= indic_plan->mask_array[INIT];
+  if (info[start].indic_position () == POS_PRE_M)
+  {
+    if (!start ||
+       !(FLAG_UNSAFE (_hb_glyph_info_get_general_category (&info[start - 1])) &
+        FLAG_RANGE (HB_UNICODE_GENERAL_CATEGORY_FORMAT, HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
+      info[start].mask |= indic_plan->mask_array[INIT];
+    else
+      buffer->unsafe_to_break (start - 1, start + 1);
+  }
 
 
   /*
 
 
   /*
@@ -1665,8 +1421,8 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
         break;
 
       default:
         break;
 
       default:
-       /* Uniscribe merges the entire cluster... Except for Tamil & Sinhala.
-        * This means, half forms are submerged into the main consonants cluster.
+       /* Uniscribe merges the entire syllable into a single cluster... Except for Tamil & Sinhala.
+        * This means, half forms are submerged into the main consonant's cluster.
         * This is unnecessary, and makes cursor positioning harder, but that's what
         * Uniscribe does. */
        buffer->merge_clusters (start, end);
         * This is unnecessary, and makes cursor positioning harder, but that's what
         * Uniscribe does. */
        buffer->merge_clusters (start, end);
@@ -1721,13 +1477,6 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c,
      * Decompose split matras that don't have Unicode decompositions.
      */
 
      * Decompose split matras that don't have Unicode decompositions.
      */
 
-    /* Khmer */
-    case 0x17BEu  : *a = 0x17C1u; *b= 0x17BEu; return true;
-    case 0x17BFu  : *a = 0x17C1u; *b= 0x17BFu; return true;
-    case 0x17C0u  : *a = 0x17C1u; *b= 0x17C0u; return true;
-    case 0x17C4u  : *a = 0x17C1u; *b= 0x17C4u; return true;
-    case 0x17C5u  : *a = 0x17C1u; *b= 0x17C5u; return true;
-
 #if 0
     /* Gujarati */
     /* This one has no decomposition in Unicode, but needs no decomposition either. */
 #if 0
     /* Gujarati */
     /* This one has no decomposition in Unicode, but needs no decomposition either. */
@@ -1738,7 +1487,7 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c,
 #endif
   }
 
 #endif
   }
 
-  if ((ab == 0x0DDAu || hb_in_range (ab, 0x0DDCu, 0x0DDEu)))
+  if ((ab == 0x0DDAu || hb_in_range<hb_codepoint_t> (ab, 0x0DDCu, 0x0DDEu)))
   {
     /*
      * Sinhala split matras...  Let the fun begin.
   {
     /*
      * Sinhala split matras...  Let the fun begin.
@@ -1803,18 +1552,18 @@ compose_indic (const hb_ot_shape_normalize_context_t *c,
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
 {
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
 {
-  "indic",
   collect_features_indic,
   override_features_indic,
   data_create_indic,
   data_destroy_indic,
   collect_features_indic,
   override_features_indic,
   data_create_indic,
   data_destroy_indic,
-  NULL, /* preprocess_text */
-  NULL, /* postprocess_glyphs */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
   decompose_indic,
   compose_indic,
   setup_masks_indic,
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
   decompose_indic,
   compose_indic,
   setup_masks_indic,
-  NULL, /* disable_otl */
+  nullptr, /* disable_otl */
+  nullptr, /* reorder_marks */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
   false, /* fallback_position */
 };
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
   false, /* fallback_position */
 };
diff --git a/src/hb-ot-shape-complex-khmer-machine.hh b/src/hb-ot-shape-complex-khmer-machine.hh
new file mode 100644 (file)
index 0000000..380705a
--- /dev/null
@@ -0,0 +1,294 @@
+
+#line 1 "hb-ot-shape-complex-khmer-machine.rl"
+/*
+ * Copyright © 2011,2012  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+
+#include "hb-private.hh"
+
+
+#line 36 "hb-ot-shape-complex-khmer-machine.hh"
+static const unsigned char _khmer_syllable_machine_trans_keys[] = {
+       7u, 7u, 1u, 16u, 13u, 13u, 1u, 16u, 7u, 13u, 7u, 7u, 1u, 16u, 13u, 13u, 
+       1u, 16u, 7u, 13u, 1u, 16u, 3u, 14u, 3u, 14u, 5u, 14u, 3u, 14u, 5u, 14u, 
+       8u, 8u, 3u, 13u, 3u, 8u, 8u, 8u, 3u, 8u, 3u, 14u, 3u, 14u, 5u, 14u, 
+       3u, 14u, 5u, 14u, 8u, 8u, 3u, 13u, 3u, 8u, 8u, 8u, 3u, 8u, 3u, 14u, 
+       3u, 14u, 7u, 13u, 7u, 7u, 1u, 16u, 0
+};
+
+static const char _khmer_syllable_machine_key_spans[] = {
+       1, 16, 1, 16, 7, 1, 16, 1, 
+       16, 7, 16, 12, 12, 10, 12, 10, 
+       1, 11, 6, 1, 6, 12, 12, 10, 
+       12, 10, 1, 11, 6, 1, 6, 12, 
+       12, 7, 1, 16
+};
+
+static const short _khmer_syllable_machine_index_offsets[] = {
+       0, 2, 19, 21, 38, 46, 48, 65, 
+       67, 84, 92, 109, 122, 135, 146, 159, 
+       170, 172, 184, 191, 193, 200, 213, 226, 
+       237, 250, 261, 263, 275, 282, 284, 291, 
+       304, 317, 325, 327
+};
+
+static const char _khmer_syllable_machine_indicies[] = {
+       1, 0, 2, 2, 0, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 2, 0, 3, 0, 4, 4, 0, 
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 4, 0, 1, 0, 
+       0, 0, 0, 0, 5, 0, 7, 6, 
+       8, 8, 6, 6, 6, 6, 6, 6, 
+       6, 6, 6, 6, 6, 6, 6, 8, 
+       6, 9, 6, 10, 10, 6, 6, 6, 
+       6, 6, 6, 6, 6, 6, 6, 6, 
+       6, 6, 10, 6, 7, 6, 6, 6, 
+       6, 6, 11, 6, 4, 4, 13, 12, 
+       14, 15, 7, 16, 12, 12, 4, 4, 
+       11, 17, 12, 4, 12, 19, 18, 20, 
+       21, 1, 22, 18, 18, 18, 18, 5, 
+       23, 18, 24, 18, 21, 21, 1, 22, 
+       18, 18, 18, 18, 18, 23, 18, 21, 
+       21, 1, 22, 18, 18, 18, 18, 18, 
+       23, 18, 25, 18, 21, 21, 1, 22, 
+       18, 18, 18, 18, 18, 26, 18, 21, 
+       21, 1, 22, 18, 18, 18, 18, 18, 
+       26, 18, 27, 18, 28, 18, 29, 18, 
+       18, 22, 18, 18, 18, 18, 3, 18, 
+       30, 18, 18, 18, 18, 22, 18, 22, 
+       18, 28, 18, 18, 18, 18, 22, 18, 
+       19, 18, 21, 21, 1, 22, 18, 18, 
+       18, 18, 18, 23, 18, 32, 31, 33, 
+       33, 7, 16, 31, 31, 31, 31, 31, 
+       34, 31, 33, 33, 7, 16, 31, 31, 
+       31, 31, 31, 34, 31, 35, 31, 33, 
+       33, 7, 16, 31, 31, 31, 31, 31, 
+       36, 31, 33, 33, 7, 16, 31, 31, 
+       31, 31, 31, 36, 31, 37, 31, 38, 
+       31, 39, 31, 31, 16, 31, 31, 31, 
+       31, 9, 31, 40, 31, 31, 31, 31, 
+       16, 31, 16, 31, 38, 31, 31, 31, 
+       31, 16, 31, 13, 31, 41, 33, 7, 
+       16, 31, 31, 31, 31, 11, 34, 31, 
+       13, 31, 33, 33, 7, 16, 31, 31, 
+       31, 31, 31, 34, 31, 7, 42, 42, 
+       42, 42, 42, 11, 42, 7, 42, 10, 
+       10, 42, 42, 42, 42, 42, 42, 42, 
+       42, 42, 42, 42, 42, 42, 10, 42, 
+       0
+};
+
+static const char _khmer_syllable_machine_trans_targs[] = {
+       10, 14, 17, 20, 11, 21, 10, 24, 
+       27, 30, 31, 32, 10, 22, 33, 34, 
+       26, 35, 10, 12, 4, 0, 16, 3, 
+       13, 15, 1, 10, 18, 2, 19, 10, 
+       23, 5, 8, 25, 6, 10, 28, 7, 
+       29, 9, 10
+};
+
+static const char _khmer_syllable_machine_trans_actions[] = {
+       1, 2, 2, 0, 2, 2, 3, 2, 
+       2, 0, 2, 2, 6, 2, 0, 0, 
+       0, 0, 7, 2, 0, 0, 0, 0, 
+       2, 2, 0, 8, 0, 0, 0, 9, 
+       2, 0, 0, 2, 0, 10, 0, 0, 
+       0, 0, 11
+};
+
+static const char _khmer_syllable_machine_to_state_actions[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 4, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0
+};
+
+static const char _khmer_syllable_machine_from_state_actions[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 5, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0
+};
+
+static const unsigned char _khmer_syllable_machine_eof_trans[] = {
+       1, 1, 1, 1, 1, 7, 7, 7, 
+       7, 7, 0, 19, 19, 19, 19, 19, 
+       19, 19, 19, 19, 19, 19, 32, 32, 
+       32, 32, 32, 32, 32, 32, 32, 32, 
+       32, 43, 43, 43
+};
+
+static const int khmer_syllable_machine_start = 10;
+static const int khmer_syllable_machine_first_final = 10;
+static const int khmer_syllable_machine_error = -1;
+
+static const int khmer_syllable_machine_en_main = 10;
+
+
+#line 36 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+
+#line 74 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
+    for (unsigned int i = last; i < p+1; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    last = p+1; \
+    syllable_serial++; \
+    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+  } HB_STMT_END
+
+static void
+find_syllables (hb_buffer_t *buffer)
+{
+  unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  
+#line 181 "hb-ot-shape-complex-khmer-machine.hh"
+       {
+       cs = khmer_syllable_machine_start;
+       ts = 0;
+       te = 0;
+       act = 0;
+       }
+
+#line 95 "hb-ot-shape-complex-khmer-machine.rl"
+
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int last = 0;
+  unsigned int syllable_serial = 1;
+  
+#line 198 "hb-ot-shape-complex-khmer-machine.hh"
+       {
+       int _slen;
+       int _trans;
+       const unsigned char *_keys;
+       const char *_inds;
+       if ( p == pe )
+               goto _test_eof;
+_resume:
+       switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
+       case 5:
+#line 1 "NONE"
+       {ts = p;}
+       break;
+#line 212 "hb-ot-shape-complex-khmer-machine.hh"
+       }
+
+       _keys = _khmer_syllable_machine_trans_keys + (cs<<1);
+       _inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
+
+       _slen = _khmer_syllable_machine_key_spans[cs];
+       _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].khmer_category()) &&
+               ( info[p].khmer_category()) <= _keys[1] ?
+               ( info[p].khmer_category()) - _keys[0] : _slen ];
+
+_eof_trans:
+       cs = _khmer_syllable_machine_trans_targs[_trans];
+
+       if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
+               goto _again;
+
+       switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
+       case 2:
+#line 1 "NONE"
+       {te = p+1;}
+       break;
+       case 8:
+#line 68 "hb-ot-shape-complex-khmer-machine.rl"
+       {te = p+1;{ found_syllable (consonant_syllable); }}
+       break;
+       case 10:
+#line 69 "hb-ot-shape-complex-khmer-machine.rl"
+       {te = p+1;{ found_syllable (broken_cluster); }}
+       break;
+       case 6:
+#line 70 "hb-ot-shape-complex-khmer-machine.rl"
+       {te = p+1;{ found_syllable (non_khmer_cluster); }}
+       break;
+       case 7:
+#line 68 "hb-ot-shape-complex-khmer-machine.rl"
+       {te = p;p--;{ found_syllable (consonant_syllable); }}
+       break;
+       case 9:
+#line 69 "hb-ot-shape-complex-khmer-machine.rl"
+       {te = p;p--;{ found_syllable (broken_cluster); }}
+       break;
+       case 11:
+#line 70 "hb-ot-shape-complex-khmer-machine.rl"
+       {te = p;p--;{ found_syllable (non_khmer_cluster); }}
+       break;
+       case 1:
+#line 68 "hb-ot-shape-complex-khmer-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
+       break;
+       case 3:
+#line 69 "hb-ot-shape-complex-khmer-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
+       break;
+#line 266 "hb-ot-shape-complex-khmer-machine.hh"
+       }
+
+_again:
+       switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
+       case 4:
+#line 1 "NONE"
+       {ts = 0;}
+       break;
+#line 275 "hb-ot-shape-complex-khmer-machine.hh"
+       }
+
+       if ( ++p != pe )
+               goto _resume;
+       _test_eof: {}
+       if ( p == eof )
+       {
+       if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
+               _trans = _khmer_syllable_machine_eof_trans[cs] - 1;
+               goto _eof_trans;
+       }
+       }
+
+       }
+
+#line 104 "hb-ot-shape-complex-khmer-machine.rl"
+
+}
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */
diff --git a/src/hb-ot-shape-complex-khmer-machine.rl b/src/hb-ot-shape-complex-khmer-machine.rl
new file mode 100644 (file)
index 0000000..8b00c37
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright © 2011,2012  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
+
+#include "hb-private.hh"
+
+%%{
+  machine khmer_syllable_machine;
+  alphtype unsigned char;
+  write data;
+}%%
+
+%%{
+
+# Same order as enum khmer_category_t.  Not sure how to avoid duplication.
+C    = 1;
+V    = 2;
+N    = 3;
+ZWNJ = 5;
+ZWJ  = 6;
+M    = 7;
+SM   = 8;
+PLACEHOLDER = 11;
+DOTTEDCIRCLE = 12;
+RS    = 13;
+Coeng = 14;
+Ra    = 16;
+
+c = (C | Ra | V);              # is_consonant
+n = ((ZWNJ?.RS)? (N.N?)?);     # is_consonant_modifier
+z = ZWJ|ZWNJ;                  # is_joiner
+
+cn = c.n?;
+matra_group = z?.M.N?;
+syllable_tail = (SM.SM?)?;
+
+
+broken_cluster =       n? (Coeng.cn)* matra_group* (Coeng.cn)? syllable_tail;
+consonant_syllable =   (c|PLACEHOLDER|DOTTEDCIRCLE) broken_cluster;
+other =                        any;
+
+main := |*
+       consonant_syllable      => { found_syllable (consonant_syllable); };
+       broken_cluster          => { found_syllable (broken_cluster); };
+       other                   => { found_syllable (non_khmer_cluster); };
+*|;
+
+
+}%%
+
+#define found_syllable(syllable_type) \
+  HB_STMT_START { \
+    if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
+    for (unsigned int i = last; i < p+1; i++) \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+    last = p+1; \
+    syllable_serial++; \
+    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+  } HB_STMT_END
+
+static void
+find_syllables (hb_buffer_t *buffer)
+{
+  unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED;
+  int cs;
+  hb_glyph_info_t *info = buffer->info;
+  %%{
+    write init;
+    getkey info[p].khmer_category();
+  }%%
+
+  p = 0;
+  pe = eof = buffer->len;
+
+  unsigned int last = 0;
+  unsigned int syllable_serial = 1;
+  %%{
+    write exec;
+  }%%
+}
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */
diff --git a/src/hb-ot-shape-complex-khmer-private.hh b/src/hb-ot-shape-complex-khmer-private.hh
new file mode 100644 (file)
index 0000000..f90ef96
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_KHMER_PRIVATE_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_PRIVATE_HH
+
+#include "hb-private.hh"
+
+#include "hb-ot-shape-complex-indic-private.hh"
+
+
+/* buffer var allocations */
+#define khmer_category() indic_category() /* khmer_category_t */
+#define khmer_position() indic_position() /* khmer_position_t */
+
+
+typedef indic_category_t khmer_category_t;
+typedef indic_position_t khmer_position_t;
+
+
+static inline khmer_position_t
+matra_position_khmer (khmer_position_t side)
+{
+  switch ((int) side)
+  {
+    case POS_PRE_C:
+      return POS_PRE_M;
+
+    case POS_POST_C:
+    case POS_ABOVE_C:
+    case POS_BELOW_C:
+      return POS_AFTER_POST;
+
+    default:
+      return side;
+  };
+}
+
+static inline bool
+is_consonant_or_vowel (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, CONSONANT_FLAGS | FLAG (OT_V));
+}
+
+static inline bool
+is_coeng (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, FLAG (OT_Coeng));
+}
+
+static inline void
+set_khmer_properties (hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  unsigned int type = hb_indic_get_categories (u);
+  khmer_category_t cat = (khmer_category_t) (type & 0x7Fu);
+  khmer_position_t pos = (khmer_position_t) (type >> 8);
+
+
+  /*
+   * Re-assign category
+   */
+
+  if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x17CDu, 0x17D1u) ||
+                    u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */
+  {
+    /* These can occur mid-syllable (eg. before matras), even though Unicode marks them as Syllable_Modifier.
+     * https://github.com/roozbehp/unicode-data/issues/5 */
+    cat = OT_M;
+    pos = POS_ABOVE_C;
+  }
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) cat = OT_PLACEHOLDER;
+  else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
+
+
+  /*
+   * Re-assign position.
+   */
+
+  if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS))
+  {
+    pos = POS_BASE_C;
+    if (u == 0x179Au)
+      cat = OT_Ra;
+  }
+  else if (cat == OT_M)
+  {
+    pos = matra_position_khmer (pos);
+  }
+  else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) | FLAG (OT_A) | FLAG (OT_Symbol))))
+  {
+    pos = POS_SMVD;
+  }
+
+  info.khmer_category() = cat;
+  info.khmer_position() = pos;
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_PRIVATE_HH */
diff --git a/src/hb-ot-shape-complex-khmer.cc b/src/hb-ot-shape-complex-khmer.cc
new file mode 100644 (file)
index 0000000..304879d
--- /dev/null
@@ -0,0 +1,835 @@
+/*
+ * Copyright © 2011,2012  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-khmer-private.hh"
+#include "hb-ot-layout-private.hh"
+
+
+/*
+ * Khmer shaper.
+ */
+
+struct feature_list_t {
+  hb_tag_t tag;
+  hb_ot_map_feature_flags_t flags;
+};
+
+static const feature_list_t
+khmer_features[] =
+{
+  /*
+   * Basic features.
+   * These features are applied in order, one at a time, after initial_reordering.
+   */
+  {HB_TAG('p','r','e','f'), F_NONE},
+  {HB_TAG('b','l','w','f'), F_NONE},
+  {HB_TAG('a','b','v','f'), F_NONE},
+  {HB_TAG('p','s','t','f'), F_NONE},
+  {HB_TAG('c','f','a','r'), F_NONE},
+  /*
+   * Other features.
+   * These features are applied all at once, after final_reordering.
+   * Default Bengali font in Windows for example has intermixed
+   * lookups for init,pres,abvs,blws features.
+   */
+  {HB_TAG('p','r','e','s'), F_GLOBAL},
+  {HB_TAG('a','b','v','s'), F_GLOBAL},
+  {HB_TAG('b','l','w','s'), F_GLOBAL},
+  {HB_TAG('p','s','t','s'), F_GLOBAL},
+  /* Positioning features, though we don't care about the types. */
+  {HB_TAG('d','i','s','t'), F_GLOBAL},
+  {HB_TAG('a','b','v','m'), F_GLOBAL},
+  {HB_TAG('b','l','w','m'), F_GLOBAL},
+};
+
+/*
+ * Must be in the same order as the khmer_features array.
+ */
+enum {
+  PREF,
+  BLWF,
+  ABVF,
+  PSTF,
+  CFAR,
+
+  _PRES,
+  _ABVS,
+  _BLWS,
+  _PSTS,
+  _DIST,
+  _ABVM,
+  _BLWM,
+
+  KHMER_NUM_FEATURES,
+  KHMER_BASIC_FEATURES = _PRES /* Don't forget to update this! */
+};
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan,
+                hb_font_t *font,
+                hb_buffer_t *buffer);
+static void
+initial_reordering (const hb_ot_shape_plan_t *plan,
+                   hb_font_t *font,
+                   hb_buffer_t *buffer);
+static void
+final_reordering (const hb_ot_shape_plan_t *plan,
+                 hb_font_t *font,
+                 hb_buffer_t *buffer);
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan,
+                hb_font_t *font,
+                hb_buffer_t *buffer);
+
+static void
+collect_features_khmer (hb_ot_shape_planner_t *plan)
+{
+  hb_ot_map_builder_t *map = &plan->map;
+
+  /* Do this before any lookups have been applied. */
+  map->add_gsub_pause (setup_syllables);
+
+  map->add_global_bool_feature (HB_TAG('l','o','c','l'));
+  /* The Indic specs do not require ccmp, but we apply it here since if
+   * there is a use of it, it's typically at the beginning. */
+  map->add_global_bool_feature (HB_TAG('c','c','m','p'));
+
+
+  unsigned int i = 0;
+  map->add_gsub_pause (initial_reordering);
+  for (; i < KHMER_BASIC_FEATURES; i++) {
+    map->add_feature (khmer_features[i].tag, 1, khmer_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
+    map->add_gsub_pause (nullptr);
+  }
+  map->add_gsub_pause (final_reordering);
+  for (; i < KHMER_NUM_FEATURES; i++) {
+    map->add_feature (khmer_features[i].tag, 1, khmer_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ);
+  }
+
+  map->add_global_bool_feature (HB_TAG('c','a','l','t'));
+  map->add_global_bool_feature (HB_TAG('c','l','i','g'));
+
+  map->add_gsub_pause (clear_syllables);
+}
+
+static void
+override_features_khmer (hb_ot_shape_planner_t *plan)
+{
+  /* Uniscribe does not apply 'kern' in Khmer. */
+  if (hb_options ().uniscribe_bug_compatible)
+  {
+    plan->map.add_feature (HB_TAG('k','e','r','n'), 0, F_GLOBAL);
+  }
+
+  plan->map.add_feature (HB_TAG('l','i','g','a'), 0, F_GLOBAL);
+}
+
+
+struct would_substitute_feature_t
+{
+  inline void init (const hb_ot_map_t *map, hb_tag_t feature_tag, bool zero_context_)
+  {
+    zero_context = zero_context_;
+    map->get_stage_lookups (0/*GSUB*/,
+                           map->get_feature_stage (0/*GSUB*/, feature_tag),
+                           &lookups, &count);
+  }
+
+  inline bool would_substitute (const hb_codepoint_t *glyphs,
+                               unsigned int          glyphs_count,
+                               hb_face_t            *face) const
+  {
+    for (unsigned int i = 0; i < count; i++)
+      if (hb_ot_layout_lookup_would_substitute_fast (face, lookups[i].index, glyphs, glyphs_count, zero_context))
+       return true;
+    return false;
+  }
+
+  private:
+  const hb_ot_map_t::lookup_map_t *lookups;
+  unsigned int count;
+  bool zero_context;
+};
+
+struct khmer_shape_plan_t
+{
+  ASSERT_POD ();
+
+  inline bool get_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
+  {
+    hb_codepoint_t glyph = virama_glyph;
+    if (unlikely (virama_glyph == (hb_codepoint_t) -1))
+    {
+      if (!font->get_nominal_glyph (0x17D2u, &glyph))
+       glyph = 0;
+      /* Technically speaking, the spec says we should apply 'locl' to virama too.
+       * Maybe one day... */
+
+      /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
+       * during shape planning...  Instead, overwrite it here.  It's safe.  Don't worry! */
+      virama_glyph = glyph;
+    }
+
+    *pglyph = glyph;
+    return glyph != 0;
+  }
+
+  mutable hb_codepoint_t virama_glyph;
+
+  would_substitute_feature_t pref;
+
+  hb_mask_t mask_array[KHMER_NUM_FEATURES];
+};
+
+static void *
+data_create_khmer (const hb_ot_shape_plan_t *plan)
+{
+  khmer_shape_plan_t *khmer_plan = (khmer_shape_plan_t *) calloc (1, sizeof (khmer_shape_plan_t));
+  if (unlikely (!khmer_plan))
+    return nullptr;
+
+  khmer_plan->virama_glyph = (hb_codepoint_t) -1;
+
+  khmer_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), true);
+
+  for (unsigned int i = 0; i < ARRAY_LENGTH (khmer_plan->mask_array); i++)
+    khmer_plan->mask_array[i] = (khmer_features[i].flags & F_GLOBAL) ?
+                                0 : plan->map.get_1_mask (khmer_features[i].tag);
+
+  return khmer_plan;
+}
+
+static void
+data_destroy_khmer (void *data)
+{
+  free (data);
+}
+
+
+enum syllable_type_t {
+  consonant_syllable,
+  broken_cluster,
+  non_khmer_cluster,
+};
+
+#include "hb-ot-shape-complex-khmer-machine.hh"
+
+static void
+setup_masks_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
+                  hb_buffer_t              *buffer,
+                  hb_font_t                *font HB_UNUSED)
+{
+  HB_BUFFER_ALLOCATE_VAR (buffer, khmer_category);
+  HB_BUFFER_ALLOCATE_VAR (buffer, khmer_position);
+
+  /* We cannot setup masks here.  We save information about characters
+   * and setup masks later on in a pause-callback. */
+
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    set_khmer_properties (info[i]);
+}
+
+static void
+setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+                hb_font_t *font HB_UNUSED,
+                hb_buffer_t *buffer)
+{
+  find_syllables (buffer);
+  foreach_syllable (buffer, start, end)
+    buffer->unsafe_to_break (start, end);
+}
+
+static int
+compare_khmer_order (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
+{
+  int a = pa->khmer_position();
+  int b = pb->khmer_position();
+
+  return a < b ? -1 : a == b ? 0 : +1;
+}
+
+
+/* Rules from:
+ * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx */
+
+static void
+initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
+                                      hb_face_t *face,
+                                      hb_buffer_t *buffer,
+                                      unsigned int start, unsigned int end)
+{
+  const khmer_shape_plan_t *khmer_plan = (const khmer_shape_plan_t *) plan->data;
+  hb_glyph_info_t *info = buffer->info;
+
+  /* 1. Khmer shaping assumes that a syllable will begin with a Cons, IndV, or Number. */
+
+  /* The first consonant is always the base. */
+  unsigned int base = start;
+  info[base].khmer_position() = POS_BASE_C;
+
+  /* Mark all subsequent consonants as below. */
+  for (unsigned int i = base + 1; i < end; i++)
+    if (is_consonant_or_vowel (info[i]))
+      info[i].khmer_position() = POS_BELOW_C;
+
+  /* Mark final consonants.  A final consonant is one appearing after a matra,
+   * like in Khmer. */
+  for (unsigned int i = base + 1; i < end; i++)
+    if (info[i].khmer_category() == OT_M) {
+      for (unsigned int j = i + 1; j < end; j++)
+        if (is_consonant_or_vowel (info[j])) {
+         info[j].khmer_position() = POS_FINAL_C;
+         break;
+       }
+      break;
+    }
+
+  /* Attach misc marks to previous char to move with them. */
+  {
+    khmer_position_t last_pos = POS_START;
+    for (unsigned int i = start; i < end; i++)
+    {
+      if ((FLAG_UNSAFE (info[i].khmer_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | FLAG (OT_Coeng))))
+      {
+       info[i].khmer_position() = last_pos;
+       if (unlikely (info[i].khmer_category() == OT_H &&
+                     info[i].khmer_position() == POS_PRE_M))
+       {
+         /*
+          * Uniscribe doesn't move the Halant with Left Matra.
+          * TEST: U+092B,U+093F,U+094DE
+          * We follow.  This is important for the Sinhala
+          * U+0DDA split matra since it decomposes to U+0DD9,U+0DCA
+          * where U+0DD9 is a left matra and U+0DCA is the virama.
+          * We don't want to move the virama with the left matra.
+          * TEST: U+0D9A,U+0DDA
+          */
+         for (unsigned int j = i; j > start; j--)
+           if (info[j - 1].khmer_position() != POS_PRE_M) {
+             info[i].khmer_position() = info[j - 1].khmer_position();
+             break;
+           }
+       }
+      } else if (info[i].khmer_position() != POS_SMVD) {
+        last_pos = (khmer_position_t) info[i].khmer_position();
+      }
+    }
+  }
+  /* For post-base consonants let them own anything before them
+   * since the last consonant or matra. */
+  {
+    unsigned int last = base;
+    for (unsigned int i = base + 1; i < end; i++)
+      if (is_consonant_or_vowel (info[i]))
+      {
+       for (unsigned int j = last + 1; j < i; j++)
+         if (info[j].khmer_position() < POS_SMVD)
+           info[j].khmer_position() = info[i].khmer_position();
+       last = i;
+      } else if (info[i].khmer_category() == OT_M)
+        last = i;
+  }
+
+  {
+    /* Use syllable() for sort accounting temporarily. */
+    unsigned int syllable = info[start].syllable();
+    for (unsigned int i = start; i < end; i++)
+      info[i].syllable() = i - start;
+
+    /* Sit tight, rock 'n roll! */
+    hb_stable_sort (info + start, end - start, compare_khmer_order);
+    /* Find base again */
+    base = end;
+    for (unsigned int i = start; i < end; i++)
+      if (info[i].khmer_position() == POS_BASE_C)
+      {
+       base = i;
+       break;
+      }
+
+    /* Note!  syllable() is a one-byte field. */
+    for (unsigned int i = base; i < end; i++)
+      if (info[i].syllable() != 255)
+      {
+       unsigned int max = i;
+       unsigned int j = start + info[i].syllable();
+       while (j != i)
+       {
+         max = MAX (max, j);
+         unsigned int next = start + info[j].syllable();
+         info[j].syllable() = 255; /* So we don't process j later again. */
+         j = next;
+       }
+       if (i != max)
+         buffer->merge_clusters (i, max + 1);
+      }
+
+    /* Put syllable back in. */
+    for (unsigned int i = start; i < end; i++)
+      info[i].syllable() = syllable;
+  }
+
+  /* Setup masks now */
+
+  {
+    hb_mask_t mask;
+
+    /* Post-base */
+    mask = khmer_plan->mask_array[BLWF] | khmer_plan->mask_array[ABVF] | khmer_plan->mask_array[PSTF];
+    for (unsigned int i = base + 1; i < end; i++)
+      info[i].mask  |= mask;
+  }
+
+  unsigned int pref_len = 2;
+  if (khmer_plan->mask_array[PREF] && base + pref_len < end)
+  {
+    /* Find a Halant,Ra sequence and mark it for pre-base-reordering processing. */
+    for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) {
+      hb_codepoint_t glyphs[2];
+      for (unsigned int j = 0; j < pref_len; j++)
+        glyphs[j] = info[i + j].codepoint;
+      if (khmer_plan->pref.would_substitute (glyphs, pref_len, face))
+      {
+       for (unsigned int j = 0; j < pref_len; j++)
+         info[i++].mask |= khmer_plan->mask_array[PREF];
+
+       /* Mark the subsequent stuff with 'cfar'.  Used in Khmer.
+        * Read the feature spec.
+        * This allows distinguishing the following cases with MS Khmer fonts:
+        * U+1784,U+17D2,U+179A,U+17D2,U+1782
+        * U+1784,U+17D2,U+1782,U+17D2,U+179A
+        */
+       if (khmer_plan->mask_array[CFAR])
+         for (; i < end; i++)
+           info[i].mask |= khmer_plan->mask_array[CFAR];
+
+       break;
+      }
+    }
+  }
+}
+
+static void
+initial_reordering_syllable (const hb_ot_shape_plan_t *plan,
+                            hb_face_t *face,
+                            hb_buffer_t *buffer,
+                            unsigned int start, unsigned int end)
+{
+  syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
+  switch (syllable_type)
+  {
+    case broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */
+    case consonant_syllable:
+     initial_reordering_consonant_syllable (plan, face, buffer, start, end);
+     break;
+
+    case non_khmer_cluster:
+      break;
+  }
+}
+
+static inline void
+insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
+                      hb_font_t *font,
+                      hb_buffer_t *buffer)
+{
+  /* Note: This loop is extra overhead, but should not be measurable. */
+  bool has_broken_syllables = false;
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if ((info[i].syllable() & 0x0F) == broken_cluster)
+    {
+      has_broken_syllables = true;
+      break;
+    }
+  if (likely (!has_broken_syllables))
+    return;
+
+
+  hb_codepoint_t dottedcircle_glyph;
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
+    return;
+
+  hb_glyph_info_t dottedcircle = {0};
+  dottedcircle.codepoint = 0x25CCu;
+  set_khmer_properties (dottedcircle);
+  dottedcircle.codepoint = dottedcircle_glyph;
+
+  buffer->clear_output ();
+
+  buffer->idx = 0;
+  unsigned int last_syllable = 0;
+  while (buffer->idx < buffer->len && !buffer->in_error)
+  {
+    unsigned int syllable = buffer->cur().syllable();
+    syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
+    if (unlikely (last_syllable != syllable && syllable_type == broken_cluster))
+    {
+      last_syllable = syllable;
+
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
+      /* TODO Set glyph_props? */
+
+      /* Insert dottedcircle after possible Repha. */
+      while (buffer->idx < buffer->len && !buffer->in_error &&
+            last_syllable == buffer->cur().syllable() &&
+            buffer->cur().khmer_category() == OT_Repha)
+        buffer->next_glyph ();
+
+      buffer->output_info (ginfo);
+    }
+    else
+      buffer->next_glyph ();
+  }
+
+  buffer->swap_buffers ();
+}
+
+static void
+initial_reordering (const hb_ot_shape_plan_t *plan,
+                   hb_font_t *font,
+                   hb_buffer_t *buffer)
+{
+  insert_dotted_circles (plan, font, buffer);
+
+  foreach_syllable (buffer, start, end)
+    initial_reordering_syllable (plan, font->face, buffer, start, end);
+}
+
+static void
+final_reordering_syllable (const hb_ot_shape_plan_t *plan,
+                          hb_buffer_t *buffer,
+                          unsigned int start, unsigned int end)
+{
+  const khmer_shape_plan_t *khmer_plan = (const khmer_shape_plan_t *) plan->data;
+  hb_glyph_info_t *info = buffer->info;
+
+
+  /* This function relies heavily on halant glyphs.  Lots of ligation
+   * and possibly multiple substitutions happened prior to this
+   * phase, and that might have messed up our properties.  Recover
+   * from a particular case of that where we're fairly sure that a
+   * class of OT_H is desired but has been lost. */
+  if (khmer_plan->virama_glyph)
+  {
+    unsigned int virama_glyph = khmer_plan->virama_glyph;
+    for (unsigned int i = start; i < end; i++)
+      if (info[i].codepoint == virama_glyph &&
+         _hb_glyph_info_ligated (&info[i]) &&
+         _hb_glyph_info_multiplied (&info[i]))
+      {
+        /* This will make sure that this glyph passes is_coeng() test. */
+       info[i].khmer_category() = OT_H;
+       _hb_glyph_info_clear_ligated_and_multiplied (&info[i]);
+      }
+  }
+
+
+  /* 4. Final reordering:
+   *
+   * After the localized forms and basic shaping forms GSUB features have been
+   * applied (see below), the shaping engine performs some final glyph
+   * reordering before applying all the remaining font features to the entire
+   * syllable.
+   */
+
+  bool try_pref = !!khmer_plan->mask_array[PREF];
+
+  /* Find base again */
+  unsigned int base;
+  for (base = start; base < end; base++)
+    if (info[base].khmer_position() >= POS_BASE_C)
+    {
+      if (try_pref && base + 1 < end)
+      {
+       for (unsigned int i = base + 1; i < end; i++)
+         if ((info[i].mask & khmer_plan->mask_array[PREF]) != 0)
+         {
+           if (!(_hb_glyph_info_substituted (&info[i]) &&
+                 _hb_glyph_info_ligated_and_didnt_multiply (&info[i])))
+           {
+             /* Ok, this was a 'pref' candidate but didn't form any.
+              * Base is around here... */
+             base = i;
+             while (base < end && is_coeng (info[base]))
+               base++;
+             info[base].khmer_position() = POS_BASE_C;
+
+             try_pref = false;
+           }
+           break;
+         }
+      }
+
+      if (start < base && info[base].khmer_position() > POS_BASE_C)
+        base--;
+      break;
+    }
+  if (base == end && start < base &&
+      is_one_of (info[base - 1], FLAG (OT_ZWJ)))
+    base--;
+  if (base < end)
+    while (start < base &&
+          is_one_of (info[base], (FLAG (OT_N) | FLAG (OT_Coeng))))
+      base--;
+
+
+  /*   o Reorder matras:
+   *
+   *     If a pre-base matra character had been reordered before applying basic
+   *     features, the glyph can be moved closer to the main consonant based on
+   *     whether half-forms had been formed. Actual position for the matra is
+   *     defined as “after last standalone halant glyph, after initial matra
+   *     position and before the main consonant”. If ZWJ or ZWNJ follow this
+   *     halant, position is moved after it.
+   */
+
+  if (start + 1 < end && start < base) /* Otherwise there can't be any pre-base matra characters. */
+  {
+    /* If we lost track of base, alas, position before last thingy. */
+    unsigned int new_pos = base == end ? base - 2 : base - 1;
+
+    while (new_pos > start &&
+          !(is_one_of (info[new_pos], (FLAG (OT_M) | FLAG (OT_Coeng)))))
+      new_pos--;
+
+    /* If we found no Halant we are done.
+     * Otherwise only proceed if the Halant does
+     * not belong to the Matra itself! */
+    if (is_coeng (info[new_pos]) &&
+       info[new_pos].khmer_position() != POS_PRE_M)
+    {
+      /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
+      if (new_pos + 1 < end && is_joiner (info[new_pos + 1]))
+       new_pos++;
+    }
+    else
+      new_pos = start; /* No move. */
+
+    if (start < new_pos && info[new_pos].khmer_position () != POS_PRE_M)
+    {
+      /* Now go see if there's actually any matras... */
+      for (unsigned int i = new_pos; i > start; i--)
+       if (info[i - 1].khmer_position () == POS_PRE_M)
+       {
+         unsigned int old_pos = i - 1;
+         if (old_pos < base && base <= new_pos) /* Shouldn't actually happen. */
+           base--;
+
+         hb_glyph_info_t tmp = info[old_pos];
+         memmove (&info[old_pos], &info[old_pos + 1], (new_pos - old_pos) * sizeof (info[0]));
+         info[new_pos] = tmp;
+
+         /* Note: this merge_clusters() is intentionally *after* the reordering.
+          * Indic matra reordering is special and tricky... */
+         buffer->merge_clusters (new_pos, MIN (end, base + 1));
+
+         new_pos--;
+       }
+    } else {
+      for (unsigned int i = start; i < base; i++)
+       if (info[i].khmer_position () == POS_PRE_M) {
+         buffer->merge_clusters (i, MIN (end, base + 1));
+         break;
+       }
+    }
+  }
+
+
+  /*   o Reorder pre-base-reordering consonants:
+   *
+   *     If a pre-base-reordering consonant is found, reorder it according to
+   *     the following rules:
+   */
+
+  if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base-reordering Ra. */
+  {
+    for (unsigned int i = base + 1; i < end; i++)
+      if ((info[i].mask & khmer_plan->mask_array[PREF]) != 0)
+      {
+       /*       1. Only reorder a glyph produced by substitution during application
+        *          of the <pref> feature. (Note that a font may shape a Ra consonant with
+        *          the feature generally but block it in certain contexts.)
+        */
+        /* Note: We just check that something got substituted.  We don't check that
+        * the <pref> feature actually did it...
+        *
+        * Reorder pref only if it ligated. */
+       if (_hb_glyph_info_ligated_and_didnt_multiply (&info[i]))
+       {
+         /*
+          *       2. Try to find a target position the same way as for pre-base matra.
+          *          If it is found, reorder pre-base consonant glyph.
+          *
+          *       3. If position is not found, reorder immediately before main
+          *          consonant.
+          */
+
+         unsigned int new_pos = base;
+         while (new_pos > start &&
+                !(is_one_of (info[new_pos - 1], FLAG(OT_M) | FLAG (OT_Coeng))))
+           new_pos--;
+
+         /* In Khmer coeng model, a H,Ra can go *after* matras.  If it goes after a
+          * split matra, it should be reordered to *before* the left part of such matra. */
+         if (new_pos > start && info[new_pos - 1].khmer_category() == OT_M)
+         {
+           unsigned int old_pos = i;
+           for (unsigned int j = base + 1; j < old_pos; j++)
+             if (info[j].khmer_category() == OT_M)
+             {
+               new_pos--;
+               break;
+             }
+         }
+
+         if (new_pos > start && is_coeng (info[new_pos - 1]))
+         {
+           /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
+           if (new_pos < end && is_joiner (info[new_pos]))
+             new_pos++;
+         }
+
+         {
+           unsigned int old_pos = i;
+
+           buffer->merge_clusters (new_pos, old_pos + 1);
+           hb_glyph_info_t tmp = info[old_pos];
+           memmove (&info[new_pos + 1], &info[new_pos], (old_pos - new_pos) * sizeof (info[0]));
+           info[new_pos] = tmp;
+
+           if (new_pos <= base && base < old_pos)
+             base++;
+         }
+       }
+
+        break;
+      }
+  }
+
+
+  /*
+   * Finish off the clusters and go home!
+   */
+  if (hb_options ().uniscribe_bug_compatible)
+  {
+    /* Uniscribe merges the entire syllable into a single cluster... Except for Tamil & Sinhala.
+     * This means, half forms are submerged into the main consonant's cluster.
+     * This is unnecessary, and makes cursor positioning harder, but that's what
+     * Uniscribe does. */
+    buffer->merge_clusters (start, end);
+  }
+}
+
+
+static void
+final_reordering (const hb_ot_shape_plan_t *plan,
+                 hb_font_t *font HB_UNUSED,
+                 hb_buffer_t *buffer)
+{
+  unsigned int count = buffer->len;
+  if (unlikely (!count)) return;
+
+  foreach_syllable (buffer, start, end)
+    final_reordering_syllable (plan, buffer, start, end);
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category);
+  HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_position);
+}
+
+
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+                hb_font_t *font HB_UNUSED,
+                hb_buffer_t *buffer)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+    info[i].syllable() = 0;
+}
+
+
+static bool
+decompose_khmer (const hb_ot_shape_normalize_context_t *c,
+                hb_codepoint_t  ab,
+                hb_codepoint_t *a,
+                hb_codepoint_t *b)
+{
+  switch (ab)
+  {
+    /*
+     * Decompose split matras that don't have Unicode decompositions.
+     */
+
+    /* Khmer */
+    case 0x17BEu  : *a = 0x17C1u; *b= 0x17BEu; return true;
+    case 0x17BFu  : *a = 0x17C1u; *b= 0x17BFu; return true;
+    case 0x17C0u  : *a = 0x17C1u; *b= 0x17C0u; return true;
+    case 0x17C4u  : *a = 0x17C1u; *b= 0x17C4u; return true;
+    case 0x17C5u  : *a = 0x17C1u; *b= 0x17C5u; return true;
+  }
+
+  return (bool) c->unicode->decompose (ab, a, b);
+}
+
+static bool
+compose_khmer (const hb_ot_shape_normalize_context_t *c,
+              hb_codepoint_t  a,
+              hb_codepoint_t  b,
+              hb_codepoint_t *ab)
+{
+  /* Avoid recomposing split matras. */
+  if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a)))
+    return false;
+
+  return (bool) c->unicode->compose (a, b, ab);
+}
+
+
+const hb_ot_complex_shaper_t _hb_ot_complex_shaper_khmer =
+{
+  collect_features_khmer,
+  override_features_khmer,
+  data_create_khmer,
+  data_destroy_khmer,
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
+  HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
+  decompose_khmer,
+  compose_khmer,
+  setup_masks_khmer,
+  nullptr, /* disable_otl */
+  nullptr, /* reorder_marks */
+  HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+  false, /* fallback_position */
+};
index d2fe742..fb67dd4 100644 (file)
@@ -1,5 +1,5 @@
 
 
-#line 1 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 1 "hb-ot-shape-complex-myanmar-machine.rl"
 /*
  * Copyright © 2011,2012  Google, Inc.
  *
 /*
  * Copyright © 2011,2012  Google, Inc.
  *
 #include "hb-private.hh"
 
 
 #include "hb-private.hh"
 
 
-#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 36 "hb-ot-shape-complex-myanmar-machine.hh"
 static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
 static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
-       1u, 31u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 
+       1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 
        3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 
        3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 
-       3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, 5u, 8u, 
-       5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 
-       3u, 30u, 3u, 29u, 1u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 
-       3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 8u, 8u, 0
+       3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, 
+       5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 
+       3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 
+       3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 32u, 8u, 8u, 
+       0
 };
 
 static const char _myanmar_syllable_machine_key_spans[] = {
 };
 
 static const char _myanmar_syllable_machine_key_spans[] = {
-       31, 28, 25, 4, 25, 23, 21, 21, 
+       32, 28, 25, 4, 25, 23, 21, 21, 
        27, 27, 27, 27, 16, 27, 27, 27, 
        27, 27, 27, 27, 16, 27, 27, 27, 
-       27, 27, 27, 27, 27, 27, 25, 4
-       25, 23, 21, 21, 27, 27, 27, 27, 
-       28, 27, 30, 27, 27, 27, 27, 27, 
-       27, 27, 27, 27, 1
+       27, 27, 28, 27, 27, 27, 27, 25
+       4, 25, 23, 21, 21, 27, 27, 27, 
+       27, 28, 27, 32, 27, 27, 27, 27, 
+       27, 28, 27, 27, 27, 27, 32, 1
 };
 
 static const short _myanmar_syllable_machine_index_offsets[] = {
 };
 
 static const short _myanmar_syllable_machine_index_offsets[] = {
-       0, 32, 61, 87, 92, 118, 142, 164
-       186, 214, 242, 270, 298, 315, 343, 371
-       399, 427, 455, 483, 511, 539, 567, 593
-       598, 624, 648, 670, 692, 720, 748, 776
-       804, 833, 861, 892, 920, 948, 976, 1004
-       1032, 1060, 1088, 1116, 1144
+       0, 33, 62, 88, 93, 119, 143, 165
+       187, 215, 243, 271, 299, 316, 344, 372
+       400, 428, 456, 485, 513, 541, 569, 597
+       623, 628, 654, 678, 700, 722, 750, 778
+       806, 834, 863, 891, 924, 952, 980, 1008
+       1036, 1064, 1093, 1121, 1149, 1177, 1205, 1238
 };
 
 static const char _myanmar_syllable_machine_indicies[] = {
        1, 1, 2, 3, 4, 4, 0, 5, 
        0, 6, 1, 0, 0, 0, 0, 7, 
 };
 
 static const char _myanmar_syllable_machine_indicies[] = {
        1, 1, 2, 3, 4, 4, 0, 5, 
        0, 6, 1, 0, 0, 0, 0, 7, 
-       0, 8, 1, 0, 9, 10, 11, 12, 
-       13, 14, 15, 16, 17, 18, 19, 0, 
-       21, 22, 23, 23, 20, 24, 20, 25, 
-       20, 20, 20, 20, 20, 20, 20, 26, 
-       20, 20, 27, 28, 29, 30, 31, 32, 
-       33, 34, 35, 36, 20, 23, 23, 20, 
-       24, 20, 20, 20, 20, 20, 20, 20, 
-       20, 20, 37, 20, 20, 20, 20, 20, 
-       20, 31, 20, 20, 20, 35, 20, 23, 
-       23, 20, 24, 20, 23, 23, 20, 24, 
-       20, 20, 20, 20, 20, 20, 20, 20, 
-       20, 20, 20, 20, 20, 20, 20, 20, 
-       31, 20, 20, 20, 35, 20, 38, 20, 
-       23, 23, 20, 24, 20, 31, 20, 20, 
-       20, 20, 20, 20, 20, 39, 20, 20, 
-       20, 20, 20, 20, 31, 20, 23, 23, 
-       20, 24, 20, 20, 20, 20, 20, 20, 
-       20, 20, 20, 39, 20, 20, 20, 20, 
-       20, 20, 31, 20, 23, 23, 20, 24, 
-       20, 20, 20, 20, 20, 20, 20, 20, 
-       20, 20, 20, 20, 20, 20, 20, 20, 
-       31, 20, 21, 20, 23, 23, 20, 24, 
-       20, 25, 20, 20, 20, 20, 20, 20, 
-       20, 40, 20, 20, 40, 20, 20, 20, 
-       31, 41, 20, 20, 35, 20, 21, 20, 
-       23, 23, 20, 24, 20, 25, 20, 20, 
-       20, 20, 20, 20, 20, 20, 20, 20, 
-       20, 20, 20, 20, 31, 20, 20, 20, 
-       35, 20, 21, 20, 23, 23, 20, 24, 
-       20, 25, 20, 20, 20, 20, 20, 20, 
-       20, 40, 20, 20, 20, 20, 20, 20, 
-       31, 41, 20, 20, 35, 20, 21, 20, 
-       23, 23, 20, 24, 20, 25, 20, 20, 
-       20, 20, 20, 20, 20, 20, 20, 20, 
-       20, 20, 20, 20, 31, 41, 20, 20, 
-       35, 20, 1, 1, 20, 20, 20, 20, 
-       20, 20, 20, 20, 20, 20, 20, 20, 
-       20, 1, 20, 21, 20, 23, 23, 20, 
-       24, 20, 25, 20, 20, 20, 20, 20, 
-       20, 20, 26, 20, 20, 27, 28, 29, 
-       30, 31, 32, 33, 34, 35, 20, 21, 
-       20, 23, 23, 20, 24, 20, 25, 20, 
-       20, 20, 20, 20, 20, 20, 34, 20, 
-       20, 20, 20, 20, 20, 31, 32, 33, 
-       34, 35, 20, 21, 20, 23, 23, 20, 
-       24, 20, 25, 20, 20, 20, 20, 20, 
-       20, 20, 20, 20, 20, 20, 20, 20, 
-       20, 31, 32, 33, 34, 35, 20, 21, 
-       20, 23, 23, 20, 24, 20, 25, 20, 
-       20, 20, 20, 20, 20, 20, 20, 20, 
-       20, 20, 20, 20, 20, 31, 32, 33, 
-       20, 35, 20, 21, 20, 23, 23, 20, 
-       24, 20, 25, 20, 20, 20, 20, 20, 
-       20, 20, 20, 20, 20, 20, 20, 20, 
-       20, 31, 20, 33, 20, 35, 20, 21, 
-       20, 23, 23, 20, 24, 20, 25, 20, 
-       20, 20, 20, 20, 20, 20, 34, 20, 
-       20, 27, 20, 29, 20, 31, 32, 33, 
-       34, 35, 20, 21, 20, 23, 23, 20, 
-       24, 20, 25, 20, 20, 20, 20, 20, 
-       20, 20, 34, 20, 20, 27, 20, 20, 
-       20, 31, 32, 33, 34, 35, 20, 21, 
-       20, 23, 23, 20, 24, 20, 25, 20, 
-       20, 20, 20, 20, 20, 20, 34, 20, 
-       20, 27, 28, 29, 20, 31, 32, 33, 
-       34, 35, 20, 21, 22, 23, 23, 20, 
-       24, 20, 25, 20, 20, 20, 20, 20, 
-       20, 20, 26, 20, 20, 27, 28, 29, 
-       30, 31, 32, 33, 34, 35, 20, 3, 
-       3, 42, 5, 42, 42, 42, 42, 42, 
-       42, 42, 42, 42, 43, 42, 42, 42, 
-       42, 42, 42, 13, 42, 42, 42, 17, 
-       42, 3, 3, 42, 5, 42, 3, 3, 
-       42, 5, 42, 42, 42, 42, 42, 42, 
-       42, 42, 42, 42, 42, 42, 42, 42, 
-       42, 42, 13, 42, 42, 42, 17, 42, 
-       44, 42, 3, 3, 42, 5, 42, 13, 
-       42, 42, 42, 42, 42, 42, 42, 45, 
-       42, 42, 42, 42, 42, 42, 13, 42, 
-       3, 3, 42, 5, 42, 42, 42, 42, 
-       42, 42, 42, 42, 42, 45, 42, 42, 
-       42, 42, 42, 42, 13, 42, 3, 3, 
-       42, 5, 42, 42, 42, 42, 42, 42, 
-       42, 42, 42, 42, 42, 42, 42, 42, 
-       42, 42, 13, 42, 2, 42, 3, 3, 
-       42, 5, 42, 6, 42, 42, 42, 42, 
-       42, 42, 42, 46, 42, 42, 46, 42, 
-       42, 42, 13, 47, 42, 42, 17, 42, 
-       2, 42, 3, 3, 42, 5, 42, 6, 
-       42, 42, 42, 42, 42, 42, 42, 42, 
-       42, 42, 42, 42, 42, 42, 13, 42, 
-       42, 42, 17, 42, 2, 42, 3, 3, 
-       42, 5, 42, 6, 42, 42, 42, 42, 
-       42, 42, 42, 46, 42, 42, 42, 42, 
-       42, 42, 13, 47, 42, 42, 17, 42, 
-       2, 42, 3, 3, 42, 5, 42, 6, 
-       42, 42, 42, 42, 42, 42, 42, 42, 
-       42, 42, 42, 42, 42, 42, 13, 47, 
-       42, 42, 17, 42, 21, 22, 23, 23, 
-       20, 24, 20, 25, 20, 20, 20, 20, 
-       20, 20, 20, 48, 20, 20, 27, 28, 
-       29, 30, 31, 32, 33, 34, 35, 36, 
-       20, 21, 49, 23, 23, 20, 24, 20, 
-       25, 20, 20, 20, 20, 20, 20, 20, 
-       26, 20, 20, 27, 28, 29, 30, 31, 
-       32, 33, 34, 35, 20, 1, 1, 2, 
-       3, 3, 3, 42, 5, 42, 6, 1, 
-       42, 42, 42, 42, 1, 42, 8, 1, 
-       42, 9, 10, 11, 12, 13, 14, 15, 
-       16, 17, 18, 42, 2, 42, 3, 3, 
-       42, 5, 42, 6, 42, 42, 42, 42, 
-       42, 42, 42, 8, 42, 42, 9, 10, 
-       11, 12, 13, 14, 15, 16, 17, 42, 
-       2, 42, 3, 3, 42, 5, 42, 6, 
-       42, 42, 42, 42, 42, 42, 42, 16, 
-       42, 42, 42, 42, 42, 42, 13, 14, 
-       15, 16, 17, 42, 2, 42, 3, 3, 
-       42, 5, 42, 6, 42, 42, 42, 42, 
-       42, 42, 42, 42, 42, 42, 42, 42, 
-       42, 42, 13, 14, 15, 16, 17, 42, 
-       2, 42, 3, 3, 42, 5, 42, 6, 
-       42, 42, 42, 42, 42, 42, 42, 42, 
-       42, 42, 42, 42, 42, 42, 13, 14, 
-       15, 42, 17, 42, 2, 42, 3, 3, 
-       42, 5, 42, 6, 42, 42, 42, 42, 
-       42, 42, 42, 42, 42, 42, 42, 42, 
-       42, 42, 13, 42, 15, 42, 17, 42, 
-       2, 42, 3, 3, 42, 5, 42, 6, 
-       42, 42, 42, 42, 42, 42, 42, 16, 
-       42, 42, 9, 42, 11, 42, 13, 14, 
-       15, 16, 17, 42, 2, 42, 3, 3, 
-       42, 5, 42, 6, 42, 42, 42, 42, 
-       42, 42, 42, 16, 42, 42, 9, 42, 
-       42, 42, 13, 14, 15, 16, 17, 42, 
-       2, 42, 3, 3, 42, 5, 42, 6, 
-       42, 42, 42, 42, 42, 42, 42, 16, 
-       42, 42, 9, 10, 11, 42, 13, 14, 
-       15, 16, 17, 42, 2, 3, 3, 3, 
-       42, 5, 42, 6, 42, 42, 42, 42, 
-       42, 42, 42, 8, 42, 42, 9, 10, 
-       11, 12, 13, 14, 15, 16, 17, 42, 
-       51, 50, 0
+       0, 8, 9, 0, 10, 11, 12, 13, 
+       14, 15, 16, 17, 18, 19, 20, 1, 
+       0, 22, 23, 24, 24, 21, 25, 21, 
+       26, 21, 21, 21, 21, 21, 21, 21, 
+       27, 21, 21, 28, 29, 30, 31, 32, 
+       33, 34, 35, 36, 37, 21, 24, 24, 
+       21, 25, 21, 21, 21, 21, 21, 21, 
+       21, 21, 21, 38, 21, 21, 21, 21, 
+       21, 21, 32, 21, 21, 21, 36, 21, 
+       24, 24, 21, 25, 21, 24, 24, 21, 
+       25, 21, 21, 21, 21, 21, 21, 21, 
+       21, 21, 21, 21, 21, 21, 21, 21, 
+       21, 32, 21, 21, 21, 36, 21, 39, 
+       21, 24, 24, 21, 25, 21, 32, 21, 
+       21, 21, 21, 21, 21, 21, 40, 21, 
+       21, 21, 21, 21, 21, 32, 21, 24, 
+       24, 21, 25, 21, 21, 21, 21, 21, 
+       21, 21, 21, 21, 40, 21, 21, 21, 
+       21, 21, 21, 32, 21, 24, 24, 21, 
+       25, 21, 21, 21, 21, 21, 21, 21, 
+       21, 21, 21, 21, 21, 21, 21, 21, 
+       21, 32, 21, 22, 21, 24, 24, 21, 
+       25, 21, 26, 21, 21, 21, 21, 21, 
+       21, 21, 41, 21, 21, 41, 21, 21, 
+       21, 32, 42, 21, 21, 36, 21, 22, 
+       21, 24, 24, 21, 25, 21, 26, 21, 
+       21, 21, 21, 21, 21, 21, 21, 21, 
+       21, 21, 21, 21, 21, 32, 21, 21, 
+       21, 36, 21, 22, 21, 24, 24, 21, 
+       25, 21, 26, 21, 21, 21, 21, 21, 
+       21, 21, 41, 21, 21, 21, 21, 21, 
+       21, 32, 42, 21, 21, 36, 21, 22, 
+       21, 24, 24, 21, 25, 21, 26, 21, 
+       21, 21, 21, 21, 21, 21, 21, 21, 
+       21, 21, 21, 21, 21, 32, 42, 21, 
+       21, 36, 21, 1, 1, 21, 21, 21, 
+       21, 21, 21, 21, 21, 21, 21, 21, 
+       21, 21, 1, 21, 22, 21, 24, 24, 
+       21, 25, 21, 26, 21, 21, 21, 21, 
+       21, 21, 21, 27, 21, 21, 28, 29, 
+       30, 31, 32, 33, 34, 35, 36, 21, 
+       22, 21, 24, 24, 21, 25, 21, 26, 
+       21, 21, 21, 21, 21, 21, 21, 43, 
+       21, 21, 21, 21, 21, 21, 32, 33, 
+       34, 35, 36, 21, 22, 21, 24, 24, 
+       21, 25, 21, 26, 21, 21, 21, 21, 
+       21, 21, 21, 21, 21, 21, 21, 21, 
+       21, 21, 32, 33, 34, 35, 36, 21, 
+       22, 21, 24, 24, 21, 25, 21, 26, 
+       21, 21, 21, 21, 21, 21, 21, 21, 
+       21, 21, 21, 21, 21, 21, 32, 33, 
+       34, 21, 36, 21, 22, 21, 24, 24, 
+       21, 25, 21, 26, 21, 21, 21, 21, 
+       21, 21, 21, 21, 21, 21, 21, 21, 
+       21, 21, 32, 21, 34, 21, 36, 21, 
+       22, 21, 24, 24, 21, 25, 21, 26, 
+       21, 21, 21, 21, 21, 21, 21, 21, 
+       21, 21, 21, 21, 21, 21, 32, 33, 
+       34, 35, 36, 43, 21, 22, 21, 24, 
+       24, 21, 25, 21, 26, 21, 21, 21, 
+       21, 21, 21, 21, 43, 21, 21, 28, 
+       21, 30, 21, 32, 33, 34, 35, 36, 
+       21, 22, 21, 24, 24, 21, 25, 21, 
+       26, 21, 21, 21, 21, 21, 21, 21, 
+       43, 21, 21, 28, 21, 21, 21, 32, 
+       33, 34, 35, 36, 21, 22, 21, 24, 
+       24, 21, 25, 21, 26, 21, 21, 21, 
+       21, 21, 21, 21, 43, 21, 21, 28, 
+       29, 30, 21, 32, 33, 34, 35, 36, 
+       21, 22, 23, 24, 24, 21, 25, 21, 
+       26, 21, 21, 21, 21, 21, 21, 21, 
+       27, 21, 21, 28, 29, 30, 31, 32, 
+       33, 34, 35, 36, 21, 3, 3, 44, 
+       5, 44, 44, 44, 44, 44, 44, 44, 
+       44, 44, 45, 44, 44, 44, 44, 44, 
+       44, 14, 44, 44, 44, 18, 44, 3, 
+       3, 44, 5, 44, 3, 3, 44, 5, 
+       44, 44, 44, 44, 44, 44, 44, 44, 
+       44, 44, 44, 44, 44, 44, 44, 44, 
+       14, 44, 44, 44, 18, 44, 46, 44, 
+       3, 3, 44, 5, 44, 14, 44, 44, 
+       44, 44, 44, 44, 44, 47, 44, 44, 
+       44, 44, 44, 44, 14, 44, 3, 3, 
+       44, 5, 44, 44, 44, 44, 44, 44, 
+       44, 44, 44, 47, 44, 44, 44, 44, 
+       44, 44, 14, 44, 3, 3, 44, 5, 
+       44, 44, 44, 44, 44, 44, 44, 44, 
+       44, 44, 44, 44, 44, 44, 44, 44, 
+       14, 44, 2, 44, 3, 3, 44, 5, 
+       44, 6, 44, 44, 44, 44, 44, 44, 
+       44, 48, 44, 44, 48, 44, 44, 44, 
+       14, 49, 44, 44, 18, 44, 2, 44, 
+       3, 3, 44, 5, 44, 6, 44, 44, 
+       44, 44, 44, 44, 44, 44, 44, 44, 
+       44, 44, 44, 44, 14, 44, 44, 44, 
+       18, 44, 2, 44, 3, 3, 44, 5, 
+       44, 6, 44, 44, 44, 44, 44, 44, 
+       44, 48, 44, 44, 44, 44, 44, 44, 
+       14, 49, 44, 44, 18, 44, 2, 44, 
+       3, 3, 44, 5, 44, 6, 44, 44, 
+       44, 44, 44, 44, 44, 44, 44, 44, 
+       44, 44, 44, 44, 14, 49, 44, 44, 
+       18, 44, 22, 23, 24, 24, 21, 25, 
+       21, 26, 21, 21, 21, 21, 21, 21, 
+       21, 50, 21, 21, 28, 29, 30, 31, 
+       32, 33, 34, 35, 36, 37, 21, 22, 
+       51, 24, 24, 21, 25, 21, 26, 21, 
+       21, 21, 21, 21, 21, 21, 27, 21, 
+       21, 28, 29, 30, 31, 32, 33, 34, 
+       35, 36, 21, 1, 1, 2, 3, 3, 
+       3, 44, 5, 44, 6, 1, 44, 44, 
+       44, 44, 1, 44, 8, 44, 44, 10, 
+       11, 12, 13, 14, 15, 16, 17, 18, 
+       19, 44, 1, 44, 2, 44, 3, 3, 
+       44, 5, 44, 6, 44, 44, 44, 44, 
+       44, 44, 44, 8, 44, 44, 10, 11, 
+       12, 13, 14, 15, 16, 17, 18, 44, 
+       2, 44, 3, 3, 44, 5, 44, 6, 
+       44, 44, 44, 44, 44, 44, 44, 52, 
+       44, 44, 44, 44, 44, 44, 14, 15, 
+       16, 17, 18, 44, 2, 44, 3, 3, 
+       44, 5, 44, 6, 44, 44, 44, 44, 
+       44, 44, 44, 44, 44, 44, 44, 44, 
+       44, 44, 14, 15, 16, 17, 18, 44, 
+       2, 44, 3, 3, 44, 5, 44, 6, 
+       44, 44, 44, 44, 44, 44, 44, 44, 
+       44, 44, 44, 44, 44, 44, 14, 15, 
+       16, 44, 18, 44, 2, 44, 3, 3, 
+       44, 5, 44, 6, 44, 44, 44, 44, 
+       44, 44, 44, 44, 44, 44, 44, 44, 
+       44, 44, 14, 44, 16, 44, 18, 44, 
+       2, 44, 3, 3, 44, 5, 44, 6, 
+       44, 44, 44, 44, 44, 44, 44, 44, 
+       44, 44, 44, 44, 44, 44, 14, 15, 
+       16, 17, 18, 52, 44, 2, 44, 3, 
+       3, 44, 5, 44, 6, 44, 44, 44, 
+       44, 44, 44, 44, 52, 44, 44, 10, 
+       44, 12, 44, 14, 15, 16, 17, 18, 
+       44, 2, 44, 3, 3, 44, 5, 44, 
+       6, 44, 44, 44, 44, 44, 44, 44, 
+       52, 44, 44, 10, 44, 44, 44, 14, 
+       15, 16, 17, 18, 44, 2, 44, 3, 
+       3, 44, 5, 44, 6, 44, 44, 44, 
+       44, 44, 44, 44, 52, 44, 44, 10, 
+       11, 12, 44, 14, 15, 16, 17, 18, 
+       44, 2, 3, 3, 3, 44, 5, 44, 
+       6, 44, 44, 44, 44, 44, 44, 44, 
+       8, 44, 44, 10, 11, 12, 13, 14, 
+       15, 16, 17, 18, 44, 1, 1, 53, 
+       53, 53, 53, 53, 53, 53, 53, 1, 
+       53, 53, 53, 53, 1, 53, 53, 53, 
+       53, 53, 53, 53, 53, 53, 53, 53, 
+       53, 53, 53, 53, 1, 53, 54, 53, 
+       0
 };
 
 static const char _myanmar_syllable_machine_trans_targs[] = {
 };
 
 static const char _myanmar_syllable_machine_trans_targs[] = {
-       0, 1, 22, 0, 0, 23, 29, 32
-       35, 36, 40, 41, 42, 25, 38, 39, 
-       37, 28, 43, 44, 0, 2, 12, 0
-       3, 9, 13, 14, 18, 19, 20, 5
-       16, 17, 15, 8, 21, 4, 6, 7
-       10, 11, 0, 24, 26, 27, 30, 31
-       33, 34, 0, 0
+       0, 1, 23, 0, 0, 24, 30, 33
+       36, 46, 37, 42, 43, 44, 26, 39, 
+       40, 41, 29, 45, 47, 0, 2, 12
+       0, 3, 9, 13, 14, 19, 20, 21
+       5, 16, 17, 18, 8, 22, 4, 6
+       7, 10, 11, 15, 0, 25, 27, 28
+       31, 32, 34, 35, 38, 0, 0
 };
 
 static const char _myanmar_syllable_machine_trans_actions[] = {
        3, 0, 0, 4, 5, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
 };
 
 static const char _myanmar_syllable_machine_trans_actions[] = {
        3, 0, 0, 4, 5, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 6, 0, 0, 7, 
+       0, 0, 0, 0, 0, 6, 0, 0, 
+       7, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 8, 0, 0, 0, 0, 0, 
-       0, 0, 9, 10
+       0, 0, 0, 0, 8, 0, 0, 0, 
+       0, 0, 0, 0, 0, 9, 10
 };
 
 static const char _myanmar_syllable_machine_to_state_actions[] = {
 };
 
 static const char _myanmar_syllable_machine_to_state_actions[] = {
@@ -233,7 +246,7 @@ static const char _myanmar_syllable_machine_to_state_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0
+       0, 0, 0, 0, 0, 0, 0, 0
 };
 
 static const char _myanmar_syllable_machine_from_state_actions[] = {
 };
 
 static const char _myanmar_syllable_machine_from_state_actions[] = {
@@ -242,16 +255,16 @@ static const char _myanmar_syllable_machine_from_state_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0
+       0, 0, 0, 0, 0, 0, 0, 0
 };
 
 static const short _myanmar_syllable_machine_eof_trans[] = {
 };
 
 static const short _myanmar_syllable_machine_eof_trans[] = {
-       0, 21, 21, 21, 21, 21, 21, 21
-       21, 21, 21, 21, 21, 21, 21, 21
-       21, 21, 21, 21, 21, 21, 43, 43
-       43, 43, 43, 43, 43, 43, 43, 43
-       21, 21, 43, 43, 43, 43, 43, 43
-       43, 43, 43, 43, 51
+       0, 22, 22, 22, 22, 22, 22, 22
+       22, 22, 22, 22, 22, 22, 22, 22
+       22, 22, 22, 22, 22, 22, 22, 45
+       45, 45, 45, 45, 45, 45, 45, 45
+       45, 22, 22, 45, 45, 45, 45, 45
+       45, 45, 45, 45, 45, 45, 54, 54
 };
 
 static const int myanmar_syllable_machine_start = 0;
 };
 
 static const int myanmar_syllable_machine_start = 0;
@@ -261,11 +274,11 @@ static const int myanmar_syllable_machine_error = -1;
 static const int myanmar_syllable_machine_en_main = 0;
 
 
 static const int myanmar_syllable_machine_en_main = 0;
 
 
-#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 36 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
 
 
 
 
-#line 93 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 94 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
 #define found_syllable(syllable_type) \
 
 
 #define found_syllable(syllable_type) \
@@ -285,7 +298,7 @@ find_syllables (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 289 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 302 "hb-ot-shape-complex-myanmar-machine.hh"
        {
        cs = myanmar_syllable_machine_start;
        ts = 0;
        {
        cs = myanmar_syllable_machine_start;
        ts = 0;
@@ -293,7 +306,7 @@ find_syllables (hb_buffer_t *buffer)
        act = 0;
        }
 
        act = 0;
        }
 
-#line 114 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 115 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
   p = 0;
 
 
   p = 0;
@@ -302,7 +315,7 @@ find_syllables (hb_buffer_t *buffer)
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 306 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 319 "hb-ot-shape-complex-myanmar-machine.hh"
        {
        int _slen;
        int _trans;
        {
        int _slen;
        int _trans;
@@ -316,7 +329,7 @@ _resume:
 #line 1 "NONE"
        {ts = p;}
        break;
 #line 1 "NONE"
        {ts = p;}
        break;
-#line 320 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 333 "hb-ot-shape-complex-myanmar-machine.hh"
        }
 
        _keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
        }
 
        _keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -335,38 +348,38 @@ _eof_trans:
 
        switch ( _myanmar_syllable_machine_trans_actions[_trans] ) {
        case 7:
 
        switch ( _myanmar_syllable_machine_trans_actions[_trans] ) {
        case 7:
-#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
        {te = p+1;{ found_syllable (consonant_syllable); }}
        break;
        case 5:
        {te = p+1;{ found_syllable (consonant_syllable); }}
        break;
        case 5:
-#line 86 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 87 "hb-ot-shape-complex-myanmar-machine.rl"
        {te = p+1;{ found_syllable (non_myanmar_cluster); }}
        break;
        case 10:
        {te = p+1;{ found_syllable (non_myanmar_cluster); }}
        break;
        case 10:
-#line 87 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
        {te = p+1;{ found_syllable (punctuation_cluster); }}
        break;
        case 4:
        {te = p+1;{ found_syllable (punctuation_cluster); }}
        break;
        case 4:
-#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
        {te = p+1;{ found_syllable (broken_cluster); }}
        break;
        case 3:
        {te = p+1;{ found_syllable (broken_cluster); }}
        break;
        case 3:
-#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
        {te = p+1;{ found_syllable (non_myanmar_cluster); }}
        break;
        case 6:
        {te = p+1;{ found_syllable (non_myanmar_cluster); }}
        break;
        case 6:
-#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
        {te = p;p--;{ found_syllable (consonant_syllable); }}
        break;
        case 8:
        {te = p;p--;{ found_syllable (consonant_syllable); }}
        break;
        case 8:
-#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
        {te = p;p--;{ found_syllable (broken_cluster); }}
        break;
        case 9:
        {te = p;p--;{ found_syllable (broken_cluster); }}
        break;
        case 9:
-#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
        {te = p;p--;{ found_syllable (non_myanmar_cluster); }}
        break;
        {te = p;p--;{ found_syllable (non_myanmar_cluster); }}
        break;
-#line 370 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 383 "hb-ot-shape-complex-myanmar-machine.hh"
        }
 
 _again:
        }
 
 _again:
@@ -375,7 +388,7 @@ _again:
 #line 1 "NONE"
        {ts = 0;}
        break;
 #line 1 "NONE"
        {ts = 0;}
        break;
-#line 379 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 392 "hb-ot-shape-complex-myanmar-machine.hh"
        }
 
        if ( ++p != pe )
        }
 
        if ( ++p != pe )
@@ -391,7 +404,7 @@ _again:
 
        }
 
 
        }
 
-#line 123 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 124 "hb-ot-shape-complex-myanmar-machine.rl"
 
 }
 
 
 }
 
index 9649a91..0cd84fa 100644 (file)
@@ -41,7 +41,7 @@
 A    = 10;
 As   = 18;
 C    = 1;
 A    = 10;
 As   = 18;
 C    = 1;
-D    = 19;
+D    = 32;
 D0   = 20;
 DB   = 3;
 GB   = 11;
 D0   = 20;
 DB   = 3;
 GB   = 11;
@@ -62,6 +62,7 @@ ZWJ  = 6;
 ZWNJ = 5;
 Ra   = 16;
 P    = 31;
 ZWNJ = 5;
 Ra   = 16;
 P    = 31;
+CS   = 19;
 
 j = ZWJ|ZWNJ;                  # Joiners
 k = (Ra As H);                 # Kinzi
 
 j = ZWJ|ZWNJ;                  # Joiners
 k = (Ra As H);                 # Kinzi
@@ -69,14 +70,14 @@ k = (Ra As H);                      # Kinzi
 c = C|Ra;                      # is_consonant
 
 medial_group = MY? MR? MW? MH? As?;
 c = C|Ra;                      # is_consonant
 
 medial_group = MY? MR? MW? MH? As?;
-main_vowel_group = VPre* VAbv* VBlw* A* (DB As?)?;
+main_vowel_group = (VPre.VS?)* VAbv* VBlw* A* (DB As?)?;
 post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?;
 pwo_tone_group = PT A* DB? As?;
 
 complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?;
 syllable_tail = (H | complex_syllable_tail);
 
 post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?;
 pwo_tone_group = PT A* DB? As?;
 
 complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?;
 syllable_tail = (H | complex_syllable_tail);
 
-consonant_syllable =   k? (c|IV|D|GB).VS? (H (c|IV).VS?)* syllable_tail;
+consonant_syllable =   (k|CS)? (c|IV|D|GB).VS? (H (c|IV).VS?)* syllable_tail;
 punctuation_cluster =  P V;
 broken_cluster =       k? VS? syllable_tail;
 other =                        any;
 punctuation_cluster =  P V;
 broken_cluster =       k? VS? syllable_tail;
 other =                        any;
diff --git a/src/hb-ot-shape-complex-myanmar-private.hh b/src/hb-ot-shape-complex-myanmar-private.hh
new file mode 100644 (file)
index 0000000..04f81bd
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH
+#define HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH
+
+#include "hb-private.hh"
+
+#include "hb-ot-shape-complex-indic-private.hh"
+
+
+/* buffer var allocations */
+#define myanmar_category() indic_category() /* myanmar_category_t */
+#define myanmar_position() indic_position() /* myanmar_position_t */
+
+
+/* Note: This enum is duplicated in the -machine.rl source file.
+ * Not sure how to avoid duplication. */
+enum myanmar_category_t {
+  OT_As  = 18,  /* Asat */
+  OT_D0  = 20, /* Digit zero */
+  OT_DB  = OT_N, /* Dot below */
+  OT_GB  = OT_PLACEHOLDER,
+  OT_MH  = 21, /* Various consonant medial types */
+  OT_MR  = 22, /* Various consonant medial types */
+  OT_MW  = 23, /* Various consonant medial types */
+  OT_MY  = 24, /* Various consonant medial types */
+  OT_PT  = 25, /* Pwo and other tones */
+  OT_VAbv = 26,
+  OT_VBlw = 27,
+  OT_VPre = 28,
+  OT_VPst = 29,
+  OT_VS   = 30, /* Variation selectors */
+  OT_P    = 31, /* Punctuation */
+  OT_D    = 32, /* Digits except zero */
+};
+
+
+static inline void
+set_myanmar_properties (hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  unsigned int type = hb_indic_get_categories (u);
+  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
+  indic_position_t pos = (indic_position_t) (type >> 8);
+
+  /* Myanmar
+   * http://www.microsoft.com/typography/OpenTypeDev/myanmar/intro.htm#analyze
+   */
+  if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)))
+    cat = (indic_category_t) OT_VS;
+
+  switch (u)
+  {
+    case 0x104Eu:
+      cat = (indic_category_t) OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */
+      break;
+
+    case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u:
+    case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u:
+    case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu:
+    case 0x25FEu:
+      cat = (indic_category_t) OT_GB;
+      break;
+
+    case 0x1004u: case 0x101Bu: case 0x105Au:
+      cat = (indic_category_t) OT_Ra;
+      break;
+
+    case 0x1032u: case 0x1036u:
+      cat = (indic_category_t) OT_A;
+      break;
+
+    case 0x1039u:
+      cat = (indic_category_t) OT_H;
+      break;
+
+    case 0x103Au:
+      cat = (indic_category_t) OT_As;
+      break;
+
+    case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u:
+    case 0x1045u: case 0x1046u: case 0x1047u: case 0x1048u:
+    case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u:
+    case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u:
+    case 0x1097u: case 0x1098u: case 0x1099u:
+      cat = (indic_category_t) OT_D;
+      break;
+
+    case 0x1040u:
+      cat = (indic_category_t) OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */
+      break;
+
+    case 0x103Eu: case 0x1060u:
+      cat = (indic_category_t) OT_MH;
+      break;
+
+    case 0x103Cu:
+      cat = (indic_category_t) OT_MR;
+      break;
+
+    case 0x103Du: case 0x1082u:
+      cat = (indic_category_t) OT_MW;
+      break;
+
+    case 0x103Bu: case 0x105Eu: case 0x105Fu:
+      cat = (indic_category_t) OT_MY;
+      break;
+
+    case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au:
+    case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu:
+      cat = (indic_category_t) OT_PT;
+      break;
+
+    case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u:
+    case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du:
+    case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu:
+      cat = (indic_category_t) OT_SM;
+      break;
+
+    case 0x104Au: case 0x104Bu:
+      cat = (indic_category_t) OT_P;
+      break;
+
+    case 0xAA74u: case 0xAA75u: case 0xAA76u:
+      /* https://github.com/roozbehp/unicode-data/issues/3 */
+      cat = (indic_category_t) OT_C;
+      break;
+  }
+
+  if (cat == OT_M)
+  {
+    switch ((int) pos)
+    {
+      case POS_PRE_C:  cat = (indic_category_t) OT_VPre;
+                       pos = POS_PRE_M;                  break;
+      case POS_ABOVE_C:        cat = (indic_category_t) OT_VAbv; break;
+      case POS_BELOW_C:        cat = (indic_category_t) OT_VBlw; break;
+      case POS_POST_C: cat = (indic_category_t) OT_VPst; break;
+    }
+  }
+
+  info.myanmar_category() = (myanmar_category_t) cat;
+  info.myanmar_position() = pos;
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH */
index bb68622..3c57bc1 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
-#include "hb-ot-shape-complex-indic-private.hh"
-
-/* buffer var allocations */
-#define myanmar_category() complex_var_u8_0() /* myanmar_category_t */
-#define myanmar_position() complex_var_u8_1() /* myanmar_position_t */
+#include "hb-ot-shape-complex-myanmar-private.hh"
 
 
 /*
 
 
 /*
@@ -103,7 +99,7 @@ collect_features_myanmar (hb_ot_shape_planner_t *plan)
   for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++)
   {
     map->add_feature (basic_features[i], 1, F_GLOBAL | F_MANUAL_ZWJ);
   for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++)
   {
     map->add_feature (basic_features[i], 1, F_GLOBAL | F_MANUAL_ZWJ);
-    map->add_gsub_pause (NULL);
+    map->add_gsub_pause (nullptr);
   }
   map->add_gsub_pause (final_reordering);
   for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
   }
   map->add_gsub_pause (final_reordering);
   for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
@@ -127,153 +123,6 @@ enum syllable_type_t {
 #include "hb-ot-shape-complex-myanmar-machine.hh"
 
 
 #include "hb-ot-shape-complex-myanmar-machine.hh"
 
 
-/* Note: This enum is duplicated in the -machine.rl source file.
- * Not sure how to avoid duplication. */
-enum myanmar_category_t {
-  OT_As  = 18, /* Asat */
-  OT_D   = 19, /* Digits except zero */
-  OT_D0  = 20, /* Digit zero */
-  OT_DB  = OT_N, /* Dot below */
-  OT_GB  = OT_PLACEHOLDER,
-  OT_MH  = 21, /* Various consonant medial types */
-  OT_MR  = 22, /* Various consonant medial types */
-  OT_MW  = 23, /* Various consonant medial types */
-  OT_MY  = 24, /* Various consonant medial types */
-  OT_PT  = 25, /* Pwo and other tones */
-  OT_VAbv = 26,
-  OT_VBlw = 27,
-  OT_VPre = 28,
-  OT_VPst = 29,
-  OT_VS   = 30, /* Variation selectors */
-  OT_P    = 31  /* Punctuation */
-};
-
-
-static inline bool
-is_one_of (const hb_glyph_info_t &info, unsigned int flags)
-{
-  /* If it ligated, all bets are off. */
-  if (_hb_glyph_info_ligated (&info)) return false;
-  return !!(FLAG_SAFE (info.myanmar_category()) & flags);
-}
-
-static inline bool
-is_consonant (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, CONSONANT_FLAGS);
-}
-
-
-static inline void
-set_myanmar_properties (hb_glyph_info_t &info)
-{
-  hb_codepoint_t u = info.codepoint;
-  unsigned int type = hb_indic_get_categories (u);
-  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
-  indic_position_t pos = (indic_position_t) (type >> 8);
-
-  /* Myanmar
-   * http://www.microsoft.com/typography/OpenTypeDev/myanmar/intro.htm#analyze
-   */
-  if (unlikely (hb_in_range (u, 0xFE00u, 0xFE0Fu)))
-    cat = (indic_category_t) OT_VS;
-
-  switch (u)
-  {
-    case 0x104Eu:
-      cat = (indic_category_t) OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */
-      break;
-
-    case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u:
-    case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u:
-    case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu:
-    case 0x25FEu:
-      cat = (indic_category_t) OT_GB;
-      break;
-
-    case 0x1004u: case 0x101Bu: case 0x105Au:
-      cat = (indic_category_t) OT_Ra;
-      break;
-
-    case 0x1032u: case 0x1036u:
-      cat = (indic_category_t) OT_A;
-      break;
-
-    case 0x1039u:
-      cat = (indic_category_t) OT_H;
-      break;
-
-    case 0x103Au:
-      cat = (indic_category_t) OT_As;
-      break;
-
-    case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u:
-    case 0x1045u: case 0x1046u: case 0x1047u: case 0x1048u:
-    case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u:
-    case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u:
-    case 0x1097u: case 0x1098u: case 0x1099u:
-      cat = (indic_category_t) OT_D;
-      break;
-
-    case 0x1040u:
-      cat = (indic_category_t) OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */
-      break;
-
-    case 0x103Eu: case 0x1060u:
-      cat = (indic_category_t) OT_MH;
-      break;
-
-    case 0x103Cu:
-      cat = (indic_category_t) OT_MR;
-      break;
-
-    case 0x103Du: case 0x1082u:
-      cat = (indic_category_t) OT_MW;
-      break;
-
-    case 0x103Bu: case 0x105Eu: case 0x105Fu:
-      cat = (indic_category_t) OT_MY;
-      break;
-
-    case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au:
-    case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu:
-      cat = (indic_category_t) OT_PT;
-      break;
-
-    case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u:
-    case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du:
-    case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu:
-      cat = (indic_category_t) OT_SM;
-      break;
-
-    case 0x104Au: case 0x104Bu:
-      cat = (indic_category_t) OT_P;
-      break;
-
-    case 0xAA74u: case 0xAA75u: case 0xAA76u:
-      /* https://github.com/roozbehp/unicode-data/issues/3 */
-      cat = (indic_category_t) OT_C;
-      break;
-  }
-
-  if (cat == OT_M)
-  {
-    switch ((int) pos)
-    {
-      case POS_PRE_C:  cat = (indic_category_t) OT_VPre;
-                       pos = POS_PRE_M;                  break;
-      case POS_ABOVE_C:        cat = (indic_category_t) OT_VAbv; break;
-      case POS_BELOW_C:        cat = (indic_category_t) OT_VBlw; break;
-      case POS_POST_C: cat = (indic_category_t) OT_VPst; break;
-    }
-  }
-
-  info.myanmar_category() = (myanmar_category_t) cat;
-  info.myanmar_position() = pos;
-}
-
-
-
 static void
 setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
                   hb_buffer_t              *buffer,
 static void
 setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
                   hb_buffer_t              *buffer,
@@ -297,6 +146,8 @@ setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
                 hb_buffer_t *buffer)
 {
   find_syllables (buffer);
                 hb_buffer_t *buffer)
 {
   find_syllables (buffer);
+  foreach_syllable (buffer, start, end)
+    buffer->unsafe_to_break (start, end);
 }
 
 static int
 }
 
 static int
@@ -372,6 +223,11 @@ initial_reordering_consonant_syllable (hb_buffer_t *buffer,
       {
        continue;
       }
       {
        continue;
       }
+      if (info[i].myanmar_category() == OT_VS)
+      {
+       info[i].myanmar_position() = info[i - 1].myanmar_position();
+       continue;
+      }
 
       if (pos == POS_AFTER_MAIN && info[i].myanmar_category() == OT_VBlw)
       {
 
       if (pos == POS_AFTER_MAIN && info[i].myanmar_category() == OT_VBlw)
       {
@@ -510,36 +366,36 @@ final_reordering (const hb_ot_shape_plan_t *plan,
  * generic shaper, except that it zeros mark advances GDEF_LATE. */
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_old =
 {
  * generic shaper, except that it zeros mark advances GDEF_LATE. */
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_old =
 {
-  "default",
-  NULL, /* collect_features */
-  NULL, /* override_features */
-  NULL, /* data_create */
-  NULL, /* data_destroy */
-  NULL, /* preprocess_text */
-  NULL, /* postprocess_glyphs */
+  nullptr, /* collect_features */
+  nullptr, /* override_features */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
-  NULL, /* decompose */
-  NULL, /* compose */
-  NULL, /* setup_masks */
-  NULL, /* disable_otl */
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  nullptr, /* setup_masks */
+  nullptr, /* disable_otl */
+  nullptr, /* reorder_marks */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
 {
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
 {
-  "myanmar",
   collect_features_myanmar,
   override_features_myanmar,
   collect_features_myanmar,
   override_features_myanmar,
-  NULL, /* data_create */
-  NULL, /* data_destroy */
-  NULL, /* preprocess_text */
-  NULL, /* postprocess_glyphs */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
-  NULL, /* decompose */
-  NULL, /* compose */
+  nullptr, /* decompose */
+  nullptr, /* compose */
   setup_masks_myanmar,
   setup_masks_myanmar,
-  NULL, /* disable_otl */
+  nullptr, /* disable_otl */
+  nullptr, /* reorder_marks */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
   false, /* fallback_position */
 };
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
   false, /* fallback_position */
 };
index 952441b..08b6fe9 100644 (file)
@@ -39,6 +39,8 @@
 #define complex_var_u8_1()     var2.u8[3]
 
 
 #define complex_var_u8_1()     var2.u8[3]
 
 
+#define HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS 32
+
 enum hb_ot_shape_zero_width_marks_type_t {
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
 enum hb_ot_shape_zero_width_marks_type_t {
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
@@ -52,9 +54,10 @@ enum hb_ot_shape_zero_width_marks_type_t {
   HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \
   HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \
   HB_COMPLEX_SHAPER_IMPLEMENT (hebrew) \
   HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \
   HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \
   HB_COMPLEX_SHAPER_IMPLEMENT (hebrew) \
-  HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_old) \
   HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
   HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (khmer) \
   HB_COMPLEX_SHAPER_IMPLEMENT (myanmar) \
   HB_COMPLEX_SHAPER_IMPLEMENT (myanmar) \
+  HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_old) \
   HB_COMPLEX_SHAPER_IMPLEMENT (thai) \
   HB_COMPLEX_SHAPER_IMPLEMENT (tibetan) \
   HB_COMPLEX_SHAPER_IMPLEMENT (use) \
   HB_COMPLEX_SHAPER_IMPLEMENT (thai) \
   HB_COMPLEX_SHAPER_IMPLEMENT (tibetan) \
   HB_COMPLEX_SHAPER_IMPLEMENT (use) \
@@ -63,12 +66,10 @@ enum hb_ot_shape_zero_width_marks_type_t {
 
 struct hb_ot_complex_shaper_t
 {
 
 struct hb_ot_complex_shaper_t
 {
-  char name[8];
-
   /* collect_features()
    * Called during shape_plan().
    * Shapers should use plan->map to add their features and callbacks.
   /* collect_features()
    * Called during shape_plan().
    * Shapers should use plan->map to add their features and callbacks.
-   * May be NULL.
+   * May be nullptr.
    */
   void (*collect_features) (hb_ot_shape_planner_t *plan);
 
    */
   void (*collect_features) (hb_ot_shape_planner_t *plan);
 
@@ -76,7 +77,7 @@ struct hb_ot_complex_shaper_t
    * Called during shape_plan().
    * Shapers should use plan->map to override features and add callbacks after
    * common features are added.
    * Called during shape_plan().
    * Shapers should use plan->map to override features and add callbacks after
    * common features are added.
-   * May be NULL.
+   * May be nullptr.
    */
   void (*override_features) (hb_ot_shape_planner_t *plan);
 
    */
   void (*override_features) (hb_ot_shape_planner_t *plan);
 
@@ -84,15 +85,15 @@ struct hb_ot_complex_shaper_t
   /* data_create()
    * Called at the end of shape_plan().
    * Whatever shapers return will be accessible through plan->data later.
   /* data_create()
    * Called at the end of shape_plan().
    * Whatever shapers return will be accessible through plan->data later.
-   * If NULL is returned, means a plan failure.
+   * If nullptr is returned, means a plan failure.
    */
   void *(*data_create) (const hb_ot_shape_plan_t *plan);
 
   /* data_destroy()
    * Called when the shape_plan is being destroyed.
    * plan->data is passed here for destruction.
    */
   void *(*data_create) (const hb_ot_shape_plan_t *plan);
 
   /* data_destroy()
    * Called when the shape_plan is being destroyed.
    * plan->data is passed here for destruction.
-   * If NULL is returned, means a plan failure.
-   * May be NULL.
+   * If nullptr is returned, means a plan failure.
+   * May be nullptr.
    */
   void (*data_destroy) (void *data);
 
    */
   void (*data_destroy) (void *data);
 
@@ -100,7 +101,7 @@ struct hb_ot_complex_shaper_t
   /* preprocess_text()
    * Called during shape().
    * Shapers can use to modify text before shaping starts.
   /* preprocess_text()
    * Called during shape().
    * Shapers can use to modify text before shaping starts.
-   * May be NULL.
+   * May be nullptr.
    */
   void (*preprocess_text) (const hb_ot_shape_plan_t *plan,
                           hb_buffer_t              *buffer,
    */
   void (*preprocess_text) (const hb_ot_shape_plan_t *plan,
                           hb_buffer_t              *buffer,
@@ -109,7 +110,7 @@ struct hb_ot_complex_shaper_t
   /* postprocess_glyphs()
    * Called during shape().
    * Shapers can use to modify glyphs after shaping ends.
   /* postprocess_glyphs()
    * Called during shape().
    * Shapers can use to modify glyphs after shaping ends.
-   * May be NULL.
+   * May be nullptr.
    */
   void (*postprocess_glyphs) (const hb_ot_shape_plan_t *plan,
                              hb_buffer_t              *buffer,
    */
   void (*postprocess_glyphs) (const hb_ot_shape_plan_t *plan,
                              hb_buffer_t              *buffer,
@@ -120,7 +121,7 @@ struct hb_ot_complex_shaper_t
 
   /* decompose()
    * Called during shape()'s normalization.
 
   /* decompose()
    * Called during shape()'s normalization.
-   * May be NULL.
+   * May be nullptr.
    */
   bool (*decompose) (const hb_ot_shape_normalize_context_t *c,
                     hb_codepoint_t  ab,
    */
   bool (*decompose) (const hb_ot_shape_normalize_context_t *c,
                     hb_codepoint_t  ab,
@@ -129,7 +130,7 @@ struct hb_ot_complex_shaper_t
 
   /* compose()
    * Called during shape()'s normalization.
 
   /* compose()
    * Called during shape()'s normalization.
-   * May be NULL.
+   * May be nullptr.
    */
   bool (*compose) (const hb_ot_shape_normalize_context_t *c,
                   hb_codepoint_t  a,
    */
   bool (*compose) (const hb_ot_shape_normalize_context_t *c,
                   hb_codepoint_t  a,
@@ -140,7 +141,7 @@ struct hb_ot_complex_shaper_t
    * Called during shape().
    * Shapers should use map to get feature masks and set on buffer.
    * Shapers may NOT modify characters.
    * Called during shape().
    * Shapers should use map to get feature masks and set on buffer.
    * Shapers may NOT modify characters.
-   * May be NULL.
+   * May be nullptr.
    */
   void (*setup_masks) (const hb_ot_shape_plan_t *plan,
                       hb_buffer_t              *buffer,
    */
   void (*setup_masks) (const hb_ot_shape_plan_t *plan,
                       hb_buffer_t              *buffer,
@@ -150,10 +151,20 @@ struct hb_ot_complex_shaper_t
    * Called during shape().
    * If set and returns true, GDEF/GSUB/GPOS of the font are ignored
    * and fallback operations used.
    * Called during shape().
    * If set and returns true, GDEF/GSUB/GPOS of the font are ignored
    * and fallback operations used.
-   * May be NULL.
+   * May be nullptr.
    */
   bool (*disable_otl) (const hb_ot_shape_plan_t *plan);
 
    */
   bool (*disable_otl) (const hb_ot_shape_plan_t *plan);
 
+  /* reorder_marks()
+   * Called during shape().
+   * Shapers can use to modify ordering of combining marks.
+   * May be nullptr.
+   */
+  void (*reorder_marks) (const hb_ot_shape_plan_t *plan,
+                        hb_buffer_t              *buffer,
+                        unsigned int              start,
+                        unsigned int              end);
+
   hb_ot_shape_zero_width_marks_type_t zero_width_marks;
 
   bool fallback_position;
   hb_ot_shape_zero_width_marks_type_t zero_width_marks;
 
   bool fallback_position;
@@ -253,10 +264,12 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     case HB_SCRIPT_SINHALA:
 
       /* If the designer designed the font for the 'DFLT' script,
     case HB_SCRIPT_SINHALA:
 
       /* If the designer designed the font for the 'DFLT' script,
-       * use the default shaper.  Otherwise, use the specific shaper.
+       * (or we ended up arbitrarily pick 'latn'), use the default shaper.
+       * Otherwise, use the specific shaper.
        * Note that for some simple scripts, there may not be *any*
        * GSUB/GPOS needed, so there may be no scripts found! */
        * Note that for some simple scripts, there may not be *any*
        * GSUB/GPOS needed, so there may be no scripts found! */
-      if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T'))
+      if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
+         planner->map.chosen_script[0] == HB_TAG ('l','a','t','n'))
        return &_hb_ot_complex_shaper_default;
       else
        return &_hb_ot_complex_shaper_indic;
        return &_hb_ot_complex_shaper_default;
       else
        return &_hb_ot_complex_shaper_indic;
@@ -272,8 +285,8 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
                                              planner->map.script_index[0],
                                              planner->map.language_index[0],
                                              HB_TAG ('p','r','e','f'),
                                              planner->map.script_index[0],
                                              planner->map.language_index[0],
                                              HB_TAG ('p','r','e','f'),
-                                             NULL))
-       return &_hb_ot_complex_shaper_indic;
+                                             nullptr))
+       return &_hb_ot_complex_shaper_khmer;
       else
        return &_hb_ot_complex_shaper_default;
 
       else
        return &_hb_ot_complex_shaper_default;
 
@@ -362,11 +375,18 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     case HB_SCRIPT_MARCHEN:
     case HB_SCRIPT_NEWA:
 
     case HB_SCRIPT_MARCHEN:
     case HB_SCRIPT_NEWA:
 
+    /* Unicode-10.0 additions */
+    case HB_SCRIPT_MASARAM_GONDI:
+    case HB_SCRIPT_SOYOMBO:
+    case HB_SCRIPT_ZANABAZAR_SQUARE:
+
       /* If the designer designed the font for the 'DFLT' script,
       /* If the designer designed the font for the 'DFLT' script,
-       * use the default shaper.  Otherwise, use the specific shaper.
+       * (or we ended up arbitrarily pick 'latn'), use the default shaper.
+       * Otherwise, use the specific shaper.
        * Note that for some simple scripts, there may not be *any*
        * GSUB/GPOS needed, so there may be no scripts found! */
        * Note that for some simple scripts, there may not be *any*
        * GSUB/GPOS needed, so there may be no scripts found! */
-      if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T'))
+      if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
+         planner->map.chosen_script[0] == HB_TAG ('l','a','t','n'))
        return &_hb_ot_complex_shaper_default;
       else
        return &_hb_ot_complex_shaper_use;
        return &_hb_ot_complex_shaper_default;
       else
        return &_hb_ot_complex_shaper_use;
index e6f80f5..6ba925c 100644 (file)
@@ -52,7 +52,7 @@ get_consonant_type (hb_codepoint_t u)
     return RC;
   if (u == 0x0E0Eu || u == 0x0E0Fu)
     return DC;
     return RC;
   if (u == 0x0E0Eu || u == 0x0E0Fu)
     return DC;
-  if (hb_in_range (u, 0x0E01u, 0x0E2Eu))
+  if (hb_in_range<hb_codepoint_t> (u, 0x0E01u, 0x0E2Eu))
     return NC;
   return NOT_CONSONANT;
 }
     return NC;
   return NOT_CONSONANT;
 }
@@ -70,12 +70,12 @@ enum thai_mark_type_t
 static thai_mark_type_t
 get_mark_type (hb_codepoint_t u)
 {
 static thai_mark_type_t
 get_mark_type (hb_codepoint_t u)
 {
-  if (u == 0x0E31u || hb_in_range (u, 0x0E34u, 0x0E37u) ||
-      u == 0x0E47u || hb_in_range (u, 0x0E4Du, 0x0E4Eu))
+  if (u == 0x0E31u || hb_in_range<hb_codepoint_t> (u, 0x0E34u, 0x0E37u) ||
+      u == 0x0E47u || hb_in_range<hb_codepoint_t> (u, 0x0E4Du, 0x0E4Eu))
     return AV;
     return AV;
-  if (hb_in_range (u, 0x0E38u, 0x0E3Au))
+  if (hb_in_range<hb_codepoint_t> (u, 0x0E38u, 0x0E3Au))
     return BV;
     return BV;
-  if (hb_in_range (u, 0x0E48u, 0x0E4Cu))
+  if (hb_in_range<hb_codepoint_t> (u, 0x0E48u, 0x0E4Cu))
     return T;
   return NOT_MARK;
 }
     return T;
   return NOT_MARK;
 }
@@ -97,7 +97,7 @@ thai_pua_shape (hb_codepoint_t u, thai_action_t action, hb_font_t *font)
     hb_codepoint_t u;
     hb_codepoint_t win_pua;
     hb_codepoint_t mac_pua;
     hb_codepoint_t u;
     hb_codepoint_t win_pua;
     hb_codepoint_t mac_pua;
-  } const *pua_mappings = NULL;
+  } const *pua_mappings = nullptr;
   static const thai_pua_mapping_t SD_mappings[] = {
     {0x0E48u, 0xF70Au, 0xF88Bu}, /* MAI EK */
     {0x0E49u, 0xF70Bu, 0xF88Eu}, /* MAI THO */
   static const thai_pua_mapping_t SD_mappings[] = {
     {0x0E48u, 0xF70Au, 0xF88Bu}, /* MAI EK */
     {0x0E49u, 0xF70Bu, 0xF88Eu}, /* MAI THO */
@@ -244,6 +244,7 @@ do_thai_pua_shaping (const hb_ot_shape_plan_t *plan HB_UNUSED,
     /* At least one of the above/below actions is NOP. */
     thai_action_t action = above_edge.action != NOP ? above_edge.action : below_edge.action;
 
     /* At least one of the above/below actions is NOP. */
     thai_action_t action = above_edge.action != NOP ? above_edge.action : below_edge.action;
 
+    buffer->unsafe_to_break (base, i);
     if (action == RD)
       info[base].codepoint = thai_pua_shape (info[base].codepoint, action, font);
     else
     if (action == RD)
       info[base].codepoint = thai_pua_shape (info[base].codepoint, action, font);
     else
@@ -310,7 +311,7 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
 #define IS_SARA_AM(x) (((x) & ~0x0080u) == 0x0E33u)
 #define NIKHAHIT_FROM_SARA_AM(x) ((x) - 0x0E33u + 0x0E4Du)
 #define SARA_AA_FROM_SARA_AM(x) ((x) - 1)
 #define IS_SARA_AM(x) (((x) & ~0x0080u) == 0x0E33u)
 #define NIKHAHIT_FROM_SARA_AM(x) ((x) - 0x0E33u + 0x0E4Du)
 #define SARA_AA_FROM_SARA_AM(x) ((x) - 1)
-#define IS_TONE_MARK(x) (hb_in_ranges ((x) & ~0x0080u, 0x0E34u, 0x0E37u, 0x0E47u, 0x0E4Eu, 0x0E31u, 0x0E31u))
+#define IS_TONE_MARK(x) (hb_in_ranges<hb_codepoint_t> ((x) & ~0x0080u, 0x0E34u, 0x0E37u, 0x0E47u, 0x0E4Eu, 0x0E31u, 0x0E31u))
 
   buffer->clear_output ();
   unsigned int count = buffer->len;
 
   buffer->clear_output ();
   unsigned int count = buffer->len;
@@ -365,18 +366,18 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai =
 {
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai =
 {
-  "thai",
-  NULL, /* collect_features */
-  NULL, /* override_features */
-  NULL, /* data_create */
-  NULL, /* data_destroy */
+  nullptr, /* collect_features */
+  nullptr, /* override_features */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
   preprocess_text_thai,
   preprocess_text_thai,
-  NULL, /* postprocess_glyphs */
+  nullptr, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
-  NULL, /* decompose */
-  NULL, /* compose */
-  NULL, /* setup_masks */
-  NULL, /* disable_otl */
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  nullptr, /* setup_masks */
+  nullptr, /* disable_otl */
+  nullptr, /* reorder_marks */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   false,/* fallback_position */
 };
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   false,/* fallback_position */
 };
index aadf59f..eaac0bf 100644 (file)
@@ -46,18 +46,18 @@ collect_features_tibetan (hb_ot_shape_planner_t *plan)
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_tibetan =
 {
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_tibetan =
 {
-  "default",
   collect_features_tibetan,
   collect_features_tibetan,
-  NULL, /* override_features */
-  NULL, /* data_create */
-  NULL, /* data_destroy */
-  NULL, /* preprocess_text */
-  NULL, /* postprocess_glyphs */
+  nullptr, /* override_features */
+  nullptr, /* data_create */
+  nullptr, /* data_destroy */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
-  NULL, /* decompose */
-  NULL, /* compose */
-  NULL, /* setup_masks */
-  NULL, /* disable_otl */
+  nullptr, /* decompose */
+  nullptr, /* compose */
+  nullptr, /* setup_masks */
+  nullptr, /* disable_otl */
+  nullptr, /* reorder_marks */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
index 44e5d0d..0bf3ad3 100644 (file)
 
 #line 38 "hb-ot-shape-complex-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
 
 #line 38 "hb-ot-shape-complex-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
-       1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, 
-       8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
-       8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 
-       4u, 4u, 13u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 
-       8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
-       8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 
-       42u, 42u, 0
+       12u, 12u, 1u, 15u, 1u, 1u, 12u, 12u, 0u, 43u, 21u, 21u, 8u, 39u, 8u, 39u, 
+       1u, 15u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 
+       8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
+       8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 4u, 4u, 13u, 13u, 8u, 39u, 
+       8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 
+       8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
+       8u, 39u, 1u, 15u, 12u, 12u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 42u, 42u, 
+       1u, 5u, 0
 };
 
 static const char _use_syllable_machine_key_spans[] = {
 };
 
 static const char _use_syllable_machine_key_spans[] = {
-       1, 40, 1, 32, 32, 1, 32, 32, 
-       32, 19, 19, 19, 32, 32, 32, 32, 
-       32, 32, 32, 32, 32, 32, 32, 9, 
-       1, 1, 32, 32, 32, 32, 19, 19, 
-       19, 32, 32, 32, 32, 32, 32, 32, 
-       32, 32, 32, 1, 39, 32, 22, 2, 
-       1
+       1, 15, 1, 1, 44, 1, 32, 32, 
+       15, 1, 32, 32, 32, 19, 19, 19, 
+       32, 32, 32, 32, 32, 32, 32, 32, 
+       32, 32, 32, 32, 9, 1, 1, 32, 
+       32, 32, 32, 19, 19, 19, 32, 32, 
+       32, 32, 32, 32, 32, 32, 32, 32, 
+       32, 15, 1, 39, 32, 22, 2, 1, 
+       5
 };
 
 static const short _use_syllable_machine_index_offsets[] = {
 };
 
 static const short _use_syllable_machine_index_offsets[] = {
-       0, 2, 43, 45, 78, 111, 113, 146, 
-       179, 212, 232, 252, 272, 305, 338, 371, 
-       404, 437, 470, 503, 536, 569, 602, 635, 
-       645, 647, 649, 682, 715, 748, 781, 801, 
-       821, 841, 874, 907, 940, 973, 1006, 1039, 
-       1072, 1105, 1138, 1171, 1173, 1213, 1246, 1269, 
-       1272
+       0, 2, 18, 20, 22, 67, 69, 102, 
+       135, 151, 153, 186, 219, 252, 272, 292, 
+       312, 345, 378, 411, 444, 477, 510, 543, 
+       576, 609, 642, 675, 708, 718, 720, 722, 
+       755, 788, 821, 854, 874, 894, 914, 947, 
+       980, 1013, 1046, 1079, 1112, 1145, 1178, 1211, 
+       1244, 1277, 1293, 1295, 1335, 1368, 1391, 1394, 
+       1396
 };
 
 static const char _use_syllable_machine_indicies[] = {
 };
 
 static const char _use_syllable_machine_indicies[] = {
-       1, 0, 2, 3, 4, 2, 5, 3, 
-       4, 4, 6, 4, 4, 1, 7, 4, 
-       4, 4, 2, 2, 8, 9, 4, 4, 
-       10, 11, 12, 13, 14, 15, 16, 10, 
-       17, 18, 19, 20, 21, 22, 4, 23, 
-       24, 25, 4, 27, 26, 29, 28, 28, 
-       30, 31, 28, 28, 28, 28, 28, 28, 
-       28, 28, 32, 33, 34, 35, 36, 37, 
-       38, 39, 33, 40, 32, 41, 42, 43, 
-       44, 28, 45, 46, 47, 28, 29, 28, 
-       28, 30, 31, 28, 28, 28, 28, 28, 
-       28, 28, 28, 48, 33, 34, 35, 36, 
-       37, 38, 39, 33, 40, 41, 41, 42, 
-       43, 44, 28, 45, 46, 47, 28, 30, 
-       49, 29, 28, 28, 30, 31, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 33, 
-       34, 35, 36, 37, 38, 39, 33, 40, 
-       41, 41, 42, 43, 44, 28, 45, 46, 
-       47, 28, 29, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       33, 34, 35, 36, 37, 28, 28, 28, 
-       28, 28, 28, 42, 43, 44, 28, 45, 
-       46, 47, 28, 29, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 34, 35, 36, 37, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       45, 46, 47, 28, 29, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 35, 36, 37, 28, 
-       29, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 36, 37, 28, 29, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 37, 28, 
-       29, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       35, 36, 37, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 45, 46, 47, 
-       28, 29, 28, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 35, 36, 37, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 46, 
-       47, 28, 29, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 35, 36, 37, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 47, 28, 29, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 34, 35, 36, 37, 28, 28, 
-       28, 28, 28, 28, 42, 43, 44, 28, 
-       45, 46, 47, 28, 29, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 28, 34, 35, 36, 37, 28, 
-       28, 28, 28, 28, 28, 28, 43, 44, 
-       28, 45, 46, 47, 28, 29, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 34, 35, 36, 37, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       44, 28, 45, 46, 47, 28, 29, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 33, 34, 35, 36, 
-       37, 28, 39, 33, 28, 28, 28, 42, 
-       43, 44, 28, 45, 46, 47, 28, 29, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 33, 34, 35, 
-       36, 37, 28, 28, 33, 28, 28, 28, 
-       42, 43, 44, 28, 45, 46, 47, 28, 
-       29, 28, 28, 28, 28, 28, 28, 28, 
-       28, 28, 28, 28, 28, 28, 33, 34, 
-       35, 36, 37, 38, 39, 33, 28, 28, 
-       28, 42, 43, 44, 28, 45, 46, 47, 
-       28, 29, 28, 28, 30, 31, 28, 28, 
-       28, 28, 28, 28, 28, 28, 28, 33, 
-       34, 35, 36, 37, 38, 39, 33, 40, 
-       28, 41, 42, 43, 44, 28, 45, 46, 
-       47, 28, 29, 28, 28, 30, 31, 28, 
-       28, 28, 28, 28, 28, 28, 28, 28, 
-       33, 34, 35, 36, 37, 38, 39, 33, 
-       40, 32, 41, 42, 43, 44, 28, 45, 
-       46, 47, 28, 51, 50, 50, 50, 50, 
-       50, 50, 50, 52, 50, 5, 53, 51, 
-       50, 6, 54, 54, 1, 55, 54, 54, 
-       54, 54, 54, 54, 54, 54, 56, 10, 
-       11, 12, 13, 14, 15, 16, 10, 17, 
-       19, 19, 20, 21, 22, 54, 23, 24, 
-       25, 54, 6, 54, 54, 1, 55, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       10, 11, 12, 13, 14, 15, 16, 10, 
-       17, 19, 19, 20, 21, 22, 54, 23, 
-       24, 25, 54, 6, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 10, 11, 12, 13, 14, 54, 54, 
-       54, 54, 54, 54, 20, 21, 22, 54, 
-       23, 24, 25, 54, 6, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 11, 12, 13, 14, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 23, 24, 25, 54, 6, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 12, 13, 14, 
-       54, 6, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 13, 14, 54, 6, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 14, 
-       54, 6, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 12, 13, 14, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 23, 24, 
-       25, 54, 6, 54, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 12, 13, 14, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       24, 25, 54, 6, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 12, 13, 14, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 25, 54, 6, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 11, 12, 13, 14, 54, 
-       54, 54, 54, 54, 54, 20, 21, 22, 
-       54, 23, 24, 25, 54, 6, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 54, 11, 12, 13, 14, 
-       54, 54, 54, 54, 54, 54, 54, 21, 
-       22, 54, 23, 24, 25, 54, 6, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 11, 12, 13, 
-       14, 54, 54, 54, 54, 54, 54, 54, 
-       54, 22, 54, 23, 24, 25, 54, 6, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 10, 11, 12, 
-       13, 14, 54, 16, 10, 54, 54, 54, 
-       20, 21, 22, 54, 23, 24, 25, 54, 
-       6, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 10, 11, 
-       12, 13, 14, 54, 54, 10, 54, 54, 
-       54, 20, 21, 22, 54, 23, 24, 25, 
-       54, 6, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 54, 54, 54, 54, 10, 
-       11, 12, 13, 14, 15, 16, 10, 54, 
-       54, 54, 20, 21, 22, 54, 23, 24, 
-       25, 54, 6, 54, 54, 1, 55, 54, 
-       54, 54, 54, 54, 54, 54, 54, 54, 
-       10, 11, 12, 13, 14, 15, 16, 10, 
-       17, 54, 19, 20, 21, 22, 54, 23, 
-       24, 25, 54, 1, 57, 3, 54, 54, 
-       54, 3, 54, 54, 6, 54, 54, 1, 
-       55, 54, 54, 54, 54, 54, 54, 54, 
-       54, 54, 10, 11, 12, 13, 14, 15, 
-       16, 10, 17, 18, 19, 20, 21, 22, 
-       54, 23, 24, 25, 54, 6, 54, 54, 
-       1, 55, 54, 54, 54, 54, 54, 54, 
-       54, 54, 54, 10, 11, 12, 13, 14, 
-       15, 16, 10, 17, 18, 19, 20, 21, 
-       22, 54, 23, 24, 25, 54, 59, 58, 
-       58, 58, 58, 58, 58, 58, 58, 58, 
-       58, 58, 58, 58, 58, 58, 58, 58, 
-       58, 58, 59, 60, 58, 59, 60, 58, 
-       60, 58, 0
+       1, 0, 3, 2, 2, 2, 2, 2, 
+       2, 2, 2, 2, 2, 2, 2, 2, 
+       4, 2, 3, 2, 6, 5, 7, 8, 
+       9, 7, 10, 8, 9, 9, 11, 9, 
+       9, 3, 12, 9, 9, 13, 7, 7, 
+       14, 15, 9, 9, 16, 17, 18, 19, 
+       20, 21, 22, 16, 23, 24, 25, 26, 
+       27, 28, 9, 29, 30, 31, 9, 9, 
+       9, 32, 9, 34, 33, 36, 35, 35, 
+       37, 1, 35, 35, 38, 35, 35, 35, 
+       35, 35, 39, 40, 41, 42, 43, 44, 
+       45, 46, 40, 47, 39, 48, 49, 50, 
+       51, 35, 52, 53, 54, 35, 36, 35, 
+       35, 37, 1, 35, 35, 38, 35, 35, 
+       35, 35, 35, 55, 40, 41, 42, 43, 
+       44, 45, 46, 40, 47, 48, 48, 49, 
+       50, 51, 35, 52, 53, 54, 35, 37, 
+       56, 56, 56, 56, 56, 56, 56, 56, 
+       56, 56, 56, 56, 56, 57, 56, 37, 
+       56, 36, 35, 35, 37, 1, 35, 35, 
+       38, 35, 35, 35, 35, 35, 35, 40, 
+       41, 42, 43, 44, 45, 46, 40, 47, 
+       48, 48, 49, 50, 51, 35, 52, 53, 
+       54, 35, 36, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       40, 41, 42, 43, 44, 35, 35, 35, 
+       35, 35, 35, 49, 50, 51, 35, 52, 
+       53, 54, 35, 36, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 41, 42, 43, 44, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       52, 53, 54, 35, 36, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 42, 43, 44, 35, 
+       36, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 43, 44, 35, 36, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 44, 35, 
+       36, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       42, 43, 44, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 52, 53, 54, 
+       35, 36, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 42, 43, 44, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 53, 
+       54, 35, 36, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 42, 43, 44, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 54, 35, 36, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 41, 42, 43, 44, 35, 35, 
+       35, 35, 35, 35, 49, 50, 51, 35, 
+       52, 53, 54, 35, 36, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 41, 42, 43, 44, 35, 
+       35, 35, 35, 35, 35, 35, 50, 51, 
+       35, 52, 53, 54, 35, 36, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 41, 42, 43, 44, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       51, 35, 52, 53, 54, 35, 36, 35, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 40, 41, 42, 43, 
+       44, 35, 46, 40, 35, 35, 35, 49, 
+       50, 51, 35, 52, 53, 54, 35, 36, 
+       35, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 40, 41, 42, 
+       43, 44, 35, 58, 40, 35, 35, 35, 
+       49, 50, 51, 35, 52, 53, 54, 35, 
+       36, 35, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 40, 41, 
+       42, 43, 44, 35, 35, 40, 35, 35, 
+       35, 49, 50, 51, 35, 52, 53, 54, 
+       35, 36, 35, 35, 35, 35, 35, 35, 
+       35, 35, 35, 35, 35, 35, 35, 40, 
+       41, 42, 43, 44, 45, 46, 40, 35, 
+       35, 35, 49, 50, 51, 35, 52, 53, 
+       54, 35, 36, 35, 35, 37, 1, 35, 
+       35, 38, 35, 35, 35, 35, 35, 35, 
+       40, 41, 42, 43, 44, 45, 46, 40, 
+       47, 35, 48, 49, 50, 51, 35, 52, 
+       53, 54, 35, 36, 35, 35, 37, 1, 
+       35, 35, 38, 35, 35, 35, 35, 35, 
+       35, 40, 41, 42, 43, 44, 45, 46, 
+       40, 47, 39, 48, 49, 50, 51, 35, 
+       52, 53, 54, 35, 60, 59, 59, 59, 
+       59, 59, 59, 59, 61, 59, 10, 62, 
+       60, 59, 11, 63, 63, 3, 6, 63, 
+       63, 64, 63, 63, 63, 63, 63, 65, 
+       16, 17, 18, 19, 20, 21, 22, 16, 
+       23, 25, 25, 26, 27, 28, 63, 29, 
+       30, 31, 63, 11, 63, 63, 3, 6, 
+       63, 63, 64, 63, 63, 63, 63, 63, 
+       63, 16, 17, 18, 19, 20, 21, 22, 
+       16, 23, 25, 25, 26, 27, 28, 63, 
+       29, 30, 31, 63, 11, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 16, 17, 18, 19, 20, 63, 
+       63, 63, 63, 63, 63, 26, 27, 28, 
+       63, 29, 30, 31, 63, 11, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 17, 18, 19, 20, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 29, 30, 31, 63, 11, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 18, 19, 
+       20, 63, 11, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 19, 20, 63, 11, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       20, 63, 11, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 18, 19, 20, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 29, 
+       30, 31, 63, 11, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 18, 19, 20, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 30, 31, 63, 11, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 18, 19, 20, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 31, 63, 11, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 17, 18, 19, 20, 
+       63, 63, 63, 63, 63, 63, 26, 27, 
+       28, 63, 29, 30, 31, 63, 11, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 17, 18, 19, 
+       20, 63, 63, 63, 63, 63, 63, 63, 
+       27, 28, 63, 29, 30, 31, 63, 11, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 17, 18, 
+       19, 20, 63, 63, 63, 63, 63, 63, 
+       63, 63, 28, 63, 29, 30, 31, 63, 
+       11, 63, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 16, 17, 
+       18, 19, 20, 63, 22, 16, 63, 63, 
+       63, 26, 27, 28, 63, 29, 30, 31, 
+       63, 11, 63, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 16, 
+       17, 18, 19, 20, 63, 66, 16, 63, 
+       63, 63, 26, 27, 28, 63, 29, 30, 
+       31, 63, 11, 63, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       16, 17, 18, 19, 20, 63, 63, 16, 
+       63, 63, 63, 26, 27, 28, 63, 29, 
+       30, 31, 63, 11, 63, 63, 63, 63, 
+       63, 63, 63, 63, 63, 63, 63, 63, 
+       63, 16, 17, 18, 19, 20, 21, 22, 
+       16, 63, 63, 63, 26, 27, 28, 63, 
+       29, 30, 31, 63, 11, 63, 63, 3, 
+       6, 63, 63, 64, 63, 63, 63, 63, 
+       63, 63, 16, 17, 18, 19, 20, 21, 
+       22, 16, 23, 63, 25, 26, 27, 28, 
+       63, 29, 30, 31, 63, 3, 67, 67, 
+       67, 67, 67, 67, 67, 67, 67, 67, 
+       67, 67, 67, 4, 67, 6, 67, 8, 
+       63, 63, 63, 8, 63, 63, 11, 63, 
+       63, 3, 6, 63, 63, 64, 63, 63, 
+       63, 63, 63, 63, 16, 17, 18, 19, 
+       20, 21, 22, 16, 23, 24, 25, 26, 
+       27, 28, 63, 29, 30, 31, 63, 11, 
+       63, 63, 3, 6, 63, 63, 64, 63, 
+       63, 63, 63, 63, 63, 16, 17, 18, 
+       19, 20, 21, 22, 16, 23, 24, 25, 
+       26, 27, 28, 63, 29, 30, 31, 63, 
+       69, 68, 68, 68, 68, 68, 68, 68, 
+       68, 68, 68, 68, 68, 68, 68, 68, 
+       68, 68, 68, 68, 69, 70, 68, 69, 
+       70, 68, 70, 68, 8, 67, 67, 67, 
+       8, 67, 0
 };
 
 static const char _use_syllable_machine_trans_targs[] = {
 };
 
 static const char _use_syllable_machine_trans_targs[] = {
-       1, 26, 2, 3, 1, 23, 1, 43, 
-       44, 46, 28, 29, 30, 31, 32, 39, 
-       40, 41, 45, 42, 36, 37, 38, 33, 
-       34, 35, 1, 1, 1, 1, 4, 5, 
-       22, 7, 8, 9, 10, 11, 18, 19, 
-       20, 21, 15, 16, 17, 12, 13, 14, 
-       6, 1, 1, 24, 25, 1, 1, 0, 
-       27, 1, 1, 47, 48
+       4, 8, 4, 31, 2, 4, 1, 5, 
+       6, 4, 28, 4, 49, 50, 51, 53, 
+       33, 34, 35, 36, 37, 44, 45, 47, 
+       52, 48, 41, 42, 43, 38, 39, 40, 
+       56, 4, 4, 4, 4, 7, 0, 27, 
+       11, 12, 13, 14, 15, 22, 23, 25, 
+       26, 19, 20, 21, 16, 17, 18, 10, 
+       4, 9, 24, 4, 29, 30, 4, 4, 
+       3, 32, 46, 4, 4, 54, 55
 };
 
 static const char _use_syllable_machine_trans_actions[] = {
 };
 
 static const char _use_syllable_machine_trans_actions[] = {
-       1, 2, 0, 0, 5, 0, 6, 0, 
-       2, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 2, 2, 0, 0, 0, 0, 
-       0, 0, 7, 8, 9, 10, 0, 0, 
+       1, 0, 2, 3, 0, 4, 0, 0, 
+       7, 8, 0, 9, 10, 10, 3, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
+       3, 3, 0, 0, 0, 0, 0, 0, 
+       0, 11, 12, 13, 14, 7, 0, 7, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 11, 12, 0, 0, 13, 14, 0, 
-       2, 15, 16, 0, 0
+       7, 0, 0, 0, 0, 0, 0, 7, 
+       15, 0, 0, 16, 0, 0, 17, 18, 
+       0, 3, 0, 19, 20, 0, 0
 };
 
 static const char _use_syllable_machine_to_state_actions[] = {
 };
 
 static const char _use_syllable_machine_to_state_actions[] = {
-       0, 3, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 5, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
@@ -261,7 +283,8 @@ static const char _use_syllable_machine_to_state_actions[] = {
 };
 
 static const char _use_syllable_machine_from_state_actions[] = {
 };
 
 static const char _use_syllable_machine_from_state_actions[] = {
-       0, 4, 0, 0, 0, 0, 0, 0, 
+       0, 0, 0, 0, 6, 0, 0, 0, 
+       0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
@@ -271,27 +294,28 @@ static const char _use_syllable_machine_from_state_actions[] = {
 };
 
 static const short _use_syllable_machine_eof_trans[] = {
 };
 
 static const short _use_syllable_machine_eof_trans[] = {
-       1, 0, 27, 29, 29, 50, 29, 29, 
-       29, 29, 29, 29, 29, 29, 29, 29, 
-       29, 29, 29, 29, 29, 29, 29, 51, 
-       54, 51, 55, 55, 55, 55, 55, 55, 
-       55, 55, 55, 55, 55, 55, 55, 55, 
-       55, 55, 55, 58, 55, 55, 59, 59, 
-       59
+       1, 3, 3, 6, 0, 34, 36, 36, 
+       57, 57, 36, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 36, 36, 36, 36, 
+       36, 36, 36, 36, 60, 63, 60, 64, 
+       64, 64, 64, 64, 64, 64, 64, 64, 
+       64, 64, 64, 64, 64, 64, 64, 64, 
+       64, 68, 68, 64, 64, 69, 69, 69, 
+       68
 };
 
 };
 
-static const int use_syllable_machine_start = 1;
-static const int use_syllable_machine_first_final = 1;
+static const int use_syllable_machine_start = 4;
+static const int use_syllable_machine_first_final = 4;
 static const int use_syllable_machine_error = -1;
 
 static const int use_syllable_machine_error = -1;
 
-static const int use_syllable_machine_en_main = 1;
+static const int use_syllable_machine_en_main = 4;
 
 
 #line 38 "hb-ot-shape-complex-use-machine.rl"
 
 
 
 
 
 #line 38 "hb-ot-shape-complex-use-machine.rl"
 
 
 
-#line 138 "hb-ot-shape-complex-use-machine.rl"
+#line 141 "hb-ot-shape-complex-use-machine.rl"
 
 
 #define found_syllable(syllable_type) \
 
 
 #define found_syllable(syllable_type) \
@@ -311,7 +335,7 @@ find_syllables (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 315 "hb-ot-shape-complex-use-machine.hh"
+#line 339 "hb-ot-shape-complex-use-machine.hh"
        {
        cs = use_syllable_machine_start;
        ts = 0;
        {
        cs = use_syllable_machine_start;
        ts = 0;
@@ -319,7 +343,7 @@ find_syllables (hb_buffer_t *buffer)
        act = 0;
        }
 
        act = 0;
        }
 
-#line 159 "hb-ot-shape-complex-use-machine.rl"
+#line 162 "hb-ot-shape-complex-use-machine.rl"
 
 
   p = 0;
 
 
   p = 0;
@@ -328,7 +352,7 @@ find_syllables (hb_buffer_t *buffer)
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 332 "hb-ot-shape-complex-use-machine.hh"
+#line 356 "hb-ot-shape-complex-use-machine.hh"
        {
        int _slen;
        int _trans;
        {
        int _slen;
        int _trans;
@@ -338,11 +362,11 @@ find_syllables (hb_buffer_t *buffer)
                goto _test_eof;
 _resume:
        switch ( _use_syllable_machine_from_state_actions[cs] ) {
                goto _test_eof;
 _resume:
        switch ( _use_syllable_machine_from_state_actions[cs] ) {
-       case 4:
+       case 6:
 #line 1 "NONE"
        {ts = p;}
        break;
 #line 1 "NONE"
        {ts = p;}
        break;
-#line 346 "hb-ot-shape-complex-use-machine.hh"
+#line 370 "hb-ot-shape-complex-use-machine.hh"
        }
 
        _keys = _use_syllable_machine_trans_keys + (cs<<1);
        }
 
        _keys = _use_syllable_machine_trans_keys + (cs<<1);
@@ -360,72 +384,100 @@ _eof_trans:
                goto _again;
 
        switch ( _use_syllable_machine_trans_actions[_trans] ) {
                goto _again;
 
        switch ( _use_syllable_machine_trans_actions[_trans] ) {
-       case 2:
+       case 7:
 #line 1 "NONE"
        {te = p+1;}
        break;
 #line 1 "NONE"
        {te = p+1;}
        break;
-       case 8:
-#line 127 "hb-ot-shape-complex-use-machine.rl"
+       case 12:
+#line 130 "hb-ot-shape-complex-use-machine.rl"
        {te = p+1;{ found_syllable (independent_cluster); }}
        break;
        {te = p+1;{ found_syllable (independent_cluster); }}
        break;
-       case 10:
-#line 129 "hb-ot-shape-complex-use-machine.rl"
+       case 14:
+#line 132 "hb-ot-shape-complex-use-machine.rl"
        {te = p+1;{ found_syllable (standard_cluster); }}
        break;
        {te = p+1;{ found_syllable (standard_cluster); }}
        break;
-       case 6:
-#line 133 "hb-ot-shape-complex-use-machine.rl"
+       case 9:
+#line 136 "hb-ot-shape-complex-use-machine.rl"
        {te = p+1;{ found_syllable (broken_cluster); }}
        break;
        {te = p+1;{ found_syllable (broken_cluster); }}
        break;
-       case 5:
-#line 134 "hb-ot-shape-complex-use-machine.rl"
+       case 8:
+#line 137 "hb-ot-shape-complex-use-machine.rl"
        {te = p+1;{ found_syllable (non_cluster); }}
        break;
        {te = p+1;{ found_syllable (non_cluster); }}
        break;
-       case 7:
-#line 127 "hb-ot-shape-complex-use-machine.rl"
+       case 11:
+#line 130 "hb-ot-shape-complex-use-machine.rl"
        {te = p;p--;{ found_syllable (independent_cluster); }}
        break;
        {te = p;p--;{ found_syllable (independent_cluster); }}
        break;
-       case 11:
-#line 128 "hb-ot-shape-complex-use-machine.rl"
+       case 15:
+#line 131 "hb-ot-shape-complex-use-machine.rl"
        {te = p;p--;{ found_syllable (virama_terminated_cluster); }}
        break;
        {te = p;p--;{ found_syllable (virama_terminated_cluster); }}
        break;
-       case 9:
-#line 129 "hb-ot-shape-complex-use-machine.rl"
+       case 13:
+#line 132 "hb-ot-shape-complex-use-machine.rl"
        {te = p;p--;{ found_syllable (standard_cluster); }}
        break;
        {te = p;p--;{ found_syllable (standard_cluster); }}
        break;
-       case 13:
-#line 130 "hb-ot-shape-complex-use-machine.rl"
+       case 17:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
        {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
        break;
        {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
        break;
-       case 12:
-#line 131 "hb-ot-shape-complex-use-machine.rl"
+       case 16:
+#line 134 "hb-ot-shape-complex-use-machine.rl"
        {te = p;p--;{ found_syllable (numeral_cluster); }}
        break;
        {te = p;p--;{ found_syllable (numeral_cluster); }}
        break;
-       case 16:
-#line 132 "hb-ot-shape-complex-use-machine.rl"
+       case 20:
+#line 135 "hb-ot-shape-complex-use-machine.rl"
        {te = p;p--;{ found_syllable (symbol_cluster); }}
        break;
        {te = p;p--;{ found_syllable (symbol_cluster); }}
        break;
-       case 14:
-#line 133 "hb-ot-shape-complex-use-machine.rl"
+       case 18:
+#line 136 "hb-ot-shape-complex-use-machine.rl"
        {te = p;p--;{ found_syllable (broken_cluster); }}
        break;
        {te = p;p--;{ found_syllable (broken_cluster); }}
        break;
-       case 15:
-#line 134 "hb-ot-shape-complex-use-machine.rl"
+       case 19:
+#line 137 "hb-ot-shape-complex-use-machine.rl"
        {te = p;p--;{ found_syllable (non_cluster); }}
        break;
        case 1:
        {te = p;p--;{ found_syllable (non_cluster); }}
        break;
        case 1:
-#line 133 "hb-ot-shape-complex-use-machine.rl"
+#line 132 "hb-ot-shape-complex-use-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (standard_cluster); }}
+       break;
+       case 4:
+#line 136 "hb-ot-shape-complex-use-machine.rl"
        {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
        break;
        {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
        break;
-#line 420 "hb-ot-shape-complex-use-machine.hh"
+       case 2:
+#line 1 "NONE"
+       {       switch( act ) {
+       case 7:
+       {{p = ((te))-1;} found_syllable (broken_cluster); }
+       break;
+       case 8:
+       {{p = ((te))-1;} found_syllable (non_cluster); }
+       break;
+       }
+       }
+       break;
+       case 3:
+#line 1 "NONE"
+       {te = p+1;}
+#line 136 "hb-ot-shape-complex-use-machine.rl"
+       {act = 7;}
+       break;
+       case 10:
+#line 1 "NONE"
+       {te = p+1;}
+#line 137 "hb-ot-shape-complex-use-machine.rl"
+       {act = 8;}
+       break;
+#line 472 "hb-ot-shape-complex-use-machine.hh"
        }
 
 _again:
        switch ( _use_syllable_machine_to_state_actions[cs] ) {
        }
 
 _again:
        switch ( _use_syllable_machine_to_state_actions[cs] ) {
-       case 3:
+       case 5:
 #line 1 "NONE"
        {ts = 0;}
        break;
 #line 1 "NONE"
        {ts = 0;}
        break;
-#line 429 "hb-ot-shape-complex-use-machine.hh"
+#line 481 "hb-ot-shape-complex-use-machine.hh"
        }
 
        if ( ++p != pe )
        }
 
        if ( ++p != pe )
@@ -441,7 +493,7 @@ _again:
 
        }
 
 
        }
 
-#line 168 "hb-ot-shape-complex-use-machine.rl"
+#line 171 "hb-ot-shape-complex-use-machine.rl"
 
 }
 
 
 }
 
index f6b814b..11fb470 100644 (file)
@@ -86,21 +86,24 @@ VMPst       = 39; # VOWEL_MOD_POST
 VMPre  = 23; # VOWEL_MOD_PRE
 SMAbv  = 41; # SYM_MOD_ABOVE
 SMBlw  = 42; # SYM_MOD_BELOW
 VMPre  = 23; # VOWEL_MOD_PRE
 SMAbv  = 41; # SYM_MOD_ABOVE
 SMBlw  = 42; # SYM_MOD_BELOW
+CS     = 43; # CONS_WITH_STACKER
 
 
 
 
-consonant_modifiers = CMAbv* CMBlw* ((H B | SUB) VS? CMAbv? CMBlw*)*;
-medial_consonants = MPre? MAbv? MBlw? MPst?;
+# Override: Adjoc ZWJ placement. https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729
+consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.H.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*;
+# Override: Allow two MBlw. https://github.com/harfbuzz/harfbuzz/issues/376
+medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?;
 dependent_vowels = VPre* VAbv* VBlw* VPst*;
 vowel_modifiers = VMPre* VMAbv* VMBlw* VMPst*;
 final_consonants = FAbv* FBlw* FPst* FM?;
 
 virama_terminated_cluster =
 dependent_vowels = VPre* VAbv* VBlw* VPst*;
 vowel_modifiers = VMPre* VMAbv* VMBlw* VMPst*;
 final_consonants = FAbv* FBlw* FPst* FM?;
 
 virama_terminated_cluster =
-       R? (B | GB) VS?
+       (R|CS)? (B | GB) VS?
        consonant_modifiers
        consonant_modifiers
-       H
+       ZWJ?.H.ZWJ?
 ;
 standard_cluster =
 ;
 standard_cluster =
-       R? (B | GB) VS?
+       (R|CS)? (B | GB) VS?
        consonant_modifiers
        medial_consonants
        dependent_vowels
        consonant_modifiers
        medial_consonants
        dependent_vowels
index ae428cb..f7ded13 100644 (file)
@@ -87,10 +87,11 @@ enum use_category_t {
   USE_VMPst    = 39,   /* VOWEL_MOD_POST */
   USE_VMPre    = 23,   /* VOWEL_MOD_PRE */
   USE_SMAbv    = 41,   /* SYM_MOD_ABOVE */
   USE_VMPst    = 39,   /* VOWEL_MOD_POST */
   USE_VMPre    = 23,   /* VOWEL_MOD_PRE */
   USE_SMAbv    = 41,   /* SYM_MOD_ABOVE */
-  USE_SMBlw    = 42    /* SYM_MOD_BELOW */
+  USE_SMBlw    = 42,   /* SYM_MOD_BELOW */
+  USE_CS       = 43    /* CONS_WITH_STACKER */
 };
 
 HB_INTERNAL USE_TABLE_ELEMENT_TYPE
 };
 
 HB_INTERNAL USE_TABLE_ELEMENT_TYPE
-hb_use_get_categories (hb_codepoint_t u);
+hb_use_get_category (hb_codepoint_t u);
 
 #endif /* HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH */
 
 #endif /* HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH */
index 38c46d0..6823392 100644 (file)
@@ -6,12 +6,12 @@
  *
  * on files with these headers:
  *
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-9.0.0.txt
- * # Date: 2016-05-21, 02:46:00 GMT [RP]
- * # IndicPositionalCategory-9.0.0.txt
- * # Date: 2016-02-25, 00:48:00 GMT [RP]
- * # Blocks-9.0.0.txt
- * # Date: 2016-02-05, 23:48:00 GMT [KW]
+ * # IndicSyllabicCategory-10.0.0.txt
+ * # Date: 2017-05-31, 01:07:00 GMT [KW, RP]
+ * # IndicPositionalCategory-10.0.0.txt
+ * # Date: 2017-05-31, 01:07:00 GMT [RP]
+ * # Blocks-10.0.0.txt
+ * # Date: 2017-04-12, 17:30:00 GMT [KW]
  * UnicodeData.txt does not have a header.
  */
 
  * UnicodeData.txt does not have a header.
  */
 
@@ -19,6 +19,7 @@
 
 #define B      USE_B   /* BASE */
 #define CGJ    USE_CGJ /* CGJ */
 
 #define B      USE_B   /* BASE */
 #define CGJ    USE_CGJ /* CGJ */
+#define CS     USE_CS  /* CONS_WITH_STACKER */
 #define FM     USE_FM  /* CONS_FINAL_MOD */
 #define GB     USE_GB  /* BASE_OTHER */
 #define H      USE_H   /* HALANT */
 #define FM     USE_FM  /* CONS_FINAL_MOD */
 #define GB     USE_GB  /* BASE_OTHER */
 #define H      USE_H   /* HALANT */
@@ -74,7 +75,13 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 00C0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 00D0 */     O,     O,     O,     O,     O,     O,     O,    GB,
 
   /* 00C0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 00D0 */     O,     O,     O,     O,     O,     O,     O,    GB,
 
-#define use_offset_0x0900u 80
+#define use_offset_0x0348u 80
+
+
+  /* Combining Diacritical Marks */
+                                                                         O,     O,     O,     O,     O,     O,     O,   CGJ,
+
+#define use_offset_0x0900u 88
 
 
   /* Devanagari */
 
 
   /* Devanagari */
@@ -97,7 +104,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 09C0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,   IND,     O,
   /* 09D0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     B,     B,     O,     B,
   /* 09E0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 09C0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,   IND,     O,
   /* 09D0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     B,     B,     O,     B,
   /* 09E0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 09F0 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 09F0 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     O,     O,     O,
 
   /* Gurmukhi */
 
 
   /* Gurmukhi */
 
@@ -119,7 +126,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 0AC0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,     O,  VAbv,  VAbv,  VAbv,     O,  VPst,  VPst,     H,     O,     O,
   /* 0AD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 0AE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0AC0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,     O,  VAbv,  VAbv,  VAbv,     O,  VPst,  VPst,     H,     O,     O,
   /* 0AD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 0AE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0AF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     O,     O,     O,     O,     O,     O,
+  /* 0AF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B, VMAbv, VMAbv, VMAbv, CMAbv, CMAbv, CMAbv,
 
   /* Oriya */
 
 
   /* Oriya */
 
@@ -163,14 +170,14 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 0CC0 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
   /* 0CD0 */     O,     O,     O,     O,     O,  VPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,     O,
   /* 0CE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0CC0 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
   /* 0CD0 */     O,     O,     O,     O,     O,  VPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,     O,
   /* 0CE0 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0CF0 */     O,     R,     R,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 0CF0 */     O,    CS,    CS,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Malayalam */
 
 
   /* Malayalam */
 
-  /* 0D00 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0D00 */ VMAbv, VMAbv, VMPst, VMPst,     O,     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,
   /* 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,     O,     O,     B,  VPst,  VPst,
+  /* 0D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,     B,  VPst,  VPst,
   /* 0D40 */  VPst,  VPst,  VPst,  VBlw,  VBlw,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     R,     O,
   /* 0D50 */     O,     O,     O,     O,   IND,   IND,   IND,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,
   /* 0D60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0D40 */  VPst,  VPst,  VPst,  VBlw,  VBlw,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     R,     O,
   /* 0D50 */     O,     O,     O,     O,   IND,   IND,   IND,  VPst,     O,     O,     O,     O,     O,     O,     O,     B,
   /* 0D60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
@@ -187,7 +194,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 0DE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0DF0 */     O,     O,  VPst,  VPst,     O,     O,     O,     O,
 
   /* 0DE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 0DF0 */     O,     O,  VPst,  VPst,     O,     O,     O,     O,
 
-#define use_offset_0x1000u 1352
+#define use_offset_0x1000u 1360
 
 
   /* Myanmar */
 
 
   /* Myanmar */
@@ -203,7 +210,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
   /* 1090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,  VPst,  VAbv,     O,     O,
 
   /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
   /* 1090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,  VPst,  VAbv,     O,     O,
 
-#define use_offset_0x1700u 1512
+#define use_offset_0x1700u 1520
 
 
   /* Tagalog */
 
 
   /* Tagalog */
@@ -236,7 +243,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 17D0 */    FM,  VAbv,     H,    FM,     O,     O,     O,     O,     O,     O,     O,     O,     B,  VAbv,     O,     O,
   /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* 17D0 */    FM,  VAbv,     H,    FM,     O,     O,     O,     O,     O,     O,     O,     O,     B,  VAbv,     O,     O,
   /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x1900u 1752
+#define use_offset_0x1900u 1760
 
 
   /* Limbu */
 
 
   /* Limbu */
@@ -274,13 +281,13 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1A50 */     B,     B,     B,     B,     B,  MPre,  MBlw,  FPst,  FAbv,  FAbv,  FAbv,  FBlw,  FBlw,  FBlw,  FBlw,     O,
+  /* 1A50 */     B,     B,     B,     B,     B,  MPre,  MBlw,   SUB,  FAbv,  FAbv,  FAbv,   SUB,   SUB,   SUB,   SUB,     O,
   /* 1A60 */     H,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
   /* 1A60 */     H,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
-  /* 1A70 */  VPre,  VPre,  VPre,  VAbv,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,    FM,    FM,    FM,     O,     O,    FM,
+  /* 1A70 */  VPre,  VPre,  VPre,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,  VAbv,    FM,    FM,     O,     O,  FBlw,
   /* 1A80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 1A90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* 1A80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* 1A90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x1b00u 2168
+#define use_offset_0x1b00u 2176
 
 
   /* Balinese */
 
 
   /* Balinese */
@@ -306,7 +313,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1BE0 */     B,     B,     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
   /* 1BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 1BE0 */     B,     B,     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
-  /* 1BF0 */  FAbv,  FAbv,  VPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 1BF0 */  FAbv,  FAbv, CMBlw, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Lepcha */
 
 
   /* Lepcha */
 
@@ -316,29 +323,29 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre,    FM, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 1C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,
 
   /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre,    FM, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 1C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,
 
-#define use_offset_0x1cd0u 2504
+#define use_offset_0x1cd0u 2512
 
 
   /* Vedic Extensions */
 
   /* 1CD0 */ VMAbv, VMAbv, VMAbv,     O, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMAbv, VMAbv, VMBlw, VMBlw, VMBlw, VMBlw,
   /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,     O,     O,     O,     O, VMBlw,     O,     O,
 
 
   /* Vedic Extensions */
 
   /* 1CD0 */ VMAbv, VMAbv, VMAbv,     O, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMAbv, VMAbv, VMBlw, VMBlw, VMBlw, VMBlw,
   /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,     O,     O,     O,     O, VMBlw,     O,     O,
-  /* 1CF0 */     O,     O, VMPst, VMPst, VMAbv,     O,     O,     O, VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,
+  /* 1CF0 */     O,     O, VMPst, VMPst, VMAbv,     O,     O, VMPst, VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,
 
 
-#define use_offset_0x1df8u 2552
+#define use_offset_0x1df8u 2560
 
 
   /* Combining Diacritical Marks Supplement */
                                                                          O,     O,     O,    FM,     O,     O,     O,     O,
 
 
 
   /* Combining Diacritical Marks Supplement */
                                                                          O,     O,     O,    FM,     O,     O,     O,     O,
 
-#define use_offset_0x2008u 2560
+#define use_offset_0x2008u 2568
 
 
   /* General Punctuation */
                                                                          O,     O,     O,     O,  ZWNJ,   ZWJ,     O,     O,
   /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
 
 
 
   /* General Punctuation */
                                                                          O,     O,     O,     O,  ZWNJ,   ZWJ,     O,     O,
   /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
 
-#define use_offset_0x2060u 2576
+#define use_offset_0x2060u 2584
 
   /* 2060 */    WJ,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
 
   /* 2060 */    WJ,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
@@ -347,7 +354,20 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 2070 */     O,     O,     O,     O,    FM,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 2080 */     O,     O,    FM,    FM,    FM,     O,     O,     O,
 
   /* 2070 */     O,     O,     O,     O,    FM,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 2080 */     O,     O,    FM,    FM,    FM,     O,     O,     O,
 
-#define use_offset_0xa800u 2616
+#define use_offset_0x20f0u 2624
+
+
+  /* Combining Diacritical Marks for Symbols */
+
+  /* 20F0 */ VMAbv,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x25c8u 2632
+
+
+  /* Geometric Shapes */
+                                                                         O,     O,     O,     O,    GB,     O,     O,     O,
+
+#define use_offset_0xa800u 2640
 
 
   /* Syloti Nagri */
 
 
   /* Syloti Nagri */
@@ -369,14 +389,14 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* A880 */ VMPst, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A8A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A880 */ VMPst, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A8A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A8B0 */     B,     B,     B,     B,  FPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,
+  /* A8B0 */     B,     B,     B,     B,  MPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,
   /* A8C0 */  VPst,  VPst,  VPst,  VPst,     H, VMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A8D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* Devanagari Extended */
 
   /* A8E0 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
   /* A8C0 */  VPst,  VPst,  VPst,  VPst,     H, VMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A8D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* Devanagari Extended */
 
   /* A8E0 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
-  /* A8F0 */ VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* A8F0 */ VMAbv, VMAbv,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
 
   /* Kayah Li */
 
 
   /* Kayah Li */
 
@@ -397,7 +417,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,
   /* A980 */ VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* A9A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A9B0 */     B,     B,     B, CMAbv,  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VPre,  VAbv,   SUB,  MPst,  MPst,
+  /* A9B0 */     B,     B,     B, CMAbv,  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VPre,  VAbv,   SUB,  MPst,  MBlw,
   /* A9C0 */     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* A9D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* 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,
 
@@ -410,7 +430,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 
   /* AA00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
 
   /* AA00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* AA10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VAbv,  VPre,
+  /* AA20 */     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VAbv,  VPre,
   /* AA30 */  VPre,  VAbv,  VBlw,  MPst,  MPre,  MBlw,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* AA40 */     B,     B,     B,  FAbv,     B,     B,     B,     B,     B,     B,     B,     B,  FAbv,  FPst,     O,     O,
   /* AA50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
   /* AA30 */  VPre,  VAbv,  VBlw,  MPst,  MPre,  MBlw,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* AA40 */     B,     B,     B,  FAbv,     B,     B,     B,     B,     B,     B,     B,     B,  FAbv,  FPst,     O,     O,
   /* AA50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
@@ -434,7 +454,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
   /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
 
   /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
   /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
 
-#define use_offset_0xabc0u 3376
+#define use_offset_0xabc0u 3400
 
 
   /* Meetei Mayek */
 
 
   /* Meetei Mayek */
@@ -444,14 +464,14 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
   /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
   /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0xfe00u 3440
+#define use_offset_0xfe00u 3464
 
 
   /* Variation Selectors */
 
   /* FE00 */    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,
 
 
 
   /* Variation Selectors */
 
   /* FE00 */    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,    VS,
 
-#define use_offset_0x10a00u 3456
+#define use_offset_0x10a00u 3480
 
 
   /* Kharoshthi */
 
 
   /* Kharoshthi */
@@ -462,19 +482,19 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 10A30 */     B,     B,     B,     B,     O,     O,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
   /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,
 
   /* 10A30 */     B,     B,     B,     B,     O,     O,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
   /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,
 
-#define use_offset_0x11000u 3528
+#define use_offset_0x11000u 3552
 
 
   /* Brahmi */
 
 
 
   /* Brahmi */
 
-  /* 11000 */ VMPst, VMAbv, VMPst,     R,     R,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11000 */ VMPst, VMAbv, VMPst,    CS,    CS,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11030 */     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,
   /* 11040 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11050 */     O,     O,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,
   /* 11060 */     N,     N,     N,     N,     N,     N,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 11030 */     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,
   /* 11040 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,     H,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 11050 */     O,     O,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,
   /* 11060 */     N,     N,     N,     N,     N,     N,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11070 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11070 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,    HN,
 
   /* Kaithi */
 
 
   /* Kaithi */
 
@@ -483,7 +503,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
 
   /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
 
-#define use_offset_0x11100u 3720
+#define use_offset_0x11100u 3744
 
 
   /* Chakma */
 
 
   /* Chakma */
@@ -521,7 +541,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
   /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
 
   /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
   /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
 
-#define use_offset_0x11280u 4040
+#define use_offset_0x11280u 4064
 
 
   /* Multani */
 
 
   /* Multani */
@@ -545,11 +565,11 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11320 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 11330 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPst,
   /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
   /* 11320 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
   /* 11330 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPst,
   /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
-  /* 11350 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11350 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     B,     B,
   /* 11360 */     B,     B,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
   /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
 
   /* 11360 */     B,     B,  VPst,  VPst,     O,     O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
   /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,
 
-#define use_offset_0x11400u 4288
+#define use_offset_0x11400u 4312
 
 
   /* Newa */
 
 
   /* Newa */
@@ -572,7 +592,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 114C0 */ VMAbv, VMPst,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 114D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* 114C0 */ VMAbv, VMPst,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
   /* 114D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
-#define use_offset_0x11580u 4512
+#define use_offset_0x11580u 4536
 
 
   /* Siddham */
 
 
   /* Siddham */
@@ -615,7 +635,26 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
   /* 11720 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,
   /* 11730 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
 
   /* 11720 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,
   /* 11730 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
 
-#define use_offset_0x11c00u 4960
+#define use_offset_0x11a00u 4984
+
+
+  /* Zanabazar Square */
+
+  /* 11A00 */     B,  VAbv,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,     B,     B,     B,     B,     B,
+  /* 11A10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11A30 */     B,     B,     B,    FM,  VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst,     R,  MBlw,  MBlw,  MBlw,  MBlw,    GB,
+  /* 11A40 */     O,     O,     O,     O,     O,    GB,     O,     H,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Soyombo */
+
+  /* 11A50 */     B,  VAbv,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VPst,  VPst,  VBlw,  VBlw,  VBlw,     B,     B,     B,     B,
+  /* 11A60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11A70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11A80 */     B,     B,     B,     B,     O,     O,     R,     R,     R,     R,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,
+  /* 11A90 */  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw, VMAbv, VMPst, CMAbv,     H,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x11c00u 5144
 
 
   /* Bhaiksuki */
 
 
   /* Bhaiksuki */
@@ -636,56 +675,70 @@ 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,
 
   /* 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,
 
-}; /* Table items: 5144; occupancy: 72% */
+#define use_offset_0x11d00u 5328
+
+
+  /* Masaram Gondi */
+
+  /* 11D00 */     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,
+  /* 11D10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11D20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11D30 */     B,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,     O,     O,     O,  VAbv,     O,  VAbv,  VAbv,     O,  VAbv,
+  /* 11D40 */ VMAbv, VMAbv, CMBlw,  VAbv,  VBlw,     H,     R,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11D50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+}; /* Table items: 5424; occupancy: 73% */
 
 USE_TABLE_ELEMENT_TYPE
 
 USE_TABLE_ELEMENT_TYPE
-hb_use_get_categories (hb_codepoint_t u)
+hb_use_get_category (hb_codepoint_t u)
 {
   switch (u >> 12)
   {
     case 0x0u:
 {
   switch (u >> 12)
   {
     case 0x0u:
-      if (hb_in_range (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
-      if (hb_in_range (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
-      if (hb_in_range (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
-      if (unlikely (u == 0x034Fu)) return CGJ;
+      if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0348u, 0x034Fu)) return use_table[u - 0x0348u + use_offset_0x0348u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
       break;
 
     case 0x1u:
       break;
 
     case 0x1u:
-      if (hb_in_range (u, 0x1000u, 0x109Fu)) return use_table[u - 0x1000u + use_offset_0x1000u];
-      if (hb_in_range (u, 0x1700u, 0x17EFu)) return use_table[u - 0x1700u + use_offset_0x1700u];
-      if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
-      if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
-      if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
-      if (hb_in_range (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1000u, 0x109Fu)) return use_table[u - 0x1000u + use_offset_0x1000u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1700u, 0x17EFu)) return use_table[u - 0x1700u + use_offset_0x1700u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
       break;
 
     case 0x2u:
       break;
 
     case 0x2u:
-      if (hb_in_range (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
-      if (hb_in_range (u, 0x2060u, 0x2087u)) return use_table[u - 0x2060u + use_offset_0x2060u];
-      if (unlikely (u == 0x25CCu)) return GB;
+      if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x2060u, 0x2087u)) return use_table[u - 0x2060u + use_offset_0x2060u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u];
       break;
 
     case 0xAu:
       break;
 
     case 0xAu:
-      if (hb_in_range (u, 0xA800u, 0xAAF7u)) return use_table[u - 0xA800u + use_offset_0xa800u];
-      if (hb_in_range (u, 0xABC0u, 0xABFFu)) return use_table[u - 0xABC0u + use_offset_0xabc0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xA800u, 0xAAF7u)) return use_table[u - 0xA800u + use_offset_0xa800u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xABC0u, 0xABFFu)) return use_table[u - 0xABC0u + use_offset_0xabc0u];
       break;
 
     case 0xFu:
       break;
 
     case 0xFu:
-      if (hb_in_range (u, 0xFE00u, 0xFE0Fu)) return use_table[u - 0xFE00u + use_offset_0xfe00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)) return use_table[u - 0xFE00u + use_offset_0xfe00u];
       break;
 
     case 0x10u:
       break;
 
     case 0x10u:
-      if (hb_in_range (u, 0x10A00u, 0x10A47u)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10A00u, 0x10A47u)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
       break;
 
     case 0x11u:
       break;
 
     case 0x11u:
-      if (hb_in_range (u, 0x11000u, 0x110BFu)) return use_table[u - 0x11000u + use_offset_0x11000u];
-      if (hb_in_range (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
-      if (hb_in_range (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
-      if (hb_in_range (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
-      if (hb_in_range (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u];
-      if (hb_in_range (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u];
-      if (unlikely (u == 0x1107Fu)) return HN;
+      if (hb_in_range<hb_codepoint_t> (u, 0x11000u, 0x110BFu)) return use_table[u - 0x11000u + use_offset_0x11000u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11A00u, 0x11A9Fu)) return use_table[u - 0x11A00u + use_offset_0x11a00u];
+      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, 0x11D5Fu)) return use_table[u - 0x11D00u + use_offset_0x11d00u];
       break;
 
     default:
       break;
 
     default:
@@ -696,6 +749,7 @@ hb_use_get_categories (hb_codepoint_t u)
 
 #undef B
 #undef CGJ
 
 #undef B
 #undef CGJ
+#undef CS
 #undef FM
 #undef GB
 #undef H
 #undef FM
 #undef GB
 #undef H
index af68706..ee7653b 100644 (file)
@@ -144,7 +144,7 @@ collect_features_use (hb_ot_shape_planner_t *plan)
   /* "Topographical features" */
   for (unsigned int i = 0; i < ARRAY_LENGTH (arabic_features); i++)
     map->add_feature (arabic_features[i], 1, F_NONE);
   /* "Topographical features" */
   for (unsigned int i = 0; i < ARRAY_LENGTH (arabic_features); i++)
     map->add_feature (arabic_features[i], 1, F_NONE);
-  map->add_gsub_pause (NULL);
+  map->add_gsub_pause (nullptr);
 
   /* "Standard typographic presentation" and "Positional feature application" */
   for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
 
   /* "Standard typographic presentation" and "Positional feature application" */
   for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
@@ -199,7 +199,7 @@ data_create_use (const hb_ot_shape_plan_t *plan)
 {
   use_shape_plan_t *use_plan = (use_shape_plan_t *) calloc (1, sizeof (use_shape_plan_t));
   if (unlikely (!use_plan))
 {
   use_shape_plan_t *use_plan = (use_shape_plan_t *) calloc (1, sizeof (use_shape_plan_t));
   if (unlikely (!use_plan))
-    return NULL;
+    return nullptr;
 
   use_plan->rphf_mask = plan->map.get_1_mask (HB_TAG('r','p','h','f'));
 
 
   use_plan->rphf_mask = plan->map.get_1_mask (HB_TAG('r','p','h','f'));
 
@@ -209,7 +209,7 @@ data_create_use (const hb_ot_shape_plan_t *plan)
     if (unlikely (!use_plan->arabic_plan))
     {
       free (use_plan);
     if (unlikely (!use_plan->arabic_plan))
     {
       free (use_plan);
-      return NULL;
+      return nullptr;
     }
   }
 
     }
   }
 
@@ -262,7 +262,7 @@ setup_masks_use (const hb_ot_shape_plan_t *plan,
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 0; i < count; i++)
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 0; i < count; i++)
-    info[i].use_category() = hb_use_get_categories (info[i].codepoint);
+    info[i].use_category() = hb_use_get_category (info[i].codepoint);
 }
 
 static void
 }
 
 static void
@@ -292,7 +292,7 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
   if (use_plan->arabic_plan)
     return;
 
   if (use_plan->arabic_plan)
     return;
 
-  ASSERT_STATIC (INIT < 4 && ISOL < 4 && MEDI < 4 && FINA < 4);
+  static_assert ((INIT < 4 && ISOL < 4 && MEDI < 4 && FINA < 4), "");
   hb_mask_t masks[4], all_masks = 0;
   for (unsigned int i = 0; i < 4; i++)
   {
   hb_mask_t masks[4], all_masks = 0;
   for (unsigned int i = 0; i < 4; i++)
   {
@@ -354,6 +354,8 @@ setup_syllables (const hb_ot_shape_plan_t *plan,
                 hb_buffer_t *buffer)
 {
   find_syllables (buffer);
                 hb_buffer_t *buffer)
 {
   find_syllables (buffer);
+  foreach_syllable (buffer, start, end)
+    buffer->unsafe_to_break (start, end);
   setup_rphf_mask (plan, buffer);
   setup_topographical_masks (plan, buffer);
 }
   setup_rphf_mask (plan, buffer);
   setup_topographical_masks (plan, buffer);
 }
@@ -422,7 +424,7 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
 {
   syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
   /* Only a few syllable types need reordering. */
 {
   syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
   /* Only a few syllable types need reordering. */
-  if (unlikely (!(FLAG_SAFE (syllable_type) &
+  if (unlikely (!(FLAG_UNSAFE (syllable_type) &
                  (FLAG (virama_terminated_cluster) |
                   FLAG (standard_cluster) |
                   FLAG (broken_cluster) |
                  (FLAG (virama_terminated_cluster) |
                   FLAG (standard_cluster) |
                   FLAG (broken_cluster) |
@@ -503,7 +505,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
   hb_glyph_info_t dottedcircle = {0};
   if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint))
     return;
   hb_glyph_info_t dottedcircle = {0};
   if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint))
     return;
-  dottedcircle.use_category() = hb_use_get_categories (0x25CC);
+  dottedcircle.use_category() = hb_use_get_category (0x25CC);
 
   buffer->clear_output ();
 
 
   buffer->clear_output ();
 
@@ -593,18 +595,18 @@ compose_use (const hb_ot_shape_normalize_context_t *c,
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_use =
 {
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_use =
 {
-  "use",
   collect_features_use,
   collect_features_use,
-  NULL, /* override_features */
+  nullptr, /* override_features */
   data_create_use,
   data_destroy_use,
   data_create_use,
   data_destroy_use,
-  NULL, /* preprocess_text */
-  NULL, /* postprocess_glyphs */
+  nullptr, /* preprocess_text */
+  nullptr, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
   decompose_use,
   compose_use,
   setup_masks_use,
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
   decompose_use,
   compose_use,
   setup_masks_use,
-  NULL, /* disable_otl */
+  nullptr, /* disable_otl */
+  nullptr, /* reorder_marks */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
   false, /* fallback_position */
 };
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
   false, /* fallback_position */
 };
index ea8312b..c7b4605 100644 (file)
@@ -200,8 +200,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
               unsigned int combining_class)
 {
   hb_glyph_extents_t mark_extents;
               unsigned int combining_class)
 {
   hb_glyph_extents_t mark_extents;
-  if (!font->get_glyph_extents (buffer->info[i].codepoint,
-                               &mark_extents))
+  if (!font->get_glyph_extents (buffer->info[i].codepoint, &mark_extents))
     return;
 
   hb_position_t y_gap = font->y_scale / 16;
     return;
 
   hb_position_t y_gap = font->y_scale / 16;
@@ -210,7 +209,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
   pos.x_offset = pos.y_offset = 0;
 
 
   pos.x_offset = pos.y_offset = 0;
 
 
-  /* We dont position LEFT and RIGHT marks. */
+  /* We don't position LEFT and RIGHT marks. */
 
   /* X positioning */
   switch (combining_class)
 
   /* X positioning */
   switch (combining_class)
@@ -218,10 +217,10 @@ position_mark (const hb_ot_shape_plan_t *plan,
     case HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW:
     case HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE:
       if (buffer->props.direction == HB_DIRECTION_LTR) {
     case HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW:
     case HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE:
       if (buffer->props.direction == HB_DIRECTION_LTR) {
-       pos.x_offset += base_extents.x_bearing - mark_extents.width / 2 - mark_extents.x_bearing;
+       pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width / 2 - mark_extents.x_bearing;
         break;
       } else if (buffer->props.direction == HB_DIRECTION_RTL) {
         break;
       } else if (buffer->props.direction == HB_DIRECTION_RTL) {
-       pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width / 2 - mark_extents.x_bearing;
+       pos.x_offset += base_extents.x_bearing - mark_extents.width / 2 - mark_extents.x_bearing;
         break;
       }
       HB_FALLTHROUGH;
         break;
       }
       HB_FALLTHROUGH;
@@ -307,6 +306,9 @@ position_around_base (const hb_ot_shape_plan_t *plan,
                      unsigned int end)
 {
   hb_direction_t horiz_dir = HB_DIRECTION_INVALID;
                      unsigned int end)
 {
   hb_direction_t horiz_dir = HB_DIRECTION_INVALID;
+
+  buffer->unsafe_to_break (base, end);
+
   hb_glyph_extents_t base_extents;
   if (!font->get_glyph_extents (buffer->info[base].codepoint,
                                &base_extents))
   hb_glyph_extents_t base_extents;
   if (!font->get_glyph_extents (buffer->info[base].codepoint,
                                &base_extents))
@@ -319,7 +321,9 @@ position_around_base (const hb_ot_shape_plan_t *plan,
   base_extents.y_bearing += buffer->pos[base].y_offset;
 
   unsigned int lig_id = _hb_glyph_info_get_lig_id (&buffer->info[base]);
   base_extents.y_bearing += buffer->pos[base].y_offset;
 
   unsigned int lig_id = _hb_glyph_info_get_lig_id (&buffer->info[base]);
-  unsigned int num_lig_components = _hb_glyph_info_get_lig_num_comps (&buffer->info[base]);
+  /* Use integer for num_lig_components such that it doesn't convert to unsigned
+   * when we divide or multiply by it. */
+  int num_lig_components = _hb_glyph_info_get_lig_num_comps (&buffer->info[base]);
 
   hb_position_t x_offset = 0, y_offset = 0;
   if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) {
 
   hb_position_t x_offset = 0, y_offset = 0;
   if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) {
@@ -328,7 +332,7 @@ position_around_base (const hb_ot_shape_plan_t *plan,
   }
 
   hb_glyph_extents_t component_extents = base_extents;
   }
 
   hb_glyph_extents_t component_extents = base_extents;
-  unsigned int last_lig_component = (unsigned int) -1;
+  int last_lig_component = -1;
   unsigned int last_combining_class = 255;
   hb_glyph_extents_t cluster_extents = base_extents; /* Initialization is just to shut gcc up. */
   hb_glyph_info_t *info = buffer->info;
   unsigned int last_combining_class = 255;
   hb_glyph_extents_t cluster_extents = base_extents; /* Initialization is just to shut gcc up. */
   hb_glyph_info_t *info = buffer->info;
@@ -337,7 +341,7 @@ position_around_base (const hb_ot_shape_plan_t *plan,
     {
       if (num_lig_components > 1) {
        unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&info[i]);
     {
       if (num_lig_components > 1) {
        unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&info[i]);
-       unsigned int this_lig_component = _hb_glyph_info_get_lig_comp (&info[i]) - 1;
+       int this_lig_component = _hb_glyph_info_get_lig_comp (&info[i]) - 1;
        /* Conditions for attaching to the last component. */
        if (!lig_id || lig_id != this_lig_id || this_lig_component >= num_lig_components)
          this_lig_component = num_lig_components - 1;
        /* Conditions for attaching to the last component. */
        if (!lig_id || lig_id != this_lig_id || this_lig_component >= num_lig_components)
          this_lig_component = num_lig_components - 1;
@@ -439,10 +443,10 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
 {
   if (!plan->has_kern) return;
 
 {
   if (!plan->has_kern) return;
 
-  OT::hb_apply_context_t c (1, font, buffer);
+  OT::hb_ot_apply_context_t c (1, font, buffer);
   c.set_lookup_mask (plan->kern_mask);
   c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
   c.set_lookup_mask (plan->kern_mask);
   c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
-  OT::hb_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input;
+  OT::hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input;
   skippy_iter.init (&c);
 
   unsigned int count = buffer->len;
   skippy_iter.init (&c);
 
   unsigned int count = buffer->len;
@@ -470,6 +474,7 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
       pos[idx].x_advance += kern1;
       pos[skippy_iter.idx].x_advance += kern2;
       pos[skippy_iter.idx].x_offset += kern2;
       pos[idx].x_advance += kern1;
       pos[skippy_iter.idx].x_advance += kern2;
       pos[skippy_iter.idx].x_offset += kern2;
+      buffer->unsafe_to_break (idx, skippy_iter.idx + 1);
     }
 
     if (y_kern)
     }
 
     if (y_kern)
@@ -479,6 +484,7 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
       pos[idx].y_advance += kern1;
       pos[skippy_iter.idx].y_advance += kern2;
       pos[skippy_iter.idx].y_offset += kern2;
       pos[idx].y_advance += kern1;
       pos[skippy_iter.idx].y_advance += kern2;
       pos[skippy_iter.idx].y_offset += kern2;
+      buffer->unsafe_to_break (idx, skippy_iter.idx + 1);
     }
 
     idx = skippy_iter.idx;
     }
 
     idx = skippy_iter.idx;
@@ -521,7 +527,7 @@ _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
          break;
 
        case t::SPACE_4_EM_18:
          break;
 
        case t::SPACE_4_EM_18:
-         pos[i].x_advance = font->x_scale * 4 / 18;
+         pos[i].x_advance = (int64_t) font->x_scale * 4 / 18;
          break;
 
        case t::SPACE_FIGURE:
          break;
 
        case t::SPACE_FIGURE:
index 94a3d7d..62cbb9d 100644 (file)
@@ -346,13 +346,16 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
         break;
 
     /* We are going to do a O(n^2).  Only do this if the sequence is short. */
         break;
 
     /* We are going to do a O(n^2).  Only do this if the sequence is short. */
-    if (end - i > 10) {
+    if (end - i > HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS) {
       i = end;
       continue;
     }
 
     buffer->sort (i, end, compare_combining_class);
 
       i = end;
       continue;
     }
 
     buffer->sort (i, end, compare_combining_class);
 
+    if (plan->shaper->reorder_marks)
+      plan->shaper->reorder_marks (plan, buffer, i, end);
+
     i = end;
   }
 
     i = end;
   }
 
@@ -377,39 +380,54 @@ _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. */
         * 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())) &&
-       /* If there's anything between the starter and this char, they should have CCC
-        * smaller than this character's. */
-       (starter == buffer->out_len - 1 ||
-        _hb_glyph_info_get_modified_combining_class (&buffer->prev()) < _hb_glyph_info_get_modified_combining_class (&buffer->cur())) &&
-       /* And compose. */
-       c.compose (&c,
-                  buffer->out_info[starter].codepoint,
-                  buffer->cur().codepoint,
-                  &composed) &&
-       /* And the font has glyph for the composite. */
-       font->get_nominal_glyph (composed, &glyph))
+       HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->cur())))
     {
     {
-      /* Composes. */
-      buffer->next_glyph (); /* Copy to out-buffer. */
-      if (unlikely (buffer->in_error))
-        return;
-      buffer->merge_out_clusters (starter, buffer->out_len);
-      buffer->out_len--; /* Remove the second composable. */
-      /* Modify starter and carry on. */
-      buffer->out_info[starter].codepoint = composed;
-      buffer->out_info[starter].glyph_index() = glyph;
-      _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer);
-
-      continue;
+      if (/* If there's anything between the starter and this char, they should have CCC
+          * smaller than this character's. */
+         (starter == buffer->out_len - 1 ||
+          info_cc (buffer->prev()) < info_cc (buffer->cur())) &&
+         /* And compose. */
+         c.compose (&c,
+                    buffer->out_info[starter].codepoint,
+                    buffer->cur().codepoint,
+                    &composed) &&
+         /* And the font has glyph for the composite. */
+         font->get_nominal_glyph (composed, &glyph))
+      {
+       /* Composes. */
+       buffer->next_glyph (); /* Copy to out-buffer. */
+       if (unlikely (buffer->in_error))
+         return;
+       buffer->merge_out_clusters (starter, buffer->out_len);
+       buffer->out_len--; /* Remove the second composable. */
+       /* Modify starter and carry on. */
+       buffer->out_info[starter].codepoint = composed;
+       buffer->out_info[starter].glyph_index() = glyph;
+       _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer);
+
+       continue;
+      }
     }
 
     /* Blocked, or doesn't compose. */
     buffer->next_glyph ();
 
     }
 
     /* Blocked, or doesn't compose. */
     buffer->next_glyph ();
 
-    if (_hb_glyph_info_get_modified_combining_class (&buffer->prev()) == 0)
+    if (info_cc (buffer->prev()) == 0)
       starter = buffer->out_len - 1;
   }
   buffer->swap_buffers ();
 
       starter = buffer->out_len - 1;
   }
   buffer->swap_buffers ();
 
+  if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CGJ)
+  {
+    /* For all CGJ, check if it prevented any reordering at all.
+     * If it did NOT, then make it skippable.
+     * https://github.com/harfbuzz/harfbuzz/issues/554
+     */
+    for (unsigned int i = 1; i + 1 < buffer->len; i++)
+      if (buffer->info[i].codepoint == 0x034Fu/*CGJ*/ &&
+         info_cc(buffer->info[i-1]) <= info_cc(buffer->info[i+1]))
+      {
+       _hb_glyph_info_unhide (&buffer->info[i]);
+      }
+  }
 }
 }
index 594e54c..fe5d2b7 100644 (file)
@@ -73,7 +73,7 @@ struct hb_ot_shape_planner_t
   hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan) :
                         face (master_plan->face_unsafe),
                         props (master_plan->props),
   hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan) :
                         face (master_plan->face_unsafe),
                         props (master_plan->props),
-                        shaper (NULL),
+                        shaper (nullptr),
                         map (face, &props) {}
   ~hb_ot_shape_planner_t (void) { map.finish (); }
 
                         map (face, &props) {}
   ~hb_ot_shape_planner_t (void) { map.finish (); }
 
@@ -99,7 +99,9 @@ struct hb_ot_shape_planner_t
   }
 
   private:
   }
 
   private:
-  NO_COPY (hb_ot_shape_planner_t);
+  /* No copy. */
+  hb_ot_shape_planner_t (const hb_ot_shape_planner_t &);
+  hb_ot_shape_planner_t &operator = (const hb_ot_shape_planner_t &);
 };
 
 
 };
 
 
index 29f5e58..263d65c 100644 (file)
@@ -40,6 +40,8 @@
 #include "hb-unicode-private.hh"
 #include "hb-set-private.hh"
 
 #include "hb-unicode-private.hh"
 #include "hb-set-private.hh"
 
+#include "hb-ot-layout-gsubgpos-private.hh"
+//#include "hb-aat-layout-private.hh"
 
 static hb_tag_t common_features[] = {
   HB_TAG('c','c','m','p'),
 
 static hb_tag_t common_features[] = {
   HB_TAG('c','c','m','p'),
@@ -70,7 +72,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t          *planner,
   hb_ot_map_builder_t *map = &planner->map;
 
   map->add_global_bool_feature (HB_TAG('r','v','r','n'));
   hb_ot_map_builder_t *map = &planner->map;
 
   map->add_global_bool_feature (HB_TAG('r','v','r','n'));
-  map->add_gsub_pause (NULL);
+  map->add_gsub_pause (nullptr);
 
   switch (props->direction) {
     case HB_DIRECTION_LTR:
 
   switch (props->direction) {
     case HB_DIRECTION_LTR:
@@ -108,7 +110,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t          *planner,
     /* We really want to find a 'vert' feature if there's any in the font, no
      * matter which script/langsys it is listed (or not) under.
      * See various bugs referenced from:
     /* We really want to find a 'vert' feature if there's any in the font, no
      * matter which script/langsys it is listed (or not) under.
      * See various bugs referenced from:
-     * https://github.com/behdad/harfbuzz/issues/63 */
+     * https://github.com/harfbuzz/harfbuzz/issues/63 */
     map->add_feature (HB_TAG ('v','e','r','t'), 1, F_GLOBAL | F_GLOBAL_SEARCH);
   }
 
     map->add_feature (HB_TAG ('v','e','r','t'), 1, F_GLOBAL | F_GLOBAL_SEARCH);
   }
 
@@ -176,7 +178,7 @@ _hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan,
 {
   hb_ot_shape_plan_t *plan = (hb_ot_shape_plan_t *) calloc (1, sizeof (hb_ot_shape_plan_t));
   if (unlikely (!plan))
 {
   hb_ot_shape_plan_t *plan = (hb_ot_shape_plan_t *) calloc (1, sizeof (hb_ot_shape_plan_t));
   if (unlikely (!plan))
-    return NULL;
+    return nullptr;
 
   hb_ot_shape_planner_t planner (shape_plan);
 
 
   hb_ot_shape_planner_t planner (shape_plan);
 
@@ -190,7 +192,7 @@ _hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan,
   if (plan->shaper->data_create) {
     plan->data = plan->shaper->data_create (plan);
     if (unlikely (!plan->data))
   if (plan->shaper->data_create) {
     plan->data = plan->shaper->data_create (plan);
     if (unlikely (!plan->data))
-      return NULL;
+      return nullptr;
   }
 
   return plan;
   }
 
   return plan;
@@ -275,8 +277,7 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
 static void
 hb_form_clusters (hb_buffer_t *buffer)
 {
 static void
 hb_form_clusters (hb_buffer_t *buffer)
 {
-  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
-      buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII))
     return;
 
   /* Loop duplicated in hb_ensure_native_direction(), and in _hb-coretext.cc */
     return;
 
   /* Loop duplicated in hb_ensure_native_direction(), and in _hb-coretext.cc */
@@ -288,11 +289,17 @@ hb_form_clusters (hb_buffer_t *buffer)
     if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])) &&
                !_hb_glyph_info_is_joiner (&info[i])))
     {
     if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])) &&
                !_hb_glyph_info_is_joiner (&info[i])))
     {
-      buffer->merge_clusters (base, i);
+      if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+       buffer->merge_clusters (base, i);
+      else
+       buffer->unsafe_to_break (base, i);
       base = i;
     }
   }
       base = i;
     }
   }
-  buffer->merge_clusters (base, count);
+  if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+    buffer->merge_clusters (base, count);
+  else
+    buffer->unsafe_to_break (base, count);
 }
 
 static void
 }
 
 static void
@@ -394,6 +401,8 @@ hb_ot_shape_setup_masks_fraction (hb_ot_shape_context_t *c)
             HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
         end++;
 
             HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
         end++;
 
+      buffer->unsafe_to_break (start, end);
+
       for (unsigned int j = start; j < i; j++)
         info[j].mask |= pre_mask;
       info[i].mask |= c->plan->frac_mask;
       for (unsigned int j = start; j < i; j++)
         info[j].mask |= pre_mask;
       info[i].mask |= c->plan->frac_mask;
@@ -443,7 +452,8 @@ hb_ot_zero_width_default_ignorables (hb_ot_shape_context_t *c)
   hb_buffer_t *buffer = c->buffer;
 
   if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
   hb_buffer_t *buffer = c->buffer;
 
   if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
-      (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
+      (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES) ||
+      (buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES))
     return;
 
   unsigned int count = buffer->len;
     return;
 
   unsigned int count = buffer->len;
@@ -479,7 +489,8 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c)
     return;
 
   hb_codepoint_t space;
     return;
 
   hb_codepoint_t space;
-  if (c->font->get_nominal_glyph (' ', &space))
+  if (!(buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) &&
+      c->font->get_nominal_glyph (' ', &space))
   {
     /* Replace default-ignorables with a zero-advance space glyph. */
     for (/*continue*/; i < count; i++)
   {
     /* Replace default-ignorables with a zero-advance space glyph. */
     for (/*continue*/; i < count; i++)
@@ -509,9 +520,10 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c)
          /* Merge cluster backward. */
          if (cluster < info[j - 1].cluster)
          {
          /* Merge cluster backward. */
          if (cluster < info[j - 1].cluster)
          {
+           unsigned int mask = info[i].mask;
            unsigned int old_cluster = info[j - 1].cluster;
            for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--)
            unsigned int old_cluster = info[j - 1].cluster;
            for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--)
-             info[k - 1].cluster = cluster;
+             buffer->set_cluster (info[k - 1], cluster, mask);
          }
          continue;
        }
          }
          continue;
        }
@@ -577,8 +589,6 @@ hb_ot_substitute_default (hb_ot_shape_context_t *c)
 {
   hb_buffer_t *buffer = c->buffer;
 
 {
   hb_buffer_t *buffer = c->buffer;
 
-  hb_ot_shape_initialize_masks (c);
-
   hb_ot_mirror_chars (c);
 
   HB_BUFFER_ALLOCATE_VAR (buffer, glyph_index);
   hb_ot_mirror_chars (c);
 
   HB_BUFFER_ALLOCATE_VAR (buffer, glyph_index);
@@ -608,7 +618,8 @@ hb_ot_substitute_complex (hb_ot_shape_context_t *c)
 
   c->plan->substitute (c->font, buffer);
 
 
   c->plan->substitute (c->font, buffer);
 
-  return;
+  /* XXX Call morx instead. */
+  //hb_aat_layout_substitute (c->font, c->buffer);
 }
 
 static inline void
 }
 
 static inline void
@@ -687,9 +698,9 @@ hb_ot_position_default (hb_ot_shape_context_t *c)
 static inline void
 hb_ot_position_complex (hb_ot_shape_context_t *c)
 {
 static inline void
 hb_ot_position_complex (hb_ot_shape_context_t *c)
 {
-  hb_ot_layout_position_start (c->font, c->buffer);
-
   unsigned int count = c->buffer->len;
   unsigned int count = c->buffer->len;
+  hb_glyph_info_t *info = c->buffer->info;
+  hb_glyph_position_t *pos = c->buffer->pos;
 
   /* If the font has no GPOS, AND, no fallback positioning will
    * happen, AND, direction is forward, then when zeroing mark
 
   /* If the font has no GPOS, AND, no fallback positioning will
    * happen, AND, direction is forward, then when zeroing mark
@@ -704,6 +715,17 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
                                     !c->plan->shaper->fallback_position &&
                                     HB_DIRECTION_IS_FORWARD (c->buffer->props.direction);
 
                                     !c->plan->shaper->fallback_position &&
                                     HB_DIRECTION_IS_FORWARD (c->buffer->props.direction);
 
+  /* We change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */
+
+  /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+  if (c->font->has_glyph_h_origin_func ())
+    for (unsigned int i = 0; i < count; i++)
+      c->font->add_glyph_h_origin (info[i].codepoint,
+                                  &pos[i].x_offset,
+                                  &pos[i].y_offset);
+
+  hb_ot_layout_position_start (c->font, c->buffer);
+
   switch (c->plan->shaper->zero_width_marks)
   {
     case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
   switch (c->plan->shaper->zero_width_marks)
   {
     case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
@@ -717,30 +739,8 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
   }
 
   if (likely (!c->fallback_positioning))
   }
 
   if (likely (!c->fallback_positioning))
-  {
-    hb_glyph_info_t *info = c->buffer->info;
-    hb_glyph_position_t *pos = c->buffer->pos;
-
-    /* Change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */
-
-    /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
-    if (c->font->has_glyph_h_origin_func ())
-      for (unsigned int i = 0; i < count; i++)
-       c->font->add_glyph_h_origin (info[i].codepoint,
-                                    &pos[i].x_offset,
-                                    &pos[i].y_offset);
-
     c->plan->position (c->font, c->buffer);
 
     c->plan->position (c->font, c->buffer);
 
-    /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
-    if (c->font->has_glyph_h_origin_func ())
-      for (unsigned int i = 0; i < count; i++)
-       c->font->subtract_glyph_h_origin (info[i].codepoint,
-                                         &pos[i].x_offset,
-                                         &pos[i].y_offset);
-
-  }
-
   switch (c->plan->shaper->zero_width_marks)
   {
     case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
   switch (c->plan->shaper->zero_width_marks)
   {
     case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
@@ -757,6 +757,13 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
   hb_ot_layout_position_finish_advances (c->font, c->buffer);
   hb_ot_zero_width_default_ignorables (c);
   hb_ot_layout_position_finish_offsets (c->font, c->buffer);
   hb_ot_layout_position_finish_advances (c->font, c->buffer);
   hb_ot_zero_width_default_ignorables (c);
   hb_ot_layout_position_finish_offsets (c->font, c->buffer);
+
+  /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+  if (c->font->has_glyph_h_origin_func ())
+    for (unsigned int i = 0; i < count; i++)
+      c->font->subtract_glyph_h_origin (info[i].codepoint,
+                                       &pos[i].x_offset,
+                                       &pos[i].y_offset);
 }
 
 static inline void
 }
 
 static inline void
@@ -780,8 +787,35 @@ hb_ot_position (hb_ot_shape_context_t *c)
     _hb_ot_shape_fallback_kern (c->plan, c->font, c->buffer);
 
   _hb_buffer_deallocate_gsubgpos_vars (c->buffer);
     _hb_ot_shape_fallback_kern (c->plan, c->font, c->buffer);
 
   _hb_buffer_deallocate_gsubgpos_vars (c->buffer);
+
+  //hb_aat_layout_position (c->font, c->buffer);
 }
 
 }
 
+static inline void
+hb_propagate_flags (hb_buffer_t *buffer)
+{
+  /* Propagate cluster-level glyph flags to be the same on all cluster glyphs.
+   * Simplifies using them. */
+
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK))
+    return;
+
+  hb_glyph_info_t *info = buffer->info;
+
+  foreach_cluster (buffer, start, end)
+  {
+    unsigned int mask = 0;
+    for (unsigned int i = start; i < end; i++)
+      if (info[i].mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
+      {
+        mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+        break;
+      }
+    if (mask)
+      for (unsigned int i = start; i < end; i++)
+       info[i].mask |= mask;
+  }
+}
 
 /* Pull it all together! */
 
 
 /* Pull it all together! */
 
@@ -790,11 +824,16 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
 {
   c->buffer->deallocate_var_all ();
   c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
 {
   c->buffer->deallocate_var_all ();
   c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
-  if (likely (!_hb_unsigned_int_mul_overflows (c->buffer->len, HB_BUFFER_MAX_EXPANSION_FACTOR)))
+  if (likely (!_hb_unsigned_int_mul_overflows (c->buffer->len, HB_BUFFER_MAX_LEN_FACTOR)))
   {
   {
-    c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_EXPANSION_FACTOR,
+    c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_LEN_FACTOR,
                              (unsigned) HB_BUFFER_MAX_LEN_MIN);
   }
                              (unsigned) HB_BUFFER_MAX_LEN_MIN);
   }
+  if (likely (!_hb_unsigned_int_mul_overflows (c->buffer->len, HB_BUFFER_MAX_OPS_FACTOR)))
+  {
+    c->buffer->max_ops = MAX (c->buffer->len * HB_BUFFER_MAX_OPS_FACTOR,
+                             (unsigned) HB_BUFFER_MAX_OPS_MIN);
+  }
 
   bool disable_otl = c->plan->shaper->disable_otl && c->plan->shaper->disable_otl (c->plan);
   //c->fallback_substitute     = disable_otl || !hb_ot_layout_has_substitution (c->face);
 
   bool disable_otl = c->plan->shaper->disable_otl && c->plan->shaper->disable_otl (c->plan);
   //c->fallback_substitute     = disable_otl || !hb_ot_layout_has_substitution (c->face);
@@ -808,8 +847,10 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
 
   c->buffer->clear_output ();
 
 
   c->buffer->clear_output ();
 
+  hb_ot_shape_initialize_masks (c);
   hb_set_unicode_props (c->buffer);
   hb_insert_dotted_circle (c->buffer, c->font);
   hb_set_unicode_props (c->buffer);
   hb_insert_dotted_circle (c->buffer, c->font);
+
   hb_form_clusters (c->buffer);
 
   hb_ensure_native_direction (c->buffer);
   hb_form_clusters (c->buffer);
 
   hb_ensure_native_direction (c->buffer);
@@ -825,11 +866,14 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
   if (c->plan->shaper->postprocess_glyphs)
     c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
 
   if (c->plan->shaper->postprocess_glyphs)
     c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
 
+  hb_propagate_flags (c->buffer);
+
   _hb_buffer_deallocate_unicode_vars (c->buffer);
 
   c->buffer->props.direction = c->target_direction;
 
   c->buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
   _hb_buffer_deallocate_unicode_vars (c->buffer);
 
   c->buffer->props.direction = c->target_direction;
 
   c->buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
+  c->buffer->max_ops = HB_BUFFER_MAX_OPS_DEFAULT;
   c->buffer->deallocate_var_all ();
 }
 
   c->buffer->deallocate_var_all ();
 }
 
@@ -897,7 +941,7 @@ hb_ot_shape_glyphs_closure (hb_font_t          *font,
 {
   hb_ot_shape_plan_t plan;
 
 {
   hb_ot_shape_plan_t plan;
 
-  const char *shapers[] = {"ot", NULL};
+  const char *shapers[] = {"ot", nullptr};
   hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached (font->face, &buffer->props,
                                                             features, num_features, shapers);
 
   hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached (font->face, &buffer->props,
                                                             features, num_features, shapers);
 
@@ -908,18 +952,19 @@ hb_ot_shape_glyphs_closure (hb_font_t          *font,
   for (unsigned int i = 0; i < count; i++)
     add_char (font, buffer->unicode, mirror, info[i].codepoint, glyphs);
 
   for (unsigned int i = 0; i < count; i++)
     add_char (font, buffer->unicode, mirror, info[i].codepoint, glyphs);
 
-  hb_set_t lookups;
-  lookups.init ();
-  hb_ot_shape_plan_collect_lookups (shape_plan, HB_OT_TAG_GSUB, &lookups);
+  hb_set_t *lookups = hb_set_create ();
+  hb_ot_shape_plan_collect_lookups (shape_plan, HB_OT_TAG_GSUB, lookups);
 
   /* And find transitive closure. */
 
   /* And find transitive closure. */
-  hb_set_t copy;
-  copy.init ();
+  hb_set_t *copy = hb_set_create ();
   do {
   do {
-    copy.set (glyphs);
-    for (hb_codepoint_t lookup_index = -1; hb_set_next (&lookups, &lookup_index);)
+    copy->set (glyphs);
+    for (hb_codepoint_t lookup_index = HB_SET_VALUE_INVALID; hb_set_next (lookups, &lookup_index);)
       hb_ot_layout_lookup_substitute_closure (font->face, lookup_index, glyphs);
       hb_ot_layout_lookup_substitute_closure (font->face, lookup_index, glyphs);
-  } while (!copy.is_equal (glyphs));
+  } while (!copy->is_equal (glyphs));
+  hb_set_destroy (copy);
+
+  hb_set_destroy (lookups);
 
   hb_shape_plan_destroy (shape_plan);
 }
 
   hb_shape_plan_destroy (shape_plan);
 }
index 9b0db50..1338c31 100644 (file)
@@ -270,28 +270,36 @@ static const LangTag ot_languages[] = {
   {"cak",      HB_TAG('C','A','K',' ')},       /* Kaqchikel */
   {"cbk",      HB_TAG('C','B','K',' ')},       /* Chavacano */
   {"cbl",      HB_TAG('Q','I','N',' ')},       /* Bualkhaw Chin */
   {"cak",      HB_TAG('C','A','K',' ')},       /* Kaqchikel */
   {"cbk",      HB_TAG('C','B','K',' ')},       /* Chavacano */
   {"cbl",      HB_TAG('Q','I','N',' ')},       /* Bualkhaw Chin */
+  {"cco",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"ce",       HB_TAG('C','H','E',' ')},       /* Chechen */
   {"ceb",      HB_TAG('C','E','B',' ')},       /* Cebuano */
   {"cfm",      HB_TAG('H','A','L',' ')},       /* Halam/Falam Chin */
   {"cgg",      HB_TAG('C','G','G',' ')},       /* Chiga */
   {"ch",       HB_TAG('C','H','A',' ')},       /* Chamorro */
   {"ce",       HB_TAG('C','H','E',' ')},       /* Chechen */
   {"ceb",      HB_TAG('C','E','B',' ')},       /* Cebuano */
   {"cfm",      HB_TAG('H','A','L',' ')},       /* Halam/Falam Chin */
   {"cgg",      HB_TAG('C','G','G',' ')},       /* Chiga */
   {"ch",       HB_TAG('C','H','A',' ')},       /* Chamorro */
+  {"chj",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"chk",      HB_TAG('C','H','K','0')},       /* Chuukese */
   {"cho",      HB_TAG('C','H','O',' ')},       /* Choctaw */
   {"chp",      HB_TAG('C','H','P',' ')},       /* Chipewyan */
   {"chk",      HB_TAG('C','H','K','0')},       /* Chuukese */
   {"cho",      HB_TAG('C','H','O',' ')},       /* Choctaw */
   {"chp",      HB_TAG('C','H','P',' ')},       /* Chipewyan */
+  {"chq",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"chr",      HB_TAG('C','H','R',' ')},       /* Cherokee */
   {"chy",      HB_TAG('C','H','Y',' ')},       /* Cheyenne */
   {"chr",      HB_TAG('C','H','R',' ')},       /* Cherokee */
   {"chy",      HB_TAG('C','H','Y',' ')},       /* Cheyenne */
+  {"chz",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"cja",      HB_TAG('C','J','A',' ')},       /* Western Cham */
   {"cjm",      HB_TAG('C','J','M',' ')},       /* Eastern Cham */
   {"cka",      HB_TAG('Q','I','N',' ')},       /* Khumi Awa Chin */
   {"ckb",      HB_TAG('K','U','R',' ')},       /* Central Kurdish (Sorani) */
   {"ckt",      HB_TAG('C','H','K',' ')},       /* Chukchi */
   {"cld",      HB_TAG('S','Y','R',' ')},       /* Chaldean Neo-Aramaic */
   {"cja",      HB_TAG('C','J','A',' ')},       /* Western Cham */
   {"cjm",      HB_TAG('C','J','M',' ')},       /* Eastern Cham */
   {"cka",      HB_TAG('Q','I','N',' ')},       /* Khumi Awa Chin */
   {"ckb",      HB_TAG('K','U','R',' ')},       /* Central Kurdish (Sorani) */
   {"ckt",      HB_TAG('C','H','K',' ')},       /* Chukchi */
   {"cld",      HB_TAG('S','Y','R',' ')},       /* Chaldean Neo-Aramaic */
+  {"cle",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"cmr",      HB_TAG('Q','I','N',' ')},       /* Mro-Khimi Chin */
   {"cnb",      HB_TAG('Q','I','N',' ')},       /* Chinbon Chin */
   {"cnh",      HB_TAG('Q','I','N',' ')},       /* Hakha Chin */
   {"cnk",      HB_TAG('Q','I','N',' ')},       /* Khumi Chin */
   {"cmr",      HB_TAG('Q','I','N',' ')},       /* Mro-Khimi Chin */
   {"cnb",      HB_TAG('Q','I','N',' ')},       /* Chinbon Chin */
   {"cnh",      HB_TAG('Q','I','N',' ')},       /* Hakha Chin */
   {"cnk",      HB_TAG('Q','I','N',' ')},       /* Khumi Chin */
+  {"cnl",      HB_TAG('C','C','H','N')},       /* Chinantec */
+  {"cnt",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"cnw",      HB_TAG('Q','I','N',' ')},       /* Ngawn Chin */
   {"cop",      HB_TAG('C','O','P',' ')},       /* Coptic */
   {"cnw",      HB_TAG('Q','I','N',' ')},       /* Ngawn Chin */
   {"cop",      HB_TAG('C','O','P',' ')},       /* Coptic */
+  {"cpa",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"cpp",      HB_TAG('C','P','P',' ')},       /* Creoles */
   {"cr",       HB_TAG('C','R','E',' ')},       /* Cree */
   {"cre",      HB_TAG('Y','C','R',' ')},       /* Y-Cree */
   {"cpp",      HB_TAG('C','P','P',' ')},       /* Creoles */
   {"cr",       HB_TAG('C','R','E',' ')},       /* Cree */
   {"cre",      HB_TAG('Y','C','R',' ')},       /* Y-Cree */
@@ -302,15 +310,21 @@ static const LangTag ot_languages[] = {
   {"crm",      HB_TAG('M','C','R',' ')},       /* Moose Cree */
   {"crx",      HB_TAG('C','R','R',' ')},       /* Carrier */
   {"cs",       HB_TAG('C','S','Y',' ')},       /* Czech */
   {"crm",      HB_TAG('M','C','R',' ')},       /* Moose Cree */
   {"crx",      HB_TAG('C','R','R',' ')},       /* Carrier */
   {"cs",       HB_TAG('C','S','Y',' ')},       /* Czech */
+  {"csa",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"csb",      HB_TAG('C','S','B',' ')},       /* Kashubian */
   {"csh",      HB_TAG('Q','I','N',' ')},       /* Asho Chin */
   {"csb",      HB_TAG('C','S','B',' ')},       /* Kashubian */
   {"csh",      HB_TAG('Q','I','N',' ')},       /* Asho Chin */
+  {"cso",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"csy",      HB_TAG('Q','I','N',' ')},       /* Siyin Chin */
   {"ctd",      HB_TAG('Q','I','N',' ')},       /* Tedim Chin */
   {"csy",      HB_TAG('Q','I','N',' ')},       /* Siyin Chin */
   {"ctd",      HB_TAG('Q','I','N',' ')},       /* Tedim Chin */
+  {"cte",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"ctg",      HB_TAG('C','T','G',' ')},       /* Chittagonian */
   {"ctg",      HB_TAG('C','T','G',' ')},       /* Chittagonian */
+  {"ctl",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"cts",      HB_TAG('B','I','K',' ')},       /* Northern Catanduanes Bikol */
   {"cu",       HB_TAG('C','S','L',' ')},       /* Church Slavic */
   {"cts",      HB_TAG('B','I','K',' ')},       /* Northern Catanduanes Bikol */
   {"cu",       HB_TAG('C','S','L',' ')},       /* Church Slavic */
+  {"cuc",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"cuk",      HB_TAG('C','U','K',' ')},       /* San Blas Kuna */
   {"cv",       HB_TAG('C','H','U',' ')},       /* Chuvash */
   {"cuk",      HB_TAG('C','U','K',' ')},       /* San Blas Kuna */
   {"cv",       HB_TAG('C','H','U',' ')},       /* Chuvash */
+  {"cvn",      HB_TAG('C','C','H','N')},       /* Chinantec */
   {"cwd",      HB_TAG('D','C','R',' ')},       /* Woods Cree */
   {"cy",       HB_TAG('W','E','L',' ')},       /* Welsh */
   {"czt",      HB_TAG('Q','I','N',' ')},       /* Zotung Chin */
   {"cwd",      HB_TAG('D','C','R',' ')},       /* Woods Cree */
   {"cy",       HB_TAG('W','E','L',' ')},       /* Welsh */
   {"czt",      HB_TAG('Q','I','N',' ')},       /* Zotung Chin */
@@ -380,7 +394,6 @@ static const LangTag ot_languages[] = {
   {"gkp",      HB_TAG('G','K','P',' ')},       /* Kpelle (Guinea) */
   {"gl",       HB_TAG('G','A','L',' ')},       /* Galician */
   {"gld",      HB_TAG('N','A','N',' ')},       /* Nanai */
   {"gkp",      HB_TAG('G','K','P',' ')},       /* Kpelle (Guinea) */
   {"gl",       HB_TAG('G','A','L',' ')},       /* Galician */
   {"gld",      HB_TAG('N','A','N',' ')},       /* Nanai */
-  {"gle",      HB_TAG('I','R','T',' ')},       /* Irish Traditional */
   {"glk",      HB_TAG('G','L','K',' ')},       /* Gilaki */
   {"gn",       HB_TAG('G','U','A',' ')},       /* Guarani [macrolanguage] */
   {"gnn",      HB_TAG('G','N','N',' ')},       /* Gumatj */
   {"glk",      HB_TAG('G','L','K',' ')},       /* Gilaki */
   {"gn",       HB_TAG('G','U','A',' ')},       /* Guarani [macrolanguage] */
   {"gnn",      HB_TAG('G','N','N',' ')},       /* Gumatj */
@@ -538,7 +551,6 @@ static const LangTag ot_languages[] = {
   {"mag",      HB_TAG('M','A','G',' ')},       /* Magahi */
   {"mai",      HB_TAG('M','T','H',' ')},       /* Maithili */
   {"mak",      HB_TAG('M','K','R',' ')},       /* Makasar */
   {"mag",      HB_TAG('M','A','G',' ')},       /* Magahi */
   {"mai",      HB_TAG('M','T','H',' ')},       /* Maithili */
   {"mak",      HB_TAG('M','K','R',' ')},       /* Makasar */
-  {"mal",      HB_TAG('M','A','L',' ')},       /* Malayalam */
   {"mam",      HB_TAG('M','A','M',' ')},       /* Mam */
   {"man",      HB_TAG('M','N','K',' ')},       /* Manding/Mandingo [macrolanguage] */
   {"mdc",      HB_TAG('M','L','E',' ')},       /* Male (Papua New Guinea) */
   {"mam",      HB_TAG('M','A','M',' ')},       /* Mam */
   {"man",      HB_TAG('M','N','K',' ')},       /* Manding/Mandingo [macrolanguage] */
   {"mdc",      HB_TAG('M','L','E',' ')},       /* Male (Papua New Guinea) */
@@ -867,9 +879,11 @@ static const LangTagLong ot_languages_zh[] = {
 };
 
 static int
 };
 
 static int
-lang_compare_first_component (const char *a,
-                             const char *b)
+lang_compare_first_component (const void *pa,
+                             const void *pb)
 {
 {
+  const char *a = (const char *) pa;
+  const char *b = (const char *) pb;
   unsigned int da, db;
   const char *p;
 
   unsigned int da, db;
   const char *p;
 
@@ -906,12 +920,12 @@ hb_ot_tag_from_language (hb_language_t language)
     char tag[4];
     int i;
     s += 6;
     char tag[4];
     int i;
     s += 6;
-    for (i = 0; i < 4 && ISALPHA (s[i]); i++)
+    for (i = 0; i < 4 && ISALNUM (s[i]); i++)
       tag[i] = TOUPPER (s[i]);
     if (i) {
       for (; i < 4; i++)
        tag[i] = ' ';
       tag[i] = TOUPPER (s[i]);
     if (i) {
       for (; i < 4; i++)
        tag[i] = ' ';
-      return HB_TAG_CHAR4 (tag);
+      return HB_TAG (tag[0], tag[1], tag[2], tag[3]);
     }
   }
 
     }
   }
 
@@ -960,7 +974,7 @@ hb_ot_tag_from_language (hb_language_t language)
     const LangTag *lang_tag;
     lang_tag = (LangTag *) bsearch (lang_str, ot_languages,
                                    ARRAY_LENGTH (ot_languages), sizeof (LangTag),
     const LangTag *lang_tag;
     lang_tag = (LangTag *) bsearch (lang_str, ot_languages,
                                    ARRAY_LENGTH (ot_languages), sizeof (LangTag),
-                                   (hb_compare_func_t) lang_compare_first_component);
+                                   lang_compare_first_component);
     if (lang_tag)
       return lang_tag->tag;
   }
     if (lang_tag)
       return lang_tag->tag;
   }
@@ -1008,7 +1022,7 @@ hb_ot_tag_to_language (hb_tag_t tag)
   unsigned int i;
 
   if (tag == HB_OT_TAG_DEFAULT_LANGUAGE)
   unsigned int i;
 
   if (tag == HB_OT_TAG_DEFAULT_LANGUAGE)
-    return NULL;
+    return nullptr;
 
   /* struct LangTag has only room for 3-letter language tags. */
   switch (tag) {
 
   /* struct LangTag has only room for 3-letter language tags. */
   switch (tag) {
index ace0f5f..e305a67 100644 (file)
@@ -57,8 +57,13 @@ struct SegmentMaps : ArrayOf<AxisValueMap>
      * that at least -1, 0, and +1 must be mapped. But we include these as
      * part of a better error recovery scheme. */
 
      * that at least -1, 0, and +1 must be mapped. But we include these as
      * part of a better error recovery scheme. */
 
-    if (!len)
-      return value;
+    if (len < 2)
+    {
+      if (!len)
+       return value;
+      else /* len == 1*/
+       return value - array[0].fromCoord + array[0].toCoord;
+    }
 
     if (value <= array[0].fromCoord)
       return value - array[0].fromCoord + array[0].toCoord;
 
     if (value <= array[0].fromCoord)
       return value - array[0].fromCoord + array[0].toCoord;
@@ -76,8 +81,8 @@ struct SegmentMaps : ArrayOf<AxisValueMap>
 
     int denom = array[i].fromCoord - array[i-1].fromCoord;
     return array[i-1].toCoord +
 
     int denom = array[i].fromCoord - array[i-1].fromCoord;
     return array[i-1].toCoord +
-          (array[i].toCoord - array[i-1].toCoord) *
-          (value - array[i-1].fromCoord + denom/2) / denom;
+          ((array[i].toCoord - array[i-1].toCoord) *
+           (value - array[i-1].fromCoord) + denom/2) / denom;
   }
 
   DEFINE_SIZE_ARRAY (2, array);
   }
 
   DEFINE_SIZE_ARRAY (2, array);
@@ -128,8 +133,8 @@ struct avar
   protected:
   FixedVersion<>version;       /* Version of the avar table
                                 * initially set to 0x00010000u */
   protected:
   FixedVersion<>version;       /* Version of the avar table
                                 * initially set to 0x00010000u */
-  USHORT       reserved;       /* This field is permanently reserved. Set to 0. */
-  USHORT       axisCount;      /* The number of variation axes in the font. This
+  HBUINT16     reserved;       /* This field is permanently reserved. Set to 0. */
+  HBUINT16     axisCount;      /* The number of variation axes in the font. This
                                 * must be the same number as axisCount in the
                                 * 'fvar' table. */
   SegmentMaps  axisSegmentMapsZ;
                                 * must be the same number as axisCount in the
                                 * 'fvar' table. */
   SegmentMaps  axisSegmentMapsZ;
index 9f6fb32..999b723 100644 (file)
@@ -42,11 +42,11 @@ struct InstanceRecord
   }
 
   protected:
   }
 
   protected:
-  USHORT       subfamilyNameID;/* The name ID for entries in the 'name' table
+  HBUINT16     subfamilyNameID;/* The name ID for entries in the 'name' table
                                 * that provide subfamily names for this instance. */
                                 * that provide subfamily names for this instance. */
-  USHORT       reserved;       /* Reserved for future use — set to 0. */
+  HBUINT16     reserved;       /* Reserved for future use — set to 0. */
   Fixed                coordinates[VAR];/* The coordinates array for this instance. */
   Fixed                coordinates[VAR];/* The coordinates array for this instance. */
-  //USHORT     postScriptNameIDX;/*Optional. The name ID for entries in the 'name'
+  //HBUINT16   postScriptNameIDX;/*Optional. The name ID for entries in the 'name'
   //                             * table that provide PostScript names for this
   //                             * instance. */
 
   //                             * table that provide PostScript names for this
   //                             * instance. */
 
@@ -67,8 +67,8 @@ struct AxisRecord
   Fixed                minValue;       /* The minimum coordinate value for the axis. */
   Fixed                defaultValue;   /* The default coordinate value for the axis. */
   Fixed                maxValue;       /* The maximum coordinate value for the axis. */
   Fixed                minValue;       /* The minimum coordinate value for the axis. */
   Fixed                defaultValue;   /* The default coordinate value for the axis. */
   Fixed                maxValue;       /* The maximum coordinate value for the axis. */
-  USHORT       reserved;       /* Reserved for future use — set to 0. */
-  USHORT       axisNameID;     /* The name ID for entries in the 'name' table that
+  HBUINT16     reserved;       /* Reserved for future use — set to 0. */
+  HBUINT16     axisNameID;     /* The name ID for entries in the 'name' table that
                                 * provide a display name for this axis. */
 
   public:
                                 * provide a display name for this axis. */
 
   public:
@@ -186,16 +186,16 @@ struct fvar
   protected:
   FixedVersion<>version;       /* Version of the fvar table
                                 * initially set to 0x00010000u */
   protected:
   FixedVersion<>version;       /* Version of the fvar table
                                 * initially set to 0x00010000u */
-  Offset<>     things;         /* Offset in bytes from the beginning of the table
+  Offset16     things;         /* Offset in bytes from the beginning of the table
                                 * to the start of the AxisRecord array. */
                                 * to the start of the AxisRecord array. */
-  USHORT       reserved;       /* This field is permanently reserved. Set to 2. */
-  USHORT       axisCount;      /* The number of variation axes in the font (the
+  HBUINT16     reserved;       /* This field is permanently reserved. Set to 2. */
+  HBUINT16     axisCount;      /* The number of variation axes in the font (the
                                 * number of records in the axes array). */
                                 * number of records in the axes array). */
-  USHORT       axisSize;       /* The size in bytes of each VariationAxisRecord —
+  HBUINT16     axisSize;       /* The size in bytes of each VariationAxisRecord —
                                 * set to 20 (0x0014) for this version. */
                                 * set to 20 (0x0014) for this version. */
-  USHORT       instanceCount;  /* The number of named instances defined in the font
+  HBUINT16     instanceCount;  /* The number of named instances defined in the font
                                 * (the number of records in the instances array). */
                                 * (the number of records in the instances array). */
-  USHORT       instanceSize;   /* The size in bytes of each InstanceRecord — set
+  HBUINT16     instanceSize;   /* The size in bytes of each InstanceRecord — set
                                 * to either axisCount * sizeof(Fixed) + 4, or to
                                 * axisCount * sizeof(Fixed) + 6. */
 
                                 * to either axisCount * sizeof(Fixed) + 4, or to
                                 * axisCount * sizeof(Fixed) + 6. */
 
index f9d801e..e20131b 100644 (file)
@@ -55,7 +55,7 @@ struct DeltaSetIndexMap
     unsigned int u = 0;
     { /* Fetch it. */
       unsigned int w = get_width ();
     unsigned int u = 0;
     { /* Fetch it. */
       unsigned int w = get_width ();
-      const BYTE *p = mapData + w * v;
+      const HBUINT8 *p = mapData + w * v;
       for (; w; w--)
        u = (u << 8) + *p++;
     }
       for (; w; w--)
        u = (u << 8) + *p++;
     }
@@ -78,10 +78,10 @@ struct DeltaSetIndexMap
   { return (format & 0xF) + 1; }
 
   protected:
   { return (format & 0xF) + 1; }
 
   protected:
-  USHORT       format;         /* A packed field that describes the compressed
+  HBUINT16     format;         /* A packed field that describes the compressed
                                 * representation of delta-set indices. */
                                 * representation of delta-set indices. */
-  USHORT       mapCount;       /* The number of mapping entries. */
-  BYTE         mapData[VAR];   /* The delta-set index mapping data. */
+  HBUINT16     mapCount;       /* The number of mapping entries. */
+  HBUINT8              mapData[VAR];   /* The delta-set index mapping data. */
 
   public:
   DEFINE_SIZE_ARRAY (4, mapData);
 
   public:
   DEFINE_SIZE_ARRAY (4, mapData);
index 3cb7498..e835768 100644 (file)
@@ -43,7 +43,7 @@ struct VariationValueRecord
 
   public:
   Tag          valueTag;       /* Four-byte tag identifying a font-wide measure. */
 
   public:
   Tag          valueTag;       /* Four-byte tag identifying a font-wide measure. */
-  ULONG                varIdx;         /* Outer/inner index into VariationStore item. */
+  HBUINT32             varIdx;         /* Outer/inner index into VariationStore item. */
 
   public:
   DEFINE_SIZE_STATIC (8);
 
   public:
   DEFINE_SIZE_STATIC (8);
@@ -77,7 +77,7 @@ struct MVAR
     const VariationValueRecord *record;
     record = (VariationValueRecord *) bsearch (&tag, values,
                                               valueRecordCount, valueRecordSize,
     const VariationValueRecord *record;
     record = (VariationValueRecord *) bsearch (&tag, values,
                                               valueRecordCount, valueRecordSize,
-                                              (hb_compare_func_t) tag_compare);
+                                              tag_compare);
     if (!record)
       return 0.;
 
     if (!record)
       return 0.;
 
@@ -85,19 +85,23 @@ struct MVAR
   }
 
 protected:
   }
 
 protected:
-  static inline int tag_compare (const hb_tag_t *a, const Tag *b)
-  { return b->cmp (*a); }
+  static inline int tag_compare (const void *pa, const void *pb)
+  {
+    const hb_tag_t *a = (const hb_tag_t *) pa;
+    const Tag *b = (const Tag *) pb;
+    return b->cmp (*a);
+  }
 
   protected:
   FixedVersion<>version;       /* Version of the metrics variation table
                                 * initially set to 0x00010000u */
 
   protected:
   FixedVersion<>version;       /* Version of the metrics variation table
                                 * initially set to 0x00010000u */
-  USHORT       reserved;       /* Not used; set to 0. */
-  USHORT       valueRecordSize;/* The size in bytes of each value record —
+  HBUINT16     reserved;       /* Not used; set to 0. */
+  HBUINT16     valueRecordSize;/* The size in bytes of each value record —
                                 * must be greater than zero. */
                                 * must be greater than zero. */
-  USHORT       valueRecordCount;/* The number of value records — may be zero. */
+  HBUINT16     valueRecordCount;/* The number of value records — may be zero. */
   OffsetTo<VariationStore>
                varStore;       /* Offset to item variation store table. */
   OffsetTo<VariationStore>
                varStore;       /* Offset to item variation store table. */
-  BYTE         values[VAR];    /* Array of value records. The records must be
+  HBUINT8              values[VAR];    /* Array of value records. The records must be
                                 * in binary order of their valueTag field. */
 
   public:
                                 * in binary order of their valueTag field. */
 
   public:
index 691196d..90ba0bd 100644 (file)
@@ -130,7 +130,7 @@ hb_ot_var_normalize_variations (hb_face_t            *face,
   for (unsigned int i = 0; i < variations_length; i++)
   {
     unsigned int axis_index;
   for (unsigned int i = 0; i < variations_length; i++)
   {
     unsigned int axis_index;
-    if (hb_ot_var_find_axis (face, variations[i].tag, &axis_index, NULL) &&
+    if (hb_ot_var_find_axis (face, variations[i].tag, &axis_index, nullptr) &&
        axis_index < coords_length)
       coords[axis_index] = fvar.normalize_axis_value (axis_index, variations[i].value);
   }
        axis_index < coords_length)
       coords[axis_index] = fvar.normalize_axis_value (axis_index, variations[i].value);
   }
index 666af62..daa496e 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef HB_PRIVATE_HH
 #define HB_PRIVATE_HH
 
 #ifndef HB_PRIVATE_HH
 #define HB_PRIVATE_HH
 
+#define _GNU_SOURCE 1
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 #define HB_OT_H_IN
 #endif
 
 #define HB_OT_H_IN
 #endif
 
+#include <math.h>
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
 #include <assert.h>
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
 #include <assert.h>
-
-/* We only use these two for debug output.  However, the debug code is
- * always seen by the compiler (and optimized out in non-debug builds.
- * If including these becomes a problem, we can start thinking about
- * someway around that. */
-#include <stdio.h>
 #include <errno.h>
 #include <errno.h>
+#include <stdio.h>
 #include <stdarg.h>
 
 #include <stdarg.h>
 
+#if defined(_MSC_VER) || defined(__MINGW32__)
+#include <intrin.h>
+#endif
+
+#define HB_PASTE1(a,b) a##b
+#define HB_PASTE(a,b) HB_PASTE1(a,b)
 
 /* Compile-time custom allocator support. */
 
 
 /* Compile-time custom allocator support. */
 
@@ -74,10 +78,23 @@ extern "C" void  hb_free_impl(void *ptr);
 /* Compiler attributes */
 
 
 /* Compiler attributes */
 
 
-#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
-#define _HB_BOOLEAN_EXPR(expr) ((expr) ? 1 : 0)
-#define likely(expr) (__builtin_expect (_HB_BOOLEAN_EXPR(expr), 1))
-#define unlikely(expr) (__builtin_expect (_HB_BOOLEAN_EXPR(expr), 0))
+#if __cplusplus < 201103L
+
+#ifndef nullptr
+#define nullptr NULL
+#endif
+
+// Static assertions
+#ifndef static_assert
+#define static_assert(e, msg) \
+       HB_UNUSED typedef int HB_PASTE(static_assertion_failed_at_line_, __LINE__) [(e) ? 1 : -1]
+#endif // static_assert
+
+#endif // __cplusplus < 201103L
+
+#if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
+#define likely(expr) (__builtin_expect (!!(expr), 1))
+#define unlikely(expr) (__builtin_expect (!!(expr), 0))
 #else
 #define likely(expr) (expr)
 #define unlikely(expr) (expr)
 #else
 #define likely(expr) (expr)
 #define unlikely(expr) (expr)
@@ -99,15 +116,18 @@ extern "C" void  hb_free_impl(void *ptr);
 #endif
 #if __GNUC__ >= 4
 #define HB_UNUSED      __attribute__((unused))
 #endif
 #if __GNUC__ >= 4
 #define HB_UNUSED      __attribute__((unused))
+#elif defined(_MSC_VER) /* https://github.com/harfbuzz/harfbuzz/issues/635 */
+#define HB_UNUSED __pragma(warning(suppress: 4100 4101))
 #else
 #define HB_UNUSED
 #endif
 
 #ifndef HB_INTERNAL
 #else
 #define HB_UNUSED
 #endif
 
 #ifndef HB_INTERNAL
-# if !defined(__MINGW32__) && !defined(__CYGWIN__)
+# if !defined(HB_NO_VISIBILITY) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(_MSC_VER) && !defined(__SUNPRO_CC)
 #  define HB_INTERNAL __attribute__((__visibility__("hidden")))
 # else
 #  define HB_INTERNAL
 #  define HB_INTERNAL __attribute__((__visibility__("hidden")))
 # else
 #  define HB_INTERNAL
+#  define HB_NO_VISIBILITY 1
 # endif
 #endif
 
 # endif
 #endif
 
@@ -119,6 +139,11 @@ extern "C" void  hb_free_impl(void *ptr);
 #define HB_FUNC __func__
 #endif
 
 #define HB_FUNC __func__
 #endif
 
+#ifdef __SUNPRO_CC
+/* https://github.com/harfbuzz/harfbuzz/issues/630 */
+#define __restrict
+#endif
+
 /*
  * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
  * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
 /*
  * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
  * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
@@ -138,6 +163,9 @@ extern "C" void  hb_free_impl(void *ptr);
 #if defined(__clang__) && __cplusplus >= 201103L
    /* clang's fallthrough annotations are only available starting in C++11. */
 #  define HB_FALLTHROUGH [[clang::fallthrough]]
 #if defined(__clang__) && __cplusplus >= 201103L
    /* clang's fallthrough annotations are only available starting in C++11. */
 #  define HB_FALLTHROUGH [[clang::fallthrough]]
+#elif __GNUC__ >= 7
+   /* GNU fallthrough attribute is available from GCC7 */
+#  define HB_FALLTHROUGH __attribute__((fallthrough))
 #elif defined(_MSC_VER)
    /*
     * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
 #elif defined(_MSC_VER)
    /*
     * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
@@ -168,21 +196,17 @@ extern "C" void  hb_free_impl(void *ptr);
 
 #  if defined(_WIN32_WCE)
      /* Some things not defined on Windows CE. */
 
 #  if defined(_WIN32_WCE)
      /* Some things not defined on Windows CE. */
-#    define strdup _strdup
 #    define vsnprintf _vsnprintf
 #    define vsnprintf _vsnprintf
-#    define getenv(Name) NULL
+#    define getenv(Name) nullptr
 #    if _WIN32_WCE < 0x800
 #      define setlocale(Category, Locale) "C"
 static int errno = 0; /* Use something better? */
 #    endif
 #  elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
 #    if _WIN32_WCE < 0x800
 #      define setlocale(Category, Locale) "C"
 static int errno = 0; /* Use something better? */
 #    endif
 #  elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
-#    define getenv(Name) NULL
+#    define getenv(Name) nullptr
 #  endif
 #  if defined(_MSC_VER) && _MSC_VER < 1900
 #    define snprintf _snprintf
 #  endif
 #  if defined(_MSC_VER) && _MSC_VER < 1900
 #    define snprintf _snprintf
-#  elif defined(_MSC_VER) && _MSC_VER >= 1900
-#    /* Covers VC++ Error for strdup being a deprecated POSIX name and to instead use _strdup instead */
-#    define strdup _strdup
 #  endif
 #endif
 
 #  endif
 #endif
 
@@ -209,16 +233,17 @@ static int errno = 0; /* Use something better? */
  * https://developer.android.com/tools/sdk/ndk/index.html
  */
 #    define HB_USE_ATEXIT 1
  * https://developer.android.com/tools/sdk/ndk/index.html
  */
 #    define HB_USE_ATEXIT 1
+#  elif defined(__APPLE__)
+/* For macOS and related platforms, the atexit man page indicates
+ * that it will be invoked when the library is unloaded, not only
+ * at application exit.
+ */
+#    define HB_USE_ATEXIT 1
 #  endif
 #endif
 
 /* Basics */
 
 #  endif
 #endif
 
 /* Basics */
 
-
-#ifndef NULL
-# define NULL ((void *) 0)
-#endif
-
 #undef MIN
 template <typename Type>
 static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; }
 #undef MIN
 template <typename Type>
 static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; }
@@ -240,32 +265,26 @@ static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
 #define HB_STMT_START do
 #define HB_STMT_END   while (0)
 
 #define HB_STMT_START do
 #define HB_STMT_END   while (0)
 
-#define _ASSERT_STATIC1(_line, _cond)  HB_UNUSED typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1]
-#define _ASSERT_STATIC0(_line, _cond)  _ASSERT_STATIC1 (_line, (_cond))
-#define ASSERT_STATIC(_cond)           _ASSERT_STATIC0 (__LINE__, (_cond))
-
-template <unsigned int cond> class hb_assert_constant_t {};
+template <unsigned int cond> class hb_assert_constant_t;
+template <> class hb_assert_constant_t<1> {};
 
 #define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
 
 
 #define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
 
-#define _PASTE1(a,b) a##b
-#define PASTE(a,b) _PASTE1(a,b)
-
 /* Lets assert int types.  Saves trouble down the road. */
 
 /* Lets assert int types.  Saves trouble down the road. */
 
-ASSERT_STATIC (sizeof (int8_t) == 1);
-ASSERT_STATIC (sizeof (uint8_t) == 1);
-ASSERT_STATIC (sizeof (int16_t) == 2);
-ASSERT_STATIC (sizeof (uint16_t) == 2);
-ASSERT_STATIC (sizeof (int32_t) == 4);
-ASSERT_STATIC (sizeof (uint32_t) == 4);
-ASSERT_STATIC (sizeof (int64_t) == 8);
-ASSERT_STATIC (sizeof (uint64_t) == 8);
+static_assert ((sizeof (int8_t) == 1), "");
+static_assert ((sizeof (uint8_t) == 1), "");
+static_assert ((sizeof (int16_t) == 2), "");
+static_assert ((sizeof (uint16_t) == 2), "");
+static_assert ((sizeof (int32_t) == 4), "");
+static_assert ((sizeof (uint32_t) == 4), "");
+static_assert ((sizeof (int64_t) == 8), "");
+static_assert ((sizeof (uint64_t) == 8), "");
 
 
-ASSERT_STATIC (sizeof (hb_codepoint_t) == 4);
-ASSERT_STATIC (sizeof (hb_position_t) == 4);
-ASSERT_STATIC (sizeof (hb_mask_t) == 4);
-ASSERT_STATIC (sizeof (hb_var_int_t) == 4);
+static_assert ((sizeof (hb_codepoint_t) == 4), "");
+static_assert ((sizeof (hb_position_t) == 4), "");
+static_assert ((sizeof (hb_mask_t) == 4), "");
+static_assert ((sizeof (hb_var_int_t) == 4), "");
 
 
 /* We like our types POD */
 
 
 /* We like our types POD */
@@ -297,57 +316,195 @@ ASSERT_STATIC (sizeof (hb_var_int_t) == 4);
 
 /* Misc */
 
 
 /* Misc */
 
-/* Void! */
-struct _hb_void_t {};
-typedef const _hb_void_t *hb_void_t;
-#define HB_VOID ((const _hb_void_t *) NULL)
+/*
+ * Void!
+ */
+typedef const struct _hb_void_t *hb_void_t;
+#define HB_VOID ((const _hb_void_t *) nullptr)
 
 
-/* Return the number of 1 bits in mask. */
+/* Return the number of 1 bits in v. */
+template <typename T>
 static inline HB_CONST_FUNC unsigned int
 static inline HB_CONST_FUNC unsigned int
-_hb_popcount32 (uint32_t mask)
+_hb_popcount (T v)
 {
 {
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  return __builtin_popcount (mask);
-#else
-  /* "HACKMEM 169" */
-  uint32_t y;
-  y = (mask >> 1) &033333333333;
-  y = mask - y - ((y >>1) & 033333333333);
-  return (((y + (y >> 3)) & 030707070707) % 077);
+#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && defined(__OPTIMIZE__)
+  if (sizeof (T) <= sizeof (unsigned int))
+    return __builtin_popcount (v);
+
+  if (sizeof (T) <= sizeof (unsigned long))
+    return __builtin_popcountl (v);
+
+  if (sizeof (T) <= sizeof (unsigned long long))
+    return __builtin_popcountll (v);
 #endif
 #endif
+
+  if (sizeof (T) <= 4)
+  {
+    /* "HACKMEM 169" */
+    uint32_t y;
+    y = (v >> 1) &033333333333;
+    y = v - y - ((y >>1) & 033333333333);
+    return (((y + (y >> 3)) & 030707070707) % 077);
+  }
+
+  if (sizeof (T) == 8)
+  {
+    unsigned int shift = 32;
+    return _hb_popcount<uint32_t> ((uint32_t) v) + _hb_popcount ((uint32_t) (v >> shift));
+  }
+
+  if (sizeof (T) == 16)
+  {
+    unsigned int shift = 64;
+    return _hb_popcount<uint64_t> ((uint64_t) v) + _hb_popcount ((uint64_t) (v >> shift));
+  }
+
+  assert (0);
 }
 
 /* Returns the number of bits needed to store number */
 }
 
 /* Returns the number of bits needed to store number */
+template <typename T>
 static inline HB_CONST_FUNC unsigned int
 static inline HB_CONST_FUNC unsigned int
-_hb_bit_storage (unsigned int number)
+_hb_bit_storage (T v)
 {
 {
+  if (unlikely (!v)) return 0;
+
 #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
 #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
-  return likely (number) ? (sizeof (unsigned int) * 8 - __builtin_clz (number)) : 0;
-#else
-  unsigned int n_bits = 0;
-  while (number) {
-    n_bits++;
-    number >>= 1;
+  if (sizeof (T) <= sizeof (unsigned int))
+    return sizeof (unsigned int) * 8 - __builtin_clz (v);
+
+  if (sizeof (T) <= sizeof (unsigned long))
+    return sizeof (unsigned long) * 8 - __builtin_clzl (v);
+
+  if (sizeof (T) <= sizeof (unsigned long long))
+    return sizeof (unsigned long long) * 8 - __builtin_clzll (v);
+#endif
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+  if (sizeof (T) <= sizeof (unsigned int))
+  {
+    unsigned long where;
+    _BitScanReverse (&where, v);
+    return 1 + where;
+  }
+# if _WIN64
+  if (sizeof (T) <= 8)
+  {
+    unsigned long where;
+    _BitScanReverse64 (&where, v);
+    return 1 + where;
   }
   }
-  return n_bits;
+# endif
 #endif
 #endif
+
+  if (sizeof (T) <= 4)
+  {
+    /* "bithacks" */
+    const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
+    const unsigned int S[] = {1, 2, 4, 8, 16};
+    unsigned int r = 0;
+    for (int i = 4; i >= 0; i--)
+      if (v & b[i])
+      {
+       v >>= S[i];
+       r |= S[i];
+      }
+    return r + 1;
+  }
+  if (sizeof (T) <= 8)
+  {
+    /* "bithacks" */
+    const uint64_t b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000, 0xFFFFFFFF00000000};
+    const unsigned int S[] = {1, 2, 4, 8, 16, 32};
+    unsigned int r = 0;
+    for (int i = 5; i >= 0; i--)
+      if (v & b[i])
+      {
+       v >>= S[i];
+       r |= S[i];
+      }
+    return r + 1;
+  }
+  if (sizeof (T) == 16)
+  {
+    unsigned int shift = 64;
+    return (v >> shift) ? _hb_bit_storage<uint64_t> ((uint64_t) v >> shift) + shift :
+                         _hb_bit_storage<uint64_t> ((uint64_t) v);
+  }
+
+  assert (0);
 }
 
 }
 
-/* Returns the number of zero bits in the least significant side of number */
+/* Returns the number of zero bits in the least significant side of v */
+template <typename T>
 static inline HB_CONST_FUNC unsigned int
 static inline HB_CONST_FUNC unsigned int
-_hb_ctz (unsigned int number)
+_hb_ctz (T v)
 {
 {
+  if (unlikely (!v)) return 0;
+
 #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
 #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
-  return likely (number) ? __builtin_ctz (number) : 0;
-#else
-  unsigned int n_bits = 0;
-  if (unlikely (!number)) return 0;
-  while (!(number & 1)) {
-    n_bits++;
-    number >>= 1;
+  if (sizeof (T) <= sizeof (unsigned int))
+    return __builtin_ctz (v);
+
+  if (sizeof (T) <= sizeof (unsigned long))
+    return __builtin_ctzl (v);
+
+  if (sizeof (T) <= sizeof (unsigned long long))
+    return __builtin_ctzll (v);
+#endif
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+  if (sizeof (T) <= sizeof (unsigned int))
+  {
+    unsigned long where;
+    _BitScanForward (&where, v);
+    return where;
   }
   }
-  return n_bits;
+# if _WIN64
+  if (sizeof (T) <= 8)
+  {
+    unsigned long where;
+    _BitScanForward64 (&where, v);
+    return where;
+  }
+# endif
 #endif
 #endif
+
+  if (sizeof (T) <= 4)
+  {
+    /* "bithacks" */
+    unsigned int c = 32;
+    v &= - (int32_t) v;
+    if (v) c--;
+    if (v & 0x0000FFFF) c -= 16;
+    if (v & 0x00FF00FF) c -= 8;
+    if (v & 0x0F0F0F0F) c -= 4;
+    if (v & 0x33333333) c -= 2;
+    if (v & 0x55555555) c -= 1;
+    return c;
+  }
+  if (sizeof (T) <= 8)
+  {
+    /* "bithacks" */
+    unsigned int c = 64;
+    v &= - (int64_t) (v);
+    if (v) c--;
+    if (v & 0x00000000FFFFFFFF) c -= 32;
+    if (v & 0x0000FFFF0000FFFF) c -= 16;
+    if (v & 0x00FF00FF00FF00FF) c -= 8;
+    if (v & 0x0F0F0F0F0F0F0F0F) c -= 4;
+    if (v & 0x3333333333333333) c -= 2;
+    if (v & 0x5555555555555555) c -= 1;
+    return c;
+  }
+  if (sizeof (T) == 16)
+  {
+    unsigned int shift = 64;
+    return (uint64_t) v ? _hb_bit_storage<uint64_t> ((uint64_t) v) :
+                         _hb_bit_storage<uint64_t> ((uint64_t) v >> shift) + shift;
+  }
+
+  assert (0);
 }
 
 static inline bool
 }
 
 static inline bool
@@ -356,17 +513,18 @@ _hb_unsigned_int_mul_overflows (unsigned int count, unsigned int size)
   return (size > 0) && (count >= ((unsigned int) -1) / size);
 }
 
   return (size > 0) && (count >= ((unsigned int) -1) / size);
 }
 
-
-/* Type of bsearch() / qsort() compare function */
-typedef int (*hb_compare_func_t) (const void *, const void *);
-
+static inline unsigned int
+_hb_ceil_to_4 (unsigned int v)
+{
+  return ((v - 1) | 3) + 1;
+}
 
 
 
 /* arrays and maps */
 
 
 
 
 
 /* arrays and maps */
 
 
-#define HB_PREALLOCED_ARRAY_INIT {0, 0, NULL}
+#define HB_PREALLOCED_ARRAY_INIT {0, 0, nullptr}
 template <typename Type, unsigned int StaticSize=16>
 struct hb_prealloced_array_t
 {
 template <typename Type, unsigned int StaticSize=16>
 struct hb_prealloced_array_t
 {
@@ -375,41 +533,65 @@ struct hb_prealloced_array_t
   Type *array;
   Type static_array[StaticSize];
 
   Type *array;
   Type static_array[StaticSize];
 
-  void init (void) { memset (this, 0, sizeof (*this)); }
+  void init (void)
+  {
+    len = 0;
+    allocated = ARRAY_LENGTH (static_array);
+    array = static_array;
+  }
 
   inline Type& operator [] (unsigned int i) { return array[i]; }
   inline const Type& operator [] (unsigned int i) const { return array[i]; }
 
   inline Type *push (void)
   {
 
   inline Type& operator [] (unsigned int i) { return array[i]; }
   inline const Type& operator [] (unsigned int i) const { return array[i]; }
 
   inline Type *push (void)
   {
-    if (!array) {
-      array = static_array;
-      allocated = ARRAY_LENGTH (static_array);
-    }
-    if (likely (len < allocated))
-      return &array[len++];
+    if (unlikely (!resize (len + 1)))
+      return nullptr;
 
 
-    /* Need to reallocate */
-    unsigned int new_allocated = allocated + (allocated >> 1) + 8;
-    Type *new_array = NULL;
+    return &array[len - 1];
+  }
+
+  /* Allocate for size but don't adjust len. */
+  inline bool alloc(unsigned int size)
+  {
+    if (likely (size <= allocated))
+      return true;
+
+    /* Reallocate */
+
+    unsigned int new_allocated = allocated;
+    while (size >= new_allocated)
+      new_allocated += (new_allocated >> 1) + 8;
+
+    Type *new_array = nullptr;
 
     if (array == static_array) {
       new_array = (Type *) calloc (new_allocated, sizeof (Type));
       if (new_array)
         memcpy (new_array, array, len * sizeof (Type));
 
     if (array == static_array) {
       new_array = (Type *) calloc (new_allocated, sizeof (Type));
       if (new_array)
         memcpy (new_array, array, len * sizeof (Type));
-    } else {
+          } else {
       bool overflows = (new_allocated < allocated) || _hb_unsigned_int_mul_overflows (new_allocated, sizeof (Type));
       if (likely (!overflows)) {
       bool overflows = (new_allocated < allocated) || _hb_unsigned_int_mul_overflows (new_allocated, sizeof (Type));
       if (likely (!overflows)) {
-       new_array = (Type *) realloc (array, new_allocated * sizeof (Type));
+        new_array = (Type *) realloc (array, new_allocated * sizeof (Type));
       }
     }
 
     if (unlikely (!new_array))
       }
     }
 
     if (unlikely (!new_array))
-      return NULL;
+      return false;
 
     array = new_array;
     allocated = new_allocated;
 
     array = new_array;
     allocated = new_allocated;
-    return &array[len++];
+
+    return true;
+  }
+
+  inline bool resize (unsigned int size)
+  {
+    if (!alloc (size))
+      return false;
+
+    len = size;
+    return true;
   }
 
   inline void pop (void)
   }
 
   inline void pop (void)
@@ -438,42 +620,81 @@ struct hb_prealloced_array_t
     for (unsigned int i = 0; i < len; i++)
       if (array[i] == v)
        return &array[i];
     for (unsigned int i = 0; i < len; i++)
       if (array[i] == v)
        return &array[i];
-    return NULL;
+    return nullptr;
   }
   template <typename T>
   inline const Type *find (T v) const {
     for (unsigned int i = 0; i < len; i++)
       if (array[i] == v)
        return &array[i];
   }
   template <typename T>
   inline const Type *find (T v) const {
     for (unsigned int i = 0; i < len; i++)
       if (array[i] == v)
        return &array[i];
-    return NULL;
+    return nullptr;
+  }
+
+  inline void qsort (int (*cmp)(const void*, const void*))
+  {
+    ::qsort (array, len, sizeof (Type), cmp);
   }
 
   inline void qsort (void)
   {
   }
 
   inline void qsort (void)
   {
-    ::qsort (array, len, sizeof (Type), (hb_compare_func_t) Type::cmp);
+    ::qsort (array, len, sizeof (Type), Type::cmp);
   }
 
   inline void qsort (unsigned int start, unsigned int end)
   {
   }
 
   inline void qsort (unsigned int start, unsigned int end)
   {
-    ::qsort (array + start, end - start, sizeof (Type), (hb_compare_func_t) Type::cmp);
+    ::qsort (array + start, end - start, sizeof (Type), Type::cmp);
+  }
+
+  template <typename T>
+  inline Type *lsearch (const T &x)
+  {
+    for (unsigned int i = 0; i < len; i++)
+      if (0 == this->array[i].cmp (&x))
+       return &array[i];
+    return nullptr;
   }
 
   template <typename T>
   }
 
   template <typename T>
-  inline Type *bsearch (T *key)
+  inline Type *bsearch (const T &x)
   {
   {
-    return (Type *) ::bsearch (key, array, len, sizeof (Type), (hb_compare_func_t) Type::cmp);
+    unsigned int i;
+    return bfind (x, &i) ? &array[i] : nullptr;
   }
   template <typename T>
   }
   template <typename T>
-  inline const Type *bsearch (T *key) const
+  inline const Type *bsearch (const T &x) const
   {
   {
-    return (const Type *) ::bsearch (key, array, len, sizeof (Type), (hb_compare_func_t) Type::cmp);
+    unsigned int i;
+    return bfind (x, &i) ? &array[i] : nullptr;
+  }
+  template <typename T>
+  inline bool bfind (const T &x, unsigned int *i) const
+  {
+    int min = 0, max = (int) this->len - 1;
+    while (min <= max)
+    {
+      int mid = (min + max) / 2;
+      int c = this->array[mid].cmp (&x);
+      if (c < 0)
+        max = mid - 1;
+      else if (c > 0)
+        min = mid + 1;
+      else
+      {
+        *i = mid;
+       return true;
+      }
+    }
+    if (max < 0 || (max < (int) this->len && this->array[max].cmp (&x) > 0))
+      max++;
+    *i = max;
+    return false;
   }
 
   inline void finish (void)
   {
     if (array != static_array)
       free (array);
   }
 
   inline void finish (void)
   {
     if (array != static_array)
       free (array);
-    array = NULL;
+    array = nullptr;
     allocated = len = 0;
   }
 };
     allocated = len = 0;
   }
 };
@@ -490,7 +711,7 @@ struct hb_auto_array_t : hb_prealloced_array_t <Type>
 template <typename item_t, typename lock_t>
 struct hb_lockable_set_t
 {
 template <typename item_t, typename lock_t>
 struct hb_lockable_set_t
 {
-  hb_prealloced_array_t <item_t, 2> items;
+  hb_prealloced_array_t <item_t, 1> items;
 
   inline void init (void) { items.init (); }
 
 
   inline void init (void) { items.init (); }
 
@@ -507,7 +728,7 @@ struct hb_lockable_set_t
        old.finish ();
       }
       else {
        old.finish ();
       }
       else {
-        item = NULL;
+        item = nullptr;
        l.unlock ();
       }
     } else {
        l.unlock ();
       }
     } else {
@@ -595,22 +816,6 @@ static inline unsigned char TOUPPER (unsigned char c)
 static inline unsigned char TOLOWER (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; }
 
-#define HB_TAG_CHAR4(s)   (HB_TAG(((const char *) s)[0], \
-                                 ((const char *) s)[1], \
-                                 ((const char *) s)[2], \
-                                 ((const char *) s)[3]))
-
-
-/* C++ helpers */
-
-/* Makes class uncopyable.  Use in private: section. */
-#define NO_COPY(T) \
-  T (const T &o); \
-  T &operator = (const T &o)
-
-
-/* Debug */
-
 
 /* HB_NDEBUG disables some sanity checks that are very safe to disable and
  * should be disabled in production systems.  If NDEBUG is defined, enable
 
 /* HB_NDEBUG disables some sanity checks that are very safe to disable and
  * should be disabled in production systems.  If NDEBUG is defined, enable
@@ -621,255 +826,6 @@ static inline unsigned char TOLOWER (unsigned char c)
 #define HB_NDEBUG
 #endif
 
 #define HB_NDEBUG
 #endif
 
-#ifndef HB_DEBUG
-#define HB_DEBUG 0
-#endif
-
-static inline bool
-_hb_debug (unsigned int level,
-          unsigned int max_level)
-{
-  return level < max_level;
-}
-
-#define DEBUG_LEVEL_ENABLED(WHAT, LEVEL) (_hb_debug ((LEVEL), HB_DEBUG_##WHAT))
-#define DEBUG_ENABLED(WHAT) (DEBUG_LEVEL_ENABLED (WHAT, 0))
-
-static inline void
-_hb_print_func (const char *func)
-{
-  if (func)
-  {
-    unsigned int func_len = strlen (func);
-    /* Skip "static" */
-    if (0 == strncmp (func, "static ", 7))
-      func += 7;
-    /* Skip "typename" */
-    if (0 == strncmp (func, "typename ", 9))
-      func += 9;
-    /* Skip return type */
-    const char *space = strchr (func, ' ');
-    if (space)
-      func = space + 1;
-    /* Skip parameter list */
-    const char *paren = strchr (func, '(');
-    if (paren)
-      func_len = paren - func;
-    fprintf (stderr, "%.*s", func_len, func);
-  }
-}
-
-template <int max_level> static inline void
-_hb_debug_msg_va (const char *what,
-                 const void *obj,
-                 const char *func,
-                 bool indented,
-                 unsigned int level,
-                 int level_dir,
-                 const char *message,
-                 va_list ap) HB_PRINTF_FUNC(7, 0);
-template <int max_level> static inline void
-_hb_debug_msg_va (const char *what,
-                 const void *obj,
-                 const char *func,
-                 bool indented,
-                 unsigned int level,
-                 int level_dir,
-                 const char *message,
-                 va_list ap)
-{
-  if (!_hb_debug (level, max_level))
-    return;
-
-  fprintf (stderr, "%-10s", what ? what : "");
-
-  if (obj)
-    fprintf (stderr, "(%0*lx) ", (unsigned int) (2 * sizeof (void *)), (unsigned long) obj);
-  else
-    fprintf (stderr, " %*s  ", (unsigned int) (2 * sizeof (void *)), "");
-
-  if (indented) {
-#define VBAR   "\342\224\202"  /* U+2502 BOX DRAWINGS LIGHT VERTICAL */
-#define VRBAR  "\342\224\234"  /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
-#define DLBAR  "\342\225\256"  /* U+256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT */
-#define ULBAR  "\342\225\257"  /* U+256F BOX DRAWINGS LIGHT ARC UP AND LEFT */
-#define LBAR   "\342\225\264"  /* U+2574 BOX DRAWINGS LIGHT LEFT */
-    static const char bars[] =
-      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
-      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
-      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
-      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
-      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR;
-    fprintf (stderr, "%2u %s" VRBAR "%s",
-            level,
-            bars + sizeof (bars) - 1 - MIN ((unsigned int) sizeof (bars) - 1, (unsigned int) (sizeof (VBAR) - 1) * level),
-            level_dir ? (level_dir > 0 ? DLBAR : ULBAR) : LBAR);
-  } else
-    fprintf (stderr, "   " VRBAR LBAR);
-
-  _hb_print_func (func);
-
-  if (message)
-  {
-    fprintf (stderr, ": ");
-    vfprintf (stderr, message, ap);
-  }
-
-  fprintf (stderr, "\n");
-}
-template <> inline void
-_hb_debug_msg_va<0> (const char *what HB_UNUSED,
-                    const void *obj HB_UNUSED,
-                    const char *func HB_UNUSED,
-                    bool indented HB_UNUSED,
-                    unsigned int level HB_UNUSED,
-                    int level_dir HB_UNUSED,
-                    const char *message HB_UNUSED,
-                    va_list ap HB_UNUSED) {}
-
-template <int max_level> static inline void
-_hb_debug_msg (const char *what,
-              const void *obj,
-              const char *func,
-              bool indented,
-              unsigned int level,
-              int level_dir,
-              const char *message,
-              ...) HB_PRINTF_FUNC(7, 8);
-template <int max_level> static inline void
-_hb_debug_msg (const char *what,
-              const void *obj,
-              const char *func,
-              bool indented,
-              unsigned int level,
-              int level_dir,
-              const char *message,
-              ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  _hb_debug_msg_va<max_level> (what, obj, func, indented, level, level_dir, message, ap);
-  va_end (ap);
-}
-template <> inline void
-_hb_debug_msg<0> (const char *what HB_UNUSED,
-                 const void *obj HB_UNUSED,
-                 const char *func HB_UNUSED,
-                 bool indented HB_UNUSED,
-                 unsigned int level HB_UNUSED,
-                 int level_dir HB_UNUSED,
-                 const char *message HB_UNUSED,
-                 ...) HB_PRINTF_FUNC(7, 8);
-template <> inline void
-_hb_debug_msg<0> (const char *what HB_UNUSED,
-                 const void *obj HB_UNUSED,
-                 const char *func HB_UNUSED,
-                 bool indented HB_UNUSED,
-                 unsigned int level HB_UNUSED,
-                 int level_dir HB_UNUSED,
-                 const char *message HB_UNUSED,
-                 ...) {}
-
-#define DEBUG_MSG_LEVEL(WHAT, OBJ, LEVEL, LEVEL_DIR, ...)      _hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), NULL,    true, (LEVEL), (LEVEL_DIR), __VA_ARGS__)
-#define DEBUG_MSG(WHAT, OBJ, ...)                              _hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), NULL,    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__)
-
-
-/*
- * Printer
- */
-
-template <typename T>
-struct hb_printer_t {
-  const char *print (const T&) { return "something"; }
-};
-
-template <>
-struct hb_printer_t<bool> {
-  const char *print (bool v) { return v ? "true" : "false"; }
-};
-
-template <>
-struct hb_printer_t<hb_void_t> {
-  const char *print (hb_void_t) { return ""; }
-};
-
-
-/*
- * Trace
- */
-
-template <typename T>
-static inline void _hb_warn_no_return (bool returned)
-{
-  if (unlikely (!returned)) {
-    fprintf (stderr, "OUCH, returned with no call to return_trace().  This is a bug, please report.\n");
-  }
-}
-template <>
-/*static*/ inline void _hb_warn_no_return<hb_void_t> (bool returned HB_UNUSED)
-{}
-
-template <int max_level, typename ret_t>
-struct hb_auto_trace_t {
-  explicit inline hb_auto_trace_t (unsigned int *plevel_,
-                                  const char *what_,
-                                  const void *obj_,
-                                  const char *func,
-                                  const char *message,
-                                  ...) : plevel (plevel_), what (what_), obj (obj_), returned (false)
-  {
-    if (plevel) ++*plevel;
-
-    va_list ap;
-    va_start (ap, message);
-    _hb_debug_msg_va<max_level> (what, obj, func, true, plevel ? *plevel : 0, +1, message, ap);
-    va_end (ap);
-  }
-  inline ~hb_auto_trace_t (void)
-  {
-    _hb_warn_no_return<ret_t> (returned);
-    if (!returned) {
-      _hb_debug_msg<max_level> (what, obj, NULL, true, plevel ? *plevel : 1, -1, " ");
-    }
-    if (plevel) --*plevel;
-  }
-
-  inline ret_t ret (ret_t v, unsigned int line = 0)
-  {
-    if (unlikely (returned)) {
-      fprintf (stderr, "OUCH, double calls to return_trace().  This is a bug, please report.\n");
-      return v;
-    }
-
-    _hb_debug_msg<max_level> (what, obj, NULL, true, plevel ? *plevel : 1, -1,
-                             "return %s (line %d)",
-                             hb_printer_t<ret_t>().print (v), line);
-    if (plevel) --*plevel;
-    plevel = NULL;
-    returned = true;
-    return v;
-  }
-
-  private:
-  unsigned int *plevel;
-  const char *what;
-  const void *obj;
-  bool returned;
-};
-template <typename ret_t> /* Optimize when tracing is disabled */
-struct hb_auto_trace_t<0, ret_t> {
-  explicit inline hb_auto_trace_t (unsigned int *plevel_ HB_UNUSED,
-                                  const char *what HB_UNUSED,
-                                  const void *obj HB_UNUSED,
-                                  const char *func HB_UNUSED,
-                                  const char *message HB_UNUSED,
-                                  ...) {}
-
-  inline ret_t ret (ret_t v, unsigned int line HB_UNUSED = 0) { return v; }
-};
-
-#define return_trace(RET) return trace.ret (RET, __LINE__)
 
 /* Misc */
 
 
 /* Misc */
 
@@ -887,7 +843,7 @@ hb_in_range (T u, T lo, T hi)
    * one right now.  Declaring a variable won't work as HB_UNUSED
    * is unusable on some platforms and unused types are less likely
    * to generate a warning than unused variables. */
    * one right now.  Declaring a variable won't work as HB_UNUSED
    * is unusable on some platforms and unused types are less likely
    * to generate a warning than unused variables. */
-  ASSERT_STATIC (sizeof (hb_assert_unsigned_t<T>) >= 0);
+  static_assert ((sizeof (hb_assert_unsigned_t<T>) >= 0), "");
 
   /* The casts below are important as if T is smaller than int,
    * the subtract results will become a signed int! */
 
   /* The casts below are important as if T is smaller than int,
    * the subtract results will become a signed int! */
@@ -912,7 +868,7 @@ hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3)
  * one enum to another...  So this doesn't provide the type-checking that I
  * originally had in mind... :(.
  *
  * one enum to another...  So this doesn't provide the type-checking that I
  * originally had in mind... :(.
  *
- * For MSVC warnings, see: https://github.com/behdad/harfbuzz/pull/163
+ * For MSVC warnings, see: https://github.com/harfbuzz/harfbuzz/pull/163
  */
 #ifdef _MSC_VER
 # pragma warning(disable:4200)
  */
 #ifdef _MSC_VER
 # pragma warning(disable:4200)
@@ -932,11 +888,10 @@ hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3)
 
 /* Useful for set-operations on small enums.
  * For example, for testing "x ∈ {x1, x2, x3}" use:
 
 /* Useful for set-operations on small enums.
  * For example, for testing "x ∈ {x1, x2, x3}" use:
- * (FLAG_SAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
+ * (FLAG_UNSAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
  */
  */
-#define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((x) < 32) + (1U << (x)))
-#define FLAG_SAFE(x) (1U << (x))
-#define FLAG_UNSAFE(x) ((x) < 32 ? FLAG_SAFE(x) : 0)
+#define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned int)(x) < 32) + (1U << (unsigned int)(x)))
+#define FLAG_UNSAFE(x) ((unsigned int)(x) < 32 ? (1U << (unsigned int)(x)) : 0)
 #define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(x))
 
 
 #define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(x))
 
 
@@ -968,7 +923,7 @@ hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *),
 template <typename T> static inline void
 hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *))
 {
 template <typename T> static inline void
 hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *))
 {
-  hb_stable_sort (array, len, compar, (int *) NULL);
+  hb_stable_sort (array, len, compar, (int *) nullptr);
 }
 
 static inline hb_bool_t
 }
 
 static inline hb_bool_t
@@ -990,6 +945,73 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o
 }
 
 
 }
 
 
+/* Vectorization */
+
+struct HbOpOr
+{
+  static const bool passthru_left = true;
+  static const bool passthru_right = true;
+  template <typename T> static void process (T &o, const T &a, const T &b) { o = a | b; }
+};
+struct HbOpAnd
+{
+  static const bool passthru_left = false;
+  static const bool passthru_right = false;
+  template <typename T> static void process (T &o, const T &a, const T &b) { o = a & b; }
+};
+struct HbOpMinus
+{
+  static const bool passthru_left = true;
+  static const bool passthru_right = false;
+  template <typename T> static void process (T &o, const T &a, const T &b) { o = a & ~b; }
+};
+struct HbOpXor
+{
+  static const bool passthru_left = true;
+  static const bool passthru_right = true;
+  template <typename T> static void process (T &o, const T &a, const T &b) { o = a ^ b; }
+};
+
+/* Type behaving similar to vectorized vars defined using __attribute__((vector_size(...))). */
+template <typename elt_t, unsigned int byte_size>
+struct hb_vector_size_t
+{
+  elt_t& operator [] (unsigned int i) { return v[i]; }
+  const elt_t& operator [] (unsigned int i) const { return v[i]; }
+
+  template <class Op>
+  inline hb_vector_size_t process (const hb_vector_size_t &o) const
+  {
+    hb_vector_size_t r;
+    for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
+      Op::process (r.v[i], v[i], o.v[i]);
+    return r;
+  }
+  inline hb_vector_size_t operator | (const hb_vector_size_t &o) const
+  { return process<HbOpOr> (o); }
+  inline hb_vector_size_t operator & (const hb_vector_size_t &o) const
+  { return process<HbOpAnd> (o); }
+  inline hb_vector_size_t operator ^ (const hb_vector_size_t &o) const
+  { return process<HbOpXor> (o); }
+  inline hb_vector_size_t operator ~ () const
+  {
+    hb_vector_size_t r;
+    for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
+      r.v[i] = ~v[i];
+    return r;
+  }
+
+  private:
+  static_assert (byte_size / sizeof (elt_t) * sizeof (elt_t) == byte_size, "");
+  elt_t v[byte_size / sizeof (elt_t)];
+};
+
+/* The `vector_size' attribute was introduced in gcc 3.1. */
+#if defined( __GNUC__ ) && ( __GNUC__ >= 4 )
+#define HAVE_VECTOR_SIZE 1
+#endif
+
+
 /* Global runtime options. */
 
 struct hb_options_t
 /* Global runtime options. */
 
 struct hb_options_t
@@ -1002,7 +1024,7 @@ union hb_options_union_t {
   unsigned int i;
   hb_options_t opts;
 };
   unsigned int i;
   hb_options_t opts;
 };
-ASSERT_STATIC (sizeof (int) == sizeof (hb_options_union_t));
+static_assert ((sizeof (int) == sizeof (hb_options_union_t)), "");
 
 HB_INTERNAL void
 _hb_options_init (void);
 
 HB_INTERNAL void
 _hb_options_init (void);
@@ -1021,4 +1043,31 @@ hb_options (void)
 /* Size signifying variable-sized array */
 #define VAR 1
 
 /* Size signifying variable-sized array */
 #define VAR 1
 
+
+/* String type. */
+
+struct hb_string_t
+{
+  inline hb_string_t (void) : bytes (nullptr), len (0) {}
+  inline hb_string_t (const char *bytes_, unsigned int len_) : bytes (bytes_), len (len_) {}
+
+  inline int cmp (const hb_string_t &a) const
+  {
+    if (len != a.len)
+      return (int) a.len - (int) len;
+
+    return memcmp (a.bytes, bytes, len);
+  }
+  static inline int cmp (const void *pa, const void *pb)
+  {
+    hb_string_t *a = (hb_string_t *) pa;
+    hb_string_t *b = (hb_string_t *) pb;
+    return b->cmp (*a);
+  }
+
+  const char *bytes;
+  unsigned int len;
+};
+
+
 #endif /* HB_PRIVATE_HH */
 #endif /* HB_PRIVATE_HH */
diff --git a/src/hb-set-digest-private.hh b/src/hb-set-digest-private.hh
new file mode 100644 (file)
index 0000000..e099a82
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Copyright © 2012  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_SET_DIGEST_PRIVATE_HH
+#define HB_SET_DIGEST_PRIVATE_HH
+
+#include "hb-private.hh"
+
+/*
+ * The set digests here implement various "filters" that support
+ * "approximate member query".  Conceptually these are like Bloom
+ * Filter and Quotient Filter, however, much smaller, faster, and
+ * designed to fit the requirements of our uses for glyph coverage
+ * queries.
+ *
+ * Our filters are highly accurate if the lookup covers fairly local
+ * set of glyphs, but fully flooded and ineffective if coverage is
+ * all over the place.
+ *
+ * The frozen-set can be used instead of a digest, to trade more
+ * memory for 100% accuracy, but in practice, that doesn't look like
+ * an attractive trade-off.
+ */
+
+template <typename mask_t, unsigned int shift>
+struct hb_set_digest_lowest_bits_t
+{
+  ASSERT_POD ();
+
+  static const unsigned int mask_bytes = sizeof (mask_t);
+  static const unsigned int mask_bits = sizeof (mask_t) * 8;
+  static const unsigned int num_bits = 0
+                                    + (mask_bytes >= 1 ? 3 : 0)
+                                    + (mask_bytes >= 2 ? 1 : 0)
+                                    + (mask_bytes >= 4 ? 1 : 0)
+                                    + (mask_bytes >= 8 ? 1 : 0)
+                                    + (mask_bytes >= 16? 1 : 0)
+                                    + 0;
+
+  static_assert ((shift < sizeof (hb_codepoint_t) * 8), "");
+  static_assert ((shift + num_bits <= sizeof (hb_codepoint_t) * 8), "");
+
+  inline void init (void) {
+    mask = 0;
+  }
+
+  inline void add (hb_codepoint_t g) {
+    mask |= mask_for (g);
+  }
+
+  inline bool add_range (hb_codepoint_t a, hb_codepoint_t b) {
+    if ((b >> shift) - (a >> shift) >= mask_bits - 1)
+      mask = (mask_t) -1;
+    else {
+      mask_t ma = mask_for (a);
+      mask_t mb = mask_for (b);
+      mask |= mb + (mb - ma) - (mb < ma);
+    }
+    return true;
+  }
+
+  template <typename T>
+  inline void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    for (unsigned int i = 0; i < count; i++)
+    {
+      add (*array);
+      array = (const T *) (stride + (const char *) array);
+    }
+  }
+  template <typename T>
+  inline bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    for (unsigned int i = 0; i < count; i++)
+    {
+      add (*array);
+      array = (const T *) (stride + (const char *) array);
+    }
+    return true;
+  }
+
+  inline bool may_have (hb_codepoint_t g) const {
+    return !!(mask & mask_for (g));
+  }
+
+  private:
+
+  static inline mask_t mask_for (hb_codepoint_t g) {
+    return ((mask_t) 1) << ((g >> shift) & (mask_bits - 1));
+  }
+  mask_t mask;
+};
+
+template <typename head_t, typename tail_t>
+struct hb_set_digest_combiner_t
+{
+  ASSERT_POD ();
+
+  inline void init (void) {
+    head.init ();
+    tail.init ();
+  }
+
+  inline void add (hb_codepoint_t g) {
+    head.add (g);
+    tail.add (g);
+  }
+
+  inline bool add_range (hb_codepoint_t a, hb_codepoint_t b) {
+    head.add_range (a, b);
+    tail.add_range (a, b);
+    return true;
+  }
+  template <typename T>
+  inline void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    head.add_array (array, count, stride);
+    tail.add_array (array, count, stride);
+  }
+  template <typename T>
+  inline bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    head.add_sorted_array (array, count, stride);
+    tail.add_sorted_array (array, count, stride);
+    return true;
+  }
+
+  inline bool may_have (hb_codepoint_t g) const {
+    return head.may_have (g) && tail.may_have (g);
+  }
+
+  private:
+  head_t head;
+  tail_t tail;
+};
+
+
+/*
+ * hb_set_digest_t
+ *
+ * This is a combination of digests that performs "best".
+ * There is not much science to this: it's a result of intuition
+ * and testing.
+ */
+typedef hb_set_digest_combiner_t
+<
+  hb_set_digest_lowest_bits_t<unsigned long, 4>,
+  hb_set_digest_combiner_t
+  <
+    hb_set_digest_lowest_bits_t<unsigned long, 0>,
+    hb_set_digest_lowest_bits_t<unsigned long, 9>
+  >
+> hb_set_digest_t;
+
+
+#endif /* HB_SET_DIGEST_PRIVATE_HH */
index e2010d7..3615c50 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright © 2012  Google, Inc.
+ * Copyright © 2012,2017  Google, Inc.
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
 
 
 /*
 
 
 /*
- * The set digests here implement various "filters" that support
- * "approximate member query".  Conceptually these are like Bloom
- * Filter and Quotient Filter, however, much smaller, faster, and
- * designed to fit the requirements of our uses for glyph coverage
- * queries.
- *
- * Our filters are highly accurate if the lookup covers fairly local
- * set of glyphs, but fully flooded and ineffective if coverage is
- * all over the place.
- *
- * The frozen-set can be used instead of a digest, to trade more
- * memory for 100% accuracy, but in practice, that doesn't look like
- * an attractive trade-off.
+ * hb_set_t
  */
 
  */
 
-template <typename mask_t, unsigned int shift>
-struct hb_set_digest_lowest_bits_t
-{
-  ASSERT_POD ();
-
-  static const unsigned int mask_bytes = sizeof (mask_t);
-  static const unsigned int mask_bits = sizeof (mask_t) * 8;
-  static const unsigned int num_bits = 0
-                                    + (mask_bytes >= 1 ? 3 : 0)
-                                    + (mask_bytes >= 2 ? 1 : 0)
-                                    + (mask_bytes >= 4 ? 1 : 0)
-                                    + (mask_bytes >= 8 ? 1 : 0)
-                                    + (mask_bytes >= 16? 1 : 0)
-                                    + 0;
-
-  ASSERT_STATIC (shift < sizeof (hb_codepoint_t) * 8);
-  ASSERT_STATIC (shift + num_bits <= sizeof (hb_codepoint_t) * 8);
-
-  inline void init (void) {
-    mask = 0;
-  }
-
-  inline void add (hb_codepoint_t g) {
-    mask |= mask_for (g);
-  }
-
-  inline void add_range (hb_codepoint_t a, hb_codepoint_t b) {
-    if ((b >> shift) - (a >> shift) >= mask_bits - 1)
-      mask = (mask_t) -1;
-    else {
-      mask_t ma = mask_for (a);
-      mask_t mb = mask_for (b);
-      mask |= mb + (mb - ma) - (mb < ma);
-    }
-  }
+/* TODO Keep a free-list so we can free pages that are completely zeroed.  At that
+ * point maybe also use a sentinel value for "all-1" pages? */
 
 
-  inline bool may_have (hb_codepoint_t g) const {
-    return !!(mask & mask_for (g));
-  }
+struct hb_set_t
+{
+  struct page_map_t
+  {
+    inline int cmp (const page_map_t *o) const { return (int) o->major - (int) major; }
 
 
-  private:
+    uint32_t major;
+    uint32_t index;
+  };
 
 
-  static inline mask_t mask_for (hb_codepoint_t g) {
-    return ((mask_t) 1) << ((g >> shift) & (mask_bits - 1));
-  }
-  mask_t mask;
-};
-
-template <typename head_t, typename tail_t>
-struct hb_set_digest_combiner_t
-{
-  ASSERT_POD ();
+  struct page_t
+  {
+    inline void init0 (void) { memset (&v, 0, sizeof (v)); }
+    inline void init1 (void) { memset (&v, 0xff, sizeof (v)); }
 
 
-  inline void init (void) {
-    head.init ();
-    tail.init ();
-  }
+    inline unsigned int len (void) const
+    { return ARRAY_LENGTH_CONST (v); }
 
 
-  inline void add (hb_codepoint_t g) {
-    head.add (g);
-    tail.add (g);
-  }
+    inline bool is_empty (void) const
+    {
+      for (unsigned int i = 0; i < len (); i++)
+        if (v[i])
+         return false;
+      return true;
+    }
 
 
-  inline void add_range (hb_codepoint_t a, hb_codepoint_t b) {
-    head.add_range (a, b);
-    tail.add_range (a, b);
-  }
+    inline void add (hb_codepoint_t g) { elt (g) |= mask (g); }
+    inline void del (hb_codepoint_t g) { elt (g) &= ~mask (g); }
+    inline bool has (hb_codepoint_t g) const { return !!(elt (g) & mask (g)); }
 
 
-  inline bool may_have (hb_codepoint_t g) const {
-    return head.may_have (g) && tail.may_have (g);
-  }
+    inline void add_range (hb_codepoint_t a, hb_codepoint_t b)
+    {
+      elt_t *la = &elt (a);
+      elt_t *lb = &elt (b);
+      if (la == lb)
+        *la |= (mask (b) << 1) - mask(a);
+      else
+      {
+       *la |= ~(mask (a) - 1);
+       la++;
+
+       memset (la, 0xff, (char *) lb - (char *) la);
+
+       *lb |= ((mask (b) << 1) - 1);
+      }
+    }
 
 
-  private:
-  head_t head;
-  tail_t tail;
-};
+    inline bool is_equal (const page_t *other) const
+    {
+      return 0 == memcmp (&v, &other->v, sizeof (v));
+    }
 
 
+    inline unsigned int get_population (void) const
+    {
+      unsigned int pop = 0;
+      for (unsigned int i = 0; i < len (); i++)
+        pop += _hb_popcount (v[i]);
+      return pop;
+    }
 
 
-/*
- * hb_set_digest_t
- *
- * This is a combination of digests that performs "best".
- * There is not much science to this: it's a result of intuition
- * and testing.
- */
-typedef hb_set_digest_combiner_t
-<
-  hb_set_digest_lowest_bits_t<unsigned long, 4>,
-  hb_set_digest_combiner_t
-  <
-    hb_set_digest_lowest_bits_t<unsigned long, 0>,
-    hb_set_digest_lowest_bits_t<unsigned long, 9>
-  >
-> hb_set_digest_t;
+    inline bool next (hb_codepoint_t *codepoint) const
+    {
+      unsigned int m = (*codepoint + 1) & MASK;
+      if (!m)
+      {
+       *codepoint = INVALID;
+       return false;
+      }
+      unsigned int i = m / ELT_BITS;
+      unsigned int j = m & ELT_MASK;
+
+      const elt_t vv = v[i] & ~((elt_t (1) << j) - 1);
+      for (const elt_t *p = &vv; i < len (); p = &v[++i])
+       if (*p)
+       {
+         *codepoint = i * ELT_BITS + elt_get_min (*p);
+         return true;
+       }
+
+      *codepoint = INVALID;
+      return false;
+    }
+    inline bool previous (hb_codepoint_t *codepoint) const
+    {
+      unsigned int m = (*codepoint - 1) & MASK;
+      if (m == MASK)
+      {
+       *codepoint = INVALID;
+       return false;
+      }
+      unsigned int i = m / ELT_BITS;
+      unsigned int j = m & ELT_MASK;
+
+      const elt_t vv = v[i] & ((elt_t (1) << (j + 1)) - 1);
+      for (const elt_t *p = &vv; (int) i >= 0; p = &v[--i])
+       if (*p)
+       {
+         *codepoint = i * ELT_BITS + elt_get_max (*p);
+         return true;
+       }
+
+      *codepoint = INVALID;
+      return false;
+    }
+    inline hb_codepoint_t get_min (void) const
+    {
+      for (unsigned int i = 0; i < len (); i++)
+        if (v[i])
+         return i * ELT_BITS + elt_get_min (v[i]);
+      return INVALID;
+    }
+    inline hb_codepoint_t get_max (void) const
+    {
+      for (int i = len () - 1; i >= 0; i--)
+        if (v[i])
+         return i * ELT_BITS + elt_get_max (v[i]);
+      return 0;
+    }
 
 
+    typedef unsigned long long elt_t;
+    static const unsigned int PAGE_BITS = 1024;
+    static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, "");
 
 
+    static inline unsigned int elt_get_min (const elt_t &elt) { return _hb_ctz (elt); }
+    static inline unsigned int elt_get_max (const elt_t &elt) { return _hb_bit_storage (elt) - 1; }
 
 
-/*
- * hb_set_t
- */
+#if 0 && HAVE_VECTOR_SIZE
+    /* The vectorized version does not work with clang as non-const
+     * elt() errs "non-const reference cannot bind to vector element". */
+    typedef elt_t vector_t __attribute__((vector_size (PAGE_BITS / 8)));
+#else
+    typedef hb_vector_size_t<elt_t, PAGE_BITS / 8> vector_t;
+#endif
 
 
+    vector_t v;
 
 
-/* TODO Make this faster and memmory efficient. */
+    static const unsigned int ELT_BITS = sizeof (elt_t) * 8;
+    static const unsigned int ELT_MASK = ELT_BITS - 1;
+    static const unsigned int BITS = sizeof (vector_t) * 8;
+    static const unsigned int MASK = BITS - 1;
+    static_assert (PAGE_BITS == BITS, "");
 
 
-struct hb_set_t
-{
-  friend struct hb_frozen_set_t;
+    elt_t &elt (hb_codepoint_t g) { return v[(g & MASK) / ELT_BITS]; }
+    elt_t const &elt (hb_codepoint_t g) const { return v[(g & MASK) / ELT_BITS]; }
+    elt_t mask (hb_codepoint_t g) const { return elt_t (1) << (g & ELT_MASK); }
+  };
+  static_assert (page_t::PAGE_BITS == sizeof (page_t) * 8, "");
 
   hb_object_header_t header;
   ASSERT_POD ();
   bool in_error;
 
   hb_object_header_t header;
   ASSERT_POD ();
   bool in_error;
+  hb_prealloced_array_t<page_map_t, 8> page_map;
+  hb_prealloced_array_t<page_t, 1> pages;
 
 
-  inline void init (void) {
-    hb_object_init (this);
-    clear ();
+  inline void init (void)
+  {
+    in_error = false;
+    page_map.init ();
+    pages.init ();
   }
   }
-  inline void fini (void) {
+  inline void finish (void)
+  {
+    page_map.finish ();
+    pages.finish ();
   }
   }
+
+  inline bool resize (unsigned int count)
+  {
+    if (unlikely (in_error)) return false;
+    if (!pages.resize (count) || !page_map.resize (count))
+    {
+      pages.resize (page_map.len);
+      in_error = true;
+      return false;
+    }
+    return true;
+  }
+
   inline void clear (void) {
     if (unlikely (hb_object_is_inert (this)))
       return;
     in_error = false;
   inline void clear (void) {
     if (unlikely (hb_object_is_inert (this)))
       return;
     in_error = false;
-    memset (elts, 0, sizeof elts);
+    page_map.resize (0);
+    pages.resize (0);
   }
   inline bool is_empty (void) const {
   }
   inline bool is_empty (void) const {
-    for (unsigned int i = 0; i < ARRAY_LENGTH (elts); i++)
-      if (elts[i])
+    unsigned int count = pages.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (!pages[i].is_empty ())
         return false;
     return true;
   }
         return false;
     return true;
   }
+
   inline void add (hb_codepoint_t g)
   {
     if (unlikely (in_error)) return;
     if (unlikely (g == INVALID)) return;
   inline void add (hb_codepoint_t g)
   {
     if (unlikely (in_error)) return;
     if (unlikely (g == INVALID)) return;
-    if (unlikely (g > MAX_G)) return;
-    elt (g) |= mask (g);
+    page_t *page = page_for_insert (g); if (unlikely (!page)) return;
+    page->add (g);
+  }
+  inline bool add_range (hb_codepoint_t a, hb_codepoint_t b)
+  {
+    if (unlikely (in_error)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
+    if (unlikely (a > b || a == INVALID || b == INVALID)) return false;
+    unsigned int ma = get_major (a);
+    unsigned int mb = get_major (b);
+    if (ma == mb)
+    {
+      page_t *page = page_for_insert (a); if (unlikely (!page)) return false;
+      page->add_range (a, b);
+    }
+    else
+    {
+      page_t *page = page_for_insert (a); if (unlikely (!page)) return false;
+      page->add_range (a, major_start (ma + 1) - 1);
+
+      for (unsigned int m = ma + 1; m < mb; m++)
+      {
+       page = page_for_insert (major_start (m)); if (unlikely (!page)) return false;
+       page->init1 ();
+      }
+
+      page = page_for_insert (b); if (unlikely (!page)) return false;
+      page->add_range (major_start (mb), b);
+    }
+    return true;
   }
   }
-  inline void add_range (hb_codepoint_t a, hb_codepoint_t b)
+
+  template <typename T>
+  inline void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
   {
     if (unlikely (in_error)) return;
   {
     if (unlikely (in_error)) return;
-    /* TODO Speedup */
-    for (unsigned int i = a; i < b + 1; i++)
-      add (i);
+    if (!count) return;
+    hb_codepoint_t g = *array;
+    while (count)
+    {
+      unsigned int m = get_major (g);
+      page_t *page = page_for_insert (g); if (unlikely (!page)) return;
+      unsigned int start = major_start (m);
+      unsigned int end = major_start (m + 1);
+      do
+      {
+       page->add (g);
+
+       array = (const T *) ((const char *) array + stride);
+       count--;
+      }
+      while (count && (g = *array, start <= g && g < end));
+    }
+  }
+
+  /* Might return false if array looks unsorted.
+   * Used for faster rejection of corrupt data. */
+  template <typename T>
+  inline bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
+  {
+    if (unlikely (in_error)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
+    if (!count) return true;
+    hb_codepoint_t g = *array;
+    hb_codepoint_t last_g = g;
+    while (count)
+    {
+      unsigned int m = get_major (g);
+      page_t *page = page_for_insert (g); if (unlikely (!page)) return false;
+      unsigned int end = major_start (m + 1);
+      do
+      {
+        /* If we try harder we can change the following comparison to <=;
+        * Not sure if it's worth it. */
+        if (g < last_g) return false;
+       last_g = g;
+       page->add (g);
+
+       array = (const T *) ((const char *) array + stride);
+       count--;
+      }
+      while (count && (g = *array, g < end));
+    }
+    return true;
   }
   }
+
   inline void del (hb_codepoint_t g)
   {
     if (unlikely (in_error)) return;
   inline void del (hb_codepoint_t g)
   {
     if (unlikely (in_error)) return;
-    if (unlikely (g > MAX_G)) return;
-    elt (g) &= ~mask (g);
+    page_t *p = page_for (g);
+    if (!p)
+      return;
+    p->del (g);
   }
   inline void del_range (hb_codepoint_t a, hb_codepoint_t b)
   {
   }
   inline void del_range (hb_codepoint_t a, hb_codepoint_t b)
   {
+    /* TODO Optimize, like add_range(). */
     if (unlikely (in_error)) return;
     if (unlikely (in_error)) return;
-    /* TODO Speedup */
     for (unsigned int i = a; i < b + 1; i++)
       del (i);
   }
   inline bool has (hb_codepoint_t g) const
   {
     for (unsigned int i = a; i < b + 1; i++)
       del (i);
   }
   inline bool has (hb_codepoint_t g) const
   {
-    if (unlikely (g > MAX_G)) return false;
-    return !!(elt (g) & mask (g));
+    const page_t *p = page_for (g);
+    if (!p)
+      return false;
+    return p->has (g);
   }
   inline bool intersects (hb_codepoint_t first,
                          hb_codepoint_t last) const
   {
   }
   inline bool intersects (hb_codepoint_t first,
                          hb_codepoint_t last) const
   {
-    if (unlikely (first > MAX_G)) return false;
-    if (unlikely (last  > MAX_G)) last = MAX_G;
-    unsigned int end = last + 1;
-    for (hb_codepoint_t i = first; i < end; i++)
-      if (has (i))
-        return true;
-    return false;
+    hb_codepoint_t c = first - 1;
+    return next (&c) && c <= last;
+  }
+  inline void set (const hb_set_t *other)
+  {
+    if (unlikely (in_error)) return;
+    unsigned int count = other->pages.len;
+    if (!resize (count))
+      return;
+
+    memcpy (pages.array, other->pages.array, count * sizeof (pages.array[0]));
+    memcpy (page_map.array, other->page_map.array, count * sizeof (page_map.array[0]));
   }
   }
+
   inline bool is_equal (const hb_set_t *other) const
   {
   inline bool is_equal (const hb_set_t *other) const
   {
-    for (unsigned int i = 0; i < ELTS; i++)
-      if (elts[i] != other->elts[i])
+    unsigned int na = pages.len;
+    unsigned int nb = other->pages.len;
+
+    unsigned int a = 0, b = 0;
+    for (; a < na && b < nb; )
+    {
+      if (page_at (a).is_empty ()) { a++; continue; }
+      if (other->page_at (b).is_empty ()) { b++; continue; }
+      if (page_map[a].major != other->page_map[b].major ||
+         !page_at (a).is_equal (&other->page_at (b)))
         return false;
         return false;
+      a++;
+      b++;
+    }
+    for (; a < na; a++)
+      if (!page_at (a).is_empty ()) { return false; }
+    for (; b < nb; b++)
+      if (!other->page_at (b).is_empty ()) { return false; }
+
     return true;
   }
     return true;
   }
-  inline void set (const hb_set_t *other)
+
+  template <class Op>
+  inline void process (const hb_set_t *other)
   {
     if (unlikely (in_error)) return;
   {
     if (unlikely (in_error)) return;
-    for (unsigned int i = 0; i < ELTS; i++)
-      elts[i] = other->elts[i];
+
+    unsigned int na = pages.len;
+    unsigned int nb = other->pages.len;
+    unsigned int next_page = na;
+
+    unsigned int count = 0;
+    unsigned int a = 0, b = 0;
+    for (; a < na && b < nb; )
+    {
+      if (page_map[a].major == other->page_map[b].major)
+      {
+        count++;
+       a++;
+       b++;
+      }
+      else if (page_map[a].major < other->page_map[b].major)
+      {
+        if (Op::passthru_left)
+         count++;
+        a++;
+      }
+      else
+      {
+        if (Op::passthru_right)
+         count++;
+        b++;
+      }
+    }
+    if (Op::passthru_left)
+      count += na - a;
+    if (Op::passthru_right)
+      count += nb - b;
+
+    if (!resize (count))
+      return;
+
+    /* Process in-place backward. */
+    a = na;
+    b = nb;
+    for (; a && b; )
+    {
+      if (page_map[a - 1].major == other->page_map[b - 1].major)
+      {
+       a--;
+       b--;
+       count--;
+       page_map[count] = page_map[a];
+       Op::process (page_at (count).v, page_at (a).v, other->page_at (b).v);
+      }
+      else if (page_map[a - 1].major > other->page_map[b - 1].major)
+      {
+       a--;
+       if (Op::passthru_left)
+       {
+         count--;
+         page_map[count] = page_map[a];
+       }
+      }
+      else
+      {
+       b--;
+       if (Op::passthru_right)
+       {
+         count--;
+         page_map[count].major = other->page_map[b].major;
+         page_map[count].index = next_page++;
+         page_at (count).v = other->page_at (b).v;
+       }
+      }
+    }
+    if (Op::passthru_left)
+      while (a)
+      {
+       a--;
+       count--;
+       page_map[count] = page_map [a];
+      }
+    if (Op::passthru_right)
+      while (b)
+      {
+       b--;
+       count--;
+       page_map[count].major = other->page_map[b].major;
+       page_map[count].index = next_page++;
+       page_at (count).v = other->page_at (b).v;
+      }
+    assert (!count);
   }
   }
+
   inline void union_ (const hb_set_t *other)
   {
   inline void union_ (const hb_set_t *other)
   {
-    if (unlikely (in_error)) return;
-    for (unsigned int i = 0; i < ELTS; i++)
-      elts[i] |= other->elts[i];
+    process<HbOpOr> (other);
   }
   inline void intersect (const hb_set_t *other)
   {
   }
   inline void intersect (const hb_set_t *other)
   {
-    if (unlikely (in_error)) return;
-    for (unsigned int i = 0; i < ELTS; i++)
-      elts[i] &= other->elts[i];
+    process<HbOpAnd> (other);
   }
   inline void subtract (const hb_set_t *other)
   {
   }
   inline void subtract (const hb_set_t *other)
   {
-    if (unlikely (in_error)) return;
-    for (unsigned int i = 0; i < ELTS; i++)
-      elts[i] &= ~other->elts[i];
+    process<HbOpMinus> (other);
   }
   inline void symmetric_difference (const hb_set_t *other)
   {
   }
   inline void symmetric_difference (const hb_set_t *other)
   {
-    if (unlikely (in_error)) return;
-    for (unsigned int i = 0; i < ELTS; i++)
-      elts[i] ^= other->elts[i];
+    process<HbOpXor> (other);
   }
   }
-  inline void invert (void)
+  inline bool next (hb_codepoint_t *codepoint) const
   {
   {
-    if (unlikely (in_error)) return;
-    for (unsigned int i = 0; i < ELTS; i++)
-      elts[i] = ~elts[i];
+    if (unlikely (*codepoint == INVALID)) {
+      *codepoint = get_min ();
+      return *codepoint != INVALID;
+    }
+
+    page_map_t map = {get_major (*codepoint), 0};
+    unsigned int i;
+    page_map.bfind (map, &i);
+    if (i < page_map.len && page_map[i].major == map.major)
+    {
+      if (pages[page_map[i].index].next (codepoint))
+      {
+       *codepoint += page_map[i].major * page_t::PAGE_BITS;
+       return true;
+      }
+      i++;
+    }
+    for (; i < page_map.len; i++)
+    {
+      hb_codepoint_t m = pages[page_map[i].index].get_min ();
+      if (m != INVALID)
+      {
+       *codepoint = page_map[i].major * page_t::PAGE_BITS + m;
+       return true;
+      }
+    }
+    *codepoint = INVALID;
+    return false;
   }
   }
-  inline bool next (hb_codepoint_t *codepoint) const
+  inline bool previous (hb_codepoint_t *codepoint) const
   {
     if (unlikely (*codepoint == INVALID)) {
   {
     if (unlikely (*codepoint == INVALID)) {
-      hb_codepoint_t i = get_min ();
-      if (i != INVALID) {
-        *codepoint = i;
+      *codepoint = get_max ();
+      return *codepoint != INVALID;
+    }
+
+    page_map_t map = {get_major (*codepoint), 0};
+    unsigned int i;
+    page_map.bfind (map, &i);
+    if (i < page_map.len && page_map[i].major == map.major)
+    {
+      if (pages[page_map[i].index].previous (codepoint))
+      {
+       *codepoint += page_map[i].major * page_t::PAGE_BITS;
        return true;
        return true;
-      } else {
-       *codepoint = INVALID;
-        return false;
       }
     }
       }
     }
-    for (hb_codepoint_t i = *codepoint + 1; i < MAX_G + 1; i++)
-      if (has (i)) {
-        *codepoint = i;
+    i--;
+    for (; (int) i >= 0; i--)
+    {
+      hb_codepoint_t m = pages[page_map[i].index].get_max ();
+      if (m != INVALID)
+      {
+       *codepoint = page_map[i].major * page_t::PAGE_BITS + m;
        return true;
       }
        return true;
       }
+    }
     *codepoint = INVALID;
     return false;
   }
     *codepoint = INVALID;
     return false;
   }
@@ -294,108 +564,94 @@ struct hb_set_t
       return false;
     }
 
       return false;
     }
 
+    /* TODO Speed up. */
     *last = *first = i;
     while (next (&i) && i == *last + 1)
       (*last)++;
 
     return true;
   }
     *last = *first = i;
     while (next (&i) && i == *last + 1)
       (*last)++;
 
     return true;
   }
+  inline bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const
+  {
+    hb_codepoint_t i;
+
+    i = *first;
+    if (!previous (&i))
+    {
+      *last = *first = INVALID;
+      return false;
+    }
+
+    /* TODO Speed up. */
+    *last = *first = i;
+    while (previous (&i) && i == *first - 1)
+      (*first)--;
+
+    return true;
+  }
 
   inline unsigned int get_population (void) const
   {
 
   inline unsigned int get_population (void) const
   {
-    unsigned int count = 0;
-    for (unsigned int i = 0; i < ELTS; i++)
-      count += _hb_popcount32 (elts[i]);
-    return count;
+    unsigned int pop = 0;
+    unsigned int count = pages.len;
+    for (unsigned int i = 0; i < count; i++)
+      pop += pages[i].get_population ();
+    return pop;
   }
   inline hb_codepoint_t get_min (void) const
   {
   }
   inline hb_codepoint_t get_min (void) const
   {
-    for (unsigned int i = 0; i < ELTS; i++)
-      if (elts[i])
-       for (unsigned int j = 0; j < BITS; j++)
-         if (elts[i] & (1u << j))
-           return i * BITS + j;
+    unsigned int count = pages.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (!page_at (i).is_empty ())
+        return page_map[i].major * page_t::PAGE_BITS + page_at (i).get_min ();
     return INVALID;
   }
   inline hb_codepoint_t get_max (void) const
   {
     return INVALID;
   }
   inline hb_codepoint_t get_max (void) const
   {
-    for (unsigned int i = ELTS; i; i--)
-      if (elts[i - 1])
-       for (unsigned int j = BITS; j; j--)
-         if (elts[i - 1] & (1u << (j - 1)))
-           return (i - 1) * BITS + (j - 1);
+    unsigned int count = pages.len;
+    for (int i = count - 1; i >= 0; i++)
+      if (!page_at (i).is_empty ())
+        return page_map[i].major * page_t::PAGE_BITS + page_at (i).get_max ();
     return INVALID;
   }
 
     return INVALID;
   }
 
-  typedef uint32_t elt_t;
-  static const unsigned int MAX_G = 65536 - 1; /* XXX Fix this... */
-  static const unsigned int SHIFT = 5;
-  static const unsigned int BITS = (1 << SHIFT);
-  static const unsigned int MASK = BITS - 1;
-  static const unsigned int ELTS = (MAX_G + 1 + (BITS - 1)) / BITS;
   static  const hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
 
   static  const hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
 
-  elt_t &elt (hb_codepoint_t g) { return elts[g >> SHIFT]; }
-  elt_t const &elt (hb_codepoint_t g) const { return elts[g >> SHIFT]; }
-  elt_t mask (hb_codepoint_t g) const { return elt_t (1) << (g & MASK); }
-
-  elt_t elts[ELTS]; /* XXX 8kb */
-
-  ASSERT_STATIC (sizeof (elt_t) * 8 == BITS);
-  ASSERT_STATIC (sizeof (elt_t) * 8 * ELTS > MAX_G);
-};
-
-struct hb_frozen_set_t
-{
-  static const unsigned int SHIFT = hb_set_t::SHIFT;
-  static const unsigned int BITS = hb_set_t::BITS;
-  static const unsigned int MASK = hb_set_t::MASK;
-  typedef hb_set_t::elt_t elt_t;
-
-  inline void init (const hb_set_t &set)
+  inline page_t *page_for_insert (hb_codepoint_t g)
   {
   {
-    start = count = 0;
-    elts = NULL;
-
-    unsigned int max = set.get_max ();
-    if (max == set.INVALID)
-      return;
-    unsigned int min = set.get_min ();
-    const elt_t &min_elt = set.elt (min);
-
-    start = min & ~MASK;
-    count = max - start + 1;
-    unsigned int num_elts = (count + BITS - 1) / BITS;
-    unsigned int elts_size = num_elts * sizeof (elt_t);
-    elts = (elt_t *) malloc (elts_size);
-    if (unlikely (!elts))
+    page_map_t map = {get_major (g), pages.len};
+    unsigned int i;
+    if (!page_map.bfind (map, &i))
     {
     {
-      start = count = 0;
-      return;
+      if (!resize (pages.len + 1))
+       return nullptr;
+
+      pages[map.index].init0 ();
+      memmove (&page_map[i + 1], &page_map[i], (page_map.len - 1 - i) * sizeof (page_map[0]));
+      page_map[i] = map;
     }
     }
-    memcpy (elts, &min_elt, elts_size);
+    return &pages[page_map[i].index];
   }
   }
-
-  inline void fini (void)
+  inline page_t *page_for (hb_codepoint_t g)
   {
   {
-    if (elts)
-      free (elts);
+    page_map_t key = {get_major (g)};
+    const page_map_t *found = page_map.bsearch (key);
+    if (found)
+      return &pages[found->index];
+    return nullptr;
   }
   }
-
-  inline bool has (hb_codepoint_t g) const
+  inline const page_t *page_for (hb_codepoint_t g) const
   {
   {
-    /* hb_codepoint_t is unsigned. */
-    g -= start;
-    if (unlikely (g > count)) return false;
-    return !!(elt (g) & mask (g));
-  }
-
-  elt_t const &elt (hb_codepoint_t g) const { return elts[g >> SHIFT]; }
-  elt_t mask (hb_codepoint_t g) const { return elt_t (1) << (g & MASK); }
-
-  private:
-  hb_codepoint_t start, count;
-  elt_t *elts;
+    page_map_t key = {get_major (g)};
+    const page_map_t *found = page_map.bsearch (key);
+    if (found)
+      return &pages[found->index];
+    return nullptr;
+  }
+  inline page_t &page_at (unsigned int i) { return pages[page_map[i].index]; }
+  inline const page_t &page_at (unsigned int i) const { return pages[page_map[i].index]; }
+  inline unsigned int get_major (hb_codepoint_t g) const { return g / page_t::PAGE_BITS; }
+  inline hb_codepoint_t major_start (unsigned int major) const { return major * page_t::PAGE_BITS; }
 };
 
 
 };
 
 
index f3fe1ba..07cf9d0 100644 (file)
@@ -45,11 +45,18 @@ hb_set_create (void)
   if (!(set = hb_object_create<hb_set_t> ()))
     return hb_set_get_empty ();
 
   if (!(set = hb_object_create<hb_set_t> ()))
     return hb_set_get_empty ();
 
-  set->clear ();
+  set->init ();
 
   return set;
 }
 
 
   return set;
 }
 
+static const hb_set_t _hb_set_nil = {
+  HB_OBJECT_HEADER_STATIC,
+  true, /* in_error */
+
+  {0} /* elts */
+};
+
 /**
  * hb_set_get_empty:
  *
 /**
  * hb_set_get_empty:
  *
@@ -60,13 +67,6 @@ hb_set_create (void)
 hb_set_t *
 hb_set_get_empty (void)
 {
 hb_set_t *
 hb_set_get_empty (void)
 {
-  static const hb_set_t _hb_set_nil = {
-    HB_OBJECT_HEADER_STATIC,
-    true, /* in_error */
-
-    {0} /* elts */
-  };
-
   return const_cast<hb_set_t *> (&_hb_set_nil);
 }
 
   return const_cast<hb_set_t *> (&_hb_set_nil);
 }
 
@@ -95,7 +95,7 @@ hb_set_destroy (hb_set_t *set)
 {
   if (!hb_object_destroy (set)) return;
 
 {
   if (!hb_object_destroy (set)) return;
 
-  set->fini ();
+  set->finish ();
 
   free (set);
 }
 
   free (set);
 }
@@ -376,11 +376,12 @@ hb_set_symmetric_difference (hb_set_t       *set,
  * 
  *
  * Since: 0.9.10
  * 
  *
  * Since: 0.9.10
+ *
+ * Deprecated: 1.6.1
  **/
 void
 hb_set_invert (hb_set_t *set)
 {
  **/
 void
 hb_set_invert (hb_set_t *set)
 {
-  set->invert ();
 }
 
 /**
 }
 
 /**
@@ -436,7 +437,9 @@ hb_set_get_max (const hb_set_t *set)
  * @set: a set.
  * @codepoint: (inout):
  *
  * @set: a set.
  * @codepoint: (inout):
  *
- * 
+ * Gets the next number in @set that is greater than current value of @codepoint.
+ *
+ * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
  *
  * Return value: whether there was a next value.
  *
  *
  * Return value: whether there was a next value.
  *
@@ -450,6 +453,26 @@ hb_set_next (const hb_set_t *set,
 }
 
 /**
 }
 
 /**
+ * hb_set_previous:
+ * @set: a set.
+ * @codepoint: (inout):
+ *
+ * Gets the previous number in @set that is slower than current value of @codepoint.
+ *
+ * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
+ *
+ * Return value: whether there was a previous value.
+ *
+ * Since: 1.8.0
+ **/
+hb_bool_t
+hb_set_previous (const hb_set_t *set,
+                hb_codepoint_t *codepoint)
+{
+  return set->previous (codepoint);
+}
+
+/**
  * hb_set_next_range:
  * @set: a set.
  * @first: (out): output first codepoint in the range.
  * hb_set_next_range:
  * @set: a set.
  * @first: (out): output first codepoint in the range.
@@ -458,6 +481,8 @@ hb_set_next (const hb_set_t *set,
  * Gets the next consecutive range of numbers in @set that
  * are greater than current value of @last.
  *
  * Gets the next consecutive range of numbers in @set that
  * are greater than current value of @last.
  *
+ * Set @last to %HB_SET_VALUE_INVALID to get started.
+ *
  * Return value: whether there was a next range.
  *
  * Since: 0.9.7
  * Return value: whether there was a next range.
  *
  * Since: 0.9.7
@@ -469,3 +494,26 @@ hb_set_next_range (const hb_set_t *set,
 {
   return set->next_range (first, last);
 }
 {
   return set->next_range (first, last);
 }
+
+/**
+ * hb_set_previous_range:
+ * @set: a set.
+ * @first: (inout): input current first and output first codepoint in the range.
+ * @last: (out): output last codepoint in the range.
+ *
+ * Gets the previous consecutive range of numbers in @set that
+ * are greater than current value of @last.
+ *
+ * Set @first to %HB_SET_VALUE_INVALID to get started.
+ *
+ * Return value: whether there was a previous range.
+ *
+ * Since: 1.8.0
+ **/
+hb_bool_t
+hb_set_previous_range (const hb_set_t *set,
+                      hb_codepoint_t *first,
+                      hb_codepoint_t *last)
+{
+  return set->previous_range (first, last);
+}
index 2164c1a..b0f82f8 100644 (file)
@@ -126,31 +126,39 @@ HB_EXTERN void
 hb_set_symmetric_difference (hb_set_t       *set,
                             const hb_set_t *other);
 
 hb_set_symmetric_difference (hb_set_t       *set,
                             const hb_set_t *other);
 
-HB_EXTERN void
-hb_set_invert (hb_set_t *set);
-
 HB_EXTERN unsigned int
 hb_set_get_population (const hb_set_t *set);
 
 HB_EXTERN unsigned int
 hb_set_get_population (const hb_set_t *set);
 
-/* Returns -1 if set empty. */
+/* Returns HB_SET_VALUE_INVALID if set empty. */
 HB_EXTERN hb_codepoint_t
 hb_set_get_min (const hb_set_t *set);
 
 HB_EXTERN hb_codepoint_t
 hb_set_get_min (const hb_set_t *set);
 
-/* Returns -1 if set empty. */
+/* Returns HB_SET_VALUE_INVALID if set empty. */
 HB_EXTERN hb_codepoint_t
 hb_set_get_max (const hb_set_t *set);
 
 HB_EXTERN hb_codepoint_t
 hb_set_get_max (const hb_set_t *set);
 
-/* Pass -1 in to get started. */
+/* Pass HB_SET_VALUE_INVALID in to get started. */
 HB_EXTERN hb_bool_t
 hb_set_next (const hb_set_t *set,
             hb_codepoint_t *codepoint);
 
 HB_EXTERN hb_bool_t
 hb_set_next (const hb_set_t *set,
             hb_codepoint_t *codepoint);
 
-/* Pass -1 for first and last to get started. */
+/* Pass HB_SET_VALUE_INVALID in to get started. */
+HB_EXTERN hb_bool_t
+hb_set_previous (const hb_set_t *set,
+                hb_codepoint_t *codepoint);
+
+/* Pass HB_SET_VALUE_INVALID for first and last to get started. */
 HB_EXTERN hb_bool_t
 hb_set_next_range (const hb_set_t *set,
                   hb_codepoint_t *first,
                   hb_codepoint_t *last);
 
 HB_EXTERN hb_bool_t
 hb_set_next_range (const hb_set_t *set,
                   hb_codepoint_t *first,
                   hb_codepoint_t *last);
 
+/* Pass HB_SET_VALUE_INVALID for first and last to get started. */
+HB_EXTERN hb_bool_t
+hb_set_previous_range (const hb_set_t *set,
+                      hb_codepoint_t *first,
+                      hb_codepoint_t *last);
+
 
 HB_END_DECLS
 
 
 HB_END_DECLS
 
index 6173766..6eeba2b 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
+#include "hb-private.hh"
+#include "hb-debug.hh"
 #include "hb-shape-plan-private.hh"
 #include "hb-shaper-private.hh"
 #include "hb-font-private.hh"
 #include "hb-buffer-private.hh"
 
 
 #include "hb-shape-plan-private.hh"
 #include "hb-shaper-private.hh"
 #include "hb-font-private.hh"
 #include "hb-buffer-private.hh"
 
 
-#ifndef HB_DEBUG_SHAPE_PLAN
-#define HB_DEBUG_SHAPE_PLAN (HB_DEBUG+0)
-#endif
-
-
 static void
 hb_shape_plan_plan (hb_shape_plan_t    *shape_plan,
                    const hb_feature_t *user_features,
 static void
 hb_shape_plan_plan (hb_shape_plan_t    *shape_plan,
                    const hb_feature_t *user_features,
@@ -115,7 +112,7 @@ hb_shape_plan_create (hb_face_t                     *face,
 {
   return hb_shape_plan_create2 (face, props,
                                user_features, num_user_features,
 {
   return hb_shape_plan_create2 (face, props,
                                user_features, num_user_features,
-                               NULL, 0,
+                               nullptr, 0,
                                shaper_list);
 }
 
                                shaper_list);
 }
 
@@ -128,7 +125,7 @@ hb_shape_plan_create2 (hb_face_t                     *face,
                       unsigned int                   num_coords,
                       const char * const            *shaper_list)
 {
                       unsigned int                   num_coords,
                       const char * const            *shaper_list)
 {
-  DEBUG_MSG_FUNC (SHAPE_PLAN, NULL,
+  DEBUG_MSG_FUNC (SHAPE_PLAN, nullptr,
                  "face=%p num_features=%d num_coords=%d shaper_list=%p",
                  face,
                  num_user_features,
                  "face=%p num_features=%d num_coords=%d shaper_list=%p",
                  face,
                  num_user_features,
@@ -136,8 +133,8 @@ hb_shape_plan_create2 (hb_face_t                     *face,
                  shaper_list);
 
   hb_shape_plan_t *shape_plan;
                  shaper_list);
 
   hb_shape_plan_t *shape_plan;
-  hb_feature_t *features = NULL;
-  int *coords = NULL;
+  hb_feature_t *features = nullptr;
+  int *coords = nullptr;
 
   if (unlikely (!face))
     face = hb_face_get_empty ();
 
   if (unlikely (!face))
     face = hb_face_get_empty ();
@@ -160,7 +157,7 @@ hb_shape_plan_create2 (hb_face_t                     *face,
   assert (props->direction != HB_DIRECTION_INVALID);
 
   hb_face_make_immutable (face);
   assert (props->direction != HB_DIRECTION_INVALID);
 
   hb_face_make_immutable (face);
-  shape_plan->default_shaper_list = shaper_list == NULL;
+  shape_plan->default_shaper_list = !shaper_list;
   shape_plan->face_unsafe = face;
   shape_plan->props = *props;
   shape_plan->num_user_features = num_user_features;
   shape_plan->face_unsafe = face;
   shape_plan->props = *props;
   shape_plan->num_user_features = num_user_features;
@@ -196,16 +193,16 @@ hb_shape_plan_get_empty (void)
     HB_OBJECT_HEADER_STATIC,
 
     true, /* default_shaper_list */
     HB_OBJECT_HEADER_STATIC,
 
     true, /* default_shaper_list */
-    NULL, /* face */
+    nullptr, /* face */
     HB_SEGMENT_PROPERTIES_DEFAULT, /* props */
 
     HB_SEGMENT_PROPERTIES_DEFAULT, /* props */
 
-    NULL, /* shaper_func */
-    NULL, /* shaper_name */
+    nullptr, /* shaper_func */
+    nullptr, /* shaper_name */
 
 
-    NULL, /* user_features */
+    nullptr, /* user_features */
     0,    /* num_user_featurs */
 
     0,    /* num_user_featurs */
 
-    NULL, /* coords */
+    nullptr, /* coords */
     0,    /* num_coords */
 
     {
     0,    /* num_coords */
 
     {
@@ -423,7 +420,7 @@ hb_shape_plan_matches (const hb_shape_plan_t          *shape_plan,
   return hb_segment_properties_equal (&shape_plan->props, &proposal->props) &&
         hb_shape_plan_user_features_match (shape_plan, proposal) &&
         hb_shape_plan_coords_match (shape_plan, proposal) &&
   return hb_segment_properties_equal (&shape_plan->props, &proposal->props) &&
         hb_shape_plan_user_features_match (shape_plan, proposal) &&
         hb_shape_plan_coords_match (shape_plan, proposal) &&
-        ((shape_plan->default_shaper_list && proposal->shaper_list == NULL) ||
+        ((shape_plan->default_shaper_list && !proposal->shaper_list) ||
          (shape_plan->shaper_func == proposal->shaper_func));
 }
 
          (shape_plan->shaper_func == proposal->shaper_func));
 }
 
@@ -470,7 +467,7 @@ hb_shape_plan_create_cached (hb_face_t                     *face,
 {
   return hb_shape_plan_create_cached2 (face, props,
                                       user_features, num_user_features,
 {
   return hb_shape_plan_create_cached2 (face, props,
                                       user_features, num_user_features,
-                                      NULL, 0,
+                                      nullptr, 0,
                                       shaper_list);
 }
 
                                       shaper_list);
 }
 
@@ -483,7 +480,7 @@ hb_shape_plan_create_cached2 (hb_face_t                     *face,
                              unsigned int                   num_coords,
                              const char * const            *shaper_list)
 {
                              unsigned int                   num_coords,
                              const char * const            *shaper_list)
 {
-  DEBUG_MSG_FUNC (SHAPE_PLAN, NULL,
+  DEBUG_MSG_FUNC (SHAPE_PLAN, nullptr,
                  "face=%p num_features=%d shaper_list=%p",
                  face,
                  num_user_features,
                  "face=%p num_features=%d shaper_list=%p",
                  face,
                  num_user_features,
@@ -494,7 +491,7 @@ hb_shape_plan_create_cached2 (hb_face_t                     *face,
     shaper_list,
     user_features,
     num_user_features,
     shaper_list,
     user_features,
     num_user_features,
-    NULL
+    nullptr
   };
 
   if (shaper_list) {
   };
 
   if (shaper_list) {
@@ -520,15 +517,17 @@ hb_shape_plan_create_cached2 (hb_face_t                     *face,
 
 retry:
   hb_face_t::plan_node_t *cached_plan_nodes = (hb_face_t::plan_node_t *) hb_atomic_ptr_get (&face->shape_plans);
 
 retry:
   hb_face_t::plan_node_t *cached_plan_nodes = (hb_face_t::plan_node_t *) hb_atomic_ptr_get (&face->shape_plans);
-  for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next)
-    if (hb_shape_plan_matches (node->shape_plan, &proposal))
-    {
-      DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache");
-      return hb_shape_plan_reference (node->shape_plan);
-    }
 
 
-  /* Not found. */
+  /* Don't look for plan in the cache if there were variation coordinates XXX Fix me. */
+  if (!hb_coords_present (coords, num_coords))
+    for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next)
+      if (hb_shape_plan_matches (node->shape_plan, &proposal))
+      {
+        DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache");
+        return hb_shape_plan_reference (node->shape_plan);
+      }
 
 
+  /* Not found. */
   hb_shape_plan_t *shape_plan = hb_shape_plan_create2 (face, props,
                                                       user_features, num_user_features,
                                                       coords, num_coords,
   hb_shape_plan_t *shape_plan = hb_shape_plan_create2 (face, props,
                                                       user_features, num_user_features,
                                                       coords, num_coords,
index f080a15..39355b3 100644 (file)
@@ -76,7 +76,7 @@ retry:
     /* Not found; allocate one. */
     shaper_list = (const char **) calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *));
     if (unlikely (!shaper_list)) {
     /* Not found; allocate one. */
     shaper_list = (const char **) calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *));
     if (unlikely (!shaper_list)) {
-      static const char *nil_shaper_list[] = {NULL};
+      static const char *nil_shaper_list[] = {nullptr};
       return nil_shaper_list;
     }
 
       return nil_shaper_list;
     }
 
@@ -84,9 +84,9 @@ retry:
     unsigned int i;
     for (i = 0; i < HB_SHAPERS_COUNT; i++)
       shaper_list[i] = shapers[i].name;
     unsigned int i;
     for (i = 0; i < HB_SHAPERS_COUNT; i++)
       shaper_list[i] = shapers[i].name;
-    shaper_list[i] = NULL;
+    shaper_list[i] = nullptr;
 
 
-    if (!hb_atomic_ptr_cmpexch (&static_shaper_list, NULL, shaper_list)) {
+    if (!hb_atomic_ptr_cmpexch (&static_shaper_list, nullptr, shaper_list)) {
       free (shaper_list);
       goto retry;
     }
       free (shaper_list);
       goto retry;
     }
@@ -157,5 +157,5 @@ hb_shape (hb_font_t           *font,
          const hb_feature_t  *features,
          unsigned int         num_features)
 {
          const hb_feature_t  *features,
          unsigned int         num_features)
 {
-  hb_shape_full (font, buffer, features, num_features, NULL);
+  hb_shape_full (font, buffer, features, num_features, nullptr);
 }
 }
index 381398a..ce2d9f2 100644 (file)
@@ -88,16 +88,28 @@ struct hb_shaper_data_t {
         HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data);
 
 #define HB_SHAPER_DATA_ENSURE_DEFINE(shaper, object) \
         HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data);
 
 #define HB_SHAPER_DATA_ENSURE_DEFINE(shaper, object) \
+       HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(shaper, object, true)
+
+#define HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(shaper, object, condition) \
 bool \
 HB_SHAPER_DATA_ENSURE_FUNC(shaper, object) (hb_##object##_t *object) \
 {\
   retry: \
   HB_SHAPER_DATA_TYPE (shaper, object) *data = (HB_SHAPER_DATA_TYPE (shaper, object) *) hb_atomic_ptr_get (&HB_SHAPER_DATA (shaper, object)); \
 bool \
 HB_SHAPER_DATA_ENSURE_FUNC(shaper, object) (hb_##object##_t *object) \
 {\
   retry: \
   HB_SHAPER_DATA_TYPE (shaper, object) *data = (HB_SHAPER_DATA_TYPE (shaper, object) *) hb_atomic_ptr_get (&HB_SHAPER_DATA (shaper, object)); \
+  if (likely (data) && !(condition)) { \
+    /* Drop and recreate. */ \
+    /* If someone dropped it in the mean time, throw it away and don't touch it. \
+     * Otherwise, destruct it. */ \
+    if (hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), data, nullptr)) { \
+      HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); \
+    } \
+    goto retry; \
+  } \
   if (unlikely (!data)) { \
     data = HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (object); \
     if (unlikely (!data)) \
       data = (HB_SHAPER_DATA_TYPE (shaper, object) *) HB_SHAPER_DATA_INVALID; \
   if (unlikely (!data)) { \
     data = HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (object); \
     if (unlikely (!data)) \
       data = (HB_SHAPER_DATA_TYPE (shaper, object) *) HB_SHAPER_DATA_INVALID; \
-    if (!hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), NULL, data)) { \
+    if (!hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), nullptr, data)) { \
       if (data && \
          data != HB_SHAPER_DATA_INVALID && \
          data != HB_SHAPER_DATA_SUCCEEDED) \
       if (data && \
          data != HB_SHAPER_DATA_INVALID && \
          data != HB_SHAPER_DATA_SUCCEEDED) \
@@ -105,7 +117,7 @@ HB_SHAPER_DATA_ENSURE_FUNC(shaper, object) (hb_##object##_t *object) \
       goto retry; \
     } \
   } \
       goto retry; \
     } \
   } \
-  return data != NULL && !HB_SHAPER_DATA_IS_INVALID (data); \
+  return data != nullptr && !HB_SHAPER_DATA_IS_INVALID (data); \
 }
 
 
 }
 
 
index b25566d..2c44cf2 100644 (file)
@@ -59,14 +59,14 @@ retry:
   {
     char *env = getenv ("HB_SHAPER_LIST");
     if (!env || !*env) {
   {
     char *env = getenv ("HB_SHAPER_LIST");
     if (!env || !*env) {
-      (void) hb_atomic_ptr_cmpexch (&static_shapers, NULL, &all_shapers[0]);
+      (void) hb_atomic_ptr_cmpexch (&static_shapers, nullptr, &all_shapers[0]);
       return (const hb_shaper_pair_t *) all_shapers;
     }
 
     /* Not found; allocate one. */
     shapers = (hb_shaper_pair_t *) calloc (1, sizeof (all_shapers));
     if (unlikely (!shapers)) {
       return (const hb_shaper_pair_t *) all_shapers;
     }
 
     /* Not found; allocate one. */
     shapers = (hb_shaper_pair_t *) calloc (1, sizeof (all_shapers));
     if (unlikely (!shapers)) {
-      (void) hb_atomic_ptr_cmpexch (&static_shapers, NULL, &all_shapers[0]);
+      (void) hb_atomic_ptr_cmpexch (&static_shapers, nullptr, &all_shapers[0]);
       return (const hb_shaper_pair_t *) all_shapers;
     }
 
       return (const hb_shaper_pair_t *) all_shapers;
     }
 
@@ -97,7 +97,7 @@ retry:
        p = end + 1;
     }
 
        p = end + 1;
     }
 
-    if (!hb_atomic_ptr_cmpexch (&static_shapers, NULL, shapers)) {
+    if (!hb_atomic_ptr_cmpexch (&static_shapers, nullptr, shapers)) {
       free (shapers);
       goto retry;
     }
       free (shapers);
       goto retry;
     }
diff --git a/src/hb-string-array.hh b/src/hb-string-array.hh
new file mode 100644 (file)
index 0000000..ba829b0
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright © 2017  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_STRING_ARRAY_HH
+#if 0 /* Make checks happy. */
+#define HB_STRING_ARRAY_HH
+#endif
+
+#include "hb-private.hh"
+
+/* Based on Bruno Haible's code in Appendix B of Ulrich Drepper's dsohowto.pdf:
+ * https://software.intel.com/sites/default/files/m/a/1/e/dsohowto.pdf */
+
+#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)
+
+static const union HB_STRING_ARRAY_TYPE_NAME {
+  struct {
+/* I like to avoid storing the nul-termination byte since we don't need it,
+ * but C++ does not allow that.
+ * https://stackoverflow.com/questions/28433862/why-initializer-string-for-array-of-chars-is-too-long-compiles-fine-in-c-not
+ */
+#define _S(s) char HB_PASTE (str, __LINE__)[sizeof (s)];
+#include HB_STRING_ARRAY_LIST
+#undef _S
+  } st;
+  char str[VAR];
+}
+HB_STRING_ARRAY_POOL_NAME =
+{
+  {
+#define _S(s) s,
+#include HB_STRING_ARRAY_LIST
+#undef _S
+  }
+};
+static const unsigned int HB_STRING_ARRAY_OFFS_NAME[] =
+{
+#define _S(s) offsetof (union HB_STRING_ARRAY_TYPE_NAME, st.HB_PASTE(str, __LINE__)),
+#include HB_STRING_ARRAY_LIST
+#undef _S
+  sizeof (HB_STRING_ARRAY_TYPE_NAME)
+};
+
+static inline hb_string_t
+HB_STRING_ARRAY_NAME (unsigned int i)
+{
+  assert (i < ARRAY_LENGTH (HB_STRING_ARRAY_OFFS_NAME) - 1);
+  return hb_string_t (HB_STRING_ARRAY_POOL_NAME.str + HB_STRING_ARRAY_OFFS_NAME[i],
+                     HB_STRING_ARRAY_OFFS_NAME[i + 1] - HB_STRING_ARRAY_OFFS_NAME[i] - 1);
+}
+
+#undef HB_STRING_ARRAY_TYPE_NAME
+#undef HB_STRING_ARRAY_POOL_NAME
+#undef HB_STRING_ARRAY_OFFS_NAME
+
+#endif /* HB_STRING_ARRAY_HH */
diff --git a/src/hb-subset-glyf.cc b/src/hb-subset-glyf.cc
new file mode 100644 (file)
index 0000000..0b84c85
--- /dev/null
@@ -0,0 +1,307 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Roderick Sheeter
+ */
+
+#include "hb-open-type-private.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-set.h"
+#include "hb-subset-glyf.hh"
+#include "hb-subset-plan.hh"
+
+static bool
+_calculate_glyf_and_loca_prime_size (const OT::glyf::accelerator_t &glyf,
+                                     hb_prealloced_array_t<hb_codepoint_t> &glyph_ids,
+                                     hb_bool_t drop_hints,
+                                     bool *use_short_loca /* OUT */,
+                                     unsigned int *glyf_size /* OUT */,
+                                     unsigned int *loca_size /* OUT */,
+                                     hb_prealloced_array_t<unsigned int> *instruction_ranges /* OUT */)
+{
+  unsigned int total = 0;
+  for (unsigned int i = 0; i < glyph_ids.len; i++)
+  {
+    hb_codepoint_t next_glyph = glyph_ids[i];
+    unsigned int *instruction_start = instruction_ranges->push();
+    unsigned int *instruction_end = instruction_ranges->push();
+    *instruction_start = 0;
+    *instruction_end = 0;
+
+    unsigned int start_offset, end_offset;
+    if (unlikely (!(glyf.get_offsets(next_glyph, &start_offset, &end_offset)
+                    && glyf.remove_padding(start_offset, &end_offset))))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Invalid gid %d", next_glyph);
+      continue;
+    }
+    if (end_offset - start_offset < OT::glyf::GlyphHeader::static_size)
+      continue; /* 0-length glyph */
+
+    if (drop_hints)
+    {
+      if (unlikely (!glyf.get_instruction_offsets(start_offset, end_offset,
+                                                  instruction_start, instruction_end)))
+      {
+        DEBUG_MSG(SUBSET, nullptr, "Unable to get instruction offsets for %d", next_glyph);
+        return false;
+      }
+    }
+
+    total += end_offset - start_offset - (*instruction_end - *instruction_start);
+    /* round2 so short loca will work */
+    total += total % 2;
+  }
+
+  *glyf_size = total;
+  *use_short_loca = (total <= 131070);
+  *loca_size = (glyph_ids.len + 1)
+      * (*use_short_loca ? sizeof(OT::HBUINT16) : sizeof(OT::HBUINT32));
+
+  DEBUG_MSG(SUBSET, nullptr, "preparing to subset glyf: final size %d, loca size %d, using %s loca",
+            total,
+            *loca_size,
+            *use_short_loca ? "short" : "long");
+  return true;
+}
+
+static bool
+_write_loca_entry (unsigned int  id,
+                   unsigned int  offset,
+                   bool          is_short,
+                   void         *loca_prime,
+                   unsigned int  loca_size)
+{
+  unsigned int entry_size = is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32);
+  if ((id + 1) * entry_size <= loca_size)
+  {
+    if (is_short) {
+      ((OT::HBUINT16*) loca_prime) [id].set (offset / 2);
+    } else {
+      ((OT::HBUINT32*) loca_prime) [id].set (offset);
+    }
+    return true;
+  }
+
+  // Offset was not written because the write is out of bounds.
+  DEBUG_MSG (SUBSET,
+             nullptr,
+             "WARNING: Attempted to write an out of bounds loca entry at index %d. Loca size is %d.",
+             id,
+             loca_size);
+  return false;
+}
+
+static void
+_update_components (hb_subset_plan_t * plan,
+                   char * glyph_start,
+                   unsigned int length)
+
+{
+  OT::glyf::CompositeGlyphHeader::Iterator iterator;
+  if (OT::glyf::CompositeGlyphHeader::get_iterator (glyph_start,
+                                                   length,
+                                                   &iterator))
+  {
+    do
+    {
+      hb_codepoint_t new_gid;
+      if (!hb_subset_plan_new_gid_for_old_id (plan,
+                                             iterator.current->glyphIndex,
+                                             &new_gid))
+       continue;
+
+      ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex.set (new_gid);
+    } while (iterator.move_to_next());
+  }
+}
+
+static bool _remove_composite_instruction_flag(char *glyf_prime, unsigned int length)
+{
+  /* remove WE_HAVE_INSTRUCTIONS from flags in dest */
+  OT::glyf::CompositeGlyphHeader::Iterator composite_it;
+  if (unlikely (!OT::glyf::CompositeGlyphHeader::get_iterator (glyf_prime, length, &composite_it))) return false;
+  const OT::glyf::CompositeGlyphHeader *glyph;
+  do {
+    glyph = composite_it.current;
+    OT::HBUINT16 *flags = const_cast<OT::HBUINT16 *> (&glyph->flags);
+    flags->set ( (uint16_t) *flags & ~OT::glyf::CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS);
+  } while (composite_it.move_to_next());
+  return true;
+}
+
+static bool
+_write_glyf_and_loca_prime (hb_subset_plan_t              *plan,
+                           const OT::glyf::accelerator_t &glyf,
+                            const char                    *glyf_data,
+                            bool                           use_short_loca,
+                            hb_prealloced_array_t<unsigned int> &instruction_ranges,
+                            unsigned int                   glyf_prime_size,
+                            char                          *glyf_prime_data /* OUT */,
+                            unsigned int                   loca_prime_size,
+                            char                          *loca_prime_data /* OUT */)
+{
+  hb_prealloced_array_t<hb_codepoint_t> &glyph_ids = plan->gids_to_retain_sorted;
+  char *glyf_prime_data_next = glyf_prime_data;
+
+  bool success = true;
+  for (unsigned int i = 0; i < glyph_ids.len; i++)
+  {
+    unsigned int start_offset, end_offset;
+    if (unlikely (!(glyf.get_offsets (glyph_ids[i], &start_offset, &end_offset)
+                    && glyf.remove_padding(start_offset, &end_offset))))
+      end_offset = start_offset = 0;
+    unsigned int instruction_start = instruction_ranges[i * 2];
+    unsigned int instruction_end = instruction_ranges[i * 2 + 1];
+
+    int length = end_offset - start_offset - (instruction_end - instruction_start);
+    length += length % 2;
+
+    if (glyf_prime_data_next + length > glyf_prime_data + glyf_prime_size)
+    {
+      DEBUG_MSG (SUBSET,
+                 nullptr,
+                 "WARNING: Attempted to write an out of bounds glyph entry for gid %d (length %d)",
+                 i, length);
+      return false;
+    }
+
+    if (instruction_start == instruction_end)
+      memcpy (glyf_prime_data_next, glyf_data + start_offset, length);
+    else
+    {
+      memcpy (glyf_prime_data_next, glyf_data + start_offset, instruction_start - start_offset);
+      memcpy (glyf_prime_data_next + instruction_start - start_offset, glyf_data + instruction_end, end_offset - instruction_end);
+      /* if the instructions end at the end this was a composite glyph, else simple */
+      if (instruction_end == end_offset)
+      {
+        if (unlikely (!_remove_composite_instruction_flag (glyf_prime_data_next, length))) return false;
+      }
+      else
+        /* zero instruction length, which is just before instruction_start */
+        memset (glyf_prime_data_next + instruction_start - start_offset - 2, 0, 2);
+    }
+
+    success = success && _write_loca_entry (i,
+                                            glyf_prime_data_next - glyf_prime_data,
+                                            use_short_loca,
+                                            loca_prime_data,
+                                            loca_prime_size);
+    _update_components (plan, glyf_prime_data_next, length);
+
+    glyf_prime_data_next += length;
+  }
+
+  success = success && _write_loca_entry (glyph_ids.len,
+                                          glyf_prime_data_next - glyf_prime_data,
+                                          use_short_loca,
+                                          loca_prime_data,
+                                          loca_prime_size);
+  return success;
+}
+
+static bool
+_hb_subset_glyf_and_loca (const OT::glyf::accelerator_t  &glyf,
+                          const char                     *glyf_data,
+                          hb_subset_plan_t               *plan,
+                          bool                           *use_short_loca,
+                          hb_blob_t                     **glyf_prime /* OUT */,
+                          hb_blob_t                     **loca_prime /* OUT */)
+{
+  // TODO(grieger): Sanity check allocation size for the new table.
+  hb_prealloced_array_t<hb_codepoint_t> &glyphs_to_retain = plan->gids_to_retain_sorted;
+
+  unsigned int glyf_prime_size;
+  unsigned int loca_prime_size;
+  hb_prealloced_array_t<unsigned int> instruction_ranges;
+  instruction_ranges.init();
+
+  if (unlikely (!_calculate_glyf_and_loca_prime_size (glyf,
+                                                      glyphs_to_retain,
+                                                      plan->drop_hints,
+                                                      use_short_loca,
+                                                      &glyf_prime_size,
+                                                      &loca_prime_size,
+                                                      &instruction_ranges))) {
+    instruction_ranges.finish();
+    return false;
+  }
+
+  char *glyf_prime_data = (char *) calloc (1, glyf_prime_size);
+  char *loca_prime_data = (char *) calloc (1, loca_prime_size);
+  if (unlikely (!_write_glyf_and_loca_prime (plan, glyf, glyf_data,
+                                             *use_short_loca,
+                                             instruction_ranges,
+                                             glyf_prime_size, glyf_prime_data,
+                                             loca_prime_size, loca_prime_data))) {
+    free (glyf_prime_data);
+    free (loca_prime_data);
+    instruction_ranges.finish();
+    return false;
+  }
+  instruction_ranges.finish();
+
+  *glyf_prime = hb_blob_create (glyf_prime_data,
+                                glyf_prime_size,
+                                HB_MEMORY_MODE_READONLY,
+                                glyf_prime_data,
+                                free);
+  *loca_prime = hb_blob_create (loca_prime_data,
+                                loca_prime_size,
+                                HB_MEMORY_MODE_READONLY,
+                                loca_prime_data,
+                                free);
+  return true;
+}
+
+/**
+ * hb_subset_glyf:
+ * Subsets the glyph table according to a provided plan.
+ *
+ * Return value: subsetted glyf table.
+ *
+ * Since: 1.7.5
+ **/
+bool
+hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
+                         bool             *use_short_loca, /* OUT */
+                         hb_blob_t       **glyf_prime, /* OUT */
+                         hb_blob_t       **loca_prime /* OUT */)
+{
+  hb_blob_t *glyf_blob = OT::Sanitizer<OT::glyf>().sanitize (plan->source->reference_table (HB_OT_TAG_glyf));
+  const char *glyf_data = hb_blob_get_data(glyf_blob, nullptr);
+
+  OT::glyf::accelerator_t glyf;
+  glyf.init(plan->source);
+  bool result = _hb_subset_glyf_and_loca (glyf,
+                                          glyf_data,
+                                          plan,
+                                          use_short_loca,
+                                          glyf_prime,
+                                          loca_prime);
+
+  hb_blob_destroy (glyf_blob);
+  glyf.fini();
+
+  return result;
+}
diff --git a/src/hb-subset-glyf.hh b/src/hb-subset-glyf.hh
new file mode 100644 (file)
index 0000000..99b76db
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#ifndef HB_SUBSET_GLYF_HH
+#define HB_SUBSET_GLYF_HH
+
+#include "hb-private.hh"
+
+#include "hb-subset-plan.hh"
+
+HB_INTERNAL bool
+hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
+                         bool             *use_short_loca, /* OUT */
+                         hb_blob_t       **glyf_prime /* OUT */,
+                         hb_blob_t       **loca_prime /* OUT */);
+
+#endif /* HB_SUBSET_GLYF_HH */
diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc
new file mode 100644 (file)
index 0000000..c4003dd
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Rod Sheeter, Behdad Esfahbod
+ */
+
+#include "hb-object-private.hh"
+#include "hb-subset-private.hh"
+#include "hb-set-private.hh"
+
+/**
+ * hb_subset_input_create_or_fail:
+ *
+ * Return value: New subset input.
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_input_t *
+hb_subset_input_create_or_fail (void)
+{
+  hb_subset_input_t *input = hb_object_create<hb_subset_input_t>();
+
+  if (unlikely (!input))
+    return nullptr;
+
+  input->unicodes = hb_set_create ();
+  input->glyphs = hb_set_create ();
+
+  return input;
+}
+
+/**
+ * hb_subset_input_reference: (skip)
+ * @subset_input: a subset_input.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_input_t *
+hb_subset_input_reference (hb_subset_input_t *subset_input)
+{
+  return hb_object_reference (subset_input);
+}
+
+/**
+ * hb_subset_input_destroy:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+void
+hb_subset_input_destroy(hb_subset_input_t *subset_input)
+{
+  if (!hb_object_destroy (subset_input)) return;
+
+  hb_set_destroy (subset_input->unicodes);
+  hb_set_destroy (subset_input->glyphs);
+
+  free (subset_input);
+}
+
+/**
+ * hb_subset_input_unicode_set:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_set_t *
+hb_subset_input_unicode_set (hb_subset_input_t *subset_input)
+{
+  return subset_input->unicodes;
+}
+
+/**
+ * hb_subset_input_glyph_set:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_set_t *
+hb_subset_input_glyph_set (hb_subset_input_t *subset_input)
+{
+  return subset_input->glyphs;
+}
+
+/**
+ * hb_subset_input_drop_hints:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_bool_t *
+hb_subset_input_drop_hints (hb_subset_input_t *subset_input)
+{
+  return &subset_input->drop_hints;
+}
diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc
new file mode 100644 (file)
index 0000000..f8a09ef
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Roderick Sheeter
+ */
+
+#include "hb-subset-private.hh"
+
+#include "hb-subset-plan.hh"
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+
+static int
+_hb_codepoint_t_cmp (const void *pa, const void *pb)
+{
+  hb_codepoint_t a = * (hb_codepoint_t *) pa;
+  hb_codepoint_t b = * (hb_codepoint_t *) pb;
+
+  return a < b ? -1 : a > b ? +1 : 0;
+}
+
+hb_bool_t
+hb_subset_plan_new_gid_for_codepoint (hb_subset_plan_t *plan,
+                                      hb_codepoint_t codepoint,
+                                      hb_codepoint_t *new_gid)
+{
+  // TODO actual map, delete this garbage.
+  for (unsigned int i = 0; i < plan->codepoints.len; i++)
+  {
+    if (plan->codepoints[i] != codepoint) continue;
+    if (!hb_subset_plan_new_gid_for_old_id(plan, plan->gids_to_retain[i], new_gid))
+    {
+      return false;
+    }
+    return true;
+  }
+  return false;
+}
+
+hb_bool_t
+hb_subset_plan_new_gid_for_old_id (hb_subset_plan_t *plan,
+                                   hb_codepoint_t old_gid,
+                                   hb_codepoint_t *new_gid)
+{
+  // the index in old_gids is the new gid; only up to codepoints.len are valid
+  for (unsigned int i = 0; i < plan->gids_to_retain_sorted.len; i++)
+  {
+    if (plan->gids_to_retain_sorted[i] == old_gid)
+    {
+      *new_gid = i;
+      return true;
+    }
+  }
+  return false;
+}
+
+hb_bool_t
+hb_subset_plan_add_table (hb_subset_plan_t *plan,
+                          hb_tag_t tag,
+                          hb_blob_t *contents)
+{
+  hb_blob_t *source_blob = plan->source->reference_table (tag);
+  DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes", HB_UNTAG(tag), hb_blob_get_length (contents), hb_blob_get_length (source_blob));
+  hb_blob_destroy (source_blob);
+  return hb_subset_face_add_table(plan->dest, tag, contents);
+}
+
+static void
+_populate_codepoints (hb_set_t *input_codepoints,
+                      hb_prealloced_array_t<hb_codepoint_t>& plan_codepoints)
+{
+  plan_codepoints.alloc (hb_set_get_population (input_codepoints));
+  hb_codepoint_t cp = -1;
+  while (hb_set_next (input_codepoints, &cp)) {
+    hb_codepoint_t *wr = plan_codepoints.push();
+    *wr = cp;
+  }
+  plan_codepoints.qsort (_hb_codepoint_t_cmp);
+}
+
+static void
+_add_gid_and_children (const OT::glyf::accelerator_t &glyf,
+                      hb_codepoint_t gid,
+                      hb_set_t *gids_to_retain)
+{
+  if (hb_set_has (gids_to_retain, gid))
+    // Already visited this gid, ignore.
+    return;
+
+  hb_set_add (gids_to_retain, gid);
+
+  OT::glyf::CompositeGlyphHeader::Iterator composite;
+  if (glyf.get_composite (gid, &composite))
+  {
+    do
+    {
+      _add_gid_and_children (glyf, (hb_codepoint_t) composite.current->glyphIndex, gids_to_retain);
+    } while (composite.move_to_next());
+  }
+}
+
+static void
+_populate_gids_to_retain (hb_face_t *face,
+                          hb_prealloced_array_t<hb_codepoint_t>& codepoints,
+                          hb_prealloced_array_t<hb_codepoint_t>& old_gids,
+                          hb_prealloced_array_t<hb_codepoint_t>& old_gids_sorted)
+{
+  OT::cmap::accelerator_t cmap;
+  OT::glyf::accelerator_t glyf;
+  cmap.init (face);
+  glyf.init (face);
+
+  hb_auto_array_t<unsigned int> bad_indices;
+
+  old_gids.alloc (codepoints.len);
+  for (unsigned int i = 0; i < codepoints.len; i++)
+  {
+    hb_codepoint_t gid;
+    if (!cmap.get_nominal_glyph (codepoints[i], &gid))
+    {
+      gid = -1;
+      *(bad_indices.push ()) = i;
+    }
+    *(old_gids.push ()) = gid;
+  }
+
+  /* Generally there shouldn't be any */
+  while (bad_indices.len > 0)
+  {
+    unsigned int i = bad_indices[bad_indices.len - 1];
+    bad_indices.pop ();
+    DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", codepoints[i]);
+    codepoints.remove (i);
+    old_gids.remove (i);
+  }
+
+  // Populate a full set of glyphs to retain by adding all referenced
+  // composite glyphs.
+  // TODO expand with glyphs reached by G*
+  hb_set_t * all_gids_to_retain = hb_set_create ();
+  _add_gid_and_children (glyf, 0, all_gids_to_retain);
+  for (unsigned int i = 0; i < old_gids.len; i++)
+    _add_gid_and_children (glyf, old_gids[i], all_gids_to_retain);
+
+  // Transfer to a sorted list.
+  old_gids_sorted.alloc (hb_set_get_population (all_gids_to_retain));
+  hb_codepoint_t gid = HB_SET_VALUE_INVALID;
+  while (hb_set_next (all_gids_to_retain, &gid))
+    *(old_gids_sorted.push ()) = gid;
+
+  hb_set_destroy (all_gids_to_retain);
+  glyf.fini ();
+  cmap.fini ();
+}
+
+/**
+ * hb_subset_plan_create:
+ * Computes a plan for subsetting the supplied face according
+ * to a provide profile and input. The plan describes
+ * which tables and glyphs should be retained.
+ *
+ * Return value: New subset plan.
+ *
+ * Since: 1.7.5
+ **/
+hb_subset_plan_t *
+hb_subset_plan_create (hb_face_t           *face,
+                       hb_subset_profile_t *profile,
+                       hb_subset_input_t   *input)
+{
+  hb_subset_plan_t *plan = hb_object_create<hb_subset_plan_t> ();
+
+  plan->codepoints.init();
+  plan->gids_to_retain.init();
+  plan->gids_to_retain_sorted.init();
+  plan->source = hb_face_reference (face);
+  plan->dest = hb_subset_face_create ();
+  plan->drop_hints = input->drop_hints;
+
+  _populate_codepoints (input->unicodes, plan->codepoints);
+  _populate_gids_to_retain (face,
+                            plan->codepoints,
+                            plan->gids_to_retain,
+                            plan->gids_to_retain_sorted);
+
+  return plan;
+}
+
+/**
+ * hb_subset_plan_destroy:
+ *
+ * Since: 1.7.5
+ **/
+void
+hb_subset_plan_destroy (hb_subset_plan_t *plan)
+{
+  if (!hb_object_destroy (plan)) return;
+
+  plan->codepoints.finish ();
+  plan->gids_to_retain.finish ();
+  plan->gids_to_retain_sorted.finish ();
+
+  hb_face_destroy (plan->source);
+  hb_face_destroy (plan->dest);
+
+  free (plan);
+}
diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh
new file mode 100644 (file)
index 0000000..d1b66b4
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_PLAN_HH
+#define HB_SUBSET_PLAN_HH
+
+#include "hb-private.hh"
+
+#include "hb-subset.h"
+
+#include "hb-object-private.hh"
+
+struct hb_subset_plan_t {
+  hb_object_header_t header;
+  ASSERT_POD ();
+
+  hb_bool_t drop_hints;
+
+  // TODO(Q1) actual map, drop this crap
+  // Look at me ma, I'm a poor mans map codepoint : new gid
+  // codepoints is sorted and aligned with gids_to_retain.
+
+  // These first two lists provide a mapping from cp -> gid
+  // As a result it does not list the full set of glyphs to retain.
+  hb_prealloced_array_t<hb_codepoint_t> codepoints;
+  hb_prealloced_array_t<hb_codepoint_t> gids_to_retain;
+
+  // This list contains the complete set of glyphs to retain and may contain
+  // more glyphs then the lists above.
+  hb_prealloced_array_t<hb_codepoint_t> gids_to_retain_sorted;
+
+  // Plan is only good for a specific source/dest so keep them with it
+  hb_face_t *source;
+  hb_face_t *dest;
+};
+
+typedef struct hb_subset_plan_t hb_subset_plan_t;
+
+HB_INTERNAL hb_subset_plan_t *
+hb_subset_plan_create (hb_face_t           *face,
+                       hb_subset_profile_t *profile,
+                       hb_subset_input_t   *input);
+
+HB_INTERNAL hb_bool_t
+hb_subset_plan_new_gid_for_old_id(hb_subset_plan_t *plan,
+                                  hb_codepoint_t old_gid,
+                                  hb_codepoint_t *new_gid /* OUT */);
+
+HB_INTERNAL hb_bool_t
+hb_subset_plan_new_gid_for_codepoint(hb_subset_plan_t *plan,
+                                     hb_codepoint_t codepont,
+                                     hb_codepoint_t *new_gid /* OUT */);
+
+HB_INTERNAL hb_bool_t
+hb_subset_plan_add_table(hb_subset_plan_t *plan,
+                         hb_tag_t tag,
+                         hb_blob_t *contents);
+
+HB_INTERNAL void
+hb_subset_plan_destroy (hb_subset_plan_t *plan);
+
+#endif /* HB_SUBSET_PLAN_HH */
diff --git a/src/hb-subset-private.hh b/src/hb-subset-private.hh
new file mode 100644 (file)
index 0000000..5fa7252
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_PRIVATE_HH
+#define HB_SUBSET_PRIVATE_HH
+
+
+#include "hb-private.hh"
+
+#include "hb-subset.h"
+
+#include "hb-font-private.hh"
+
+typedef struct hb_subset_face_data_t hb_subset_face_data_t;
+
+struct hb_subset_input_t {
+  hb_object_header_t header;
+  ASSERT_POD ();
+
+  hb_set_t *unicodes;
+  hb_set_t *glyphs;
+
+  hb_bool_t drop_hints;
+  /* TODO
+   *
+   * features
+   * lookups
+   * nameIDs
+   * ...
+   */
+};
+
+HB_INTERNAL hb_face_t *
+hb_subset_face_create (void);
+
+HB_INTERNAL hb_bool_t
+hb_subset_face_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob);
+
+#endif /* HB_SUBSET_PRIVATE_HH */
diff --git a/src/hb-subset.cc b/src/hb-subset.cc
new file mode 100644 (file)
index 0000000..9ebe5d3
--- /dev/null
@@ -0,0 +1,339 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Rod Sheeter, Behdad Esfahbod
+ */
+
+#include "hb-private.hh"
+#include "hb-object-private.hh"
+#include "hb-open-type-private.hh"
+
+#include "hb-subset-glyf.hh"
+#include "hb-subset-private.hh"
+#include "hb-subset-plan.hh"
+
+#include "hb-open-file-private.hh"
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-hdmx-table.hh"
+#include "hb-ot-head-table.hh"
+#include "hb-ot-hhea-table.hh"
+#include "hb-ot-hmtx-table.hh"
+#include "hb-ot-maxp-table.hh"
+#include "hb-ot-os2-table.hh"
+
+
+#ifndef HB_NO_VISIBILITY
+const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+#endif
+
+
+struct hb_subset_profile_t {
+  hb_object_header_t header;
+  ASSERT_POD ();
+};
+
+/**
+ * hb_subset_profile_create:
+ *
+ * Return value: New profile with default settings.
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_profile_t *
+hb_subset_profile_create ()
+{
+  return hb_object_create<hb_subset_profile_t>();
+}
+
+/**
+ * hb_subset_profile_destroy:
+ *
+ * Since: 1.8.0
+ **/
+void
+hb_subset_profile_destroy (hb_subset_profile_t *profile)
+{
+  if (!hb_object_destroy (profile)) return;
+
+  free (profile);
+}
+
+template<typename TableType>
+static bool
+_subset (hb_subset_plan_t *plan)
+{
+  OT::Sanitizer<TableType> sanitizer;
+
+  hb_blob_t *source_blob = sanitizer.sanitize (plan->source->reference_table (TableType::tableTag));
+  const TableType *table = OT::Sanitizer<TableType>::lock_instance (source_blob);
+
+  hb_bool_t result = false;
+  if (table != &OT::Null(TableType))
+    result = table->subset(plan);
+
+  hb_blob_destroy (source_blob);
+  hb_tag_t tag = TableType::tableTag;
+  DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset %s", HB_UNTAG(tag), result ? "success" : "FAILED!");
+  return result;
+}
+
+
+/*
+ * A face that has add_table().
+ */
+
+struct hb_subset_face_data_t
+{
+  struct table_entry_t
+  {
+    inline int cmp (const hb_tag_t *t) const
+    {
+      if (*t < tag) return -1;
+      if (*t > tag) return -1;
+      return 0;
+    }
+
+    hb_tag_t   tag;
+    hb_blob_t *blob;
+  };
+
+  hb_prealloced_array_t<table_entry_t, 32> tables;
+};
+
+static hb_subset_face_data_t *
+_hb_subset_face_data_create (void)
+{
+  hb_subset_face_data_t *data = (hb_subset_face_data_t *) calloc (1, sizeof (hb_subset_face_data_t));
+  if (unlikely (!data))
+    return nullptr;
+
+  return data;
+}
+
+static void
+_hb_subset_face_data_destroy (void *user_data)
+{
+  hb_subset_face_data_t *data = (hb_subset_face_data_t *) user_data;
+
+  for (unsigned int i = 0; i < data->tables.len; i++)
+    hb_blob_destroy (data->tables[i].blob);
+
+  data->tables.finish ();
+
+  free (data);
+}
+
+static hb_blob_t *
+_hb_subset_face_data_reference_blob (hb_subset_face_data_t *data)
+{
+
+  unsigned int table_count = data->tables.len;
+  unsigned int face_length = table_count * 16 + 12;
+
+  for (unsigned int i = 0; i < table_count; i++)
+    face_length += _hb_ceil_to_4 (hb_blob_get_length (data->tables.array[i].blob));
+
+  char *buf = (char *) malloc (face_length);
+  if (unlikely (!buf))
+    return nullptr;
+
+  OT::hb_serialize_context_t c (buf, face_length);
+  OT::OpenTypeFontFile *f = c.start_serialize<OT::OpenTypeFontFile> ();
+
+  bool is_cff = data->tables.lsearch (HB_TAG ('C','F','F',' ')) || data->tables.lsearch (HB_TAG ('C','F','F','2'));
+  hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag;
+
+  OT::Supplier<hb_tag_t>    tags_supplier  (&data->tables[0].tag, table_count, sizeof (data->tables[0]));
+  OT::Supplier<hb_blob_t *> blobs_supplier (&data->tables[0].blob, table_count, sizeof (data->tables[0]));
+  bool ret = f->serialize_single (&c,
+                                 sfnt_tag,
+                                 tags_supplier,
+                                 blobs_supplier,
+                                 table_count);
+
+  c.end_serialize ();
+
+  if (unlikely (!ret))
+  {
+    free (buf);
+    return nullptr;
+  }
+
+  return hb_blob_create (buf, face_length, HB_MEMORY_MODE_WRITABLE, buf, free);
+}
+
+static hb_blob_t *
+_hb_subset_face_reference_table (hb_face_t *face, hb_tag_t tag, void *user_data)
+{
+  hb_subset_face_data_t *data = (hb_subset_face_data_t *) user_data;
+
+  if (!tag)
+    return _hb_subset_face_data_reference_blob (data);
+
+  hb_subset_face_data_t::table_entry_t *entry = data->tables.lsearch (tag);
+  if (entry)
+    return hb_blob_reference (entry->blob);
+
+  return nullptr;
+}
+
+/* TODO: Move this to hb-face.h and rename to hb_face_builder_create()
+ * with hb_face_builder_add_table(). */
+hb_face_t *
+hb_subset_face_create (void)
+{
+  hb_subset_face_data_t *data = _hb_subset_face_data_create ();
+  if (unlikely (!data)) return hb_face_get_empty ();
+
+  return hb_face_create_for_tables (_hb_subset_face_reference_table,
+                                   data,
+                                   _hb_subset_face_data_destroy);
+}
+
+hb_bool_t
+hb_subset_face_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob)
+{
+  if (unlikely (face->destroy != _hb_subset_face_data_destroy))
+    return false;
+
+  hb_subset_face_data_t *data = (hb_subset_face_data_t *) face->user_data;
+  hb_subset_face_data_t::table_entry_t *entry = data->tables.push ();
+  if (unlikely (!entry))
+    return false;
+
+  entry->tag = tag;
+  entry->blob = hb_blob_reference (blob);
+
+  return true;
+}
+
+static bool
+_subset_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 = _subset<const OT::glyf> (plan);
+      break;
+    case HB_OT_TAG_hdmx:
+      result = _subset<const OT::hdmx> (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 = _subset<const OT::hmtx> (plan);
+      break;
+    case HB_OT_TAG_maxp:
+      result = _subset<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 = _subset<const OT::cmap> (plan);
+      break;
+    case HB_OT_TAG_os2:
+      result = _subset<const OT::os2> (plan);
+      break;
+    default:
+      hb_blob_t *source_table = hb_face_reference_table(plan->source, tag);
+      if (likely (source_table))
+        result = hb_subset_plan_add_table(plan, tag, source_table);
+      else
+        result = false;
+      hb_blob_destroy (source_table);
+      break;
+  }
+  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)
+{
+    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;
+      case HB_TAG ('G', 'D', 'E', 'F'): /* temporary */
+      case HB_TAG ('G', 'P', 'O', 'S'): /* temporary */
+      case HB_TAG ('G', 'S', 'U', 'B'): /* temporary */
+      case HB_TAG ('D', 'S', 'I', 'G'):
+        return true;
+      default:
+        return false;
+  }
+}
+
+/**
+ * hb_subset:
+ * @source: font face data to be subset.
+ * @profile: profile to use for the subsetting.
+ * @input: input to use for the subsetting.
+ *
+ * Subsets a font according to provided profile and input.
+ **/
+hb_face_t *
+hb_subset (hb_face_t *source,
+           hb_subset_profile_t *profile,
+           hb_subset_input_t *input)
+{
+  if (unlikely (!profile || !input || !source)) return hb_face_get_empty();
+
+  hb_subset_plan_t *plan = hb_subset_plan_create (source, profile, input);
+
+  hb_tag_t table_tags[32];
+  unsigned int offset = 0, count;
+  bool success = true;
+  do {
+    count = ARRAY_LENGTH (table_tags);
+    hb_face_get_table_tags (source, offset, &count, table_tags);
+    for (unsigned int i = 0; i < count; i++)
+    {
+      hb_tag_t tag = table_tags[i];
+      if (_should_drop_table(plan, tag))
+      {
+        DEBUG_MSG(SUBSET, nullptr, "drop %c%c%c%c", HB_UNTAG(tag));
+        continue;
+      }
+      success = success && _subset_table (plan, tag);
+    }
+  } while (count == ARRAY_LENGTH (table_tags));
+
+  hb_face_t *result = success ? hb_face_reference(plan->dest) : hb_face_get_empty();
+  hb_subset_plan_destroy (plan);
+  return result;
+}
diff --git a/src/hb-subset.h b/src/hb-subset.h
new file mode 100644 (file)
index 0000000..55ce25b
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Rod Sheeter
+ */
+
+#ifndef HB_SUBSET_H
+#define HB_SUBSET_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+/*
+ * hb_subset_profile_t
+ * Things that change based on target environment, e.g. OS.
+ * Threadsafe for multiple concurrent subset operations.
+ */
+
+typedef struct hb_subset_profile_t hb_subset_profile_t;
+
+HB_EXTERN hb_subset_profile_t *
+hb_subset_profile_create (void);
+
+HB_EXTERN void
+hb_subset_profile_destroy (hb_subset_profile_t *profile);
+
+/*
+ * hb_subset_input_t
+ *
+ * Things that change based on the input. Characters to keep, etc.
+ */
+
+typedef struct hb_subset_input_t hb_subset_input_t;
+
+HB_EXTERN hb_subset_input_t *
+hb_subset_input_create_or_fail (void);
+
+HB_EXTERN hb_subset_input_t *
+hb_subset_input_reference (hb_subset_input_t *subset_input);
+
+HB_EXTERN void
+hb_subset_input_destroy (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_unicode_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_glyph_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_bool_t *
+hb_subset_input_drop_hints (hb_subset_input_t *subset_input);
+
+/* hb_subset() */
+
+HB_EXTERN hb_face_t *
+hb_subset (hb_face_t *source,
+          hb_subset_profile_t *profile,
+           hb_subset_input_t *input);
+
+HB_END_DECLS
+
+#endif /* HB_SUBSET_H */
index a884e3f..9515bda 100644 (file)
@@ -160,17 +160,23 @@ static const hb_script_t ucdn_script_translate[] =
     HB_SCRIPT_NEWA,
     HB_SCRIPT_OSAGE,
     HB_SCRIPT_TANGUT,
     HB_SCRIPT_NEWA,
     HB_SCRIPT_OSAGE,
     HB_SCRIPT_TANGUT,
+    HB_SCRIPT_MASARAM_GONDI,
+    HB_SCRIPT_NUSHU,
+    HB_SCRIPT_SOYOMBO,
+    HB_SCRIPT_ZANABAZAR_SQUARE,
 };
 
 static hb_unicode_combining_class_t
 };
 
 static hb_unicode_combining_class_t
-hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode,
+hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+                       hb_codepoint_t unicode,
                        void *user_data HB_UNUSED)
 {
     return (hb_unicode_combining_class_t) ucdn_get_combining_class(unicode);
 }
 
 static unsigned int
                        void *user_data HB_UNUSED)
 {
     return (hb_unicode_combining_class_t) ucdn_get_combining_class(unicode);
 }
 
 static unsigned int
-hb_ucdn_eastasian_width(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode,
+hb_ucdn_eastasian_width(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+                       hb_codepoint_t unicode,
                        void *user_data HB_UNUSED)
 {
     int w = ucdn_get_east_asian_width(unicode);
                        void *user_data HB_UNUSED)
 {
     int w = ucdn_get_east_asian_width(unicode);
@@ -178,28 +184,31 @@ hb_ucdn_eastasian_width(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode,
 }
 
 static hb_unicode_general_category_t
 }
 
 static hb_unicode_general_category_t
-hb_ucdn_general_category(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode,
+hb_ucdn_general_category(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+                        hb_codepoint_t unicode,
                         void *user_data HB_UNUSED)
 {
     return (hb_unicode_general_category_t)ucdn_get_general_category(unicode);
 }
 
 static hb_codepoint_t
                         void *user_data HB_UNUSED)
 {
     return (hb_unicode_general_category_t)ucdn_get_general_category(unicode);
 }
 
 static hb_codepoint_t
-hb_ucdn_mirroring(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode,
+hb_ucdn_mirroring(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+                 hb_codepoint_t unicode,
                  void *user_data HB_UNUSED)
 {
     return ucdn_mirror(unicode);
 }
 
 static hb_script_t
                  void *user_data HB_UNUSED)
 {
     return ucdn_mirror(unicode);
 }
 
 static hb_script_t
-hb_ucdn_script(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode,
+hb_ucdn_script(hb_unicode_funcs_t *ufuncs HB_UNUSED,
+              hb_codepoint_t unicode,
               void *user_data HB_UNUSED)
 {
     return ucdn_script_translate[ucdn_get_script(unicode)];
 }
 
 static hb_bool_t
               void *user_data HB_UNUSED)
 {
     return ucdn_script_translate[ucdn_get_script(unicode)];
 }
 
 static hb_bool_t
-hb_ucdn_compose(hb_unicode_funcs_t *ufuncs,
+hb_ucdn_compose(hb_unicode_funcs_t *ufuncs HB_UNUSED,
                hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab,
                void *user_data HB_UNUSED)
 {
                hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab,
                void *user_data HB_UNUSED)
 {
@@ -207,7 +216,7 @@ hb_ucdn_compose(hb_unicode_funcs_t *ufuncs,
 }
 
 static hb_bool_t
 }
 
 static hb_bool_t
-hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs,
+hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs HB_UNUSED,
                  hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b,
                  void *user_data HB_UNUSED)
 {
                  hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b,
                  void *user_data HB_UNUSED)
 {
@@ -215,29 +224,50 @@ hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs,
 }
 
 static unsigned int
 }
 
 static unsigned int
-hb_ucdn_decompose_compatibility(hb_unicode_funcs_t *ufuncs,
+hb_ucdn_decompose_compatibility(hb_unicode_funcs_t *ufuncs HB_UNUSED,
                                hb_codepoint_t u, hb_codepoint_t *decomposed,
                                void *user_data HB_UNUSED)
 {
     return ucdn_compat_decompose(u, decomposed);
 }
 
                                hb_codepoint_t u, hb_codepoint_t *decomposed,
                                void *user_data HB_UNUSED)
 {
     return ucdn_compat_decompose(u, decomposed);
 }
 
+static hb_unicode_funcs_t *static_ucdn_funcs = nullptr;
+
+#ifdef HB_USE_ATEXIT
+static
+void free_static_ucdn_funcs (void)
+{
+  hb_unicode_funcs_destroy (static_ucdn_funcs);
+}
+#endif
+
 extern "C" HB_INTERNAL
 hb_unicode_funcs_t *
 hb_ucdn_get_unicode_funcs (void)
 {
 extern "C" HB_INTERNAL
 hb_unicode_funcs_t *
 hb_ucdn_get_unicode_funcs (void)
 {
-  static const hb_unicode_funcs_t _hb_ucdn_unicode_funcs = {
-    HB_OBJECT_HEADER_STATIC,
+retry:
+  hb_unicode_funcs_t *funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_ucdn_funcs);
+
+  if (unlikely (!funcs))
+  {
+    funcs = hb_unicode_funcs_create (nullptr);
 
 
-    NULL, /* parent */
-    true, /* immutable */
-    {
-#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_ucdn_##name,
+#define HB_UNICODE_FUNC_IMPLEMENT(name) \
+    hb_unicode_funcs_set_##name##_func (funcs, hb_ucdn_##name, nullptr, nullptr);
       HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_UNICODE_FUNC_IMPLEMENT
       HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_UNICODE_FUNC_IMPLEMENT
+
+    hb_unicode_funcs_make_immutable (funcs);
+
+    if (!hb_atomic_ptr_cmpexch (&static_ucdn_funcs, nullptr, funcs)) {
+      hb_unicode_funcs_destroy (funcs);
+      goto retry;
     }
     }
+
+#ifdef HB_USE_ATEXIT
+    atexit (free_static_ucdn_funcs); /* First person registers atexit() callback. */
+#endif
   };
 
   };
 
-  return const_cast<hb_unicode_funcs_t *> (&_hb_ucdn_unicode_funcs);
+  return hb_unicode_funcs_reference (funcs);
 }
 }
-
index 0d51342..22d7d14 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 @SET_MAKE@
 
 VPATH = @srcdir@
 @SET_MAKE@
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -78,17 +88,17 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(srcdir)/Makefile.sources $(srcdir)/Makefile.in \
-       $(srcdir)/Makefile.am $(top_srcdir)/depcomp COPYING README
 subdir = src/hb-ucdn
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 subdir = src/hb-ucdn
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-       $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
@@ -163,6 +173,8 @@ am__define_uniq_tagged_files = \
   done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
   done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+       $(top_srcdir)/depcomp COPYING README
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
@@ -179,6 +191,12 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
@@ -206,6 +224,8 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
@@ -245,6 +265,7 @@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -253,6 +274,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -309,6 +331,7 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -329,6 +352,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -342,7 +366,7 @@ NULL =
 LIBHB_UCDN_sources = \
        ucdn.h \
        ucdn.c \
 LIBHB_UCDN_sources = \
        ucdn.h \
        ucdn.c \
-       unicodedata_db.h \
+       ucdn_db.h \
        $(NULL)
 
 libhb_ucdn_la_SOURCES = $(LIBHB_UCDN_sources)
        $(NULL)
 
 libhb_ucdn_la_SOURCES = $(LIBHB_UCDN_sources)
@@ -369,7 +393,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__c
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits src/hb-ucdn/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits src/hb-ucdn/Makefile
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits src/hb-ucdn/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits src/hb-ucdn/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -378,7 +401,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
-$(srcdir)/Makefile.sources:
+$(srcdir)/Makefile.sources $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -648,6 +671,8 @@ uninstall-am:
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
        tags tags-am uninstall uninstall-am
 
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
        tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 -include $(top_srcdir)/git.mk
 
 
 -include $(top_srcdir)/git.mk
 
index 52778d4..cb823b6 100644 (file)
@@ -3,5 +3,5 @@ NULL =
 LIBHB_UCDN_sources = \
        ucdn.h \
        ucdn.c \
 LIBHB_UCDN_sources = \
        ucdn.h \
        ucdn.c \
-       unicodedata_db.h \
+       ucdn_db.h \
        $(NULL)
        $(NULL)
index fcb97b9..2203ae6 100644 (file)
@@ -31,10 +31,10 @@ UCDN was written by Grigori Goronzy <greg@kinoho.net>.
 
 How to Use
 
 
 How to Use
 
-Include ucdn.c, ucdn.h and unicodedata_db.h in your project. Now,
-just use the functions as documented in ucdn.h.
+Include ucdn.c, ucdn.h and ucdn_db.h in your project. Now, just use the
+functions as documented in ucdn.h.
 
 In some cases, it might be necessary to regenerate the Unicode
 database file. The script makeunicodedata.py (Python 3.x required)
 fetches the appropriate files and dumps the compressed database into
 
 In some cases, it might be necessary to regenerate the Unicode
 database file. The script makeunicodedata.py (Python 3.x required)
 fetches the appropriate files and dumps the compressed database into
-unicodedata_db.h.
+ucdn_db.h.
index f4e9be1..30747fe 100644 (file)
@@ -23,7 +23,6 @@ typedef struct {
     unsigned char category;
     unsigned char combining;
     unsigned char bidi_class;
     unsigned char category;
     unsigned char combining;
     unsigned char bidi_class;
-    unsigned char mirrored;
     unsigned char east_asian_width;
     unsigned char script;
     unsigned char linebreak_class;
     unsigned char east_asian_width;
     unsigned char script;
     unsigned char linebreak_class;
@@ -43,7 +42,7 @@ typedef struct {
     short count, index;
 } Reindex;
 
     short count, index;
 } Reindex;
 
-#include "unicodedata_db.h"
+#include "ucdn_db.h"
 
 /* constants required for Hangul (de)composition */
 #define SBASE 0xAC00
 
 /* constants required for Hangul (de)composition */
 #define SBASE 0xAC00
@@ -91,20 +90,30 @@ static const unsigned short *get_decomp_record(uint32_t code)
     return &decomp_data[index];
 }
 
     return &decomp_data[index];
 }
 
-static int get_comp_index(uint32_t code, const Reindex *idx)
+static int compare_reindex(const void *a, const void *b)
 {
 {
-    int i;
-
-    for (i = 0; idx[i].start; i++) {
-        const Reindex *cur = &idx[i];
-        if (code < cur->start)
-            return -1;
-        if (code <= cur->start + cur->count) {
-            return cur->index + (code - cur->start);
-        }
-    }
+    Reindex *ra = (Reindex *)a;
+    Reindex *rb = (Reindex *)b;
 
 
-    return -1;
+    if (ra->start < rb->start)
+        return -1;
+    else if (ra->start > (rb->start + rb->count))
+        return 1;
+    else
+        return 0;
+}
+
+static int get_comp_index(uint32_t code, const Reindex *idx, size_t len)
+{
+    Reindex *res;
+    Reindex r = {0, 0, 0};
+    r.start = code;
+    res = (Reindex *) bsearch(&r, idx, len, sizeof(Reindex), compare_reindex);
+
+    if (res != NULL)
+        return res->index + (code - res->start);
+    else
+        return -1;
 }
 
 static int compare_mp(const void *a, const void *b)
 }
 
 static int compare_mp(const void *a, const void *b)
@@ -127,8 +136,8 @@ static BracketPair *search_bp(uint32_t code)
     BracketPair *res;
 
     bp.from = code;
     BracketPair *res;
 
     bp.from = code;
-    res = bsearch(&bp, bracket_pairs, BIDI_BRACKET_LEN, sizeof(BracketPair),
-            compare_bp);
+    res = (BracketPair *) bsearch(&bp, bracket_pairs, BIDI_BRACKET_LEN,
+                                 sizeof(BracketPair), compare_bp);
     return res;
 }
 
     return res;
 }
 
@@ -154,23 +163,18 @@ static int hangul_pair_decompose(uint32_t code, uint32_t *a, uint32_t *b)
 
 static int hangul_pair_compose(uint32_t *code, uint32_t a, uint32_t b)
 {
 
 static int hangul_pair_compose(uint32_t *code, uint32_t a, uint32_t b)
 {
-    if (b < VBASE || b >= (TBASE + TCOUNT))
-        return 0;
-
-    if ((a < LBASE || a >= (LBASE + LCOUNT))
-            && (a < SBASE || a >= (SBASE + SCOUNT)))
-        return 0;
-
-    if (a >= SBASE) {
+    if (a >= SBASE && a < (SBASE + SCOUNT) && b >= TBASE && b < (TBASE + TCOUNT)) {
         /* LV,T */
         *code = a + (b - TBASE);
         return 3;
         /* LV,T */
         *code = a + (b - TBASE);
         return 3;
-    } else {
+    } else if (a >= LBASE && a < (LBASE + LCOUNT) && b >= VBASE && b < (VBASE + VCOUNT)) {
         /* L,V */
         int li = a - LBASE;
         int vi = b - VBASE;
         *code = SBASE + li * NCOUNT + vi * TCOUNT;
         return 2;
         /* L,V */
         int li = a - LBASE;
         int vi = b - VBASE;
         *code = SBASE + li * NCOUNT + vi * TCOUNT;
         return 2;
+    } else {
+        return 0;
     }
 }
 
     }
 }
 
@@ -178,7 +182,7 @@ static uint32_t decode_utf16(const unsigned short **code_ptr)
 {
     const unsigned short *code = *code_ptr;
 
 {
     const unsigned short *code = *code_ptr;
 
-    if ((code[0] & 0xd800) != 0xd800) {
+    if (code[0] < 0xd800 || code[0] > 0xdc00) {
         *code_ptr += 1;
         return (uint32_t)code[0];
     } else {
         *code_ptr += 1;
         return (uint32_t)code[0];
     } else {
@@ -215,7 +219,7 @@ int ucdn_get_bidi_class(uint32_t code)
 
 int ucdn_get_mirrored(uint32_t code)
 {
 
 int ucdn_get_mirrored(uint32_t code)
 {
-    return get_ucd_record(code)->mirrored;
+    return ucdn_mirror(code) != code;
 }
 
 int ucdn_get_script(uint32_t code)
 }
 
 int ucdn_get_script(uint32_t code)
@@ -264,12 +268,9 @@ uint32_t ucdn_mirror(uint32_t code)
     MirrorPair mp = {0};
     MirrorPair *res;
 
     MirrorPair mp = {0};
     MirrorPair *res;
 
-    if (get_ucd_record(code)->mirrored == 0)
-        return code;
-
     mp.from = code;
     mp.from = code;
-    res = bsearch(&mp, mirror_pairs, BIDI_MIRROR_LEN, sizeof(MirrorPair),
-            compare_mp);
+    res = (MirrorPair *) bsearch(&mp, mirror_pairs, BIDI_MIRROR_LEN,
+                                sizeof(MirrorPair), compare_mp);
 
     if (res == NULL)
         return code;
 
     if (res == NULL)
         return code;
@@ -326,8 +327,8 @@ int ucdn_compose(uint32_t *code, uint32_t a, uint32_t b)
     if (hangul_pair_compose(code, a, b))
         return 1;
 
     if (hangul_pair_compose(code, a, b))
         return 1;
 
-    l = get_comp_index(a, nfc_first);
-    r = get_comp_index(b, nfc_last);
+    l = get_comp_index(a, nfc_first, sizeof(nfc_first) / sizeof(Reindex));
+    r = get_comp_index(b, nfc_last, sizeof(nfc_last) / sizeof(Reindex));
 
     if (l < 0 || r < 0)
         return 0;
 
     if (l < 0 || r < 0)
         return 0;
index f694dc5..2d5fc35 100644 (file)
 
 HB_BEGIN_HEADER
 
 
 HB_BEGIN_HEADER
 
-#if !defined (HB_DONT_DEFINE_STDINT)
-
 #if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \
     defined (_sgi) || defined (__sun) || defined (sun) || \
     defined (__digital__) || defined (__HP_cc)
 #  include <inttypes.h>
 #elif defined (_AIX)
 #  include <sys/inttypes.h>
 #if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \
     defined (_sgi) || defined (__sun) || defined (sun) || \
     defined (__digital__) || defined (__HP_cc)
 #  include <inttypes.h>
 #elif defined (_AIX)
 #  include <sys/inttypes.h>
-/* VS 2010 (_MSC_VER 1600) has stdint.h */
-#elif defined (_MSC_VER) && _MSC_VER < 1600
-typedef __int8 int8_t;
-typedef unsigned __int8 uint8_t;
-typedef __int16 int16_t;
-typedef unsigned __int16 uint16_t;
-typedef __int32 int32_t;
-typedef unsigned __int32 uint32_t;
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
 #else
 #  include <stdint.h>
 #endif
 
 #else
 #  include <stdint.h>
 #endif
 
-#endif
-
 
 #define UCDN_EAST_ASIAN_F 0
 #define UCDN_EAST_ASIAN_H 1
 
 #define UCDN_EAST_ASIAN_F 0
 #define UCDN_EAST_ASIAN_H 1
@@ -206,6 +192,10 @@ typedef unsigned __int64 uint64_t;
 #define UCDN_SCRIPT_NEWA 135
 #define UCDN_SCRIPT_OSAGE 136
 #define UCDN_SCRIPT_TANGUT 137
 #define UCDN_SCRIPT_NEWA 135
 #define UCDN_SCRIPT_OSAGE 136
 #define UCDN_SCRIPT_TANGUT 137
+#define UCDN_SCRIPT_MASARAM_GONDI 138
+#define UCDN_SCRIPT_NUSHU 139
+#define UCDN_SCRIPT_SOYOMBO 140
+#define UCDN_SCRIPT_ZANABAZAR_SQUARE 141
 
 #define UCDN_LINEBREAK_CLASS_OP 0
 #define UCDN_LINEBREAK_CLASS_CL 1
 
 #define UCDN_LINEBREAK_CLASS_OP 0
 #define UCDN_LINEBREAK_CLASS_CL 1
@@ -247,6 +237,9 @@ typedef unsigned __int64 uint64_t;
 #define UCDN_LINEBREAK_CLASS_SG 37
 #define UCDN_LINEBREAK_CLASS_SP 38
 #define UCDN_LINEBREAK_CLASS_XX 39
 #define UCDN_LINEBREAK_CLASS_SG 37
 #define UCDN_LINEBREAK_CLASS_SP 38
 #define UCDN_LINEBREAK_CLASS_XX 39
+#define UCDN_LINEBREAK_CLASS_ZWJ 40
+#define UCDN_LINEBREAK_CLASS_EB 41
+#define UCDN_LINEBREAK_CLASS_EM 42
 
 #define UCDN_GENERAL_CATEGORY_CC 0
 #define UCDN_GENERAL_CATEGORY_CF 1
 
 #define UCDN_GENERAL_CATEGORY_CC 0
 #define UCDN_GENERAL_CATEGORY_CF 1
similarity index 64%
rename from src/hb-ucdn/unicodedata_db.h
rename to src/hb-ucdn/ucdn_db.h
index c9cd59b..8d2d8de 100644 (file)
 /* this file was generated by makeunicodedata.py 3.2 */
 
 /* this file was generated by makeunicodedata.py 3.2 */
 
-#define UNIDATA_VERSION "9.0.0"
+#define UNIDATA_VERSION "10.0.0"
 /* a list of unique database records */
 static const UCDRecord ucd_records[] = {
 /* a list of unique database records */
 static const UCDRecord ucd_records[] = {
-    {2, 0, 18, 0, 5, 102, 41},
-    {0, 0, 14, 0, 5, 0, 21},
-    {0, 0, 16, 0, 5, 0, 17},
-    {0, 0, 15, 0, 5, 0, 35},
-    {0, 0, 16, 0, 5, 0, 30},
-    {0, 0, 17, 0, 5, 0, 30},
-    {0, 0, 15, 0, 5, 0, 33},
-    {0, 0, 15, 0, 5, 0, 21},
-    {0, 0, 16, 0, 5, 0, 21},
-    {29, 0, 17, 0, 3, 0, 40},
-    {21, 0, 18, 0, 3, 0, 6},
-    {21, 0, 18, 0, 3, 0, 3},
-    {21, 0, 10, 0, 3, 0, 12},
-    {23, 0, 10, 0, 3, 0, 9},
-    {21, 0, 10, 0, 3, 0, 10},
-    {21, 0, 18, 0, 3, 0, 12},
-    {22, 0, 18, 1, 3, 0, 0},
-    {18, 0, 18, 1, 3, 0, 2},
-    {25, 0, 9, 0, 3, 0, 9},
-    {21, 0, 12, 0, 3, 0, 8},
-    {17, 0, 9, 0, 3, 0, 16},
-    {21, 0, 12, 0, 3, 0, 7},
-    {13, 0, 8, 0, 3, 0, 11},
-    {21, 0, 18, 0, 3, 0, 8},
-    {25, 0, 18, 1, 3, 0, 12},
-    {25, 0, 18, 0, 3, 0, 12},
-    {9, 0, 0, 0, 3, 1, 12},
-    {21, 0, 18, 0, 3, 0, 9},
-    {24, 0, 18, 0, 3, 0, 12},
-    {16, 0, 18, 0, 3, 0, 12},
-    {5, 0, 0, 0, 3, 1, 12},
-    {25, 0, 18, 0, 3, 0, 17},
-    {18, 0, 18, 1, 3, 0, 1},
-    {0, 0, 15, 0, 5, 0, 36},
-    {29, 0, 12, 0, 5, 0, 4},
-    {21, 0, 18, 0, 4, 0, 0},
-    {23, 0, 10, 0, 3, 0, 10},
-    {23, 0, 10, 0, 4, 0, 9},
-    {26, 0, 18, 0, 3, 0, 12},
-    {21, 0, 18, 0, 4, 0, 29},
-    {24, 0, 18, 0, 4, 0, 29},
-    {26, 0, 18, 0, 5, 0, 12},
-    {7, 0, 0, 0, 4, 1, 29},
-    {20, 0, 18, 1, 5, 0, 3},
-    {1, 0, 14, 0, 4, 0, 17},
-    {26, 0, 18, 0, 4, 0, 12},
-    {26, 0, 10, 0, 4, 0, 10},
-    {25, 0, 10, 0, 4, 0, 9},
-    {15, 0, 8, 0, 4, 0, 29},
-    {24, 0, 18, 0, 4, 0, 18},
-    {5, 0, 0, 0, 5, 0, 12},
-    {19, 0, 18, 1, 5, 0, 3},
-    {15, 0, 18, 0, 4, 0, 29},
-    {9, 0, 0, 0, 5, 1, 12},
-    {9, 0, 0, 0, 4, 1, 12},
-    {25, 0, 18, 0, 4, 0, 29},
-    {5, 0, 0, 0, 4, 1, 12},
-    {5, 0, 0, 0, 5, 1, 12},
-    {7, 0, 0, 0, 5, 1, 12},
-    {8, 0, 0, 0, 5, 1, 12},
-    {6, 0, 0, 0, 5, 1, 12},
-    {6, 0, 18, 0, 5, 0, 12},
-    {6, 0, 0, 0, 5, 0, 12},
-    {24, 0, 18, 0, 5, 0, 12},
-    {24, 0, 18, 0, 4, 0, 12},
-    {6, 0, 18, 0, 4, 0, 29},
-    {6, 0, 18, 0, 5, 0, 18},
-    {6, 0, 0, 0, 4, 0, 29},
-    {24, 0, 18, 0, 5, 34, 12},
-    {12, 230, 13, 0, 4, 40, 21},
-    {12, 232, 13, 0, 4, 40, 21},
-    {12, 220, 13, 0, 4, 40, 21},
-    {12, 216, 13, 0, 4, 40, 21},
-    {12, 202, 13, 0, 4, 40, 21},
-    {12, 1, 13, 0, 4, 40, 21},
-    {12, 240, 13, 0, 4, 40, 21},
-    {12, 0, 13, 0, 4, 40, 4},
-    {12, 233, 13, 0, 4, 40, 4},
-    {12, 234, 13, 0, 4, 40, 4},
-    {9, 0, 0, 0, 5, 2, 12},
-    {5, 0, 0, 0, 5, 2, 12},
-    {24, 0, 18, 0, 5, 2, 12},
-    {2, 0, 18, 0, 5, 102, 41},
-    {6, 0, 0, 0, 5, 2, 12},
-    {21, 0, 18, 0, 5, 0, 8},
-    {21, 0, 18, 0, 5, 0, 12},
-    {9, 0, 0, 0, 4, 2, 12},
-    {5, 0, 0, 0, 4, 2, 12},
-    {9, 0, 0, 0, 5, 54, 12},
-    {5, 0, 0, 0, 5, 54, 12},
-    {25, 0, 18, 0, 5, 2, 12},
-    {9, 0, 0, 0, 5, 3, 12},
-    {9, 0, 0, 0, 4, 3, 12},
-    {5, 0, 0, 0, 4, 3, 12},
-    {5, 0, 0, 0, 5, 3, 12},
-    {26, 0, 0, 0, 5, 3, 12},
-    {12, 230, 13, 0, 5, 3, 21},
-    {12, 230, 13, 0, 5, 40, 21},
-    {11, 0, 13, 0, 5, 3, 21},
-    {9, 0, 0, 0, 5, 4, 12},
-    {6, 0, 0, 0, 5, 4, 12},
-    {21, 0, 0, 0, 5, 4, 12},
-    {5, 0, 0, 0, 5, 4, 12},
-    {21, 0, 0, 0, 5, 0, 8},
-    {17, 0, 18, 0, 5, 4, 17},
-    {26, 0, 18, 0, 5, 4, 12},
-    {23, 0, 10, 0, 5, 4, 9},
-    {12, 220, 13, 0, 5, 5, 21},
-    {12, 230, 13, 0, 5, 5, 21},
-    {12, 222, 13, 0, 5, 5, 21},
-    {12, 228, 13, 0, 5, 5, 21},
-    {12, 10, 13, 0, 5, 5, 21},
-    {12, 11, 13, 0, 5, 5, 21},
-    {12, 12, 13, 0, 5, 5, 21},
-    {12, 13, 13, 0, 5, 5, 21},
-    {12, 14, 13, 0, 5, 5, 21},
-    {12, 15, 13, 0, 5, 5, 21},
-    {12, 16, 13, 0, 5, 5, 21},
-    {12, 17, 13, 0, 5, 5, 21},
-    {12, 18, 13, 0, 5, 5, 21},
-    {12, 19, 13, 0, 5, 5, 21},
-    {12, 20, 13, 0, 5, 5, 21},
-    {12, 21, 13, 0, 5, 5, 21},
-    {12, 22, 13, 0, 5, 5, 21},
-    {17, 0, 3, 0, 5, 5, 17},
-    {12, 23, 13, 0, 5, 5, 21},
-    {21, 0, 3, 0, 5, 5, 12},
-    {12, 24, 13, 0, 5, 5, 21},
-    {12, 25, 13, 0, 5, 5, 21},
-    {21, 0, 3, 0, 5, 5, 6},
-    {7, 0, 3, 0, 5, 5, 13},
-    {1, 0, 11, 0, 5, 6, 12},
-    {1, 0, 11, 0, 5, 0, 12},
-    {25, 0, 18, 0, 5, 6, 12},
-    {25, 0, 4, 0, 5, 6, 12},
-    {21, 0, 10, 0, 5, 6, 10},
-    {23, 0, 4, 0, 5, 6, 10},
-    {21, 0, 12, 0, 5, 0, 8},
-    {21, 0, 4, 0, 5, 6, 8},
-    {26, 0, 18, 0, 5, 6, 12},
-    {12, 230, 13, 0, 5, 6, 21},
-    {12, 30, 13, 0, 5, 6, 21},
-    {12, 31, 13, 0, 5, 6, 21},
-    {12, 32, 13, 0, 5, 6, 21},
-    {21, 0, 4, 0, 5, 0, 6},
-    {1, 0, 4, 0, 5, 0, 21},
-    {21, 0, 4, 0, 5, 6, 6},
-    {7, 0, 4, 0, 5, 6, 12},
-    {6, 0, 4, 0, 5, 0, 12},
-    {12, 27, 13, 0, 5, 40, 21},
-    {12, 28, 13, 0, 5, 40, 21},
-    {12, 29, 13, 0, 5, 40, 21},
-    {12, 30, 13, 0, 5, 40, 21},
-    {12, 31, 13, 0, 5, 40, 21},
-    {12, 32, 13, 0, 5, 40, 21},
-    {12, 33, 13, 0, 5, 40, 21},
-    {12, 34, 13, 0, 5, 40, 21},
-    {12, 220, 13, 0, 5, 40, 21},
-    {12, 220, 13, 0, 5, 6, 21},
-    {13, 0, 11, 0, 5, 6, 11},
-    {21, 0, 11, 0, 5, 6, 11},
-    {21, 0, 4, 0, 5, 6, 12},
-    {12, 35, 13, 0, 5, 40, 21},
-    {6, 0, 4, 0, 5, 6, 12},
-    {13, 0, 8, 0, 5, 6, 11},
-    {26, 0, 4, 0, 5, 6, 12},
-    {21, 0, 4, 0, 5, 7, 12},
-    {1, 0, 4, 0, 5, 7, 12},
-    {7, 0, 4, 0, 5, 7, 12},
-    {12, 36, 13, 0, 5, 7, 21},
-    {12, 230, 13, 0, 5, 7, 21},
-    {12, 220, 13, 0, 5, 7, 21},
-    {7, 0, 4, 0, 5, 8, 12},
-    {12, 0, 13, 0, 5, 8, 21},
-    {13, 0, 3, 0, 5, 65, 11},
-    {7, 0, 3, 0, 5, 65, 12},
-    {12, 230, 13, 0, 5, 65, 21},
-    {12, 220, 13, 0, 5, 65, 21},
-    {6, 0, 3, 0, 5, 65, 12},
-    {26, 0, 18, 0, 5, 65, 12},
-    {21, 0, 18, 0, 5, 65, 12},
-    {21, 0, 18, 0, 5, 65, 8},
-    {21, 0, 18, 0, 5, 65, 6},
-    {7, 0, 3, 0, 5, 81, 12},
-    {12, 230, 13, 0, 5, 81, 21},
-    {6, 0, 3, 0, 5, 81, 12},
-    {21, 0, 3, 0, 5, 81, 12},
-    {7, 0, 3, 0, 5, 94, 12},
-    {12, 220, 13, 0, 5, 94, 21},
-    {21, 0, 3, 0, 5, 94, 12},
-    {12, 27, 13, 0, 5, 6, 21},
-    {12, 28, 13, 0, 5, 6, 21},
-    {12, 29, 13, 0, 5, 6, 21},
-    {12, 0, 13, 0, 5, 9, 21},
-    {10, 0, 0, 0, 5, 9, 21},
-    {7, 0, 0, 0, 5, 9, 12},
-    {12, 7, 13, 0, 5, 9, 21},
-    {12, 9, 13, 0, 5, 9, 21},
-    {12, 230, 13, 0, 5, 9, 21},
-    {21, 0, 0, 0, 5, 0, 17},
-    {13, 0, 0, 0, 5, 9, 11},
-    {21, 0, 0, 0, 5, 9, 12},
-    {6, 0, 0, 0, 5, 9, 12},
-    {7, 0, 0, 0, 5, 10, 12},
-    {12, 0, 13, 0, 5, 10, 21},
-    {10, 0, 0, 0, 5, 10, 21},
-    {12, 7, 13, 0, 5, 10, 21},
-    {12, 9, 13, 0, 5, 10, 21},
-    {13, 0, 0, 0, 5, 10, 11},
-    {23, 0, 10, 0, 5, 10, 10},
-    {15, 0, 0, 0, 5, 10, 12},
-    {15, 0, 0, 0, 5, 10, 10},
-    {26, 0, 0, 0, 5, 10, 12},
-    {23, 0, 10, 0, 5, 10, 9},
-    {12, 0, 13, 0, 5, 11, 21},
-    {10, 0, 0, 0, 5, 11, 21},
-    {7, 0, 0, 0, 5, 11, 12},
-    {12, 7, 13, 0, 5, 11, 21},
-    {12, 9, 13, 0, 5, 11, 21},
-    {13, 0, 0, 0, 5, 11, 11},
-    {12, 0, 13, 0, 5, 12, 21},
-    {10, 0, 0, 0, 5, 12, 21},
-    {7, 0, 0, 0, 5, 12, 12},
-    {12, 7, 13, 0, 5, 12, 21},
-    {12, 9, 13, 0, 5, 12, 21},
-    {13, 0, 0, 0, 5, 12, 11},
-    {21, 0, 0, 0, 5, 12, 12},
-    {23, 0, 10, 0, 5, 12, 9},
-    {12, 0, 13, 0, 5, 13, 21},
-    {10, 0, 0, 0, 5, 13, 21},
-    {7, 0, 0, 0, 5, 13, 12},
-    {12, 7, 13, 0, 5, 13, 21},
-    {12, 9, 13, 0, 5, 13, 21},
-    {13, 0, 0, 0, 5, 13, 11},
-    {26, 0, 0, 0, 5, 13, 12},
-    {15, 0, 0, 0, 5, 13, 12},
-    {12, 0, 13, 0, 5, 14, 21},
-    {7, 0, 0, 0, 5, 14, 12},
-    {10, 0, 0, 0, 5, 14, 21},
-    {12, 9, 13, 0, 5, 14, 21},
-    {13, 0, 0, 0, 5, 14, 11},
-    {15, 0, 0, 0, 5, 14, 12},
-    {26, 0, 18, 0, 5, 14, 12},
-    {23, 0, 10, 0, 5, 14, 9},
-    {12, 0, 13, 0, 5, 15, 21},
-    {10, 0, 0, 0, 5, 15, 21},
-    {7, 0, 0, 0, 5, 15, 12},
-    {12, 9, 13, 0, 5, 15, 21},
-    {12, 84, 13, 0, 5, 15, 21},
-    {12, 91, 13, 0, 5, 15, 21},
-    {13, 0, 0, 0, 5, 15, 11},
-    {15, 0, 18, 0, 5, 15, 12},
-    {26, 0, 0, 0, 5, 15, 12},
-    {7, 0, 0, 0, 5, 16, 12},
-    {12, 0, 13, 0, 5, 16, 21},
-    {10, 0, 0, 0, 5, 16, 21},
-    {12, 7, 13, 0, 5, 16, 21},
-    {12, 0, 0, 0, 5, 16, 21},
-    {12, 9, 13, 0, 5, 16, 21},
-    {13, 0, 0, 0, 5, 16, 11},
-    {12, 0, 13, 0, 5, 17, 21},
-    {10, 0, 0, 0, 5, 17, 21},
-    {7, 0, 0, 0, 5, 17, 12},
-    {12, 9, 13, 0, 5, 17, 21},
-    {26, 0, 0, 0, 5, 17, 12},
-    {15, 0, 0, 0, 5, 17, 12},
-    {13, 0, 0, 0, 5, 17, 11},
-    {26, 0, 0, 0, 5, 17, 10},
-    {10, 0, 0, 0, 5, 18, 21},
-    {7, 0, 0, 0, 5, 18, 12},
-    {12, 9, 13, 0, 5, 18, 21},
-    {12, 0, 13, 0, 5, 18, 21},
-    {13, 0, 0, 0, 5, 18, 11},
-    {21, 0, 0, 0, 5, 18, 12},
-    {7, 0, 0, 0, 5, 19, 38},
-    {12, 0, 13, 0, 5, 19, 38},
-    {12, 103, 13, 0, 5, 19, 38},
-    {12, 9, 13, 0, 5, 19, 38},
-    {23, 0, 10, 0, 5, 0, 9},
-    {6, 0, 0, 0, 5, 19, 38},
-    {12, 107, 13, 0, 5, 19, 38},
-    {21, 0, 0, 0, 5, 19, 12},
-    {13, 0, 0, 0, 5, 19, 11},
-    {21, 0, 0, 0, 5, 19, 17},
-    {7, 0, 0, 0, 5, 20, 38},
-    {12, 0, 13, 0, 5, 20, 38},
-    {12, 118, 13, 0, 5, 20, 38},
-    {6, 0, 0, 0, 5, 20, 38},
-    {12, 122, 13, 0, 5, 20, 38},
-    {13, 0, 0, 0, 5, 20, 11},
-    {7, 0, 0, 0, 5, 21, 12},
-    {26, 0, 0, 0, 5, 21, 18},
-    {21, 0, 0, 0, 5, 21, 18},
-    {21, 0, 0, 0, 5, 21, 12},
-    {21, 0, 0, 0, 5, 21, 4},
-    {21, 0, 0, 0, 5, 21, 17},
-    {21, 0, 0, 0, 5, 21, 6},
-    {26, 0, 0, 0, 5, 21, 12},
-    {12, 220, 13, 0, 5, 21, 21},
-    {13, 0, 0, 0, 5, 21, 11},
-    {15, 0, 0, 0, 5, 21, 12},
-    {26, 0, 0, 0, 5, 21, 17},
-    {12, 216, 13, 0, 5, 21, 21},
-    {22, 0, 18, 1, 5, 21, 0},
-    {18, 0, 18, 1, 5, 21, 1},
-    {10, 0, 0, 0, 5, 21, 21},
-    {12, 129, 13, 0, 5, 21, 21},
-    {12, 130, 13, 0, 5, 21, 21},
-    {12, 0, 13, 0, 5, 21, 21},
-    {12, 132, 13, 0, 5, 21, 21},
-    {10, 0, 0, 0, 5, 21, 17},
-    {12, 230, 13, 0, 5, 21, 21},
-    {12, 9, 13, 0, 5, 21, 21},
-    {26, 0, 0, 0, 5, 0, 12},
-    {7, 0, 0, 0, 5, 22, 38},
-    {10, 0, 0, 0, 5, 22, 38},
-    {12, 0, 13, 0, 5, 22, 38},
-    {12, 7, 13, 0, 5, 22, 38},
-    {12, 9, 13, 0, 5, 22, 38},
-    {13, 0, 0, 0, 5, 22, 11},
-    {21, 0, 0, 0, 5, 22, 17},
-    {21, 0, 0, 0, 5, 22, 12},
-    {12, 220, 13, 0, 5, 22, 38},
-    {26, 0, 0, 0, 5, 22, 38},
-    {9, 0, 0, 0, 5, 23, 12},
-    {7, 0, 0, 0, 5, 23, 12},
-    {21, 0, 0, 0, 5, 0, 12},
-    {6, 0, 0, 0, 5, 23, 12},
-    {7, 0, 0, 0, 2, 24, 25},
-    {7, 0, 0, 0, 5, 24, 26},
-    {7, 0, 0, 0, 5, 24, 27},
-    {7, 0, 0, 0, 5, 25, 12},
-    {12, 230, 13, 0, 5, 25, 21},
-    {21, 0, 0, 0, 5, 25, 12},
-    {21, 0, 0, 0, 5, 25, 17},
-    {15, 0, 0, 0, 5, 25, 12},
-    {26, 0, 18, 0, 5, 25, 12},
-    {9, 0, 0, 0, 5, 26, 12},
-    {5, 0, 0, 0, 5, 26, 12},
-    {17, 0, 18, 0, 5, 27, 17},
-    {7, 0, 0, 0, 5, 27, 12},
-    {21, 0, 0, 0, 5, 27, 12},
-    {29, 0, 17, 0, 5, 28, 17},
-    {7, 0, 0, 0, 5, 28, 12},
-    {22, 0, 18, 1, 5, 28, 0},
-    {18, 0, 18, 1, 5, 28, 1},
-    {7, 0, 0, 0, 5, 29, 12},
-    {14, 0, 0, 0, 5, 29, 12},
-    {7, 0, 0, 0, 5, 41, 12},
-    {12, 0, 13, 0, 5, 41, 21},
-    {12, 9, 13, 0, 5, 41, 21},
-    {7, 0, 0, 0, 5, 42, 12},
-    {12, 0, 13, 0, 5, 42, 21},
-    {12, 9, 13, 0, 5, 42, 21},
-    {7, 0, 0, 0, 5, 43, 12},
-    {12, 0, 13, 0, 5, 43, 21},
-    {7, 0, 0, 0, 5, 44, 12},
-    {12, 0, 13, 0, 5, 44, 21},
-    {7, 0, 0, 0, 5, 30, 38},
-    {12, 0, 13, 0, 5, 30, 38},
-    {10, 0, 0, 0, 5, 30, 38},
-    {12, 9, 13, 0, 5, 30, 38},
-    {21, 0, 0, 0, 5, 30, 17},
-    {21, 0, 0, 0, 5, 30, 5},
-    {6, 0, 0, 0, 5, 30, 38},
-    {21, 0, 0, 0, 5, 30, 12},
-    {23, 0, 10, 0, 5, 30, 9},
-    {12, 230, 13, 0, 5, 30, 38},
-    {13, 0, 0, 0, 5, 30, 11},
-    {15, 0, 18, 0, 5, 30, 12},
-    {21, 0, 18, 0, 5, 31, 12},
-    {21, 0, 18, 0, 5, 0, 6},
-    {21, 0, 18, 0, 5, 31, 17},
-    {21, 0, 18, 0, 5, 0, 17},
-    {17, 0, 18, 0, 5, 31, 18},
-    {21, 0, 18, 0, 5, 31, 6},
-    {12, 0, 13, 0, 5, 31, 21},
-    {1, 0, 14, 0, 5, 31, 4},
-    {13, 0, 0, 0, 5, 31, 11},
-    {7, 0, 0, 0, 5, 31, 12},
-    {6, 0, 0, 0, 5, 31, 12},
-    {12, 228, 13, 0, 5, 31, 21},
-    {7, 0, 0, 0, 5, 45, 12},
-    {12, 0, 13, 0, 5, 45, 21},
-    {10, 0, 0, 0, 5, 45, 21},
-    {12, 222, 13, 0, 5, 45, 21},
-    {12, 230, 13, 0, 5, 45, 21},
-    {12, 220, 13, 0, 5, 45, 21},
-    {26, 0, 18, 0, 5, 45, 12},
-    {21, 0, 18, 0, 5, 45, 6},
-    {13, 0, 0, 0, 5, 45, 11},
-    {7, 0, 0, 0, 5, 46, 38},
-    {7, 0, 0, 0, 5, 55, 38},
-    {13, 0, 0, 0, 5, 55, 11},
-    {15, 0, 0, 0, 5, 55, 38},
-    {26, 0, 18, 0, 5, 55, 38},
-    {26, 0, 18, 0, 5, 30, 12},
-    {7, 0, 0, 0, 5, 53, 12},
-    {12, 230, 13, 0, 5, 53, 21},
-    {12, 220, 13, 0, 5, 53, 21},
-    {10, 0, 0, 0, 5, 53, 21},
-    {12, 0, 13, 0, 5, 53, 21},
-    {21, 0, 0, 0, 5, 53, 12},
-    {7, 0, 0, 0, 5, 77, 38},
-    {10, 0, 0, 0, 5, 77, 38},
-    {12, 0, 13, 0, 5, 77, 38},
-    {12, 9, 13, 0, 5, 77, 38},
-    {12, 230, 13, 0, 5, 77, 38},
-    {12, 220, 13, 0, 5, 77, 21},
-    {13, 0, 0, 0, 5, 77, 11},
-    {21, 0, 0, 0, 5, 77, 38},
-    {6, 0, 0, 0, 5, 77, 38},
-    {11, 0, 13, 0, 5, 40, 21},
-    {12, 0, 13, 0, 5, 61, 21},
-    {10, 0, 0, 0, 5, 61, 21},
-    {7, 0, 0, 0, 5, 61, 12},
-    {12, 7, 13, 0, 5, 61, 21},
-    {10, 9, 0, 0, 5, 61, 21},
-    {13, 0, 0, 0, 5, 61, 11},
-    {21, 0, 0, 0, 5, 61, 17},
-    {21, 0, 0, 0, 5, 61, 12},
-    {26, 0, 0, 0, 5, 61, 12},
-    {12, 230, 13, 0, 5, 61, 21},
-    {12, 220, 13, 0, 5, 61, 21},
-    {12, 0, 13, 0, 5, 66, 21},
-    {10, 0, 0, 0, 5, 66, 21},
-    {7, 0, 0, 0, 5, 66, 12},
-    {10, 9, 0, 0, 5, 66, 21},
-    {12, 9, 13, 0, 5, 66, 21},
-    {13, 0, 0, 0, 5, 66, 11},
-    {7, 0, 0, 0, 5, 92, 12},
-    {12, 7, 13, 0, 5, 92, 21},
-    {10, 0, 0, 0, 5, 92, 21},
-    {12, 0, 13, 0, 5, 92, 21},
-    {10, 9, 0, 0, 5, 92, 21},
-    {21, 0, 0, 0, 5, 92, 12},
-    {7, 0, 0, 0, 5, 67, 12},
-    {10, 0, 0, 0, 5, 67, 21},
-    {12, 0, 13, 0, 5, 67, 21},
-    {12, 7, 13, 0, 5, 67, 21},
-    {21, 0, 0, 0, 5, 67, 17},
-    {13, 0, 0, 0, 5, 67, 11},
-    {13, 0, 0, 0, 5, 68, 11},
-    {7, 0, 0, 0, 5, 68, 12},
-    {6, 0, 0, 0, 5, 68, 12},
-    {21, 0, 0, 0, 5, 68, 17},
-    {21, 0, 0, 0, 5, 66, 12},
-    {12, 1, 13, 0, 5, 40, 21},
-    {10, 0, 0, 0, 5, 0, 21},
-    {7, 0, 0, 0, 5, 0, 12},
-    {6, 0, 0, 0, 5, 3, 12},
-    {12, 234, 13, 0, 5, 40, 21},
-    {12, 214, 13, 0, 5, 40, 21},
-    {12, 202, 13, 0, 5, 40, 21},
-    {12, 233, 13, 0, 5, 40, 21},
-    {8, 0, 0, 0, 5, 2, 12},
-    {24, 0, 18, 0, 5, 2, 18},
-    {29, 0, 17, 0, 5, 0, 17},
-    {29, 0, 17, 0, 5, 0, 4},
-    {1, 0, 14, 0, 5, 0, 20},
-    {1, 0, 14, 0, 5, 40, 21},
-    {1, 0, 14, 0, 5, 40, 41},
-    {1, 0, 0, 0, 5, 0, 21},
-    {1, 0, 3, 0, 5, 0, 21},
-    {17, 0, 18, 0, 4, 0, 17},
-    {17, 0, 18, 0, 5, 0, 4},
-    {17, 0, 18, 0, 5, 0, 17},
-    {17, 0, 18, 0, 4, 0, 19},
-    {17, 0, 18, 0, 4, 0, 29},
-    {20, 0, 18, 0, 4, 0, 3},
-    {19, 0, 18, 0, 4, 0, 3},
-    {22, 0, 18, 0, 5, 0, 0},
-    {20, 0, 18, 0, 5, 0, 3},
-    {21, 0, 18, 0, 4, 0, 12},
-    {21, 0, 18, 0, 4, 0, 15},
-    {21, 0, 18, 0, 4, 0, 17},
-    {27, 0, 17, 0, 5, 0, 30},
-    {28, 0, 15, 0, 5, 0, 30},
-    {1, 0, 1, 0, 5, 0, 21},
-    {1, 0, 5, 0, 5, 0, 21},
-    {1, 0, 7, 0, 5, 0, 21},
-    {1, 0, 2, 0, 5, 0, 21},
-    {1, 0, 6, 0, 5, 0, 21},
-    {21, 0, 10, 0, 4, 0, 10},
-    {21, 0, 10, 0, 5, 0, 10},
-    {21, 0, 18, 0, 4, 0, 10},
-    {21, 0, 18, 0, 5, 0, 10},
-    {21, 0, 18, 0, 5, 0, 5},
-    {16, 0, 18, 0, 5, 0, 12},
-    {25, 0, 12, 0, 5, 0, 8},
-    {22, 0, 18, 1, 5, 0, 0},
-    {18, 0, 18, 1, 5, 0, 1},
-    {25, 0, 18, 0, 5, 0, 12},
-    {1, 0, 14, 0, 5, 0, 22},
-    {1, 0, 14, 0, 5, 0, 12},
-    {1, 0, 19, 0, 5, 0, 21},
-    {1, 0, 20, 0, 5, 0, 21},
-    {1, 0, 21, 0, 5, 0, 21},
-    {1, 0, 22, 0, 5, 0, 21},
-    {1, 0, 14, 0, 5, 0, 21},
-    {15, 0, 8, 0, 5, 0, 12},
-    {25, 0, 9, 0, 5, 0, 12},
-    {6, 0, 0, 0, 4, 1, 29},
-    {23, 0, 10, 0, 5, 0, 10},
-    {23, 0, 10, 0, 1, 0, 9},
-    {2, 0, 18, 0, 5, 102, 9},
-    {9, 0, 0, 0, 5, 0, 12},
-    {26, 0, 18, 0, 4, 0, 10},
-    {26, 0, 18, 0, 4, 0, 29},
-    {5, 0, 0, 0, 4, 0, 29},
-    {26, 0, 18, 0, 4, 0, 9},
-    {9, 0, 0, 0, 4, 1, 29},
-    {26, 0, 10, 0, 5, 0, 12},
-    {25, 0, 18, 1, 5, 0, 12},
-    {15, 0, 18, 0, 5, 0, 12},
-    {15, 0, 18, 0, 4, 0, 12},
-    {15, 0, 18, 0, 5, 0, 29},
-    {14, 0, 0, 0, 4, 1, 29},
-    {14, 0, 0, 0, 5, 1, 12},
-    {25, 0, 18, 1, 4, 0, 29},
-    {25, 0, 9, 0, 5, 0, 9},
-    {25, 0, 10, 0, 5, 0, 9},
-    {25, 0, 18, 0, 5, 0, 15},
-    {26, 0, 18, 0, 2, 0, 14},
-    {22, 0, 18, 1, 2, 0, 0},
-    {18, 0, 18, 1, 2, 0, 1},
-    {26, 0, 18, 0, 2, 0, 12},
-    {26, 0, 18, 0, 5, 0, 14},
-    {26, 0, 0, 0, 4, 0, 29},
-    {26, 0, 18, 0, 5, 0, 29},
-    {25, 0, 18, 0, 2, 0, 12},
-    {26, 0, 18, 0, 4, 0, 14},
-    {26, 0, 18, 0, 5, 0, 41},
-    {26, 0, 18, 0, 4, 0, 41},
-    {26, 0, 18, 0, 2, 0, 41},
-    {26, 0, 18, 0, 2, 0, 29},
-    {26, 0, 18, 0, 5, 0, 3},
-    {26, 0, 18, 0, 5, 0, 6},
-    {26, 0, 0, 0, 5, 52, 12},
-    {9, 0, 0, 0, 5, 56, 12},
-    {5, 0, 0, 0, 5, 56, 12},
-    {26, 0, 18, 0, 5, 54, 12},
-    {12, 230, 13, 0, 5, 54, 21},
-    {21, 0, 18, 0, 5, 54, 6},
-    {21, 0, 18, 0, 5, 54, 17},
-    {15, 0, 18, 0, 5, 54, 12},
-    {5, 0, 0, 0, 5, 23, 12},
-    {7, 0, 0, 0, 5, 57, 12},
-    {6, 0, 0, 0, 5, 57, 12},
-    {21, 0, 0, 0, 5, 57, 17},
-    {12, 9, 13, 0, 5, 57, 21},
-    {21, 0, 18, 0, 5, 0, 3},
-    {21, 0, 18, 0, 5, 0, 0},
-    {17, 0, 18, 0, 5, 0, 12},
-    {17, 0, 18, 0, 5, 0, 19},
-    {26, 0, 18, 0, 2, 35, 14},
-    {29, 0, 17, 0, 0, 0, 17},
-    {21, 0, 18, 0, 2, 0, 1},
-    {21, 0, 18, 0, 2, 0, 14},
-    {6, 0, 0, 0, 2, 35, 5},
-    {7, 0, 0, 0, 2, 0, 14},
-    {14, 0, 0, 0, 2, 35, 14},
-    {17, 0, 18, 0, 2, 0, 5},
-    {22, 0, 18, 0, 2, 0, 0},
-    {18, 0, 18, 0, 2, 0, 1},
-    {12, 218, 13, 0, 2, 40, 21},
-    {12, 228, 13, 0, 2, 40, 21},
-    {12, 232, 13, 0, 2, 40, 21},
-    {12, 222, 13, 0, 2, 40, 21},
-    {10, 224, 0, 0, 2, 24, 21},
-    {17, 0, 18, 0, 2, 0, 14},
-    {6, 0, 0, 0, 2, 0, 14},
-    {6, 0, 0, 0, 2, 0, 21},
-    {7, 0, 0, 0, 2, 0, 5},
-    {7, 0, 0, 0, 2, 32, 32},
-    {7, 0, 0, 0, 2, 32, 14},
-    {12, 8, 13, 0, 2, 40, 21},
-    {24, 0, 18, 0, 2, 0, 5},
-    {6, 0, 0, 0, 2, 32, 5},
-    {7, 0, 0, 0, 2, 33, 32},
-    {7, 0, 0, 0, 2, 33, 14},
-    {21, 0, 18, 0, 2, 0, 5},
-    {6, 0, 0, 0, 2, 0, 32},
-    {6, 0, 0, 0, 2, 33, 5},
-    {7, 0, 0, 0, 2, 34, 14},
-    {7, 0, 0, 0, 2, 24, 14},
-    {26, 0, 0, 0, 2, 0, 14},
-    {15, 0, 0, 0, 2, 0, 14},
-    {26, 0, 0, 0, 2, 24, 14},
-    {26, 0, 18, 0, 2, 24, 14},
-    {15, 0, 0, 0, 4, 0, 29},
-    {15, 0, 18, 0, 2, 0, 14},
-    {26, 0, 0, 0, 2, 33, 14},
-    {7, 0, 0, 0, 2, 35, 14},
-    {2, 0, 18, 0, 2, 102, 14},
-    {7, 0, 0, 0, 2, 36, 14},
-    {6, 0, 0, 0, 2, 36, 5},
-    {26, 0, 18, 0, 2, 36, 14},
-    {7, 0, 0, 0, 5, 82, 12},
-    {6, 0, 0, 0, 5, 82, 12},
-    {21, 0, 0, 0, 5, 82, 17},
-    {7, 0, 0, 0, 5, 69, 12},
-    {6, 0, 0, 0, 5, 69, 12},
-    {21, 0, 18, 0, 5, 69, 17},
-    {21, 0, 18, 0, 5, 69, 6},
-    {13, 0, 0, 0, 5, 69, 11},
-    {7, 0, 0, 0, 5, 3, 12},
-    {21, 0, 18, 0, 5, 3, 12},
-    {6, 0, 18, 0, 5, 3, 12},
-    {7, 0, 0, 0, 5, 83, 12},
-    {14, 0, 0, 0, 5, 83, 12},
-    {12, 230, 13, 0, 5, 83, 21},
-    {21, 0, 0, 0, 5, 83, 12},
-    {21, 0, 0, 0, 5, 83, 17},
-    {24, 0, 0, 0, 5, 0, 12},
-    {7, 0, 0, 0, 5, 58, 12},
-    {12, 0, 13, 0, 5, 58, 21},
-    {12, 9, 13, 0, 5, 58, 21},
-    {10, 0, 0, 0, 5, 58, 21},
-    {26, 0, 18, 0, 5, 58, 12},
-    {15, 0, 0, 0, 5, 0, 12},
-    {7, 0, 0, 0, 5, 64, 12},
-    {21, 0, 18, 0, 5, 64, 18},
-    {21, 0, 18, 0, 5, 64, 6},
-    {10, 0, 0, 0, 5, 70, 21},
-    {7, 0, 0, 0, 5, 70, 12},
-    {12, 9, 13, 0, 5, 70, 21},
-    {12, 0, 13, 0, 5, 70, 21},
-    {21, 0, 0, 0, 5, 70, 17},
-    {13, 0, 0, 0, 5, 70, 11},
-    {21, 0, 0, 0, 5, 9, 18},
-    {13, 0, 0, 0, 5, 71, 11},
-    {7, 0, 0, 0, 5, 71, 12},
-    {12, 0, 13, 0, 5, 71, 21},
-    {12, 220, 13, 0, 5, 71, 21},
-    {21, 0, 0, 0, 5, 71, 17},
-    {7, 0, 0, 0, 5, 72, 12},
-    {12, 0, 13, 0, 5, 72, 21},
-    {10, 0, 0, 0, 5, 72, 21},
-    {10, 9, 0, 0, 5, 72, 21},
-    {21, 0, 0, 0, 5, 72, 12},
-    {12, 0, 13, 0, 5, 84, 21},
-    {10, 0, 0, 0, 5, 84, 21},
-    {7, 0, 0, 0, 5, 84, 12},
-    {12, 7, 13, 0, 5, 84, 21},
-    {10, 9, 0, 0, 5, 84, 21},
-    {21, 0, 0, 0, 5, 84, 12},
-    {21, 0, 0, 0, 5, 84, 17},
-    {13, 0, 0, 0, 5, 84, 11},
-    {6, 0, 0, 0, 5, 22, 38},
-    {7, 0, 0, 0, 5, 76, 12},
-    {12, 0, 13, 0, 5, 76, 21},
-    {10, 0, 0, 0, 5, 76, 21},
-    {13, 0, 0, 0, 5, 76, 11},
-    {21, 0, 0, 0, 5, 76, 12},
-    {21, 0, 0, 0, 5, 76, 17},
-    {7, 0, 0, 0, 5, 78, 38},
-    {12, 230, 13, 0, 5, 78, 38},
-    {12, 220, 13, 0, 5, 78, 38},
-    {6, 0, 0, 0, 5, 78, 38},
-    {21, 0, 0, 0, 5, 78, 38},
-    {7, 0, 0, 0, 5, 85, 12},
-    {10, 0, 0, 0, 5, 85, 21},
-    {12, 0, 13, 0, 5, 85, 21},
-    {21, 0, 0, 0, 5, 85, 17},
-    {6, 0, 0, 0, 5, 85, 12},
-    {12, 9, 13, 0, 5, 85, 21},
-    {13, 0, 0, 0, 5, 85, 11},
-    {7, 0, 0, 0, 2, 24, 23},
-    {7, 0, 0, 0, 2, 24, 24},
-    {4, 0, 0, 0, 5, 102, 39},
-    {3, 0, 0, 0, 4, 102, 41},
-    {12, 26, 13, 0, 5, 5, 21},
-    {25, 0, 9, 0, 5, 5, 12},
-    {24, 0, 4, 0, 5, 6, 12},
-    {18, 0, 18, 0, 5, 0, 1},
-    {12, 0, 13, 0, 4, 40, 21},
-    {21, 0, 18, 0, 2, 0, 8},
-    {21, 0, 18, 0, 2, 0, 6},
-    {21, 0, 18, 0, 2, 0, 15},
-    {16, 0, 18, 0, 2, 0, 14},
-    {21, 0, 12, 0, 2, 0, 1},
-    {21, 0, 12, 0, 2, 0, 5},
-    {21, 0, 10, 0, 2, 0, 14},
-    {25, 0, 9, 0, 2, 0, 14},
-    {17, 0, 9, 0, 2, 0, 14},
-    {25, 0, 18, 1, 2, 0, 14},
-    {25, 0, 18, 0, 2, 0, 14},
-    {23, 0, 10, 0, 2, 0, 9},
-    {21, 0, 10, 0, 2, 0, 10},
-    {21, 0, 18, 0, 0, 0, 6},
-    {21, 0, 18, 0, 0, 0, 14},
-    {21, 0, 10, 0, 0, 0, 14},
-    {23, 0, 10, 0, 0, 0, 9},
-    {21, 0, 10, 0, 0, 0, 10},
-    {22, 0, 18, 1, 0, 0, 0},
-    {18, 0, 18, 1, 0, 0, 1},
-    {25, 0, 9, 0, 0, 0, 14},
-    {21, 0, 12, 0, 0, 0, 1},
-    {17, 0, 9, 0, 0, 0, 14},
-    {21, 0, 12, 0, 0, 0, 14},
-    {13, 0, 8, 0, 0, 0, 14},
-    {21, 0, 12, 0, 0, 0, 5},
-    {21, 0, 18, 0, 0, 0, 5},
-    {25, 0, 18, 1, 0, 0, 14},
-    {25, 0, 18, 0, 0, 0, 14},
-    {9, 0, 0, 0, 0, 1, 14},
-    {24, 0, 18, 0, 0, 0, 14},
-    {16, 0, 18, 0, 0, 0, 14},
-    {5, 0, 0, 0, 0, 1, 14},
-    {21, 0, 18, 0, 1, 0, 1},
-    {22, 0, 18, 1, 1, 0, 0},
-    {18, 0, 18, 1, 1, 0, 1},
-    {21, 0, 18, 0, 1, 0, 5},
-    {7, 0, 0, 0, 1, 33, 14},
-    {7, 0, 0, 0, 1, 33, 32},
-    {6, 0, 0, 0, 1, 0, 32},
-    {6, 0, 0, 0, 1, 0, 5},
-    {7, 0, 0, 0, 1, 24, 14},
-    {23, 0, 10, 0, 0, 0, 10},
-    {26, 0, 18, 0, 0, 0, 14},
-    {26, 0, 18, 0, 1, 0, 12},
-    {25, 0, 18, 0, 1, 0, 12},
-    {1, 0, 18, 0, 5, 0, 21},
-    {26, 0, 18, 0, 5, 0, 31},
-    {7, 0, 0, 0, 5, 47, 12},
-    {14, 0, 18, 0, 5, 2, 12},
-    {15, 0, 18, 0, 5, 2, 12},
-    {26, 0, 18, 0, 5, 2, 12},
-    {26, 0, 0, 0, 5, 2, 12},
-    {7, 0, 0, 0, 5, 73, 12},
-    {7, 0, 0, 0, 5, 74, 12},
-    {7, 0, 0, 0, 5, 37, 12},
-    {15, 0, 0, 0, 5, 37, 12},
-    {7, 0, 0, 0, 5, 38, 12},
-    {14, 0, 0, 0, 5, 38, 12},
-    {7, 0, 0, 0, 5, 118, 12},
-    {12, 230, 13, 0, 5, 118, 21},
-    {7, 0, 0, 0, 5, 48, 12},
-    {21, 0, 0, 0, 5, 48, 17},
-    {7, 0, 0, 0, 5, 59, 12},
-    {21, 0, 0, 0, 5, 59, 17},
-    {14, 0, 0, 0, 5, 59, 12},
-    {9, 0, 0, 0, 5, 39, 12},
-    {5, 0, 0, 0, 5, 39, 12},
-    {7, 0, 0, 0, 5, 49, 12},
-    {7, 0, 0, 0, 5, 50, 12},
-    {13, 0, 0, 0, 5, 50, 11},
-    {9, 0, 0, 0, 5, 136, 12},
-    {5, 0, 0, 0, 5, 136, 12},
-    {7, 0, 0, 0, 5, 106, 12},
-    {7, 0, 0, 0, 5, 104, 12},
-    {21, 0, 0, 0, 5, 104, 12},
-    {7, 0, 0, 0, 5, 110, 12},
-    {7, 0, 3, 0, 5, 51, 12},
-    {7, 0, 3, 0, 5, 86, 12},
-    {21, 0, 3, 0, 5, 86, 17},
-    {15, 0, 3, 0, 5, 86, 12},
-    {7, 0, 3, 0, 5, 120, 12},
-    {26, 0, 3, 0, 5, 120, 12},
-    {15, 0, 3, 0, 5, 120, 12},
-    {7, 0, 3, 0, 5, 116, 12},
-    {15, 0, 3, 0, 5, 116, 12},
-    {7, 0, 3, 0, 5, 128, 12},
-    {15, 0, 3, 0, 5, 128, 12},
-    {7, 0, 3, 0, 5, 63, 12},
-    {15, 0, 3, 0, 5, 63, 12},
-    {21, 0, 18, 0, 5, 63, 17},
-    {7, 0, 3, 0, 5, 75, 12},
-    {21, 0, 3, 0, 5, 75, 12},
-    {7, 0, 3, 0, 5, 97, 12},
-    {7, 0, 3, 0, 5, 96, 12},
-    {15, 0, 3, 0, 5, 96, 12},
-    {7, 0, 3, 0, 5, 60, 12},
-    {12, 0, 13, 0, 5, 60, 21},
-    {12, 220, 13, 0, 5, 60, 21},
-    {12, 230, 13, 0, 5, 60, 21},
-    {12, 1, 13, 0, 5, 60, 21},
-    {12, 9, 13, 0, 5, 60, 21},
-    {15, 0, 3, 0, 5, 60, 12},
-    {21, 0, 3, 0, 5, 60, 17},
-    {21, 0, 3, 0, 5, 60, 12},
-    {7, 0, 3, 0, 5, 87, 12},
-    {15, 0, 3, 0, 5, 87, 12},
-    {21, 0, 3, 0, 5, 87, 12},
-    {7, 0, 3, 0, 5, 117, 12},
-    {15, 0, 3, 0, 5, 117, 12},
-    {7, 0, 3, 0, 5, 112, 12},
-    {26, 0, 3, 0, 5, 112, 12},
-    {12, 230, 13, 0, 5, 112, 21},
-    {12, 220, 13, 0, 5, 112, 21},
-    {15, 0, 3, 0, 5, 112, 12},
-    {21, 0, 3, 0, 5, 112, 17},
-    {21, 0, 3, 0, 5, 112, 15},
-    {7, 0, 3, 0, 5, 79, 12},
-    {21, 0, 18, 0, 5, 79, 17},
-    {7, 0, 3, 0, 5, 88, 12},
-    {15, 0, 3, 0, 5, 88, 12},
-    {7, 0, 3, 0, 5, 89, 12},
-    {15, 0, 3, 0, 5, 89, 12},
-    {7, 0, 3, 0, 5, 122, 12},
-    {21, 0, 3, 0, 5, 122, 12},
-    {15, 0, 3, 0, 5, 122, 12},
-    {7, 0, 3, 0, 5, 90, 12},
-    {9, 0, 3, 0, 5, 130, 12},
-    {5, 0, 3, 0, 5, 130, 12},
-    {15, 0, 3, 0, 5, 130, 12},
-    {15, 0, 11, 0, 5, 6, 12},
-    {10, 0, 0, 0, 5, 93, 21},
-    {12, 0, 13, 0, 5, 93, 21},
-    {7, 0, 0, 0, 5, 93, 12},
-    {12, 9, 13, 0, 5, 93, 21},
-    {21, 0, 0, 0, 5, 93, 17},
-    {21, 0, 0, 0, 5, 93, 12},
-    {15, 0, 18, 0, 5, 93, 12},
-    {13, 0, 0, 0, 5, 93, 11},
-    {12, 0, 13, 0, 5, 91, 21},
-    {10, 0, 0, 0, 5, 91, 21},
-    {7, 0, 0, 0, 5, 91, 12},
-    {12, 9, 13, 0, 5, 91, 21},
-    {12, 7, 13, 0, 5, 91, 21},
-    {21, 0, 0, 0, 5, 91, 12},
-    {1, 0, 0, 0, 5, 91, 12},
-    {21, 0, 0, 0, 5, 91, 17},
-    {7, 0, 0, 0, 5, 100, 12},
-    {13, 0, 0, 0, 5, 100, 11},
-    {12, 230, 13, 0, 5, 95, 21},
-    {7, 0, 0, 0, 5, 95, 12},
-    {12, 0, 13, 0, 5, 95, 21},
-    {10, 0, 0, 0, 5, 95, 21},
-    {12, 9, 13, 0, 5, 95, 21},
-    {13, 0, 0, 0, 5, 95, 11},
-    {21, 0, 0, 0, 5, 95, 17},
-    {7, 0, 0, 0, 5, 111, 12},
-    {12, 7, 13, 0, 5, 111, 21},
-    {21, 0, 0, 0, 5, 111, 12},
-    {21, 0, 0, 0, 5, 111, 18},
-    {12, 0, 13, 0, 5, 99, 21},
-    {10, 0, 0, 0, 5, 99, 21},
-    {7, 0, 0, 0, 5, 99, 12},
-    {10, 9, 0, 0, 5, 99, 21},
-    {21, 0, 0, 0, 5, 99, 17},
-    {21, 0, 0, 0, 5, 99, 12},
-    {12, 7, 13, 0, 5, 99, 21},
-    {13, 0, 0, 0, 5, 99, 11},
-    {21, 0, 0, 0, 5, 99, 18},
-    {15, 0, 0, 0, 5, 18, 12},
-    {7, 0, 0, 0, 5, 108, 12},
-    {10, 0, 0, 0, 5, 108, 21},
-    {12, 0, 13, 0, 5, 108, 21},
-    {10, 9, 0, 0, 5, 108, 21},
-    {12, 7, 13, 0, 5, 108, 21},
-    {21, 0, 0, 0, 5, 108, 17},
-    {21, 0, 0, 0, 5, 108, 12},
-    {7, 0, 0, 0, 5, 129, 12},
-    {21, 0, 0, 0, 5, 129, 17},
-    {7, 0, 0, 0, 5, 109, 12},
-    {12, 0, 13, 0, 5, 109, 21},
-    {10, 0, 0, 0, 5, 109, 21},
-    {12, 7, 13, 0, 5, 109, 21},
-    {12, 9, 13, 0, 5, 109, 21},
-    {13, 0, 0, 0, 5, 109, 11},
-    {12, 0, 13, 0, 5, 107, 21},
-    {10, 0, 0, 0, 5, 107, 21},
-    {7, 0, 0, 0, 5, 107, 12},
-    {12, 7, 13, 0, 5, 107, 21},
-    {10, 9, 0, 0, 5, 107, 21},
-    {12, 230, 13, 0, 5, 107, 21},
-    {7, 0, 0, 0, 5, 135, 12},
-    {10, 0, 0, 0, 5, 135, 21},
-    {12, 0, 13, 0, 5, 135, 21},
-    {12, 9, 13, 0, 5, 135, 21},
-    {12, 7, 13, 0, 5, 135, 21},
-    {21, 0, 0, 0, 5, 135, 17},
-    {21, 0, 0, 0, 5, 135, 12},
-    {13, 0, 0, 0, 5, 135, 11},
-    {7, 0, 0, 0, 5, 124, 12},
-    {10, 0, 0, 0, 5, 124, 21},
-    {12, 0, 13, 0, 5, 124, 21},
-    {12, 9, 13, 0, 5, 124, 21},
-    {12, 7, 13, 0, 5, 124, 21},
-    {21, 0, 0, 0, 5, 124, 12},
-    {13, 0, 0, 0, 5, 124, 11},
-    {7, 0, 0, 0, 5, 123, 12},
-    {10, 0, 0, 0, 5, 123, 21},
-    {12, 0, 13, 0, 5, 123, 21},
-    {12, 9, 13, 0, 5, 123, 21},
-    {12, 7, 13, 0, 5, 123, 21},
-    {21, 0, 0, 0, 5, 123, 18},
-    {21, 0, 0, 0, 5, 123, 17},
-    {21, 0, 0, 0, 5, 123, 6},
-    {21, 0, 0, 0, 5, 123, 12},
-    {7, 0, 0, 0, 5, 114, 12},
-    {10, 0, 0, 0, 5, 114, 21},
-    {12, 0, 13, 0, 5, 114, 21},
-    {12, 9, 13, 0, 5, 114, 21},
-    {21, 0, 0, 0, 5, 114, 17},
-    {21, 0, 0, 0, 5, 114, 12},
-    {13, 0, 0, 0, 5, 114, 11},
-    {21, 0, 18, 0, 5, 31, 18},
-    {7, 0, 0, 0, 5, 101, 12},
-    {12, 0, 13, 0, 5, 101, 21},
-    {10, 0, 0, 0, 5, 101, 21},
-    {10, 9, 0, 0, 5, 101, 21},
-    {12, 7, 13, 0, 5, 101, 21},
-    {13, 0, 0, 0, 5, 101, 11},
-    {7, 0, 0, 0, 5, 126, 38},
-    {12, 0, 13, 0, 5, 126, 38},
-    {10, 0, 0, 0, 5, 126, 38},
-    {12, 9, 13, 0, 5, 126, 38},
-    {13, 0, 0, 0, 5, 126, 11},
-    {15, 0, 0, 0, 5, 126, 38},
-    {21, 0, 0, 0, 5, 126, 17},
-    {26, 0, 0, 0, 5, 126, 38},
-    {9, 0, 0, 0, 5, 125, 12},
-    {5, 0, 0, 0, 5, 125, 12},
-    {13, 0, 0, 0, 5, 125, 11},
-    {15, 0, 0, 0, 5, 125, 12},
-    {7, 0, 0, 0, 5, 125, 12},
-    {7, 0, 0, 0, 5, 121, 12},
-    {7, 0, 0, 0, 5, 133, 12},
-    {10, 0, 0, 0, 5, 133, 21},
-    {12, 0, 13, 0, 5, 133, 21},
-    {12, 9, 0, 0, 5, 133, 21},
-    {21, 0, 0, 0, 5, 133, 17},
-    {13, 0, 0, 0, 5, 133, 11},
-    {15, 0, 0, 0, 5, 133, 12},
-    {21, 0, 0, 0, 5, 134, 18},
-    {21, 0, 0, 0, 5, 134, 6},
-    {7, 0, 0, 0, 5, 134, 12},
-    {12, 0, 13, 0, 5, 134, 21},
-    {10, 0, 0, 0, 5, 134, 21},
-    {7, 0, 0, 0, 5, 62, 12},
-    {14, 0, 0, 0, 5, 62, 12},
-    {21, 0, 0, 0, 5, 62, 17},
-    {7, 0, 0, 0, 5, 80, 12},
-    {7, 0, 0, 0, 5, 80, 0},
-    {7, 0, 0, 0, 5, 80, 1},
-    {7, 0, 0, 0, 5, 127, 12},
-    {7, 0, 0, 0, 5, 127, 0},
-    {7, 0, 0, 0, 5, 127, 1},
-    {7, 0, 0, 0, 5, 115, 12},
-    {13, 0, 0, 0, 5, 115, 11},
-    {21, 0, 0, 0, 5, 115, 17},
-    {7, 0, 0, 0, 5, 103, 12},
-    {12, 1, 13, 0, 5, 103, 21},
-    {21, 0, 0, 0, 5, 103, 17},
-    {7, 0, 0, 0, 5, 119, 12},
-    {12, 230, 13, 0, 5, 119, 21},
-    {21, 0, 0, 0, 5, 119, 17},
-    {21, 0, 0, 0, 5, 119, 12},
-    {26, 0, 0, 0, 5, 119, 12},
-    {6, 0, 0, 0, 5, 119, 12},
-    {13, 0, 0, 0, 5, 119, 11},
-    {15, 0, 0, 0, 5, 119, 12},
-    {7, 0, 0, 0, 5, 98, 12},
-    {10, 0, 0, 0, 5, 98, 21},
-    {12, 0, 13, 0, 5, 98, 21},
-    {6, 0, 0, 0, 5, 98, 12},
-    {6, 0, 0, 0, 2, 137, 5},
-    {7, 0, 0, 0, 2, 137, 14},
-    {7, 0, 0, 0, 5, 105, 12},
-    {26, 0, 0, 0, 5, 105, 12},
-    {12, 0, 13, 0, 5, 105, 21},
-    {12, 1, 13, 0, 5, 105, 21},
-    {21, 0, 0, 0, 5, 105, 17},
-    {10, 216, 0, 0, 5, 0, 21},
-    {10, 226, 0, 0, 5, 0, 21},
-    {12, 230, 13, 0, 5, 2, 21},
-    {25, 0, 0, 0, 5, 0, 12},
-    {13, 0, 8, 0, 5, 0, 11},
-    {26, 0, 0, 0, 5, 131, 12},
-    {12, 0, 13, 0, 5, 131, 21},
-    {21, 0, 0, 0, 5, 131, 17},
-    {21, 0, 0, 0, 5, 131, 12},
-    {12, 230, 13, 0, 5, 56, 21},
-    {7, 0, 3, 0, 5, 113, 12},
-    {15, 0, 3, 0, 5, 113, 12},
-    {12, 220, 13, 0, 5, 113, 21},
-    {9, 0, 3, 0, 5, 132, 12},
-    {5, 0, 3, 0, 5, 132, 12},
-    {12, 230, 13, 0, 5, 132, 21},
-    {12, 7, 13, 0, 5, 132, 21},
-    {13, 0, 3, 0, 5, 132, 11},
-    {21, 0, 3, 0, 5, 132, 0},
-    {2, 0, 18, 0, 5, 102, 14},
-    {26, 0, 0, 0, 2, 0, 29},
-    {26, 0, 0, 0, 5, 0, 28},
-    {26, 0, 0, 0, 2, 32, 14},
-    {24, 0, 18, 0, 2, 0, 41},
-    {26, 0, 18, 0, 5, 0, 5},
+    {2, 0, 18, 5, 102, 39},
+    {0, 0, 14, 5, 0, 21},
+    {0, 0, 16, 5, 0, 17},
+    {0, 0, 15, 5, 0, 34},
+    {0, 0, 16, 5, 0, 30},
+    {0, 0, 17, 5, 0, 30},
+    {0, 0, 15, 5, 0, 33},
+    {0, 0, 15, 5, 0, 21},
+    {0, 0, 16, 5, 0, 21},
+    {29, 0, 17, 3, 0, 38},
+    {21, 0, 18, 3, 0, 6},
+    {21, 0, 18, 3, 0, 3},
+    {21, 0, 10, 3, 0, 12},
+    {23, 0, 10, 3, 0, 9},
+    {21, 0, 10, 3, 0, 10},
+    {21, 0, 18, 3, 0, 12},
+    {22, 0, 18, 3, 0, 0},
+    {18, 0, 18, 3, 0, 2},
+    {25, 0, 9, 3, 0, 9},
+    {21, 0, 12, 3, 0, 8},
+    {17, 0, 9, 3, 0, 16},
+    {21, 0, 12, 3, 0, 7},
+    {13, 0, 8, 3, 0, 11},
+    {21, 0, 18, 3, 0, 8},
+    {25, 0, 18, 3, 0, 12},
+    {9, 0, 0, 3, 1, 12},
+    {21, 0, 18, 3, 0, 9},
+    {24, 0, 18, 3, 0, 12},
+    {16, 0, 18, 3, 0, 12},
+    {5, 0, 0, 3, 1, 12},
+    {25, 0, 18, 3, 0, 17},
+    {18, 0, 18, 3, 0, 1},
+    {0, 0, 15, 5, 0, 35},
+    {29, 0, 12, 5, 0, 4},
+    {21, 0, 18, 4, 0, 0},
+    {23, 0, 10, 3, 0, 10},
+    {23, 0, 10, 4, 0, 9},
+    {26, 0, 18, 3, 0, 12},
+    {21, 0, 18, 4, 0, 29},
+    {24, 0, 18, 4, 0, 29},
+    {26, 0, 18, 5, 0, 12},
+    {7, 0, 0, 4, 1, 29},
+    {20, 0, 18, 5, 0, 3},
+    {1, 0, 14, 4, 0, 17},
+    {26, 0, 18, 4, 0, 12},
+    {26, 0, 10, 4, 0, 10},
+    {25, 0, 10, 4, 0, 9},
+    {15, 0, 8, 4, 0, 29},
+    {24, 0, 18, 4, 0, 18},
+    {5, 0, 0, 5, 0, 12},
+    {19, 0, 18, 5, 0, 3},
+    {15, 0, 18, 4, 0, 29},
+    {9, 0, 0, 5, 1, 12},
+    {9, 0, 0, 4, 1, 12},
+    {25, 0, 18, 4, 0, 29},
+    {5, 0, 0, 4, 1, 12},
+    {5, 0, 0, 5, 1, 12},
+    {7, 0, 0, 5, 1, 12},
+    {8, 0, 0, 5, 1, 12},
+    {6, 0, 0, 5, 1, 12},
+    {6, 0, 18, 5, 0, 12},
+    {6, 0, 0, 5, 0, 12},
+    {24, 0, 18, 5, 0, 12},
+    {24, 0, 18, 4, 0, 12},
+    {6, 0, 18, 4, 0, 29},
+    {6, 0, 18, 5, 0, 18},
+    {6, 0, 0, 4, 0, 29},
+    {24, 0, 18, 5, 34, 12},
+    {12, 230, 13, 4, 40, 21},
+    {12, 232, 13, 4, 40, 21},
+    {12, 220, 13, 4, 40, 21},
+    {12, 216, 13, 4, 40, 21},
+    {12, 202, 13, 4, 40, 21},
+    {12, 1, 13, 4, 40, 21},
+    {12, 240, 13, 4, 40, 21},
+    {12, 0, 13, 4, 40, 4},
+    {12, 233, 13, 4, 40, 4},
+    {12, 234, 13, 4, 40, 4},
+    {9, 0, 0, 5, 2, 12},
+    {5, 0, 0, 5, 2, 12},
+    {24, 0, 18, 5, 2, 12},
+    {2, 0, 18, 5, 102, 39},
+    {6, 0, 0, 5, 2, 12},
+    {21, 0, 18, 5, 0, 8},
+    {21, 0, 18, 5, 0, 12},
+    {9, 0, 0, 4, 2, 12},
+    {5, 0, 0, 4, 2, 12},
+    {9, 0, 0, 5, 54, 12},
+    {5, 0, 0, 5, 54, 12},
+    {25, 0, 18, 5, 2, 12},
+    {9, 0, 0, 5, 3, 12},
+    {9, 0, 0, 4, 3, 12},
+    {5, 0, 0, 4, 3, 12},
+    {5, 0, 0, 5, 3, 12},
+    {26, 0, 0, 5, 3, 12},
+    {12, 230, 13, 5, 3, 21},
+    {12, 230, 13, 5, 40, 21},
+    {11, 0, 13, 5, 3, 21},
+    {9, 0, 0, 5, 4, 12},
+    {6, 0, 0, 5, 4, 12},
+    {21, 0, 0, 5, 4, 12},
+    {5, 0, 0, 5, 4, 12},
+    {21, 0, 0, 5, 0, 8},
+    {17, 0, 18, 5, 4, 17},
+    {26, 0, 18, 5, 4, 12},
+    {23, 0, 10, 5, 4, 9},
+    {12, 220, 13, 5, 5, 21},
+    {12, 230, 13, 5, 5, 21},
+    {12, 222, 13, 5, 5, 21},
+    {12, 228, 13, 5, 5, 21},
+    {12, 10, 13, 5, 5, 21},
+    {12, 11, 13, 5, 5, 21},
+    {12, 12, 13, 5, 5, 21},
+    {12, 13, 13, 5, 5, 21},
+    {12, 14, 13, 5, 5, 21},
+    {12, 15, 13, 5, 5, 21},
+    {12, 16, 13, 5, 5, 21},
+    {12, 17, 13, 5, 5, 21},
+    {12, 18, 13, 5, 5, 21},
+    {12, 19, 13, 5, 5, 21},
+    {12, 20, 13, 5, 5, 21},
+    {12, 21, 13, 5, 5, 21},
+    {12, 22, 13, 5, 5, 21},
+    {17, 0, 3, 5, 5, 17},
+    {12, 23, 13, 5, 5, 21},
+    {21, 0, 3, 5, 5, 12},
+    {12, 24, 13, 5, 5, 21},
+    {12, 25, 13, 5, 5, 21},
+    {21, 0, 3, 5, 5, 6},
+    {7, 0, 3, 5, 5, 13},
+    {1, 0, 11, 5, 6, 12},
+    {1, 0, 11, 5, 0, 12},
+    {25, 0, 18, 5, 6, 12},
+    {25, 0, 4, 5, 6, 12},
+    {21, 0, 10, 5, 6, 10},
+    {23, 0, 4, 5, 6, 10},
+    {21, 0, 12, 5, 0, 8},
+    {21, 0, 4, 5, 6, 8},
+    {26, 0, 18, 5, 6, 12},
+    {12, 230, 13, 5, 6, 21},
+    {12, 30, 13, 5, 6, 21},
+    {12, 31, 13, 5, 6, 21},
+    {12, 32, 13, 5, 6, 21},
+    {21, 0, 4, 5, 0, 6},
+    {1, 0, 4, 5, 6, 21},
+    {21, 0, 4, 5, 6, 6},
+    {7, 0, 4, 5, 6, 12},
+    {6, 0, 4, 5, 0, 12},
+    {12, 27, 13, 5, 40, 21},
+    {12, 28, 13, 5, 40, 21},
+    {12, 29, 13, 5, 40, 21},
+    {12, 30, 13, 5, 40, 21},
+    {12, 31, 13, 5, 40, 21},
+    {12, 32, 13, 5, 40, 21},
+    {12, 33, 13, 5, 40, 21},
+    {12, 34, 13, 5, 40, 21},
+    {12, 220, 13, 5, 40, 21},
+    {12, 220, 13, 5, 6, 21},
+    {13, 0, 11, 5, 6, 11},
+    {21, 0, 11, 5, 6, 11},
+    {21, 0, 4, 5, 6, 12},
+    {12, 35, 13, 5, 40, 21},
+    {6, 0, 4, 5, 6, 12},
+    {13, 0, 8, 5, 6, 11},
+    {26, 0, 4, 5, 6, 12},
+    {21, 0, 4, 5, 7, 12},
+    {1, 0, 4, 5, 7, 12},
+    {7, 0, 4, 5, 7, 12},
+    {12, 36, 13, 5, 7, 21},
+    {12, 230, 13, 5, 7, 21},
+    {12, 220, 13, 5, 7, 21},
+    {7, 0, 4, 5, 8, 12},
+    {12, 0, 13, 5, 8, 21},
+    {13, 0, 3, 5, 65, 11},
+    {7, 0, 3, 5, 65, 12},
+    {12, 230, 13, 5, 65, 21},
+    {12, 220, 13, 5, 65, 21},
+    {6, 0, 3, 5, 65, 12},
+    {26, 0, 18, 5, 65, 12},
+    {21, 0, 18, 5, 65, 12},
+    {21, 0, 18, 5, 65, 8},
+    {21, 0, 18, 5, 65, 6},
+    {7, 0, 3, 5, 81, 12},
+    {12, 230, 13, 5, 81, 21},
+    {6, 0, 3, 5, 81, 12},
+    {21, 0, 3, 5, 81, 12},
+    {7, 0, 3, 5, 94, 12},
+    {12, 220, 13, 5, 94, 21},
+    {21, 0, 3, 5, 94, 12},
+    {12, 27, 13, 5, 6, 21},
+    {12, 28, 13, 5, 6, 21},
+    {12, 29, 13, 5, 6, 21},
+    {12, 0, 13, 5, 9, 21},
+    {10, 0, 0, 5, 9, 21},
+    {7, 0, 0, 5, 9, 12},
+    {12, 7, 13, 5, 9, 21},
+    {12, 9, 13, 5, 9, 21},
+    {12, 230, 13, 5, 9, 21},
+    {21, 0, 0, 5, 0, 17},
+    {13, 0, 0, 5, 9, 11},
+    {21, 0, 0, 5, 9, 12},
+    {6, 0, 0, 5, 9, 12},
+    {7, 0, 0, 5, 10, 12},
+    {12, 0, 13, 5, 10, 21},
+    {10, 0, 0, 5, 10, 21},
+    {12, 7, 13, 5, 10, 21},
+    {12, 9, 13, 5, 10, 21},
+    {13, 0, 0, 5, 10, 11},
+    {23, 0, 10, 5, 10, 10},
+    {15, 0, 0, 5, 10, 12},
+    {15, 0, 0, 5, 10, 10},
+    {26, 0, 0, 5, 10, 12},
+    {23, 0, 10, 5, 10, 9},
+    {21, 0, 0, 5, 10, 12},
+    {12, 0, 13, 5, 11, 21},
+    {10, 0, 0, 5, 11, 21},
+    {7, 0, 0, 5, 11, 12},
+    {12, 7, 13, 5, 11, 21},
+    {12, 9, 13, 5, 11, 21},
+    {13, 0, 0, 5, 11, 11},
+    {12, 0, 13, 5, 12, 21},
+    {10, 0, 0, 5, 12, 21},
+    {7, 0, 0, 5, 12, 12},
+    {12, 7, 13, 5, 12, 21},
+    {12, 9, 13, 5, 12, 21},
+    {13, 0, 0, 5, 12, 11},
+    {21, 0, 0, 5, 12, 12},
+    {23, 0, 10, 5, 12, 9},
+    {12, 0, 13, 5, 13, 21},
+    {10, 0, 0, 5, 13, 21},
+    {7, 0, 0, 5, 13, 12},
+    {12, 7, 13, 5, 13, 21},
+    {12, 9, 13, 5, 13, 21},
+    {13, 0, 0, 5, 13, 11},
+    {26, 0, 0, 5, 13, 12},
+    {15, 0, 0, 5, 13, 12},
+    {12, 0, 13, 5, 14, 21},
+    {7, 0, 0, 5, 14, 12},
+    {10, 0, 0, 5, 14, 21},
+    {12, 9, 13, 5, 14, 21},
+    {13, 0, 0, 5, 14, 11},
+    {15, 0, 0, 5, 14, 12},
+    {26, 0, 18, 5, 14, 12},
+    {23, 0, 10, 5, 14, 9},
+    {12, 0, 13, 5, 15, 21},
+    {10, 0, 0, 5, 15, 21},
+    {7, 0, 0, 5, 15, 12},
+    {12, 9, 13, 5, 15, 21},
+    {12, 84, 13, 5, 15, 21},
+    {12, 91, 13, 5, 15, 21},
+    {13, 0, 0, 5, 15, 11},
+    {15, 0, 18, 5, 15, 12},
+    {26, 0, 0, 5, 15, 12},
+    {7, 0, 0, 5, 16, 12},
+    {12, 0, 13, 5, 16, 21},
+    {10, 0, 0, 5, 16, 21},
+    {12, 7, 13, 5, 16, 21},
+    {12, 0, 0, 5, 16, 21},
+    {12, 9, 13, 5, 16, 21},
+    {13, 0, 0, 5, 16, 11},
+    {12, 0, 13, 5, 17, 21},
+    {10, 0, 0, 5, 17, 21},
+    {7, 0, 0, 5, 17, 12},
+    {12, 9, 13, 5, 17, 21},
+    {26, 0, 0, 5, 17, 12},
+    {15, 0, 0, 5, 17, 12},
+    {13, 0, 0, 5, 17, 11},
+    {26, 0, 0, 5, 17, 10},
+    {10, 0, 0, 5, 18, 21},
+    {7, 0, 0, 5, 18, 12},
+    {12, 9, 13, 5, 18, 21},
+    {12, 0, 13, 5, 18, 21},
+    {13, 0, 0, 5, 18, 11},
+    {21, 0, 0, 5, 18, 12},
+    {7, 0, 0, 5, 19, 36},
+    {12, 0, 13, 5, 19, 36},
+    {12, 103, 13, 5, 19, 36},
+    {12, 9, 13, 5, 19, 36},
+    {23, 0, 10, 5, 0, 9},
+    {6, 0, 0, 5, 19, 36},
+    {12, 107, 13, 5, 19, 36},
+    {21, 0, 0, 5, 19, 12},
+    {13, 0, 0, 5, 19, 11},
+    {21, 0, 0, 5, 19, 17},
+    {7, 0, 0, 5, 20, 36},
+    {12, 0, 13, 5, 20, 36},
+    {12, 118, 13, 5, 20, 36},
+    {6, 0, 0, 5, 20, 36},
+    {12, 122, 13, 5, 20, 36},
+    {13, 0, 0, 5, 20, 11},
+    {7, 0, 0, 5, 21, 12},
+    {26, 0, 0, 5, 21, 18},
+    {21, 0, 0, 5, 21, 18},
+    {21, 0, 0, 5, 21, 12},
+    {21, 0, 0, 5, 21, 4},
+    {21, 0, 0, 5, 21, 17},
+    {21, 0, 0, 5, 21, 6},
+    {26, 0, 0, 5, 21, 12},
+    {12, 220, 13, 5, 21, 21},
+    {13, 0, 0, 5, 21, 11},
+    {15, 0, 0, 5, 21, 12},
+    {26, 0, 0, 5, 21, 17},
+    {12, 216, 13, 5, 21, 21},
+    {22, 0, 18, 5, 21, 0},
+    {18, 0, 18, 5, 21, 1},
+    {10, 0, 0, 5, 21, 21},
+    {12, 129, 13, 5, 21, 21},
+    {12, 130, 13, 5, 21, 21},
+    {12, 0, 13, 5, 21, 21},
+    {12, 132, 13, 5, 21, 21},
+    {10, 0, 0, 5, 21, 17},
+    {12, 230, 13, 5, 21, 21},
+    {12, 9, 13, 5, 21, 21},
+    {26, 0, 0, 5, 0, 12},
+    {7, 0, 0, 5, 22, 36},
+    {10, 0, 0, 5, 22, 36},
+    {12, 0, 13, 5, 22, 36},
+    {12, 7, 13, 5, 22, 36},
+    {12, 9, 13, 5, 22, 36},
+    {13, 0, 0, 5, 22, 11},
+    {21, 0, 0, 5, 22, 17},
+    {21, 0, 0, 5, 22, 12},
+    {12, 220, 13, 5, 22, 36},
+    {26, 0, 0, 5, 22, 36},
+    {9, 0, 0, 5, 23, 12},
+    {7, 0, 0, 5, 23, 12},
+    {21, 0, 0, 5, 0, 12},
+    {6, 0, 0, 5, 23, 12},
+    {7, 0, 0, 2, 24, 25},
+    {7, 0, 0, 5, 24, 26},
+    {7, 0, 0, 5, 24, 27},
+    {7, 0, 0, 5, 25, 12},
+    {12, 230, 13, 5, 25, 21},
+    {21, 0, 0, 5, 25, 12},
+    {21, 0, 0, 5, 25, 17},
+    {15, 0, 0, 5, 25, 12},
+    {26, 0, 18, 5, 25, 12},
+    {9, 0, 0, 5, 26, 12},
+    {5, 0, 0, 5, 26, 12},
+    {17, 0, 18, 5, 27, 17},
+    {7, 0, 0, 5, 27, 12},
+    {21, 0, 0, 5, 27, 12},
+    {29, 0, 17, 5, 28, 17},
+    {7, 0, 0, 5, 28, 12},
+    {22, 0, 18, 5, 28, 0},
+    {18, 0, 18, 5, 28, 1},
+    {7, 0, 0, 5, 29, 12},
+    {14, 0, 0, 5, 29, 12},
+    {7, 0, 0, 5, 41, 12},
+    {12, 0, 13, 5, 41, 21},
+    {12, 9, 13, 5, 41, 21},
+    {7, 0, 0, 5, 42, 12},
+    {12, 0, 13, 5, 42, 21},
+    {12, 9, 13, 5, 42, 21},
+    {7, 0, 0, 5, 43, 12},
+    {12, 0, 13, 5, 43, 21},
+    {7, 0, 0, 5, 44, 12},
+    {12, 0, 13, 5, 44, 21},
+    {7, 0, 0, 5, 30, 36},
+    {12, 0, 13, 5, 30, 36},
+    {10, 0, 0, 5, 30, 36},
+    {12, 9, 13, 5, 30, 36},
+    {21, 0, 0, 5, 30, 17},
+    {21, 0, 0, 5, 30, 5},
+    {6, 0, 0, 5, 30, 36},
+    {21, 0, 0, 5, 30, 12},
+    {23, 0, 10, 5, 30, 9},
+    {12, 230, 13, 5, 30, 36},
+    {13, 0, 0, 5, 30, 11},
+    {15, 0, 18, 5, 30, 12},
+    {21, 0, 18, 5, 31, 12},
+    {21, 0, 18, 5, 0, 6},
+    {21, 0, 18, 5, 31, 17},
+    {21, 0, 18, 5, 0, 17},
+    {17, 0, 18, 5, 31, 18},
+    {21, 0, 18, 5, 31, 6},
+    {12, 0, 13, 5, 31, 21},
+    {1, 0, 14, 5, 31, 4},
+    {13, 0, 0, 5, 31, 11},
+    {7, 0, 0, 5, 31, 12},
+    {6, 0, 0, 5, 31, 12},
+    {12, 228, 13, 5, 31, 21},
+    {7, 0, 0, 5, 45, 12},
+    {12, 0, 13, 5, 45, 21},
+    {10, 0, 0, 5, 45, 21},
+    {12, 222, 13, 5, 45, 21},
+    {12, 230, 13, 5, 45, 21},
+    {12, 220, 13, 5, 45, 21},
+    {26, 0, 18, 5, 45, 12},
+    {21, 0, 18, 5, 45, 6},
+    {13, 0, 0, 5, 45, 11},
+    {7, 0, 0, 5, 46, 36},
+    {7, 0, 0, 5, 55, 36},
+    {13, 0, 0, 5, 55, 11},
+    {15, 0, 0, 5, 55, 36},
+    {26, 0, 18, 5, 55, 36},
+    {26, 0, 18, 5, 30, 12},
+    {7, 0, 0, 5, 53, 12},
+    {12, 230, 13, 5, 53, 21},
+    {12, 220, 13, 5, 53, 21},
+    {10, 0, 0, 5, 53, 21},
+    {12, 0, 13, 5, 53, 21},
+    {21, 0, 0, 5, 53, 12},
+    {7, 0, 0, 5, 77, 36},
+    {10, 0, 0, 5, 77, 36},
+    {12, 0, 13, 5, 77, 36},
+    {12, 9, 13, 5, 77, 36},
+    {12, 230, 13, 5, 77, 36},
+    {12, 220, 13, 5, 77, 21},
+    {13, 0, 0, 5, 77, 11},
+    {21, 0, 0, 5, 77, 36},
+    {6, 0, 0, 5, 77, 36},
+    {11, 0, 13, 5, 40, 21},
+    {12, 0, 13, 5, 61, 21},
+    {10, 0, 0, 5, 61, 21},
+    {7, 0, 0, 5, 61, 12},
+    {12, 7, 13, 5, 61, 21},
+    {10, 9, 0, 5, 61, 21},
+    {13, 0, 0, 5, 61, 11},
+    {21, 0, 0, 5, 61, 17},
+    {21, 0, 0, 5, 61, 12},
+    {26, 0, 0, 5, 61, 12},
+    {12, 230, 13, 5, 61, 21},
+    {12, 220, 13, 5, 61, 21},
+    {12, 0, 13, 5, 66, 21},
+    {10, 0, 0, 5, 66, 21},
+    {7, 0, 0, 5, 66, 12},
+    {10, 9, 0, 5, 66, 21},
+    {12, 9, 13, 5, 66, 21},
+    {13, 0, 0, 5, 66, 11},
+    {7, 0, 0, 5, 92, 12},
+    {12, 7, 13, 5, 92, 21},
+    {10, 0, 0, 5, 92, 21},
+    {12, 0, 13, 5, 92, 21},
+    {10, 9, 0, 5, 92, 21},
+    {21, 0, 0, 5, 92, 12},
+    {7, 0, 0, 5, 67, 12},
+    {10, 0, 0, 5, 67, 21},
+    {12, 0, 13, 5, 67, 21},
+    {12, 7, 13, 5, 67, 21},
+    {21, 0, 0, 5, 67, 17},
+    {13, 0, 0, 5, 67, 11},
+    {13, 0, 0, 5, 68, 11},
+    {7, 0, 0, 5, 68, 12},
+    {6, 0, 0, 5, 68, 12},
+    {21, 0, 0, 5, 68, 17},
+    {21, 0, 0, 5, 66, 12},
+    {12, 1, 13, 5, 40, 21},
+    {10, 0, 0, 5, 0, 21},
+    {7, 0, 0, 5, 0, 12},
+    {6, 0, 0, 5, 3, 12},
+    {12, 234, 13, 5, 40, 21},
+    {12, 214, 13, 5, 40, 21},
+    {12, 202, 13, 5, 40, 21},
+    {12, 232, 13, 5, 40, 21},
+    {12, 228, 13, 5, 40, 21},
+    {12, 233, 13, 5, 40, 21},
+    {8, 0, 0, 5, 2, 12},
+    {24, 0, 18, 5, 2, 18},
+    {29, 0, 17, 5, 0, 17},
+    {29, 0, 17, 5, 0, 4},
+    {1, 0, 14, 5, 0, 20},
+    {1, 0, 14, 5, 40, 21},
+    {1, 0, 14, 5, 40, 40},
+    {1, 0, 0, 5, 0, 21},
+    {1, 0, 3, 5, 0, 21},
+    {17, 0, 18, 4, 0, 17},
+    {17, 0, 18, 5, 0, 4},
+    {17, 0, 18, 5, 0, 17},
+    {17, 0, 18, 4, 0, 19},
+    {17, 0, 18, 4, 0, 29},
+    {20, 0, 18, 4, 0, 3},
+    {19, 0, 18, 4, 0, 3},
+    {22, 0, 18, 5, 0, 0},
+    {21, 0, 18, 4, 0, 12},
+    {21, 0, 18, 4, 0, 15},
+    {21, 0, 18, 4, 0, 17},
+    {27, 0, 17, 5, 0, 30},
+    {28, 0, 15, 5, 0, 30},
+    {1, 0, 1, 5, 0, 21},
+    {1, 0, 5, 5, 0, 21},
+    {1, 0, 7, 5, 0, 21},
+    {1, 0, 2, 5, 0, 21},
+    {1, 0, 6, 5, 0, 21},
+    {21, 0, 10, 4, 0, 10},
+    {21, 0, 10, 5, 0, 10},
+    {21, 0, 18, 4, 0, 10},
+    {21, 0, 18, 5, 0, 10},
+    {21, 0, 18, 5, 0, 5},
+    {16, 0, 18, 5, 0, 12},
+    {25, 0, 12, 5, 0, 8},
+    {18, 0, 18, 5, 0, 1},
+    {25, 0, 18, 5, 0, 12},
+    {1, 0, 14, 5, 0, 22},
+    {1, 0, 14, 5, 0, 12},
+    {1, 0, 19, 5, 0, 21},
+    {1, 0, 20, 5, 0, 21},
+    {1, 0, 21, 5, 0, 21},
+    {1, 0, 22, 5, 0, 21},
+    {1, 0, 14, 5, 0, 21},
+    {15, 0, 8, 5, 0, 12},
+    {25, 0, 9, 5, 0, 12},
+    {6, 0, 0, 4, 1, 29},
+    {23, 0, 10, 5, 0, 10},
+    {23, 0, 10, 1, 0, 9},
+    {2, 0, 18, 5, 102, 9},
+    {9, 0, 0, 5, 0, 12},
+    {26, 0, 18, 4, 0, 10},
+    {26, 0, 18, 4, 0, 29},
+    {5, 0, 0, 4, 0, 29},
+    {26, 0, 18, 4, 0, 9},
+    {9, 0, 0, 4, 1, 29},
+    {26, 0, 10, 5, 0, 12},
+    {15, 0, 18, 5, 0, 12},
+    {15, 0, 18, 4, 0, 12},
+    {15, 0, 18, 5, 0, 29},
+    {14, 0, 0, 4, 1, 29},
+    {14, 0, 0, 5, 1, 12},
+    {25, 0, 9, 5, 0, 9},
+    {25, 0, 10, 5, 0, 9},
+    {25, 0, 18, 5, 0, 15},
+    {26, 0, 18, 2, 0, 14},
+    {22, 0, 18, 2, 0, 0},
+    {18, 0, 18, 2, 0, 1},
+    {26, 0, 18, 2, 0, 12},
+    {26, 0, 18, 5, 0, 14},
+    {26, 0, 0, 4, 0, 29},
+    {26, 0, 18, 5, 0, 29},
+    {25, 0, 18, 2, 0, 12},
+    {26, 0, 18, 4, 0, 14},
+    {26, 0, 18, 5, 0, 41},
+    {26, 0, 18, 4, 0, 41},
+    {26, 0, 18, 2, 0, 41},
+    {26, 0, 18, 2, 0, 29},
+    {26, 0, 18, 5, 0, 3},
+    {26, 0, 18, 5, 0, 6},
+    {26, 0, 0, 5, 52, 12},
+    {9, 0, 0, 5, 56, 12},
+    {5, 0, 0, 5, 56, 12},
+    {26, 0, 18, 5, 54, 12},
+    {12, 230, 13, 5, 54, 21},
+    {21, 0, 18, 5, 54, 6},
+    {21, 0, 18, 5, 54, 17},
+    {15, 0, 18, 5, 54, 12},
+    {5, 0, 0, 5, 23, 12},
+    {7, 0, 0, 5, 57, 12},
+    {6, 0, 0, 5, 57, 12},
+    {21, 0, 0, 5, 57, 17},
+    {12, 9, 13, 5, 57, 21},
+    {21, 0, 18, 5, 0, 3},
+    {21, 0, 18, 5, 0, 0},
+    {17, 0, 18, 5, 0, 12},
+    {17, 0, 18, 5, 0, 19},
+    {26, 0, 18, 2, 35, 14},
+    {29, 0, 17, 0, 0, 17},
+    {21, 0, 18, 2, 0, 1},
+    {21, 0, 18, 2, 0, 14},
+    {6, 0, 0, 2, 35, 5},
+    {7, 0, 0, 2, 0, 14},
+    {14, 0, 0, 2, 35, 14},
+    {17, 0, 18, 2, 0, 5},
+    {12, 218, 13, 2, 40, 21},
+    {12, 228, 13, 2, 40, 21},
+    {12, 232, 13, 2, 40, 21},
+    {12, 222, 13, 2, 40, 21},
+    {10, 224, 0, 2, 24, 21},
+    {17, 0, 18, 2, 0, 14},
+    {6, 0, 0, 2, 0, 14},
+    {6, 0, 0, 2, 0, 21},
+    {7, 0, 0, 2, 0, 5},
+    {7, 0, 0, 2, 32, 32},
+    {7, 0, 0, 2, 32, 14},
+    {12, 8, 13, 2, 40, 21},
+    {24, 0, 18, 2, 0, 5},
+    {6, 0, 0, 2, 32, 5},
+    {7, 0, 0, 2, 33, 32},
+    {7, 0, 0, 2, 33, 14},
+    {21, 0, 18, 2, 0, 5},
+    {6, 0, 0, 2, 0, 32},
+    {6, 0, 0, 2, 33, 5},
+    {7, 0, 0, 2, 34, 14},
+    {7, 0, 0, 2, 24, 14},
+    {26, 0, 0, 2, 0, 14},
+    {15, 0, 0, 2, 0, 14},
+    {26, 0, 0, 2, 24, 14},
+    {26, 0, 18, 2, 24, 14},
+    {15, 0, 0, 4, 0, 29},
+    {15, 0, 18, 2, 0, 14},
+    {26, 0, 0, 2, 33, 14},
+    {7, 0, 0, 2, 35, 14},
+    {2, 0, 18, 2, 102, 14},
+    {7, 0, 0, 2, 36, 14},
+    {6, 0, 0, 2, 36, 5},
+    {26, 0, 18, 2, 36, 14},
+    {7, 0, 0, 5, 82, 12},
+    {6, 0, 0, 5, 82, 12},
+    {21, 0, 0, 5, 82, 17},
+    {7, 0, 0, 5, 69, 12},
+    {6, 0, 0, 5, 69, 12},
+    {21, 0, 18, 5, 69, 17},
+    {21, 0, 18, 5, 69, 6},
+    {13, 0, 0, 5, 69, 11},
+    {7, 0, 0, 5, 3, 12},
+    {21, 0, 18, 5, 3, 12},
+    {6, 0, 18, 5, 3, 12},
+    {7, 0, 0, 5, 83, 12},
+    {14, 0, 0, 5, 83, 12},
+    {12, 230, 13, 5, 83, 21},
+    {21, 0, 0, 5, 83, 12},
+    {21, 0, 0, 5, 83, 17},
+    {24, 0, 0, 5, 0, 12},
+    {7, 0, 0, 5, 58, 12},
+    {12, 0, 13, 5, 58, 21},
+    {12, 9, 13, 5, 58, 21},
+    {10, 0, 0, 5, 58, 21},
+    {26, 0, 18, 5, 58, 12},
+    {15, 0, 0, 5, 0, 12},
+    {7, 0, 0, 5, 64, 12},
+    {21, 0, 18, 5, 64, 18},
+    {21, 0, 18, 5, 64, 6},
+    {10, 0, 0, 5, 70, 21},
+    {7, 0, 0, 5, 70, 12},
+    {12, 9, 13, 5, 70, 21},
+    {12, 0, 13, 5, 70, 21},
+    {21, 0, 0, 5, 70, 17},
+    {13, 0, 0, 5, 70, 11},
+    {21, 0, 0, 5, 9, 18},
+    {13, 0, 0, 5, 71, 11},
+    {7, 0, 0, 5, 71, 12},
+    {12, 0, 13, 5, 71, 21},
+    {12, 220, 13, 5, 71, 21},
+    {21, 0, 0, 5, 71, 17},
+    {7, 0, 0, 5, 72, 12},
+    {12, 0, 13, 5, 72, 21},
+    {10, 0, 0, 5, 72, 21},
+    {10, 9, 0, 5, 72, 21},
+    {21, 0, 0, 5, 72, 12},
+    {12, 0, 13, 5, 84, 21},
+    {10, 0, 0, 5, 84, 21},
+    {7, 0, 0, 5, 84, 12},
+    {12, 7, 13, 5, 84, 21},
+    {10, 9, 0, 5, 84, 21},
+    {21, 0, 0, 5, 84, 12},
+    {21, 0, 0, 5, 84, 17},
+    {13, 0, 0, 5, 84, 11},
+    {6, 0, 0, 5, 22, 36},
+    {7, 0, 0, 5, 76, 12},
+    {12, 0, 13, 5, 76, 21},
+    {10, 0, 0, 5, 76, 21},
+    {13, 0, 0, 5, 76, 11},
+    {21, 0, 0, 5, 76, 12},
+    {21, 0, 0, 5, 76, 17},
+    {7, 0, 0, 5, 78, 36},
+    {12, 230, 13, 5, 78, 36},
+    {12, 220, 13, 5, 78, 36},
+    {6, 0, 0, 5, 78, 36},
+    {21, 0, 0, 5, 78, 36},
+    {7, 0, 0, 5, 85, 12},
+    {10, 0, 0, 5, 85, 21},
+    {12, 0, 13, 5, 85, 21},
+    {21, 0, 0, 5, 85, 17},
+    {6, 0, 0, 5, 85, 12},
+    {12, 9, 13, 5, 85, 21},
+    {13, 0, 0, 5, 85, 11},
+    {7, 0, 0, 2, 24, 23},
+    {7, 0, 0, 2, 24, 24},
+    {4, 0, 0, 5, 102, 37},
+    {3, 0, 0, 4, 102, 39},
+    {12, 26, 13, 5, 5, 21},
+    {25, 0, 9, 5, 5, 12},
+    {24, 0, 4, 5, 6, 12},
+    {12, 0, 13, 4, 40, 21},
+    {21, 0, 18, 2, 0, 8},
+    {21, 0, 18, 2, 0, 6},
+    {21, 0, 18, 2, 0, 15},
+    {16, 0, 18, 2, 0, 14},
+    {21, 0, 12, 2, 0, 1},
+    {21, 0, 12, 2, 0, 5},
+    {21, 0, 10, 2, 0, 14},
+    {25, 0, 9, 2, 0, 14},
+    {17, 0, 9, 2, 0, 14},
+    {25, 0, 18, 2, 0, 14},
+    {23, 0, 10, 2, 0, 9},
+    {21, 0, 10, 2, 0, 10},
+    {21, 0, 18, 0, 0, 6},
+    {21, 0, 18, 0, 0, 14},
+    {21, 0, 10, 0, 0, 14},
+    {23, 0, 10, 0, 0, 9},
+    {21, 0, 10, 0, 0, 10},
+    {22, 0, 18, 0, 0, 0},
+    {18, 0, 18, 0, 0, 1},
+    {25, 0, 9, 0, 0, 14},
+    {21, 0, 12, 0, 0, 1},
+    {17, 0, 9, 0, 0, 14},
+    {21, 0, 12, 0, 0, 14},
+    {13, 0, 8, 0, 0, 14},
+    {21, 0, 12, 0, 0, 5},
+    {21, 0, 18, 0, 0, 5},
+    {25, 0, 18, 0, 0, 14},
+    {9, 0, 0, 0, 1, 14},
+    {24, 0, 18, 0, 0, 14},
+    {16, 0, 18, 0, 0, 14},
+    {5, 0, 0, 0, 1, 14},
+    {21, 0, 18, 1, 0, 1},
+    {22, 0, 18, 1, 0, 0},
+    {18, 0, 18, 1, 0, 1},
+    {21, 0, 18, 1, 0, 5},
+    {7, 0, 0, 1, 33, 14},
+    {7, 0, 0, 1, 33, 32},
+    {6, 0, 0, 1, 0, 32},
+    {6, 0, 0, 1, 0, 5},
+    {7, 0, 0, 1, 24, 14},
+    {23, 0, 10, 0, 0, 10},
+    {26, 0, 18, 0, 0, 14},
+    {26, 0, 18, 1, 0, 12},
+    {25, 0, 18, 1, 0, 12},
+    {1, 0, 18, 5, 0, 21},
+    {26, 0, 18, 5, 0, 31},
+    {7, 0, 0, 5, 47, 12},
+    {14, 0, 18, 5, 2, 12},
+    {15, 0, 18, 5, 2, 12},
+    {26, 0, 18, 5, 2, 12},
+    {26, 0, 0, 5, 2, 12},
+    {7, 0, 0, 5, 73, 12},
+    {7, 0, 0, 5, 74, 12},
+    {7, 0, 0, 5, 37, 12},
+    {15, 0, 0, 5, 37, 12},
+    {7, 0, 0, 5, 38, 12},
+    {14, 0, 0, 5, 38, 12},
+    {7, 0, 0, 5, 118, 12},
+    {12, 230, 13, 5, 118, 21},
+    {7, 0, 0, 5, 48, 12},
+    {21, 0, 0, 5, 48, 17},
+    {7, 0, 0, 5, 59, 12},
+    {21, 0, 0, 5, 59, 17},
+    {14, 0, 0, 5, 59, 12},
+    {9, 0, 0, 5, 39, 12},
+    {5, 0, 0, 5, 39, 12},
+    {7, 0, 0, 5, 49, 12},
+    {7, 0, 0, 5, 50, 12},
+    {13, 0, 0, 5, 50, 11},
+    {9, 0, 0, 5, 136, 12},
+    {5, 0, 0, 5, 136, 12},
+    {7, 0, 0, 5, 106, 12},
+    {7, 0, 0, 5, 104, 12},
+    {21, 0, 0, 5, 104, 12},
+    {7, 0, 0, 5, 110, 12},
+    {7, 0, 3, 5, 51, 12},
+    {7, 0, 3, 5, 86, 12},
+    {21, 0, 3, 5, 86, 17},
+    {15, 0, 3, 5, 86, 12},
+    {7, 0, 3, 5, 120, 12},
+    {26, 0, 3, 5, 120, 12},
+    {15, 0, 3, 5, 120, 12},
+    {7, 0, 3, 5, 116, 12},
+    {15, 0, 3, 5, 116, 12},
+    {7, 0, 3, 5, 128, 12},
+    {15, 0, 3, 5, 128, 12},
+    {7, 0, 3, 5, 63, 12},
+    {15, 0, 3, 5, 63, 12},
+    {21, 0, 18, 5, 63, 17},
+    {7, 0, 3, 5, 75, 12},
+    {21, 0, 3, 5, 75, 12},
+    {7, 0, 3, 5, 97, 12},
+    {7, 0, 3, 5, 96, 12},
+    {15, 0, 3, 5, 96, 12},
+    {7, 0, 3, 5, 60, 12},
+    {12, 0, 13, 5, 60, 21},
+    {12, 220, 13, 5, 60, 21},
+    {12, 230, 13, 5, 60, 21},
+    {12, 1, 13, 5, 60, 21},
+    {12, 9, 13, 5, 60, 21},
+    {15, 0, 3, 5, 60, 12},
+    {21, 0, 3, 5, 60, 17},
+    {21, 0, 3, 5, 60, 12},
+    {7, 0, 3, 5, 87, 12},
+    {15, 0, 3, 5, 87, 12},
+    {21, 0, 3, 5, 87, 12},
+    {7, 0, 3, 5, 117, 12},
+    {15, 0, 3, 5, 117, 12},
+    {7, 0, 3, 5, 112, 12},
+    {26, 0, 3, 5, 112, 12},
+    {12, 230, 13, 5, 112, 21},
+    {12, 220, 13, 5, 112, 21},
+    {15, 0, 3, 5, 112, 12},
+    {21, 0, 3, 5, 112, 17},
+    {21, 0, 3, 5, 112, 15},
+    {7, 0, 3, 5, 79, 12},
+    {21, 0, 18, 5, 79, 17},
+    {7, 0, 3, 5, 88, 12},
+    {15, 0, 3, 5, 88, 12},
+    {7, 0, 3, 5, 89, 12},
+    {15, 0, 3, 5, 89, 12},
+    {7, 0, 3, 5, 122, 12},
+    {21, 0, 3, 5, 122, 12},
+    {15, 0, 3, 5, 122, 12},
+    {7, 0, 3, 5, 90, 12},
+    {9, 0, 3, 5, 130, 12},
+    {5, 0, 3, 5, 130, 12},
+    {15, 0, 3, 5, 130, 12},
+    {15, 0, 11, 5, 6, 12},
+    {10, 0, 0, 5, 93, 21},
+    {12, 0, 13, 5, 93, 21},
+    {7, 0, 0, 5, 93, 12},
+    {12, 9, 13, 5, 93, 21},
+    {21, 0, 0, 5, 93, 17},
+    {21, 0, 0, 5, 93, 12},
+    {15, 0, 18, 5, 93, 12},
+    {13, 0, 0, 5, 93, 11},
+    {12, 0, 13, 5, 91, 21},
+    {10, 0, 0, 5, 91, 21},
+    {7, 0, 0, 5, 91, 12},
+    {12, 9, 13, 5, 91, 21},
+    {12, 7, 13, 5, 91, 21},
+    {21, 0, 0, 5, 91, 12},
+    {1, 0, 0, 5, 91, 12},
+    {21, 0, 0, 5, 91, 17},
+    {7, 0, 0, 5, 100, 12},
+    {13, 0, 0, 5, 100, 11},
+    {12, 230, 13, 5, 95, 21},
+    {7, 0, 0, 5, 95, 12},
+    {12, 0, 13, 5, 95, 21},
+    {10, 0, 0, 5, 95, 21},
+    {12, 9, 13, 5, 95, 21},
+    {13, 0, 0, 5, 95, 11},
+    {21, 0, 0, 5, 95, 17},
+    {7, 0, 0, 5, 111, 12},
+    {12, 7, 13, 5, 111, 21},
+    {21, 0, 0, 5, 111, 12},
+    {21, 0, 0, 5, 111, 18},
+    {12, 0, 13, 5, 99, 21},
+    {10, 0, 0, 5, 99, 21},
+    {7, 0, 0, 5, 99, 12},
+    {10, 9, 0, 5, 99, 21},
+    {21, 0, 0, 5, 99, 17},
+    {21, 0, 0, 5, 99, 12},
+    {12, 7, 13, 5, 99, 21},
+    {13, 0, 0, 5, 99, 11},
+    {21, 0, 0, 5, 99, 18},
+    {15, 0, 0, 5, 18, 12},
+    {7, 0, 0, 5, 108, 12},
+    {10, 0, 0, 5, 108, 21},
+    {12, 0, 13, 5, 108, 21},
+    {10, 9, 0, 5, 108, 21},
+    {12, 7, 13, 5, 108, 21},
+    {21, 0, 0, 5, 108, 17},
+    {21, 0, 0, 5, 108, 12},
+    {7, 0, 0, 5, 129, 12},
+    {21, 0, 0, 5, 129, 17},
+    {7, 0, 0, 5, 109, 12},
+    {12, 0, 13, 5, 109, 21},
+    {10, 0, 0, 5, 109, 21},
+    {12, 7, 13, 5, 109, 21},
+    {12, 9, 13, 5, 109, 21},
+    {13, 0, 0, 5, 109, 11},
+    {12, 0, 13, 5, 107, 21},
+    {10, 0, 0, 5, 107, 21},
+    {7, 0, 0, 5, 107, 12},
+    {12, 7, 13, 5, 107, 21},
+    {10, 9, 0, 5, 107, 21},
+    {12, 230, 13, 5, 107, 21},
+    {7, 0, 0, 5, 135, 12},
+    {10, 0, 0, 5, 135, 21},
+    {12, 0, 13, 5, 135, 21},
+    {12, 9, 13, 5, 135, 21},
+    {12, 7, 13, 5, 135, 21},
+    {21, 0, 0, 5, 135, 17},
+    {21, 0, 0, 5, 135, 12},
+    {13, 0, 0, 5, 135, 11},
+    {7, 0, 0, 5, 124, 12},
+    {10, 0, 0, 5, 124, 21},
+    {12, 0, 13, 5, 124, 21},
+    {12, 9, 13, 5, 124, 21},
+    {12, 7, 13, 5, 124, 21},
+    {21, 0, 0, 5, 124, 12},
+    {13, 0, 0, 5, 124, 11},
+    {7, 0, 0, 5, 123, 12},
+    {10, 0, 0, 5, 123, 21},
+    {12, 0, 13, 5, 123, 21},
+    {12, 9, 13, 5, 123, 21},
+    {12, 7, 13, 5, 123, 21},
+    {21, 0, 0, 5, 123, 18},
+    {21, 0, 0, 5, 123, 17},
+    {21, 0, 0, 5, 123, 6},
+    {21, 0, 0, 5, 123, 12},
+    {7, 0, 0, 5, 114, 12},
+    {10, 0, 0, 5, 114, 21},
+    {12, 0, 13, 5, 114, 21},
+    {12, 9, 13, 5, 114, 21},
+    {21, 0, 0, 5, 114, 17},
+    {21, 0, 0, 5, 114, 12},
+    {13, 0, 0, 5, 114, 11},
+    {21, 0, 18, 5, 31, 18},
+    {7, 0, 0, 5, 101, 12},
+    {12, 0, 13, 5, 101, 21},
+    {10, 0, 0, 5, 101, 21},
+    {10, 9, 0, 5, 101, 21},
+    {12, 7, 13, 5, 101, 21},
+    {13, 0, 0, 5, 101, 11},
+    {7, 0, 0, 5, 126, 36},
+    {12, 0, 13, 5, 126, 36},
+    {10, 0, 0, 5, 126, 36},
+    {12, 9, 13, 5, 126, 36},
+    {13, 0, 0, 5, 126, 11},
+    {15, 0, 0, 5, 126, 36},
+    {21, 0, 0, 5, 126, 17},
+    {26, 0, 0, 5, 126, 36},
+    {9, 0, 0, 5, 125, 12},
+    {5, 0, 0, 5, 125, 12},
+    {13, 0, 0, 5, 125, 11},
+    {15, 0, 0, 5, 125, 12},
+    {7, 0, 0, 5, 125, 12},
+    {7, 0, 0, 5, 141, 12},
+    {12, 0, 13, 5, 141, 21},
+    {10, 0, 0, 5, 141, 21},
+    {12, 9, 13, 5, 141, 21},
+    {21, 0, 0, 5, 141, 18},
+    {21, 0, 0, 5, 141, 12},
+    {21, 0, 0, 5, 141, 17},
+    {7, 0, 0, 5, 140, 12},
+    {12, 0, 13, 5, 140, 21},
+    {10, 0, 0, 5, 140, 21},
+    {12, 9, 13, 5, 140, 21},
+    {21, 0, 0, 5, 140, 17},
+    {21, 0, 0, 5, 140, 18},
+    {7, 0, 0, 5, 121, 12},
+    {7, 0, 0, 5, 133, 12},
+    {10, 0, 0, 5, 133, 21},
+    {12, 0, 13, 5, 133, 21},
+    {12, 9, 0, 5, 133, 21},
+    {21, 0, 0, 5, 133, 17},
+    {13, 0, 0, 5, 133, 11},
+    {15, 0, 0, 5, 133, 12},
+    {21, 0, 0, 5, 134, 18},
+    {21, 0, 0, 5, 134, 6},
+    {7, 0, 0, 5, 134, 12},
+    {12, 0, 13, 5, 134, 21},
+    {10, 0, 0, 5, 134, 21},
+    {7, 0, 0, 5, 138, 12},
+    {12, 0, 13, 5, 138, 21},
+    {12, 7, 13, 5, 138, 21},
+    {12, 9, 13, 5, 138, 21},
+    {13, 0, 0, 5, 138, 11},
+    {7, 0, 0, 5, 62, 12},
+    {14, 0, 0, 5, 62, 12},
+    {21, 0, 0, 5, 62, 17},
+    {7, 0, 0, 5, 80, 12},
+    {7, 0, 0, 5, 80, 0},
+    {7, 0, 0, 5, 80, 1},
+    {7, 0, 0, 5, 127, 12},
+    {7, 0, 0, 5, 127, 0},
+    {7, 0, 0, 5, 127, 1},
+    {7, 0, 0, 5, 115, 12},
+    {13, 0, 0, 5, 115, 11},
+    {21, 0, 0, 5, 115, 17},
+    {7, 0, 0, 5, 103, 12},
+    {12, 1, 13, 5, 103, 21},
+    {21, 0, 0, 5, 103, 17},
+    {7, 0, 0, 5, 119, 12},
+    {12, 230, 13, 5, 119, 21},
+    {21, 0, 0, 5, 119, 17},
+    {21, 0, 0, 5, 119, 12},
+    {26, 0, 0, 5, 119, 12},
+    {6, 0, 0, 5, 119, 12},
+    {13, 0, 0, 5, 119, 11},
+    {15, 0, 0, 5, 119, 12},
+    {7, 0, 0, 5, 98, 12},
+    {10, 0, 0, 5, 98, 21},
+    {12, 0, 13, 5, 98, 21},
+    {6, 0, 0, 5, 98, 12},
+    {6, 0, 0, 2, 137, 5},
+    {6, 0, 0, 2, 139, 5},
+    {7, 0, 0, 2, 137, 14},
+    {7, 0, 0, 2, 139, 14},
+    {7, 0, 0, 5, 105, 12},
+    {26, 0, 0, 5, 105, 12},
+    {12, 0, 13, 5, 105, 21},
+    {12, 1, 13, 5, 105, 21},
+    {21, 0, 0, 5, 105, 17},
+    {10, 216, 0, 5, 0, 21},
+    {10, 226, 0, 5, 0, 21},
+    {12, 230, 13, 5, 2, 21},
+    {25, 0, 0, 5, 0, 12},
+    {13, 0, 8, 5, 0, 11},
+    {26, 0, 0, 5, 131, 12},
+    {12, 0, 13, 5, 131, 21},
+    {21, 0, 0, 5, 131, 17},
+    {21, 0, 0, 5, 131, 12},
+    {12, 230, 13, 5, 56, 21},
+    {7, 0, 3, 5, 113, 12},
+    {15, 0, 3, 5, 113, 12},
+    {12, 220, 13, 5, 113, 21},
+    {9, 0, 3, 5, 132, 12},
+    {5, 0, 3, 5, 132, 12},
+    {12, 230, 13, 5, 132, 21},
+    {12, 7, 13, 5, 132, 21},
+    {13, 0, 3, 5, 132, 11},
+    {21, 0, 3, 5, 132, 0},
+    {2, 0, 18, 5, 102, 14},
+    {26, 0, 0, 2, 0, 29},
+    {26, 0, 0, 5, 0, 28},
+    {26, 0, 0, 2, 32, 14},
+    {24, 0, 18, 2, 0, 42},
+    {26, 0, 18, 5, 0, 5},
 };
 
 #define BIDI_MIRROR_LEN 364
 };
 
 #define BIDI_MIRROR_LEN 364
@@ -1893,6 +1906,10 @@ static const Reindex nfc_last[] = {
 #define UCDN_SCRIPT_NEWA 135
 #define UCDN_SCRIPT_OSAGE 136
 #define UCDN_SCRIPT_TANGUT 137
 #define UCDN_SCRIPT_NEWA 135
 #define UCDN_SCRIPT_OSAGE 136
 #define UCDN_SCRIPT_TANGUT 137
+#define UCDN_SCRIPT_MASARAM_GONDI 138
+#define UCDN_SCRIPT_NUSHU 139
+#define UCDN_SCRIPT_SOYOMBO 140
+#define UCDN_SCRIPT_ZANABAZAR_SQUARE 141
 
 #define UCDN_GENERAL_CATEGORY_CC 0
 #define UCDN_GENERAL_CATEGORY_CF 1
 
 #define UCDN_GENERAL_CATEGORY_CC 0
 #define UCDN_GENERAL_CATEGORY_CF 1
@@ -1968,21 +1985,21 @@ static const unsigned char index0[] = {
     73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 52, 75, 76, 77, 78, 79, 
     80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 94, 96, 
     73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 52, 75, 76, 77, 78, 79, 
     80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 94, 96, 
-    97, 98, 99, 100, 101, 102, 103, 104, 94, 105, 94, 106, 94, 94, 94, 107
-    107, 107, 108, 109, 110, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 111
-    111, 112, 113, 114, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 
-    94, 94, 115, 116, 117, 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, 118, 118, 119, 120, 94, 94, 94, 121, 122, 122, 122, 122, 122
-    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122
-    122, 122, 122, 122, 123, 122, 122, 124, 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, 94, 125, 94, 94, 94, 94, 94, 94, 
-    94, 94, 94, 94, 94, 126, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 
-    94, 94, 94, 94, 94, 94, 94, 127, 128, 129, 130, 131, 132, 133, 134, 135
-    135, 136, 94, 94, 94, 94, 94, 137, 94, 94, 94, 94, 94, 94, 94, 138, 139
-    94, 94, 94, 94, 140, 94, 141, 142, 143, 144, 145, 146, 147, 148, 149
-    150, 151, 151, 151, 151, 151, 152, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    97, 98, 99, 100, 101, 102, 103, 104, 94, 105, 94, 106, 107, 94, 94, 108
+    108, 108, 109, 110, 111, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 112
+    112, 113, 114, 115, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 
+    94, 94, 116, 117, 118, 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, 119, 119, 120, 121, 94, 94, 94, 122, 123, 123, 123, 123, 123
+    123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123
+    123, 123, 123, 123, 124, 123, 123, 125, 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, 94, 126, 127, 128, 94, 94, 94, 
+    94, 94, 94, 94, 94, 94, 129, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 
+    94, 94, 94, 94, 94, 94, 94, 94, 130, 131, 132, 133, 134, 135, 136, 137
+    138, 138, 139, 94, 94, 94, 94, 94, 140, 94, 94, 94, 94, 94, 94, 94, 141
+    142, 94, 94, 94, 94, 143, 94, 144, 145, 146, 147, 148, 149, 150, 151
+    152, 153, 154, 154, 154, 154, 154, 155, 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, 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, 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, 52, 52, 52, 52, 52, 52, 52, 52, 
@@ -1991,32 +2008,31 @@ static const unsigned char index0[] = {
     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, 
     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, 
     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, 
-    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 153, 52, 52, 52, 52, 
-    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 154, 155, 52, 52, 52, 52, 
-    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 156, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 52, 52, 
-    158, 157, 157, 157, 157, 159, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 
-    157, 157, 157, 157, 157, 157, 157, 157, 157, 159, 94, 94, 94, 94, 94, 94, 
-    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 156, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 157, 158, 52, 52, 52, 
+    52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 
+    159, 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, 160, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 52, 52, 162, 161, 161, 161, 161, 163, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 
+    161, 161, 161, 163, 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, 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, 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, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 
@@ -2157,8 +2173,8 @@ static const unsigned char index0[] = {
     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, 
     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, 
     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, 
-    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 160, 161, 
     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, 
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 164, 165, 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, 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, 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, 94, 94, 94, 94, 94, 94, 94, 
@@ -2172,7 +2188,7 @@ static const unsigned char index0[] = {
     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, 
     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, 
     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, 
-    94, 94, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
@@ -2186,7 +2202,7 @@ static const unsigned char index0[] = {
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
-    74, 74, 74, 74, 74, 162, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 166, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
@@ -2200,7 +2216,8 @@ static const unsigned char index0[] = {
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
     74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
-    74, 74, 74, 74, 74, 74, 74, 74, 74, 162, 
+    74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 
+    74, 74, 166, 
 };
 
 static const unsigned short index1[] = {
 };
 
 static const unsigned short index1[] = {
@@ -2220,1136 +2237,1145 @@ static const unsigned short index1[] = {
     128, 128, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 145, 145, 
     146, 147, 148, 149, 128, 128, 128, 128, 128, 128, 150, 150, 150, 150, 
     151, 152, 153, 120, 154, 155, 156, 156, 156, 157, 158, 159, 160, 160, 
     128, 128, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 145, 145, 
     146, 147, 148, 149, 128, 128, 128, 128, 128, 128, 150, 150, 150, 150, 
     151, 152, 153, 120, 154, 155, 156, 156, 156, 157, 158, 159, 160, 160, 
-    161, 162, 163, 164, 165, 166, 167, 167, 167, 168, 120, 120, 120, 120, 
-    120, 120, 120, 120, 128, 128, 169, 170, 120, 120, 171, 126, 172, 173
-    174, 175, 176, 177, 177, 177, 177, 177, 177, 178, 179, 180, 181, 177
-    182, 183, 184, 177, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193
-    194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206
-    207, 208, 209, 210, 211, 212, 213, 120, 214, 215, 216, 217, 217, 218
-    219, 220, 221, 222, 223, 120, 224, 225, 226, 227, 228, 229, 230, 231
-    231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 120, 242, 243
-    244, 245, 246, 243, 247, 248, 249, 250, 251, 120, 252, 253, 254, 255
-    256, 257, 258, 259, 259, 258, 259, 260, 261, 262, 263, 264, 265, 266
-    120, 267, 268, 269, 270, 271, 271, 270, 272, 273, 274, 275, 276, 277
-    278, 279, 280, 120, 281, 282, 283, 284, 284, 284, 284, 285, 286, 287
-    288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 295, 295, 298, 299
-    296, 300, 301, 302, 303, 304, 305, 120, 306, 307, 307, 307, 307, 307
-    308, 309, 310, 311, 312, 313, 120, 120, 120, 120, 314, 315, 316, 317
-    318, 319, 320, 321, 322, 323, 324, 325, 120, 120, 120, 120, 326, 327
-    328, 329, 330, 331, 332, 333, 334, 335, 334, 334, 334, 336, 337, 338
-    339, 340, 341, 342, 341, 341, 341, 343, 344, 345, 346, 347, 120, 120, 
-    120, 120, 348, 348, 348, 348, 348, 349, 350, 351, 352, 353, 354, 355
-    356, 357, 358, 348, 359, 360, 352, 361, 362, 362, 362, 362, 363, 364
-    365, 365, 365, 365, 365, 366, 367, 367, 367, 367, 367, 367, 367, 367
-    367, 367, 367, 367, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369
-    369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370, 370, 370, 370
-    370, 370, 370, 370, 370, 371, 372, 371, 370, 370, 370, 370, 370, 371
-    370, 370, 370, 370, 371, 372, 371, 370, 372, 370, 370, 370, 370, 370
-    370, 370, 371, 370, 370, 370, 370, 370, 370, 370, 370, 373, 374, 375
-    376, 377, 370, 370, 378, 379, 380, 380, 380, 380, 380, 380, 380, 380
-    380, 380, 381, 382, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384
-    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384
-    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384
-    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384
-    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384
-    384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 384, 384
-    386, 387, 387, 388, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390
-    391, 392, 393, 394, 395, 120, 396, 396, 397, 120, 398, 398, 399, 120, 
-    400, 401, 402, 120, 403, 403, 403, 403, 403, 403, 404, 405, 406, 407
-    408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 418, 418, 418
-    419, 418, 418, 418, 418, 418, 418, 120, 420, 418, 418, 418, 418, 421
-    384, 384, 384, 384, 384, 384, 384, 384, 422, 120, 423, 423, 423, 424
-    425, 426, 427, 428, 429, 430, 431, 431, 431, 432, 433, 120, 434, 434
-    434, 434, 434, 435, 434, 434, 434, 436, 437, 438, 439, 439, 439, 439
-    440, 440, 441, 442, 443, 443, 443, 443, 443, 443, 444, 445, 446, 447
-    448, 449, 450, 451, 450, 451, 452, 453, 454, 455, 120, 120, 120, 120, 
-    120, 120, 120, 120, 456, 457, 457, 457, 457, 457, 458, 459, 460, 461
-    462, 463, 464, 465, 466, 467, 468, 469, 469, 469, 470, 471, 472, 473
-    474, 474, 474, 474, 475, 476, 477, 478, 479, 479, 479, 479, 480, 481
-    482, 483, 484, 485, 486, 487, 488, 488, 488, 489, 100, 490, 120, 120, 
-    120, 120, 120, 120, 491, 120, 492, 493, 494, 495, 496, 497, 54, 54, 54, 
-    54, 498, 499, 56, 56, 56, 56, 56, 500, 501, 502, 54, 503, 54, 54, 54, 
-    504, 56, 56, 56, 505, 506, 507, 508, 509, 509, 509, 510, 511, 27, 27, 27, 
-    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 512, 513, 27, 
-    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 514, 515, 516, 517, 514, 515
-    514, 515, 516, 517, 514, 518, 514, 515, 514, 516, 514, 519, 514, 519
-    514, 519, 520, 521, 522, 523, 524, 525, 514, 526, 527, 528, 529, 530
-    531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544
-    545, 546, 56, 547, 548, 549, 550, 551, 552, 552, 553, 554, 555, 556, 557
-    120, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570
-    571, 570, 572, 573, 574, 575, 576, 577, 578, 579, 580, 579, 581, 582
-    579, 583, 579, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594
-    595, 596, 597, 598, 599, 594, 594, 600, 601, 602, 603, 604, 594, 594
-    605, 585, 606, 607, 594, 594, 608, 594, 594, 579, 609, 610, 611, 612
-    613, 614, 615, 615, 615, 615, 615, 615, 615, 615, 616, 579, 579, 617
-    618, 585, 585, 619, 579, 579, 579, 579, 584, 620, 621, 622, 623, 579
-    579, 579, 579, 623, 120, 120, 120, 579, 624, 120, 120, 625, 625, 625
-    625, 625, 626, 626, 627, 628, 628, 628, 628, 628, 628, 628, 628, 628
-    629, 625, 630, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, 631
-    631, 631, 631, 633, 579, 631, 631, 634, 579, 635, 636, 637, 638, 639
-    640, 636, 579, 634, 641, 579, 642, 643, 644, 645, 646, 579, 579, 579
-    647, 648, 649, 650, 579, 651, 652, 579, 653, 579, 579, 654, 655, 656
-    657, 579, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 579
-    579, 579, 669, 579, 670, 579, 671, 672, 673, 674, 675, 676, 625, 677
-    677, 678, 579, 579, 579, 669, 679, 680, 681, 682, 683, 684, 685, 585
-    585, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 
-    686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 
-    686, 686, 686, 686, 686, 585, 585, 585, 585, 585, 585, 585, 585, 585
-    585, 585, 585, 585, 585, 585, 585, 687, 688, 688, 689, 594, 594, 585
-    690, 691, 692, 693, 694, 695, 696, 697, 698, 585, 699, 594, 700, 701
-    702, 703, 683, 585, 585, 597, 690, 703, 704, 705, 706, 594, 594, 594
-    594, 707, 708, 594, 594, 594, 594, 709, 710, 711, 683, 712, 713, 579
-    579, 579, 714, 579, 579, 585, 585, 715, 716, 717, 636, 579, 579, 718
-    579, 579, 579, 719, 579, 579, 579, 579, 720, 579, 721, 722, 120, 120, 
-    723, 120, 120, 724, 724, 724, 724, 724, 725, 726, 726, 726, 726, 726
-    727, 728, 729, 730, 731, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 
-    732, 733, 734, 735, 736, 736, 736, 736, 737, 738, 739, 739, 739, 739
-    739, 739, 739, 740, 741, 742, 370, 370, 372, 120, 372, 372, 372, 372
-    372, 372, 372, 372, 743, 743, 743, 743, 744, 745, 746, 747, 748, 749
-    750, 751, 752, 120, 120, 120, 120, 120, 120, 120, 753, 753, 753, 754
-    753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 755, 120, 753, 753
-    753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753
-    753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 756, 120, 120, 120, 
-    757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 769
-    770, 769, 769, 769, 771, 772, 773, 774, 775, 776, 777, 777, 778, 777
-    777, 777, 779, 780, 781, 782, 783, 784, 784, 784, 784, 785, 786, 787
-    787, 787, 787, 787, 787, 787, 787, 787, 787, 788, 789, 790, 784, 784
-    784, 791, 757, 757, 757, 757, 758, 120, 792, 792, 793, 793, 793, 794
-    795, 796, 790, 790, 790, 797, 798, 799, 793, 793, 793, 800, 795, 796
-    790, 790, 790, 790, 801, 799, 790, 802, 803, 803, 803, 803, 803, 804
-    803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 790, 790, 790
-    805, 806, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 807
-    790, 790, 790, 805, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808
-    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808
-    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808
-    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808
-    808, 808, 809, 810, 579, 579, 579, 579, 579, 579, 579, 579, 808, 808
-    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808
-    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 809, 810, 810, 810
-    810, 810, 811, 811, 812, 811, 811, 811, 811, 811, 811, 811, 811, 811
-    811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811
-    811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811
-    811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811
-    811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811
-    811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 813
-    814, 814, 814, 814, 814, 814, 815, 120, 816, 816, 816, 816, 816, 817
-    818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818
-    818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818
-    818, 818, 818, 818, 818, 819, 818, 818, 820, 821, 120, 120, 101, 101, 
-    101, 101, 101, 822, 823, 824, 101, 101, 101, 825, 826, 826, 826, 826
-    826, 826, 826, 826, 827, 828, 829, 120, 64, 64, 830, 831, 832, 27, 833
-    27, 27, 27, 27, 27, 27, 27, 834, 835, 27, 836, 837, 27, 27, 838, 839
-    120, 120, 120, 120, 120, 120, 120, 840, 841, 842, 843, 844, 844, 845
-    846, 847, 848, 849, 849, 849, 849, 849, 849, 850, 120, 851, 852, 852
-    852, 852, 852, 853, 854, 855, 856, 857, 858, 859, 859, 860, 861, 862
-    863, 864, 864, 865, 866, 867, 867, 868, 869, 870, 871, 367, 367, 367
-    872, 873, 874, 874, 874, 874, 874, 875, 876, 877, 878, 879, 880, 881
-    348, 352, 882, 883, 883, 883, 883, 883, 884, 885, 120, 886, 887, 888
-    889, 348, 348, 890, 891, 892, 892, 892, 892, 892, 892, 893, 894, 895
-    120, 120, 896, 897, 898, 899, 120, 900, 900, 900, 120, 372, 372, 54, 54, 
-    54, 54, 54, 901, 902, 120, 903, 903, 903, 903, 903, 903, 903, 903, 903
-    903, 897, 897, 897, 897, 904, 905, 906, 907, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909
-    909, 909, 908, 909, 909, 910, 909, 909, 909, 909, 909, 909, 908, 909
-    909, 910, 909, 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909
-    909, 911, 120, 368, 368, 912, 913, 369, 369, 369, 369, 369, 914, 915
-    915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915
-    915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915
-    915, 915, 915, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916
-    916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916
-    916, 916, 916, 916, 916, 916, 916, 808, 808, 808, 808, 808, 808, 808
-    808, 808, 808, 808, 808, 808, 809, 808, 808, 808, 808, 808, 808, 808
-    808, 808, 808, 808, 808, 808, 917, 810, 810, 810, 810, 918, 120, 919
-    920, 121, 921, 922, 923, 924, 121, 128, 128, 128, 128, 128, 128, 128, 
-    128, 128, 128, 128, 128, 925, 926, 927, 120, 928, 128, 128, 128, 128, 
+    161, 162, 163, 164, 165, 166, 167, 167, 167, 168, 145, 169, 120, 120, 
+    120, 120, 120, 120, 128, 128, 170, 171, 120, 120, 172, 126, 173, 174
+    175, 176, 177, 178, 178, 178, 178, 178, 178, 179, 180, 181, 182, 178
+    183, 184, 185, 178, 186, 187, 188, 189, 189, 190, 191, 192, 193, 194
+    195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207
+    208, 209, 210, 211, 212, 213, 214, 120, 215, 216, 217, 218, 218, 219
+    220, 221, 222, 223, 224, 120, 225, 226, 227, 228, 229, 230, 231, 232
+    232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 120, 243, 244
+    245, 246, 247, 244, 248, 249, 250, 251, 252, 120, 253, 254, 255, 256
+    257, 258, 259, 260, 260, 259, 260, 261, 262, 263, 264, 265, 266, 267
+    120, 268, 269, 270, 271, 272, 272, 271, 273, 274, 275, 276, 277, 278
+    279, 280, 281, 120, 282, 283, 284, 285, 285, 285, 285, 286, 287, 288
+    289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 296, 296, 299, 300
+    297, 301, 302, 303, 304, 305, 306, 120, 307, 308, 308, 308, 308, 308
+    309, 310, 311, 312, 313, 314, 120, 120, 120, 120, 315, 316, 317, 318
+    319, 320, 321, 322, 323, 324, 325, 326, 120, 120, 120, 120, 327, 328
+    329, 330, 331, 332, 333, 334, 335, 336, 335, 335, 335, 337, 338, 339
+    340, 341, 342, 343, 342, 342, 342, 344, 345, 346, 347, 348, 120, 120, 
+    120, 120, 349, 349, 349, 349, 349, 350, 351, 352, 353, 354, 355, 356
+    357, 358, 359, 349, 360, 361, 353, 362, 363, 363, 363, 363, 364, 365
+    366, 366, 366, 366, 366, 367, 368, 368, 368, 368, 368, 368, 368, 368
+    368, 368, 368, 368, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370
+    370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 371, 371, 371, 371
+    371, 371, 371, 371, 371, 372, 373, 372, 371, 371, 371, 371, 371, 372
+    371, 371, 371, 371, 372, 373, 372, 371, 373, 371, 371, 371, 371, 371
+    371, 371, 372, 371, 371, 371, 371, 371, 371, 371, 371, 374, 375, 376
+    377, 378, 371, 371, 379, 380, 381, 381, 381, 381, 381, 381, 381, 381
+    381, 381, 382, 383, 384, 385, 385, 385, 385, 385, 385, 385, 385, 385
+    385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385
+    385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385
+    385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385
+    385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385
+    385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 386, 385, 385
+    387, 388, 388, 389, 390, 390, 390, 390, 390, 390, 390, 390, 390, 391
+    392, 393, 394, 395, 396, 120, 397, 397, 398, 120, 399, 399, 400, 120, 
+    401, 402, 403, 120, 404, 404, 404, 404, 404, 404, 405, 406, 407, 408
+    409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 419, 419, 419
+    420, 419, 419, 419, 419, 419, 419, 120, 421, 419, 419, 419, 419, 422
+    385, 385, 385, 385, 385, 385, 385, 385, 423, 120, 424, 424, 424, 425
+    426, 427, 428, 429, 430, 431, 432, 432, 432, 433, 434, 120, 435, 435
+    435, 435, 435, 436, 435, 435, 435, 437, 438, 439, 440, 440, 440, 440
+    441, 441, 442, 443, 444, 444, 444, 444, 444, 444, 445, 446, 447, 448
+    449, 450, 451, 452, 451, 452, 453, 454, 455, 456, 120, 120, 120, 120, 
+    120, 120, 120, 120, 457, 458, 458, 458, 458, 458, 459, 460, 461, 462
+    463, 464, 465, 466, 467, 468, 469, 470, 470, 470, 471, 472, 473, 474
+    475, 475, 475, 475, 476, 477, 478, 479, 480, 480, 480, 480, 481, 482
+    483, 484, 485, 486, 487, 488, 489, 489, 489, 490, 100, 491, 120, 120, 
+    120, 120, 120, 120, 492, 120, 493, 494, 495, 496, 497, 498, 54, 54, 54, 
+    54, 499, 500, 56, 56, 56, 56, 56, 501, 502, 503, 54, 504, 54, 54, 54, 
+    505, 56, 56, 56, 506, 507, 508, 509, 510, 510, 510, 511, 512, 27, 27, 27, 
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 513, 514, 27, 
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 515, 516, 517, 518, 515, 516
+    515, 516, 517, 518, 515, 519, 515, 516, 515, 517, 515, 520, 515, 520
+    515, 520, 521, 522, 523, 524, 525, 526, 515, 527, 528, 529, 530, 531
+    532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545
+    546, 547, 56, 548, 549, 550, 551, 552, 553, 553, 554, 555, 556, 557, 558
+    120, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571
+    572, 571, 573, 574, 575, 576, 577, 578, 579, 580, 581, 580, 582, 583
+    580, 584, 580, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 586
+    595, 596, 586, 597, 598, 586, 586, 598, 586, 599, 600, 599, 586, 586
+    601, 586, 586, 586, 586, 586, 602, 586, 586, 580, 603, 604, 605, 606
+    607, 608, 609, 609, 609, 609, 609, 609, 609, 609, 610, 580, 580, 611
+    612, 586, 586, 613, 580, 580, 580, 580, 585, 606, 614, 615, 580, 580
+    580, 580, 580, 616, 120, 120, 120, 580, 617, 120, 120, 618, 618, 618
+    618, 618, 619, 619, 620, 621, 621, 621, 621, 621, 621, 621, 621, 621
+    622, 618, 623, 624, 624, 624, 624, 624, 624, 624, 624, 624, 625, 624
+    624, 624, 624, 626, 580, 624, 624, 627, 580, 628, 629, 630, 631, 632
+    633, 629, 580, 627, 634, 580, 635, 636, 637, 638, 639, 580, 580, 580
+    640, 641, 642, 643, 580, 644, 645, 580, 646, 580, 580, 647, 648, 649
+    650, 580, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 580
+    580, 580, 662, 580, 663, 580, 664, 665, 666, 667, 668, 669, 618, 670
+    670, 671, 580, 580, 580, 662, 672, 673, 586, 586, 586, 674, 675, 586
+    586, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 
+    676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 
+    676, 676, 676, 676, 676, 586, 586, 586, 586, 586, 586, 586, 586, 586
+    586, 586, 586, 586, 586, 586, 586, 677, 678, 678, 679, 586, 586, 586
+    586, 586, 586, 586, 680, 586, 586, 586, 681, 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, 580
+    580, 580, 682, 580, 580, 586, 586, 683, 684, 685, 629, 580, 580, 686
+    580, 580, 580, 687, 580, 580, 580, 580, 688, 580, 689, 617, 120, 120, 
+    690, 120, 120, 691, 691, 691, 691, 691, 692, 693, 693, 693, 693, 693
+    694, 695, 696, 697, 698, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 
+    699, 700, 701, 702, 703, 703, 703, 703, 704, 705, 706, 706, 706, 706
+    706, 706, 706, 707, 708, 709, 371, 371, 373, 120, 373, 373, 373, 373
+    373, 373, 373, 373, 710, 710, 710, 710, 711, 712, 713, 714, 715, 716
+    717, 718, 719, 720, 120, 120, 120, 120, 120, 120, 721, 721, 721, 722
+    721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 723, 120, 721, 721
+    721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721
+    721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 724, 120, 120, 120, 
+    725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 737
+    738, 737, 737, 737, 739, 740, 741, 742, 743, 744, 745, 745, 746, 745
+    745, 745, 747, 748, 749, 750, 751, 752, 752, 752, 752, 753, 754, 755
+    755, 755, 755, 755, 755, 755, 755, 755, 755, 756, 757, 758, 752, 752
+    752, 759, 725, 725, 725, 725, 726, 120, 760, 760, 761, 761, 761, 762
+    763, 764, 758, 758, 758, 765, 766, 767, 761, 761, 761, 768, 763, 764
+    758, 758, 758, 758, 769, 767, 758, 770, 771, 771, 771, 771, 771, 772
+    771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 758, 758, 758
+    773, 774, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 775
+    758, 758, 758, 773, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776
+    776, 776, 777, 778, 580, 580, 580, 580, 580, 580, 580, 580, 776, 776
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 779
+    778, 778, 780, 780, 781, 780, 780, 780, 780, 780, 780, 780, 780, 780
+    780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780
+    780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780
+    780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780
+    780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780
+    780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 782
+    783, 783, 783, 783, 783, 783, 784, 120, 785, 785, 785, 785, 785, 786
+    787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787
+    787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787
+    787, 787, 787, 787, 787, 788, 787, 787, 789, 790, 120, 120, 101, 101, 
+    101, 101, 101, 791, 792, 793, 101, 101, 101, 794, 795, 795, 795, 795
+    795, 795, 795, 795, 796, 797, 798, 120, 64, 64, 799, 800, 801, 27, 802
+    27, 27, 27, 27, 27, 27, 27, 803, 804, 27, 805, 806, 27, 27, 807, 808
+    120, 120, 120, 120, 120, 120, 120, 809, 810, 811, 812, 813, 813, 814
+    815, 816, 817, 818, 818, 818, 818, 818, 818, 819, 120, 820, 821, 821
+    821, 821, 821, 822, 823, 824, 825, 826, 827, 828, 828, 829, 830, 831
+    832, 833, 833, 834, 835, 836, 836, 837, 838, 839, 840, 368, 368, 368
+    841, 842, 843, 843, 843, 843, 843, 844, 845, 846, 847, 848, 849, 850
+    349, 353, 851, 852, 852, 852, 852, 852, 853, 854, 120, 855, 856, 857
+    858, 349, 349, 859, 860, 861, 861, 861, 861, 861, 861, 862, 863, 864
+    120, 120, 865, 866, 867, 868, 120, 869, 869, 869, 120, 373, 373, 54, 54, 
+    54, 54, 54, 870, 871, 120, 872, 872, 872, 872, 872, 872, 872, 872, 872
+    872, 866, 866, 866, 866, 873, 874, 875, 876, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878, 878, 879, 878
+    878, 878, 877, 878, 878, 879, 878, 878, 878, 878, 878, 878, 877, 878
+    878, 879, 878, 878, 878, 877, 878, 878, 879, 878, 878, 878, 877, 878
+    878, 880, 120, 369, 369, 881, 882, 370, 370, 370, 370, 370, 883, 884
+    884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884
+    884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884
+    884, 884, 884, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885
+    885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885
+    885, 885, 885, 885, 885, 885, 885, 776, 776, 776, 776, 776, 776, 776
+    776, 776, 776, 776, 776, 776, 777, 776, 776, 776, 776, 776, 776, 776
+    776, 776, 776, 776, 776, 776, 886, 778, 778, 778, 778, 887, 120, 888
+    889, 121, 890, 891, 892, 893, 121, 128, 128, 128, 128, 128, 128, 128, 
+    128, 128, 128, 128, 128, 894, 895, 896, 120, 897, 128, 128, 128, 128, 
     128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 
     128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 
     128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 
     128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 
-    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 929, 120, 
-    120, 128, 128, 128, 128, 128, 128, 128, 128, 930, 128, 128, 128, 128, 
-    128, 128, 120, 120, 120, 120, 120, 128, 931, 932, 932, 933, 934, 935, 
-    936, 937, 938, 939, 940, 941, 942, 943, 944, 169, 128, 128, 128, 128, 
-    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 945, 946, 
-    947, 948, 949, 950, 951, 951, 952, 953, 954, 954, 955, 956, 957, 958, 
-    959, 959, 959, 959, 960, 961, 961, 961, 962, 963, 963, 963, 964, 965, 
-    966, 120, 967, 968, 969, 968, 968, 970, 968, 968, 971, 968, 972, 968, 
-    972, 120, 120, 120, 120, 968, 968, 968, 968, 968, 968, 968, 968, 968, 
-    968, 968, 968, 968, 968, 968, 973, 974, 975, 975, 975, 975, 975, 976, 
-    615, 977, 977, 977, 977, 977, 977, 978, 979, 980, 981, 579, 982, 983, 
-    120, 120, 120, 120, 120, 615, 615, 615, 615, 615, 984, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 985, 
-    985, 985, 986, 987, 987, 987, 987, 987, 987, 988, 120, 989, 990, 990, 
-    991, 992, 992, 992, 992, 993, 120, 994, 994, 995, 996, 997, 997, 997, 
-    997, 998, 999, 1000, 1000, 1000, 1001, 1002, 1002, 1002, 1002, 1003, 
-    1002, 1004, 120, 120, 120, 120, 120, 1005, 1005, 1005, 1005, 1005, 1006, 
-    1006, 1006, 1006, 1006, 1007, 1007, 1007, 1007, 1007, 1007, 1008, 1008, 
-    1008, 1009, 1010, 1011, 1012, 1012, 1012, 1012, 1013, 1014, 1014, 1014, 
-    1014, 1015, 1016, 1016, 1016, 1016, 1016, 120, 1017, 1017, 1017, 1017, 
-    1017, 1017, 1018, 1019, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 1020, 1020, 1020, 1020, 1020, 
-    1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 
-    1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 
-    1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1021, 120, 1020, 
-    1020, 1022, 120, 1020, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 1023, 1024, 1025, 1025, 
-    1025, 1025, 1026, 1027, 1028, 1028, 1029, 1030, 1031, 1031, 1032, 1033, 
-    1034, 1034, 1034, 1035, 1036, 1037, 120, 120, 120, 120, 120, 120, 1038, 
-    1038, 1039, 1040, 1041, 1041, 1042, 1043, 1044, 1044, 1044, 1045, 120, 
-    120, 120, 120, 120, 120, 120, 120, 1046, 1046, 1046, 1046, 1047, 1047, 
-    1047, 1048, 1049, 1049, 1050, 1049, 1049, 1049, 1049, 1049, 1051, 1052, 
-    1053, 1054, 1055, 1055, 1056, 1057, 1058, 120, 1059, 1060, 1061, 1061, 
-    1061, 1062, 1063, 1063, 1063, 1064, 120, 120, 120, 120, 1065, 1066, 1065, 
-    1065, 1067, 1068, 1069, 120, 1070, 1070, 1070, 1070, 1070, 1070, 1071, 
-    1072, 1073, 1073, 1074, 1075, 1076, 1076, 1077, 1078, 1079, 1079, 1080, 
-    1081, 120, 1082, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1083, 
-    1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1084, 120, 120, 120, 120, 
-    120, 120, 1085, 1085, 1085, 1085, 1085, 1085, 1086, 120, 1087, 1087, 
-    1087, 1087, 1087, 1087, 1088, 1089, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 898, 120, 
+    120, 128, 128, 128, 128, 128, 128, 128, 128, 899, 128, 128, 128, 128, 
+    128, 128, 120, 120, 120, 120, 120, 128, 900, 901, 901, 902, 903, 904, 
+    905, 906, 907, 908, 909, 910, 911, 912, 913, 170, 128, 128, 128, 128, 
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 914, 915, 
+    916, 917, 918, 919, 920, 920, 921, 922, 923, 923, 924, 925, 926, 927, 
+    928, 928, 928, 928, 929, 930, 930, 930, 931, 932, 932, 932, 933, 934, 
+    935, 120, 936, 937, 938, 937, 937, 939, 937, 937, 940, 937, 941, 937, 
+    941, 120, 120, 120, 120, 937, 937, 937, 937, 937, 937, 937, 937, 937, 
+    937, 937, 937, 937, 937, 937, 942, 943, 944, 944, 944, 944, 944, 945, 
+    609, 946, 946, 946, 946, 946, 946, 947, 948, 949, 950, 580, 951, 952, 
+    120, 120, 120, 120, 120, 609, 609, 609, 609, 609, 953, 120, 120, 120, 
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 954, 
+    954, 954, 955, 956, 956, 956, 956, 956, 956, 957, 120, 958, 959, 959, 
+    960, 961, 961, 961, 961, 962, 963, 964, 964, 965, 966, 967, 967, 967, 
+    967, 968, 969, 970, 970, 970, 971, 972, 972, 972, 972, 973, 972, 974, 
+    120, 120, 120, 120, 120, 975, 975, 975, 975, 975, 976, 976, 976, 976, 
+    976, 977, 977, 977, 977, 977, 977, 978, 978, 978, 979, 980, 981, 982, 
+    982, 982, 982, 983, 984, 984, 984, 984, 985, 986, 986, 986, 986, 986, 
+    120, 987, 987, 987, 987, 987, 987, 988, 989, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 990, 
+    990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 
+    990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 
+    990, 990, 990, 990, 990, 990, 990, 990, 990, 991, 120, 990, 990, 992, 
+    120, 990, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 120, 120, 120, 993, 994, 995, 995, 995, 995, 996, 
+    997, 998, 998, 999, 1000, 1001, 1001, 1002, 1003, 1004, 1004, 1004, 1005, 
+    1006, 1007, 120, 120, 120, 120, 120, 120, 1008, 1008, 1009, 1010, 1011, 
+    1011, 1012, 1013, 1014, 1014, 1014, 1015, 120, 120, 120, 120, 120, 120, 
+    120, 120, 1016, 1016, 1016, 1016, 1017, 1017, 1017, 1018, 1019, 1019, 
+    1020, 1019, 1019, 1019, 1019, 1019, 1021, 1022, 1023, 1024, 1025, 1025, 
+    1026, 1027, 1028, 120, 1029, 1030, 1031, 1031, 1031, 1032, 1033, 1033, 
+    1033, 1034, 120, 120, 120, 120, 1035, 1036, 1035, 1035, 1037, 1038, 1039, 
+    120, 1040, 1040, 1040, 1040, 1040, 1040, 1041, 1042, 1043, 1043, 1044, 
+    1045, 1046, 1046, 1047, 1048, 1049, 1049, 1050, 1051, 120, 1052, 120, 
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 1053, 1053, 1053, 1053, 
+    1053, 1053, 1053, 1053, 1053, 1054, 120, 120, 120, 120, 120, 120, 1055, 
+    1055, 1055, 1055, 1055, 1055, 1056, 120, 1057, 1057, 1057, 1057, 1057, 
+    1057, 1058, 1059, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 1090, 1090, 1090, 1091, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 1092, 1093, 1093, 1093, 1093, 1093, 1093, 1094, 1095, 1096, 1097, 
-    1098, 1099, 1100, 120, 1101, 1102, 1103, 1103, 1103, 1103, 1103, 1104, 
-    1105, 1106, 120, 1107, 1107, 1107, 1108, 1109, 1110, 1111, 1112, 1112, 
-    1112, 1113, 1114, 1115, 1116, 1117, 120, 1118, 1118, 1118, 1118, 1119, 
-    120, 1120, 1121, 1121, 1121, 1121, 1121, 1122, 1123, 1124, 1125, 1126, 
-    1127, 1128, 1129, 1130, 120, 1131, 1131, 1132, 1131, 1131, 1133, 1134, 
-    1135, 120, 120, 120, 120, 120, 120, 120, 120, 1136, 1137, 1138, 1139, 
-    1138, 1140, 1141, 1141, 1141, 1141, 1141, 1142, 1143, 1144, 1145, 1146, 
-    1147, 1148, 1149, 1150, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 
-    1158, 1159, 1159, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 1160, 1160, 1160, 1160, 1160, 1160, 1161, 
-    1162, 1163, 1164, 1165, 1166, 120, 120, 120, 120, 1167, 1167, 1167, 1167, 
-    1167, 1167, 1168, 1169, 1170, 120, 1171, 1172, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 120, 1060, 1060, 1060, 1061, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1062, 1063, 1063, 
+    1063, 1063, 1063, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 120, 
+    1071, 1072, 1073, 1073, 1073, 1073, 1073, 1074, 1075, 1076, 120, 1077, 
+    1077, 1077, 1078, 1079, 1080, 1081, 1082, 1082, 1082, 1083, 1084, 1085, 
+    1086, 1087, 120, 1088, 1088, 1088, 1088, 1089, 120, 1090, 1091, 1091, 
+    1091, 1091, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 
+    120, 1101, 1101, 1102, 1101, 1101, 1103, 1104, 1105, 120, 120, 120, 120, 
+    120, 120, 120, 120, 1106, 1107, 1108, 1109, 1108, 1110, 1111, 1111, 1111, 
+    1111, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1120, 
+    1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1129, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 1173, 1173, 1173, 1173, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 
-    1180, 120, 120, 120, 120, 1181, 1181, 1181, 1181, 1181, 1181, 1182, 1183, 
-    1184, 120, 1185, 1186, 1187, 1188, 120, 120, 1189, 1189, 1189, 1189, 
-    1189, 1190, 1191, 120, 1192, 1193, 120, 120, 120, 120, 120, 120, 1194, 
-    1194, 1194, 1195, 1196, 1197, 1198, 1199, 120, 120, 120, 120, 120, 120, 
+    120, 1130, 1130, 1130, 1130, 1130, 1130, 1131, 1132, 1133, 1134, 1135, 
+    1136, 120, 120, 120, 120, 1137, 1137, 1137, 1137, 1137, 1137, 1138, 1139, 
+    1140, 120, 1141, 1142, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1143, 1143, 1143, 1143, 
+    1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 120, 120, 120, 120, 1151, 
+    1151, 1151, 1151, 1151, 1151, 1152, 1153, 1154, 120, 1155, 1156, 1157, 
+    1158, 120, 120, 1159, 1159, 1159, 1159, 1159, 1160, 1161, 120, 1162, 
+    1163, 120, 120, 120, 120, 120, 120, 1164, 1164, 1164, 1165, 1166, 1167, 
+    1168, 1169, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1200, 1200, 1200, 1200, 
-    1201, 1201, 1201, 1201, 1202, 1203, 1204, 1205, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 1170, 1170, 1170, 1170, 1171, 1171, 1171, 1171, 1172, 
+    1173, 1174, 1175, 1176, 1177, 1178, 1178, 1178, 1178, 1179, 1180, 1181, 
+    120, 1182, 1183, 1184, 1184, 1184, 1184, 1185, 1186, 1187, 1188, 1189, 
+    120, 120, 120, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1191, 1192, 
+    1193, 1192, 1192, 1192, 1194, 1195, 1196, 1197, 120, 1198, 1199, 1200, 
+    1201, 1202, 1203, 1203, 1203, 1204, 1205, 1205, 1206, 1207, 120, 120, 
+    120, 120, 120, 120, 120, 120, 120, 1208, 1209, 1210, 1210, 1210, 1210, 
+    1211, 1212, 1213, 120, 1214, 1215, 120, 120, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1216, 
+    1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 
+    1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 
+    1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 
+    1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 
+    1216, 1216, 1217, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
+    120, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 
+    1218, 1218, 1219, 1220, 120, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 
+    1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 
+    1216, 1216, 1216, 1216, 1216, 1221, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1207, 
-    1208, 1209, 1208, 1208, 1208, 1210, 1211, 1212, 1213, 120, 1214, 1215, 
-    1216, 1217, 1218, 1219, 1219, 1219, 1220, 1221, 1221, 1222, 1223, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 1224, 1224, 1224, 1224, 1224, 
-    1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 
-    1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 
-    1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 
-    1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1225, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1226, 1226, 1226, 
-    1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1227, 1228, 
-    120, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 
-    1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 
-    1224, 1229, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1230, 1230, 1230, 
-    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 
-    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 
-    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 
-    1230, 1230, 1230, 1230, 1231, 1230, 1230, 1230, 1230, 1232, 1233, 1230, 
-    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 
-    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 
-    1230, 1230, 1230, 1230, 1234, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 
-    1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 
-    1230, 1230, 1235, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
+    120, 120, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 
+    1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 
+    1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 
+    1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1223, 1222, 1222, 
+    1222, 1222, 1224, 1225, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 
+    1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 
+    1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1226, 1222, 1222, 
+    1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 
+    1222, 1222, 1222, 1222, 1222, 1222, 1222, 1227, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 
-    1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 
-    1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 
-    1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 
-    1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1237, 1236, 
-    1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 
-    1236, 1238, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 826, 826, 826, 
-    826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 
-    826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 
-    826, 826, 826, 826, 826, 826, 826, 826, 1239, 1240, 1240, 1240, 1241, 
-    1242, 1243, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    1244, 1244, 1244, 1245, 1246, 120, 1247, 1247, 1247, 1247, 1247, 1247, 
-    1248, 1249, 1250, 120, 1251, 1252, 1253, 1247, 1247, 1254, 1247, 1247, 
+    120, 120, 120, 120, 120, 120, 120, 1228, 1228, 1228, 1228, 1228, 1228, 
+    1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 
+    1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 
+    1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 
+    1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 
+    1228, 1228, 1228, 1229, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 
+    1228, 1228, 1228, 1228, 1228, 1228, 1230, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1256, 120, 1257, 1258, 
-    1258, 1258, 1258, 1259, 120, 1260, 1261, 1262, 120, 120, 120, 120, 120, 
-    120, 120, 120, 1263, 120, 120, 120, 1264, 1264, 1264, 1264, 1264, 1264, 
-    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 
-    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 
-    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 
-    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 
-    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1265, 120, 120, 1264, 1264, 
-    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 
-    1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 
-    1264, 1264, 1264, 1264, 1266, 120, 1267, 120, 120, 120, 120, 120, 120, 
+    120, 120, 120, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 
+    795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 
+    795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 
+    1231, 1232, 1232, 1232, 1233, 1234, 1235, 120, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 120, 120, 1236, 1236, 1236, 1237, 1238, 120, 1239, 
+    1239, 1239, 1239, 1239, 1239, 1240, 1241, 1242, 120, 1243, 1244, 1245, 
+    1239, 1239, 1246, 1239, 1239, 120, 120, 120, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 120, 120, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 
+    1247, 1248, 120, 1249, 1250, 1250, 1250, 1250, 1251, 120, 1252, 1253, 
+    1254, 120, 120, 120, 120, 120, 120, 120, 120, 1255, 120, 120, 120, 1256, 
+    1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 
+    1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 
+    1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 
+    1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 
+    1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 
+    1257, 120, 120, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 
+    1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 
+    1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1258, 120, 1259, 
+    737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 
+    737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 
+    737, 737, 737, 737, 737, 737, 1260, 120, 120, 120, 120, 120, 120, 120, 
+    120, 120, 120, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 
+    1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 
+    1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 
+    1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 
+    1261, 1261, 1261, 1261, 1262, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 
+    1263, 1263, 1263, 1263, 1263, 1263, 1264, 1263, 1265, 1263, 1266, 1263, 
+    1267, 1268, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 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, 1269, 120, 609, 609, 609, 609, 1270, 1271, 609, 609, 609, 609, 609, 
+    609, 1272, 1273, 1274, 1275, 1276, 1277, 609, 609, 609, 1278, 609, 609, 
+    609, 609, 609, 609, 609, 1279, 120, 120, 949, 949, 949, 949, 949, 949, 
+    949, 949, 1280, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 580, 580, 
+    580, 580, 580, 580, 580, 580, 580, 580, 616, 120, 944, 944, 1281, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1268, 1268, 1268, 
-    1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1269, 1268, 
-    1270, 1268, 1271, 1268, 1272, 1273, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 
-    615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 
-    615, 615, 615, 615, 615, 615, 1274, 120, 615, 615, 615, 615, 1275, 1276, 
-    615, 615, 615, 615, 615, 615, 1277, 1278, 1279, 1280, 1281, 1282, 615, 
-    615, 615, 1283, 615, 615, 615, 615, 615, 615, 615, 1284, 120, 120, 980, 
-    980, 980, 980, 980, 980, 980, 980, 1285, 120, 120, 120, 120, 120, 120, 
+    120, 120, 1282, 1282, 1282, 1283, 1284, 1284, 1285, 1282, 1282, 1286, 
+    1287, 1284, 1284, 1282, 1282, 1282, 1283, 1284, 1284, 1288, 1289, 1290, 
+    1286, 1291, 1292, 1284, 1282, 1282, 1282, 1283, 1284, 1284, 1293, 1294, 
+    1295, 1296, 1284, 1284, 1284, 1297, 1298, 1299, 1300, 1284, 1284, 1285, 
+    1282, 1282, 1286, 1284, 1284, 1284, 1282, 1282, 1282, 1283, 1284, 1284, 
+    1285, 1282, 1282, 1286, 1284, 1284, 1284, 1282, 1282, 1282, 1283, 1284, 
+    1284, 1285, 1282, 1282, 1286, 1284, 1284, 1284, 1282, 1282, 1282, 1283, 
+    1284, 1284, 1301, 1282, 1282, 1282, 1302, 1284, 1284, 1303, 1304, 1282, 
+    1282, 1305, 1284, 1284, 1306, 1285, 1282, 1282, 1307, 1284, 1284, 1308, 
+    1309, 1282, 1282, 1310, 1284, 1284, 1284, 1311, 1282, 1282, 1282, 1302, 
+    1284, 1284, 1303, 1312, 1313, 1313, 1313, 1313, 1313, 1313, 1314, 1314, 
+    1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 
+    1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 
+    1314, 1314, 1314, 1314, 1314, 1314, 1315, 1315, 1315, 1315, 1315, 1315, 
+    1316, 1317, 1315, 1315, 1315, 1315, 1315, 1318, 1319, 1314, 1320, 1321, 
+    120, 1322, 1323, 1315, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
+    1324, 1325, 1325, 1326, 1327, 1328, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 623, 
-    120, 975, 975, 1286, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 1287, 1287, 1287, 1288, 1289, 1289, 
-    1290, 1287, 1287, 1291, 1292, 1289, 1289, 1287, 1287, 1287, 1288, 1289, 
-    1289, 1293, 1294, 1295, 1291, 1296, 1297, 1289, 1287, 1287, 1287, 1288, 
-    1289, 1289, 1298, 1299, 1300, 1301, 1289, 1289, 1289, 1302, 1303, 1304, 
-    1305, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 1287, 1287, 
-    1287, 1288, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 1287, 
-    1287, 1287, 1288, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 
-    1287, 1287, 1287, 1288, 1289, 1289, 1306, 1287, 1287, 1287, 1307, 1289, 
-    1289, 1308, 1309, 1287, 1287, 1310, 1289, 1289, 1311, 1290, 1287, 1287, 
-    1312, 1289, 1289, 1313, 1314, 1287, 1287, 1315, 1289, 1289, 1289, 1316, 
-    1287, 1287, 1287, 1307, 1289, 1289, 1308, 1317, 1318, 1318, 1318, 1318, 
-    1318, 1318, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 
-    1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 
-    1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1320, 1320, 
-    1320, 1320, 1320, 1320, 1321, 1322, 1320, 1320, 1320, 1320, 1320, 1323, 
-    1324, 1319, 1325, 1326, 120, 1327, 1328, 1320, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 1329, 1330, 1330, 1331, 1332, 1333, 120, 120, 
+    120, 120, 120, 120, 120, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 
+    1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 
+    1329, 1329, 1329, 1329, 1330, 1331, 1332, 120, 120, 120, 120, 120, 1333, 
+    1333, 1333, 1333, 1334, 1335, 1335, 1335, 1336, 1337, 1338, 1339, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
     120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1334, 1334, 1334, 1334, 
-    1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 
-    1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1335, 1336, 1337, 120, 
-    120, 120, 120, 120, 1338, 1338, 1338, 1338, 1339, 1340, 1340, 1340, 1341, 
-    1342, 1343, 1344, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 1345, 128, 128, 128, 1346, 
-    1347, 1348, 1349, 1350, 1351, 1346, 1352, 1346, 1348, 1348, 1353, 128, 
-    1354, 128, 1355, 1356, 1354, 128, 1355, 120, 120, 120, 120, 120, 120, 
-    1357, 120, 1358, 1359, 1359, 1359, 1359, 1360, 1359, 1359, 1359, 1359, 
-    1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1360, 1361, 1359, 1362, 
-    1363, 1359, 1363, 1364, 1363, 1359, 1359, 1359, 1365, 1361, 626, 1366, 
-    628, 628, 628, 1367, 628, 628, 628, 628, 628, 628, 628, 1368, 628, 628, 
-    628, 1369, 1370, 1371, 628, 1372, 1361, 1361, 1361, 1361, 1361, 1361, 
-    1373, 1374, 1374, 1374, 1375, 1361, 790, 790, 790, 790, 790, 1376, 790, 
-    1377, 1378, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 
-    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 757, 
-    757, 757, 757, 1379, 1380, 1381, 757, 757, 757, 757, 757, 757, 757, 757, 
-    1382, 1383, 757, 1384, 1385, 757, 757, 1386, 1387, 1388, 1389, 1384, 
-    1359, 757, 757, 1390, 1391, 757, 757, 757, 757, 757, 757, 757, 1392, 
-    1393, 1394, 1395, 757, 1396, 1397, 1394, 1398, 1399, 757, 757, 757, 1400, 
-    1401, 1402, 757, 757, 757, 757, 757, 757, 757, 757, 1403, 1404, 757, 
-    1405, 649, 1406, 757, 1407, 1408, 579, 1409, 757, 757, 757, 1359, 1410, 
-    1411, 1359, 1359, 1412, 1359, 1358, 1359, 1359, 1359, 1359, 1359, 1413, 
-    1414, 1359, 1359, 1413, 1415, 757, 757, 757, 757, 757, 757, 757, 757, 
-    1416, 1417, 579, 579, 579, 579, 1418, 1419, 757, 757, 757, 757, 1420, 
-    757, 1421, 757, 1422, 1358, 1423, 1361, 1359, 1424, 1425, 1361, 579, 579, 
-    579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1426, 1361, 
-    579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1427, 1361, 1361, 1361, 
-    1361, 1361, 579, 1426, 579, 579, 579, 579, 579, 579, 579, 1361, 579, 
-    1428, 579, 579, 579, 579, 579, 1361, 579, 579, 579, 1429, 1361, 1361, 
-    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 757, 1430, 
-    1431, 1361, 1432, 1433, 757, 1434, 757, 1435, 1361, 1361, 1361, 1361, 
-    757, 757, 1436, 1361, 1361, 1361, 1361, 1361, 1437, 1361, 1361, 1361, 
-    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 
-    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 
-    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 
-    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 
-    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 
-    1361, 1361, 1361, 1361, 1361, 1361, 1361, 1438, 808, 808, 808, 808, 808, 
-    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 
-    808, 808, 808, 808, 808, 808, 808, 1439, 810, 810, 810, 810, 810, 808, 
-    808, 808, 808, 808, 808, 1440, 810, 808, 808, 808, 808, 808, 808, 808, 
-    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 
-    808, 808, 808, 808, 808, 808, 809, 808, 808, 808, 808, 808, 808, 808, 
-    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 
-    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 
-    808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 917, 
-    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 
-    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 
-    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 
-    810, 808, 808, 808, 809, 810, 810, 810, 810, 810, 810, 810, 810, 810, 
-    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 
-    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 
-    810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 
-    810, 810, 810, 810, 810, 810, 810, 810, 1441, 1442, 120, 120, 120, 1443, 
-    1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 120, 
-    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 
-    120, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 
-    932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 
-    932, 932, 932, 120, 120, 916, 916, 916, 916, 916, 916, 916, 916, 916, 
-    916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 
-    916, 916, 916, 916, 916, 916, 916, 916, 1444, 
+    120, 120, 120, 120, 120, 1340, 128, 128, 128, 1341, 1342, 1343, 1344, 
+    1345, 1346, 1341, 1347, 1341, 1343, 1343, 1348, 128, 1349, 128, 1350, 
+    1351, 1349, 128, 1350, 120, 120, 120, 120, 120, 120, 1352, 120, 1353, 
+    1354, 1354, 1354, 1354, 1355, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 
+    1354, 1354, 1354, 1354, 1354, 1355, 1356, 1354, 1357, 1358, 1354, 1358, 
+    1359, 1358, 1354, 1354, 1354, 1360, 1356, 619, 1361, 621, 621, 621, 1362, 
+    621, 621, 621, 621, 621, 621, 621, 1363, 621, 621, 621, 1364, 1365, 1366, 
+    621, 1367, 1356, 1356, 1356, 1356, 1356, 1356, 1368, 1369, 1369, 1369, 
+    1370, 1356, 758, 758, 758, 758, 758, 1371, 758, 1372, 1373, 1356, 1374, 
+    1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 
+    1356, 1356, 1356, 1356, 1356, 1356, 1356, 725, 725, 725, 725, 1375, 1376, 
+    1377, 725, 725, 725, 725, 725, 725, 725, 725, 1378, 1379, 725, 1380, 
+    1381, 725, 725, 1382, 1383, 1384, 1385, 1380, 1354, 725, 725, 1386, 1387, 
+    725, 725, 725, 725, 725, 725, 725, 1388, 1389, 1390, 1391, 725, 1392, 
+    1393, 1390, 1394, 1395, 725, 725, 725, 1396, 1397, 1398, 725, 725, 725, 
+    725, 725, 725, 725, 725, 1399, 1400, 725, 1401, 642, 1402, 725, 1403, 
+    1404, 580, 1405, 725, 725, 725, 1354, 1406, 1407, 1354, 1354, 1408, 1354, 
+    1353, 1354, 1354, 1354, 1354, 1354, 1409, 1410, 1354, 1354, 1409, 1411, 
+    725, 725, 725, 725, 725, 725, 725, 725, 1412, 1413, 580, 580, 580, 580, 
+    1414, 1415, 725, 725, 725, 725, 1416, 725, 1417, 725, 1418, 1419, 1420, 
+    1356, 1354, 1421, 1422, 1423, 580, 580, 580, 580, 580, 580, 580, 580, 
+    580, 580, 580, 580, 580, 580, 1424, 1356, 580, 580, 580, 580, 580, 580, 
+    580, 580, 580, 580, 1425, 1356, 1356, 1356, 1356, 1356, 580, 1424, 580, 
+    580, 580, 580, 580, 580, 580, 1356, 580, 1426, 580, 580, 580, 580, 580, 
+    1356, 580, 580, 580, 1427, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 
+    1356, 1356, 1356, 580, 1424, 725, 1428, 1429, 725, 1390, 1430, 725, 1431, 
+    725, 725, 725, 1432, 1356, 1356, 725, 725, 725, 1356, 1356, 1356, 1356, 
+    1356, 1423, 1356, 1433, 1434, 1435, 1356, 1356, 1356, 1356, 1356, 1356, 
+    1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 
+    1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 
+    1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 
+    1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 
+    1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 
+    1436, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 1437, 
+    778, 778, 778, 778, 778, 776, 776, 776, 776, 776, 776, 1438, 778, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 777, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 886, 778, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 
+    776, 776, 776, 1439, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 
+    778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 
+    778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 776, 776, 776, 
+    777, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 
+    778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 
+    778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 
+    778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 
+    778, 778, 778, 778, 1440, 1441, 120, 120, 120, 1442, 1442, 1442, 1442, 
+    1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 120, 120, 120, 120, 120, 
+    120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 901, 901, 901, 
+    901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 
+    901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 120, 
+    120, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 
+    885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 
+    885, 885, 885, 885, 1443, 
 };
 
 static const unsigned short index2[] = {
     1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 7, 7, 8, 
     9, 10, 11, 12, 13, 14, 15, 11, 16, 17, 15, 18, 19, 20, 19, 21, 22, 22, 
 };
 
 static const unsigned short index2[] = {
     1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 7, 7, 8, 
     9, 10, 11, 12, 13, 14, 15, 11, 16, 17, 15, 18, 19, 20, 19, 21, 22, 22, 
-    22, 22, 22, 22, 22, 22, 22, 22, 19, 23, 24, 25, 24, 10, 15, 26, 26, 26
-    26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 16, 27, 17, 
-    28, 29, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30
-    30, 30, 30, 16, 31, 32, 25, 1, 1, 1, 1, 1, 1, 33, 1, 1, 34, 35, 36, 13, 
-    37, 13, 38, 39, 40, 41, 42, 43, 25, 44, 45, 28, 46, 47, 48, 48, 49, 50
-    39, 39, 40, 48, 42, 51, 52, 52, 52, 35, 53, 53, 53, 53, 53, 53, 54, 53
-    53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 53, 53, 53, 53, 53, 55, 54, 53
-    53, 53, 53, 53, 54, 56, 56, 56, 57, 57, 57, 57, 56, 57, 56, 56, 56, 57
-    56, 56, 57, 57, 56, 57, 56, 56, 57, 57, 57, 55, 56, 56, 56, 57, 56, 57
-    56, 57, 53, 56, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57
-    53, 56, 53, 56, 53, 57, 53, 57, 53, 57, 53, 56, 53, 57, 53, 57, 53, 57
-    53, 57, 53, 57, 54, 56, 53, 56, 54, 56, 53, 57, 53, 57, 56, 53, 57, 53
-    57, 53, 57, 54, 56, 54, 56, 53, 56, 53, 57, 53, 56, 56, 54, 56, 53, 56
-    53, 57, 53, 57, 54, 56, 53, 57, 53, 57, 53, 53, 57, 53, 57, 53, 57, 57
-    57, 53, 53, 57, 53, 57, 53, 53, 57, 53, 53, 53, 57, 57, 53, 53, 53, 53
-    57, 53, 53, 57, 53, 53, 53, 57, 57, 57, 53, 53, 57, 53, 53, 57, 53, 57
-    53, 57, 53, 53, 57, 53, 57, 57, 53, 57, 53, 53, 57, 53, 53, 53, 57, 53
-    57, 53, 53, 57, 57, 58, 53, 57, 57, 57, 58, 58, 58, 58, 53, 59, 57, 53
-    59, 57, 53, 59, 57, 53, 56, 53, 56, 53, 56, 53, 56, 53, 56, 53, 56, 53
-    56, 53, 56, 57, 53, 57, 57, 53, 59, 57, 53, 57, 53, 53, 53, 57, 53, 57
-    57, 57, 57, 57, 57, 57, 53, 53, 57, 53, 53, 57, 57, 53, 57, 53, 53, 53
-    53, 57, 57, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57
-    57, 57, 57, 57, 58, 57, 57, 57, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61
-    61, 62, 62, 62, 62, 62, 62, 62, 63, 63, 64, 63, 61, 65, 66, 65, 65, 65
-    66, 65, 61, 61, 67, 62, 63, 63, 63, 63, 63, 63, 40, 40, 40, 40, 63, 40
-    63, 49, 60, 60, 60, 60, 60, 63, 63, 63, 63, 63, 68, 68, 61, 63, 62, 63
-    63, 63, 63, 63, 63, 63, 63, 63, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69
-    69, 69, 69, 70, 71, 71, 71, 71, 70, 72, 71, 71, 71, 71, 71, 73, 73, 71
-    71, 71, 71, 73, 73, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 74, 74
-    74, 74, 74, 71, 71, 71, 71, 69, 69, 69, 69, 69, 69, 69, 69, 75, 69, 71
-    71, 71, 69, 69, 69, 71, 71, 76, 69, 69, 69, 71, 71, 71, 71, 69, 70, 71
-    71, 69, 77, 78, 78, 77, 78, 78, 77, 69, 69, 69, 69, 69, 79, 80, 79, 80
-    61, 81, 79, 80, 82, 82, 83, 80, 80, 80, 84, 79, 82, 82, 82, 82, 81, 63
-    79, 85, 79, 79, 79, 82, 79, 82, 79, 79, 80, 86, 86, 86, 86, 86, 86, 86
-    86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 82, 86, 86, 86, 86, 86, 86, 86
-    79, 79, 80, 80, 80, 80, 80, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87
-    87, 87, 87, 87, 87, 87, 80, 87, 87, 87, 87, 87, 87, 87, 80, 80, 80, 80
-    80, 79, 80, 80, 79, 79, 79, 80, 80, 80, 79, 80, 79, 80, 79, 80, 79, 80
-    79, 80, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 80, 80
-    80, 80, 79, 80, 90, 79, 80, 79, 79, 80, 80, 79, 79, 79, 91, 92, 91, 91
-    91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92
-    92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 94, 93, 94, 94, 94, 94, 94, 94
-    94, 94, 94, 94, 94, 94, 94, 94, 91, 94, 91, 94, 91, 94, 91, 94, 91, 94
-    95, 96, 96, 97, 97, 96, 98, 98, 91, 94, 91, 94, 91, 94, 91, 91, 94, 91
-    94, 91, 94, 91, 94, 91, 94, 91, 94, 91, 94, 94, 82, 99, 99, 99, 99, 99
-    99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 82
-    82, 100, 101, 101, 101, 101, 101, 101, 82, 102, 102, 102, 102, 102, 102
-    102, 102, 102, 102, 102, 102, 102, 102, 102, 82, 103, 104, 82, 82, 105
-    105, 106, 82, 107, 108, 108, 108, 108, 107, 108, 108, 108, 109, 107, 108
-    108, 108, 108, 108, 108, 107, 107, 107, 107, 107, 107, 108, 108, 107
-    108, 108, 109, 110, 108, 111, 112, 113, 114, 115, 116, 117, 118, 119
-    120, 120, 121, 122, 123, 124, 125, 126, 127, 128, 126, 108, 107, 129
-    119, 82, 82, 82, 82, 82, 82, 82, 82, 130, 130, 130, 130, 130, 130, 130
-    130, 130, 130, 130, 82, 82, 82, 82, 82, 130, 130, 130, 126, 126, 82, 82
-    82, 131, 131, 131, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 138
-    139, 139, 140, 140, 140, 140, 140, 140, 140, 140, 141, 142, 143, 144
-    145, 82, 146, 144, 147, 147, 147, 147, 147, 147, 147, 147, 148, 147, 147
-    147, 147, 147, 147, 147, 147, 147, 147, 149, 150, 151, 152, 153, 154
-    155, 156, 97, 97, 157, 158, 140, 140, 140, 140, 140, 158, 140, 140, 158
-    159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 135, 160, 160, 161
-    147, 147, 162, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147
-    146, 147, 140, 140, 140, 140, 140, 140, 140, 132, 139, 140, 140, 140
-    140, 158, 140, 163, 163, 140, 140, 139, 158, 140, 140, 158, 147, 147
-    164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 147, 147, 147, 165
-    165, 147, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166
-    166, 166, 82, 167, 168, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168
-    168, 168, 168, 168, 168, 170, 171, 170, 170, 171, 170, 170, 171, 171
-    171, 170, 171, 171, 170, 171, 170, 170, 170, 171, 170, 171, 170, 171
-    170, 171, 170, 170, 82, 82, 168, 168, 168, 172, 172, 172, 172, 172, 172
-    172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, 173
-    173, 173, 173, 173, 173, 172, 82, 82, 82, 82, 82, 82, 174, 174, 174, 174
-    174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175
-    175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176
-    176, 176, 177, 176, 178, 178, 179, 180, 181, 182, 178, 82, 82, 82, 82
-    82, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183
-    184, 184, 184, 184, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184
-    185, 184, 184, 184, 185, 184, 184, 184, 184, 184, 82, 82, 186, 186, 186
-    186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 82, 187, 187
-    187, 187, 187, 187, 187, 187, 187, 188, 188, 188, 82, 82, 189, 82, 147, 
-    147, 147, 147, 147, 82, 147, 147, 147, 147, 147, 147, 147, 147, 82, 82
-    82, 82, 82, 82, 140, 140, 140, 140, 140, 140, 132, 158, 140, 140, 158
-    140, 140, 158, 140, 140, 140, 158, 158, 158, 190, 191, 192, 140, 140
-    140, 158, 140, 140, 158, 158, 140, 140, 140, 140, 140, 193, 193, 193
-    194, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195
-    195, 193, 194, 196, 195, 194, 194, 194, 193, 193, 193, 193, 193, 193, 
-    193, 193, 194, 194, 194, 194, 197, 194, 194, 195, 97, 157, 198, 198, 193, 
-    193, 193, 195, 195, 193, 193, 199, 199, 200, 200, 200, 200, 200, 200
-    200, 200, 200, 200, 201, 202, 195, 195, 195, 195, 195, 195, 203, 204, 
-    205, 205, 82, 203, 203, 203, 203, 203, 203, 203, 203, 82, 82, 203, 203
-    82, 82, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203
-    203, 82, 203, 203, 203, 203, 203, 203, 203, 82, 203, 82, 82, 82, 203
-    203, 203, 203, 82, 82, 206, 203, 205, 205, 205, 204, 204, 204, 204, 82
-    82, 205, 205, 82, 82, 205, 205, 207, 203, 82, 82, 82, 82, 82, 82, 82, 82
-    205, 82, 82, 82, 82, 203, 203, 82, 203, 203, 203, 204, 204, 82, 82, 208
-    208, 208, 208, 208, 208, 208, 208, 208, 208, 203, 203, 209, 209, 210
-    210, 210, 210, 210, 211, 212, 213, 82, 82, 82, 82, 82, 214, 214, 215, 82
-    216, 216, 216, 216, 216, 216, 82, 82, 82, 82, 216, 216, 82, 82, 216, 216, 
-    216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 82, 216, 216, 
-    216, 216, 216, 216, 216, 82, 216, 216, 82, 216, 216, 82, 216, 216, 82
-    82, 217, 82, 215, 215, 215, 214, 214, 82, 82, 82, 82, 214, 214, 82, 82
-    214, 214, 218, 82, 82, 82, 214, 82, 82, 82, 82, 82, 82, 82, 216, 216
-    216, 216, 82, 216, 82, 82, 82, 82, 82, 82, 82, 219, 219, 219, 219, 219, 
-    219, 219, 219, 219, 219, 214, 214, 216, 216, 216, 214, 82, 82, 82, 220
-    220, 221, 82, 222, 222, 222, 222, 222, 222, 222, 222, 222, 82, 222, 222, 
-    222, 82, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 
-    222, 82, 222, 222, 222, 222, 222, 222, 222, 82, 222, 222, 82, 222, 222
-    222, 222, 222, 82, 82, 223, 222, 221, 221, 221, 220, 220, 220, 220, 220
-    82, 220, 220, 221, 82, 221, 221, 224, 82, 82, 222, 82, 82, 82, 82, 82
-    82, 82, 222, 222, 220, 220, 82, 82, 225, 225, 225, 225, 225, 225, 225, 
-    225, 225, 225, 226, 227, 82, 82, 82, 82, 82, 82, 82, 222, 82, 82, 82, 82
-    82, 82, 82, 228, 229, 229, 82, 230, 230, 230, 230, 230, 230, 230, 230, 
-    82, 82, 230, 230, 82, 82, 230, 230, 230, 230, 230, 230, 230, 230, 230, 
-    230, 230, 230, 230, 230, 82, 230, 230, 230, 230, 230, 230, 230, 82, 230, 
-    230, 82, 230, 230, 230, 230, 230, 82, 82, 231, 230, 229, 228, 229, 228
-    228, 228, 228, 82, 82, 229, 229, 82, 82, 229, 229, 232, 82, 82, 82, 82
-    82, 82, 82, 82, 228, 229, 82, 82, 82, 82, 230, 230, 82, 230, 230, 230
-    228, 228, 82, 82, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 234
-    230, 235, 235, 235, 235, 235, 235, 82, 82, 236, 237, 82, 237, 237, 237
-    237, 237, 237, 82, 82, 82, 237, 237, 237, 82, 237, 237, 237, 237, 82, 82
-    82, 237, 237, 82, 237, 82, 237, 237, 82, 82, 82, 237, 237, 82, 82, 82
-    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 82, 82, 82, 82, 238
-    238, 236, 238, 238, 82, 82, 82, 238, 238, 238, 82, 238, 238, 238, 239
-    82, 82, 237, 82, 82, 82, 82, 82, 82, 238, 82, 82, 82, 82, 82, 82, 240
-    240, 240, 240, 240, 240, 240, 240, 240, 240, 241, 241, 241, 242, 242
-    242, 242, 242, 242, 243, 242, 82, 82, 82, 82, 82, 244, 245, 245, 245, 82
-    246, 246, 246, 246, 246, 246, 246, 246, 82, 246, 246, 246, 82, 246, 246
-    246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 82
-    82, 82, 246, 244, 244, 244, 245, 245, 245, 245, 82, 244, 244, 244, 82
-    244, 244, 244, 247, 82, 82, 82, 82, 82, 82, 82, 248, 249, 82, 246, 246
-    246, 82, 82, 82, 82, 82, 246, 246, 244, 244, 82, 82, 250, 250, 250, 250
-    250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 252
-    253, 254, 255, 255, 82, 253, 253, 253, 253, 253, 253, 253, 253, 82, 253, 
-    253, 253, 82, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 
-    253, 253, 253, 253, 253, 253, 82, 253, 253, 253, 253, 253, 82, 82, 256
-    253, 255, 257, 255, 255, 255, 255, 255, 82, 257, 255, 255, 82, 255, 255
-    254, 258, 82, 82, 82, 82, 82, 82, 82, 255, 255, 82, 82, 82, 82, 82, 82
-    82, 253, 82, 253, 253, 254, 254, 82, 82, 259, 259, 259, 259, 259, 259, 
-    259, 259, 259, 259, 82, 253, 253, 82, 82, 82, 82, 82, 82, 260, 261, 261, 
-    82, 262, 262, 262, 262, 262, 262, 262, 262, 82, 262, 262, 262, 82, 262, 
-    262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 
-    262, 262, 82, 82, 262, 261, 261, 261, 260, 260, 260, 260, 82, 261, 261
-    261, 82, 261, 261, 261, 263, 262, 264, 82, 82, 82, 82, 262, 262, 262
-    261, 265, 265, 265, 265, 265, 265, 265, 262, 262, 262, 260, 260, 82, 82, 
-    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 265, 265, 265, 265
-    265, 265, 265, 265, 265, 267, 262, 262, 262, 262, 262, 262, 82, 82, 268
-    268, 82, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 
-    269, 269, 269, 269, 269, 82, 82, 82, 269, 269, 269, 269, 269, 269, 269, 
-    269, 82, 269, 269, 269, 269, 269, 269, 269, 269, 269, 82, 269, 82, 82
-    82, 82, 270, 82, 82, 82, 82, 268, 268, 268, 271, 271, 271, 82, 271, 82
-    268, 268, 268, 268, 268, 268, 268, 268, 82, 82, 82, 82, 82, 82, 272, 272
-    272, 272, 272, 272, 272, 272, 272, 272, 82, 82, 268, 268, 273, 82, 82
-    82, 82, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 
-    274, 274, 274, 275, 274, 274, 275, 275, 275, 275, 276, 276, 277, 82, 82
-    82, 82, 278, 274, 274, 274, 274, 274, 274, 279, 275, 280, 280, 280, 280
-    275, 275, 275, 281, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 
-    283, 283, 82, 82, 82, 82, 82, 284, 284, 82, 284, 82, 82, 284, 284, 82
-    284, 82, 82, 284, 82, 82, 82, 82, 82, 82, 284, 284, 284, 284, 82, 284
-    284, 284, 284, 284, 284, 284, 82, 284, 284, 284, 82, 284, 82, 284, 82
-    82, 284, 284, 82, 284, 284, 284, 284, 285, 284, 284, 285, 285, 285, 285
-    286, 286, 82, 285, 285, 284, 82, 82, 284, 284, 284, 284, 284, 82, 287
-    82, 288, 288, 288, 288, 285, 285, 82, 82, 289, 289, 289, 289, 289, 289
-    289, 289, 289, 289, 82, 82, 284, 284, 284, 284, 290, 291, 291, 291, 292
-    293, 292, 292, 294, 292, 292, 295, 294, 296, 296, 296, 296, 296, 294
-    297, 296, 297, 297, 297, 298, 298, 297, 297, 297, 297, 297, 297, 299
-    299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 300, 300, 300, 300
-    300, 300, 300, 300, 300, 301, 298, 297, 298, 297, 302, 303, 304, 303
-    304, 305, 305, 290, 290, 290, 290, 290, 290, 290, 290, 82, 290, 290, 290, 
-    290, 290, 290, 290, 290, 290, 290, 290, 290, 82, 82, 82, 82, 306, 307
-    308, 309, 308, 308, 308, 308, 308, 307, 307, 307, 307, 308, 310, 307
-    308, 311, 311, 312, 295, 311, 311, 290, 290, 290, 290, 290, 308, 308
-    308, 308, 308, 308, 308, 308, 308, 308, 308, 82, 308, 308, 308, 308, 308, 
-    308, 308, 308, 308, 308, 308, 308, 82, 301, 301, 297, 297, 297, 297, 297
-    297, 298, 297, 297, 297, 297, 297, 297, 82, 297, 297, 292, 292, 295, 292
-    293, 313, 313, 313, 313, 294, 294, 82, 82, 82, 82, 82, 314, 314, 314, 
-    314, 314, 314, 314, 314, 314, 314, 314, 315, 315, 316, 316, 316, 316
-    315, 316, 316, 316, 316, 316, 317, 315, 318, 318, 315, 315, 316, 316
-    314, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 320, 320, 321
-    321, 321, 321, 314, 314, 314, 314, 314, 314, 315, 315, 316, 316, 314, 
-    314, 314, 314, 316, 316, 316, 314, 315, 315, 315, 314, 314, 315, 315
-    315, 315, 315, 315, 315, 314, 314, 314, 316, 316, 316, 316, 314, 314, 
-    314, 314, 314, 316, 315, 315, 316, 316, 315, 315, 315, 315, 315, 315
-    322, 314, 315, 319, 319, 315, 315, 315, 316, 323, 323, 324, 324, 324
-    324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 82, 324, 82, 82
-    82, 82, 82, 324, 82, 82, 325, 325, 325, 325, 325, 325, 325, 325, 325, 
-    325, 325, 326, 327, 325, 325, 325, 328, 328, 328, 328, 328, 328, 328
-    328, 329, 329, 329, 329, 329, 329, 329, 329, 330, 330, 330, 330, 330
-    330, 330, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 82, 331, 331, 
-    331, 331, 82, 82, 331, 331, 331, 331, 331, 331, 331, 82, 331, 331, 331, 
-    82, 82, 332, 332, 332, 333, 334, 333, 333, 333, 333, 333, 333, 333, 335
-    335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 
-    335, 335, 335, 335, 335, 82, 82, 82, 336, 336, 336, 336, 336, 336, 336
-    336, 336, 336, 82, 82, 82, 82, 82, 82, 337, 337, 337, 337, 337, 337, 337
-    337, 337, 337, 337, 337, 337, 337, 82, 82, 338, 338, 338, 338, 338, 338
-    82, 82, 339, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 
-    340, 340, 340, 340, 340, 340, 340, 340, 341, 341, 340, 342, 343, 343
-    343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 
-    343, 343, 344, 345, 82, 82, 82, 346, 346, 346, 346, 346, 346, 346, 346
-    346, 346, 346, 199, 199, 199, 347, 347, 347, 346, 346, 346, 346, 346
-    346, 346, 346, 82, 82, 82, 82, 82, 82, 82, 348, 348, 348, 348, 348, 348
-    348, 348, 348, 348, 348, 348, 348, 82, 348, 348, 348, 348, 349, 349, 350
-    82, 82, 82, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352
-    353, 199, 199, 82, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 355
-    355, 82, 82, 82, 82, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 
-    356, 356, 356, 82, 356, 356, 356, 82, 357, 357, 82, 82, 82, 82, 358, 358
-    358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 359, 359, 360, 359
-    359, 359, 359, 359, 359, 359, 360, 360, 360, 360, 360, 360, 360, 360
-    359, 360, 360, 359, 359, 359, 359, 359, 359, 359, 359, 359, 361, 359, 
-    362, 362, 363, 364, 362, 365, 362, 366, 358, 367, 82, 82, 368, 368, 368
-    368, 368, 368, 368, 368, 368, 368, 82, 82, 82, 82, 82, 82, 369, 369, 369
-    369, 369, 369, 369, 369, 369, 369, 82, 82, 82, 82, 82, 82, 370, 370, 371
-    371, 372, 373, 374, 370, 375, 375, 370, 376, 376, 376, 377, 82, 378, 378
-    378, 378, 378, 378, 378, 378, 378, 378, 82, 82, 82, 82, 82, 82, 379, 379
-    379, 379, 379, 379, 379, 379, 379, 379, 379, 380, 379, 379, 379, 379, 
-    379, 379, 379, 379, 379, 376, 376, 379, 379, 381, 379, 82, 82, 82, 82
-    82, 340, 340, 340, 340, 340, 340, 82, 82, 382, 382, 382, 382, 382, 382
-    382, 382, 382, 382, 382, 382, 382, 382, 382, 82, 383, 383, 383, 384, 384
-    384, 384, 383, 383, 384, 384, 384, 82, 82, 82, 82, 384, 384, 383, 384, 
-    384, 384, 384, 384, 384, 385, 386, 387, 82, 82, 82, 82, 388, 82, 82, 82
-    389, 389, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 391, 391
-    391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 82, 82, 391, 
-    391, 391, 391, 391, 82, 82, 82, 392, 392, 392, 392, 392, 392, 392, 392
-    392, 392, 392, 392, 82, 82, 82, 82, 392, 392, 82, 82, 82, 82, 82, 82
-    393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 394, 82, 82, 82, 395
-    395, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397
-    397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 398, 399, 400, 400
-    401, 82, 82, 402, 402, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 
-    403, 403, 403, 404, 405, 404, 405, 405, 405, 405, 405, 405, 405, 82, 406
-    404, 405, 404, 404, 405, 405, 405, 405, 405, 405, 405, 405, 404, 404
-    404, 404, 404, 404, 405, 405, 407, 407, 407, 407, 407, 407, 407, 407, 82
-    82, 408, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 82, 82, 82
-    82, 82, 82, 410, 410, 410, 410, 410, 410, 410, 411, 410, 410, 410, 410, 
-    410, 410, 82, 82, 97, 97, 97, 97, 97, 157, 157, 157, 157, 157, 157, 97
-    97, 157, 412, 82, 413, 413, 413, 413, 414, 415, 415, 415, 415, 415, 415
-    415, 415, 415, 415, 415, 415, 415, 415, 415, 416, 414, 413, 413, 413
-    413, 413, 414, 413, 414, 414, 414, 414, 414, 413, 414, 417, 415, 415
-    415, 415, 415, 415, 415, 82, 82, 82, 82, 418, 418, 418, 418, 418, 418
-    418, 418, 418, 418, 419, 419, 420, 419, 419, 419, 419, 421, 421, 421
-    421, 421, 421, 421, 421, 421, 421, 422, 423, 422, 422, 422, 422, 422
-    422, 422, 421, 421, 421, 421, 421, 421, 421, 421, 421, 82, 82, 82, 424
-    424, 425, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 
-    426, 426, 425, 424, 424, 424, 424, 425, 425, 424, 424, 427, 428, 424, 
-    424, 426, 426, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 426
-    426, 426, 426, 426, 426, 430, 430, 430, 430, 430, 430, 430, 430, 430, 
-    430, 430, 430, 430, 430, 431, 432, 433, 433, 432, 432, 432, 433, 432
-    433, 433, 433, 434, 434, 82, 82, 82, 82, 82, 82, 82, 82, 435, 435, 435
-    435, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 437
-    437, 437, 437, 437, 437, 437, 437, 438, 438, 438, 438, 438, 438, 438
-    438, 437, 437, 438, 439, 82, 82, 82, 440, 440, 440, 440, 440, 441, 441, 
-    441, 441, 441, 441, 441, 441, 441, 441, 82, 82, 82, 436, 436, 436, 442
-    442, 442, 442, 442, 442, 442, 442, 442, 442, 443, 443, 443, 443, 443
-    443, 443, 443, 443, 443, 443, 443, 443, 443, 444, 444, 444, 444, 444
-    444, 445, 445, 94, 82, 82, 82, 82, 82, 82, 82, 446, 446, 446, 446, 446
-    446, 446, 446, 97, 97, 97, 326, 447, 157, 157, 157, 157, 157, 97, 97, 
-    157, 157, 157, 157, 97, 448, 447, 447, 447, 447, 447, 447, 447, 449, 449
-    449, 449, 157, 449, 449, 449, 449, 448, 448, 97, 449, 449, 82, 97, 97
-    82, 82, 82, 82, 82, 82, 57, 57, 57, 57, 57, 57, 80, 80, 80, 80, 80, 94
-    60, 60, 60, 60, 60, 60, 60, 60, 60, 83, 83, 83, 83, 83, 60, 60, 60, 60
-    83, 83, 83, 83, 83, 57, 57, 57, 57, 57, 450, 57, 57, 57, 57, 57, 57, 57
-    57, 57, 57, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 83, 97, 97
-    157, 97, 97, 97, 97, 97, 97, 97, 157, 97, 97, 451, 452, 157, 453, 97, 97
-    97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97
-    97, 82, 82, 82, 82, 82, 97, 454, 157, 97, 157, 53, 57, 53, 57, 53, 57
-    57, 57, 57, 57, 57, 57, 57, 57, 53, 57, 80, 80, 80, 80, 80, 80, 80, 80
-    79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 82, 82, 79, 79, 
-    79, 79, 79, 79, 82, 82, 82, 79, 82, 79, 82, 79, 82, 79, 455, 455, 455
-    455, 455, 455, 455, 455, 80, 80, 80, 80, 80, 82, 80, 80, 79, 79, 79, 79, 
-    455, 81, 80, 81, 81, 81, 80, 80, 80, 82, 80, 80, 79, 79, 79, 79, 455, 81
-    81, 81, 80, 80, 80, 80, 82, 82, 80, 80, 79, 79, 79, 79, 82, 81, 81, 81
-    79, 79, 79, 79, 79, 81, 81, 81, 82, 82, 80, 80, 80, 82, 80, 80, 79, 79
-    79, 79, 455, 456, 81, 82, 457, 457, 457, 457, 457, 457, 457, 458, 457
-    457, 457, 459, 460, 461, 462, 463, 464, 465, 466, 464, 467, 468, 39, 85, 
-    469, 470, 471, 472, 469, 470, 471, 472, 39, 39, 473, 85, 474, 474, 474
-    475, 476, 477, 478, 479, 480, 481, 482, 34, 483, 484, 483, 483, 484, 485
-    486, 486, 85, 43, 51, 39, 487, 487, 473, 488, 488, 85, 85, 85, 489, 490
-    491, 487, 487, 487, 85, 85, 85, 85, 85, 85, 85, 85, 492, 85, 488, 85
-    373, 85, 373, 373, 373, 373, 85, 373, 373, 457, 493, 494, 494, 494, 494, 
-    82, 495, 496, 497, 498, 499, 499, 499, 499, 499, 499, 500, 60, 82, 82
-    48, 500, 500, 500, 500, 500, 501, 501, 492, 490, 491, 502, 500, 48, 48
-    48, 48, 500, 500, 500, 500, 500, 501, 501, 492, 490, 491, 82, 60, 60, 60, 
-    60, 60, 82, 82, 82, 278, 278, 278, 278, 278, 278, 278, 503, 278, 504
-    278, 278, 37, 278, 278, 278, 278, 278, 278, 278, 278, 278, 503, 278, 278, 
-    278, 278, 503, 278, 278, 503, 505, 505, 505, 505, 505, 505, 505, 505
-    505, 97, 97, 447, 447, 97, 97, 97, 97, 447, 447, 447, 97, 97, 412, 412
-    412, 412, 97, 412, 412, 412, 447, 447, 97, 157, 97, 447, 447, 157, 157
-    157, 157, 97, 82, 82, 82, 82, 82, 82, 82, 41, 41, 506, 507, 41, 508, 41, 
-    506, 41, 507, 50, 506, 506, 506, 50, 50, 506, 506, 506, 509, 41, 506, 
-    510, 41, 492, 506, 506, 506, 506, 506, 41, 41, 41, 508, 508, 41, 506, 41
-    86, 41, 506, 41, 53, 511, 506, 506, 512, 50, 506, 506, 53, 506, 50, 449
-    449, 449, 449, 50, 41, 41, 50, 50, 506, 506, 513, 492, 492, 492, 492
-    506, 50, 50, 50, 50, 41, 492, 41, 41, 57, 313, 514, 514, 514, 515, 52, 
-    516, 514, 514, 514, 514, 514, 52, 515, 515, 52, 514, 517, 517, 517, 517
-    517, 517, 517, 517, 517, 517, 517, 517, 518, 518, 518, 518, 517, 517
-    518, 518, 518, 518, 518, 518, 518, 518, 518, 53, 57, 518, 518, 518, 518
-    52, 41, 41, 82, 82, 82, 82, 55, 55, 55, 55, 55, 508, 508, 508, 508, 508
-    492, 492, 41, 41, 41, 41, 492, 41, 41, 492, 41, 41, 492, 41, 41, 41, 41
-    41, 41, 41, 492, 41, 41, 41, 41, 41, 41, 41, 41, 41, 45, 45, 41, 41, 41
-    41, 41, 41, 41, 41, 41, 41, 41, 41, 492, 492, 41, 41, 55, 41, 55, 41, 41
-    41, 41, 41, 41, 41, 41, 41, 41, 45, 41, 41, 41, 41, 492, 492, 492, 492
-    492, 492, 492, 492, 492, 492, 492, 492, 55, 513, 519, 519, 513, 492, 492, 
-    55, 519, 513, 513, 519, 513, 513, 492, 55, 492, 519, 520, 521, 492, 519
-    513, 492, 492, 492, 519, 513, 513, 519, 55, 519, 519, 513, 513, 55, 513
-    55, 513, 55, 55, 55, 55, 519, 519, 513, 519, 513, 513, 513, 513, 513, 55
-    55, 55, 55, 492, 513, 492, 513, 519, 519, 513, 513, 513, 513, 513, 513
-    513, 513, 513, 513, 519, 513, 513, 513, 519, 492, 492, 492, 492, 492, 
-    519, 513, 513, 513, 492, 492, 492, 492, 492, 492, 492, 492, 492, 513
-    519, 55, 513, 492, 519, 519, 519, 519, 513, 513, 519, 519, 492, 492, 519
-    519, 513, 513, 519, 519, 513, 513, 519, 519, 513, 513, 513, 513, 513
-    492, 492, 513, 513, 513, 513, 492, 492, 55, 492, 492, 513, 55, 492, 492
-    492, 492, 492, 492, 492, 492, 513, 513, 492, 55, 513, 513, 513, 492, 492
-    492, 492, 492, 513, 519, 492, 513, 513, 513, 513, 513, 492, 492, 513
-    513, 492, 492, 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 492
-    522, 490, 491, 490, 491, 41, 41, 41, 41, 41, 41, 508, 41, 41, 41, 41, 41
-    41, 41, 523, 523, 41, 41, 41, 41, 513, 513, 41, 41, 41, 41, 41, 41, 41
-    524, 525, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 313, 313, 313, 313
-    313, 313, 313, 313, 313, 313, 313, 313, 313, 41, 492, 41, 41, 41, 41, 41, 
-    41, 41, 41, 313, 41, 41, 41, 41, 41, 492, 492, 492, 492, 492, 492, 492
-    492, 492, 41, 41, 41, 41, 492, 492, 41, 41, 41, 41, 41, 41, 41, 526, 526
-    526, 526, 41, 41, 41, 523, 527, 527, 523, 41, 41, 41, 41, 41, 41, 41, 41
-    41, 41, 41, 82, 41, 41, 41, 82, 82, 82, 82, 82, 52, 52, 52, 52, 52, 52
-    52, 52, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 528, 528, 528, 
-    528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 516, 52, 52, 52
-    52, 52, 52, 52, 52, 52, 52, 52, 52, 515, 508, 508, 508, 508, 508, 508, 
-    508, 508, 508, 508, 508, 508, 41, 41, 41, 41, 508, 508, 508, 508, 529
-    41, 41, 41, 41, 41, 508, 508, 508, 508, 41, 41, 508, 508, 41, 508, 508
-    508, 508, 508, 508, 508, 41, 41, 41, 41, 41, 41, 41, 41, 508, 508, 41
-    41, 508, 55, 41, 41, 41, 41, 508, 508, 41, 41, 508, 55, 41, 41, 41, 41
-    508, 508, 508, 41, 41, 508, 41, 41, 508, 508, 41, 41, 41, 41, 41, 41, 41
-    508, 492, 492, 492, 492, 492, 530, 530, 492, 527, 527, 527, 527, 41, 508
-    508, 41, 41, 508, 41, 41, 41, 41, 508, 508, 41, 41, 41, 41, 523, 523
-    529, 529, 527, 41, 527, 527, 531, 532, 531, 527, 41, 527, 527, 527, 41
-    41, 41, 41, 508, 41, 508, 41, 41, 41, 41, 41, 526, 526, 526, 526, 526
-    526, 526, 526, 526, 526, 526, 526, 41, 41, 41, 41, 508, 508, 41, 508, 
-    508, 508, 41, 508, 531, 508, 508, 41, 508, 508, 41, 55, 41, 41, 41, 41
-    41, 41, 41, 523, 41, 41, 41, 526, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41
-    508, 508, 41, 526, 41, 41, 41, 41, 41, 41, 41, 41, 526, 526, 313, 41, 41, 
-    41, 41, 41, 41, 41, 41, 523, 523, 531, 527, 527, 527, 527, 523, 523, 531
-    531, 531, 508, 508, 508, 508, 531, 526, 531, 531, 531, 508, 531, 523
-    508, 508, 508, 531, 531, 508, 508, 531, 508, 508, 531, 531, 531, 41, 508
-    41, 41, 41, 41, 508, 508, 523, 508, 508, 508, 508, 508, 508, 531, 523
-    523, 531, 523, 508, 531, 531, 533, 523, 508, 508, 523, 531, 531, 527
-    527, 527, 527, 527, 526, 41, 41, 527, 527, 534, 534, 532, 532, 41, 41
-    526, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 45, 41, 41, 41, 41
-    41, 41, 526, 41, 526, 41, 41, 41, 41, 526, 526, 526, 41, 535, 41, 41, 41
-    536, 536, 536, 536, 536, 536, 41, 537, 537, 527, 41, 41, 41, 490, 491
-    490, 491, 490, 491, 490, 491, 490, 491, 490, 491, 490, 491, 52, 52, 516
-    516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 41, 526, 526, 526
-    41, 41, 41, 41, 41, 41, 41, 526, 513, 492, 492, 513, 513, 490, 491, 492
-    513, 513, 492, 513, 513, 513, 492, 492, 492, 492, 492, 513, 513, 513
-    513, 492, 492, 492, 492, 492, 513, 513, 513, 492, 492, 492, 513, 513
-    513, 513, 16, 32, 16, 32, 16, 32, 16, 32, 490, 491, 538, 538, 538, 538
-    538, 538, 538, 538, 492, 492, 492, 490, 491, 16, 32, 490, 491, 490, 491
-    490, 491, 490, 491, 490, 491, 492, 492, 513, 513, 513, 513, 513, 513
-    492, 492, 492, 492, 492, 492, 492, 513, 513, 513, 513, 513, 513, 492
-    492, 492, 513, 492, 492, 492, 492, 513, 513, 513, 513, 513, 492, 513
-    513, 492, 492, 490, 491, 490, 491, 513, 492, 492, 492, 492, 513, 492
-    513, 513, 513, 492, 492, 513, 513, 492, 492, 492, 492, 492, 492, 492
-    492, 492, 492, 513, 513, 513, 513, 513, 513, 492, 492, 490, 491, 492, 
-    492, 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513
-    492, 513, 513, 513, 513, 492, 492, 513, 492, 513, 492, 492, 513, 492
-    513, 513, 513, 513, 492, 492, 492, 492, 492, 513, 513, 492, 492, 492
-    492, 513, 513, 513, 513, 492, 513, 513, 492, 492, 513, 513, 492, 492
-    492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 492
-    492, 513, 513, 513, 513, 513, 513, 513, 513, 492, 513, 513, 513, 513
-    513, 513, 513, 513, 492, 492, 492, 492, 492, 513, 492, 513, 492, 492
-    492, 513, 513, 513, 513, 513, 492, 492, 492, 492, 513, 492, 492, 492, 
-    513, 513, 513, 513, 513, 492, 513, 492, 492, 41, 41, 41, 526, 526, 41
-    41, 41, 492, 492, 492, 492, 492, 41, 41, 492, 492, 492, 492, 492, 492
-    41, 41, 41, 526, 41, 41, 41, 41, 535, 508, 508, 41, 41, 41, 41, 82, 82
-    41, 41, 41, 41, 41, 41, 41, 41, 82, 82, 41, 41, 82, 82, 82, 41, 41, 41, 
-    41, 82, 41, 41, 41, 41, 41, 41, 41, 41, 82, 82, 82, 82, 82, 82, 82, 82
-    82, 82, 41, 41, 41, 41, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539
-    539, 539, 539, 539, 539, 82, 540, 540, 540, 540, 540, 540, 540, 540, 540
-    540, 540, 540, 540, 540, 540, 82, 53, 57, 53, 53, 53, 57, 57, 53, 57, 53
-    57, 53, 57, 53, 53, 53, 53, 57, 53, 57, 57, 53, 57, 57, 57, 57, 57, 57
-    60, 60, 53, 53, 88, 89, 88, 89, 89, 541, 541, 541, 541, 541, 541, 88, 89
-    88, 89, 542, 542, 542, 88, 89, 82, 82, 82, 82, 82, 543, 544, 544, 544
-    545, 543, 544, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546
-    546, 546, 546, 82, 546, 82, 82, 82, 82, 82, 546, 82, 82, 547, 547, 547
-    547, 547, 547, 547, 547, 82, 82, 82, 82, 82, 82, 82, 548, 549, 82, 82
-    82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 550, 96, 96, 96, 96, 96, 
-    96, 96, 96, 551, 551, 43, 51, 43, 51, 551, 551, 551, 43, 51, 551, 43, 51
-    373, 373, 373, 373, 373, 373, 373, 373, 85, 466, 552, 373, 553, 85, 43
-    51, 85, 85, 43, 51, 490, 491, 490, 491, 490, 491, 490, 491, 373, 373
-    373, 373, 371, 61, 373, 373, 85, 373, 373, 85, 85, 85, 85, 85, 554, 554
-    373, 373, 373, 85, 466, 373, 471, 373, 373, 82, 82, 82, 555, 555, 555
-    555, 555, 555, 555, 555, 555, 555, 82, 555, 555, 555, 555, 555, 555, 555
-    555, 555, 82, 82, 82, 82, 555, 555, 555, 555, 555, 555, 82, 82, 523, 523
-    523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 82, 82, 82, 82, 556
-    557, 557, 558, 523, 559, 560, 561, 524, 525, 524, 525, 524, 525, 524, 
-    525, 524, 525, 523, 523, 524, 525, 524, 525, 524, 525, 524, 525, 562
-    563, 564, 564, 523, 561, 561, 561, 561, 561, 561, 561, 561, 561, 565
-    566, 567, 568, 569, 569, 570, 571, 571, 571, 571, 572, 523, 523, 561
-    561, 561, 559, 573, 558, 523, 527, 82, 574, 575, 574, 575, 574, 575, 574
-    575, 574, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575
-    575, 575, 575, 575, 575, 574, 575, 575, 575, 575, 575, 575, 575, 574
-    575, 574, 575, 574, 575, 575, 575, 575, 575, 575, 574, 575, 575, 575
-    575, 575, 575, 574, 574, 82, 82, 576, 576, 577, 577, 578, 578, 575, 562
-    579, 580, 579, 580, 579, 580, 579, 580, 579, 580, 580, 580, 580, 580, 
-    580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 579, 580, 
-    580, 580, 580, 580, 580, 580, 579, 580, 579, 580, 579, 580, 580, 580
-    580, 580, 580, 579, 580, 580, 580, 580, 580, 580, 579, 579, 580, 580
-    580, 580, 581, 582, 583, 583, 580, 82, 82, 82, 82, 82, 584, 584, 584, 
-    584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 82
-    82, 82, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585
-    585, 585, 585, 585, 585, 585, 585, 585, 585, 82, 586, 586, 587, 587, 587, 
-    587, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 584, 584, 584, 82
-    82, 82, 82, 82, 579, 579, 579, 579, 579, 579, 579, 579, 588, 588, 588
-    588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 82, 587, 587
-    587, 587, 587, 587, 587, 587, 587, 587, 586, 586, 586, 586, 586, 586
-    590, 590, 590, 590, 590, 590, 590, 590, 523, 591, 591, 591, 591, 591
-    591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 588, 588, 588, 588
-    589, 589, 589, 586, 586, 591, 591, 591, 591, 591, 591, 591, 586, 586
-    586, 586, 523, 523, 523, 523, 592, 592, 592, 592, 592, 592, 592, 592, 
-    592, 592, 592, 592, 592, 592, 592, 82, 586, 586, 586, 586, 586, 586, 586
-    523, 523, 523, 523, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586
-    586, 523, 523, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593
-    593, 593, 593, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595
-    595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 596, 595
-    595, 595, 595, 595, 595, 595, 82, 82, 82, 597, 597, 597, 597, 597, 597, 
-    597, 597, 597, 597, 597, 597, 597, 597, 597, 82, 598, 598, 598, 598, 598
-    598, 598, 598, 599, 599, 599, 599, 599, 599, 600, 600, 601, 601, 601, 
-    601, 601, 601, 601, 601, 601, 601, 601, 601, 602, 603, 604, 603, 605
-    605, 605, 605, 605, 605, 605, 605, 605, 605, 601, 601, 82, 82, 82, 82
-    91, 94, 91, 94, 91, 94, 606, 96, 98, 98, 98, 607, 96, 96, 96, 96, 96, 96
-    96, 96, 96, 96, 607, 608, 91, 94, 91, 94, 450, 450, 96, 96, 609, 609
-    609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 610, 610
-    610, 610, 610, 610, 610, 610, 610, 610, 611, 611, 612, 613, 613, 613
-    613, 613, 63, 63, 63, 63, 63, 63, 63, 61, 61, 61, 61, 61, 61, 61, 61, 61
-    63, 63, 53, 57, 53, 57, 53, 57, 57, 57, 53, 57, 53, 57, 53, 57, 60, 57
-    57, 57, 57, 57, 57, 57, 57, 53, 57, 53, 57, 53, 53, 57, 61, 614, 614, 53, 
-    57, 53, 57, 58, 53, 57, 53, 57, 57, 57, 53, 57, 53, 57, 53, 53, 53, 53
-    53, 82, 53, 53, 53, 53, 53, 57, 53, 57, 82, 82, 82, 82, 82, 82, 82, 58
-    60, 60, 57, 58, 58, 58, 58, 58, 615, 615, 616, 615, 615, 615, 617, 615
-    615, 615, 615, 616, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615
-    615, 615, 615, 615, 615, 618, 618, 616, 616, 618, 619, 619, 619, 619, 82
-    82, 82, 82, 620, 620, 620, 620, 620, 620, 313, 313, 503, 512, 82, 82, 82, 
-    82, 82, 82, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621
-    622, 622, 623, 623, 624, 624, 625, 625, 625, 625, 625, 625, 625, 625
-    625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 624, 624, 624, 624
-    624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 626, 627, 82
-    82, 82, 82, 82, 82, 82, 82, 628, 628, 629, 629, 629, 629, 629, 629, 629
-    629, 629, 629, 82, 82, 82, 82, 82, 82, 198, 198, 198, 198, 198, 198, 198
-    198, 198, 198, 195, 195, 195, 195, 195, 195, 201, 201, 201, 195, 630
-    195, 82, 82, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, 632
-    632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632
-    632, 632, 632, 632, 633, 633, 633, 633, 633, 634, 634, 634, 199, 635
-    636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 
-    636, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 638, 639, 82
-    82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 640, 328, 328, 328, 328, 328, 82
-    82, 82, 641, 641, 641, 642, 643, 643, 643, 643, 643, 643, 643, 643, 643, 
-    643, 643, 643, 643, 643, 643, 644, 642, 642, 641, 641, 641, 641, 642
-    642, 641, 642, 642, 642, 645, 646, 646, 646, 646, 646, 646, 647, 647
-    647, 646, 646, 646, 646, 82, 62, 648, 648, 648, 648, 648, 648, 648, 648
-    648, 648, 82, 82, 82, 82, 646, 646, 314, 314, 314, 314, 314, 316, 649
-    314, 319, 319, 314, 314, 314, 314, 314, 82, 650, 650, 650, 650, 650, 650
-    650, 650, 650, 651, 651, 651, 651, 651, 651, 652, 652, 651, 651, 652
-    652, 651, 651, 82, 650, 650, 650, 651, 650, 650, 650, 650, 650, 650, 650
-    650, 651, 652, 82, 82, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653
-    82, 82, 654, 655, 655, 655, 649, 314, 314, 314, 314, 314, 314, 323, 323
-    323, 314, 315, 316, 315, 314, 314, 656, 656, 656, 656, 656, 656, 656
-    656, 657, 656, 657, 657, 658, 656, 656, 657, 657, 656, 656, 656, 656
-    656, 657, 657, 656, 657, 656, 82, 82, 82, 82, 82, 82, 82, 82, 656, 656
-    659, 660, 660, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 
-    662, 663, 663, 662, 662, 664, 664, 661, 665, 665, 662, 666, 82, 82, 331
-    331, 331, 331, 331, 331, 82, 57, 57, 57, 614, 60, 60, 60, 60, 57, 57, 57
-    57, 57, 80, 82, 82, 338, 338, 338, 338, 338, 338, 338, 338, 661, 661
-    661, 662, 662, 663, 662, 662, 663, 662, 662, 664, 662, 666, 82, 82, 667
-    667, 667, 667, 667, 667, 667, 667, 667, 667, 82, 82, 82, 82, 82, 82, 668
-    669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669
-    669, 669, 669, 669, 669, 668, 669, 669, 669, 669, 669, 669, 669, 82, 82
-    82, 82, 329, 329, 329, 329, 329, 329, 329, 82, 82, 82, 82, 330, 330, 330
-    330, 330, 330, 330, 330, 330, 82, 82, 82, 82, 670, 670, 670, 670, 670
-    670, 670, 670, 671, 671, 671, 671, 671, 671, 671, 671, 593, 593, 594
-    594, 594, 594, 594, 594, 57, 57, 57, 57, 57, 57, 57, 82, 82, 82, 82, 102
-    102, 102, 102, 102, 82, 82, 82, 82, 82, 130, 672, 130, 130, 673, 130
-    130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 82, 130, 130
-    130, 130, 130, 82, 130, 82, 130, 130, 82, 130, 130, 82, 130, 130, 147
-    147, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674
-    674, 674, 674, 82, 82, 82, 82, 82, 82, 82, 82, 82, 147, 147, 147, 147
-    147, 147, 147, 147, 147, 147, 147, 675, 471, 82, 82, 147, 147, 147, 147
-    147, 147, 147, 147, 147, 147, 136, 139, 82, 82, 676, 676, 676, 676, 676
-    676, 676, 676, 677, 557, 557, 677, 677, 678, 678, 563, 564, 679, 82, 82
-    82, 82, 82, 82, 97, 97, 97, 97, 97, 97, 97, 157, 157, 157, 157, 157, 157
-    157, 96, 96, 558, 570, 570, 680, 680, 563, 564, 563, 564, 563, 564, 563
-    564, 563, 564, 563, 564, 563, 564, 563, 564, 558, 558, 563, 564, 558, 
-    558, 558, 558, 680, 680, 680, 681, 558, 681, 82, 581, 682, 678, 678, 570
-    524, 525, 524, 525, 524, 525, 683, 558, 558, 684, 685, 686, 686, 687, 82
-    558, 688, 689, 558, 82, 82, 82, 82, 147, 147, 147, 147, 147, 82, 82, 493
-    82, 690, 691, 692, 693, 694, 691, 691, 695, 696, 691, 697, 698, 699, 698
-    700, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 702, 703, 704
-    705, 704, 690, 691, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706
-    706, 706, 706, 706, 706, 706, 706, 706, 695, 691, 696, 707, 708, 707
-    709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709
-    709, 709, 709, 709, 695, 705, 696, 705, 695, 696, 710, 711, 712, 710, 
-    713, 714, 715, 715, 715, 715, 715, 715, 715, 715, 715, 716, 714, 714
-    714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714
-    714, 714, 714, 714, 714, 717, 717, 718, 718, 718, 718, 718, 718, 718
-    718, 718, 718, 718, 718, 718, 718, 718, 82, 82, 82, 718, 718, 718, 718
-    718, 718, 82, 82, 718, 718, 718, 82, 82, 82, 719, 693, 705, 707, 720
-    693, 693, 82, 721, 722, 722, 722, 722, 721, 721, 82, 82, 723, 723, 723
-    724, 508, 82, 82, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725
-    725, 82, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 82, 725, 725
-    725, 82, 725, 725, 82, 725, 725, 725, 725, 725, 725, 725, 82, 82, 725
-    725, 725, 82, 82, 82, 82, 82, 199, 373, 199, 82, 82, 82, 82, 620, 620
-    620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 82, 82, 82, 313
-    726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 727
-    727, 727, 727, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728
-    728, 728, 728, 728, 728, 728, 727, 727, 728, 729, 729, 82, 41, 41, 41
-    41, 82, 82, 82, 82, 728, 82, 82, 82, 82, 82, 82, 82, 313, 313, 313, 313, 
-    313, 157, 82, 82, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730
-    730, 730, 82, 82, 82, 731, 731, 731, 731, 731, 731, 731, 731, 731, 82
-    82, 82, 82, 82, 82, 82, 157, 500, 500, 500, 500, 500, 500, 500, 500, 500
-    500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 82, 82, 82, 82, 732
-    732, 732, 732, 732, 732, 732, 732, 733, 733, 733, 733, 82, 82, 82, 82
-    734, 734, 734, 734, 734, 734, 734, 734, 734, 735, 734, 734, 734, 734
-    734, 734, 734, 734, 735, 82, 82, 82, 82, 82, 736, 736, 736, 736, 736
-    736, 736, 736, 736, 736, 736, 736, 736, 736, 737, 737, 737, 737, 737, 82
-    82, 82, 82, 82, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738
-    738, 738, 738, 82, 739, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740
-    740, 740, 82, 82, 82, 82, 741, 742, 742, 742, 742, 742, 82, 82, 743, 743
-    743, 743, 743, 743, 743, 743, 744, 744, 744, 744, 744, 744, 744, 744
-    745, 745, 745, 745, 745, 745, 745, 745, 746, 746, 746, 746, 746, 746
-    746, 746, 746, 746, 746, 746, 746, 746, 82, 82, 747, 747, 747, 747, 747
-    747, 747, 747, 747, 747, 82, 82, 82, 82, 82, 82, 748, 748, 748, 748, 748
-    748, 748, 748, 748, 748, 748, 748, 82, 82, 82, 82, 749, 749, 749, 749
-    749, 749, 749, 749, 749, 749, 749, 749, 82, 82, 82, 82, 750, 750, 750
-    750, 750, 750, 750, 750, 751, 751, 751, 751, 751, 751, 751, 751, 751
-    751, 751, 751, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 752, 753, 753
-    753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 82, 753
-    753, 753, 753, 753, 753, 82, 82, 754, 754, 754, 754, 754, 754, 82, 82
-    754, 82, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754
-    754, 754, 754, 754, 754, 754, 754, 82, 754, 754, 82, 82, 82, 754, 82, 82
-    754, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 
-    755, 82, 756, 757, 757, 757, 757, 757, 757, 757, 757, 758, 758, 758, 758
-    758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 759, 760
-    760, 760, 760, 760, 760, 760, 761, 761, 761, 761, 761, 761, 761, 761
-    761, 761, 761, 761, 761, 761, 761, 82, 82, 82, 82, 82, 82, 82, 82, 762
-    762, 762, 762, 762, 762, 762, 762, 762, 763, 763, 763, 763, 763, 763
-    763, 763, 763, 763, 763, 82, 763, 763, 82, 82, 82, 82, 82, 764, 764, 764
-    764, 764, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765
-    765, 765, 766, 766, 766, 766, 766, 766, 82, 82, 82, 767, 768, 768, 768
-    768, 768, 768, 768, 768, 768, 768, 82, 82, 82, 82, 82, 769, 770, 770
-    770, 770, 770, 770, 770, 770, 771, 771, 771, 771, 771, 771, 771, 771, 82
-    82, 82, 82, 772, 772, 771, 771, 772, 772, 772, 772, 772, 772, 772, 772
-    82, 82, 772, 772, 772, 772, 772, 772, 773, 774, 774, 774, 82, 774, 774
-    82, 82, 82, 82, 82, 774, 775, 774, 776, 773, 773, 773, 773, 82, 773, 773
-    773, 82, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773
-    773, 773, 773, 773, 773, 773, 82, 82, 82, 82, 776, 777, 775, 82, 82, 82
-    82, 778, 779, 779, 779, 779, 779, 779, 779, 779, 780, 780, 780, 780, 780, 
-    780, 780, 780, 781, 82, 82, 82, 82, 82, 82, 82, 782, 782, 782, 782, 782
-    782, 782, 782, 782, 782, 782, 782, 782, 783, 783, 784, 785, 785, 785
-    785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 786, 786, 786, 787
-    787, 787, 787, 787, 787, 787, 787, 788, 787, 787, 787, 787, 787, 787, 
-    787, 787, 787, 787, 787, 787, 789, 790, 82, 82, 82, 82, 791, 791, 791
-    791, 791, 792, 792, 792, 792, 792, 792, 793, 82, 794, 794, 794, 794, 794, 
-    794, 794, 794, 794, 794, 794, 794, 794, 794, 82, 82, 82, 795, 795, 795
-    795, 795, 795, 795, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796
-    796, 796, 796, 796, 82, 82, 797, 797, 797, 797, 797, 797, 797, 797, 798
-    798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 82, 82, 82, 82, 82
-    799, 799, 799, 799, 799, 799, 799, 799, 800, 800, 800, 800, 800, 800, 
-    800, 800, 800, 800, 82, 82, 82, 82, 82, 82, 82, 801, 801, 801, 801, 82
-    82, 82, 82, 802, 802, 802, 802, 802, 802, 802, 803, 803, 803, 803, 803
-    803, 803, 803, 803, 82, 82, 82, 82, 82, 82, 82, 804, 804, 804, 804, 804, 
-    804, 804, 804, 804, 804, 804, 82, 82, 82, 82, 82, 805, 805, 805, 805
-    805, 805, 805, 805, 805, 805, 805, 82, 82, 82, 82, 82, 82, 82, 806, 806
-    806, 806, 806, 806, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807
-    807, 807, 807, 807, 807, 82, 808, 809, 808, 810, 810, 810, 810, 810, 810
-    810, 810, 810, 810, 810, 810, 810, 809, 809, 809, 809, 809, 809, 809
-    809, 809, 809, 809, 809, 809, 809, 811, 812, 812, 813, 813, 813, 813
-    813, 82, 82, 82, 82, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814
-    814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 815, 815, 815, 815
-    815, 815, 815, 815, 815, 815, 82, 82, 82, 82, 82, 82, 82, 811, 816, 816
-    817, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818
-    817, 817, 817, 816, 816, 816, 816, 817, 817, 819, 820, 821, 821, 822
-    823, 823, 823, 823, 82, 82, 82, 82, 82, 82, 824, 824, 824, 824, 824, 824
-    824, 824, 824, 82, 82, 82, 82, 82, 82, 82, 825, 825, 825, 825, 825, 825
-    825, 825, 825, 825, 82, 82, 82, 82, 82, 82, 826, 826, 826, 827, 827, 827
-    827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827
-    827, 827, 827, 828, 828, 828, 828, 828, 829, 828, 828, 828, 828, 828
-    828, 830, 830, 82, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 832
-    832, 832, 832, 82, 82, 82, 82, 833, 833, 833, 833, 833, 833, 833, 833
-    833, 833, 833, 834, 835, 836, 833, 82, 837, 837, 838, 839, 839, 839, 839
-    839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 838, 838
-    838, 837, 837, 837, 837, 837, 837, 837, 837, 837, 838, 840, 839, 839
-    839, 839, 841, 841, 842, 841, 842, 843, 837, 837, 842, 82, 82, 844, 844
-    844, 844, 844, 844, 844, 844, 844, 844, 839, 845, 839, 841, 841, 841, 82
-    846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846
-    846, 846, 846, 846, 846, 846, 82, 82, 82, 847, 847, 847, 847, 847, 847
-    847, 847, 847, 847, 82, 847, 847, 847, 847, 847, 847, 847, 847, 847, 848, 
-    848, 848, 849, 849, 849, 848, 848, 849, 850, 851, 849, 852, 852, 853
-    852, 852, 853, 849, 82, 854, 854, 854, 854, 854, 854, 854, 82, 854, 82
-    854, 854, 854, 854, 82, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854
-    854, 854, 854, 854, 854, 82, 854, 854, 855, 82, 82, 82, 82, 82, 82, 856
-    856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 
-    857, 858, 858, 858, 857, 857, 857, 857, 857, 857, 859, 860, 82, 82, 82
-    82, 82, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 82, 82, 82, 82
-    82, 82, 862, 862, 863, 863, 82, 864, 864, 864, 864, 864, 864, 864, 864
-    82, 82, 864, 864, 82, 82, 864, 864, 864, 864, 864, 864, 864, 864, 864
-    864, 864, 864, 864, 864, 82, 864, 864, 864, 864, 864, 864, 864, 82, 864
-    864, 82, 864, 864, 864, 864, 864, 82, 82, 865, 864, 863, 863, 862, 863
-    863, 863, 863, 82, 82, 863, 863, 82, 82, 863, 863, 866, 82, 82, 864, 82, 
-    82, 82, 82, 82, 82, 863, 82, 82, 82, 82, 82, 864, 864, 864, 864, 864
-    863, 863, 82, 82, 867, 867, 867, 867, 867, 867, 867, 82, 82, 82, 868
-    868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 869, 869
-    869, 870, 870, 870, 870, 870, 870, 870, 870, 869, 869, 871, 870, 870
-    869, 872, 868, 868, 868, 868, 873, 873, 873, 873, 874, 875, 875, 875
-    875, 875, 875, 875, 875, 875, 875, 82, 873, 82, 874, 82, 82, 876, 876
-    876, 876, 876, 876, 876, 876, 877, 877, 877, 878, 878, 878, 878, 878
-    878, 877, 878, 877, 877, 877, 877, 878, 878, 877, 879, 880, 876, 876
-    881, 876, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 82, 82, 82
-    82, 82, 82, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883
-    883, 883, 883, 884, 884, 884, 885, 885, 885, 885, 82, 82, 884, 884, 884
-    884, 885, 885, 884, 886, 887, 888, 889, 889, 890, 890, 891, 891, 891
-    889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889
-    889, 883, 883, 883, 883, 885, 885, 82, 82, 892, 892, 892, 892, 892, 892
-    892, 892, 893, 893, 893, 894, 894, 894, 894, 894, 894, 894, 894, 893
-    893, 894, 893, 895, 894, 896, 896, 897, 892, 82, 82, 82, 898, 898, 898
-    898, 898, 898, 898, 898, 898, 898, 82, 82, 82, 82, 82, 82, 899, 899, 899
-    899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 82, 82, 82, 900, 900
-    900, 900, 900, 900, 900, 900, 900, 900, 900, 901, 902, 901, 902, 902
-    901, 901, 901, 901, 901, 901, 903, 904, 905, 905, 905, 905, 905, 905
-    905, 905, 905, 905, 82, 82, 82, 82, 82, 82, 906, 906, 906, 906, 906, 906
-    906, 906, 906, 906, 82, 82, 82, 907, 907, 907, 908, 908, 907, 907, 907
-    907, 908, 907, 907, 907, 907, 909, 82, 82, 82, 82, 910, 910, 910, 910
-    910, 910, 910, 910, 910, 910, 911, 911, 912, 912, 912, 913, 914, 914
-    914, 914, 914, 914, 914, 914, 915, 915, 915, 915, 915, 915, 915, 915, 
-    916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 917, 917, 917, 917
-    917, 917, 917, 917, 917, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82
-    918, 919, 919, 919, 919, 919, 919, 919, 919, 919, 82, 82, 82, 82, 82, 82
-    82, 920, 920, 920, 920, 920, 920, 920, 920, 920, 82, 920, 920, 920, 920
-    920, 920, 920, 920, 920, 920, 920, 920, 920, 921, 922, 922, 922, 922
-    922, 922, 922, 82, 922, 922, 922, 922, 922, 922, 921, 923, 920, 924, 924
-    924, 924, 924, 82, 82, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925
-    926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926
-    926, 926, 926, 926, 926, 82, 82, 82, 927, 928, 929, 929, 929, 929, 929
-    929, 929, 929, 929, 929, 929, 929, 929, 929, 82, 82, 930, 930, 930, 930
-    930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 82, 931, 930, 930, 930
-    930, 930, 930, 930, 931, 930, 930, 931, 930, 930, 82, 932, 932, 932, 932
-    932, 932, 932, 932, 932, 932, 82, 82, 82, 82, 82, 82, 933, 933, 933, 933
-    933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 82, 934, 934, 934
-    934, 934, 82, 82, 82, 932, 932, 932, 932, 82, 82, 82, 82, 935, 935, 935
-    935, 935, 935, 935, 935, 936, 936, 936, 937, 937, 937, 935, 935, 935
-    935, 937, 935, 935, 935, 936, 937, 936, 937, 935, 935, 935, 935, 935
-    935, 935, 936, 937, 937, 935, 935, 935, 935, 935, 935, 935, 935, 935, 
-    935, 935, 82, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938
-    938, 938, 939, 940, 938, 938, 938, 938, 938, 938, 938, 82, 609, 82, 82
-    82, 82, 82, 82, 82, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941
-    941, 941, 941, 941, 941, 82, 942, 942, 942, 942, 942, 942, 942, 942, 942
-    942, 82, 82, 82, 82, 943, 943, 944, 944, 944, 944, 944, 944, 944, 944
-    944, 944, 944, 944, 944, 944, 82, 82, 945, 945, 945, 945, 945, 946, 82
-    82, 947, 947, 947, 947, 947, 947, 947, 947, 948, 948, 948, 948, 948, 948
-    948, 949, 949, 949, 950, 950, 951, 951, 951, 951, 952, 952, 952, 952
-    949, 951, 82, 82, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 82
-    954, 954, 954, 954, 954, 954, 954, 82, 947, 947, 947, 947, 947, 82, 82
-    82, 82, 82, 947, 947, 947, 955, 955, 955, 955, 955, 955, 955, 955, 955
-    955, 955, 955, 955, 82, 82, 82, 955, 956, 956, 956, 956, 956, 956, 956
-    956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956
-    956, 82, 82, 82, 82, 82, 82, 82, 82, 957, 957, 957, 957, 958, 958, 958
-    958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 959, 82, 82, 82, 82
-    82, 82, 82, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960
-    960, 82, 82, 82, 960, 960, 960, 82, 82, 82, 82, 82, 580, 575, 82, 82, 82
-    82, 82, 82, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 82
-    82, 82, 82, 82, 961, 961, 961, 961, 961, 82, 82, 82, 961, 82, 82, 82, 82
-    82, 82, 82, 961, 961, 82, 82, 962, 963, 964, 965, 499, 499, 499, 499, 82
-    82, 82, 82, 313, 313, 313, 313, 313, 313, 82, 82, 313, 313, 313, 313
-    313, 313, 313, 82, 82, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313
-    313, 313, 966, 966, 447, 447, 447, 313, 313, 313, 967, 966, 966, 966
-    966, 966, 499, 499, 499, 499, 499, 499, 499, 499, 157, 157, 157, 157
-    157, 157, 157, 157, 313, 313, 97, 97, 97, 97, 97, 157, 157, 313, 313
-    313, 313, 313, 313, 97, 97, 97, 97, 313, 313, 313, 82, 82, 82, 82, 82
-    82, 82, 728, 728, 968, 968, 968, 728, 82, 82, 620, 620, 82, 82, 82, 82
-    82, 82, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 50, 50, 50, 50
-    50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 506, 506, 506
-    506, 506, 506, 506, 506, 506, 506, 50, 50, 50, 50, 50, 50, 50, 82, 50
-    50, 50, 50, 50, 50, 506, 82, 506, 506, 82, 82, 506, 82, 82, 506, 506, 82
-    82, 506, 506, 506, 506, 82, 506, 506, 50, 50, 82, 50, 82, 50, 50, 50, 50
-    50, 50, 50, 82, 50, 50, 50, 50, 50, 50, 50, 506, 506, 82, 506, 506, 506
-    506, 82, 82, 506, 506, 506, 506, 506, 506, 506, 506, 82, 506, 506, 506
-    506, 506, 506, 506, 82, 50, 50, 506, 506, 82, 506, 506, 506, 506, 82
-    506, 506, 506, 506, 506, 82, 506, 82, 82, 82, 506, 506, 506, 506, 506
-    506, 506, 82, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 82, 82
-    506, 969, 50, 50, 50, 50, 50, 50, 50, 50, 50, 513, 50, 50, 50, 50, 50
-    50, 506, 506, 506, 506, 506, 506, 506, 506, 506, 969, 50, 50, 50, 50, 50
-    50, 50, 50, 50, 513, 50, 50, 506, 506, 506, 506, 506, 969, 50, 50, 50
-    50, 50, 50, 50, 50, 50, 513, 50, 50, 50, 50, 50, 50, 506, 506, 506, 506
-    506, 506, 506, 506, 506, 969, 50, 513, 50, 50, 50, 50, 50, 50, 50, 50
-    506, 50, 82, 82, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 971
-    971, 971, 971, 971, 971, 971, 971, 972, 972, 972, 972, 972, 972, 972
-    972, 972, 972, 972, 972, 972, 972, 972, 971, 971, 971, 971, 972, 972
-    972, 972, 972, 972, 972, 972, 972, 972, 971, 971, 971, 971, 971, 971
-    971, 971, 972, 971, 971, 971, 971, 971, 971, 972, 971, 971, 973, 973
-    973, 973, 974, 82, 82, 82, 82, 82, 82, 82, 972, 972, 972, 972, 972, 82
-    972, 972, 972, 972, 972, 972, 972, 975, 975, 975, 975, 975, 975, 975, 82
-    975, 975, 975, 975, 975, 975, 975, 975, 975, 82, 82, 975, 975, 975, 975
-    975, 975, 975, 82, 975, 975, 82, 975, 975, 975, 975, 975, 82, 82, 82, 82
-    82, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 82
-    82, 977, 977, 977, 977, 977, 977, 977, 977, 977, 978, 978, 978, 978, 978
-    978, 978, 82, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 980, 980
-    980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980
-    980, 980, 981, 981, 981, 981, 981, 981, 982, 82, 82, 82, 82, 82, 983
-    983, 983, 983, 983, 983, 983, 983, 983, 983, 82, 82, 82, 82, 984, 984
-    147, 147, 147, 147, 82, 147, 147, 147, 82, 147, 147, 82, 147, 82, 82
-    147, 82, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 82, 147, 147
-    147, 147, 82, 147, 82, 147, 82, 82, 82, 82, 82, 82, 147, 82, 82, 82, 82
-    147, 82, 147, 82, 147, 82, 147, 147, 147, 82, 147, 82, 147, 82, 147, 82
-    147, 82, 147, 147, 147, 147, 82, 147, 82, 147, 147, 82, 147, 147, 147
-    147, 147, 147, 147, 147, 147, 82, 82, 82, 82, 82, 147, 147, 147, 82, 147
-    147, 147, 133, 133, 82, 82, 82, 82, 82, 82, 527, 527, 527, 527, 523, 527
-    527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 
-    985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 527, 527
-    527, 527, 527, 527, 527, 985, 985, 527, 527, 527, 527, 527, 527, 527
-    527, 527, 527, 527, 527, 527, 527, 523, 527, 527, 527, 527, 527, 527
-    985, 985, 48, 48, 48, 516, 516, 985, 985, 985, 528, 528, 528, 528, 528, 
-    528, 313, 985, 528, 528, 41, 41, 985, 985, 985, 985, 528, 528, 528, 528
-    528, 528, 986, 528, 528, 986, 986, 986, 986, 986, 986, 986, 986, 986
-    986, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 985, 985, 985
-    985, 985, 985, 985, 985, 985, 987, 987, 987, 987, 987, 987, 987, 987
-    987, 987, 988, 586, 586, 985, 985, 985, 985, 985, 586, 586, 586, 586
-    985, 985, 985, 985, 586, 985, 985, 985, 985, 985, 985, 985, 586, 586
-    985, 985, 985, 985, 985, 985, 523, 527, 527, 527, 527, 527, 527, 527
-    527, 527, 527, 527, 527, 523, 523, 523, 523, 523, 523, 523, 523, 523
-    527, 523, 523, 523, 523, 523, 523, 527, 523, 523, 523, 523, 523, 523
-    523, 534, 523, 523, 523, 523, 523, 523, 527, 527, 527, 527, 527, 527
-    527, 527, 41, 41, 527, 527, 523, 523, 523, 523, 523, 526, 526, 523, 523
-    523, 523, 523, 526, 523, 523, 523, 523, 523, 523, 534, 534, 523, 523
-    523, 523, 523, 534, 532, 527, 527, 527, 523, 523, 527, 527, 527, 523
-    527, 527, 527, 523, 523, 523, 989, 989, 989, 989, 989, 523, 523, 523
-    523, 523, 523, 523, 527, 523, 527, 534, 534, 523, 523, 534, 534, 534
-    534, 534, 534, 534, 534, 534, 534, 534, 523, 523, 523, 523, 523, 523
-    523, 523, 523, 523, 523, 523, 523, 534, 534, 534, 534, 523, 523, 523
-    523, 534, 523, 534, 523, 523, 523, 534, 523, 523, 523, 523, 534, 534
-    534, 523, 534, 534, 534, 526, 523, 526, 523, 526, 523, 523, 523, 523
-    523, 534, 523, 523, 523, 523, 526, 523, 526, 526, 523, 523, 523, 523
-    523, 523, 523, 523, 523, 523, 527, 527, 523, 526, 526, 526, 526, 526
-    526, 526, 523, 523, 523, 523, 523, 523, 523, 523, 526, 526, 526, 526
-    526, 526, 523, 523, 523, 523, 523, 526, 526, 526, 526, 526, 526, 526
-    526, 526, 526, 526, 526, 41, 41, 41, 41, 527, 523, 523, 523, 523, 527
-    527, 527, 527, 527, 527, 532, 527, 527, 527, 527, 534, 527, 527, 527
-    527, 527, 532, 527, 527, 527, 527, 534, 534, 527, 527, 527, 527, 527, 41
-    41, 41, 41, 41, 41, 41, 41, 527, 527, 527, 527, 41, 41, 527, 523, 523
-    523, 523, 523, 523, 523, 523, 523, 523, 534, 534, 534, 523, 523, 523
-    534, 534, 534, 534, 534, 41, 41, 41, 41, 41, 41, 536, 536, 536, 990, 990
-    990, 41, 41, 41, 41, 523, 523, 523, 534, 523, 523, 523, 523, 523, 523
-    523, 523, 534, 534, 534, 523, 534, 523, 523, 523, 523, 523, 527, 527
-    523, 523, 523, 985, 985, 985, 985, 985, 527, 527, 527, 523, 523, 985
-    985, 985, 527, 527, 527, 527, 523, 523, 523, 985, 41, 41, 41, 41, 985
-    985, 985, 985, 41, 41, 41, 41, 41, 985, 985, 985, 41, 41, 985, 985, 985
-    985, 985, 985, 41, 41, 41, 41, 41, 41, 985, 985, 534, 534, 534, 534, 534
-    534, 534, 985, 523, 523, 523, 523, 523, 523, 534, 523, 534, 985, 985
-    534, 534, 534, 534, 534, 534, 534, 523, 523, 534, 534, 534, 985, 523
-    523, 523, 523, 985, 985, 985, 985, 523, 523, 523, 523, 523, 523, 523
-    985, 523, 523, 985, 985, 985, 985, 985, 985, 523, 985, 985, 985, 985
-    985, 985, 985, 985, 985, 985, 985, 985, 985, 82, 82, 593, 593, 593, 593
-    593, 593, 593, 594, 593, 593, 593, 593, 593, 594, 594, 594, 594, 594
-    594, 594, 594, 594, 82, 82, 82, 499, 82, 82, 82, 82, 82, 82, 499, 499
-    499, 499, 499, 499, 499, 499, 671, 671, 671, 671, 671, 671, 82, 82
+    22, 22, 22, 22, 22, 22, 22, 22, 19, 23, 24, 24, 24, 10, 15, 25, 25, 25
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 16, 26, 17, 
+    27, 28, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
+    29, 29, 29, 16, 30, 31, 24, 1, 1, 1, 1, 1, 1, 32, 1, 1, 33, 34, 35, 13, 
+    36, 13, 37, 38, 39, 40, 41, 42, 24, 43, 44, 27, 45, 46, 47, 47, 48, 49
+    38, 38, 39, 47, 41, 50, 51, 51, 51, 34, 52, 52, 52, 52, 52, 52, 53, 52
+    52, 52, 52, 52, 52, 52, 52, 52, 53, 52, 52, 52, 52, 52, 52, 54, 53, 52
+    52, 52, 52, 52, 53, 55, 55, 55, 56, 56, 56, 56, 55, 56, 55, 55, 55, 56
+    55, 55, 56, 56, 55, 56, 55, 55, 56, 56, 56, 54, 55, 55, 55, 56, 55, 56
+    55, 56, 52, 55, 52, 56, 52, 56, 52, 56, 52, 56, 52, 56, 52, 56, 52, 56
+    52, 55, 52, 55, 52, 56, 52, 56, 52, 56, 52, 55, 52, 56, 52, 56, 52, 56
+    52, 56, 52, 56, 53, 55, 52, 55, 53, 55, 52, 56, 52, 56, 55, 52, 56, 52
+    56, 52, 56, 53, 55, 53, 55, 52, 55, 52, 56, 52, 55, 55, 53, 55, 52, 55
+    52, 56, 52, 56, 53, 55, 52, 56, 52, 56, 52, 52, 56, 52, 56, 52, 56, 56
+    56, 52, 52, 56, 52, 56, 52, 52, 56, 52, 52, 52, 56, 56, 52, 52, 52, 52
+    56, 52, 52, 56, 52, 52, 52, 56, 56, 56, 52, 52, 56, 52, 52, 56, 52, 56
+    52, 56, 52, 52, 56, 52, 56, 56, 52, 56, 52, 52, 56, 52, 52, 52, 56, 52
+    56, 52, 52, 56, 56, 57, 52, 56, 56, 56, 57, 57, 57, 57, 52, 58, 56, 52
+    58, 56, 52, 58, 56, 52, 55, 52, 55, 52, 55, 52, 55, 52, 55, 52, 55, 52
+    55, 52, 55, 56, 52, 56, 56, 52, 58, 56, 52, 56, 52, 52, 52, 56, 52, 56
+    56, 56, 56, 56, 56, 56, 52, 52, 56, 52, 52, 56, 56, 52, 56, 52, 52, 52
+    52, 56, 56, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56
+    56, 56, 56, 56, 57, 56, 56, 56, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60
+    60, 61, 61, 61, 61, 61, 61, 61, 62, 62, 63, 62, 60, 64, 65, 64, 64, 64
+    65, 64, 60, 60, 66, 61, 62, 62, 62, 62, 62, 62, 39, 39, 39, 39, 62, 39
+    62, 48, 59, 59, 59, 59, 59, 62, 62, 62, 62, 62, 67, 67, 60, 62, 61, 62
+    62, 62, 62, 62, 62, 62, 62, 62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68
+    68, 68, 68, 69, 70, 70, 70, 70, 69, 71, 70, 70, 70, 70, 70, 72, 72, 70
+    70, 70, 70, 72, 72, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 73, 73
+    73, 73, 73, 70, 70, 70, 70, 68, 68, 68, 68, 68, 68, 68, 68, 74, 68, 70
+    70, 70, 68, 68, 68, 70, 70, 75, 68, 68, 68, 70, 70, 70, 70, 68, 69, 70
+    70, 68, 76, 77, 77, 76, 77, 77, 76, 68, 68, 68, 68, 68, 78, 79, 78, 79
+    60, 80, 78, 79, 81, 81, 82, 79, 79, 79, 83, 78, 81, 81, 81, 81, 80, 62
+    78, 84, 78, 78, 78, 81, 78, 81, 78, 78, 79, 85, 85, 85, 85, 85, 85, 85
+    85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 81, 85, 85, 85, 85, 85, 85, 85
+    78, 78, 79, 79, 79, 79, 79, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86
+    86, 86, 86, 86, 86, 86, 79, 86, 86, 86, 86, 86, 86, 86, 79, 79, 79, 79
+    79, 78, 79, 79, 78, 78, 78, 79, 79, 79, 78, 79, 78, 79, 78, 79, 78, 79
+    78, 79, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 87, 88, 79, 79
+    79, 79, 78, 79, 89, 78, 79, 78, 78, 79, 79, 78, 78, 78, 90, 91, 90, 90
+    90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91
+    91, 91, 92, 92, 92, 92, 92, 92, 92, 92, 93, 92, 93, 93, 93, 93, 93, 93
+    93, 93, 93, 93, 93, 93, 93, 93, 90, 93, 90, 93, 90, 93, 90, 93, 90, 93
+    94, 95, 95, 96, 96, 95, 97, 97, 90, 93, 90, 93, 90, 93, 90, 90, 93, 90
+    93, 90, 93, 90, 93, 90, 93, 90, 93, 90, 93, 93, 81, 98, 98, 98, 98, 98
+    98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 81
+    81, 99, 100, 100, 100, 100, 100, 100, 81, 101, 101, 101, 101, 101, 101
+    101, 101, 101, 101, 101, 101, 101, 101, 101, 81, 102, 103, 81, 81, 104
+    104, 105, 81, 106, 107, 107, 107, 107, 106, 107, 107, 107, 108, 106, 107
+    107, 107, 107, 107, 107, 106, 106, 106, 106, 106, 106, 107, 107, 106
+    107, 107, 108, 109, 107, 110, 111, 112, 113, 114, 115, 116, 117, 118
+    119, 119, 120, 121, 122, 123, 124, 125, 126, 127, 125, 107, 106, 128
+    118, 81, 81, 81, 81, 81, 81, 81, 81, 129, 129, 129, 129, 129, 129, 129
+    129, 129, 129, 129, 81, 81, 81, 81, 81, 129, 129, 129, 125, 125, 81, 81
+    81, 130, 130, 130, 130, 130, 131, 132, 132, 133, 134, 134, 135, 136, 137
+    138, 138, 139, 139, 139, 139, 139, 139, 139, 139, 140, 141, 142, 143
+    144, 81, 145, 143, 146, 146, 146, 146, 146, 146, 146, 146, 147, 146, 146
+    146, 146, 146, 146, 146, 146, 146, 146, 148, 149, 150, 151, 152, 153
+    154, 155, 96, 96, 156, 157, 139, 139, 139, 139, 139, 157, 139, 139, 157
+    158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 134, 159, 159, 160
+    146, 146, 161, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146
+    145, 146, 139, 139, 139, 139, 139, 139, 139, 131, 138, 139, 139, 139
+    139, 157, 139, 162, 162, 139, 139, 138, 157, 139, 139, 157, 146, 146
+    163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 146, 146, 146, 164
+    164, 146, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165
+    165, 165, 81, 166, 167, 168, 167, 167, 167, 167, 167, 167, 167, 167, 167
+    167, 167, 167, 167, 167, 169, 170, 169, 169, 170, 169, 169, 170, 170
+    170, 169, 170, 170, 169, 170, 169, 169, 169, 170, 169, 170, 169, 170
+    169, 170, 169, 169, 81, 81, 167, 167, 167, 171, 171, 171, 171, 171, 171
+    171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, 172, 172
+    172, 172, 172, 172, 172, 171, 81, 81, 81, 81, 81, 81, 173, 173, 173, 173
+    173, 173, 173, 173, 173, 173, 174, 174, 174, 174, 174, 174, 174, 174
+    174, 174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175
+    175, 175, 176, 175, 177, 177, 178, 179, 180, 181, 177, 81, 81, 81, 81
+    81, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182
+    183, 183, 183, 183, 184, 183, 183, 183, 183, 183, 183, 183, 183, 183
+    184, 183, 183, 183, 184, 183, 183, 183, 183, 183, 81, 81, 185, 185, 185
+    185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 81, 186, 186
+    186, 186, 186, 186, 186, 186, 186, 187, 187, 187, 81, 81, 188, 81, 167, 
+    167, 167, 81, 81, 81, 81, 81, 146, 146, 146, 146, 146, 81, 146, 146, 146
+    146, 146, 146, 146, 146, 81, 81, 81, 81, 81, 81, 139, 139, 139, 139, 139
+    139, 131, 157, 139, 139, 157, 139, 139, 157, 139, 139, 139, 157, 157
+    157, 189, 190, 191, 139, 139, 139, 157, 139, 139, 157, 157, 139, 139
+    139, 139, 139, 192, 192, 192, 193, 194, 194, 194, 194, 194, 194, 194
+    194, 194, 194, 194, 194, 194, 194, 192, 193, 195, 194, 193, 193, 193, 
+    192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 196, 193, 
+    193, 194, 96, 156, 197, 197, 192, 192, 192, 194, 194, 192, 192, 198, 198
+    199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 200, 201, 194, 194, 
+    194, 194, 194, 194, 202, 203, 204, 204, 81, 202, 202, 202, 202, 202, 202
+    202, 202, 81, 81, 202, 202, 81, 81, 202, 202, 202, 202, 202, 202, 202
+    202, 202, 202, 202, 202, 202, 202, 81, 202, 202, 202, 202, 202, 202, 202
+    81, 202, 81, 81, 81, 202, 202, 202, 202, 81, 81, 205, 202, 204, 204, 204
+    203, 203, 203, 203, 81, 81, 204, 204, 81, 81, 204, 204, 206, 202, 81, 81
+    81, 81, 81, 81, 81, 81, 204, 81, 81, 81, 81, 202, 202, 81, 202, 202, 202
+    203, 203, 81, 81, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 202
+    202, 208, 208, 209, 209, 209, 209, 209, 210, 211, 212, 202, 213, 81, 81
+    81, 214, 214, 215, 81, 216, 216, 216, 216, 216, 216, 81, 81, 81, 81, 216, 
+    216, 81, 81, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 
+    216, 216, 81, 216, 216, 216, 216, 216, 216, 216, 81, 216, 216, 81, 216
+    216, 81, 216, 216, 81, 81, 217, 81, 215, 215, 215, 214, 214, 81, 81, 81
+    81, 214, 214, 81, 81, 214, 214, 218, 81, 81, 81, 214, 81, 81, 81, 81, 81
+    81, 81, 216, 216, 216, 216, 81, 216, 81, 81, 81, 81, 81, 81, 81, 219, 
+    219, 219, 219, 219, 219, 219, 219, 219, 219, 214, 214, 216, 216, 216
+    214, 81, 81, 81, 220, 220, 221, 81, 222, 222, 222, 222, 222, 222, 222, 
+    222, 222, 81, 222, 222, 222, 81, 222, 222, 222, 222, 222, 222, 222, 222, 
+    222, 222, 222, 222, 222, 222, 81, 222, 222, 222, 222, 222, 222, 222, 81
+    222, 222, 81, 222, 222, 222, 222, 222, 81, 81, 223, 222, 221, 221, 221
+    220, 220, 220, 220, 220, 81, 220, 220, 221, 81, 221, 221, 224, 81, 81
+    222, 81, 81, 81, 81, 81, 81, 81, 222, 222, 220, 220, 81, 81, 225, 225, 
+    225, 225, 225, 225, 225, 225, 225, 225, 226, 227, 81, 81, 81, 81, 81, 81
+    81, 222, 220, 220, 220, 220, 220, 220, 81, 228, 229, 229, 81, 230, 230, 
+    230, 230, 230, 230, 230, 230, 81, 81, 230, 230, 81, 81, 230, 230, 230, 
+    230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 81, 230, 230, 230, 
+    230, 230, 230, 230, 81, 230, 230, 81, 230, 230, 230, 230, 230, 81, 81
+    231, 230, 229, 228, 229, 228, 228, 228, 228, 81, 81, 229, 229, 81, 81
+    229, 229, 232, 81, 81, 81, 81, 81, 81, 81, 81, 228, 229, 81, 81, 81, 81
+    230, 230, 81, 230, 230, 230, 228, 228, 81, 81, 233, 233, 233, 233, 233
+    233, 233, 233, 233, 233, 234, 230, 235, 235, 235, 235, 235, 235, 81, 81
+    236, 237, 81, 237, 237, 237, 237, 237, 237, 81, 81, 81, 237, 237, 237
+    81, 237, 237, 237, 237, 81, 81, 81, 237, 237, 81, 237, 81, 237, 237, 81
+    81, 81, 237, 237, 81, 81, 81, 237, 237, 237, 237, 237, 237, 237, 237
+    237, 237, 81, 81, 81, 81, 238, 238, 236, 238, 238, 81, 81, 81, 238, 238
+    238, 81, 238, 238, 238, 239, 81, 81, 237, 81, 81, 81, 81, 81, 81, 238
+    81, 81, 81, 81, 81, 81, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240
+    241, 241, 241, 242, 242, 242, 242, 242, 242, 243, 242, 81, 81, 81, 81
+    81, 244, 245, 245, 245, 81, 246, 246, 246, 246, 246, 246, 246, 246, 81
+    246, 246, 246, 81, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246
+    246, 246, 246, 246, 246, 81, 81, 81, 246, 244, 244, 244, 245, 245, 245
+    245, 81, 244, 244, 244, 81, 244, 244, 244, 247, 81, 81, 81, 81, 81, 81
+    81, 248, 249, 81, 246, 246, 246, 81, 81, 81, 81, 81, 246, 246, 244, 244
+    81, 81, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251
+    251, 251, 251, 251, 252, 253, 254, 255, 255, 81, 253, 253, 253, 253, 253, 
+    253, 253, 253, 81, 253, 253, 253, 81, 253, 253, 253, 253, 253, 253, 253, 
+    253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 81, 253, 253, 253
+    253, 253, 81, 81, 256, 253, 255, 257, 255, 255, 255, 255, 255, 81, 257
+    255, 255, 81, 255, 255, 254, 258, 81, 81, 81, 81, 81, 81, 81, 255, 255
+    81, 81, 81, 81, 81, 81, 81, 253, 81, 253, 253, 254, 254, 81, 81, 259, 
+    259, 259, 259, 259, 259, 259, 259, 259, 259, 81, 253, 253, 81, 81, 81, 
+    81, 81, 260, 260, 261, 261, 81, 262, 262, 262, 262, 262, 262, 262, 262, 
+    81, 262, 262, 262, 81, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 
+    262, 262, 262, 262, 262, 262, 262, 263, 263, 262, 261, 261, 261, 260
+    260, 260, 260, 81, 261, 261, 261, 81, 261, 261, 261, 263, 262, 264, 81
+    81, 81, 81, 262, 262, 262, 261, 265, 265, 265, 265, 265, 265, 265, 262, 
+    262, 262, 260, 260, 81, 81, 266, 266, 266, 266, 266, 266, 266, 266, 266
+    266, 265, 265, 265, 265, 265, 265, 265, 265, 265, 267, 262, 262, 262
+    262, 262, 262, 81, 81, 268, 268, 81, 269, 269, 269, 269, 269, 269, 269, 
+    269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 81, 81, 81, 269, 
+    269, 269, 269, 269, 269, 269, 269, 81, 269, 269, 269, 269, 269, 269, 269
+    269, 269, 81, 269, 81, 81, 81, 81, 270, 81, 81, 81, 81, 268, 268, 268
+    271, 271, 271, 81, 271, 81, 268, 268, 268, 268, 268, 268, 268, 268, 81
+    81, 81, 81, 81, 81, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 81
+    81, 268, 268, 273, 81, 81, 81, 81, 274, 274, 274, 274, 274, 274, 274, 
+    274, 274, 274, 274, 274, 274, 274, 274, 274, 275, 274, 274, 275, 275
+    275, 275, 276, 276, 277, 81, 81, 81, 81, 278, 274, 274, 274, 274, 274
+    274, 279, 275, 280, 280, 280, 280, 275, 275, 275, 281, 282, 282, 282, 
+    282, 282, 282, 282, 282, 282, 282, 283, 283, 81, 81, 81, 81, 81, 284
+    284, 81, 284, 81, 81, 284, 284, 81, 284, 81, 81, 284, 81, 81, 81, 81, 81
+    81, 284, 284, 284, 284, 81, 284, 284, 284, 284, 284, 284, 284, 81, 284
+    284, 284, 81, 284, 81, 284, 81, 81, 284, 284, 81, 284, 284, 284, 284
+    285, 284, 284, 285, 285, 285, 285, 286, 286, 81, 285, 285, 284, 81, 81
+    284, 284, 284, 284, 284, 81, 287, 81, 288, 288, 288, 288, 285, 285, 81
+    81, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 81, 81, 284, 284
+    284, 284, 290, 291, 291, 291, 292, 293, 292, 292, 294, 292, 292, 295
+    294, 296, 296, 296, 296, 296, 294, 297, 296, 297, 297, 297, 298, 298
+    297, 297, 297, 297, 297, 297, 299, 299, 299, 299, 299, 299, 299, 299
+    299, 299, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 301, 298
+    297, 298, 297, 302, 303, 304, 303, 304, 305, 305, 290, 290, 290, 290, 
+    290, 290, 290, 290, 81, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290
+    290, 290, 81, 81, 81, 81, 306, 307, 308, 309, 308, 308, 308, 308, 308
+    307, 307, 307, 307, 308, 310, 307, 308, 311, 311, 312, 295, 311, 311
+    290, 290, 290, 290, 290, 308, 308, 308, 308, 308, 308, 308, 308, 308, 
+    308, 308, 81, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308
+    81, 301, 301, 297, 297, 297, 297, 297, 297, 298, 297, 297, 297, 297, 297
+    297, 81, 297, 297, 292, 292, 295, 292, 293, 313, 313, 313, 313, 294, 294, 
+    81, 81, 81, 81, 81, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314
+    314, 315, 315, 316, 316, 316, 316, 315, 316, 316, 316, 316, 316, 317
+    315, 318, 318, 315, 315, 316, 316, 314, 319, 319, 319, 319, 319, 319
+    319, 319, 319, 319, 320, 320, 321, 321, 321, 321, 314, 314, 314, 314, 
+    314, 314, 315, 315, 316, 316, 314, 314, 314, 314, 316, 316, 316, 314
+    315, 315, 315, 314, 314, 315, 315, 315, 315, 315, 315, 315, 314, 314, 
+    314, 316, 316, 316, 316, 314, 314, 314, 314, 314, 316, 315, 315, 316
+    316, 315, 315, 315, 315, 315, 315, 322, 314, 315, 319, 319, 315, 315
+    315, 316, 323, 323, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324
+    324, 324, 324, 324, 81, 324, 81, 81, 81, 81, 81, 324, 81, 81, 325, 325, 
+    325, 325, 325, 325, 325, 325, 325, 325, 325, 326, 327, 325, 325, 325
+    328, 328, 328, 328, 328, 328, 328, 328, 329, 329, 329, 329, 329, 329
+    329, 329, 330, 330, 330, 330, 330, 330, 330, 330, 331, 331, 331, 331, 
+    331, 331, 331, 331, 331, 81, 331, 331, 331, 331, 81, 81, 331, 331, 331, 
+    331, 331, 331, 331, 81, 331, 331, 331, 81, 81, 332, 332, 332, 333, 334
+    333, 333, 333, 333, 333, 333, 333, 335, 335, 335, 335, 335, 335, 335, 
+    335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 81, 81
+    81, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 81, 81, 81, 81, 81
+    81, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337
+    81, 81, 338, 338, 338, 338, 338, 338, 81, 81, 339, 340, 340, 340, 340, 
+    340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340
+    340, 340, 341, 341, 340, 342, 343, 343, 343, 343, 343, 343, 343, 343, 
+    343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 344, 345, 81, 81, 81
+    346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 198, 198, 198
+    347, 347, 347, 346, 346, 346, 346, 346, 346, 346, 346, 81, 81, 81, 81
+    81, 81, 81, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348
+    348, 81, 348, 348, 348, 348, 349, 349, 350, 81, 81, 81, 351, 351, 351
+    351, 351, 351, 351, 351, 351, 351, 352, 352, 353, 198, 198, 81, 354, 354
+    354, 354, 354, 354, 354, 354, 354, 354, 355, 355, 81, 81, 81, 81, 356, 
+    356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 81, 356, 356
+    356, 81, 357, 357, 81, 81, 81, 81, 358, 358, 358, 358, 358, 358, 358
+    358, 358, 358, 358, 358, 359, 359, 360, 359, 359, 359, 359, 359, 359
+    359, 360, 360, 360, 360, 360, 360, 360, 360, 359, 360, 360, 359, 359, 
+    359, 359, 359, 359, 359, 359, 359, 361, 359, 362, 362, 363, 364, 362
+    365, 362, 366, 358, 367, 81, 81, 368, 368, 368, 368, 368, 368, 368, 368
+    368, 368, 81, 81, 81, 81, 81, 81, 369, 369, 369, 369, 369, 369, 369, 369
+    369, 369, 81, 81, 81, 81, 81, 81, 370, 370, 371, 371, 372, 373, 374, 370
+    375, 375, 370, 376, 376, 376, 377, 81, 378, 378, 378, 378, 378, 378, 378
+    378, 378, 378, 81, 81, 81, 81, 81, 81, 379, 379, 379, 379, 379, 379, 379, 
+    379, 379, 379, 379, 380, 379, 379, 379, 379, 379, 379, 379, 379, 379
+    376, 376, 379, 379, 381, 379, 81, 81, 81, 81, 81, 340, 340, 340, 340
+    340, 340, 81, 81, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382
+    382, 382, 382, 382, 81, 383, 383, 383, 384, 384, 384, 384, 383, 383, 384, 
+    384, 384, 81, 81, 81, 81, 384, 384, 383, 384, 384, 384, 384, 384, 384
+    385, 386, 387, 81, 81, 81, 81, 388, 81, 81, 81, 389, 389, 390, 390, 390
+    390, 390, 390, 390, 390, 390, 390, 391, 391, 391, 391, 391, 391, 391, 
+    391, 391, 391, 391, 391, 391, 391, 81, 81, 391, 391, 391, 391, 391, 81
+    81, 81, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 81
+    81, 81, 81, 392, 392, 81, 81, 81, 81, 81, 81, 393, 393, 393, 393, 393
+    393, 393, 393, 393, 393, 394, 81, 81, 81, 395, 395, 396, 396, 396, 396
+    396, 396, 396, 396, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397
+    397, 397, 397, 397, 397, 398, 399, 400, 400, 401, 81, 81, 402, 402, 403, 
+    403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 404, 405
+    404, 405, 405, 405, 405, 405, 405, 405, 81, 406, 404, 405, 404, 404, 405
+    405, 405, 405, 405, 405, 405, 405, 404, 404, 404, 404, 404, 404, 405
+    405, 407, 407, 407, 407, 407, 407, 407, 407, 81, 81, 408, 409, 409, 409
+    409, 409, 409, 409, 409, 409, 409, 81, 81, 81, 81, 81, 81, 410, 410, 410, 
+    410, 410, 410, 410, 411, 410, 410, 410, 410, 410, 410, 81, 81, 96, 96
+    96, 96, 96, 156, 156, 156, 156, 156, 156, 96, 96, 156, 412, 81, 413, 413
+    413, 413, 414, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415
+    415, 415, 415, 415, 416, 414, 413, 413, 413, 413, 413, 414, 413, 414
+    414, 414, 414, 414, 413, 414, 417, 415, 415, 415, 415, 415, 415, 415, 81
+    81, 81, 81, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 419, 419
+    420, 419, 419, 419, 419, 421, 421, 421, 421, 421, 421, 421, 421, 421
+    421, 422, 423, 422, 422, 422, 422, 422, 422, 422, 421, 421, 421, 421
+    421, 421, 421, 421, 421, 81, 81, 81, 424, 424, 425, 426, 426, 426, 426, 
+    426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 425, 424, 424, 424, 
+    424, 425, 425, 424, 424, 427, 428, 424, 424, 426, 426, 429, 429, 429
+    429, 429, 429, 429, 429, 429, 429, 426, 426, 426, 426, 426, 426, 430, 
+    430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 431
+    432, 433, 433, 432, 432, 432, 433, 432, 433, 433, 433, 434, 434, 81, 81
+    81, 81, 81, 81, 81, 81, 435, 435, 435, 435, 436, 436, 436, 436, 436, 436
+    436, 436, 436, 436, 436, 436, 437, 437, 437, 437, 437, 437, 437, 437
+    438, 438, 438, 438, 438, 438, 438, 438, 437, 437, 438, 439, 81, 81, 81, 
+    440, 440, 440, 440, 440, 441, 441, 441, 441, 441, 441, 441, 441, 441
+    441, 81, 81, 81, 436, 436, 436, 442, 442, 442, 442, 442, 442, 442, 442
+    442, 442, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443
+    443, 443, 444, 444, 444, 444, 444, 444, 445, 445, 93, 81, 81, 81, 81, 81
+    81, 81, 446, 446, 446, 446, 446, 446, 446, 446, 96, 96, 96, 326, 447, 
+    156, 156, 156, 156, 156, 96, 96, 156, 156, 156, 156, 96, 448, 447, 447
+    447, 447, 447, 447, 447, 449, 449, 449, 449, 156, 449, 449, 449, 449
+    448, 448, 96, 449, 449, 448, 96, 96, 81, 81, 81, 81, 81, 81, 56, 56, 56
+    56, 56, 56, 79, 79, 79, 79, 79, 93, 59, 59, 59, 59, 59, 59, 59, 59, 59
+    82, 82, 82, 82, 82, 59, 59, 59, 59, 82, 82, 82, 82, 82, 56, 56, 56, 56
+    56, 450, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 59, 59, 59, 59, 59, 59
+    59, 59, 59, 59, 59, 59, 82, 96, 96, 156, 96, 96, 96, 96, 96, 96, 96, 156
+    96, 96, 451, 452, 156, 453, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96
+    96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 454, 455, 455, 156, 81, 96, 456
+    156, 96, 156, 52, 56, 52, 56, 52, 56, 56, 56, 56, 56, 56, 56, 56, 56, 52
+    56, 79, 79, 79, 79, 79, 79, 79, 79, 78, 78, 78, 78, 78, 78, 78, 78, 79, 
+    79, 79, 79, 79, 79, 81, 81, 78, 78, 78, 78, 78, 78, 81, 81, 81, 78, 81
+    78, 81, 78, 81, 78, 457, 457, 457, 457, 457, 457, 457, 457, 79, 79, 79, 
+    79, 79, 81, 79, 79, 78, 78, 78, 78, 457, 80, 79, 80, 80, 80, 79, 79, 79
+    81, 79, 79, 78, 78, 78, 78, 457, 80, 80, 80, 79, 79, 79, 79, 81, 81, 79
+    79, 78, 78, 78, 78, 81, 80, 80, 80, 78, 78, 78, 78, 78, 80, 80, 80, 81
+    81, 79, 79, 79, 81, 79, 79, 78, 78, 78, 78, 457, 458, 80, 81, 459, 459
+    459, 459, 459, 459, 459, 460, 459, 459, 459, 461, 462, 463, 464, 465, 
+    466, 467, 468, 466, 469, 470, 38, 84, 471, 472, 473, 42, 471, 472, 473
+    42, 38, 38, 474, 84, 475, 475, 475, 476, 477, 478, 479, 480, 481, 482
+    483, 33, 484, 485, 484, 484, 485, 486, 487, 487, 84, 42, 50, 38, 488
+    488, 474, 489, 489, 84, 84, 84, 490, 473, 491, 488, 488, 488, 84, 84, 84
+    84, 84, 84, 84, 84, 492, 84, 489, 84, 373, 84, 373, 373, 373, 373, 84, 
+    373, 373, 459, 493, 494, 494, 494, 494, 81, 495, 496, 497, 498, 499, 499
+    499, 499, 499, 499, 500, 59, 81, 81, 47, 500, 500, 500, 500, 500, 501
+    501, 492, 473, 491, 502, 500, 47, 47, 47, 47, 500, 500, 500, 500, 500, 
+    501, 501, 492, 473, 491, 81, 59, 59, 59, 59, 59, 81, 81, 81, 278, 278
+    278, 278, 278, 278, 278, 503, 278, 504, 278, 278, 36, 278, 278, 278, 278, 
+    278, 278, 278, 278, 278, 503, 278, 278, 278, 278, 503, 278, 278, 503
+    278, 505, 505, 505, 505, 505, 505, 505, 505, 96, 96, 447, 447, 96, 96
+    96, 96, 447, 447, 447, 96, 96, 412, 412, 412, 412, 96, 412, 412, 412
+    447, 447, 96, 156, 96, 447, 447, 156, 156, 156, 156, 96, 81, 81, 81, 81, 
+    81, 81, 81, 40, 40, 506, 507, 40, 508, 40, 506, 40, 507, 49, 506, 506, 
+    506, 49, 49, 506, 506, 506, 509, 40, 506, 510, 40, 492, 506, 506, 506
+    506, 506, 40, 40, 40, 508, 508, 40, 506, 40, 85, 40, 506, 40, 52, 511
+    506, 506, 512, 49, 506, 506, 52, 506, 49, 449, 449, 449, 449, 49, 40, 40
+    49, 49, 506, 506, 492, 492, 492, 492, 492, 506, 49, 49, 49, 49, 40, 492, 
+    40, 40, 56, 313, 513, 513, 513, 514, 51, 515, 513, 513, 513, 513, 513
+    51, 514, 514, 51, 513, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516
+    516, 516, 517, 517, 517, 517, 516, 516, 517, 517, 517, 517, 517, 517
+    517, 517, 517, 52, 56, 517, 517, 517, 517, 51, 40, 40, 81, 81, 81, 81
+    54, 54, 54, 54, 54, 508, 508, 508, 508, 508, 492, 492, 40, 40, 40, 40
+    492, 40, 40, 492, 40, 40, 492, 40, 40, 40, 40, 40, 40, 40, 492, 40, 40
+    40, 40, 40, 40, 40, 40, 40, 44, 44, 40, 40, 40, 40, 40, 40, 40, 40, 40
+    40, 40, 40, 492, 492, 40, 40, 54, 40, 54, 40, 40, 40, 40, 40, 40, 40, 40
+    40, 40, 44, 40, 40, 40, 40, 492, 492, 492, 492, 492, 492, 492, 492, 492, 
+    492, 492, 492, 54, 492, 54, 54, 492, 492, 492, 54, 54, 492, 492, 54, 492
+    492, 492, 54, 492, 54, 518, 519, 492, 54, 492, 492, 492, 492, 54, 492
+    492, 54, 54, 54, 54, 492, 492, 54, 492, 54, 492, 54, 54, 54, 54, 54, 54
+    492, 54, 492, 492, 492, 492, 492, 54, 54, 54, 54, 492, 492, 492, 492, 54
+    54, 492, 492, 54, 492, 492, 492, 54, 492, 492, 492, 492, 492, 54, 492, 
+    492, 492, 492, 492, 54, 54, 492, 492, 54, 54, 54, 54, 492, 492, 54, 54
+    492, 492, 54, 54, 492, 492, 492, 492, 492, 54, 492, 492, 492, 54, 492
+    492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 54, 492, 492
+    492, 492, 492, 492, 492, 520, 473, 491, 473, 491, 40, 40, 40, 40, 40, 40
+    508, 40, 40, 40, 40, 40, 40, 40, 521, 521, 40, 40, 40, 40, 492, 492, 40
+    40, 40, 40, 40, 40, 40, 522, 523, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40
+    40, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 40
+    492, 40, 40, 40, 40, 40, 40, 40, 40, 313, 40, 40, 40, 40, 40, 492, 492
+    492, 492, 492, 492, 492, 492, 492, 40, 40, 40, 40, 40, 524, 524, 524
+    524, 40, 40, 40, 521, 525, 525, 521, 40, 40, 40, 40, 40, 40, 40, 40, 40
+    40, 40, 81, 40, 40, 40, 81, 81, 81, 81, 81, 51, 51, 51, 51, 51, 51, 51, 
+    51, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 526, 526, 526, 526
+    526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 515, 51, 51, 51, 51
+    51, 51, 51, 51, 51, 51, 51, 51, 514, 508, 508, 508, 508, 508, 508, 508
+    508, 508, 508, 508, 508, 40, 40, 40, 40, 508, 508, 508, 508, 527, 40, 40
+    40, 40, 40, 508, 508, 508, 508, 40, 40, 508, 508, 40, 508, 508, 508, 508, 
+    508, 508, 508, 40, 40, 40, 40, 40, 40, 40, 40, 508, 508, 40, 40, 508, 54
+    40, 40, 40, 40, 508, 508, 40, 40, 508, 54, 40, 40, 40, 40, 508, 508, 508, 
+    40, 40, 508, 40, 40, 508, 508, 40, 40, 40, 40, 40, 40, 40, 508, 492, 492
+    492, 492, 492, 528, 528, 492, 525, 525, 525, 525, 40, 508, 508, 40, 40
+    508, 40, 40, 40, 40, 508, 508, 40, 40, 40, 40, 521, 521, 527, 527, 525
+    40, 525, 525, 529, 530, 529, 525, 40, 525, 525, 525, 40, 40, 40, 40, 508
+    40, 508, 40, 40, 40, 40, 40, 524, 524, 524, 524, 524, 524, 524, 524, 524
+    524, 524, 524, 40, 40, 40, 40, 508, 508, 40, 508, 508, 508, 40, 508, 529
+    508, 508, 40, 508, 508, 40, 54, 40, 40, 40, 40, 40, 40, 40, 521, 40, 40
+    40, 524, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 508, 508, 40, 524, 40
+    40, 40, 40, 40, 40, 40, 40, 524, 524, 313, 40, 40, 40, 40, 40, 40, 40
+    40, 521, 521, 529, 525, 525, 525, 525, 521, 521, 529, 529, 529, 508, 508, 
+    508, 508, 529, 524, 529, 529, 529, 508, 529, 521, 508, 508, 508, 529
+    529, 508, 508, 529, 508, 508, 529, 529, 529, 40, 508, 40, 40, 40, 40
+    508, 508, 521, 508, 508, 508, 508, 508, 508, 529, 521, 521, 529, 521, 
+    508, 529, 529, 531, 521, 508, 508, 521, 529, 529, 525, 525, 525, 525
+    525, 524, 40, 40, 525, 525, 532, 532, 530, 530, 40, 40, 524, 40, 40, 40
+    40, 40, 40, 40, 40, 40, 40, 40, 40, 44, 40, 40, 40, 40, 40, 40, 524, 40
+    524, 40, 40, 40, 40, 524, 524, 524, 40, 533, 40, 40, 40, 534, 534, 534
+    534, 534, 534, 40, 535, 535, 525, 40, 40, 40, 473, 491, 473, 491, 473
+    491, 473, 491, 473, 491, 473, 491, 473, 491, 51, 51, 515, 515, 515, 515
+    515, 515, 515, 515, 515, 515, 515, 515, 40, 524, 524, 524, 40, 40, 40
+    40, 40, 40, 40, 524, 492, 492, 492, 492, 492, 473, 491, 492, 492, 492
+    492, 492, 492, 492, 16, 31, 16, 31, 16, 31, 16, 31, 473, 491, 536, 536
+    536, 536, 536, 536, 536, 536, 492, 492, 492, 473, 491, 16, 31, 473, 491
+    473, 491, 473, 491, 473, 491, 473, 491, 492, 492, 492, 492, 492, 492
+    492, 473, 491, 473, 491, 492, 492, 492, 492, 492, 492, 492, 492, 473
+    491, 492, 492, 40, 40, 40, 524, 524, 40, 40, 40, 492, 492, 492, 492, 492
+    40, 40, 492, 492, 492, 492, 492, 492, 40, 40, 40, 524, 40, 40, 40, 40
+    533, 508, 508, 40, 40, 40, 40, 81, 81, 40, 40, 40, 40, 40, 40, 40, 40
+    81, 81, 40, 40, 81, 81, 81, 40, 40, 40, 40, 81, 40, 40, 40, 40, 40, 40
+    81, 81, 81, 81, 40, 40, 40, 40, 537, 537, 537, 537, 537, 537, 537, 537
+    537, 537, 537, 537, 537, 537, 537, 81, 538, 538, 538, 538, 538, 538, 538
+    538, 538, 538, 538, 538, 538, 538, 538, 81, 52, 56, 52, 52, 52, 56, 56
+    52, 56, 52, 56, 52, 56, 52, 52, 52, 52, 56, 52, 56, 56, 52, 56, 56, 56
+    56, 56, 56, 59, 59, 52, 52, 87, 88, 87, 88, 88, 539, 539, 539, 539, 539
+    539, 87, 88, 87, 88, 540, 540, 540, 87, 88, 81, 81, 81, 81, 81, 541, 542, 
+    542, 542, 543, 541, 542, 544, 544, 544, 544, 544, 544, 544, 544, 544
+    544, 544, 544, 544, 544, 81, 544, 81, 81, 81, 81, 81, 544, 81, 81, 545
+    545, 545, 545, 545, 545, 545, 545, 81, 81, 81, 81, 81, 81, 81, 546, 547
+    81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 548, 95, 95, 95
+    95, 95, 95, 95, 95, 549, 549, 42, 50, 42, 50, 549, 549, 549, 42, 50, 549
+    42, 50, 373, 373, 373, 373, 373, 373, 373, 373, 84, 468, 550, 373, 551
+    84, 42, 50, 84, 84, 42, 50, 473, 491, 473, 491, 473, 491, 473, 491, 373
+    373, 373, 373, 371, 60, 373, 373, 84, 373, 373, 84, 84, 84, 84, 84, 552, 
+    552, 373, 373, 373, 84, 468, 373, 473, 373, 373, 373, 373, 373, 373, 373
+    81, 81, 81, 81, 81, 81, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553
+    81, 553, 553, 553, 553, 553, 553, 553, 553, 553, 81, 81, 81, 81, 553
+    553, 553, 553, 553, 553, 81, 81, 521, 521, 521, 521, 521, 521, 521, 521, 
+    521, 521, 521, 521, 81, 81, 81, 81, 554, 555, 555, 556, 521, 557, 558
+    559, 522, 523, 522, 523, 522, 523, 522, 523, 522, 523, 521, 521, 522
+    523, 522, 523, 522, 523, 522, 523, 560, 522, 523, 523, 521, 559, 559
+    559, 559, 559, 559, 559, 559, 559, 561, 562, 563, 564, 565, 565, 566
+    567, 567, 567, 567, 568, 521, 521, 559, 559, 559, 557, 569, 556, 521
+    525, 81, 570, 571, 570, 571, 570, 571, 570, 571, 570, 571, 571, 571, 571
+    571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 570
+    571, 571, 571, 571, 571, 571, 571, 570, 571, 570, 571, 570, 571, 571
+    571, 571, 571, 571, 570, 571, 571, 571, 571, 571, 571, 570, 570, 81, 81
+    572, 572, 573, 573, 574, 574, 571, 560, 575, 576, 575, 576, 575, 576
+    575, 576, 575, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 
+    576, 576, 576, 576, 576, 576, 575, 576, 576, 576, 576, 576, 576, 576
+    575, 576, 575, 576, 575, 576, 576, 576, 576, 576, 576, 575, 576, 576
+    576, 576, 576, 576, 575, 575, 576, 576, 576, 576, 577, 578, 579, 579
+    576, 81, 81, 81, 81, 81, 580, 580, 580, 580, 580, 580, 580, 580, 580
+    580, 580, 580, 580, 580, 580, 580, 580, 580, 81, 81, 581, 581, 581, 581
+    581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581
+    581, 581, 581, 581, 81, 582, 582, 583, 583, 583, 583, 582, 582, 582, 582
+    582, 582, 582, 582, 582, 582, 580, 580, 580, 81, 81, 81, 81, 81, 575
+    575, 575, 575, 575, 575, 575, 575, 584, 584, 584, 584, 584, 584, 584, 
+    584, 584, 584, 584, 584, 584, 585, 585, 81, 583, 583, 583, 583, 583, 583
+    583, 583, 583, 583, 582, 582, 582, 582, 582, 582, 586, 586, 586, 586
+    586, 586, 586, 586, 521, 587, 587, 587, 587, 587, 587, 587, 587, 587
+    587, 587, 587, 587, 587, 587, 584, 584, 584, 584, 585, 585, 585, 582
+    582, 587, 587, 587, 587, 587, 587, 587, 582, 582, 582, 582, 521, 521
+    521, 521, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588
+    588, 588, 588, 81, 582, 582, 582, 582, 582, 582, 582, 521, 521, 521, 521
+    582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 521, 521, 589
+    589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 
+    590, 590, 590, 590, 590, 590, 590, 590, 590, 589, 589, 589, 590, 590, 
+    590, 590, 590, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591
+    591, 591, 592, 591, 591, 591, 591, 591, 591, 591, 81, 81, 81, 593, 593
+    593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 81, 594, 
+    594, 594, 594, 594, 594, 594, 594, 595, 595, 595, 595, 595, 595, 596
+    596, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 598
+    599, 600, 599, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 597, 
+    597, 81, 81, 81, 81, 90, 93, 90, 93, 90, 93, 602, 95, 97, 97, 97, 603
+    95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 603, 604, 90, 93, 90, 93, 450
+    450, 95, 95, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605
+    605, 605, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 607, 607
+    608, 609, 609, 609, 609, 609, 62, 62, 62, 62, 62, 62, 62, 60, 60, 60, 60
+    60, 60, 60, 60, 60, 62, 62, 52, 56, 52, 56, 52, 56, 56, 56, 52, 56, 52
+    56, 52, 56, 59, 56, 56, 56, 56, 56, 56, 56, 56, 52, 56, 52, 56, 52, 52
+    56, 60, 610, 610, 52, 56, 52, 56, 57, 52, 56, 52, 56, 56, 56, 52, 56, 52, 
+    56, 52, 52, 52, 52, 52, 81, 52, 52, 52, 52, 52, 56, 52, 56, 81, 81, 81
+    81, 81, 81, 81, 57, 59, 59, 56, 57, 57, 57, 57, 57, 611, 611, 612, 611
+    611, 611, 613, 611, 611, 611, 611, 612, 611, 611, 611, 611, 611, 611
+    611, 611, 611, 611, 611, 611, 611, 611, 611, 614, 614, 612, 612, 614
+    615, 615, 615, 615, 81, 81, 81, 81, 616, 616, 616, 616, 616, 616, 313
+    313, 503, 512, 81, 81, 81, 81, 81, 81, 617, 617, 617, 617, 617, 617, 617, 
+    617, 617, 617, 617, 617, 618, 618, 619, 619, 620, 620, 621, 621, 621
+    621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 
+    621, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620
+    620, 620, 620, 622, 623, 81, 81, 81, 81, 81, 81, 81, 81, 624, 624, 625
+    625, 625, 625, 625, 625, 625, 625, 625, 625, 81, 81, 81, 81, 81, 81, 197
+    197, 197, 197, 197, 197, 197, 197, 197, 197, 194, 194, 194, 194, 194
+    194, 200, 200, 200, 194, 626, 194, 81, 81, 627, 627, 627, 627, 627, 627
+    627, 627, 627, 627, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628
+    628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 629, 629, 629, 629
+    629, 630, 630, 630, 198, 631, 632, 632, 632, 632, 632, 632, 632, 632
+    632, 632, 632, 632, 632, 632, 632, 633, 633, 633, 633, 633, 633, 633, 
+    633, 633, 633, 633, 634, 635, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81
+    636, 328, 328, 328, 328, 328, 81, 81, 81, 637, 637, 637, 638, 639, 639
+    639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 640
+    638, 638, 637, 637, 637, 637, 638, 638, 637, 638, 638, 638, 641, 642
+    642, 642, 642, 642, 642, 643, 643, 643, 642, 642, 642, 642, 81, 61, 644
+    644, 644, 644, 644, 644, 644, 644, 644, 644, 81, 81, 81, 81, 642, 642, 
+    314, 314, 314, 314, 314, 316, 645, 314, 319, 319, 314, 314, 314, 314
+    314, 81, 646, 646, 646, 646, 646, 646, 646, 646, 646, 647, 647, 647, 647
+    647, 647, 648, 648, 647, 647, 648, 648, 647, 647, 81, 646, 646, 646, 647
+    646, 646, 646, 646, 646, 646, 646, 646, 647, 648, 81, 81, 649, 649, 649
+    649, 649, 649, 649, 649, 649, 649, 81, 81, 650, 651, 651, 651, 645, 314
+    314, 314, 314, 314, 314, 323, 323, 323, 314, 315, 316, 315, 314, 314
+    652, 652, 652, 652, 652, 652, 652, 652, 653, 652, 653, 653, 654, 652
+    652, 653, 653, 652, 652, 652, 652, 652, 653, 653, 652, 653, 652, 81, 81
+    81, 81, 81, 81, 81, 81, 652, 652, 655, 656, 656, 657, 657, 657, 657, 657
+    657, 657, 657, 657, 657, 657, 658, 659, 659, 658, 658, 660, 660, 657
+    661, 661, 658, 662, 81, 81, 331, 331, 331, 331, 331, 331, 81, 56, 56, 56, 
+    610, 59, 59, 59, 59, 56, 56, 56, 56, 56, 79, 81, 81, 338, 338, 338, 338
+    338, 338, 338, 338, 657, 657, 657, 658, 658, 659, 658, 658, 659, 658
+    658, 660, 658, 662, 81, 81, 663, 663, 663, 663, 663, 663, 663, 663, 663, 
+    663, 81, 81, 81, 81, 81, 81, 664, 665, 665, 665, 665, 665, 665, 665, 665
+    665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 664, 665, 665
+    665, 665, 665, 665, 665, 81, 81, 81, 81, 329, 329, 329, 329, 329, 329
+    329, 81, 81, 81, 81, 330, 330, 330, 330, 330, 330, 330, 330, 330, 81, 81
+    81, 81, 666, 666, 666, 666, 666, 666, 666, 666, 667, 667, 667, 667, 667
+    667, 667, 667, 589, 589, 590, 590, 590, 590, 590, 590, 56, 56, 56, 56
+    56, 56, 56, 81, 81, 81, 81, 101, 101, 101, 101, 101, 81, 81, 81, 81, 81
+    129, 668, 129, 129, 669, 129, 129, 129, 129, 129, 129, 129, 129, 129
+    129, 129, 129, 129, 81, 129, 129, 129, 129, 129, 81, 129, 81, 129, 129
+    81, 129, 129, 81, 129, 129, 146, 146, 670, 670, 670, 670, 670, 670, 670
+    670, 670, 670, 670, 670, 670, 670, 670, 670, 81, 81, 81, 81, 81, 81, 81
+    81, 81, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 491, 473
+    81, 81, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 135, 138, 81, 
+    81, 671, 671, 671, 671, 671, 671, 671, 671, 672, 555, 555, 672, 672, 673
+    673, 522, 523, 674, 81, 81, 81, 81, 81, 81, 96, 96, 96, 96, 96, 96, 96
+    156, 156, 156, 156, 156, 156, 156, 95, 95, 556, 566, 566, 675, 675, 522
+    523, 522, 523, 522, 523, 522, 523, 522, 523, 522, 523, 522, 523, 522
+    523, 556, 556, 522, 523, 556, 556, 556, 556, 675, 675, 675, 676, 556
+    676, 81, 577, 677, 673, 673, 566, 522, 523, 522, 523, 522, 523, 678, 556
+    556, 679, 680, 681, 681, 681, 81, 556, 682, 683, 556, 81, 81, 81, 81
+    146, 146, 146, 146, 146, 81, 81, 493, 81, 684, 685, 686, 687, 688, 685
+    685, 689, 690, 685, 691, 692, 693, 692, 694, 695, 695, 695, 695, 695
+    695, 695, 695, 695, 695, 696, 697, 698, 698, 698, 684, 685, 699, 699
+    699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699
+    699, 699, 689, 685, 690, 700, 701, 700, 702, 702, 702, 702, 702, 702
+    702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 689, 698
+    690, 698, 689, 690, 703, 704, 705, 703, 706, 707, 708, 708, 708, 708
+    708, 708, 708, 708, 708, 709, 707, 707, 707, 707, 707, 707, 707, 707
+    707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 710
+    710, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711
+    711, 711, 81, 81, 81, 711, 711, 711, 711, 711, 711, 81, 81, 711, 711
+    711, 81, 81, 81, 712, 687, 698, 700, 713, 687, 687, 81, 714, 715, 715
+    715, 715, 714, 714, 81, 81, 716, 716, 716, 717, 508, 81, 81, 718, 718
+    718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 81, 718, 718, 718, 718
+    718, 718, 718, 718, 718, 718, 81, 718, 718, 718, 81, 718, 718, 81, 718, 
+    718, 718, 718, 718, 718, 718, 81, 81, 718, 718, 718, 81, 81, 81, 81, 81
+    198, 373, 198, 81, 81, 81, 81, 616, 616, 616, 616, 616, 616, 616, 616
+    616, 616, 616, 616, 616, 81, 81, 81, 313, 719, 719, 719, 719, 719, 719
+    719, 719, 719, 719, 719, 719, 719, 720, 720, 720, 720, 721, 721, 721
+    721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721
+    720, 720, 721, 722, 722, 81, 40, 40, 40, 40, 81, 81, 81, 81, 721, 81, 81
+    81, 81, 81, 81, 81, 313, 313, 313, 313, 313, 156, 81, 81, 723, 723, 723
+    723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 81, 81, 81, 724, 724
+    724, 724, 724, 724, 724, 724, 724, 81, 81, 81, 81, 81, 81, 81, 156, 500, 
+    500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500
+    500, 500, 500, 500, 81, 81, 81, 81, 725, 725, 725, 725, 725, 725, 725
+    725, 726, 726, 726, 726, 81, 81, 81, 81, 81, 81, 81, 81, 81, 725, 725
+    725, 727, 727, 727, 727, 727, 727, 727, 727, 727, 728, 727, 727, 727
+    727, 727, 727, 727, 727, 728, 81, 81, 81, 81, 81, 729, 729, 729, 729
+    729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 730, 730, 730, 730
+    730, 81, 81, 81, 81, 81, 731, 731, 731, 731, 731, 731, 731, 731, 731
+    731, 731, 731, 731, 731, 81, 732, 733, 733, 733, 733, 733, 733, 733, 733
+    733, 733, 733, 733, 81, 81, 81, 81, 734, 735, 735, 735, 735, 735, 81, 81
+    736, 736, 736, 736, 736, 736, 736, 736, 737, 737, 737, 737, 737, 737
+    737, 737, 738, 738, 738, 738, 738, 738, 738, 738, 739, 739, 739, 739
+    739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 81, 81, 740, 740, 740
+    740, 740, 740, 740, 740, 740, 740, 81, 81, 81, 81, 81, 81, 741, 741, 741
+    741, 741, 741, 741, 741, 741, 741, 741, 741, 81, 81, 81, 81, 742, 742
+    742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 81, 81, 81, 81, 743, 
+    743, 743, 743, 743, 743, 743, 743, 744, 744, 744, 744, 744, 744, 744
+    744, 744, 744, 744, 744, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 745
+    746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746
+    746, 81, 746, 746, 746, 746, 746, 746, 81, 81, 747, 747, 747, 747, 747
+    747, 81, 81, 747, 81, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747
+    747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 81, 747, 747, 81, 81
+    81, 747, 81, 81, 747, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748
+    748, 748, 748, 748, 81, 749, 750, 750, 750, 750, 750, 750, 750, 750, 751
+    751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751
+    752, 752, 753, 753, 753, 753, 753, 753, 753, 754, 754, 754, 754, 754
+    754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 81, 81, 81, 81, 81, 81
+    81, 81, 755, 755, 755, 755, 755, 755, 755, 755, 755, 756, 756, 756, 756
+    756, 756, 756, 756, 756, 756, 756, 81, 756, 756, 81, 81, 81, 81, 81, 757
+    757, 757, 757, 757, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758
+    758, 758, 758, 758, 759, 759, 759, 759, 759, 759, 81, 81, 81, 760, 761
+    761, 761, 761, 761, 761, 761, 761, 761, 761, 81, 81, 81, 81, 81, 762
+    763, 763, 763, 763, 763, 763, 763, 763, 764, 764, 764, 764, 764, 764
+    764, 764, 81, 81, 81, 81, 765, 765, 764, 764, 765, 765, 765, 765, 765
+    765, 765, 765, 81, 81, 765, 765, 765, 765, 765, 765, 766, 767, 767, 767
+    81, 767, 767, 81, 81, 81, 81, 81, 767, 768, 767, 769, 766, 766, 766, 766
+    81, 766, 766, 766, 81, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766
+    766, 766, 766, 766, 766, 766, 766, 766, 766, 81, 81, 81, 81, 769, 770
+    768, 81, 81, 81, 81, 771, 772, 772, 772, 772, 772, 772, 772, 772, 773
+    773, 773, 773, 773, 773, 773, 773, 774, 81, 81, 81, 81, 81, 81, 81, 775, 
+    775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 776, 776
+    777, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, 778
+    779, 779, 779, 780, 780, 780, 780, 780, 780, 780, 780, 781, 780, 780
+    780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 782, 783, 81, 81, 81
+    81, 784, 784, 784, 784, 784, 785, 785, 785, 785, 785, 785, 786, 81, 787
+    787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 81, 81
+    81, 788, 788, 788, 788, 788, 788, 788, 789, 789, 789, 789, 789, 789, 789
+    789, 789, 789, 789, 789, 789, 789, 81, 81, 790, 790, 790, 790, 790, 790
+    790, 790, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 81, 81
+    81, 81, 81, 792, 792, 792, 792, 792, 792, 792, 792, 793, 793, 793, 793
+    793, 793, 793, 793, 793, 793, 81, 81, 81, 81, 81, 81, 81, 794, 794, 794
+    794, 81, 81, 81, 81, 795, 795, 795, 795, 795, 795, 795, 796, 796, 796
+    796, 796, 796, 796, 796, 796, 81, 81, 81, 81, 81, 81, 81, 797, 797, 797
+    797, 797, 797, 797, 797, 797, 797, 797, 81, 81, 81, 81, 81, 798, 798
+    798, 798, 798, 798, 798, 798, 798, 798, 798, 81, 81, 81, 81, 81, 81, 81
+    799, 799, 799, 799, 799, 799, 800, 800, 800, 800, 800, 800, 800, 800, 
+    800, 800, 800, 800, 800, 800, 800, 81, 801, 802, 801, 803, 803, 803, 803
+    803, 803, 803, 803, 803, 803, 803, 803, 803, 802, 802, 802, 802, 802
+    802, 802, 802, 802, 802, 802, 802, 802, 802, 804, 805, 805, 806, 806
+    806, 806, 806, 81, 81, 81, 81, 807, 807, 807, 807, 807, 807, 807, 807, 
+    807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 808, 808
+    808, 808, 808, 808, 808, 808, 808, 808, 81, 81, 81, 81, 81, 81, 81, 804, 
+    809, 809, 810, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811
+    811, 811, 810, 810, 810, 809, 809, 809, 809, 810, 810, 812, 813, 814
+    814, 815, 816, 816, 816, 816, 81, 81, 81, 81, 81, 81, 817, 817, 817, 817
+    817, 817, 817, 817, 817, 81, 81, 81, 81, 81, 81, 81, 818, 818, 818, 818
+    818, 818, 818, 818, 818, 818, 81, 81, 81, 81, 81, 81, 819, 819, 819, 820, 
+    820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820
+    820, 820, 820, 820, 820, 821, 821, 821, 821, 821, 822, 821, 821, 821
+    821, 821, 821, 823, 823, 81, 824, 824, 824, 824, 824, 824, 824, 824, 824, 
+    824, 825, 825, 825, 825, 81, 81, 81, 81, 826, 826, 826, 826, 826, 826
+    826, 826, 826, 826, 826, 827, 828, 829, 826, 81, 830, 830, 831, 832, 832
+    832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832
+    831, 831, 831, 830, 830, 830, 830, 830, 830, 830, 830, 830, 831, 833
+    832, 832, 832, 832, 834, 834, 835, 834, 835, 836, 830, 830, 835, 81, 81
+    837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 832, 838, 832, 834
+    834, 834, 81, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839
+    839, 839, 839, 839, 839, 839, 839, 839, 81, 81, 81, 840, 840, 840, 840
+    840, 840, 840, 840, 840, 840, 81, 840, 840, 840, 840, 840, 840, 840, 840
+    840, 841, 841, 841, 842, 842, 842, 841, 841, 842, 843, 844, 842, 845
+    845, 846, 845, 845, 846, 842, 81, 847, 847, 847, 847, 847, 847, 847, 81
+    847, 81, 847, 847, 847, 847, 81, 847, 847, 847, 847, 847, 847, 847, 847
+    847, 847, 847, 847, 847, 847, 847, 81, 847, 847, 848, 81, 81, 81, 81, 81
+    81, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849
+    849, 850, 851, 851, 851, 850, 850, 850, 850, 850, 850, 852, 853, 81, 81
+    81, 81, 81, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 81, 81, 81
+    81, 81, 81, 855, 855, 856, 856, 81, 857, 857, 857, 857, 857, 857, 857
+    857, 81, 81, 857, 857, 81, 81, 857, 857, 857, 857, 857, 857, 857, 857
+    857, 857, 857, 857, 857, 857, 81, 857, 857, 857, 857, 857, 857, 857, 81
+    857, 857, 81, 857, 857, 857, 857, 857, 81, 81, 858, 857, 856, 856, 855
+    856, 856, 856, 856, 81, 81, 856, 856, 81, 81, 856, 856, 859, 81, 81, 857
+    81, 81, 81, 81, 81, 81, 856, 81, 81, 81, 81, 81, 857, 857, 857, 857, 857
+    856, 856, 81, 81, 860, 860, 860, 860, 860, 860, 860, 81, 81, 81, 861
+    861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 862, 862
+    862, 863, 863, 863, 863, 863, 863, 863, 863, 862, 862, 864, 863, 863
+    862, 865, 861, 861, 861, 861, 866, 866, 866, 866, 867, 868, 868, 868, 
+    868, 868, 868, 868, 868, 868, 868, 81, 866, 81, 867, 81, 81, 869, 869
+    869, 869, 869, 869, 869, 869, 870, 870, 870, 871, 871, 871, 871, 871
+    871, 870, 871, 870, 870, 870, 870, 871, 871, 870, 872, 873, 869, 869
+    874, 869, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 81, 81, 81
+    81, 81, 81, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 
+    876, 876, 876, 877, 877, 877, 878, 878, 878, 878, 81, 81, 877, 877, 877
+    877, 878, 878, 877, 879, 880, 881, 882, 882, 883, 883, 884, 884, 884
+    882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882
+    882, 876, 876, 876, 876, 878, 878, 81, 81, 885, 885, 885, 885, 885, 885
+    885, 885, 886, 886, 886, 887, 887, 887, 887, 887, 887, 887, 887, 886
+    886, 887, 886, 888, 887, 889, 889, 890, 885, 81, 81, 81, 891, 891, 891
+    891, 891, 891, 891, 891, 891, 891, 81, 81, 81, 81, 81, 81, 892, 892, 892, 
+    892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 81, 81, 81, 893, 893
+    893, 893, 893, 893, 893, 893, 893, 893, 893, 894, 895, 894, 895, 895
+    894, 894, 894, 894, 894, 894, 896, 897, 898, 898, 898, 898, 898, 898
+    898, 898, 898, 898, 81, 81, 81, 81, 81, 81, 899, 899, 899, 899, 899, 899
+    899, 899, 899, 899, 81, 81, 81, 900, 900, 900, 901, 901, 900, 900, 900
+    900, 901, 900, 900, 900, 900, 902, 81, 81, 81, 81, 903, 903, 903, 903
+    903, 903, 903, 903, 903, 903, 904, 904, 905, 905, 905, 906, 907, 907
+    907, 907, 907, 907, 907, 907, 908, 908, 908, 908, 908, 908, 908, 908
+    909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 910, 910, 910, 910
+    910, 910, 910, 910, 910, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81
+    911, 912, 913, 913, 913, 913, 913, 913, 914, 914, 913, 913, 912, 912
+    912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912
+    913, 915, 913, 913, 913, 913, 914, 912, 913, 913, 913, 913, 916, 917
+    918, 918, 918, 918, 916, 917, 915, 919, 920, 920, 920, 920, 920, 920
+    921, 921, 920, 920, 920, 919, 919, 919, 919, 919, 919, 919, 919, 919
+    919, 919, 919, 919, 919, 919, 919, 81, 81, 919, 919, 919, 919, 920, 920
+    920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 921, 920, 922
+    923, 923, 923, 81, 924, 924, 924, 923, 923, 81, 81, 81, 81, 81, 925, 925
+    925, 925, 925, 925, 925, 925, 925, 81, 81, 81, 81, 81, 81, 81, 926, 926
+    926, 926, 926, 926, 926, 926, 926, 81, 926, 926, 926, 926, 926, 926, 926
+    926, 926, 926, 926, 926, 926, 927, 928, 928, 928, 928, 928, 928, 928, 81
+    928, 928, 928, 928, 928, 928, 927, 929, 926, 930, 930, 930, 930, 930, 81
+    81, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 932, 932, 932, 932
+    932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932
+    932, 81, 81, 81, 933, 934, 935, 935, 935, 935, 935, 935, 935, 935, 935, 
+    935, 935, 935, 935, 935, 81, 81, 936, 936, 936, 936, 936, 936, 936, 936
+    936, 936, 936, 936, 936, 936, 81, 937, 936, 936, 936, 936, 936, 936, 936
+    937, 936, 936, 937, 936, 936, 81, 938, 938, 938, 938, 938, 938, 938, 81
+    938, 938, 81, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938
+    938, 938, 939, 939, 939, 939, 939, 939, 81, 81, 81, 939, 81, 939, 939
+    81, 939, 939, 939, 940, 939, 941, 941, 938, 939, 942, 942, 942, 942, 942
+    942, 942, 942, 942, 942, 81, 81, 81, 81, 81, 81, 943, 943, 943, 943, 943
+    943, 943, 943, 943, 943, 81, 81, 81, 81, 81, 81, 944, 944, 944, 944, 944
+    944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 81, 945, 945, 945, 945
+    945, 81, 81, 81, 943, 943, 943, 943, 81, 81, 81, 81, 946, 946, 946, 946
+    946, 946, 946, 946, 947, 947, 947, 948, 948, 948, 946, 946, 946, 946
+    948, 946, 946, 946, 947, 948, 947, 948, 946, 946, 946, 946, 946, 946
+    946, 947, 948, 948, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946
+    946, 81, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949
+    949, 950, 951, 949, 949, 949, 949, 949, 949, 949, 81, 605, 81, 81, 81
+    81, 81, 81, 81, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952
+    952, 952, 952, 952, 81, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953
+    81, 81, 81, 81, 954, 954, 955, 955, 955, 955, 955, 955, 955, 955, 955, 
+    955, 955, 955, 955, 955, 81, 81, 956, 956, 956, 956, 956, 957, 81, 81
+    958, 958, 958, 958, 958, 958, 958, 958, 959, 959, 959, 959, 959, 959
+    959, 960, 960, 960, 961, 961, 962, 962, 962, 962, 963, 963, 963, 963
+    960, 962, 81, 81, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 81
+    965, 965, 965, 965, 965, 965, 965, 81, 958, 958, 958, 958, 958, 81, 81
+    81, 81, 81, 958, 958, 958, 966, 966, 966, 966, 966, 966, 966, 966, 966
+    966, 966, 966, 966, 81, 81, 81, 966, 967, 967, 967, 967, 967, 967, 967
+    967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967
+    967, 81, 81, 81, 81, 81, 81, 81, 81, 968, 968, 968, 968, 969, 969, 969
+    969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 970, 971, 81, 81, 81
+    81, 81, 81, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972
+    972, 81, 81, 81, 972, 972, 972, 81, 81, 81, 81, 81, 576, 571, 571, 571
+    571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 81, 973, 973, 973
+    973, 973, 973, 973, 973, 973, 973, 973, 973, 81, 81, 81, 81, 974, 974
+    974, 974, 974, 974, 974, 974, 974, 974, 974, 81, 81, 81, 81, 81, 974
+    974, 974, 974, 974, 81, 81, 81, 974, 81, 81, 81, 81, 81, 81, 81, 974
+    974, 81, 81, 975, 976, 977, 978, 499, 499, 499, 499, 81, 81, 81, 81, 313
+    313, 313, 313, 313, 313, 81, 81, 313, 313, 313, 313, 313, 313, 313, 81
+    81, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 979, 979
+    447, 447, 447, 313, 313, 313, 980, 979, 979, 979, 979, 979, 499, 499
+    499, 499, 499, 499, 499, 499, 156, 156, 156, 156, 156, 156, 156, 156
+    313, 313, 96, 96, 96, 96, 96, 156, 156, 313, 313, 313, 313, 313, 313, 96
+    96, 96, 96, 313, 313, 313, 81, 81, 81, 81, 81, 81, 81, 721, 721, 981
+    981, 981, 721, 81, 81, 616, 616, 81, 81, 81, 81, 81, 81, 506, 506, 506
+    506, 506, 506, 506, 506, 506, 506, 49, 49, 49, 49, 49, 49, 49, 49, 49
+    49, 49, 49, 49, 49, 49, 49, 49, 49, 506, 506, 506, 506, 506, 506, 506
+    506, 506, 506, 49, 49, 49, 49, 49, 49, 49, 81, 49, 49, 49, 49, 49, 49
+    506, 81, 506, 506, 81, 81, 506, 81, 81, 506, 506, 81, 81, 506, 506, 506
+    506, 81, 506, 506, 49, 49, 81, 49, 81, 49, 49, 49, 49, 49, 49, 49, 81
+    49, 49, 49, 49, 49, 49, 49, 506, 506, 81, 506, 506, 506, 506, 81, 81
+    506, 506, 506, 506, 506, 506, 506, 506, 81, 506, 506, 506, 506, 506, 506
+    506, 81, 49, 49, 506, 506, 81, 506, 506, 506, 506, 81, 506, 506, 506
+    506, 506, 81, 506, 81, 81, 81, 506, 506, 506, 506, 506, 506, 506, 81, 49
+    49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 81, 81, 506, 982, 49, 49, 49
+    49, 49, 49, 49, 49, 49, 492, 49, 49, 49, 49, 49, 49, 506, 506, 506, 506
+    506, 506, 506, 506, 506, 982, 49, 49, 49, 49, 49, 49, 49, 49, 49, 492
+    49, 49, 506, 506, 506, 506, 506, 982, 49, 49, 49, 49, 49, 49, 49, 49, 49
+    492, 49, 49, 49, 49, 49, 49, 506, 506, 506, 506, 506, 506, 506, 506, 506
+    982, 49, 492, 49, 49, 49, 49, 49, 49, 49, 49, 506, 49, 81, 81, 983, 983
+    983, 983, 983, 983, 983, 983, 983, 983, 984, 984, 984, 984, 984, 984
+    984, 984, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985
+    985, 985, 985, 984, 984, 984, 984, 985, 985, 985, 985, 985, 985, 985
+    985, 985, 985, 984, 984, 984, 984, 984, 984, 984, 984, 985, 984, 984
+    984, 984, 984, 984, 985, 984, 984, 986, 986, 986, 986, 987, 81, 81, 81
+    81, 81, 81, 81, 985, 985, 985, 985, 985, 81, 985, 985, 985, 985, 985
+    985, 985, 988, 988, 988, 988, 988, 988, 988, 81, 988, 988, 988, 988, 988
+    988, 988, 988, 988, 81, 81, 988, 988, 988, 988, 988, 988, 988, 81, 988
+    988, 81, 988, 988, 988, 988, 988, 81, 81, 81, 81, 81, 989, 989, 989, 989
+    989, 989, 989, 989, 989, 989, 989, 989, 989, 81, 81, 990, 990, 990, 990
+    990, 990, 990, 990, 990, 991, 991, 991, 991, 991, 991, 991, 81, 992, 992
+    992, 992, 992, 992, 992, 992, 992, 992, 993, 993, 993, 993, 993, 993
+    993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 994, 994
+    994, 994, 994, 994, 995, 81, 81, 81, 81, 81, 996, 996, 996, 996, 996
+    996, 996, 996, 996, 996, 81, 81, 81, 81, 997, 997, 146, 146, 146, 146
+    81, 146, 146, 146, 81, 146, 146, 81, 146, 81, 81, 146, 81, 146, 146, 146
+    146, 146, 146, 146, 146, 146, 146, 81, 146, 146, 146, 146, 81, 146, 81
+    146, 81, 81, 81, 81, 81, 81, 146, 81, 81, 81, 81, 146, 81, 146, 81, 146
+    81, 146, 146, 146, 81, 146, 81, 146, 81, 146, 81, 146, 81, 146, 146, 146
+    146, 81, 146, 81, 146, 146, 81, 146, 146, 146, 146, 146, 146, 146, 146
+    146, 81, 81, 81, 81, 81, 146, 146, 146, 81, 146, 146, 146, 132, 132, 81
+    81, 81, 81, 81, 81, 525, 525, 525, 525, 521, 525, 525, 525, 525, 525
+    525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 998, 998, 998, 998
+    998, 998, 998, 998, 998, 998, 998, 998, 525, 525, 525, 525, 525, 525
+    525, 998, 998, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525
+    525, 525, 525, 521, 525, 525, 525, 525, 525, 525, 998, 998, 47, 47, 47, 
+    515, 515, 998, 998, 998, 526, 526, 526, 526, 526, 526, 313, 998, 526
+    526, 40, 40, 998, 998, 998, 998, 526, 526, 526, 526, 526, 526, 999, 526
+    526, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 526, 526, 526
+    526, 526, 526, 526, 526, 526, 526, 998, 998, 998, 998, 998, 998, 998, 
+    998, 998, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000
+    1001, 582, 582, 998, 998, 998, 998, 998, 582, 582, 582, 582, 998, 998
+    998, 998, 582, 998, 998, 998, 998, 998, 998, 998, 582, 582, 998, 998
+    998, 998, 998, 998, 521, 521, 521, 521, 521, 521, 998, 998, 521, 525
+    525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 521, 521, 521
+    521, 521, 521, 521, 521, 521, 525, 521, 521, 521, 521, 521, 521, 525
+    521, 521, 521, 521, 521, 521, 521, 532, 521, 521, 521, 521, 521, 521
+    525, 525, 525, 525, 525, 525, 525, 525, 40, 40, 525, 525, 521, 521, 521
+    521, 521, 524, 524, 521, 521, 521, 521, 521, 524, 521, 521, 521, 521
+    521, 532, 532, 532, 521, 521, 532, 521, 521, 532, 530, 530, 525, 525
+    521, 521, 525, 525, 525, 521, 525, 525, 525, 521, 521, 521, 1002, 1002
+    1002, 1002, 1002, 521, 521, 521, 521, 521, 521, 521, 525, 521, 525, 532
+    532, 521, 521, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532
+    521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 532
+    532, 532, 532, 521, 521, 521, 521, 532, 521, 532, 521, 521, 521, 532
+    521, 521, 521, 521, 532, 532, 532, 521, 532, 532, 532, 524, 521, 524
+    521, 524, 521, 521, 521, 521, 521, 532, 521, 521, 521, 521, 524, 521
+    524, 524, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 525, 525
+    521, 524, 524, 524, 524, 524, 524, 524, 521, 521, 521, 521, 521, 521
+    521, 521, 524, 524, 524, 524, 524, 524, 521, 521, 521, 521, 521, 524
+    524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 40, 40, 40, 40
+    525, 521, 521, 521, 521, 525, 525, 525, 525, 525, 530, 530, 525, 525
+    525, 525, 532, 525, 525, 525, 525, 525, 530, 525, 525, 525, 525, 532
+    532, 525, 525, 525, 525, 525, 40, 40, 40, 40, 40, 40, 40, 40, 525, 525
+    525, 525, 40, 40, 525, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521
+    532, 532, 532, 521, 521, 521, 532, 532, 532, 532, 532, 40, 40, 40, 40
+    40, 40, 534, 534, 534, 1003, 1003, 1003, 40, 40, 40, 40, 521, 521, 521
+    532, 521, 521, 521, 521, 521, 521, 521, 521, 532, 532, 532, 521, 532
+    521, 521, 521, 521, 521, 525, 525, 525, 525, 525, 525, 532, 525, 525
+    525, 521, 521, 521, 525, 525, 998, 998, 998, 525, 525, 525, 521, 521
+    998, 998, 998, 525, 525, 525, 525, 521, 521, 521, 521, 521, 998, 998
+    998, 998, 998, 998, 998, 40, 40, 40, 40, 998, 998, 998, 998, 40, 40, 40
+    40, 40, 998, 998, 998, 40, 40, 998, 998, 998, 998, 998, 998, 40, 40, 40
+    40, 40, 40, 998, 998, 532, 532, 532, 532, 532, 521, 532, 532, 521, 521
+    521, 521, 521, 521, 532, 521, 532, 532, 521, 521, 521, 532, 532, 998
+    521, 521, 521, 521, 521, 998, 998, 998, 521, 521, 521, 521, 998, 998
+    998, 998, 521, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532
+    532, 532, 521, 521, 521, 521, 521, 521, 521, 521, 521, 998, 998, 998
+    998, 998, 998, 998, 81, 81, 589, 589, 589, 589, 589, 589, 589, 590, 589
+    589, 589, 589, 589, 590, 590, 590, 589, 590, 590, 590, 590, 590, 590
+    590, 590, 590, 590, 590, 590, 590, 81, 81, 81, 499, 81, 81, 81, 81, 81
+    81, 499, 499, 499, 499, 499, 499, 499, 499, 667, 667, 667, 667, 667, 667
+    81, 81
 };
 
 /* decomposition data */
 };
 
 /* decomposition data */
index a4d118b..82bb9a4 100644 (file)
@@ -108,7 +108,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
     /* XXX This hack belongs to the Myanmar shaper. */
     if (unlikely (unicode == 0x1037u)) unicode = 0x103Au;
 
     /* XXX This hack belongs to the Myanmar shaper. */
     if (unlikely (unicode == 0x1037u)) unicode = 0x103Au;
 
-    /* XXX This hack belongs to the SEA shaper (for Tai Tham):
+    /* XXX This hack belongs to the USE shaper (for Tai Tham):
      * Reorder SAKOT to ensure it comes after any tone marks. */
     if (unlikely (unicode == 0x1A60u)) return 254;
 
      * Reorder SAKOT to ensure it comes after any tone marks. */
     if (unlikely (unicode == 0x1A60u)) return 254;
 
@@ -126,7 +126,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
   {
     /* U+180B..180D MONGOLIAN FREE VARIATION SELECTORs are handled in the
      * Arabic shaper.  No need to match them here. */
   {
     /* U+180B..180D MONGOLIAN FREE VARIATION SELECTORs are handled in the
      * Arabic shaper.  No need to match them here. */
-    return unlikely (hb_in_ranges (unicode,
+    return unlikely (hb_in_ranges<hb_codepoint_t> (unicode,
                                   0xFE00u, 0xFE0Fu, /* VARIATION SELECTOR-1..16 */
                                   0xE0100u, 0xE01EFu));  /* VARIATION SELECTOR-17..256 */
   }
                                   0xFE00u, 0xFE0Fu, /* VARIATION SELECTOR-1..16 */
                                   0xE0100u, 0xE01EFu));  /* VARIATION SELECTOR-17..256 */
   }
@@ -137,6 +137,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
    * we do NOT want to hide them, as the way Uniscribe has implemented them
    * is with regular spacing glyphs, and that's the way fonts are made to work.
    * As such, we make exceptions for those four.
    * we do NOT want to hide them, as the way Uniscribe has implemented them
    * is with regular spacing glyphs, and that's the way fonts are made to work.
    * As such, we make exceptions for those four.
+   * Also ignoring U+1BCA0..1BCA3. https://github.com/harfbuzz/harfbuzz/issues/503
    *
    * Unicode 7.0:
    * $ grep '; Default_Ignorable_Code_Point ' DerivedCoreProperties.txt | sed 's/;.*#/#/'
    *
    * Unicode 7.0:
    * $ grep '; Default_Ignorable_Code_Point ' DerivedCoreProperties.txt | sed 's/;.*#/#/'
@@ -179,13 +180,13 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
        case 0x00: return unlikely (ch == 0x00ADu);
        case 0x03: return unlikely (ch == 0x034Fu);
        case 0x06: return unlikely (ch == 0x061Cu);
        case 0x00: return unlikely (ch == 0x00ADu);
        case 0x03: return unlikely (ch == 0x034Fu);
        case 0x06: return unlikely (ch == 0x061Cu);
-       case 0x17: return hb_in_range (ch, 0x17B4u, 0x17B5u);
-       case 0x18: return hb_in_range (ch, 0x180Bu, 0x180Eu);
-       case 0x20: return hb_in_ranges (ch, 0x200Bu, 0x200Fu,
+       case 0x17: return hb_in_range<hb_codepoint_t> (ch, 0x17B4u, 0x17B5u);
+       case 0x18: return hb_in_range<hb_codepoint_t> (ch, 0x180Bu, 0x180Eu);
+       case 0x20: return hb_in_ranges<hb_codepoint_t> (ch, 0x200Bu, 0x200Fu,
                                            0x202Au, 0x202Eu,
                                            0x2060u, 0x206Fu);
                                            0x202Au, 0x202Eu,
                                            0x2060u, 0x206Fu);
-       case 0xFE: return hb_in_range (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu;
-       case 0xFF: return hb_in_range (ch, 0xFFF0u, 0xFFF8u);
+       case 0xFE: return hb_in_range<hb_codepoint_t> (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu;
+       case 0xFF: return hb_in_range<hb_codepoint_t> (ch, 0xFFF0u, 0xFFF8u);
        default: return false;
       }
     }
        default: return false;
       }
     }
@@ -193,9 +194,8 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
     {
       /* Other planes */
       switch (plane) {
     {
       /* Other planes */
       switch (plane) {
-       case 0x01: return hb_in_ranges (ch, 0x1BCA0u, 0x1BCA3u,
-                                           0x1D173u, 0x1D17Au);
-       case 0x0E: return hb_in_range (ch, 0xE0000u, 0xE0FFFu);
+       case 0x01: return hb_in_range<hb_codepoint_t> (ch, 0x1D173u, 0x1D17Au);
+       case 0x0E: return hb_in_range<hb_codepoint_t> (ch, 0xE0000u, 0xE0FFFu);
        default: return false;
       }
     }
        default: return false;
       }
     }
@@ -346,23 +346,24 @@ extern HB_INTERNAL const hb_unicode_funcs_t _hb_unicode_funcs_nil;
 #define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */
 
 /* Tibetan
 #define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */
 
 /* Tibetan
- * Modify U+0F74 (ccc=132) to reorder before ccc=130 marks.
+ * 
+ * In case of multiple vowel-signs, use u first (but after achung) 
+ * this allows Dzongkha multi-vowel shortcuts to render correctly 
  */
 #define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */
  */
 #define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */
-#define HB_MODIFIED_COMBINING_CLASS_CCC130 130 /* sign i */
-#define HB_MODIFIED_COMBINING_CLASS_CCC132 128 /* sign u */
-
+#define HB_MODIFIED_COMBINING_CLASS_CCC130 132 /* sign i */
+#define HB_MODIFIED_COMBINING_CLASS_CCC132 131 /* sign u */
 
 /* Misc */
 
 #define HB_UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) \
 
 /* Misc */
 
 #define HB_UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) \
-       (FLAG_SAFE (gen_cat) & \
+       (FLAG_UNSAFE (gen_cat) & \
         (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
 
 #define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL(gen_cat) \
         (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
 
 #define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL(gen_cat) \
-       (FLAG_SAFE (gen_cat) & \
+       (FLAG_UNSAFE (gen_cat) & \
         (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL)))
         (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL)))
index d553a71..726baeb 100644 (file)
@@ -188,7 +188,7 @@ hb_unicode_funcs_create (hb_unicode_funcs_t *parent)
 const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
   HB_OBJECT_HEADER_STATIC,
 
 const hb_unicode_funcs_t _hb_unicode_funcs_nil = {
   HB_OBJECT_HEADER_STATIC,
 
-  NULL, /* parent */
+  nullptr, /* parent */
   true, /* immutable */
   {
 #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil,
   true, /* immutable */
   {
 #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_nil,
@@ -365,7 +365,7 @@ hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t                 *ufuncs,     \
   } else {                                                                     \
     ufuncs->func.name = ufuncs->parent->func.name;                             \
     ufuncs->user_data.name = ufuncs->parent->user_data.name;                   \
   } else {                                                                     \
     ufuncs->func.name = ufuncs->parent->func.name;                             \
     ufuncs->user_data.name = ufuncs->parent->user_data.name;                   \
-    ufuncs->destroy.name = NULL;                                               \
+    ufuncs->destroy.name = nullptr;                                            \
   }                                                                            \
 }
 
   }                                                                            \
 }
 
index 58f983d..cd25769 100644 (file)
@@ -24,6 +24,8 @@
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
+#include "hb-private.hh"
+#include "hb-debug.hh"
 #define HB_SHAPER uniscribe
 #include "hb-shaper-impl-private.hh"
 
 #define HB_SHAPER uniscribe
 #include "hb-shaper-impl-private.hh"
 
 #include "hb-ot-tag.h"
 
 
 #include "hb-ot-tag.h"
 
 
-#ifndef HB_DEBUG_UNISCRIBE
-#define HB_DEBUG_UNISCRIBE (HB_DEBUG+0)
-#endif
-
-
 static inline uint16_t hb_uint16_swap (const uint16_t v)
 { return (v >> 8) | (v << 8); }
 static inline uint32_t hb_uint32_swap (const uint32_t v)
 static inline uint16_t hb_uint16_swap (const uint16_t v)
 { return (v >> 8) | (v << 8); }
 static inline uint32_t hb_uint32_swap (const uint32_t v)
@@ -202,9 +199,9 @@ struct hb_uniscribe_shaper_funcs_t {
   inline void init (void)
   {
     HMODULE hinstLib;
   inline void init (void)
   {
     HMODULE hinstLib;
-    this->ScriptItemizeOpenType = NULL;
-    this->ScriptShapeOpenType   = NULL;
-    this->ScriptPlaceOpenType   = NULL;
+    this->ScriptItemizeOpenType = nullptr;
+    this->ScriptShapeOpenType   = nullptr;
+    this->ScriptPlaceOpenType   = nullptr;
 
     hinstLib = GetModuleHandle (TEXT ("usp10.dll"));
     if (hinstLib)
 
     hinstLib = GetModuleHandle (TEXT ("usp10.dll"));
     if (hinstLib)
@@ -217,7 +214,7 @@ struct hb_uniscribe_shaper_funcs_t {
        !this->ScriptShapeOpenType   ||
        !this->ScriptPlaceOpenType)
     {
        !this->ScriptShapeOpenType   ||
        !this->ScriptPlaceOpenType)
     {
-      DEBUG_MSG (UNISCRIBE, NULL, "OpenType versions of functions not found; falling back.");
+      DEBUG_MSG (UNISCRIBE, nullptr, "OpenType versions of functions not found; falling back.");
       this->ScriptItemizeOpenType = hb_ScriptItemizeOpenType;
       this->ScriptShapeOpenType   = hb_ScriptShapeOpenType;
       this->ScriptPlaceOpenType   = hb_ScriptPlaceOpenType;
       this->ScriptItemizeOpenType = hb_ScriptItemizeOpenType;
       this->ScriptShapeOpenType   = hb_ScriptShapeOpenType;
       this->ScriptPlaceOpenType   = hb_ScriptPlaceOpenType;
@@ -242,11 +239,11 @@ retry:
   {
     funcs = (hb_uniscribe_shaper_funcs_t *) calloc (1, sizeof (hb_uniscribe_shaper_funcs_t));
     if (unlikely (!funcs))
   {
     funcs = (hb_uniscribe_shaper_funcs_t *) calloc (1, sizeof (hb_uniscribe_shaper_funcs_t));
     if (unlikely (!funcs))
-      return NULL;
+      return nullptr;
 
     funcs->init ();
 
 
     funcs->init ();
 
-    if (!hb_atomic_ptr_cmpexch (&uniscribe_funcs, NULL, funcs)) {
+    if (!hb_atomic_ptr_cmpexch (&uniscribe_funcs, nullptr, funcs)) {
       free (funcs);
       goto retry;
     }
       free (funcs);
       goto retry;
     }
@@ -264,7 +261,9 @@ struct active_feature_t {
   OPENTYPE_FEATURE_RECORD rec;
   unsigned int order;
 
   OPENTYPE_FEATURE_RECORD rec;
   unsigned int order;
 
-  static int cmp (const active_feature_t *a, const active_feature_t *b) {
+  static int cmp (const void *pa, const void *pb) {
+    const active_feature_t *a = (const active_feature_t *) pa;
+    const active_feature_t *b = (const active_feature_t *) pb;
     return a->rec.tagFeature < b->rec.tagFeature ? -1 : a->rec.tagFeature > b->rec.tagFeature ? 1 :
           a->order < b->order ? -1 : a->order > b->order ? 1 :
           a->rec.lParameter < b->rec.lParameter ? -1 : a->rec.lParameter > b->rec.lParameter ? 1 :
     return a->rec.tagFeature < b->rec.tagFeature ? -1 : a->rec.tagFeature > b->rec.tagFeature ? 1 :
           a->order < b->order ? -1 : a->order > b->order ? 1 :
           a->rec.lParameter < b->rec.lParameter ? -1 : a->rec.lParameter > b->rec.lParameter ? 1 :
@@ -280,7 +279,9 @@ struct feature_event_t {
   bool start;
   active_feature_t feature;
 
   bool start;
   active_feature_t feature;
 
-  static int cmp (const feature_event_t *a, const feature_event_t *b) {
+  static int cmp (const void *pa, const void *pb) {
+    const feature_event_t *a = (const feature_event_t *) pa;
+    const feature_event_t *b = (const feature_event_t *) pb;
     return a->index < b->index ? -1 : a->index > b->index ? 1 :
           a->start < b->start ? -1 : a->start > b->start ? 1 :
           active_feature_t::cmp (&a->feature, &b->feature);
     return a->index < b->index ? -1 : a->index > b->index ? 1 :
           a->start < b->start ? -1 : a->start > b->start ? 1 :
           active_feature_t::cmp (&a->feature, &b->feature);
@@ -316,7 +317,7 @@ _hb_generate_unique_face_name (wchar_t *face_name, unsigned int *plen)
   const char *enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-";
   UUID id;
   UuidCreate ((UUID*) &id);
   const char *enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-";
   UUID id;
   UuidCreate ((UUID*) &id);
-  ASSERT_STATIC (2 + 3 * (16/2) < LF_FACESIZE);
+  static_assert ((2 + 3 * (16/2) < LF_FACESIZE), "");
   unsigned int name_str_len = 0;
   face_name[name_str_len++] = 'F';
   face_name[name_str_len++] = '_';
   unsigned int name_str_len = 0;
   face_name[name_str_len++] = 'F';
   face_name[name_str_len++] = '_';
@@ -350,7 +351,7 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name)
    * full, PS. All of them point to the same name data with our unique name.
    */
 
    * full, PS. All of them point to the same name data with our unique name.
    */
 
-  blob = OT::Sanitizer<OT::OpenTypeFontFile>::sanitize (blob);
+  blob = OT::Sanitizer<OT::OpenTypeFontFile>().sanitize (blob);
 
   unsigned int length, new_length, name_str_len;
   const char *orig_sfnt_data = hb_blob_get_data (blob, &length);
 
   unsigned int length, new_length, name_str_len;
   const char *orig_sfnt_data = hb_blob_get_data (blob, &length);
@@ -369,7 +370,7 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name)
   if (!new_sfnt_data)
   {
     hb_blob_destroy (blob);
   if (!new_sfnt_data)
   {
     hb_blob_destroy (blob);
-    return NULL;
+    return nullptr;
   }
 
   memcpy(new_sfnt_data, orig_sfnt_data, length);
   }
 
   memcpy(new_sfnt_data, orig_sfnt_data, length);
@@ -417,7 +418,7 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name)
     {
       free (new_sfnt_data);
       hb_blob_destroy (blob);
     {
       free (new_sfnt_data);
       hb_blob_destroy (blob);
-      return NULL;
+      return nullptr;
     }
   }
 
     }
   }
 
@@ -427,7 +428,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_blob_destroy (blob);
   return hb_blob_create ((const char *) new_sfnt_data, new_length,
-                        HB_MEMORY_MODE_WRITABLE, NULL, free);
+                        HB_MEMORY_MODE_WRITABLE, nullptr, free);
 }
 
 hb_uniscribe_shaper_face_data_t *
 }
 
 hb_uniscribe_shaper_face_data_t *
@@ -435,13 +436,13 @@ _hb_uniscribe_shaper_face_data_create (hb_face_t *face)
 {
   hb_uniscribe_shaper_face_data_t *data = (hb_uniscribe_shaper_face_data_t *) calloc (1, sizeof (hb_uniscribe_shaper_face_data_t));
   if (unlikely (!data))
 {
   hb_uniscribe_shaper_face_data_t *data = (hb_uniscribe_shaper_face_data_t *) calloc (1, sizeof (hb_uniscribe_shaper_face_data_t));
   if (unlikely (!data))
-    return NULL;
+    return nullptr;
 
   data->funcs = hb_uniscribe_shaper_get_funcs ();
   if (unlikely (!data->funcs))
   {
     free (data);
 
   data->funcs = hb_uniscribe_shaper_get_funcs ();
   if (unlikely (!data->funcs))
   {
     free (data);
-    return NULL;
+    return nullptr;
   }
 
   hb_blob_t *blob = hb_face_reference_blob (face);
   }
 
   hb_blob_t *blob = hb_face_reference_blob (face);
@@ -452,18 +453,18 @@ _hb_uniscribe_shaper_face_data_create (hb_face_t *face)
   if (unlikely (!blob))
   {
     free (data);
   if (unlikely (!blob))
   {
     free (data);
-    return NULL;
+    return nullptr;
   }
 
   DWORD num_fonts_installed;
   }
 
   DWORD num_fonts_installed;
-  data->fh = AddFontMemResourceEx ((void *) hb_blob_get_data (blob, NULL),
+  data->fh = AddFontMemResourceEx ((void *) hb_blob_get_data (blob, nullptr),
                                   hb_blob_get_length (blob),
                                   0, &num_fonts_installed);
   if (unlikely (!data->fh))
   {
     DEBUG_MSG (UNISCRIBE, face, "Face AddFontMemResourceEx() failed");
     free (data);
                                   hb_blob_get_length (blob),
                                   0, &num_fonts_installed);
   if (unlikely (!data->fh))
   {
     DEBUG_MSG (UNISCRIBE, face, "Face AddFontMemResourceEx() failed");
     free (data);
-    return NULL;
+    return nullptr;
   }
 
   return data;
   }
 
   return data;
@@ -495,7 +496,7 @@ populate_log_font (LOGFONTW  *lf,
                   unsigned int font_size)
 {
   memset (lf, 0, sizeof (*lf));
                   unsigned int font_size)
 {
   memset (lf, 0, sizeof (*lf));
-  lf->lfHeight = -font_size;
+  lf->lfHeight = - (int) font_size;
   lf->lfCharSet = DEFAULT_CHARSET;
 
   hb_face_t *face = font->face;
   lf->lfCharSet = DEFAULT_CHARSET;
 
   hb_face_t *face = font->face;
@@ -509,11 +510,11 @@ populate_log_font (LOGFONTW  *lf,
 hb_uniscribe_shaper_font_data_t *
 _hb_uniscribe_shaper_font_data_create (hb_font_t *font)
 {
 hb_uniscribe_shaper_font_data_t *
 _hb_uniscribe_shaper_font_data_create (hb_font_t *font)
 {
-  if (unlikely (!hb_uniscribe_shaper_face_data_ensure (font->face))) return NULL;
+  if (unlikely (!hb_uniscribe_shaper_face_data_ensure (font->face))) return nullptr;
 
   hb_uniscribe_shaper_font_data_t *data = (hb_uniscribe_shaper_font_data_t *) calloc (1, sizeof (hb_uniscribe_shaper_font_data_t));
   if (unlikely (!data))
 
   hb_uniscribe_shaper_font_data_t *data = (hb_uniscribe_shaper_font_data_t *) calloc (1, sizeof (hb_uniscribe_shaper_font_data_t));
   if (unlikely (!data))
-    return NULL;
+    return nullptr;
 
   int font_size = font->face->get_upem (); /* Default... */
   /* No idea if the following is even a good idea. */
 
   int font_size = font->face->get_upem (); /* Default... */
   /* No idea if the following is even a good idea. */
@@ -525,25 +526,25 @@ _hb_uniscribe_shaper_font_data_create (hb_font_t *font)
   data->x_mult = (double) font->x_scale / font_size;
   data->y_mult = (double) font->y_scale / font_size;
 
   data->x_mult = (double) font->x_scale / font_size;
   data->y_mult = (double) font->y_scale / font_size;
 
-  data->hdc = GetDC (NULL);
+  data->hdc = GetDC (nullptr);
 
   if (unlikely (!populate_log_font (&data->log_font, font, font_size))) {
     DEBUG_MSG (UNISCRIBE, font, "Font populate_log_font() failed");
     _hb_uniscribe_shaper_font_data_destroy (data);
 
   if (unlikely (!populate_log_font (&data->log_font, font, font_size))) {
     DEBUG_MSG (UNISCRIBE, font, "Font populate_log_font() failed");
     _hb_uniscribe_shaper_font_data_destroy (data);
-    return NULL;
+    return nullptr;
   }
 
   data->hfont = CreateFontIndirectW (&data->log_font);
   if (unlikely (!data->hfont)) {
     DEBUG_MSG (UNISCRIBE, font, "Font CreateFontIndirectW() failed");
     _hb_uniscribe_shaper_font_data_destroy (data);
   }
 
   data->hfont = CreateFontIndirectW (&data->log_font);
   if (unlikely (!data->hfont)) {
     DEBUG_MSG (UNISCRIBE, font, "Font CreateFontIndirectW() failed");
     _hb_uniscribe_shaper_font_data_destroy (data);
-     return NULL;
+     return nullptr;
   }
 
   if (!SelectObject (data->hdc, data->hfont)) {
     DEBUG_MSG (UNISCRIBE, font, "Font SelectObject() failed");
     _hb_uniscribe_shaper_font_data_destroy (data);
   }
 
   if (!SelectObject (data->hdc, data->hfont)) {
     DEBUG_MSG (UNISCRIBE, font, "Font SelectObject() failed");
     _hb_uniscribe_shaper_font_data_destroy (data);
-     return NULL;
+     return nullptr;
   }
 
   return data;
   }
 
   return data;
@@ -553,7 +554,7 @@ void
 _hb_uniscribe_shaper_font_data_destroy (hb_uniscribe_shaper_font_data_t *data)
 {
   if (data->hdc)
 _hb_uniscribe_shaper_font_data_destroy (hb_uniscribe_shaper_font_data_t *data)
 {
   if (data->hdc)
-    ReleaseDC (NULL, data->hdc);
+    ReleaseDC (nullptr, data->hdc);
   if (data->hfont)
     DeleteObject (data->hfont);
   if (data->script_cache)
   if (data->hfont)
     DeleteObject (data->hfont);
   if (data->script_cache)
@@ -564,7 +565,7 @@ _hb_uniscribe_shaper_font_data_destroy (hb_uniscribe_shaper_font_data_t *data)
 LOGFONTW *
 hb_uniscribe_font_get_logfontw (hb_font_t *font)
 {
 LOGFONTW *
 hb_uniscribe_font_get_logfontw (hb_font_t *font)
 {
-  if (unlikely (!hb_uniscribe_shaper_font_data_ensure (font))) return NULL;
+  if (unlikely (!hb_uniscribe_shaper_font_data_ensure (font))) return nullptr;
   hb_uniscribe_shaper_font_data_t *font_data =  HB_SHAPER_DATA_GET (font);
   return &font_data->log_font;
 }
   hb_uniscribe_shaper_font_data_t *font_data =  HB_SHAPER_DATA_GET (font);
   return &font_data->log_font;
 }
@@ -572,7 +573,7 @@ hb_uniscribe_font_get_logfontw (hb_font_t *font)
 HFONT
 hb_uniscribe_font_get_hfont (hb_font_t *font)
 {
 HFONT
 hb_uniscribe_font_get_hfont (hb_font_t *font)
 {
-  if (unlikely (!hb_uniscribe_shaper_font_data_ensure (font))) return NULL;
+  if (unlikely (!hb_uniscribe_shaper_font_data_ensure (font))) return nullptr;
   hb_uniscribe_shaper_font_data_t *font_data =  HB_SHAPER_DATA_GET (font);
   return font_data->hfont;
 }
   hb_uniscribe_shaper_font_data_t *font_data =  HB_SHAPER_DATA_GET (font);
   return font_data->hfont;
 }
@@ -738,7 +739,7 @@ _hb_uniscribe_shape (hb_shape_plan_t    *shape_plan,
 
 #define FAIL(...) \
   HB_STMT_START { \
 
 #define FAIL(...) \
   HB_STMT_START { \
-    DEBUG_MSG (UNISCRIBE, NULL, __VA_ARGS__); \
+    DEBUG_MSG (UNISCRIBE, nullptr, __VA_ARGS__); \
     return false; \
   } HB_STMT_END;
 
     return false; \
   } HB_STMT_END;
 
@@ -854,7 +855,7 @@ retry:
   unsigned int glyphs_offset = 0;
   unsigned int glyphs_len;
   bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
   unsigned int glyphs_offset = 0;
   unsigned int glyphs_len;
   bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
-  for (unsigned int i = 0; i < item_count; i++)
+  for (int i = 0; i < item_count; i++)
   {
     unsigned int chars_offset = items[i].iCharPos;
     unsigned int item_chars_len = items[i + 1].iCharPos - chars_offset;
   {
     unsigned int chars_offset = items[i].iCharPos;
     unsigned int item_chars_len = items[i + 1].iCharPos - chars_offset;
@@ -960,7 +961,7 @@ retry:
                                     /* out */
                                     advances + glyphs_offset,
                                     offsets + glyphs_offset,
                                     /* out */
                                     advances + glyphs_offset,
                                     offsets + glyphs_offset,
-                                    NULL);
+                                    nullptr);
     if (unlikely (FAILED (hr)))
       FAIL ("ScriptPlaceOpenType() failed: 0x%08xL", hr);
 
     if (unlikely (FAILED (hr)))
       FAIL ("ScriptPlaceOpenType() failed: 0x%08xL", hr);
 
@@ -1029,6 +1030,8 @@ retry:
   if (backward)
     hb_buffer_reverse (buffer);
 
   if (backward)
     hb_buffer_reverse (buffer);
 
+  buffer->unsafe_to_break_all ();
+
   /* Wow, done! */
   return true;
 }
   /* Wow, done! */
   return true;
 }
index 74cf5d6..211eb4d 100644 (file)
@@ -48,7 +48,7 @@ struct hb_utf8_t
 
     if (c > 0x7Fu)
     {
 
     if (c > 0x7Fu)
     {
-      if (hb_in_range (c, 0xC2u, 0xDFu)) /* Two-byte */
+      if (hb_in_range<hb_codepoint_t> (c, 0xC2u, 0xDFu)) /* Two-byte */
       {
        unsigned int t1;
        if (likely (text < end &&
       {
        unsigned int t1;
        if (likely (text < end &&
@@ -60,7 +60,7 @@ struct hb_utf8_t
        else
          goto error;
       }
        else
          goto error;
       }
-      else if (hb_in_range (c, 0xE0u, 0xEFu)) /* Three-byte */
+      else if (hb_in_range<hb_codepoint_t> (c, 0xE0u, 0xEFu)) /* Three-byte */
       {
        unsigned int t1, t2;
        if (likely (1 < end - text &&
       {
        unsigned int t1, t2;
        if (likely (1 < end - text &&
@@ -68,14 +68,14 @@ struct hb_utf8_t
                    (t2 = text[1] - 0x80u) <= 0x3Fu))
        {
          c = ((c&0xFu)<<12) | (t1<<6) | t2;
                    (t2 = text[1] - 0x80u) <= 0x3Fu))
        {
          c = ((c&0xFu)<<12) | (t1<<6) | t2;
-         if (unlikely (c < 0x0800u || hb_in_range (c, 0xD800u, 0xDFFFu)))
+         if (unlikely (c < 0x0800u || hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
            goto error;
          text += 2;
        }
        else
          goto error;
       }
            goto error;
          text += 2;
        }
        else
          goto error;
       }
-      else if (hb_in_range (c, 0xF0u, 0xF4u)) /* Four-byte */
+      else if (hb_in_range<hb_codepoint_t> (c, 0xF0u, 0xF4u)) /* Four-byte */
       {
        unsigned int t1, t2, t3;
        if (likely (2 < end - text &&
       {
        unsigned int t1, t2, t3;
        if (likely (2 < end - text &&
@@ -84,7 +84,7 @@ struct hb_utf8_t
                    (t3 = text[2] - 0x80u) <= 0x3Fu))
        {
          c = ((c&0x7u)<<18) | (t1<<12) | (t2<<6) | t3;
                    (t3 = text[2] - 0x80u) <= 0x3Fu))
        {
          c = ((c&0x7u)<<18) | (t1<<12) | (t2<<6) | t3;
-         if (unlikely (!hb_in_range (c, 0x10000u, 0x10FFFFu)))
+         if (unlikely (!hb_in_range<hb_codepoint_t> (c, 0x10000u, 0x10FFFFu)))
            goto error;
          text += 3;
        }
            goto error;
          text += 3;
        }
@@ -140,7 +140,7 @@ struct hb_utf16_t
   {
     hb_codepoint_t c = *text++;
 
   {
     hb_codepoint_t c = *text++;
 
-    if (likely (!hb_in_range (c, 0xD800u, 0xDFFFu)))
+    if (likely (!hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
     {
       *unicode = c;
       return text;
     {
       *unicode = c;
       return text;
@@ -150,7 +150,7 @@ struct hb_utf16_t
     {
       /* High-surrogate in c */
       hb_codepoint_t l = *text;
     {
       /* High-surrogate in c */
       hb_codepoint_t l = *text;
-      if (likely (hb_in_range (l, 0xDC00u, 0xDFFFu)))
+      if (likely (hb_in_range<hb_codepoint_t> (l, 0xDC00u, 0xDFFFu)))
       {
        /* Low-surrogate in l */
        *unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u);
       {
        /* Low-surrogate in l */
        *unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u);
@@ -172,7 +172,7 @@ struct hb_utf16_t
   {
     hb_codepoint_t c = *--text;
 
   {
     hb_codepoint_t c = *--text;
 
-    if (likely (!hb_in_range (c, 0xD800u, 0xDFFFu)))
+    if (likely (!hb_in_range<hb_codepoint_t> (c, 0xD800u, 0xDFFFu)))
     {
       *unicode = c;
       return text;
     {
       *unicode = c;
       return text;
@@ -182,7 +182,7 @@ struct hb_utf16_t
     {
       /* Low-surrogate in c */
       hb_codepoint_t h = text[-1];
     {
       /* Low-surrogate in c */
       hb_codepoint_t h = text[-1];
-      if (likely (hb_in_range (h, 0xD800u, 0xDBFFu)))
+      if (likely (hb_in_range<hb_codepoint_t> (h, 0xD800u, 0xDBFFu)))
       {
         /* High-surrogate in h */
         *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u);
       {
         /* High-surrogate in h */
         *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u);
index 13be798..2750932 100644 (file)
@@ -37,10 +37,10 @@ HB_BEGIN_DECLS
 
 
 #define HB_VERSION_MAJOR 1
 
 
 #define HB_VERSION_MAJOR 1
-#define HB_VERSION_MINOR 4
+#define HB_VERSION_MINOR 7
 #define HB_VERSION_MICRO 6
 
 #define HB_VERSION_MICRO 6
 
-#define HB_VERSION_STRING "1.4.6"
+#define HB_VERSION_STRING "1.7.6"
 
 #define HB_VERSION_ATLEAST(major,minor,micro) \
        ((major)*10000+(minor)*100+(micro) <= \
 
 #define HB_VERSION_ATLEAST(major,minor,micro) \
        ((major)*10000+(minor)*100+(micro) <= \
index f9708cc..d221e9d 100644 (file)
@@ -24,7 +24,6 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#include "hb-mutex-private.hh"
 #include "hb-open-file-private.hh"
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-ot-layout-gsubgpos-private.hh"
 #include "hb-open-file-private.hh"
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-ot-layout-gsubgpos-private.hh"
@@ -38,6 +37,9 @@
 
 using namespace OT;
 
 
 using namespace OT;
 
+#ifndef HB_NO_VISIBILITY
+const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+#endif
 
 int
 main (int argc, char **argv)
 
 int
 main (int argc, char **argv)
@@ -47,11 +49,11 @@ main (int argc, char **argv)
     exit (1);
   }
 
     exit (1);
   }
 
-  const char *font_data = NULL;
+  const char *font_data = nullptr;
   int len = 0;
 
 #ifdef HAVE_GLIB
   int len = 0;
 
 #ifdef HAVE_GLIB
-  GMappedFile *mf = g_mapped_file_new (argv[1], false, NULL);
+  GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr);
   font_data = g_mapped_file_get_contents (mf);
   len = g_mapped_file_get_length (mf);
 #else
   font_data = g_mapped_file_get_contents (mf);
   len = g_mapped_file_get_length (mf);
 #else
@@ -105,8 +107,8 @@ main (int argc, char **argv)
 
       switch (table.tag) {
 
 
       switch (table.tag) {
 
-      case GSUBGPOS::GSUBTag:
-      case GSUBGPOS::GPOSTag:
+      case HB_OT_TAG_GSUB:
+      case HB_OT_TAG_GPOS:
        {
 
        const GSUBGPOS &g = *CastP<GSUBGPOS> (font_data + table.offset);
        {
 
        const GSUBGPOS &g = *CastP<GSUBGPOS> (font_data + table.offset);
index 18c46e9..636b003 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include "hb-private.hh"
 
 #include "hb.h"
 
 #include "hb.h"
+#include "hb-ot.h"
 #ifdef HAVE_FREETYPE
 #include "hb-ft.h"
 #endif
 #ifdef HAVE_FREETYPE
 #include "hb-ft.h"
 #endif
@@ -45,7 +44,7 @@
 int
 main (int argc, char **argv)
 {
 int
 main (int argc, char **argv)
 {
-  hb_blob_t *blob = NULL;
+  hb_blob_t *blob = nullptr;
 
   if (argc != 2) {
     fprintf (stderr, "usage: %s font-file\n", argv[0]);
 
   if (argc != 2) {
     fprintf (stderr, "usage: %s font-file\n", argv[0]);
@@ -61,7 +60,7 @@ main (int argc, char **argv)
     hb_memory_mode_t mm;
 
 #ifdef HAVE_GLIB
     hb_memory_mode_t mm;
 
 #ifdef HAVE_GLIB
-    GMappedFile *mf = g_mapped_file_new (argv[1], false, NULL);
+    GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr);
     font_data = g_mapped_file_get_contents (mf);
     len = g_mapped_file_get_length (mf);
     destroy = (hb_destroy_func_t) g_mapped_file_unref;
     font_data = g_mapped_file_get_contents (mf);
     len = g_mapped_file_get_length (mf);
     destroy = (hb_destroy_func_t) g_mapped_file_unref;
@@ -86,14 +85,15 @@ main (int argc, char **argv)
 
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
 
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
-  blob = NULL;
+  blob = nullptr;
 
   unsigned int upem = hb_face_get_upem (face);
   hb_font_t *font = hb_font_create (face);
   hb_face_destroy (face);
   hb_font_set_scale (font, upem, upem);
 
   unsigned int upem = hb_face_get_upem (face);
   hb_font_t *font = hb_font_create (face);
   hb_face_destroy (face);
   hb_font_set_scale (font, upem, upem);
+  hb_ot_font_set_funcs (font);
 #ifdef HAVE_FREETYPE
 #ifdef HAVE_FREETYPE
-  hb_ft_font_set_funcs (font);
+  //hb_ft_font_set_funcs (font);
 #endif
 
   hb_buffer_t *buf;
 #endif
 
   hb_buffer_t *buf;
@@ -101,7 +101,7 @@ main (int argc, char **argv)
 
   bool ret = true;
   char line[BUFSIZ], out[BUFSIZ];
 
   bool ret = true;
   char line[BUFSIZ], out[BUFSIZ];
-  while (fgets (line, sizeof(line), stdin) != 0)
+  while (fgets (line, sizeof(line), stdin) != nullptr)
   {
     hb_buffer_clear_contents (buf);
 
   {
     hb_buffer_clear_contents (buf);
 
@@ -115,7 +115,7 @@ main (int argc, char **argv)
       ret = false;
 
     hb_buffer_serialize_glyphs (buf, 0, hb_buffer_get_length (buf),
       ret = false;
 
     hb_buffer_serialize_glyphs (buf, 0, hb_buffer_get_length (buf),
-                               out, sizeof (out), NULL,
+                               out, sizeof (out), nullptr,
                                font, HB_BUFFER_SERIALIZE_FORMAT_JSON,
                                HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
     puts (out);
                                font, HB_BUFFER_SERIALIZE_FORMAT_JSON,
                                HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
     puts (out);
index 35d9e3c..9741b87 100644 (file)
@@ -24,9 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include "hb-private.hh"
 
 #include "hb.h"
 #include "hb-ot.h"
 
 #include "hb.h"
 #include "hb-ot.h"
@@ -43,7 +41,7 @@
 int
 main (int argc, char **argv)
 {
 int
 main (int argc, char **argv)
 {
-  hb_blob_t *blob = NULL;
+  hb_blob_t *blob = nullptr;
 
   if (argc != 2) {
     fprintf (stderr, "usage: %s font-file\n", argv[0]);
 
   if (argc != 2) {
     fprintf (stderr, "usage: %s font-file\n", argv[0]);
@@ -59,7 +57,7 @@ main (int argc, char **argv)
     hb_memory_mode_t mm;
 
 #ifdef HAVE_GLIB
     hb_memory_mode_t mm;
 
 #ifdef HAVE_GLIB
-    GMappedFile *mf = g_mapped_file_new (argv[1], false, NULL);
+    GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr);
     font_data = g_mapped_file_get_contents (mf);
     len = g_mapped_file_get_length (mf);
     destroy = (hb_destroy_func_t) g_mapped_file_unref;
     font_data = g_mapped_file_get_contents (mf);
     len = g_mapped_file_get_length (mf);
     destroy = (hb_destroy_func_t) g_mapped_file_unref;
@@ -85,7 +83,7 @@ main (int argc, char **argv)
   /* Create the face */
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
   /* Create the face */
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
-  blob = NULL;
+  blob = nullptr;
 
   unsigned int p[5];
   bool ret = hb_ot_layout_get_size_params (face, p, p+1, p+2, p+3, p+4);
 
   unsigned int p[5];
   bool ret = hb_ot_layout_get_size_params (face, p, p+1, p+2, p+3, p+4);
diff --git a/src/test-unicode-ranges.cc b/src/test-unicode-ranges.cc
new file mode 100644 (file)
index 0000000..dbc5fa4
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#include "hb-private.hh"
+
+#include "hb-ot-os2-unicode-ranges.hh"
+
+void
+test (hb_codepoint_t cp, unsigned int bit)
+{
+  if (OT::hb_get_unicode_range_bit (cp) != bit)
+  {
+    fprintf (stderr, "got incorrect bit (%d) for cp 0x%X. Should have been %d.",
+             OT::hb_get_unicode_range_bit (cp),
+             cp,
+             bit);
+    abort();
+  }
+}
+
+void
+test_get_unicode_range_bit (void)
+{
+  test (0x0000, 0);
+  test (0x0042, 0);
+  test (0x007F, 0);
+  test (0x0080, 1);
+
+  test (0x30A0, 50);
+  test (0x30B1, 50);
+  test (0x30FF, 50);
+
+  test (0x10FFFD, 90);
+
+  test (0x30000, -1);
+  test (0x110000, -1);
+}
+
+int
+main (void)
+{
+  test_get_unicode_range_bit ();
+  return 0;
+}
index 8ea87cd..efebf2d 100644 (file)
@@ -24,9 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include "hb-private.hh"
 
 #include "hb.h"
 #include "hb-ot.h"
 
 #include "hb.h"
 #include "hb-ot.h"
@@ -47,7 +45,7 @@
 int
 main (int argc, char **argv)
 {
 int
 main (int argc, char **argv)
 {
-  hb_blob_t *blob = NULL;
+  hb_blob_t *blob = nullptr;
 
   if (argc != 4 && argc != 5) {
     fprintf (stderr, "usage: %s font-file lookup-index first-glyph [second-glyph]\n", argv[0]);
 
   if (argc != 4 && argc != 5) {
     fprintf (stderr, "usage: %s font-file lookup-index first-glyph [second-glyph]\n", argv[0]);
@@ -63,7 +61,7 @@ main (int argc, char **argv)
     hb_memory_mode_t mm;
 
 #ifdef HAVE_GLIB
     hb_memory_mode_t mm;
 
 #ifdef HAVE_GLIB
-    GMappedFile *mf = g_mapped_file_new (argv[1], false, NULL);
+    GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr);
     font_data = g_mapped_file_get_contents (mf);
     len = g_mapped_file_get_length (mf);
     destroy = (hb_destroy_func_t) g_mapped_file_unref;
     font_data = g_mapped_file_get_contents (mf);
     len = g_mapped_file_get_length (mf);
     destroy = (hb_destroy_func_t) g_mapped_file_unref;
@@ -89,7 +87,7 @@ main (int argc, char **argv)
   /* Create the face */
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
   /* Create the face */
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
-  blob = NULL;
+  blob = nullptr;
 
   hb_font_t *font = hb_font_create (face);
 #ifdef HAVE_FREETYPE
 
   hb_font_t *font = hb_font_create (face);
 #ifdef HAVE_FREETYPE
@@ -102,5 +100,5 @@ main (int argc, char **argv)
       (argc > 4 &&
        !hb_font_glyph_from_string (font, argv[4], -1, &glyphs[1])))
     return 2;
       (argc > 4 &&
        !hb_font_glyph_from_string (font, argv[4], -1, &glyphs[1])))
     return 2;
-  return !hb_ot_layout_lookup_would_substitute (face, strtol (argv[2], NULL, 0), glyphs, len, false);
+  return !hb_ot_layout_lookup_would_substitute (face, strtol (argv[2], nullptr, 0), glyphs, len, false);
 }
 }
index 0c90f8f..9592b37 100644 (file)
@@ -24,9 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include "hb-private.hh"
 
 #include "hb.h"
 
 
 #include "hb.h"
 
@@ -46,7 +44,7 @@
 int
 main (int argc, char **argv)
 {
 int
 main (int argc, char **argv)
 {
-  hb_blob_t *blob = NULL;
+  hb_blob_t *blob = nullptr;
 
   if (argc != 2) {
     fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]);
 
   if (argc != 2) {
     fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]);
@@ -62,7 +60,7 @@ main (int argc, char **argv)
     hb_memory_mode_t mm;
 
 #ifdef HAVE_GLIB
     hb_memory_mode_t mm;
 
 #ifdef HAVE_GLIB
-    GMappedFile *mf = g_mapped_file_new (argv[1], false, NULL);
+    GMappedFile *mf = g_mapped_file_new (argv[1], false, nullptr);
     font_data = g_mapped_file_get_contents (mf);
     len = g_mapped_file_get_length (mf);
     destroy = (hb_destroy_func_t) g_mapped_file_unref;
     font_data = g_mapped_file_get_contents (mf);
     len = g_mapped_file_get_length (mf);
     destroy = (hb_destroy_func_t) g_mapped_file_unref;
@@ -90,7 +88,7 @@ main (int argc, char **argv)
   /* Create the face */
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
   /* Create the face */
   hb_face_t *face = hb_face_create (blob, 0 /* first face */);
   hb_blob_destroy (blob);
-  blob = NULL;
+  blob = nullptr;
   unsigned int upem = hb_face_get_upem (face);
 
   hb_font_t *font = hb_font_create (face);
   unsigned int upem = hb_face_get_upem (face);
 
   hb_font_t *font = hb_font_create (face);
@@ -105,11 +103,11 @@ main (int argc, char **argv)
   hb_buffer_add_utf8 (buffer, "\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\x95", -1, 0, -1);
   hb_buffer_guess_segment_properties (buffer);
 
   hb_buffer_add_utf8 (buffer, "\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\x95", -1, 0, -1);
   hb_buffer_guess_segment_properties (buffer);
 
-  hb_shape (font, buffer, NULL, 0);
+  hb_shape (font, buffer, nullptr, 0);
 
   unsigned int count = hb_buffer_get_length (buffer);
 
   unsigned int count = hb_buffer_get_length (buffer);
-  hb_glyph_info_t *infos = hb_buffer_get_glyph_infos (buffer, NULL);
-  hb_glyph_position_t *positions = hb_buffer_get_glyph_positions (buffer, NULL);
+  hb_glyph_info_t *infos = hb_buffer_get_glyph_infos (buffer, nullptr);
+  hb_glyph_position_t *positions = hb_buffer_get_glyph_positions (buffer, nullptr);
 
   for (unsigned int i = 0; i < count; i++)
   {
 
   for (unsigned int i = 0; i < count; i++)
   {
index d306056..8e575b0 100755 (executable)
@@ -3,7 +3,7 @@
 
 scriptversion=2013-07-13.22; # UTC
 
 
 scriptversion=2013-07-13.22; # UTC
 
-# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+# Copyright (C) 2011-2014 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
 #
 # 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
@@ -106,11 +106,14 @@ trap "st=143; $do_exit" 15
 # Test script is run here.
 "$@" >$log_file 2>&1
 estatus=$?
 # Test script is run here.
 "$@" >$log_file 2>&1
 estatus=$?
+
 if test $enable_hard_errors = no && test $estatus -eq 99; then
 if test $enable_hard_errors = no && test $estatus -eq 99; then
-  estatus=1
+  tweaked_estatus=1
+else
+  tweaked_estatus=$estatus
 fi
 
 fi
 
-case $estatus:$expect_failure in
+case $tweaked_estatus:$expect_failure in
   0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
   0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
   77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
   0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
   0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
   77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
@@ -119,6 +122,12 @@ case $estatus:$expect_failure in
   *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
 esac
 
   *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
 esac
 
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
 # Report outcome to console.
 echo "${col}${res}${std}: $test_name"
 
 # Report outcome to console.
 echo "${col}${res}${std}: $test_name"
 
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644 (file)
index 0000000..d2b1994
--- /dev/null
@@ -0,0 +1,4 @@
+add_subdirectory(api)
+add_subdirectory(shaping)
+add_subdirectory(subset)
+add_subdirectory(fuzzing)
index ec77822..66b3e6e 100644 (file)
@@ -1,6 +1,12 @@
 # Process this file with automake to produce Makefile.in
 
 # Process this file with automake to produce Makefile.in
 
-SUBDIRS = api shaping fuzzing
+NULL =
+EXTRA_DIST =
+SUBDIRS = api shaping fuzzing subset
+
+EXTRA_DIST += \
+       CMakeLists.txt \
+       $(NULL)
 
 # Convenience targets:
 lib:
 
 # Convenience targets:
 lib:
index 8b9d36d..27cc25e 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # Process this file with automake to produce Makefile.in
 VPATH = @srcdir@
 
 # Process this file with automake to produce Makefile.in
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -80,15 +90,16 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = test
 build_triplet = @build@
 host_triplet = @host@
 subdir = test
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-       $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
@@ -148,6 +159,7 @@ am__define_uniq_tagged_files = \
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -189,6 +201,12 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
@@ -216,6 +234,8 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
@@ -255,6 +275,7 @@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -263,6 +284,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -319,6 +341,7 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -339,6 +362,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -347,7 +371,9 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-SUBDIRS = api shaping fuzzing
+NULL = 
+EXTRA_DIST = CMakeLists.txt $(NULL)
+SUBDIRS = api shaping fuzzing subset
 all: all-recursive
 
 .SUFFIXES:
 all: all-recursive
 
 .SUFFIXES:
@@ -363,7 +389,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits test/Makefile
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits test/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -658,6 +683,8 @@ uninstall-am:
        mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
        ps ps-am tags tags-am uninstall uninstall-am
 
        mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
        ps ps-am tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # Convenience targets:
 lib:
 
 # Convenience targets:
 lib:
diff --git a/test/api/CMakeLists.txt b/test/api/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f1a2300
--- /dev/null
@@ -0,0 +1,29 @@
+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-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)
+    add_test (${test_name} ${test_name})
+  endforeach ()
+  set_tests_properties (${TEST_PROGS} PROPERTIES ENVIRONMENT
+    "G_TEST_SRCDIR=${CMAKE_CURRENT_SOURCE_DIR};G_TEST_BUILDDIR=${CMAKE_CURRENT_BINARY_DIR}"
+  )
+endif ()
index 530bf3e..a6ebc57 100644 (file)
@@ -10,11 +10,15 @@ MAINTAINERCLEANFILES =
 lib:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
 
 lib:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
 
+EXTRA_DIST += CMakeLists.txt
+
+EXTRA_DIST += fonts
+
 if HAVE_GLIB
 AM_CPPFLAGS = -DSRCDIR="\"$(srcdir)\"" -I$(top_srcdir)/src/ -I$(top_builddir)/src/ $(GLIB_CFLAGS)
 LDADD = $(top_builddir)/src/libharfbuzz.la $(GLIB_LIBS)
 
 if HAVE_GLIB
 AM_CPPFLAGS = -DSRCDIR="\"$(srcdir)\"" -I$(top_srcdir)/src/ -I$(top_builddir)/src/ $(GLIB_CFLAGS)
 LDADD = $(top_builddir)/src/libharfbuzz.la $(GLIB_LIBS)
 
-EXTRA_DIST += hb-test.h
+EXTRA_DIST += hb-test.h hb-subset-test.h
 
 check_PROGRAMS = $(TEST_PROGS)
 noinst_PROGRAMS = $(TEST_PROGS)
 
 check_PROGRAMS = $(TEST_PROGS)
 noinst_PROGRAMS = $(TEST_PROGS)
@@ -27,15 +31,27 @@ TEST_PROGS = \
        test-object \
        test-set \
        test-shape \
        test-object \
        test-set \
        test-shape \
+       test-subset-cmap \
+       test-subset-glyf \
+       test-subset-hdmx \
+       test-subset-hmtx \
+       test-subset-os2 \
        test-unicode \
        test-version \
        $(NULL)
 
        test-unicode \
        test-version \
        $(NULL)
 
-test_unicode_CPPFLAGS = $(AM_CPPFLAGS)
+test_subset_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_cmap_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_glyf_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_hdmx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_hmtx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_os2_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+
+test_unicode_CPPFLAGS = \
+       $(AM_CPPFLAGS) \
+       $(GLIB_CFLAGS) \
+       $(NULL)
 test_unicode_LDADD = $(LDADD)
 test_unicode_LDADD = $(LDADD)
-if HAVE_GLIB
-test_unicode_CPPFLAGS += $(GLIB_CFLAGS)
-endif
 if HAVE_ICU
 test_unicode_CPPFLAGS += $(ICU_CFLAGS)
 test_unicode_LDADD += $(top_builddir)/src/libharfbuzz-icu.la $(ICU_LIBS)
 if HAVE_ICU
 test_unicode_CPPFLAGS += $(ICU_CFLAGS)
 test_unicode_LDADD += $(top_builddir)/src/libharfbuzz-icu.la $(ICU_LIBS)
@@ -45,6 +61,7 @@ endif
 if HAVE_OT
 
 TEST_PROGS += \
 if HAVE_OT
 
 TEST_PROGS += \
+       test-ot-color \
        test-ot-tag \
        $(NULL)
 
        test-ot-tag \
        $(NULL)
 
@@ -54,15 +71,6 @@ TEST_PROGS += \
        $(NULL)
 test_ot_math_LDADD = $(LDADD) $(FREETYPE_LIBS)
 test_ot_math_CPPFLAGS = $(AM_CPPFLAGS) $(FREETYPE_CFLAGS)
        $(NULL)
 test_ot_math_LDADD = $(LDADD) $(FREETYPE_LIBS)
 test_ot_math_CPPFLAGS = $(AM_CPPFLAGS) $(FREETYPE_CFLAGS)
-EXTRA_DIST += \
-       fonts/MathTestFontEmpty.otf \
-       fonts/MathTestFontFull.otf \
-       fonts/MathTestFontNone.otf \
-       fonts/MathTestFontPartial1.otf \
-       fonts/MathTestFontPartial2.otf \
-       fonts/MathTestFontPartial3.otf \
-       fonts/MathTestFontPartial4.otf \
-       $(NULL)
 endif # HAVE_FREETYPE
 
 endif # HAVE_OT
 endif # HAVE_FREETYPE
 
 endif # HAVE_OT
@@ -149,12 +157,12 @@ check-symbols: symbols-untested.txt
 
 
 
 
 
 
-else
+else # !HAVE_GLIB
 check-am: err-glib
 err-glib:
        @echo "You need to have glib support enabled to run the tests"
        @exit 77
 check-am: err-glib
 err-glib:
        @echo "You need to have glib support enabled to run the tests"
        @exit 77
-endif
+endif # HAVE_GLIB
 
 .PHONY: check-symbols check-tool check-valgrind
 
 
 .PHONY: check-symbols check-tool check-valgrind
 
index 5f4ac87..ea43eb8 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # Process this file with automake to produce Makefile.in
 
 VPATH = @srcdir@
 # Process this file with automake to produce Makefile.in
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -80,12 +90,13 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-@HAVE_GLIB_TRUE@am__append_1 = hb-test.h
+@HAVE_GLIB_TRUE@am__append_1 = hb-test.h hb-subset-test.h
 @HAVE_GLIB_TRUE@check_PROGRAMS = $(am__EXEEXT_4)
 @HAVE_GLIB_TRUE@noinst_PROGRAMS = $(am__EXEEXT_4)
 @HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_2 = $(ICU_CFLAGS)
 @HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_3 = $(top_builddir)/src/libharfbuzz-icu.la $(ICU_LIBS)
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__append_4 = \
 @HAVE_GLIB_TRUE@check_PROGRAMS = $(am__EXEEXT_4)
 @HAVE_GLIB_TRUE@noinst_PROGRAMS = $(am__EXEEXT_4)
 @HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_2 = $(ICU_CFLAGS)
 @HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_3 = $(top_builddir)/src/libharfbuzz-icu.la $(ICU_LIBS)
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__append_4 = \
+@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ test-ot-color \
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ test-ot-tag \
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ $(NULL)
 
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ test-ot-tag \
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ $(NULL)
 
@@ -93,48 +104,43 @@ host_triplet = @host@
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     test-ot-math \
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     $(NULL)
 
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     test-ot-math \
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     $(NULL)
 
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__append_6 = \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     fonts/MathTestFontEmpty.otf \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     fonts/MathTestFontFull.otf \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     fonts/MathTestFontNone.otf \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     fonts/MathTestFontPartial1.otf \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     fonts/MathTestFontPartial2.otf \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     fonts/MathTestFontPartial3.otf \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     fonts/MathTestFontPartial4.otf \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     $(NULL)
-
+@HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_6 = $(ICU_CFLAGS)
 @HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_7 = $(ICU_CFLAGS)
 @HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_7 = $(ICU_CFLAGS)
-@HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_8 = $(ICU_CFLAGS)
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__append_8 = $(FREETYPE_CFLAGS)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__append_9 = $(FREETYPE_CFLAGS)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__append_9 = $(FREETYPE_CFLAGS)
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__append_10 = $(FREETYPE_CFLAGS)
 @HAVE_GLIB_TRUE@TESTS = $(am__EXEEXT_4)
 #      Can't do for now: --show-reachable=yes
 @HAVE_GLIB_TRUE@TESTS = $(am__EXEEXT_4)
 #      Can't do for now: --show-reachable=yes
-@HAVE_GLIB_TRUE@am__append_11 = log-valgrind.txt symbols-tested.txt \
+@HAVE_GLIB_TRUE@am__append_10 = log-valgrind.txt symbols-tested.txt \
 @HAVE_GLIB_TRUE@       symbols-exported.txt symbols-untested.txt
 subdir = test/api
 @HAVE_GLIB_TRUE@       symbols-exported.txt symbols-untested.txt
 subdir = test/api
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-       $(top_srcdir)/depcomp $(top_srcdir)/test-driver
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-       $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 =
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 =
-@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__EXEEXT_2 = test-ot-tag$(EXEEXT) \
+@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__EXEEXT_2 = test-ot-color$(EXEEXT) \
+@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ test-ot-tag$(EXEEXT) \
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ $(am__EXEEXT_1)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__EXEEXT_3 = test-ot-math$(EXEEXT) \
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     $(am__EXEEXT_1)
 @HAVE_GLIB_TRUE@am__EXEEXT_4 = test-blob$(EXEEXT) test-buffer$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-common$(EXEEXT) test-font$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-object$(EXEEXT) test-set$(EXEEXT) \
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ $(am__EXEEXT_1)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__EXEEXT_3 = test-ot-math$(EXEEXT) \
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@     $(am__EXEEXT_1)
 @HAVE_GLIB_TRUE@am__EXEEXT_4 = test-blob$(EXEEXT) test-buffer$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-common$(EXEEXT) test-font$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-object$(EXEEXT) test-set$(EXEEXT) \
-@HAVE_GLIB_TRUE@       test-shape$(EXEEXT) test-unicode$(EXEEXT) \
+@HAVE_GLIB_TRUE@       test-shape$(EXEEXT) test-subset-cmap$(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-os2$(EXEEXT) test-unicode$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-version$(EXEEXT) $(am__EXEEXT_1) \
 @HAVE_GLIB_TRUE@       $(am__EXEEXT_2) $(am__EXEEXT_3) \
 @HAVE_GLIB_TRUE@       test-c$(EXEEXT) test-cplusplus$(EXEEXT) \
 @HAVE_GLIB_TRUE@       test-version$(EXEEXT) $(am__EXEEXT_1) \
 @HAVE_GLIB_TRUE@       $(am__EXEEXT_2) $(am__EXEEXT_3) \
 @HAVE_GLIB_TRUE@       test-c$(EXEEXT) test-cplusplus$(EXEEXT) \
@@ -189,6 +195,12 @@ test_object_LDADD = $(LDADD)
 @HAVE_GLIB_TRUE@test_object_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
 @HAVE_GLIB_TRUE@test_object_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
+test_ot_color_SOURCES = test-ot-color.c
+test_ot_color_OBJECTS = test-ot-color.$(OBJEXT)
+test_ot_color_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_ot_color_DEPENDENCIES =  \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
 test_ot_math_SOURCES = test-ot-math.c
 test_ot_math_OBJECTS = test_ot_math-test-ot-math.$(OBJEXT)
 @HAVE_GLIB_TRUE@am__DEPENDENCIES_2 =  \
 test_ot_math_SOURCES = test-ot-math.c
 test_ot_math_OBJECTS = test_ot_math-test-ot-math.$(OBJEXT)
 @HAVE_GLIB_TRUE@am__DEPENDENCIES_2 =  \
@@ -214,6 +226,26 @@ test_shape_LDADD = $(LDADD)
 @HAVE_GLIB_TRUE@test_shape_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
 @HAVE_GLIB_TRUE@test_shape_DEPENDENCIES =  \
 @HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz.la \
 @HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1)
+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_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_hdmx_SOURCES = test-subset-hdmx.c
+test_subset_hdmx_OBJECTS = test-subset-hdmx.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_hdmx_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
+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_os2_SOURCES = test-subset-os2.c
+test_subset_os2_OBJECTS = test-subset-os2.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_os2_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 \
 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 \
@@ -280,11 +312,15 @@ am__v_CXXLD_0 = @echo "  CXXLD   " $@;
 am__v_CXXLD_1 = 
 SOURCES = test-blob.c test-buffer.c test-c.c test-common.c \
        $(test_cplusplus_SOURCES) test-font.c test-object.c \
 am__v_CXXLD_1 = 
 SOURCES = test-blob.c test-buffer.c test-c.c test-common.c \
        $(test_cplusplus_SOURCES) test-font.c test-object.c \
-       test-ot-math.c test-ot-tag.c test-set.c test-shape.c \
+       test-ot-color.c test-ot-math.c test-ot-tag.c test-set.c \
+       test-shape.c test-subset-cmap.c test-subset-glyf.c \
+       test-subset-hdmx.c test-subset-hmtx.c test-subset-os2.c \
        test-unicode.c test-version.c
 DIST_SOURCES = test-blob.c test-buffer.c test-c.c test-common.c \
        $(am__test_cplusplus_SOURCES_DIST) test-font.c test-object.c \
        test-unicode.c test-version.c
 DIST_SOURCES = test-blob.c test-buffer.c test-c.c test-common.c \
        $(am__test_cplusplus_SOURCES_DIST) test-font.c test-object.c \
-       test-ot-math.c test-ot-tag.c test-set.c test-shape.c \
+       test-ot-color.c test-ot-math.c test-ot-tag.c test-set.c \
+       test-shape.c test-subset-cmap.c test-subset-glyf.c \
+       test-subset-hdmx.c test-subset-hmtx.c test-subset-os2.c \
        test-unicode.c test-version.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
        test-unicode.c test-version.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
@@ -514,6 +550,8 @@ TEST_LOGS = $(am__test_logs2:.test.log=.log)
 TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
        $(TEST_LOG_FLAGS)
 TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
        $(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+       $(top_srcdir)/test-driver
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
@@ -530,6 +568,12 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
@@ -557,6 +601,8 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
@@ -596,6 +642,7 @@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -604,6 +651,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -660,6 +708,7 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -680,6 +729,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -689,8 +739,8 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
-EXTRA_DIST = $(am__append_1) $(am__append_6)
-CLEANFILES = $(am__append_11)
+EXTRA_DIST = CMakeLists.txt fonts $(am__append_1)
+CLEANFILES = $(am__append_10)
 DISTCLEANFILES = 
 MAINTAINERCLEANFILES = 
 @HAVE_GLIB_TRUE@AM_CPPFLAGS = -DSRCDIR="\"$(srcdir)\"" -I$(top_srcdir)/src/ -I$(top_builddir)/src/ $(GLIB_CFLAGS)
 DISTCLEANFILES = 
 MAINTAINERCLEANFILES = 
 @HAVE_GLIB_TRUE@AM_CPPFLAGS = -DSRCDIR="\"$(srcdir)\"" -I$(top_srcdir)/src/ -I$(top_builddir)/src/ $(GLIB_CFLAGS)
@@ -699,19 +749,27 @@ MAINTAINERCLEANFILES =
 # Tests for header compilation
 @HAVE_GLIB_TRUE@TEST_PROGS = test-blob test-buffer test-common \
 @HAVE_GLIB_TRUE@       test-font test-object test-set test-shape \
 # Tests for header compilation
 @HAVE_GLIB_TRUE@TEST_PROGS = test-blob test-buffer test-common \
 @HAVE_GLIB_TRUE@       test-font test-object test-set test-shape \
-@HAVE_GLIB_TRUE@       test-unicode test-version $(NULL) \
-@HAVE_GLIB_TRUE@       $(am__append_4) $(am__append_5) test-c \
+@HAVE_GLIB_TRUE@       test-subset-cmap test-subset-glyf \
+@HAVE_GLIB_TRUE@       test-subset-hdmx test-subset-hmtx \
+@HAVE_GLIB_TRUE@       test-subset-os2 test-unicode test-version \
+@HAVE_GLIB_TRUE@       $(NULL) $(am__append_4) $(am__append_5) test-c \
 @HAVE_GLIB_TRUE@       test-cplusplus $(NULL)
 @HAVE_GLIB_TRUE@       test-cplusplus $(NULL)
+@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_glyf_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_hdmx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_hmtx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_os2_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 @HAVE_GLIB_TRUE@test_unicode_CPPFLAGS = $(AM_CPPFLAGS) $(GLIB_CFLAGS) \
 @HAVE_GLIB_TRUE@test_unicode_CPPFLAGS = $(AM_CPPFLAGS) $(GLIB_CFLAGS) \
-@HAVE_GLIB_TRUE@       $(am__append_2)
+@HAVE_GLIB_TRUE@       $(NULL) $(am__append_2)
 @HAVE_GLIB_TRUE@test_unicode_LDADD = $(LDADD) $(am__append_3)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@test_ot_math_LDADD = $(LDADD) $(FREETYPE_LIBS)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@test_ot_math_CPPFLAGS = $(AM_CPPFLAGS) $(FREETYPE_CFLAGS)
 @HAVE_GLIB_TRUE@test_cplusplus_SOURCES = test-cplusplus.cc
 @HAVE_GLIB_TRUE@test_unicode_LDADD = $(LDADD) $(am__append_3)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@test_ot_math_LDADD = $(LDADD) $(FREETYPE_LIBS)
 @HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@test_ot_math_CPPFLAGS = $(AM_CPPFLAGS) $(FREETYPE_CFLAGS)
 @HAVE_GLIB_TRUE@test_cplusplus_SOURCES = test-cplusplus.cc
-@HAVE_GLIB_TRUE@test_c_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_7) \
-@HAVE_GLIB_TRUE@       $(am__append_9)
+@HAVE_GLIB_TRUE@test_c_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_6) \
+@HAVE_GLIB_TRUE@       $(am__append_8)
 @HAVE_GLIB_TRUE@test_cplusplus_CPPFLAGS = $(AM_CPPFLAGS) \
 @HAVE_GLIB_TRUE@test_cplusplus_CPPFLAGS = $(AM_CPPFLAGS) \
-@HAVE_GLIB_TRUE@       $(am__append_8) $(am__append_10)
+@HAVE_GLIB_TRUE@       $(am__append_7) $(am__append_9)
 @HAVE_GLIB_TRUE@TESTS_ENVIRONMENT = \
 @HAVE_GLIB_TRUE@       MALLOC_CHECK_=2 \
 @HAVE_GLIB_TRUE@       MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) \
 @HAVE_GLIB_TRUE@TESTS_ENVIRONMENT = \
 @HAVE_GLIB_TRUE@       MALLOC_CHECK_=2 \
 @HAVE_GLIB_TRUE@       MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) \
@@ -753,7 +811,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/api/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits test/api/Makefile
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/api/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits test/api/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -818,6 +875,10 @@ test-object$(EXEEXT): $(test_object_OBJECTS) $(test_object_DEPENDENCIES) $(EXTRA
        @rm -f test-object$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_object_OBJECTS) $(test_object_LDADD) $(LIBS)
 
        @rm -f test-object$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_object_OBJECTS) $(test_object_LDADD) $(LIBS)
 
+test-ot-color$(EXEEXT): $(test_ot_color_OBJECTS) $(test_ot_color_DEPENDENCIES) $(EXTRA_test_ot_color_DEPENDENCIES) 
+       @rm -f test-ot-color$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_ot_color_OBJECTS) $(test_ot_color_LDADD) $(LIBS)
+
 test-ot-math$(EXEEXT): $(test_ot_math_OBJECTS) $(test_ot_math_DEPENDENCIES) $(EXTRA_test_ot_math_DEPENDENCIES) 
        @rm -f test-ot-math$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_ot_math_OBJECTS) $(test_ot_math_LDADD) $(LIBS)
 test-ot-math$(EXEEXT): $(test_ot_math_OBJECTS) $(test_ot_math_DEPENDENCIES) $(EXTRA_test_ot_math_DEPENDENCIES) 
        @rm -f test-ot-math$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_ot_math_OBJECTS) $(test_ot_math_LDADD) $(LIBS)
@@ -834,6 +895,26 @@ test-shape$(EXEEXT): $(test_shape_OBJECTS) $(test_shape_DEPENDENCIES) $(EXTRA_te
        @rm -f test-shape$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_shape_OBJECTS) $(test_shape_LDADD) $(LIBS)
 
        @rm -f test-shape$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(test_shape_OBJECTS) $(test_shape_LDADD) $(LIBS)
 
+test-subset-cmap$(EXEEXT): $(test_subset_cmap_OBJECTS) $(test_subset_cmap_DEPENDENCIES) $(EXTRA_test_subset_cmap_DEPENDENCIES) 
+       @rm -f test-subset-cmap$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_cmap_OBJECTS) $(test_subset_cmap_LDADD) $(LIBS)
+
+test-subset-glyf$(EXEEXT): $(test_subset_glyf_OBJECTS) $(test_subset_glyf_DEPENDENCIES) $(EXTRA_test_subset_glyf_DEPENDENCIES) 
+       @rm -f test-subset-glyf$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_glyf_OBJECTS) $(test_subset_glyf_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)
+
+test-subset-hmtx$(EXEEXT): $(test_subset_hmtx_OBJECTS) $(test_subset_hmtx_DEPENDENCIES) $(EXTRA_test_subset_hmtx_DEPENDENCIES) 
+       @rm -f test-subset-hmtx$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_hmtx_OBJECTS) $(test_subset_hmtx_LDADD) $(LIBS)
+
+test-subset-os2$(EXEEXT): $(test_subset_os2_OBJECTS) $(test_subset_os2_DEPENDENCIES) $(EXTRA_test_subset_os2_DEPENDENCIES) 
+       @rm -f test-subset-os2$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(test_subset_os2_OBJECTS) $(test_subset_os2_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-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)
@@ -853,9 +934,15 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-common.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-font.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-object.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-common.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-font.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-object.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-color.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-tag.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-set.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-shape.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-tag.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-set.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-shape.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-cmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-glyf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-hdmx.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-hmtx.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-os2.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-version.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_c-test-c.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cplusplus-test-cplusplus.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-version.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_c-test-c.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cplusplus-test-cplusplus.Po@am__quote@
@@ -1048,7 +1135,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
        if test -n "$$am__remaking_logs"; then \
          echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
               "recursion detected" >&2; \
        if test -n "$$am__remaking_logs"; then \
          echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
               "recursion detected" >&2; \
-       else \
+       elif test -n "$$redo_logs"; then \
          am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
        fi; \
        if $(am__make_dryrun); then :; else \
          am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
        fi; \
        if $(am__make_dryrun); then :; else \
@@ -1208,6 +1295,41 @@ test-shape.log: test-shape$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
        --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-cmap.log: test-subset-cmap$(EXEEXT)
+       @p='test-subset-cmap$(EXEEXT)'; \
+       b='test-subset-cmap'; \
+       $(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-glyf.log: test-subset-glyf$(EXEEXT)
+       @p='test-subset-glyf$(EXEEXT)'; \
+       b='test-subset-glyf'; \
+       $(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-hdmx.log: test-subset-hdmx$(EXEEXT)
+       @p='test-subset-hdmx$(EXEEXT)'; \
+       b='test-subset-hdmx'; \
+       $(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-hmtx.log: test-subset-hmtx$(EXEEXT)
+       @p='test-subset-hmtx$(EXEEXT)'; \
+       b='test-subset-hmtx'; \
+       $(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'; \
+       $(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.log: test-unicode$(EXEEXT)
        @p='test-unicode$(EXEEXT)'; \
        b='test-unicode'; \
 test-unicode.log: test-unicode$(EXEEXT)
        @p='test-unicode$(EXEEXT)'; \
        b='test-unicode'; \
@@ -1222,6 +1344,13 @@ test-version.log: test-version$(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)
        --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-tag.log: test-ot-tag$(EXEEXT)
        @p='test-ot-tag$(EXEEXT)'; \
        b='test-ot-tag'; \
 test-ot-tag.log: test-ot-tag$(EXEEXT)
        @p='test-ot-tag$(EXEEXT)'; \
        b='test-ot-tag'; \
@@ -1425,6 +1554,8 @@ uninstall-am:
        pdf pdf-am ps ps-am recheck tags tags-am uninstall \
        uninstall-am
 
        pdf pdf-am ps ps-am recheck tags tags-am uninstall \
        uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # Convenience targets:
 lib:
 
 # Convenience targets:
 lib:
diff --git a/test/api/fonts/Inconsolata-Regular.ab.ttf b/test/api/fonts/Inconsolata-Regular.ab.ttf
new file mode 100644 (file)
index 0000000..455cc15
Binary files /dev/null and b/test/api/fonts/Inconsolata-Regular.ab.ttf differ
diff --git a/test/api/fonts/Inconsolata-Regular.abc.ttf b/test/api/fonts/Inconsolata-Regular.abc.ttf
new file mode 100644 (file)
index 0000000..34cf051
Binary files /dev/null and b/test/api/fonts/Inconsolata-Regular.abc.ttf differ
diff --git a/test/api/fonts/Inconsolata-Regular.abc.widerc.ttf b/test/api/fonts/Inconsolata-Regular.abc.widerc.ttf
new file mode 100644 (file)
index 0000000..352f269
Binary files /dev/null and b/test/api/fonts/Inconsolata-Regular.abc.widerc.ttf differ
diff --git a/test/api/fonts/Inconsolata-Regular.ac.ttf b/test/api/fonts/Inconsolata-Regular.ac.ttf
new file mode 100644 (file)
index 0000000..991b8de
Binary files /dev/null and b/test/api/fonts/Inconsolata-Regular.ac.ttf differ
diff --git a/test/api/fonts/Inconsolata-Regular.ac.widerc.ttf b/test/api/fonts/Inconsolata-Regular.ac.widerc.ttf
new file mode 100644 (file)
index 0000000..2050c28
Binary files /dev/null and b/test/api/fonts/Inconsolata-Regular.ac.widerc.ttf differ
diff --git a/test/api/fonts/MathTestFontFull.ttx b/test/api/fonts/MathTestFontFull.ttx
new file mode 100644 (file)
index 0000000..1d1aa53
--- /dev/null
@@ -0,0 +1,6578 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" ttLibVersion="3.0">
+
+  <GlyphOrder>
+    <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+    <GlyphID id="0" name=".notdef"/>
+    <GlyphID id="1" name="space"/>
+    <GlyphID id="2" name="A"/>
+    <GlyphID id="3" name="B"/>
+    <GlyphID id="4" name="C"/>
+    <GlyphID id="5" name="D"/>
+    <GlyphID id="6" name="E"/>
+    <GlyphID id="7" name="F"/>
+    <GlyphID id="8" name="G"/>
+    <GlyphID id="9" name="H"/>
+    <GlyphID id="10" name="I"/>
+    <GlyphID id="11" name="J"/>
+    <GlyphID id="12" name="K"/>
+    <GlyphID id="13" name="L"/>
+    <GlyphID id="14" name="M"/>
+    <GlyphID id="15" name="N"/>
+    <GlyphID id="16" name="O"/>
+    <GlyphID id="17" name="P"/>
+    <GlyphID id="18" name="Q"/>
+    <GlyphID id="19" name="R"/>
+    <GlyphID id="20" name="S"/>
+    <GlyphID id="21" name="T"/>
+    <GlyphID id="22" name="U"/>
+    <GlyphID id="23" name="V"/>
+    <GlyphID id="24" name="W"/>
+    <GlyphID id="25" name="X"/>
+    <GlyphID id="26" name="Y"/>
+    <GlyphID id="27" name="Z"/>
+    <GlyphID id="28" name="underscore"/>
+    <GlyphID id="29" name="braceleft"/>
+    <GlyphID id="30" name="arrowleft"/>
+    <GlyphID id="31" name="arrowup"/>
+    <GlyphID id="32" name="arrowright"/>
+    <GlyphID id="33" name="arrowdown"/>
+    <GlyphID id="34" name="arrowboth"/>
+    <GlyphID id="35" name="arrowupdn"/>
+    <GlyphID id="36" name="uni21A4"/>
+    <GlyphID id="37" name="uni21A5"/>
+    <GlyphID id="38" name="uni21A6"/>
+    <GlyphID id="39" name="uni21A7"/>
+    <GlyphID id="40" name="uni21C7"/>
+    <GlyphID id="41" name="uni21C8"/>
+    <GlyphID id="42" name="uni21C9"/>
+    <GlyphID id="43" name="uni21CA"/>
+    <GlyphID id="44" name="arrowdblleft"/>
+    <GlyphID id="45" name="arrowdblup"/>
+    <GlyphID id="46" name="arrowdblright"/>
+    <GlyphID id="47" name="arrowdbldown"/>
+    <GlyphID id="48" name="arrowdblboth"/>
+    <GlyphID id="49" name="uni21D5"/>
+    <GlyphID id="50" name="uni21E6"/>
+    <GlyphID id="51" name="uni21E7"/>
+    <GlyphID id="52" name="uni21E8"/>
+    <GlyphID id="53" name="uni21E9"/>
+    <GlyphID id="54" name="uni23A7"/>
+    <GlyphID id="55" name="uni23A8"/>
+    <GlyphID id="56" name="uni23A9"/>
+    <GlyphID id="57" name="uni23AA"/>
+    <GlyphID id="58" name="center"/>
+    <GlyphID id="59" name="left"/>
+    <GlyphID id="60" name="right"/>
+    <GlyphID id="61" name="top"/>
+    <GlyphID id="62" name="bottom"/>
+    <GlyphID id="63" name="horizontal"/>
+    <GlyphID id="64" name="vertical"/>
+    <GlyphID id="65" name="uni2190_size2"/>
+    <GlyphID id="66" name="uni2190_size3"/>
+    <GlyphID id="67" name="uni2190_size4"/>
+    <GlyphID id="68" name="uni2191_size2"/>
+    <GlyphID id="69" name="uni2191_size3"/>
+    <GlyphID id="70" name="uni2191_size4"/>
+    <GlyphID id="71" name="uni2191_size5"/>
+    <GlyphID id="72" name="uni2192_size2"/>
+    <GlyphID id="73" name="uni2192_size3"/>
+    <GlyphID id="74" name="uni2192_size4"/>
+    <GlyphID id="75" name="uni2192_size5"/>
+    <GlyphID id="76" name="uni2192_size6"/>
+    <GlyphID id="77" name="uni2193_size2"/>
+    <GlyphID id="78" name="uni2193_size3"/>
+    <GlyphID id="79" name="uni2193_size4"/>
+    <GlyphID id="80" name="uni2193_size5"/>
+    <GlyphID id="81" name="uni2193_size6"/>
+    <GlyphID id="82" name="uni2193_size7"/>
+    <GlyphID id="83" name="uni2195_size2"/>
+    <GlyphID id="84" name="uni21A4_size2"/>
+    <GlyphID id="85" name="uni21A4_size3"/>
+    <GlyphID id="86" name="uni21A5_size2"/>
+    <GlyphID id="87" name="uni21A5_size3"/>
+    <GlyphID id="88" name="uni21A5_size4"/>
+    <GlyphID id="89" name="uni21A6_size2"/>
+    <GlyphID id="90" name="uni21A6_size3"/>
+    <GlyphID id="91" name="uni21A6_size4"/>
+    <GlyphID id="92" name="uni21A6_size5"/>
+    <GlyphID id="93" name="uni21A7_size2"/>
+    <GlyphID id="94" name="uni21A7_size3"/>
+    <GlyphID id="95" name="uni21A7_size4"/>
+    <GlyphID id="96" name="uni21A7_size5"/>
+    <GlyphID id="97" name="uni21A7_size6"/>
+    <GlyphID id="98" name="uni21C7_size2"/>
+    <GlyphID id="99" name="uni21C7_size3"/>
+    <GlyphID id="100" name="uni21C8_size2"/>
+    <GlyphID id="101" name="uni21C8_size3"/>
+    <GlyphID id="102" name="uni21C8_size4"/>
+    <GlyphID id="103" name="uni21C9_size2"/>
+    <GlyphID id="104" name="uni21C9_size3"/>
+    <GlyphID id="105" name="uni21C9_size4"/>
+    <GlyphID id="106" name="uni21C9_size5"/>
+    <GlyphID id="107" name="uni21CA_size2"/>
+    <GlyphID id="108" name="uni21CA_size3"/>
+    <GlyphID id="109" name="uni21CA_size4"/>
+    <GlyphID id="110" name="uni21CA_size5"/>
+    <GlyphID id="111" name="uni21CA_size6"/>
+    <GlyphID id="112" name="uni21D0_size2"/>
+    <GlyphID id="113" name="uni21D0_size3"/>
+    <GlyphID id="114" name="uni21D0_size4"/>
+    <GlyphID id="115" name="uni21D0_size5"/>
+    <GlyphID id="116" name="uni21D1_size2"/>
+    <GlyphID id="117" name="uni21D1_size3"/>
+    <GlyphID id="118" name="uni21D1_size4"/>
+    <GlyphID id="119" name="uni21D1_size5"/>
+    <GlyphID id="120" name="uni21D1_size6"/>
+    <GlyphID id="121" name="uni21D2_size2"/>
+    <GlyphID id="122" name="uni21D2_size3"/>
+    <GlyphID id="123" name="uni21D2_size4"/>
+    <GlyphID id="124" name="uni21D2_size5"/>
+    <GlyphID id="125" name="uni21D2_size6"/>
+    <GlyphID id="126" name="uni21D2_size7"/>
+    <GlyphID id="127" name="uni21D4_size2"/>
+    <GlyphID id="128" name="uni21D5_size2"/>
+    <GlyphID id="129" name="uni21D5_size3"/>
+    <GlyphID id="130" name="uni21E6_size2"/>
+    <GlyphID id="131" name="uni21E6_size3"/>
+    <GlyphID id="132" name="uni21E6_size4"/>
+    <GlyphID id="133" name="uni21E6_size5"/>
+    <GlyphID id="134" name="uni21E6_size6"/>
+    <GlyphID id="135" name="uni21E7_size2"/>
+    <GlyphID id="136" name="uni21E7_size3"/>
+    <GlyphID id="137" name="uni21E7_size4"/>
+    <GlyphID id="138" name="uni21E7_size5"/>
+    <GlyphID id="139" name="uni21E7_size6"/>
+    <GlyphID id="140" name="uni21E7_size7"/>
+    <GlyphID id="141" name="uni21E9_size2"/>
+  </GlyphOrder>
+
+  <head>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="1.0"/>
+    <fontRevision value="1.0"/>
+    <checkSumAdjustment value="0x87faf3a0"/>
+    <magicNumber value="0x5f0f3cf5"/>
+    <flags value="00000000 00001011"/>
+    <unitsPerEm value="1000"/>
+    <created value="Tue Apr 12 14:44:11 2016"/>
+    <modified value="Tue Apr 12 14:44:11 2016"/>
+    <xMin value="0"/>
+    <yMin value="0"/>
+    <xMax value="5300"/>
+    <yMax value="5500"/>
+    <macStyle value="00000000 00000000"/>
+    <lowestRecPPEM value="8"/>
+    <fontDirectionHint value="2"/>
+    <indexToLocFormat value="0"/>
+    <glyphDataFormat value="0"/>
+  </head>
+
+  <hhea>
+    <tableVersion value="1.0"/>
+    <ascent value="1000"/>
+    <descent value="0"/>
+    <lineGap value="108"/>
+    <advanceWidthMax value="1000"/>
+    <minLeftSideBearing value="0"/>
+    <minRightSideBearing value="-4300"/>
+    <xMaxExtent value="5300"/>
+    <caretSlopeRise value="1"/>
+    <caretSlopeRun value="0"/>
+    <caretOffset value="0"/>
+    <reserved0 value="0"/>
+    <reserved1 value="0"/>
+    <reserved2 value="0"/>
+    <reserved3 value="0"/>
+    <metricDataFormat value="0"/>
+    <numberOfHMetrics value="2"/>
+  </hhea>
+
+  <maxp>
+    <tableVersion value="0x5000"/>
+    <numGlyphs value="142"/>
+  </maxp>
+
+  <OS_2>
+    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+         will be recalculated by the compiler -->
+    <version value="4"/>
+    <xAvgCharWidth value="1000"/>
+    <usWeightClass value="400"/>
+    <usWidthClass value="5"/>
+    <fsType value="00000000 00000000"/>
+    <ySubscriptXSize value="780"/>
+    <ySubscriptYSize value="840"/>
+    <ySubscriptXOffset value="0"/>
+    <ySubscriptYOffset value="168"/>
+    <ySuperscriptXSize value="780"/>
+    <ySuperscriptYSize value="840"/>
+    <ySuperscriptXOffset value="0"/>
+    <ySuperscriptYOffset value="576"/>
+    <yStrikeoutSize value="59"/>
+    <yStrikeoutPosition value="310"/>
+    <sFamilyClass value="0"/>
+    <panose>
+      <bFamilyType value="2"/>
+      <bSerifStyle value="0"/>
+      <bWeight value="5"/>
+      <bProportion value="9"/>
+      <bContrast value="0"/>
+      <bStrokeVariation value="0"/>
+      <bArmStyle value="0"/>
+      <bLetterForm value="0"/>
+      <bMidline value="0"/>
+      <bXHeight value="0"/>
+    </panose>
+    <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulUnicodeRange2 value="00000000 00000000 00000000 00100000"/>
+    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+    <achVendID value="\x00\x00\x00\x00"/>
+    <fsSelection value="00000000 10000000"/>
+    <usFirstCharIndex value="32"/>
+    <usLastCharIndex value="9130"/>
+    <sTypoAscender value="1000"/>
+    <sTypoDescender value="0"/>
+    <sTypoLineGap value="108"/>
+    <usWinAscent value="0"/>
+    <usWinDescent value="0"/>
+    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+    <sxHeight value="0"/>
+    <sCapHeight value="1000"/>
+    <usDefaultChar value="32"/>
+    <usBreakChar value="32"/>
+    <usMaxContext value="1"/>
+  </OS_2>
+
+  <name>
+    <namerecord nameID="0" platformID="1" platEncID="0" langID="0x0" unicode="True">
+      Copyright (c) 2016, Igalia S.L. (http://igalia.com/)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded, 
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION &amp; CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+    </namerecord>
+    <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
+      MathTestFontFull
+    </namerecord>
+    <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
+      Regular
+    </namerecord>
+    <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
+      FontForge 2.0 : MathTestFontFull : 12-4-2016
+    </namerecord>
+    <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
+      MathTestFontFull
+    </namerecord>
+    <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
+      Version 001.000 
+    </namerecord>
+    <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
+      MathTestFontFull
+    </namerecord>
+    <namerecord nameID="14" platformID="1" platEncID="0" langID="0x0" unicode="True">
+      http://scripts.sil.org/OFL
+    </namerecord>
+    <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+      Copyright (c) 2016, Igalia S.L. (http://igalia.com/)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded, 
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION &amp; CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+    </namerecord>
+    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+      MathTestFontFull
+    </namerecord>
+    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+      Regular
+    </namerecord>
+    <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+      FontForge 2.0 : MathTestFontFull : 12-4-2016
+    </namerecord>
+    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+      MathTestFontFull
+    </namerecord>
+    <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+      Version 001.000 
+    </namerecord>
+    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+      MathTestFontFull
+    </namerecord>
+    <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+      http://scripts.sil.org/OFL
+    </namerecord>
+  </name>
+
+  <cmap>
+    <tableVersion version="0"/>
+    <cmap_format_4 platformID="0" platEncID="3" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
+      <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
+      <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
+      <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
+      <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
+      <map code="0x47" name="G"/><!-- LATIN CAPITAL LETTER G -->
+      <map code="0x48" name="H"/><!-- LATIN CAPITAL LETTER H -->
+      <map code="0x49" name="I"/><!-- LATIN CAPITAL LETTER I -->
+      <map code="0x4a" name="J"/><!-- LATIN CAPITAL LETTER J -->
+      <map code="0x4b" name="K"/><!-- LATIN CAPITAL LETTER K -->
+      <map code="0x4c" name="L"/><!-- LATIN CAPITAL LETTER L -->
+      <map code="0x4d" name="M"/><!-- LATIN CAPITAL LETTER M -->
+      <map code="0x4e" name="N"/><!-- LATIN CAPITAL LETTER N -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x50" name="P"/><!-- LATIN CAPITAL LETTER P -->
+      <map code="0x51" name="Q"/><!-- LATIN CAPITAL LETTER Q -->
+      <map code="0x52" name="R"/><!-- LATIN CAPITAL LETTER R -->
+      <map code="0x53" name="S"/><!-- LATIN CAPITAL LETTER S -->
+      <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+      <map code="0x55" name="U"/><!-- LATIN CAPITAL LETTER U -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0x57" name="W"/><!-- LATIN CAPITAL LETTER W -->
+      <map code="0x58" name="X"/><!-- LATIN CAPITAL LETTER X -->
+      <map code="0x59" name="Y"/><!-- LATIN CAPITAL LETTER Y -->
+      <map code="0x5a" name="Z"/><!-- LATIN CAPITAL LETTER Z -->
+      <map code="0x5f" name="underscore"/><!-- LOW LINE -->
+      <map code="0x7b" name="braceleft"/><!-- LEFT CURLY BRACKET -->
+      <map code="0x2190" name="arrowleft"/><!-- LEFTWARDS ARROW -->
+      <map code="0x2191" name="arrowup"/><!-- UPWARDS ARROW -->
+      <map code="0x2192" name="arrowright"/><!-- RIGHTWARDS ARROW -->
+      <map code="0x2193" name="arrowdown"/><!-- DOWNWARDS ARROW -->
+      <map code="0x2194" name="arrowboth"/><!-- LEFT RIGHT ARROW -->
+      <map code="0x2195" name="arrowupdn"/><!-- UP DOWN ARROW -->
+      <map code="0x21a4" name="uni21A4"/><!-- LEFTWARDS ARROW FROM BAR -->
+      <map code="0x21a5" name="uni21A5"/><!-- UPWARDS ARROW FROM BAR -->
+      <map code="0x21a6" name="uni21A6"/><!-- RIGHTWARDS ARROW FROM BAR -->
+      <map code="0x21a7" name="uni21A7"/><!-- DOWNWARDS ARROW FROM BAR -->
+      <map code="0x21c7" name="uni21C7"/><!-- LEFTWARDS PAIRED ARROWS -->
+      <map code="0x21c8" name="uni21C8"/><!-- UPWARDS PAIRED ARROWS -->
+      <map code="0x21c9" name="uni21C9"/><!-- RIGHTWARDS PAIRED ARROWS -->
+      <map code="0x21ca" name="uni21CA"/><!-- DOWNWARDS PAIRED ARROWS -->
+      <map code="0x21d0" name="arrowdblleft"/><!-- LEFTWARDS DOUBLE ARROW -->
+      <map code="0x21d1" name="arrowdblup"/><!-- UPWARDS DOUBLE ARROW -->
+      <map code="0x21d2" name="arrowdblright"/><!-- RIGHTWARDS DOUBLE ARROW -->
+      <map code="0x21d3" name="arrowdbldown"/><!-- DOWNWARDS DOUBLE ARROW -->
+      <map code="0x21d4" name="arrowdblboth"/><!-- LEFT RIGHT DOUBLE ARROW -->
+      <map code="0x21d5" name="uni21D5"/><!-- UP DOWN DOUBLE ARROW -->
+      <map code="0x21e6" name="uni21E6"/><!-- LEFTWARDS WHITE ARROW -->
+      <map code="0x21e7" name="uni21E7"/><!-- UPWARDS WHITE ARROW -->
+      <map code="0x21e8" name="uni21E8"/><!-- RIGHTWARDS WHITE ARROW -->
+      <map code="0x21e9" name="uni21E9"/><!-- DOWNWARDS WHITE ARROW -->
+      <map code="0x23a7" name="uni23A7"/><!-- LEFT CURLY BRACKET UPPER HOOK -->
+      <map code="0x23a8" name="uni23A8"/><!-- LEFT CURLY BRACKET MIDDLE PIECE -->
+      <map code="0x23a9" name="uni23A9"/><!-- LEFT CURLY BRACKET LOWER HOOK -->
+      <map code="0x23aa" name="uni23AA"/><!-- CURLY BRACKET EXTENSION -->
+    </cmap_format_4>
+    <cmap_format_0 platformID="1" platEncID="0" language="0">
+      <map code="0x0" name="space"/>
+      <map code="0x1" name=".notdef"/>
+      <map code="0x2" name=".notdef"/>
+      <map code="0x3" name=".notdef"/>
+      <map code="0x4" name=".notdef"/>
+      <map code="0x5" name=".notdef"/>
+      <map code="0x6" name=".notdef"/>
+      <map code="0x7" name=".notdef"/>
+      <map code="0x8" name=".notdef"/>
+      <map code="0x9" name=".notdef"/>
+      <map code="0xa" name=".notdef"/>
+      <map code="0xb" name=".notdef"/>
+      <map code="0xc" name=".notdef"/>
+      <map code="0xd" name=".notdef"/>
+      <map code="0xe" name=".notdef"/>
+      <map code="0xf" name=".notdef"/>
+      <map code="0x10" name=".notdef"/>
+      <map code="0x11" name=".notdef"/>
+      <map code="0x12" name=".notdef"/>
+      <map code="0x13" name=".notdef"/>
+      <map code="0x14" name=".notdef"/>
+      <map code="0x15" name=".notdef"/>
+      <map code="0x16" name=".notdef"/>
+      <map code="0x17" name=".notdef"/>
+      <map code="0x18" name=".notdef"/>
+      <map code="0x19" name=".notdef"/>
+      <map code="0x1a" name=".notdef"/>
+      <map code="0x1b" name=".notdef"/>
+      <map code="0x1c" name=".notdef"/>
+      <map code="0x1d" name=".notdef"/>
+      <map code="0x1e" name=".notdef"/>
+      <map code="0x1f" name=".notdef"/>
+      <map code="0x20" name="space"/>
+      <map code="0x21" name=".notdef"/>
+      <map code="0x22" name=".notdef"/>
+      <map code="0x23" name=".notdef"/>
+      <map code="0x24" name=".notdef"/>
+      <map code="0x25" name=".notdef"/>
+      <map code="0x26" name=".notdef"/>
+      <map code="0x27" name=".notdef"/>
+      <map code="0x28" name=".notdef"/>
+      <map code="0x29" name=".notdef"/>
+      <map code="0x2a" name=".notdef"/>
+      <map code="0x2b" name=".notdef"/>
+      <map code="0x2c" name=".notdef"/>
+      <map code="0x2d" name=".notdef"/>
+      <map code="0x2e" name=".notdef"/>
+      <map code="0x2f" name=".notdef"/>
+      <map code="0x30" name=".notdef"/>
+      <map code="0x31" name=".notdef"/>
+      <map code="0x32" name=".notdef"/>
+      <map code="0x33" name=".notdef"/>
+      <map code="0x34" name=".notdef"/>
+      <map code="0x35" name=".notdef"/>
+      <map code="0x36" name=".notdef"/>
+      <map code="0x37" name=".notdef"/>
+      <map code="0x38" name=".notdef"/>
+      <map code="0x39" name=".notdef"/>
+      <map code="0x3a" name=".notdef"/>
+      <map code="0x3b" name=".notdef"/>
+      <map code="0x3c" name=".notdef"/>
+      <map code="0x3d" name=".notdef"/>
+      <map code="0x3e" name=".notdef"/>
+      <map code="0x3f" name=".notdef"/>
+      <map code="0x40" name=".notdef"/>
+      <map code="0x41" name="A"/>
+      <map code="0x42" name="B"/>
+      <map code="0x43" name="C"/>
+      <map code="0x44" name="D"/>
+      <map code="0x45" name="E"/>
+      <map code="0x46" name="F"/>
+      <map code="0x47" name="G"/>
+      <map code="0x48" name="H"/>
+      <map code="0x49" name="I"/>
+      <map code="0x4a" name="J"/>
+      <map code="0x4b" name="K"/>
+      <map code="0x4c" name="L"/>
+      <map code="0x4d" name="M"/>
+      <map code="0x4e" name="N"/>
+      <map code="0x4f" name="O"/>
+      <map code="0x50" name="P"/>
+      <map code="0x51" name="Q"/>
+      <map code="0x52" name="R"/>
+      <map code="0x53" name="S"/>
+      <map code="0x54" name="T"/>
+      <map code="0x55" name="U"/>
+      <map code="0x56" name="V"/>
+      <map code="0x57" name="W"/>
+      <map code="0x58" name="X"/>
+      <map code="0x59" name="Y"/>
+      <map code="0x5a" name="Z"/>
+      <map code="0x5b" name=".notdef"/>
+      <map code="0x5c" name=".notdef"/>
+      <map code="0x5d" name=".notdef"/>
+      <map code="0x5e" name=".notdef"/>
+      <map code="0x5f" name="underscore"/>
+      <map code="0x60" name=".notdef"/>
+      <map code="0x61" name=".notdef"/>
+      <map code="0x62" name=".notdef"/>
+      <map code="0x63" name=".notdef"/>
+      <map code="0x64" name=".notdef"/>
+      <map code="0x65" name=".notdef"/>
+      <map code="0x66" name=".notdef"/>
+      <map code="0x67" name=".notdef"/>
+      <map code="0x68" name=".notdef"/>
+      <map code="0x69" name=".notdef"/>
+      <map code="0x6a" name=".notdef"/>
+      <map code="0x6b" name=".notdef"/>
+      <map code="0x6c" name=".notdef"/>
+      <map code="0x6d" name=".notdef"/>
+      <map code="0x6e" name=".notdef"/>
+      <map code="0x6f" name=".notdef"/>
+      <map code="0x70" name=".notdef"/>
+      <map code="0x71" name=".notdef"/>
+      <map code="0x72" name=".notdef"/>
+      <map code="0x73" name=".notdef"/>
+      <map code="0x74" name=".notdef"/>
+      <map code="0x75" name=".notdef"/>
+      <map code="0x76" name=".notdef"/>
+      <map code="0x77" name=".notdef"/>
+      <map code="0x78" name=".notdef"/>
+      <map code="0x79" name=".notdef"/>
+      <map code="0x7a" name=".notdef"/>
+      <map code="0x7b" name="braceleft"/>
+      <map code="0x7c" name=".notdef"/>
+      <map code="0x7d" name=".notdef"/>
+      <map code="0x7e" name=".notdef"/>
+      <map code="0x7f" name=".notdef"/>
+      <map code="0x80" name=".notdef"/>
+      <map code="0x81" name=".notdef"/>
+      <map code="0x82" name=".notdef"/>
+      <map code="0x83" name=".notdef"/>
+      <map code="0x84" name=".notdef"/>
+      <map code="0x85" name=".notdef"/>
+      <map code="0x86" name=".notdef"/>
+      <map code="0x87" name=".notdef"/>
+      <map code="0x88" name=".notdef"/>
+      <map code="0x89" name=".notdef"/>
+      <map code="0x8a" name=".notdef"/>
+      <map code="0x8b" name=".notdef"/>
+      <map code="0x8c" name=".notdef"/>
+      <map code="0x8d" name=".notdef"/>
+      <map code="0x8e" name=".notdef"/>
+      <map code="0x8f" name=".notdef"/>
+      <map code="0x90" name=".notdef"/>
+      <map code="0x91" name=".notdef"/>
+      <map code="0x92" name=".notdef"/>
+      <map code="0x93" name=".notdef"/>
+      <map code="0x94" name=".notdef"/>
+      <map code="0x95" name=".notdef"/>
+      <map code="0x96" name=".notdef"/>
+      <map code="0x97" name=".notdef"/>
+      <map code="0x98" name=".notdef"/>
+      <map code="0x99" name=".notdef"/>
+      <map code="0x9a" name=".notdef"/>
+      <map code="0x9b" name=".notdef"/>
+      <map code="0x9c" name=".notdef"/>
+      <map code="0x9d" name=".notdef"/>
+      <map code="0x9e" name=".notdef"/>
+      <map code="0x9f" name=".notdef"/>
+      <map code="0xa0" name=".notdef"/>
+      <map code="0xa1" name=".notdef"/>
+      <map code="0xa2" name=".notdef"/>
+      <map code="0xa3" name=".notdef"/>
+      <map code="0xa4" name=".notdef"/>
+      <map code="0xa5" name=".notdef"/>
+      <map code="0xa6" name=".notdef"/>
+      <map code="0xa7" name=".notdef"/>
+      <map code="0xa8" name=".notdef"/>
+      <map code="0xa9" name=".notdef"/>
+      <map code="0xaa" name=".notdef"/>
+      <map code="0xab" name=".notdef"/>
+      <map code="0xac" name=".notdef"/>
+      <map code="0xad" name=".notdef"/>
+      <map code="0xae" name=".notdef"/>
+      <map code="0xaf" name=".notdef"/>
+      <map code="0xb0" name=".notdef"/>
+      <map code="0xb1" name=".notdef"/>
+      <map code="0xb2" name=".notdef"/>
+      <map code="0xb3" name=".notdef"/>
+      <map code="0xb4" name=".notdef"/>
+      <map code="0xb5" name=".notdef"/>
+      <map code="0xb6" name=".notdef"/>
+      <map code="0xb7" name=".notdef"/>
+      <map code="0xb8" name=".notdef"/>
+      <map code="0xb9" name=".notdef"/>
+      <map code="0xba" name=".notdef"/>
+      <map code="0xbb" name=".notdef"/>
+      <map code="0xbc" name=".notdef"/>
+      <map code="0xbd" name=".notdef"/>
+      <map code="0xbe" name=".notdef"/>
+      <map code="0xbf" name=".notdef"/>
+      <map code="0xc0" name=".notdef"/>
+      <map code="0xc1" name=".notdef"/>
+      <map code="0xc2" name=".notdef"/>
+      <map code="0xc3" name=".notdef"/>
+      <map code="0xc4" name=".notdef"/>
+      <map code="0xc5" name=".notdef"/>
+      <map code="0xc6" name=".notdef"/>
+      <map code="0xc7" name=".notdef"/>
+      <map code="0xc8" name=".notdef"/>
+      <map code="0xc9" name=".notdef"/>
+      <map code="0xca" name=".notdef"/>
+      <map code="0xcb" name=".notdef"/>
+      <map code="0xcc" name=".notdef"/>
+      <map code="0xcd" name=".notdef"/>
+      <map code="0xce" name=".notdef"/>
+      <map code="0xcf" name=".notdef"/>
+      <map code="0xd0" name=".notdef"/>
+      <map code="0xd1" name=".notdef"/>
+      <map code="0xd2" name=".notdef"/>
+      <map code="0xd3" name=".notdef"/>
+      <map code="0xd4" name=".notdef"/>
+      <map code="0xd5" name=".notdef"/>
+      <map code="0xd6" name=".notdef"/>
+      <map code="0xd7" name=".notdef"/>
+      <map code="0xd8" name=".notdef"/>
+      <map code="0xd9" name=".notdef"/>
+      <map code="0xda" name=".notdef"/>
+      <map code="0xdb" name=".notdef"/>
+      <map code="0xdc" name=".notdef"/>
+      <map code="0xdd" name=".notdef"/>
+      <map code="0xde" name=".notdef"/>
+      <map code="0xdf" name=".notdef"/>
+      <map code="0xe0" name=".notdef"/>
+      <map code="0xe1" name=".notdef"/>
+      <map code="0xe2" name=".notdef"/>
+      <map code="0xe3" name=".notdef"/>
+      <map code="0xe4" name=".notdef"/>
+      <map code="0xe5" name=".notdef"/>
+      <map code="0xe6" name=".notdef"/>
+      <map code="0xe7" name=".notdef"/>
+      <map code="0xe8" name=".notdef"/>
+      <map code="0xe9" name=".notdef"/>
+      <map code="0xea" name=".notdef"/>
+      <map code="0xeb" name=".notdef"/>
+      <map code="0xec" name=".notdef"/>
+      <map code="0xed" name=".notdef"/>
+      <map code="0xee" name=".notdef"/>
+      <map code="0xef" name=".notdef"/>
+      <map code="0xf0" name=".notdef"/>
+      <map code="0xf1" name=".notdef"/>
+      <map code="0xf2" name=".notdef"/>
+      <map code="0xf3" name=".notdef"/>
+      <map code="0xf4" name=".notdef"/>
+      <map code="0xf5" name=".notdef"/>
+      <map code="0xf6" name=".notdef"/>
+      <map code="0xf7" name=".notdef"/>
+      <map code="0xf8" name=".notdef"/>
+      <map code="0xf9" name=".notdef"/>
+      <map code="0xfa" name=".notdef"/>
+      <map code="0xfb" name=".notdef"/>
+      <map code="0xfc" name=".notdef"/>
+      <map code="0xfd" name=".notdef"/>
+      <map code="0xfe" name=".notdef"/>
+      <map code="0xff" name=".notdef"/>
+    </cmap_format_0>
+    <cmap_format_4 platformID="3" platEncID="1" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
+      <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
+      <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
+      <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
+      <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
+      <map code="0x47" name="G"/><!-- LATIN CAPITAL LETTER G -->
+      <map code="0x48" name="H"/><!-- LATIN CAPITAL LETTER H -->
+      <map code="0x49" name="I"/><!-- LATIN CAPITAL LETTER I -->
+      <map code="0x4a" name="J"/><!-- LATIN CAPITAL LETTER J -->
+      <map code="0x4b" name="K"/><!-- LATIN CAPITAL LETTER K -->
+      <map code="0x4c" name="L"/><!-- LATIN CAPITAL LETTER L -->
+      <map code="0x4d" name="M"/><!-- LATIN CAPITAL LETTER M -->
+      <map code="0x4e" name="N"/><!-- LATIN CAPITAL LETTER N -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x50" name="P"/><!-- LATIN CAPITAL LETTER P -->
+      <map code="0x51" name="Q"/><!-- LATIN CAPITAL LETTER Q -->
+      <map code="0x52" name="R"/><!-- LATIN CAPITAL LETTER R -->
+      <map code="0x53" name="S"/><!-- LATIN CAPITAL LETTER S -->
+      <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+      <map code="0x55" name="U"/><!-- LATIN CAPITAL LETTER U -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0x57" name="W"/><!-- LATIN CAPITAL LETTER W -->
+      <map code="0x58" name="X"/><!-- LATIN CAPITAL LETTER X -->
+      <map code="0x59" name="Y"/><!-- LATIN CAPITAL LETTER Y -->
+      <map code="0x5a" name="Z"/><!-- LATIN CAPITAL LETTER Z -->
+      <map code="0x5f" name="underscore"/><!-- LOW LINE -->
+      <map code="0x7b" name="braceleft"/><!-- LEFT CURLY BRACKET -->
+      <map code="0x2190" name="arrowleft"/><!-- LEFTWARDS ARROW -->
+      <map code="0x2191" name="arrowup"/><!-- UPWARDS ARROW -->
+      <map code="0x2192" name="arrowright"/><!-- RIGHTWARDS ARROW -->
+      <map code="0x2193" name="arrowdown"/><!-- DOWNWARDS ARROW -->
+      <map code="0x2194" name="arrowboth"/><!-- LEFT RIGHT ARROW -->
+      <map code="0x2195" name="arrowupdn"/><!-- UP DOWN ARROW -->
+      <map code="0x21a4" name="uni21A4"/><!-- LEFTWARDS ARROW FROM BAR -->
+      <map code="0x21a5" name="uni21A5"/><!-- UPWARDS ARROW FROM BAR -->
+      <map code="0x21a6" name="uni21A6"/><!-- RIGHTWARDS ARROW FROM BAR -->
+      <map code="0x21a7" name="uni21A7"/><!-- DOWNWARDS ARROW FROM BAR -->
+      <map code="0x21c7" name="uni21C7"/><!-- LEFTWARDS PAIRED ARROWS -->
+      <map code="0x21c8" name="uni21C8"/><!-- UPWARDS PAIRED ARROWS -->
+      <map code="0x21c9" name="uni21C9"/><!-- RIGHTWARDS PAIRED ARROWS -->
+      <map code="0x21ca" name="uni21CA"/><!-- DOWNWARDS PAIRED ARROWS -->
+      <map code="0x21d0" name="arrowdblleft"/><!-- LEFTWARDS DOUBLE ARROW -->
+      <map code="0x21d1" name="arrowdblup"/><!-- UPWARDS DOUBLE ARROW -->
+      <map code="0x21d2" name="arrowdblright"/><!-- RIGHTWARDS DOUBLE ARROW -->
+      <map code="0x21d3" name="arrowdbldown"/><!-- DOWNWARDS DOUBLE ARROW -->
+      <map code="0x21d4" name="arrowdblboth"/><!-- LEFT RIGHT DOUBLE ARROW -->
+      <map code="0x21d5" name="uni21D5"/><!-- UP DOWN DOUBLE ARROW -->
+      <map code="0x21e6" name="uni21E6"/><!-- LEFTWARDS WHITE ARROW -->
+      <map code="0x21e7" name="uni21E7"/><!-- UPWARDS WHITE ARROW -->
+      <map code="0x21e8" name="uni21E8"/><!-- RIGHTWARDS WHITE ARROW -->
+      <map code="0x21e9" name="uni21E9"/><!-- DOWNWARDS WHITE ARROW -->
+      <map code="0x23a7" name="uni23A7"/><!-- LEFT CURLY BRACKET UPPER HOOK -->
+      <map code="0x23a8" name="uni23A8"/><!-- LEFT CURLY BRACKET MIDDLE PIECE -->
+      <map code="0x23a9" name="uni23A9"/><!-- LEFT CURLY BRACKET LOWER HOOK -->
+      <map code="0x23aa" name="uni23AA"/><!-- CURLY BRACKET EXTENSION -->
+    </cmap_format_4>
+  </cmap>
+
+  <post>
+    <formatType value="3.0"/>
+    <italicAngle value="0.0"/>
+    <underlinePosition value="-125"/>
+    <underlineThickness value="50"/>
+    <isFixedPitch value="1"/>
+    <minMemType42 value="0"/>
+    <maxMemType42 value="0"/>
+    <minMemType1 value="0"/>
+    <maxMemType1 value="0"/>
+  </post>
+
+  <CFF>
+    <CFFFont name="MathTestFontFull">
+      <version value="001.000"/>
+      <Notice value="Copyright (c) 2016 Igalia S.L."/>
+      <FullName value="MathTestFontFull"/>
+      <FamilyName value="MathTestFontFull"/>
+      <Weight value="Regular"/>
+      <isFixedPitch value="1"/>
+      <ItalicAngle value="0"/>
+      <UnderlineThickness value="50"/>
+      <PaintType value="0"/>
+      <CharstringType value="2"/>
+      <FontMatrix value="0.001 0 0 0.001 0 0"/>
+      <FontBBox value="0 0 5300 5500"/>
+      <StrokeWidth value="0"/>
+      <!-- charset is dumped separately as the 'GlyphOrder' element -->
+      <Encoding name="StandardEncoding"/>
+      <Private>
+        <BlueValues value="-20 0 1000 1000"/>
+        <BlueScale value="0.039625"/>
+        <BlueShift value="0"/>
+        <BlueFuzz value="1"/>
+        <StdHW value="250"/>
+        <StdVW value="1000"/>
+        <StemSnapH value="166 200 250 333 500"/>
+        <StemSnapV value="166 200 250 333 500 1000"/>
+        <ForceBold value="0"/>
+        <LanguageGroup value="0"/>
+        <ExpansionFactor value="0.06"/>
+        <initialRandomSeed value="0"/>
+        <defaultWidthX value="1000"/>
+        <nominalWidthX value="0"/>
+        <Subrs>
+          <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+          <CharString index="0">
+            1000 1000 -1000 hlineto
+            return
+          </CharString>
+        </Subrs>
+      </Private>
+      <CharStrings>
+        <CharString name=".notdef">
+          0 50 566 50 hstem
+          50 50 800 50 vstem
+          50 hmoveto
+          900 666 -900 hlineto
+          50 -616 rmoveto
+          566 800 -566 vlineto
+          endchar
+        </CharString>
+        <CharString name="A">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="B">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="C">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="D">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="E">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="F">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="G">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="H">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="I">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="J">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="K">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="L">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="M">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="N">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="O">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="P">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="Q">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="R">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="S">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="T">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="U">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="V">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="W">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="X">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="Y">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="Z">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowboth">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowdblboth">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowdbldown">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowdblleft">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowdblright">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowdblup">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowdown">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowleft">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowright">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowup">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="arrowupdn">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="bottom">
+          0 200 800 -20 hstem
+          400 200 vstem
+          0 vmoveto
+          1000 200 -400 800 -200 -800 -400 hlineto
+          endchar
+        </CharString>
+        <CharString name="braceleft">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="center">
+          21 -21 400 200 400 -20 hstem
+          400 200 vstem
+          400 hmoveto
+          200 400 400 200 -400 400 -200 -400 -400 -200 400 hlineto
+          endchar
+        </CharString>
+        <CharString name="horizontal">
+          400 200 hstem
+          400 vmoveto
+          1000 200 -1000 hlineto
+          endchar
+        </CharString>
+        <CharString name="left">
+          21 -21 400 200 400 -20 hstem
+          0 200 vstem
+          0 vmoveto
+          200 400 800 200 -800 400 -200 hlineto
+          endchar
+        </CharString>
+        <CharString name="right">
+          21 -21 400 200 400 -20 hstem
+          800 200 vstem
+          800 hmoveto
+          200 1000 -200 -400 -800 -200 800 hlineto
+          endchar
+        </CharString>
+        <CharString name="space">
+          endchar
+        </CharString>
+        <CharString name="top">
+          21 -21 800 200 hstem
+          400 200 vstem
+          400 hmoveto
+          200 800 400 200 -1000 -200 400 hlineto
+          endchar
+        </CharString>
+        <CharString name="underscore">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni2190_size2">
+          0 250 hstem
+          0 vmoveto
+          2150 250 -2150 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2190_size3">
+          0 200 hstem
+          0 vmoveto
+          2400 200 -2400 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2190_size4">
+          0 166 hstem
+          0 vmoveto
+          2900 166 -2900 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2191_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 2250 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2191_size3">
+          21 -21 hstem
+          0 200 vstem
+          0 vmoveto
+          200 2500 -200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2191_size4">
+          21 -21 hstem
+          0 166 vstem
+          0 vmoveto
+          166 3000 -166 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2191_size5">
+          21 -21 hstem
+          0 500 vstem
+          0 vmoveto
+          500 3750 -500 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2192_size2">
+          0 250 hstem
+          0 vmoveto
+          2350 250 -2350 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2192_size3">
+          0 200 hstem
+          0 vmoveto
+          2600 200 -2600 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2192_size4">
+          0 166 hstem
+          0 vmoveto
+          3100 166 -3100 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2192_size5">
+          0 500 hstem
+          0 vmoveto
+          3850 500 -3850 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2192_size6">
+          0 333 hstem
+          0 vmoveto
+          4100 333 -4100 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2193_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 2450 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2193_size3">
+          21 -21 hstem
+          0 200 vstem
+          0 vmoveto
+          200 2700 -200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2193_size4">
+          21 -21 hstem
+          0 166 vstem
+          0 vmoveto
+          166 3200 -166 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2193_size5">
+          21 -21 hstem
+          0 500 vstem
+          0 vmoveto
+          500 3950 -500 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2193_size6">
+          21 -21 hstem
+          0 333 vstem
+          0 vmoveto
+          333 4200 -333 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2193_size7">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 4700 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni2195_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 2650 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A4">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21A4_size2">
+          0 250 hstem
+          0 vmoveto
+          2250 250 -2250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A4_size3">
+          0 200 hstem
+          0 vmoveto
+          2500 200 -2500 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A5">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21A5_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 2350 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A5_size3">
+          21 -21 hstem
+          0 200 vstem
+          0 vmoveto
+          200 2600 -200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A5_size4">
+          21 -21 hstem
+          0 166 vstem
+          0 vmoveto
+          166 3100 -166 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A6">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21A6_size2">
+          0 250 hstem
+          0 vmoveto
+          2450 250 -2450 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A6_size3">
+          0 200 hstem
+          0 vmoveto
+          2700 200 -2700 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A6_size4">
+          0 166 hstem
+          0 vmoveto
+          3200 166 -3200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A6_size5">
+          0 500 hstem
+          0 vmoveto
+          3950 500 -3950 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A7">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21A7_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 2550 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A7_size3">
+          21 -21 hstem
+          0 200 vstem
+          0 vmoveto
+          200 2800 -200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A7_size4">
+          21 -21 hstem
+          0 166 vstem
+          0 vmoveto
+          166 3300 -166 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A7_size5">
+          21 -21 hstem
+          0 500 vstem
+          0 vmoveto
+          500 4050 -500 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21A7_size6">
+          21 -21 hstem
+          0 333 vstem
+          0 vmoveto
+          333 4300 -333 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21C7">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21C7_size2">
+          0 250 hstem
+          0 vmoveto
+          1950 250 -1950 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21C7_size3">
+          0 200 hstem
+          0 vmoveto
+          2200 200 -2200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21C8">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21C8_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 2050 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21C8_size3">
+          21 -21 hstem
+          0 200 vstem
+          0 vmoveto
+          200 2300 -200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21C8_size4">
+          21 -21 hstem
+          0 166 vstem
+          0 vmoveto
+          166 2800 -166 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21C9">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21C9_size2">
+          0 250 hstem
+          0 vmoveto
+          2150 250 -2150 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21C9_size3">
+          0 200 hstem
+          0 vmoveto
+          2400 200 -2400 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21C9_size4">
+          0 166 hstem
+          0 vmoveto
+          2900 166 -2900 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21C9_size5">
+          0 500 hstem
+          0 vmoveto
+          3650 500 -3650 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21CA">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21CA_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 2250 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21CA_size3">
+          21 -21 hstem
+          0 200 vstem
+          0 vmoveto
+          200 2500 -200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21CA_size4">
+          21 -21 hstem
+          0 166 vstem
+          0 vmoveto
+          166 3000 -166 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21CA_size5">
+          21 -21 hstem
+          0 500 vstem
+          0 vmoveto
+          500 3750 -500 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21CA_size6">
+          21 -21 hstem
+          0 333 vstem
+          0 vmoveto
+          333 4000 -333 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D0_size2">
+          0 250 hstem
+          0 vmoveto
+          2850 250 -2850 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D0_size3">
+          0 200 hstem
+          0 vmoveto
+          3100 200 -3100 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D0_size4">
+          0 166 hstem
+          0 vmoveto
+          3600 166 -3600 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D0_size5">
+          0 500 hstem
+          0 vmoveto
+          4350 500 -4350 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D1_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 2950 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D1_size3">
+          21 -21 hstem
+          0 200 vstem
+          0 vmoveto
+          200 3200 -200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D1_size4">
+          21 -21 hstem
+          0 166 vstem
+          0 vmoveto
+          166 3700 -166 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D1_size5">
+          21 -21 hstem
+          0 500 vstem
+          0 vmoveto
+          500 4450 -500 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D1_size6">
+          21 -21 hstem
+          0 333 vstem
+          0 vmoveto
+          333 4700 -333 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D2_size2">
+          0 250 hstem
+          0 vmoveto
+          3050 250 -3050 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D2_size3">
+          0 200 hstem
+          0 vmoveto
+          3300 200 -3300 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D2_size4">
+          0 166 hstem
+          0 vmoveto
+          3800 166 -3800 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D2_size5">
+          0 500 hstem
+          0 vmoveto
+          4550 500 -4550 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D2_size6">
+          0 333 hstem
+          0 vmoveto
+          4800 333 -4800 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D2_size7">
+          0 250 hstem
+          0 vmoveto
+          5300 250 -5300 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D4_size2">
+          0 250 hstem
+          0 vmoveto
+          3250 250 -3250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D5">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21D5_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 3350 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21D5_size3">
+          21 -21 hstem
+          0 200 vstem
+          0 vmoveto
+          200 3600 -200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E6">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21E6_size2">
+          0 250 hstem
+          0 vmoveto
+          3150 250 -3150 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E6_size3">
+          0 200 hstem
+          0 vmoveto
+          3400 200 -3400 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E6_size4">
+          0 166 hstem
+          0 vmoveto
+          3900 166 -3900 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E6_size5">
+          0 500 hstem
+          0 vmoveto
+          4650 500 -4650 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E6_size6">
+          0 333 hstem
+          0 vmoveto
+          4900 333 -4900 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E7">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21E7_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 3250 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E7_size3">
+          21 -21 hstem
+          0 200 vstem
+          0 vmoveto
+          200 3500 -200 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E7_size4">
+          21 -21 hstem
+          0 166 vstem
+          0 vmoveto
+          166 4000 -166 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E7_size5">
+          21 -21 hstem
+          0 500 vstem
+          0 vmoveto
+          500 4750 -500 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E7_size6">
+          21 -21 hstem
+          0 333 vstem
+          0 vmoveto
+          333 5000 -333 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E7_size7">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 5500 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni21E8">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21E9">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni21E9_size2">
+          21 -21 hstem
+          0 250 vstem
+          0 vmoveto
+          250 3450 -250 hlineto
+          endchar
+        </CharString>
+        <CharString name="uni23A7">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni23A8">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni23A9">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="uni23AA">
+          21 -21 1000 -20 hstem
+          0 1000 vstem
+          0 vmoveto
+          -107 callsubr
+          endchar
+        </CharString>
+        <CharString name="vertical">
+          21 -21 1000 -20 hstem
+          400 200 vstem
+          400 hmoveto
+          200 1000 -200 hlineto
+          endchar
+        </CharString>
+      </CharStrings>
+    </CFFFont>
+
+    <GlobalSubrs>
+      <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+    </GlobalSubrs>
+  </CFF>
+
+  <FFTM>
+    <!-- FontForge's timestamp, font source creation and modification dates -->
+    <version value="1"/>
+    <FFTimeStamp value="Sun Mar 20 10:09:51 2016"/>
+    <sourceCreated value="Tue Apr 12 14:44:11 2016"/>
+    <sourceModified value="Tue Apr 12 14:44:11 2016"/>
+  </FFTM>
+
+  <MATH>
+    <Version value="1.0"/>
+    <MathConstants>
+      <ScriptPercentScaleDown value="87"/>
+      <ScriptScriptPercentScaleDown value="76"/>
+      <DelimitedSubFormulaMinHeight value="100"/>
+      <DisplayOperatorMinHeight value="200"/>
+      <MathLeading>
+        <Value value="300"/>
+      </MathLeading>
+      <AxisHeight>
+        <Value value="400"/>
+      </AxisHeight>
+      <AccentBaseHeight>
+        <Value value="500"/>
+      </AccentBaseHeight>
+      <FlattenedAccentBaseHeight>
+        <Value value="600"/>
+      </FlattenedAccentBaseHeight>
+      <SubscriptShiftDown>
+        <Value value="700"/>
+      </SubscriptShiftDown>
+      <SubscriptTopMax>
+        <Value value="800"/>
+      </SubscriptTopMax>
+      <SubscriptBaselineDropMin>
+        <Value value="900"/>
+      </SubscriptBaselineDropMin>
+      <SuperscriptShiftUp>
+        <Value value="1100"/>
+      </SuperscriptShiftUp>
+      <SuperscriptShiftUpCramped>
+        <Value value="1200"/>
+      </SuperscriptShiftUpCramped>
+      <SuperscriptBottomMin>
+        <Value value="1300"/>
+      </SuperscriptBottomMin>
+      <SuperscriptBaselineDropMax>
+        <Value value="1400"/>
+      </SuperscriptBaselineDropMax>
+      <SubSuperscriptGapMin>
+        <Value value="1500"/>
+      </SubSuperscriptGapMin>
+      <SuperscriptBottomMaxWithSubscript>
+        <Value value="1600"/>
+      </SuperscriptBottomMaxWithSubscript>
+      <SpaceAfterScript>
+        <Value value="1700"/>
+      </SpaceAfterScript>
+      <UpperLimitGapMin>
+        <Value value="1800"/>
+      </UpperLimitGapMin>
+      <UpperLimitBaselineRiseMin>
+        <Value value="1900"/>
+      </UpperLimitBaselineRiseMin>
+      <LowerLimitGapMin>
+        <Value value="2200"/>
+      </LowerLimitGapMin>
+      <LowerLimitBaselineDropMin>
+        <Value value="2300"/>
+      </LowerLimitBaselineDropMin>
+      <StackTopShiftUp>
+        <Value value="2400"/>
+      </StackTopShiftUp>
+      <StackTopDisplayStyleShiftUp>
+        <Value value="2500"/>
+      </StackTopDisplayStyleShiftUp>
+      <StackBottomShiftDown>
+        <Value value="2600"/>
+      </StackBottomShiftDown>
+      <StackBottomDisplayStyleShiftDown>
+        <Value value="2700"/>
+      </StackBottomDisplayStyleShiftDown>
+      <StackGapMin>
+        <Value value="2800"/>
+      </StackGapMin>
+      <StackDisplayStyleGapMin>
+        <Value value="2900"/>
+      </StackDisplayStyleGapMin>
+      <StretchStackTopShiftUp>
+        <Value value="3000"/>
+      </StretchStackTopShiftUp>
+      <StretchStackBottomShiftDown>
+        <Value value="3100"/>
+      </StretchStackBottomShiftDown>
+      <StretchStackGapAboveMin>
+        <Value value="3200"/>
+      </StretchStackGapAboveMin>
+      <StretchStackGapBelowMin>
+        <Value value="3300"/>
+      </StretchStackGapBelowMin>
+      <FractionNumeratorShiftUp>
+        <Value value="3400"/>
+      </FractionNumeratorShiftUp>
+      <FractionNumeratorDisplayStyleShiftUp>
+        <Value value="3500"/>
+      </FractionNumeratorDisplayStyleShiftUp>
+      <FractionDenominatorShiftDown>
+        <Value value="3600"/>
+      </FractionDenominatorShiftDown>
+      <FractionDenominatorDisplayStyleShiftDown>
+        <Value value="3700"/>
+      </FractionDenominatorDisplayStyleShiftDown>
+      <FractionNumeratorGapMin>
+        <Value value="3800"/>
+      </FractionNumeratorGapMin>
+      <FractionNumDisplayStyleGapMin>
+        <Value value="3900"/>
+      </FractionNumDisplayStyleGapMin>
+      <FractionRuleThickness>
+        <Value value="4000"/>
+      </FractionRuleThickness>
+      <FractionDenominatorGapMin>
+        <Value value="4100"/>
+      </FractionDenominatorGapMin>
+      <FractionDenomDisplayStyleGapMin>
+        <Value value="4200"/>
+      </FractionDenomDisplayStyleGapMin>
+      <SkewedFractionHorizontalGap>
+        <Value value="4300"/>
+      </SkewedFractionHorizontalGap>
+      <SkewedFractionVerticalGap>
+        <Value value="4400"/>
+      </SkewedFractionVerticalGap>
+      <OverbarVerticalGap>
+        <Value value="4500"/>
+      </OverbarVerticalGap>
+      <OverbarRuleThickness>
+        <Value value="4600"/>
+      </OverbarRuleThickness>
+      <OverbarExtraAscender>
+        <Value value="4700"/>
+      </OverbarExtraAscender>
+      <UnderbarVerticalGap>
+        <Value value="4800"/>
+      </UnderbarVerticalGap>
+      <UnderbarRuleThickness>
+        <Value value="4900"/>
+      </UnderbarRuleThickness>
+      <UnderbarExtraDescender>
+        <Value value="5000"/>
+      </UnderbarExtraDescender>
+      <RadicalVerticalGap>
+        <Value value="5100"/>
+      </RadicalVerticalGap>
+      <RadicalDisplayStyleVerticalGap>
+        <Value value="5200"/>
+      </RadicalDisplayStyleVerticalGap>
+      <RadicalRuleThickness>
+        <Value value="5300"/>
+      </RadicalRuleThickness>
+      <RadicalExtraAscender>
+        <Value value="5400"/>
+      </RadicalExtraAscender>
+      <RadicalKernBeforeDegree>
+        <Value value="5500"/>
+      </RadicalKernBeforeDegree>
+      <RadicalKernAfterDegree>
+        <Value value="5600"/>
+      </RadicalKernAfterDegree>
+      <RadicalDegreeBottomRaisePercent value="65"/>
+    </MathConstants>
+    <MathGlyphInfo>
+      <MathItalicsCorrectionInfo>
+        <Coverage Format="2">
+          <Glyph value="A"/>
+          <Glyph value="B"/>
+          <Glyph value="C"/>
+          <Glyph value="D"/>
+          <Glyph value="E"/>
+          <Glyph value="F"/>
+          <Glyph value="G"/>
+          <Glyph value="H"/>
+          <Glyph value="I"/>
+          <Glyph value="J"/>
+          <Glyph value="K"/>
+          <Glyph value="L"/>
+          <Glyph value="M"/>
+          <Glyph value="N"/>
+          <Glyph value="O"/>
+          <Glyph value="P"/>
+          <Glyph value="Q"/>
+          <Glyph value="R"/>
+          <Glyph value="S"/>
+          <Glyph value="T"/>
+          <Glyph value="U"/>
+          <Glyph value="V"/>
+          <Glyph value="W"/>
+          <Glyph value="X"/>
+          <Glyph value="Y"/>
+          <Glyph value="Z"/>
+          <Glyph value="arrowleft"/>
+          <Glyph value="arrowup"/>
+          <Glyph value="arrowright"/>
+          <Glyph value="arrowdown"/>
+          <Glyph value="arrowboth"/>
+          <Glyph value="arrowupdn"/>
+          <Glyph value="uni21A4"/>
+          <Glyph value="uni21A5"/>
+          <Glyph value="uni21A6"/>
+          <Glyph value="uni21A7"/>
+          <Glyph value="uni21C7"/>
+          <Glyph value="uni21C8"/>
+          <Glyph value="uni21C9"/>
+          <Glyph value="uni21CA"/>
+          <Glyph value="arrowdblleft"/>
+          <Glyph value="arrowdblup"/>
+          <Glyph value="arrowdblright"/>
+          <Glyph value="arrowdbldown"/>
+          <Glyph value="arrowdblboth"/>
+          <Glyph value="uni21D5"/>
+          <Glyph value="uni21E6"/>
+          <Glyph value="uni21E7"/>
+          <Glyph value="uni21E8"/>
+          <Glyph value="uni21E9"/>
+          <Glyph value="uni2190_size2"/>
+          <Glyph value="uni2190_size3"/>
+          <Glyph value="uni2190_size4"/>
+          <Glyph value="uni2191_size2"/>
+          <Glyph value="uni2191_size3"/>
+          <Glyph value="uni2191_size4"/>
+          <Glyph value="uni2191_size5"/>
+          <Glyph value="uni2192_size2"/>
+          <Glyph value="uni2192_size3"/>
+          <Glyph value="uni2192_size4"/>
+          <Glyph value="uni2192_size5"/>
+          <Glyph value="uni2192_size6"/>
+          <Glyph value="uni2193_size2"/>
+          <Glyph value="uni2193_size3"/>
+          <Glyph value="uni2193_size4"/>
+          <Glyph value="uni2193_size5"/>
+          <Glyph value="uni2193_size6"/>
+          <Glyph value="uni2193_size7"/>
+          <Glyph value="uni2195_size2"/>
+          <Glyph value="uni21A4_size2"/>
+          <Glyph value="uni21A4_size3"/>
+          <Glyph value="uni21A5_size2"/>
+          <Glyph value="uni21A5_size3"/>
+          <Glyph value="uni21A5_size4"/>
+          <Glyph value="uni21A6_size2"/>
+          <Glyph value="uni21A6_size3"/>
+          <Glyph value="uni21A6_size4"/>
+          <Glyph value="uni21A6_size5"/>
+          <Glyph value="uni21A7_size2"/>
+          <Glyph value="uni21A7_size3"/>
+          <Glyph value="uni21A7_size4"/>
+          <Glyph value="uni21A7_size5"/>
+          <Glyph value="uni21A7_size6"/>
+          <Glyph value="uni21C7_size2"/>
+          <Glyph value="uni21C7_size3"/>
+          <Glyph value="uni21C8_size2"/>
+          <Glyph value="uni21C8_size3"/>
+          <Glyph value="uni21C8_size4"/>
+          <Glyph value="uni21C9_size2"/>
+          <Glyph value="uni21C9_size3"/>
+          <Glyph value="uni21C9_size4"/>
+          <Glyph value="uni21C9_size5"/>
+          <Glyph value="uni21CA_size2"/>
+          <Glyph value="uni21CA_size3"/>
+          <Glyph value="uni21CA_size4"/>
+          <Glyph value="uni21CA_size5"/>
+          <Glyph value="uni21CA_size6"/>
+          <Glyph value="uni21D0_size2"/>
+          <Glyph value="uni21D0_size3"/>
+          <Glyph value="uni21D0_size4"/>
+          <Glyph value="uni21D0_size5"/>
+          <Glyph value="uni21D1_size2"/>
+          <Glyph value="uni21D1_size3"/>
+          <Glyph value="uni21D1_size4"/>
+          <Glyph value="uni21D1_size5"/>
+          <Glyph value="uni21D1_size6"/>
+          <Glyph value="uni21D2_size2"/>
+          <Glyph value="uni21D2_size3"/>
+          <Glyph value="uni21D2_size4"/>
+          <Glyph value="uni21D2_size5"/>
+          <Glyph value="uni21D2_size6"/>
+          <Glyph value="uni21D2_size7"/>
+          <Glyph value="uni21D4_size2"/>
+          <Glyph value="uni21D5_size2"/>
+          <Glyph value="uni21D5_size3"/>
+          <Glyph value="uni21E6_size2"/>
+          <Glyph value="uni21E6_size3"/>
+          <Glyph value="uni21E6_size4"/>
+          <Glyph value="uni21E6_size5"/>
+          <Glyph value="uni21E6_size6"/>
+          <Glyph value="uni21E7_size2"/>
+          <Glyph value="uni21E7_size3"/>
+          <Glyph value="uni21E7_size4"/>
+          <Glyph value="uni21E7_size5"/>
+          <Glyph value="uni21E7_size6"/>
+          <Glyph value="uni21E7_size7"/>
+          <Glyph value="uni21E9_size2"/>
+        </Coverage>
+        <!-- ItalicsCorrectionCount=127 -->
+        <ItalicsCorrection index="0">
+          <Value value="197"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="1">
+          <Value value="150"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="2">
+          <Value value="452"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="3">
+          <Value value="405"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="4">
+          <Value value="358"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="5">
+          <Value value="311"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="6">
+          <Value value="264"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="7">
+          <Value value="217"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="8">
+          <Value value="170"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="9">
+          <Value value="123"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="10">
+          <Value value="425"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="11">
+          <Value value="378"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="12">
+          <Value value="331"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="13">
+          <Value value="284"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="14">
+          <Value value="237"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="15">
+          <Value value="190"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="16">
+          <Value value="143"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="17">
+          <Value value="445"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="18">
+          <Value value="398"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="19">
+          <Value value="351"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="20">
+          <Value value="304"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="21">
+          <Value value="257"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="22">
+          <Value value="210"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="23">
+          <Value value="163"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="24">
+          <Value value="116"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="25">
+          <Value value="418"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="26">
+          <Value value="429"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="27">
+          <Value value="382"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="28">
+          <Value value="335"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="29">
+          <Value value="288"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="30">
+          <Value value="241"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="31">
+          <Value value="194"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="32">
+          <Value value="187"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="33">
+          <Value value="140"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="34">
+          <Value value="442"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="35">
+          <Value value="395"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="36">
+          <Value value="287"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="37">
+          <Value value="240"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="38">
+          <Value value="193"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="39">
+          <Value value="146"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="40">
+          <Value value="213"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="41">
+          <Value value="166"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="42">
+          <Value value="119"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="43">
+          <Value value="421"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="44">
+          <Value value="374"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="45">
+          <Value value="327"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="46">
+          <Value value="226"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="47">
+          <Value value="179"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="48">
+          <Value value="132"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="49">
+          <Value value="434"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="50">
+          <Value value="335"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="51">
+          <Value value="288"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="52">
+          <Value value="241"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="53">
+          <Value value="288"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="54">
+          <Value value="241"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="55">
+          <Value value="194"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="56">
+          <Value value="147"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="57">
+          <Value value="241"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="58">
+          <Value value="194"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="59">
+          <Value value="147"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="60">
+          <Value value="449"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="61">
+          <Value value="402"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="62">
+          <Value value="194"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="63">
+          <Value value="147"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="64">
+          <Value value="449"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="65">
+          <Value value="402"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="66">
+          <Value value="355"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="67">
+          <Value value="308"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="68">
+          <Value value="449"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="69">
+          <Value value="442"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="70">
+          <Value value="395"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="71">
+          <Value value="395"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="72">
+          <Value value="348"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="73">
+          <Value value="301"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="74">
+          <Value value="348"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="75">
+          <Value value="301"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="76">
+          <Value value="254"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="77">
+          <Value value="207"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="78">
+          <Value value="301"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="79">
+          <Value value="254"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="80">
+          <Value value="207"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="81">
+          <Value value="160"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="82">
+          <Value value="113"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="83">
+          <Value value="193"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="84">
+          <Value value="146"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="85">
+          <Value value="146"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="86">
+          <Value value="448"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="87">
+          <Value value="401"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="88">
+          <Value value="448"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="89">
+          <Value value="401"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="90">
+          <Value value="354"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="91">
+          <Value value="307"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="92">
+          <Value value="401"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="93">
+          <Value value="354"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="94">
+          <Value value="307"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="95">
+          <Value value="260"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="96">
+          <Value value="213"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="97">
+          <Value value="119"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="98">
+          <Value value="421"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="99">
+          <Value value="374"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="100">
+          <Value value="327"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="101">
+          <Value value="421"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="102">
+          <Value value="374"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="103">
+          <Value value="327"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="104">
+          <Value value="280"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="105">
+          <Value value="233"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="106">
+          <Value value="374"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="107">
+          <Value value="327"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="108">
+          <Value value="280"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="109">
+          <Value value="233"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="110">
+          <Value value="186"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="111">
+          <Value value="139"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="112">
+          <Value value="280"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="113">
+          <Value value="233"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="114">
+          <Value value="186"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="115">
+          <Value value="132"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="116">
+          <Value value="434"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="117">
+          <Value value="387"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="118">
+          <Value value="340"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="119">
+          <Value value="293"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="120">
+          <Value value="434"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="121">
+          <Value value="387"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="122">
+          <Value value="340"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="123">
+          <Value value="293"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="124">
+          <Value value="246"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="125">
+          <Value value="199"/>
+        </ItalicsCorrection>
+        <ItalicsCorrection index="126">
+          <Value value="340"/>
+        </ItalicsCorrection>
+      </MathItalicsCorrectionInfo>
+      <MathTopAccentAttachment>
+        <TopAccentCoverage Format="2">
+          <Glyph value="A"/>
+          <Glyph value="B"/>
+          <Glyph value="C"/>
+          <Glyph value="D"/>
+          <Glyph value="E"/>
+          <Glyph value="F"/>
+          <Glyph value="G"/>
+          <Glyph value="H"/>
+          <Glyph value="I"/>
+          <Glyph value="J"/>
+          <Glyph value="K"/>
+          <Glyph value="L"/>
+          <Glyph value="M"/>
+          <Glyph value="N"/>
+          <Glyph value="O"/>
+          <Glyph value="P"/>
+          <Glyph value="Q"/>
+          <Glyph value="R"/>
+          <Glyph value="S"/>
+          <Glyph value="T"/>
+          <Glyph value="U"/>
+          <Glyph value="V"/>
+          <Glyph value="W"/>
+          <Glyph value="X"/>
+          <Glyph value="Y"/>
+          <Glyph value="Z"/>
+        </TopAccentCoverage>
+        <!-- TopAccentAttachmentCount=26 -->
+        <TopAccentAttachment index="0">
+          <Value value="458"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="1">
+          <Value value="430"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="2">
+          <Value value="402"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="3">
+          <Value value="374"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="4">
+          <Value value="346"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="5">
+          <Value value="318"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="6">
+          <Value value="290"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="7">
+          <Value value="262"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="8">
+          <Value value="234"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="9">
+          <Value value="463"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="10">
+          <Value value="435"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="11">
+          <Value value="407"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="12">
+          <Value value="379"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="13">
+          <Value value="351"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="14">
+          <Value value="323"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="15">
+          <Value value="295"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="16">
+          <Value value="267"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="17">
+          <Value value="239"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="18">
+          <Value value="468"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="19">
+          <Value value="440"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="20">
+          <Value value="412"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="21">
+          <Value value="384"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="22">
+          <Value value="356"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="23">
+          <Value value="328"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="24">
+          <Value value="300"/>
+        </TopAccentAttachment>
+        <TopAccentAttachment index="25">
+          <Value value="272"/>
+        </TopAccentAttachment>
+      </MathTopAccentAttachment>
+      <ExtendedShapeCoverage Format="1">
+        <Glyph value="B"/>
+        <Glyph value="E"/>
+        <Glyph value="H"/>
+        <Glyph value="K"/>
+        <Glyph value="N"/>
+        <Glyph value="Q"/>
+        <Glyph value="T"/>
+        <Glyph value="W"/>
+        <Glyph value="Z"/>
+      </ExtendedShapeCoverage>
+      <MathKernInfo>
+        <MathKernCoverage Format="2">
+          <Glyph value="A"/>
+          <Glyph value="B"/>
+          <Glyph value="C"/>
+          <Glyph value="D"/>
+          <Glyph value="E"/>
+          <Glyph value="F"/>
+          <Glyph value="G"/>
+          <Glyph value="H"/>
+          <Glyph value="I"/>
+          <Glyph value="J"/>
+          <Glyph value="K"/>
+          <Glyph value="L"/>
+          <Glyph value="M"/>
+          <Glyph value="N"/>
+          <Glyph value="O"/>
+          <Glyph value="P"/>
+          <Glyph value="Q"/>
+          <Glyph value="R"/>
+          <Glyph value="S"/>
+          <Glyph value="T"/>
+          <Glyph value="U"/>
+          <Glyph value="V"/>
+          <Glyph value="W"/>
+          <Glyph value="X"/>
+          <Glyph value="Y"/>
+          <Glyph value="Z"/>
+        </MathKernCoverage>
+        <!-- MathKernCount=26 -->
+        <MathKernInfoRecords index="0">
+          <TopLeftMathKern>
+            <!-- HeightCount=5 -->
+            <CorrectionHeight index="0">
+              <Value value="12"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="19"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="26"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="33"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="40"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="17"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="24"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="31"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="38"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="45"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="52"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=0 -->
+            <KernValue index="0">
+              <Value value="25"/>
+            </KernValue>
+          </BottomRightMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=9 -->
+            <CorrectionHeight index="0">
+              <Value value="31"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="57"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="83"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="109"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="135"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="161"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="187"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="213"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="8">
+              <Value value="239"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="29"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="48"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="67"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="86"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="105"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="124"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="143"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="162"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="181"/>
+            </KernValue>
+            <KernValue index="9">
+              <Value value="200"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="1">
+          <TopRightMathKern>
+            <!-- HeightCount=2 -->
+            <CorrectionHeight index="0">
+              <Value value="30"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="55"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="24"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="38"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="52"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=6 -->
+            <CorrectionHeight index="0">
+              <Value value="13"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="21"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="29"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="37"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="45"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="53"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="18"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="26"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="34"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="42"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="50"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="58"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="66"/>
+            </KernValue>
+          </TopLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="2">
+          <TopRightMathKern>
+            <!-- HeightCount=3 -->
+            <CorrectionHeight index="0">
+              <Value value="31"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="57"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="83"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="25"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="40"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="55"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="70"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=7 -->
+            <CorrectionHeight index="0">
+              <Value value="14"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="23"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="32"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="41"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="50"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="59"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="68"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="19"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="28"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="37"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="46"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="55"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="64"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="73"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="82"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=2 -->
+            <CorrectionHeight index="0">
+              <Value value="23"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="41"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="27"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="44"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="61"/>
+            </KernValue>
+          </BottomRightMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=0 -->
+            <KernValue index="0">
+              <Value value="31"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="3">
+          <TopRightMathKern>
+            <!-- HeightCount=4 -->
+            <CorrectionHeight index="0">
+              <Value value="32"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="59"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="86"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="113"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="26"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="42"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="58"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="74"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="90"/>
+            </KernValue>
+          </TopRightMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=3 -->
+            <CorrectionHeight index="0">
+              <Value value="24"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="43"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="62"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="28"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="46"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="64"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="82"/>
+            </KernValue>
+          </BottomRightMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="4">
+          <TopRightMathKern>
+            <!-- HeightCount=5 -->
+            <CorrectionHeight index="0">
+              <Value value="33"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="61"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="89"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="117"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="145"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="27"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="44"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="61"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="78"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="95"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="112"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=9 -->
+            <CorrectionHeight index="0">
+              <Value value="16"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="27"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="38"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="49"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="60"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="71"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="82"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="93"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="8">
+              <Value value="104"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="21"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="32"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="43"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="54"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="65"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="76"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="87"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="98"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="109"/>
+            </KernValue>
+            <KernValue index="9">
+              <Value value="120"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=2 -->
+            <CorrectionHeight index="0">
+              <Value value="12"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="19"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="16"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="22"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="28"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="5">
+          <BottomRightMathKern>
+            <!-- HeightCount=5 -->
+            <CorrectionHeight index="0">
+              <Value value="26"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="47"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="68"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="89"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="110"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="30"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="50"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="90"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="110"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="130"/>
+            </KernValue>
+          </BottomRightMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="6">
+          <TopRightMathKern>
+            <!-- HeightCount=7 -->
+            <CorrectionHeight index="0">
+              <Value value="12"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="19"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="26"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="33"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="40"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="47"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="54"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="29"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="48"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="67"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="86"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="105"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="124"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="143"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="162"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=0 -->
+            <KernValue index="0">
+              <Value value="23"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=6 -->
+            <CorrectionHeight index="0">
+              <Value value="27"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="49"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="71"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="93"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="115"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="137"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="31"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="52"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="73"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="94"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="115"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="136"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="157"/>
+            </KernValue>
+          </BottomRightMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=4 -->
+            <CorrectionHeight index="0">
+              <Value value="14"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="23"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="32"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="41"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="18"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="26"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="34"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="42"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="50"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="7">
+          <TopRightMathKern>
+            <!-- HeightCount=8 -->
+            <CorrectionHeight index="0">
+              <Value value="13"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="21"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="29"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="37"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="45"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="53"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="61"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="69"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="30"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="50"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="90"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="110"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="130"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="150"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="170"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="190"/>
+            </KernValue>
+          </TopRightMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="8">
+          <TopRightMathKern>
+            <!-- HeightCount=9 -->
+            <CorrectionHeight index="0">
+              <Value value="14"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="23"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="32"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="41"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="50"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="59"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="68"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="77"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="8">
+              <Value value="86"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="31"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="52"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="73"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="94"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="115"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="136"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="157"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="178"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="199"/>
+            </KernValue>
+            <KernValue index="9">
+              <Value value="220"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=2 -->
+            <CorrectionHeight index="0">
+              <Value value="20"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="35"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="25"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="40"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="55"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=8 -->
+            <CorrectionHeight index="0">
+              <Value value="29"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="53"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="77"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="101"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="125"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="149"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="173"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="197"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="16"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="22"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="28"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="34"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="40"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="46"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="52"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="58"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="64"/>
+            </KernValue>
+          </BottomRightMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=6 -->
+            <CorrectionHeight index="0">
+              <Value value="16"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="27"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="38"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="49"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="60"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="71"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="20"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="30"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="40"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="50"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="60"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="80"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="9">
+          <TopLeftMathKern>
+            <!-- HeightCount=3 -->
+            <CorrectionHeight index="0">
+              <Value value="21"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="37"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="53"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="26"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="42"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="58"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="74"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=9 -->
+            <CorrectionHeight index="0">
+              <Value value="30"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="55"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="80"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="105"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="130"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="155"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="180"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="205"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="8">
+              <Value value="230"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="17"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="24"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="31"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="38"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="45"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="52"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="59"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="66"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="73"/>
+            </KernValue>
+            <KernValue index="9">
+              <Value value="80"/>
+            </KernValue>
+          </BottomRightMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="10">
+          <TopLeftMathKern>
+            <!-- HeightCount=4 -->
+            <CorrectionHeight index="0">
+              <Value value="22"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="39"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="56"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="73"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="27"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="44"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="61"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="78"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="95"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=8 -->
+            <CorrectionHeight index="0">
+              <Value value="18"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="31"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="44"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="57"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="70"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="83"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="96"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="109"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="22"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="34"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="46"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="58"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="82"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="94"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="106"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="118"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="11">
+          <TopRightMathKern>
+            <!-- HeightCount=1 -->
+            <CorrectionHeight index="0">
+              <Value value="17"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="17"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="24"/>
+            </KernValue>
+          </TopRightMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=0 -->
+            <KernValue index="0">
+              <Value value="19"/>
+            </KernValue>
+          </BottomRightMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="12">
+          <TopRightMathKern>
+            <!-- HeightCount=2 -->
+            <CorrectionHeight index="0">
+              <Value value="18"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="31"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="18"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="26"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="34"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=6 -->
+            <CorrectionHeight index="0">
+              <Value value="24"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="43"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="62"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="81"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="100"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="119"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="29"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="48"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="67"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="86"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="105"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="124"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="143"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=1 -->
+            <CorrectionHeight index="0">
+              <Value value="33"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="20"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="30"/>
+            </KernValue>
+          </BottomRightMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="13">
+          <TopRightMathKern>
+            <!-- HeightCount=3 -->
+            <CorrectionHeight index="0">
+              <Value value="19"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="33"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="47"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="19"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="28"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="37"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="46"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=7 -->
+            <CorrectionHeight index="0">
+              <Value value="25"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="45"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="65"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="85"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="105"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="125"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="145"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="30"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="50"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="90"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="110"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="130"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="150"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="170"/>
+            </KernValue>
+          </TopLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="14">
+          <TopRightMathKern>
+            <!-- HeightCount=4 -->
+            <CorrectionHeight index="0">
+              <Value value="20"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="35"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="50"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="65"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="20"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="30"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="40"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="50"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="60"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=8 -->
+            <CorrectionHeight index="0">
+              <Value value="26"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="47"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="68"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="89"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="110"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="131"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="152"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="173"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="31"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="52"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="73"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="94"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="115"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="136"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="157"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="178"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="199"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=3 -->
+            <CorrectionHeight index="0">
+              <Value value="12"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="19"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="26"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="22"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="34"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="46"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="58"/>
+            </KernValue>
+          </BottomRightMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=1 -->
+            <CorrectionHeight index="0">
+              <Value value="22"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="26"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="42"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="15">
+          <BottomRightMathKern>
+            <!-- HeightCount=4 -->
+            <CorrectionHeight index="0">
+              <Value value="13"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="21"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="29"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="37"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="23"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="36"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="49"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="62"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="75"/>
+            </KernValue>
+          </BottomRightMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="16">
+          <TopRightMathKern>
+            <!-- HeightCount=6 -->
+            <CorrectionHeight index="0">
+              <Value value="22"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="39"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="56"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="73"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="90"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="107"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="22"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="34"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="46"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="58"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="82"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="94"/>
+            </KernValue>
+          </TopRightMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=3 -->
+            <CorrectionHeight index="0">
+              <Value value="24"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="43"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="62"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="28"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="46"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="64"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="82"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="17">
+          <TopRightMathKern>
+            <!-- HeightCount=7 -->
+            <CorrectionHeight index="0">
+              <Value value="23"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="41"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="59"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="77"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="95"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="113"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="131"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="23"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="36"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="49"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="62"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="75"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="88"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="101"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="114"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=0 -->
+            <KernValue index="0">
+              <Value value="17"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=6 -->
+            <CorrectionHeight index="0">
+              <Value value="15"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="25"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="35"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="45"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="55"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="65"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="25"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="40"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="55"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="85"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="100"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="115"/>
+            </KernValue>
+          </BottomRightMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="18">
+          <TopRightMathKern>
+            <!-- HeightCount=8 -->
+            <CorrectionHeight index="0">
+              <Value value="24"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="43"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="62"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="81"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="100"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="119"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="138"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="157"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="24"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="38"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="52"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="66"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="80"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="94"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="108"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="122"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="136"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=1 -->
+            <CorrectionHeight index="0">
+              <Value value="30"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="18"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="26"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=7 -->
+            <CorrectionHeight index="0">
+              <Value value="16"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="27"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="38"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="49"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="60"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="71"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="82"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="26"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="42"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="58"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="74"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="90"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="106"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="122"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="138"/>
+            </KernValue>
+          </BottomRightMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=5 -->
+            <CorrectionHeight index="0">
+              <Value value="26"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="47"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="68"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="89"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="110"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="30"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="50"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="90"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="110"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="130"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="19">
+          <TopRightMathKern>
+            <!-- HeightCount=9 -->
+            <CorrectionHeight index="0">
+              <Value value="25"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="45"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="65"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="85"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="105"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="125"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="145"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="165"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="8">
+              <Value value="185"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="25"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="40"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="55"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="85"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="100"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="115"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="130"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="145"/>
+            </KernValue>
+            <KernValue index="9">
+              <Value value="160"/>
+            </KernValue>
+          </TopRightMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="20">
+          <TopLeftMathKern>
+            <!-- HeightCount=3 -->
+            <CorrectionHeight index="0">
+              <Value value="32"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="59"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="86"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="20"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="30"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="40"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="50"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=9 -->
+            <CorrectionHeight index="0">
+              <Value value="18"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="31"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="44"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="57"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="70"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="83"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="96"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="109"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="8">
+              <Value value="122"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="28"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="46"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="64"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="82"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="100"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="118"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="136"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="154"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="172"/>
+            </KernValue>
+            <KernValue index="9">
+              <Value value="190"/>
+            </KernValue>
+          </BottomRightMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=7 -->
+            <CorrectionHeight index="0">
+              <Value value="28"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="51"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="74"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="97"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="120"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="143"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="166"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="15"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="20"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="25"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="30"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="35"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="40"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="45"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="50"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="21">
+          <TopRightMathKern>
+            <!-- HeightCount=0 -->
+            <KernValue index="0">
+              <Value value="27"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=4 -->
+            <CorrectionHeight index="0">
+              <Value value="33"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="61"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="89"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="117"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="21"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="32"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="43"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="54"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="65"/>
+            </KernValue>
+          </TopLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="22">
+          <TopRightMathKern>
+            <!-- HeightCount=1 -->
+            <CorrectionHeight index="0">
+              <Value value="28"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="28"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="46"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=5 -->
+            <CorrectionHeight index="0">
+              <Value value="34"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="63"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="92"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="121"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="150"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="22"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="34"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="46"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="58"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="82"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=9 -->
+            <CorrectionHeight index="0">
+              <Value value="30"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="55"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="80"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="105"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="130"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="155"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="180"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="205"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="8">
+              <Value value="230"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="17"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="24"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="31"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="38"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="45"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="52"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="59"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="66"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="73"/>
+            </KernValue>
+            <KernValue index="9">
+              <Value value="80"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="23">
+          <TopRightMathKern>
+            <!-- HeightCount=2 -->
+            <CorrectionHeight index="0">
+              <Value value="29"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="53"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="29"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="48"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="67"/>
+            </KernValue>
+          </TopRightMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=1 -->
+            <CorrectionHeight index="0">
+              <Value value="21"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="31"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="52"/>
+            </KernValue>
+          </BottomRightMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="24">
+          <TopRightMathKern>
+            <!-- HeightCount=3 -->
+            <CorrectionHeight index="0">
+              <Value value="30"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="55"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="80"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="30"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="50"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="90"/>
+            </KernValue>
+          </TopRightMathKern>
+          <TopLeftMathKern>
+            <!-- HeightCount=7 -->
+            <CorrectionHeight index="0">
+              <Value value="13"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="21"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="29"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="37"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="45"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="53"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="61"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="24"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="38"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="52"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="66"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="80"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="94"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="108"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="122"/>
+            </KernValue>
+          </TopLeftMathKern>
+          <BottomRightMathKern>
+            <!-- HeightCount=2 -->
+            <CorrectionHeight index="0">
+              <Value value="22"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="39"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="15"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="20"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="25"/>
+            </KernValue>
+          </BottomRightMathKern>
+          <BottomLeftMathKern>
+            <!-- HeightCount=0 -->
+            <KernValue index="0">
+              <Value value="19"/>
+            </KernValue>
+          </BottomLeftMathKern>
+        </MathKernInfoRecords>
+        <MathKernInfoRecords index="25">
+          <TopLeftMathKern>
+            <!-- HeightCount=8 -->
+            <CorrectionHeight index="0">
+              <Value value="14"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="1">
+              <Value value="23"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="2">
+              <Value value="32"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="3">
+              <Value value="41"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="4">
+              <Value value="50"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="5">
+              <Value value="59"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="6">
+              <Value value="68"/>
+            </CorrectionHeight>
+            <CorrectionHeight index="7">
+              <Value value="77"/>
+            </CorrectionHeight>
+            <KernValue index="0">
+              <Value value="25"/>
+            </KernValue>
+            <KernValue index="1">
+              <Value value="40"/>
+            </KernValue>
+            <KernValue index="2">
+              <Value value="55"/>
+            </KernValue>
+            <KernValue index="3">
+              <Value value="70"/>
+            </KernValue>
+            <KernValue index="4">
+              <Value value="85"/>
+            </KernValue>
+            <KernValue index="5">
+              <Value value="100"/>
+            </KernValue>
+            <KernValue index="6">
+              <Value value="115"/>
+            </KernValue>
+            <KernValue index="7">
+              <Value value="130"/>
+            </KernValue>
+            <KernValue index="8">
+              <Value value="145"/>
+            </KernValue>
+          </TopLeftMathKern>
+        </MathKernInfoRecords>
+      </MathKernInfo>
+    </MathGlyphInfo>
+    <MathVariants>
+      <MinConnectorOverlap value="54"/>
+      <VertGlyphCoverage Format="1">
+        <Glyph value="arrowup"/>
+        <Glyph value="arrowdown"/>
+        <Glyph value="arrowupdn"/>
+        <Glyph value="uni21A5"/>
+        <Glyph value="uni21A7"/>
+        <Glyph value="uni21C8"/>
+        <Glyph value="uni21CA"/>
+        <Glyph value="arrowdblup"/>
+        <Glyph value="arrowdbldown"/>
+        <Glyph value="uni21D5"/>
+        <Glyph value="uni21E7"/>
+        <Glyph value="uni21E9"/>
+      </VertGlyphCoverage>
+      <HorizGlyphCoverage Format="1">
+        <Glyph value="arrowleft"/>
+        <Glyph value="arrowright"/>
+        <Glyph value="arrowboth"/>
+        <Glyph value="uni21A4"/>
+        <Glyph value="uni21A6"/>
+        <Glyph value="uni21C7"/>
+        <Glyph value="uni21C9"/>
+        <Glyph value="arrowdblleft"/>
+        <Glyph value="arrowdblright"/>
+        <Glyph value="arrowdblboth"/>
+        <Glyph value="uni21E6"/>
+        <Glyph value="uni21E8"/>
+      </HorizGlyphCoverage>
+      <!-- VertGlyphCount=12 -->
+      <!-- HorizGlyphCount=12 -->
+      <VertGlyphConstruction index="0">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="331"/>
+          </ItalicsCorrection>
+          <!-- PartCount=2 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="296"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=4 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni2191_size2"/>
+          <AdvanceMeasurement value="2251"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni2191_size3"/>
+          <AdvanceMeasurement value="2501"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni2191_size4"/>
+          <AdvanceMeasurement value="3001"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni2191_size5"/>
+          <AdvanceMeasurement value="3751"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="1">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="237"/>
+          </ItalicsCorrection>
+          <!-- PartCount=5 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="top"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="192"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=6 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni2193_size2"/>
+          <AdvanceMeasurement value="2451"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni2193_size3"/>
+          <AdvanceMeasurement value="2701"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni2193_size4"/>
+          <AdvanceMeasurement value="3201"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni2193_size5"/>
+          <AdvanceMeasurement value="3951"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="4">
+          <VariantGlyph value="uni2193_size6"/>
+          <AdvanceMeasurement value="4201"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="5">
+          <VariantGlyph value="uni2193_size7"/>
+          <AdvanceMeasurement value="4701"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="2">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="143"/>
+          </ItalicsCorrection>
+          <!-- PartCount=9 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="296"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="331"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="331"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="center"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="7">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="331"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="8">
+            <glyph value="top"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="123"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=1 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni2195_size2"/>
+          <AdvanceMeasurement value="2651"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="3">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="438"/>
+          </ItalicsCorrection>
+          <!-- PartCount=9 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="123"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="center"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="7">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="8">
+            <glyph value="top"/>
+            <StartConnectorLength value="262"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=3 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21A5_size2"/>
+          <AdvanceMeasurement value="2351"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21A5_size3"/>
+          <AdvanceMeasurement value="2601"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21A5_size4"/>
+          <AdvanceMeasurement value="3101"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="4">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="344"/>
+          </ItalicsCorrection>
+          <!-- PartCount=13 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="296"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="center"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="7">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="8">
+            <glyph value="center"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="9">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="10">
+            <glyph value="center"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="11">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="12">
+            <glyph value="top"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=5 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21A7_size2"/>
+          <AdvanceMeasurement value="2551"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21A7_size3"/>
+          <AdvanceMeasurement value="2801"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21A7_size4"/>
+          <AdvanceMeasurement value="3301"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni21A7_size5"/>
+          <AdvanceMeasurement value="4051"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="4">
+          <VariantGlyph value="uni21A7_size6"/>
+          <AdvanceMeasurement value="4301"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="5">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="189"/>
+          </ItalicsCorrection>
+          <!-- PartCount=1 -->
+          <PartRecords index="0">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="296"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=3 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21C8_size2"/>
+          <AdvanceMeasurement value="2051"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21C8_size3"/>
+          <AdvanceMeasurement value="2301"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21C8_size4"/>
+          <AdvanceMeasurement value="2801"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="6">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="444"/>
+          </ItalicsCorrection>
+          <!-- PartCount=3 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="top"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="192"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=5 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21CA_size2"/>
+          <AdvanceMeasurement value="2251"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21CA_size3"/>
+          <AdvanceMeasurement value="2501"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21CA_size4"/>
+          <AdvanceMeasurement value="3001"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni21CA_size5"/>
+          <AdvanceMeasurement value="3751"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="4">
+          <VariantGlyph value="uni21CA_size6"/>
+          <AdvanceMeasurement value="4001"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="7">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="115"/>
+          </ItalicsCorrection>
+          <!-- PartCount=2 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="123"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=5 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21D1_size2"/>
+          <AdvanceMeasurement value="2951"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21D1_size3"/>
+          <AdvanceMeasurement value="3201"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21D1_size4"/>
+          <AdvanceMeasurement value="3701"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni21D1_size5"/>
+          <AdvanceMeasurement value="4451"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="4">
+          <VariantGlyph value="uni21D1_size6"/>
+          <AdvanceMeasurement value="4701"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="8">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="370"/>
+          </ItalicsCorrection>
+          <!-- PartCount=5 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="296"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="top"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=0 -->
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="9">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="276"/>
+          </ItalicsCorrection>
+          <!-- PartCount=9 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="center"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="7">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="8">
+            <glyph value="top"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="192"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=2 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21D5_size2"/>
+          <AdvanceMeasurement value="3351"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21D5_size3"/>
+          <AdvanceMeasurement value="3601"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="10">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="128"/>
+          </ItalicsCorrection>
+          <!-- PartCount=13 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="123"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="center"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="7">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="8">
+            <glyph value="center"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="9">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="10">
+            <glyph value="center"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="11">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="12">
+            <glyph value="top"/>
+            <StartConnectorLength value="262"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=6 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21E7_size2"/>
+          <AdvanceMeasurement value="3251"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21E7_size3"/>
+          <AdvanceMeasurement value="3501"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21E7_size4"/>
+          <AdvanceMeasurement value="4001"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni21E7_size5"/>
+          <AdvanceMeasurement value="4751"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="4">
+          <VariantGlyph value="uni21E7_size6"/>
+          <AdvanceMeasurement value="5001"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="5">
+          <VariantGlyph value="uni21E7_size7"/>
+          <AdvanceMeasurement value="5501"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <VertGlyphConstruction index="11">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="383"/>
+          </ItalicsCorrection>
+          <!-- PartCount=2 -->
+          <PartRecords index="0">
+            <glyph value="bottom"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="vertical"/>
+            <StartConnectorLength value="296"/>
+            <EndConnectorLength value="54"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=1 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21E9_size2"/>
+          <AdvanceMeasurement value="3451"/>
+        </MathGlyphVariantRecord>
+      </VertGlyphConstruction>
+      <HorizGlyphConstruction index="0">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="124"/>
+          </ItalicsCorrection>
+          <!-- PartCount=1 -->
+          <PartRecords index="0">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="331"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=3 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni2190_size2"/>
+          <AdvanceMeasurement value="2151"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni2190_size3"/>
+          <AdvanceMeasurement value="2401"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni2190_size4"/>
+          <AdvanceMeasurement value="2901"/>
+        </MathGlyphVariantRecord>
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="1">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="379"/>
+          </ItalicsCorrection>
+          <!-- PartCount=3 -->
+          <PartRecords index="0">
+            <glyph value="left"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="192"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="262"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="right"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=5 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni2192_size2"/>
+          <AdvanceMeasurement value="2351"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni2192_size3"/>
+          <AdvanceMeasurement value="2601"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni2192_size4"/>
+          <AdvanceMeasurement value="3101"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni2192_size5"/>
+          <AdvanceMeasurement value="3851"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="4">
+          <VariantGlyph value="uni2192_size6"/>
+          <AdvanceMeasurement value="4101"/>
+        </MathGlyphVariantRecord>
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="2">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="285"/>
+          </ItalicsCorrection>
+          <!-- PartCount=7 -->
+          <PartRecords index="0">
+            <glyph value="left"/>
+            <StartConnectorLength value="331"/>
+            <EndConnectorLength value="123"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="123"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="123"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="365"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="right"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=0 -->
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="3">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="231"/>
+          </ItalicsCorrection>
+          <!-- PartCount=7 -->
+          <PartRecords index="0">
+            <glyph value="left"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="right"/>
+            <StartConnectorLength value="296"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=2 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21A4_size2"/>
+          <AdvanceMeasurement value="2251"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21A4_size3"/>
+          <AdvanceMeasurement value="2501"/>
+        </MathGlyphVariantRecord>
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="4">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="137"/>
+          </ItalicsCorrection>
+          <!-- PartCount=11 -->
+          <PartRecords index="0">
+            <glyph value="left"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="331"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="center"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="7">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="8">
+            <glyph value="center"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="9">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="10">
+            <glyph value="right"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=4 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21A6_size2"/>
+          <AdvanceMeasurement value="2451"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21A6_size3"/>
+          <AdvanceMeasurement value="2701"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21A6_size4"/>
+          <AdvanceMeasurement value="3201"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni21A6_size5"/>
+          <AdvanceMeasurement value="3951"/>
+        </MathGlyphVariantRecord>
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="5">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="331"/>
+          </ItalicsCorrection>
+          <!-- PartCount=13 -->
+          <PartRecords index="0">
+            <glyph value="left"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="331"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="center"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="7">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="8">
+            <glyph value="center"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="9">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="10">
+            <glyph value="center"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="11">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="123"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="12">
+            <glyph value="right"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=2 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21C7_size2"/>
+          <AdvanceMeasurement value="1951"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21C7_size3"/>
+          <AdvanceMeasurement value="2201"/>
+        </MathGlyphVariantRecord>
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="6">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="237"/>
+          </ItalicsCorrection>
+          <!-- PartCount=2 -->
+          <PartRecords index="0">
+            <glyph value="left"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="192"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="262"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=4 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21C9_size2"/>
+          <AdvanceMeasurement value="2151"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21C9_size3"/>
+          <AdvanceMeasurement value="2401"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21C9_size4"/>
+          <AdvanceMeasurement value="2901"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni21C9_size5"/>
+          <AdvanceMeasurement value="3651"/>
+        </MathGlyphVariantRecord>
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="7">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="257"/>
+          </ItalicsCorrection>
+          <!-- PartCount=1 -->
+          <PartRecords index="0">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=4 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21D0_size2"/>
+          <AdvanceMeasurement value="2851"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21D0_size3"/>
+          <AdvanceMeasurement value="3101"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21D0_size4"/>
+          <AdvanceMeasurement value="3601"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni21D0_size5"/>
+          <AdvanceMeasurement value="4351"/>
+        </MathGlyphVariantRecord>
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="8">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="163"/>
+          </ItalicsCorrection>
+          <!-- PartCount=3 -->
+          <PartRecords index="0">
+            <glyph value="left"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="262"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="331"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="right"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="296"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=6 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21D2_size2"/>
+          <AdvanceMeasurement value="3051"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21D2_size3"/>
+          <AdvanceMeasurement value="3301"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21D2_size4"/>
+          <AdvanceMeasurement value="3801"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni21D2_size5"/>
+          <AdvanceMeasurement value="4551"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="4">
+          <VariantGlyph value="uni21D2_size6"/>
+          <AdvanceMeasurement value="4801"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="5">
+          <VariantGlyph value="uni21D2_size7"/>
+          <AdvanceMeasurement value="5301"/>
+        </MathGlyphVariantRecord>
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="9">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="418"/>
+          </ItalicsCorrection>
+          <!-- PartCount=7 -->
+          <PartRecords index="0">
+            <glyph value="left"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="192"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="262"/>
+            <EndConnectorLength value="400"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="192"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="89"/>
+            <EndConnectorLength value="192"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="54"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="right"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="227"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=1 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21D4_size2"/>
+          <AdvanceMeasurement value="3251"/>
+        </MathGlyphVariantRecord>
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="10">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="270"/>
+          </ItalicsCorrection>
+          <!-- PartCount=11 -->
+          <PartRecords index="0">
+            <glyph value="left"/>
+            <StartConnectorLength value="158"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="1">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="400"/>
+            <EndConnectorLength value="158"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="2">
+            <glyph value="center"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="3">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="4">
+            <glyph value="center"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="5">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="6">
+            <glyph value="center"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="7">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="8">
+            <glyph value="center"/>
+            <StartConnectorLength value="227"/>
+            <EndConnectorLength value="331"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+          <PartRecords index="9">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="192"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+          <PartRecords index="10">
+            <glyph value="right"/>
+            <StartConnectorLength value="296"/>
+            <EndConnectorLength value="365"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="0"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=5 -->
+        <MathGlyphVariantRecord index="0">
+          <VariantGlyph value="uni21E6_size2"/>
+          <AdvanceMeasurement value="3151"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="1">
+          <VariantGlyph value="uni21E6_size3"/>
+          <AdvanceMeasurement value="3401"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="2">
+          <VariantGlyph value="uni21E6_size4"/>
+          <AdvanceMeasurement value="3901"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="3">
+          <VariantGlyph value="uni21E6_size5"/>
+          <AdvanceMeasurement value="4651"/>
+        </MathGlyphVariantRecord>
+        <MathGlyphVariantRecord index="4">
+          <VariantGlyph value="uni21E6_size6"/>
+          <AdvanceMeasurement value="4901"/>
+        </MathGlyphVariantRecord>
+      </HorizGlyphConstruction>
+      <HorizGlyphConstruction index="11">
+        <GlyphAssembly>
+          <ItalicsCorrection>
+            <Value value="176"/>
+          </ItalicsCorrection>
+          <!-- PartCount=1 -->
+          <PartRecords index="0">
+            <glyph value="horizontal"/>
+            <StartConnectorLength value="331"/>
+            <EndConnectorLength value="89"/>
+            <FullAdvance value="1000"/>
+            <PartFlags value="1"/>
+          </PartRecords>
+        </GlyphAssembly>
+        <!-- VariantCount=0 -->
+      </HorizGlyphConstruction>
+    </MathVariants>
+  </MATH>
+
+  <hmtx>
+    <mtx name=".notdef" width="1000" lsb="0"/>
+    <mtx name="A" width="1000" lsb="0"/>
+    <mtx name="B" width="1000" lsb="0"/>
+    <mtx name="C" width="1000" lsb="0"/>
+    <mtx name="D" width="1000" lsb="0"/>
+    <mtx name="E" width="1000" lsb="0"/>
+    <mtx name="F" width="1000" lsb="0"/>
+    <mtx name="G" width="1000" lsb="0"/>
+    <mtx name="H" width="1000" lsb="0"/>
+    <mtx name="I" width="1000" lsb="0"/>
+    <mtx name="J" width="1000" lsb="0"/>
+    <mtx name="K" width="1000" lsb="0"/>
+    <mtx name="L" width="1000" lsb="0"/>
+    <mtx name="M" width="1000" lsb="0"/>
+    <mtx name="N" width="1000" lsb="0"/>
+    <mtx name="O" width="1000" lsb="0"/>
+    <mtx name="P" width="1000" lsb="0"/>
+    <mtx name="Q" width="1000" lsb="0"/>
+    <mtx name="R" width="1000" lsb="0"/>
+    <mtx name="S" width="1000" lsb="0"/>
+    <mtx name="T" width="1000" lsb="0"/>
+    <mtx name="U" width="1000" lsb="0"/>
+    <mtx name="V" width="1000" lsb="0"/>
+    <mtx name="W" width="1000" lsb="0"/>
+    <mtx name="X" width="1000" lsb="0"/>
+    <mtx name="Y" width="1000" lsb="0"/>
+    <mtx name="Z" width="1000" lsb="0"/>
+    <mtx name="arrowboth" width="1000" lsb="0"/>
+    <mtx name="arrowdblboth" width="1000" lsb="0"/>
+    <mtx name="arrowdbldown" width="1000" lsb="0"/>
+    <mtx name="arrowdblleft" width="1000" lsb="0"/>
+    <mtx name="arrowdblright" width="1000" lsb="0"/>
+    <mtx name="arrowdblup" width="1000" lsb="0"/>
+    <mtx name="arrowdown" width="1000" lsb="0"/>
+    <mtx name="arrowleft" width="1000" lsb="0"/>
+    <mtx name="arrowright" width="1000" lsb="0"/>
+    <mtx name="arrowup" width="1000" lsb="0"/>
+    <mtx name="arrowupdn" width="1000" lsb="0"/>
+    <mtx name="bottom" width="1000" lsb="0"/>
+    <mtx name="braceleft" width="1000" lsb="0"/>
+    <mtx name="center" width="1000" lsb="0"/>
+    <mtx name="horizontal" width="1000" lsb="0"/>
+    <mtx name="left" width="1000" lsb="0"/>
+    <mtx name="right" width="1000" lsb="0"/>
+    <mtx name="space" width="1000" lsb="0"/>
+    <mtx name="top" width="1000" lsb="0"/>
+    <mtx name="underscore" width="1000" lsb="0"/>
+    <mtx name="uni2190_size2" width="1000" lsb="0"/>
+    <mtx name="uni2190_size3" width="1000" lsb="0"/>
+    <mtx name="uni2190_size4" width="1000" lsb="0"/>
+    <mtx name="uni2191_size2" width="1000" lsb="0"/>
+    <mtx name="uni2191_size3" width="1000" lsb="0"/>
+    <mtx name="uni2191_size4" width="1000" lsb="0"/>
+    <mtx name="uni2191_size5" width="1000" lsb="0"/>
+    <mtx name="uni2192_size2" width="1000" lsb="0"/>
+    <mtx name="uni2192_size3" width="1000" lsb="0"/>
+    <mtx name="uni2192_size4" width="1000" lsb="0"/>
+    <mtx name="uni2192_size5" width="1000" lsb="0"/>
+    <mtx name="uni2192_size6" width="1000" lsb="0"/>
+    <mtx name="uni2193_size2" width="1000" lsb="0"/>
+    <mtx name="uni2193_size3" width="1000" lsb="0"/>
+    <mtx name="uni2193_size4" width="1000" lsb="0"/>
+    <mtx name="uni2193_size5" width="1000" lsb="0"/>
+    <mtx name="uni2193_size6" width="1000" lsb="0"/>
+    <mtx name="uni2193_size7" width="1000" lsb="0"/>
+    <mtx name="uni2195_size2" width="1000" lsb="0"/>
+    <mtx name="uni21A4" width="1000" lsb="0"/>
+    <mtx name="uni21A4_size2" width="1000" lsb="0"/>
+    <mtx name="uni21A4_size3" width="1000" lsb="0"/>
+    <mtx name="uni21A5" width="1000" lsb="0"/>
+    <mtx name="uni21A5_size2" width="1000" lsb="0"/>
+    <mtx name="uni21A5_size3" width="1000" lsb="0"/>
+    <mtx name="uni21A5_size4" width="1000" lsb="0"/>
+    <mtx name="uni21A6" width="1000" lsb="0"/>
+    <mtx name="uni21A6_size2" width="1000" lsb="0"/>
+    <mtx name="uni21A6_size3" width="1000" lsb="0"/>
+    <mtx name="uni21A6_size4" width="1000" lsb="0"/>
+    <mtx name="uni21A6_size5" width="1000" lsb="0"/>
+    <mtx name="uni21A7" width="1000" lsb="0"/>
+    <mtx name="uni21A7_size2" width="1000" lsb="0"/>
+    <mtx name="uni21A7_size3" width="1000" lsb="0"/>
+    <mtx name="uni21A7_size4" width="1000" lsb="0"/>
+    <mtx name="uni21A7_size5" width="1000" lsb="0"/>
+    <mtx name="uni21A7_size6" width="1000" lsb="0"/>
+    <mtx name="uni21C7" width="1000" lsb="0"/>
+    <mtx name="uni21C7_size2" width="1000" lsb="0"/>
+    <mtx name="uni21C7_size3" width="1000" lsb="0"/>
+    <mtx name="uni21C8" width="1000" lsb="0"/>
+    <mtx name="uni21C8_size2" width="1000" lsb="0"/>
+    <mtx name="uni21C8_size3" width="1000" lsb="0"/>
+    <mtx name="uni21C8_size4" width="1000" lsb="0"/>
+    <mtx name="uni21C9" width="1000" lsb="0"/>
+    <mtx name="uni21C9_size2" width="1000" lsb="0"/>
+    <mtx name="uni21C9_size3" width="1000" lsb="0"/>
+    <mtx name="uni21C9_size4" width="1000" lsb="0"/>
+    <mtx name="uni21C9_size5" width="1000" lsb="0"/>
+    <mtx name="uni21CA" width="1000" lsb="0"/>
+    <mtx name="uni21CA_size2" width="1000" lsb="0"/>
+    <mtx name="uni21CA_size3" width="1000" lsb="0"/>
+    <mtx name="uni21CA_size4" width="1000" lsb="0"/>
+    <mtx name="uni21CA_size5" width="1000" lsb="0"/>
+    <mtx name="uni21CA_size6" width="1000" lsb="0"/>
+    <mtx name="uni21D0_size2" width="1000" lsb="0"/>
+    <mtx name="uni21D0_size3" width="1000" lsb="0"/>
+    <mtx name="uni21D0_size4" width="1000" lsb="0"/>
+    <mtx name="uni21D0_size5" width="1000" lsb="0"/>
+    <mtx name="uni21D1_size2" width="1000" lsb="0"/>
+    <mtx name="uni21D1_size3" width="1000" lsb="0"/>
+    <mtx name="uni21D1_size4" width="1000" lsb="0"/>
+    <mtx name="uni21D1_size5" width="1000" lsb="0"/>
+    <mtx name="uni21D1_size6" width="1000" lsb="0"/>
+    <mtx name="uni21D2_size2" width="1000" lsb="0"/>
+    <mtx name="uni21D2_size3" width="1000" lsb="0"/>
+    <mtx name="uni21D2_size4" width="1000" lsb="0"/>
+    <mtx name="uni21D2_size5" width="1000" lsb="0"/>
+    <mtx name="uni21D2_size6" width="1000" lsb="0"/>
+    <mtx name="uni21D2_size7" width="1000" lsb="0"/>
+    <mtx name="uni21D4_size2" width="1000" lsb="0"/>
+    <mtx name="uni21D5" width="1000" lsb="0"/>
+    <mtx name="uni21D5_size2" width="1000" lsb="0"/>
+    <mtx name="uni21D5_size3" width="1000" lsb="0"/>
+    <mtx name="uni21E6" width="1000" lsb="0"/>
+    <mtx name="uni21E6_size2" width="1000" lsb="0"/>
+    <mtx name="uni21E6_size3" width="1000" lsb="0"/>
+    <mtx name="uni21E6_size4" width="1000" lsb="0"/>
+    <mtx name="uni21E6_size5" width="1000" lsb="0"/>
+    <mtx name="uni21E6_size6" width="1000" lsb="0"/>
+    <mtx name="uni21E7" width="1000" lsb="0"/>
+    <mtx name="uni21E7_size2" width="1000" lsb="0"/>
+    <mtx name="uni21E7_size3" width="1000" lsb="0"/>
+    <mtx name="uni21E7_size4" width="1000" lsb="0"/>
+    <mtx name="uni21E7_size5" width="1000" lsb="0"/>
+    <mtx name="uni21E7_size6" width="1000" lsb="0"/>
+    <mtx name="uni21E7_size7" width="1000" lsb="0"/>
+    <mtx name="uni21E8" width="1000" lsb="0"/>
+    <mtx name="uni21E9" width="1000" lsb="0"/>
+    <mtx name="uni21E9_size2" width="1000" lsb="0"/>
+    <mtx name="uni23A7" width="1000" lsb="0"/>
+    <mtx name="uni23A8" width="1000" lsb="0"/>
+    <mtx name="uni23A9" width="1000" lsb="0"/>
+    <mtx name="uni23AA" width="1000" lsb="0"/>
+    <mtx name="vertical" width="1000" lsb="400"/>
+  </hmtx>
+
+</ttFont>
diff --git a/test/api/fonts/README b/test/api/fonts/README
new file mode 100644 (file)
index 0000000..7e7783c
--- /dev/null
@@ -0,0 +1,3 @@
+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.
diff --git a/test/api/fonts/Roboto-Regular.abc.cmap-format12-only.ttf b/test/api/fonts/Roboto-Regular.abc.cmap-format12-only.ttf
new file mode 100644 (file)
index 0000000..46b4801
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.abc.cmap-format12-only.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.abc.ttf b/test/api/fonts/Roboto-Regular.abc.ttf
new file mode 100644 (file)
index 0000000..9d791f7
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.abc.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.ac.cmap-format12-only.ttf b/test/api/fonts/Roboto-Regular.ac.cmap-format12-only.ttf
new file mode 100644 (file)
index 0000000..47c9faf
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.ac.cmap-format12-only.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.ac.nohints.ttf b/test/api/fonts/Roboto-Regular.ac.nohints.ttf
new file mode 100644 (file)
index 0000000..b733917
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.ac.nohints.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.ac.ttf b/test/api/fonts/Roboto-Regular.ac.ttf
new file mode 100644 (file)
index 0000000..6ac1b33
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.ac.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.b.ttf b/test/api/fonts/Roboto-Regular.b.ttf
new file mode 100644 (file)
index 0000000..8e44886
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.b.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.components.1fc.nohints.ttf b/test/api/fonts/Roboto-Regular.components.1fc.nohints.ttf
new file mode 100644 (file)
index 0000000..d36cc81
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.components.1fc.nohints.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.components.subset.ttf b/test/api/fonts/Roboto-Regular.components.subset.ttf
new file mode 100644 (file)
index 0000000..e759d77
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.components.subset.ttf differ
diff --git a/test/api/fonts/Roboto-Regular.components.ttf b/test/api/fonts/Roboto-Regular.components.ttf
new file mode 100644 (file)
index 0000000..816e3a2
Binary files /dev/null and b/test/api/fonts/Roboto-Regular.components.ttf differ
diff --git a/test/api/hb-subset-test.h b/test/api/hb-subset-test.h
new file mode 100644 (file)
index 0000000..8e579a6
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#ifndef HB_SUBSET_TEST_H
+#define HB_SUBSET_TEST_H
+
+#include <stdio.h>
+
+#include "hb-test.h"
+#include "hb-subset.h"
+
+
+HB_BEGIN_DECLS
+
+static inline char *
+hb_subset_test_read_file (const char *path,
+                          size_t     *length /* OUT */)
+{
+  FILE *fp = fopen (path, "rb");
+
+  long file_length = 0;
+  char *buffer = NULL;
+  if (fp && fseek (fp, 0, SEEK_END) == 0)
+  {
+    file_length = ftell(fp);
+    rewind (fp);
+  }
+
+  if (file_length > 0)
+  {
+    buffer = (char *) calloc (file_length + 1, sizeof (char));
+    if (buffer && fread (buffer, 1, file_length, fp) == (size_t) file_length)
+    {
+      *length = file_length;
+    }
+    else
+    {
+      free (buffer);
+      buffer = NULL;
+    }
+  }
+
+  if (fp)
+    fclose(fp);
+
+  return buffer;
+}
+
+static inline hb_face_t *
+hb_subset_test_open_font (const char *font_path)
+{
+#if GLIB_CHECK_VERSION(2,37,2)
+  gchar* path = g_test_build_filename(G_TEST_DIST, font_path, NULL);
+#else
+  gchar* path = g_strdup(fontFile);
+#endif
+
+  size_t length;
+  char *font_data = hb_subset_test_read_file(path, &length);
+
+  if (font_data != NULL) {
+    hb_blob_t *blob = hb_blob_create (font_data,
+                                      length,
+                                      HB_MEMORY_MODE_READONLY,
+                                      font_data,
+                                      free);
+    hb_face_t *face = hb_face_create (blob, 0);
+    hb_blob_destroy (blob);
+    return face;
+  }
+  g_assert (false);
+  return NULL; /* Shut up, compiler! */
+}
+
+static inline hb_subset_input_t *
+hb_subset_test_create_input(const hb_set_t  *codepoints)
+{
+  hb_subset_input_t *input = hb_subset_input_create_or_fail ();
+  hb_set_t * input_codepoints = hb_subset_input_unicode_set (input);
+  hb_set_union (input_codepoints, codepoints);
+  return input;
+}
+
+static inline hb_face_t *
+hb_subset_test_create_subset (hb_face_t *source,
+                              hb_subset_input_t *input)
+{
+  hb_subset_profile_t *profile = hb_subset_profile_create();
+  hb_face_t *subset = hb_subset (source, profile, input);
+  g_assert (subset);
+
+  hb_subset_profile_destroy (profile);
+  hb_subset_input_destroy (input);
+  return subset;
+}
+
+static inline void
+hb_subset_test_check (hb_face_t *expected,
+                      hb_face_t *actual,
+                      hb_tag_t   table)
+{
+  fprintf(stderr, "compare %c%c%c%c\n", HB_UNTAG(table));
+  hb_blob_t *expected_blob = hb_face_reference_table (expected, table);
+  hb_blob_t *actual_blob = hb_face_reference_table (actual, table);
+  hb_test_assert_blobs_equal (expected_blob, actual_blob);
+  hb_blob_destroy (expected_blob);
+  hb_blob_destroy (actual_blob);
+}
+
+
+HB_END_DECLS
+
+#endif /* HB_SUBSET_TEST_H */
index 4d41218..c851f80 100644 (file)
@@ -27,7 +27,9 @@
 #ifndef HB_TEST_H
 #define HB_TEST_H
 
 #ifndef HB_TEST_H
 #define HB_TEST_H
 
+#ifdef HAVE_CONFIG_H
 #include <config.h>
 #include <config.h>
+#endif
 
 #include <hb-glib.h>
 
 
 #include <hb-glib.h>
 
@@ -86,6 +88,38 @@ hb_test_run (void)
 }
 
 
 }
 
 
+#if 0
+/* Helpers for loading test fonts */
+static inline hb_face_t *
+hb_test_load_face (const char *path)
+{
+  const char *font_data = NULL;
+  unsigned int len = 0;
+  hb_blob_t *blob = NULL;
+  hb_face_t *face = NULL;
+
+  FILE *f = fopen (path, "rb");
+  if (!f) {
+    perror (path);
+    exit (1);
+  }
+
+  fseek (f, 0, SEEK_END);
+  len = ftell (f);
+  fseek (f, 0, SEEK_SET);
+  font_data = (const char *) malloc (len);
+  if (!font_data) len = 0;
+  len = fread ((char *) font_data, 1, len, f);
+  fclose (f);
+
+  blob = hb_blob_create (font_data, len, HB_MEMORY_MODE_READONLY, 0, free);
+  face = hb_face_create (blob, 0 /* first face */);
+  hb_blob_destroy (blob);
+  return face;
+}
+#endif
+
+
 /* Bugzilla helpers */
 
 static inline void
 /* Bugzilla helpers */
 
 static inline void
@@ -158,6 +192,21 @@ typedef void (*hb_test_fixture_func_t) (void);
 #if !GLIB_CHECK_VERSION(2,30,0)
 #define g_test_fail() g_error("Test failed")
 #endif
 #if !GLIB_CHECK_VERSION(2,30,0)
 #define g_test_fail() g_error("Test failed")
 #endif
+#ifndef g_assert_true
+#define g_assert_true g_assert
+#endif
+#ifndef g_assert_cmpmem
+#define g_assert_cmpmem(m1, l1, m2, l2) g_assert_true (l1 == l2 && memcmp (m1, m2, l1) == 0)
+#endif
+
+static inline void hb_test_assert_blobs_equal (hb_blob_t *expected_blob, hb_blob_t *actual_blob)
+{
+  unsigned int expected_length, actual_length;
+  const char *raw_expected = hb_blob_get_data (expected_blob, &expected_length);
+  const char *raw_actual = hb_blob_get_data (actual_blob, &actual_length);
+  g_assert_cmpint(expected_length, ==, actual_length);
+  g_assert_cmpint(0, ==, memcmp(raw_expected, raw_actual, expected_length));
+}
 
 static inline void
 hb_test_add_func (const char *test_path,
 
 static inline void
 hb_test_add_func (const char *test_path,
index f671331..d566f4e 100644 (file)
@@ -116,7 +116,7 @@ free_up_free (fixture_t *fixture)
 static uintptr_t
 get_pagesize (void)
 {
 static uintptr_t
 get_pagesize (void)
 {
-  uintptr_t pagesize = -1;
+  uintptr_t pagesize = (uintptr_t) -1;
 
 #if defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE)
   pagesize = (uintptr_t) sysconf (_SC_PAGE_SIZE);
 
 #if defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE)
   pagesize = (uintptr_t) sysconf (_SC_PAGE_SIZE);
index 17607f1..b9a0268 100644 (file)
@@ -196,7 +196,7 @@ test_buffer_contents (fixture_t *fixture, gconstpointer user_data)
   g_assert_cmpint (len, ==, 5);
 
   for (i = 0; i < len; i++) {
   g_assert_cmpint (len, ==, 5);
 
   for (i = 0; i < len; i++) {
-    g_assert_cmphex (glyphs[i].mask,      ==, 1);
+    g_assert_cmphex (glyphs[i].mask,      ==, 0);
     g_assert_cmphex (glyphs[i].var1.u32,  ==, 0);
     g_assert_cmphex (glyphs[i].var2.u32,  ==, 0);
   }
     g_assert_cmphex (glyphs[i].var1.u32,  ==, 0);
     g_assert_cmphex (glyphs[i].var2.u32,  ==, 0);
   }
@@ -369,10 +369,10 @@ typedef struct {
 
 /* note: we skip the first and last byte when adding to buffer */
 static const utf8_conversion_test_t utf8_conversion_tests[] = {
 
 /* note: we skip the first and last byte when adding to buffer */
 static const utf8_conversion_test_t utf8_conversion_tests[] = {
-  {"a\303\207", {-1}},
+  {"a\303\207", {(hb_codepoint_t) -1}},
   {"a\303\207b", {0xC7}},
   {"a\303\207b", {0xC7}},
-  {"ab\303cd", {'b', -1, 'c'}},
-  {"ab\303\302\301cd", {'b', -1, -1, -1, 'c'}}
+  {"ab\303cd", {'b', (hb_codepoint_t) -1, 'c'}},
+  {"ab\303\302\301cd", {'b', (hb_codepoint_t) -1, (hb_codepoint_t) -1, (hb_codepoint_t) -1, 'c'}}
 };
 
 static void
 };
 
 static void
@@ -715,10 +715,10 @@ typedef struct {
 static const utf16_conversion_test_t utf16_conversion_tests[] = {
   {{0x41, 0x004D, 0x0430, 0x4E8C, 0xD800, 0xDF02, 0x61} , {0x004D, 0x0430, 0x4E8C, 0x10302}},
   {{0x41, 0xD800, 0xDF02, 0x61}, {0x10302}},
 static const utf16_conversion_test_t utf16_conversion_tests[] = {
   {{0x41, 0x004D, 0x0430, 0x4E8C, 0xD800, 0xDF02, 0x61} , {0x004D, 0x0430, 0x4E8C, 0x10302}},
   {{0x41, 0xD800, 0xDF02, 0x61}, {0x10302}},
-  {{0x41, 0xD800, 0xDF02}, {-1}},
-  {{0x41, 0x61, 0xD800, 0xDF02}, {0x61, -1}},
-  {{0x41, 0xD800, 0x61, 0xDF02}, {-1, 0x61}},
-  {{0x41, 0xDF00, 0x61}, {-1}},
+  {{0x41, 0xD800, 0xDF02}, {(hb_codepoint_t) -1}},
+  {{0x41, 0x61, 0xD800, 0xDF02}, {0x61, (hb_codepoint_t) -1}},
+  {{0x41, 0xD800, 0x61, 0xDF02}, {(hb_codepoint_t) -1, 0x61}},
+  {{0x41, 0xDF00, 0x61}, {(hb_codepoint_t) -1}},
   {{0x41, 0x61}, {0}}
 };
 
   {{0x41, 0x61}, {0}}
 };
 
@@ -764,15 +764,15 @@ typedef struct {
 
 /* note: we skip the first and last item from utf32 when adding to buffer */
 static const utf32_conversion_test_t utf32_conversion_tests[] = {
 
 /* note: we skip the first and last item from utf32 when adding to buffer */
 static const utf32_conversion_test_t utf32_conversion_tests[] = {
-  {{0x41, 0x004D, 0x0430, 0x4E8C, 0xD800, 0xDF02, 0x61} , {0x004D, 0x0430, 0x4E8C, -3, -3}},
+  {{0x41, 0x004D, 0x0430, 0x4E8C, 0xD800, 0xDF02, 0x61} , {0x004D, 0x0430, 0x4E8C, (hb_codepoint_t) -3, (hb_codepoint_t) -3}},
   {{0x41, 0x004D, 0x0430, 0x4E8C, 0x10302, 0x61} , {0x004D, 0x0430, 0x4E8C, 0x10302}},
   {{0x41, 0x004D, 0x0430, 0x4E8C, 0x10302, 0x61} , {0x004D, 0x0430, 0x4E8C, 0x10302}},
-  {{0x41, 0xD800, 0xDF02, 0x61}, {-3, -3}},
-  {{0x41, 0xD800, 0xDF02}, {-3}},
-  {{0x41, 0x61, 0xD800, 0xDF02}, {0x61, -3}},
-  {{0x41, 0xD800, 0x61, 0xDF02}, {-3, 0x61}},
-  {{0x41, 0xDF00, 0x61}, {-3}},
+  {{0x41, 0xD800, 0xDF02, 0x61}, {(hb_codepoint_t) -3, (hb_codepoint_t) -3}},
+  {{0x41, 0xD800, 0xDF02}, {(hb_codepoint_t) -3}},
+  {{0x41, 0x61, 0xD800, 0xDF02}, {0x61, (hb_codepoint_t) -3}},
+  {{0x41, 0xD800, 0x61, 0xDF02}, {(hb_codepoint_t) -3, 0x61}},
+  {{0x41, 0xDF00, 0x61}, {(hb_codepoint_t) -3}},
   {{0x41, 0x10FFFF, 0x61}, {0x10FFFF}},
   {{0x41, 0x10FFFF, 0x61}, {0x10FFFF}},
-  {{0x41, 0x110000, 0x61}, {-3}},
+  {{0x41, 0x110000, 0x61}, {(hb_codepoint_t) -3}},
   {{0x41, 0x61}, {0}}
 };
 
   {{0x41, 0x61}, {0}}
 };
 
index 6e8602f..4b43b83 100644 (file)
@@ -27,7 +27,9 @@
 /* This file tests that all headers can be included from .c files */
 
 
 /* This file tests that all headers can be included from .c files */
 
 
+#ifdef HAVE_CONFIG_H
 #include <config.h>
 #include <config.h>
+#endif
 
 #include <hb.h>
 
 
 #include <hb.h>
 
diff --git a/test/api/test-ot-color.c b/test/api/test-ot-color.c
new file mode 100644 (file)
index 0000000..22584d2
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * Copyright © 2016  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): Sascha Brawer
+ */
+
+#include "hb-test.h"
+
+#include <hb-ot.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/* Unit tests for hb-ot-color.h */
+
+/* Test font with the following CPAL v0 table, as TTX and manual disassembly:
+
+  <CPAL>
+    <version value="0"/>
+    <numPaletteEntries value="2"/>
+    <palette index="0">
+      <color index="0" value="#000000FF"/>
+      <color index="1" value="#66CCFFFF"/>
+    </palette>
+    <palette index="1">
+      <color index="0" value="#000000FF"/>
+      <color index="1" value="#800000FF"/>
+    </palette>
+  </CPAL>
+
+   0 | 0000                           # version=0
+   2 | 0002                           # numPaletteEntries=2
+   4 | 0002                           # numPalettes=2
+   6 | 0004                           # numColorRecords=4
+   8 | 00000010                       # offsetToFirstColorRecord=16
+  12 | 0000 0002                      # colorRecordIndex=[0, 2]
+  16 | 000000ff ffcc66ff              # colorRecord #0, #1 (BGRA)
+  24 | 000000ff 000080ff              # colorRecord #2, #3 (BGRA)
+ */
+static hb_face_t *cpal_v0 = NULL;
+
+/* Test font with the following CPAL v1 table, as TTX and manual disassembly:
+
+  <CPAL>
+    <version value="1"/>
+    <numPaletteEntries value="2"/>
+    <palette index="0" label="257" type="2">
+      <color index="0" value="#000000FF"/>
+      <color index="1" value="#66CCFFFF"/>
+    </palette>
+    <palette index="1" label="65535" type="1">
+      <color index="0" value="#000000FF"/>
+      <color index="1" value="#FFCC66FF"/>
+    </palette>
+    <palette index="2" label="258" type="0">
+      <color index="0" value="#000000FF"/>
+      <color index="1" value="#800000FF"/>
+    </palette>
+    <paletteEntryLabels>
+      <label index="0" value="65535"/>
+      <label index="1" value="256"/>
+    </paletteEntryLabels>
+  </CPAL>
+
+   0 | 0001                           # version=1
+   2 | 0002                           # numPaletteEntries=2
+   4 | 0003                           # numPalettes=3
+   6 | 0006                           # numColorRecords=6
+   8 | 0000001e                       # offsetToFirstColorRecord=30
+  12 | 0000 0002 0004                 # colorRecordIndex=[0, 2, 4]
+  18 | 00000036                       # offsetToPaletteTypeArray=54
+  22 | 00000042                       # offsetToPaletteLabelArray=66
+  26 | 00000048                       # offsetToPaletteEntryLabelArray=72
+  30 | 000000ff ffcc66ff 000000ff     # colorRecord #0, #1, #2 (BGRA)
+  42 | 66ccffff 000000ff 000080ff     # colorRecord #3, #4, #5 (BGRA)
+  54 | 00000002 00000001 00000000     # paletteFlags=[2, 1, 0]
+  66 | 0101 ffff 0102                 # paletteName=[257, 0xffff, 258]
+  72 | ffff 0100                      # paletteEntryLabel=[0xffff, 256]
+*/
+static hb_face_t *cpal_v1 = NULL;
+
+
+#define assert_color_rgba(colors, i, r, g, b, a) G_STMT_START {        \
+  const hb_ot_color_t *_colors = (colors); \
+  const size_t _i = (i); \
+  const uint8_t red = (r), green = (g), blue = (b), alpha = (a); \
+  if (_colors[_i].red != red) { \
+    g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
+                               "colors[" #i "].red", _colors[_i].red, "==", red, 'x'); \
+  } \
+  if (_colors[_i].green != green) { \
+    g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
+                               "colors[" #i "].green", _colors[_i].green, "==", green, 'x'); \
+  } \
+  if (_colors[_i].blue != blue) { \
+    g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
+                               "colors[" #i "].blue", colors[i].blue, "==", blue, 'x'); \
+  } \
+  if (_colors[_i].alpha != alpha) { \
+    g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
+                               "colors[" #i "].alpha", _colors[_i].alpha, "==", alpha, 'x'); \
+  } \
+} G_STMT_END
+
+
+#if 0
+static void
+test_hb_ot_color_get_palette_count (void)
+{
+  g_assert_cmpint (hb_ot_color_get_palette_count (hb_face_get_empty()), ==, 0);
+  g_assert_cmpint (hb_ot_color_get_palette_count (cpal_v0), ==, 2);
+  g_assert_cmpint (hb_ot_color_get_palette_count (cpal_v1), ==, 3);
+}
+
+
+static void
+test_hb_ot_color_get_palette_name_id_empty (void)
+{
+  /* numPalettes=0, so all calls are for out-of-bounds palette indices */
+  g_assert_cmpint (hb_ot_color_get_palette_name_id (hb_face_get_empty(), 0), ==, 0xffff);
+  g_assert_cmpint (hb_ot_color_get_palette_name_id (hb_face_get_empty(), 1), ==, 0xffff);
+}
+
+
+static void
+test_hb_ot_color_get_palette_name_id_v0 (void)
+{
+  g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v0, 0), ==, 0xffff);
+  g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v0, 1), ==, 0xffff);
+
+  /* numPalettes=2, so palette #2 is out of bounds */
+  g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v0, 2), ==, 0xffff);
+}
+
+
+static void
+test_hb_ot_color_get_palette_name_id_v1 (void)
+{
+  g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v1, 0), ==, 257);
+  g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v1, 1), ==, 0xffff);
+  g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v1, 2), ==, 258);
+
+  /* numPalettes=3, so palette #3 is out of bounds */
+  g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v1, 3), ==, 0xffff);
+}
+
+static void
+test_hb_ot_color_get_palette_flags_empty (void)
+{
+  /* numPalettes=0, so all calls are for out-of-bounds palette indices */
+  g_assert_cmpint (hb_ot_color_get_palette_flags (hb_face_get_empty(), 0), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+  g_assert_cmpint (hb_ot_color_get_palette_flags (hb_face_get_empty(), 1), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+}
+
+
+static void
+test_hb_ot_color_get_palette_flags_v0 (void)
+{
+  g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v0, 0), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+  g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v0, 1), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+
+  /* numPalettes=2, so palette #2 is out of bounds */
+  g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v0, 2), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+}
+
+
+static void
+test_hb_ot_color_get_palette_flags_v1 (void)
+{
+  g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v1, 0), ==, HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND);
+  g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v1, 1), ==, HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND);
+  g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v0, 2), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+
+  /* numPalettes=3, so palette #3 is out of bounds */
+  g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v0, 3), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+}
+
+
+static void
+test_hb_ot_color_get_palette_colors_empty (void)
+{
+  hb_face_t *empty = hb_face_get_empty ();
+  g_assert_cmpint (hb_ot_color_get_palette_colors (empty, 0, 0, NULL, NULL), ==, 0);
+}
+
+
+static void
+test_hb_ot_color_get_palette_colors_v0 (void)
+{
+  unsigned int num_colors = hb_ot_color_get_palette_colors (cpal_v0, 0, 0, NULL, NULL);
+  hb_ot_color_t *colors = (hb_ot_color_t*) alloca (num_colors * sizeof (hb_ot_color_t));
+  size_t colors_size = num_colors * sizeof(*colors);
+  g_assert_cmpint (num_colors, ==, 2);
+
+  /* Palette #0, start_index=0 */
+  g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 0, 0, &num_colors, colors), ==, 2);
+  g_assert_cmpint (num_colors, ==, 2);
+  assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
+  assert_color_rgba (colors, 1, 0x66, 0xcc, 0xff, 0xff);
+
+  /* Palette #1, start_index=0 */
+  g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 1, 0, &num_colors, colors), ==, 2);
+  g_assert_cmpint (num_colors, ==, 2);
+  assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
+  assert_color_rgba (colors, 1, 0x80, 0x00, 0x00, 0xff);
+
+  /* Palette #2 (there are only #0 and #1 in the font, so this is out of bounds) */
+  g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 2, 0, &num_colors, colors), ==, 0);
+
+  /* Palette #0, start_index=1 */
+  memset(colors, 0x33, colors_size);
+  num_colors = 2;
+  g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 0, 1, &num_colors, colors), ==, 2);
+  g_assert_cmpint (num_colors, ==, 1);
+  assert_color_rgba (colors, 0, 0x66, 0xcc, 0xff, 0xff);
+  assert_color_rgba (colors, 1, 0x33, 0x33, 0x33, 0x33);  /* untouched */
+
+  /* Palette #0, start_index=0, pretend that we have only allocated space for 1 color */
+  memset(colors, 0x44, colors_size);
+  num_colors = 1;
+  g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 0, 0, &num_colors, colors), ==, 2);
+  g_assert_cmpint (num_colors, ==, 1);
+  assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
+  assert_color_rgba (colors, 1, 0x44, 0x44, 0x44, 0x44);  /* untouched */
+
+  /* start_index > numPaletteEntries */
+  memset(colors, 0x44, colors_size);
+  num_colors = 2;
+  g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 0, 9876, &num_colors, colors), ==, 2);
+  g_assert_cmpint (num_colors, ==, 0);
+  assert_color_rgba (colors, 0, 0x44, 0x44, 0x44, 0x44);  /* untouched */
+  assert_color_rgba (colors, 1, 0x44, 0x44, 0x44, 0x44);  /* untouched */
+}
+
+
+static void
+test_hb_ot_color_get_palette_colors_v1 (void)
+{
+  hb_ot_color_t colors[3];
+  unsigned int num_colors = hb_ot_color_get_palette_colors (cpal_v1, 0, 0, NULL, NULL);
+  size_t colors_size = 3 * sizeof(*colors);
+  g_assert_cmpint (num_colors, ==, 2);
+
+  /* Palette #0, start_index=0 */
+  memset(colors, 0x77, colors_size);
+  g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v1, 0, 0, &num_colors, colors), ==, 2);
+  g_assert_cmpint (num_colors, ==, 2);
+  assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
+  assert_color_rgba (colors, 1, 0x66, 0xcc, 0xff, 0xff);
+  assert_color_rgba (colors, 2, 0x77, 0x77, 0x77, 0x77);  /* untouched */
+
+  /* Palette #1, start_index=0 */
+  memset(colors, 0x77, colors_size);
+  g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v1, 1, 0, &num_colors, colors), ==, 2);
+  g_assert_cmpint (num_colors, ==, 2);
+  assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
+  assert_color_rgba (colors, 1, 0xff, 0xcc, 0x66, 0xff);
+  assert_color_rgba (colors, 2, 0x77, 0x77, 0x77, 0x77);  /* untouched */
+
+  /* Palette #2, start_index=0 */
+  memset(colors, 0x77, colors_size);
+  g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v1, 2, 0, &num_colors, colors), ==, 2);
+  g_assert_cmpint (num_colors, ==, 2);
+  assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
+  assert_color_rgba (colors, 1, 0x80, 0x00, 0x00, 0xff);
+  assert_color_rgba (colors, 2, 0x77, 0x77, 0x77, 0x77);  /* untouched */
+
+  /* Palette #3 (out of bounds), start_index=0 */
+  memset(colors, 0x77, colors_size);
+  g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v1, 3, 0, &num_colors, colors), ==, 0);
+  g_assert_cmpint (num_colors, ==, 0);
+  assert_color_rgba (colors, 0, 0x77, 0x77, 0x77, 0x77);  /* untouched */
+  assert_color_rgba (colors, 1, 0x77, 0x77, 0x77, 0x77);  /* untouched */
+  assert_color_rgba (colors, 2, 0x77, 0x77, 0x77, 0x77);  /* untouched */
+}
+#endif
+
+int
+main (int argc, char **argv)
+{
+  int status = 0;
+
+  hb_test_init (&argc, &argv);
+  // cpal_v0 = hb_test_load_face ("../shaping/data/in-house/fonts/e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf");
+  // cpal_v1 = hb_test_load_face ("../shaping/data/in-house/fonts/319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf");
+  // hb_test_add (test_hb_ot_color_get_palette_count);
+  // hb_test_add (test_hb_ot_color_get_palette_name_id_empty);
+  // hb_test_add (test_hb_ot_color_get_palette_name_id_v0);
+  // hb_test_add (test_hb_ot_color_get_palette_name_id_v1);
+  // hb_test_add (test_hb_ot_color_get_palette_flags_empty);
+  // hb_test_add (test_hb_ot_color_get_palette_flags_v0);
+  // hb_test_add (test_hb_ot_color_get_palette_flags_v1);
+  // hb_test_add (test_hb_ot_color_get_palette_colors_empty);
+  // hb_test_add (test_hb_ot_color_get_palette_colors_v0);
+  // hb_test_add (test_hb_ot_color_get_palette_colors_v1);
+  status = hb_test_run();
+  hb_face_destroy (cpal_v0);
+  hb_face_destroy (cpal_v1);
+  return status;
+}
index f5cbd9d..6fe79b4 100644 (file)
@@ -37,7 +37,7 @@ static void
 test_simple_tags (const char *s, hb_script_t script)
 {
   hb_script_t tag;
 test_simple_tags (const char *s, hb_script_t script)
 {
   hb_script_t tag;
-  hb_script_t t1, t2;
+  hb_tag_t t1, t2;
 
   g_test_message ("Testing script %c%c%c%c: tag %s", HB_UNTAG (hb_script_to_iso15924_tag (script)), s);
   tag = hb_tag_from_string (s, -1);
 
   g_test_message ("Testing script %c%c%c%c: tag %s", HB_UNTAG (hb_script_to_iso15924_tag (script)), s);
   tag = hb_tag_from_string (s, -1);
@@ -72,7 +72,7 @@ test_indic_tags (const char *s1, const char *s2, hb_script_t script)
 static void
 test_ot_tag_script_degenerate (void)
 {
 static void
 test_ot_tag_script_degenerate (void)
 {
-  hb_script_t t1, t2;
+  hb_tag_t t1, t2;
 
   g_assert_cmphex (HB_TAG_CHAR4 ("DFLT"), ==, HB_OT_TAG_DEFAULT_SCRIPT);
 
 
   g_assert_cmphex (HB_TAG_CHAR4 ("DFLT"), ==, HB_OT_TAG_DEFAULT_SCRIPT);
 
index 9634951..15958c5 100644 (file)
 static void
 test_empty (hb_set_t *s)
 {
 static void
 test_empty (hb_set_t *s)
 {
-  hb_codepoint_t next = HB_SET_VALUE_INVALID;
+  hb_codepoint_t next;
   g_assert_cmpint (hb_set_get_population (s), ==, 0);
   g_assert_cmpint (hb_set_get_min (s), ==, HB_SET_VALUE_INVALID);
   g_assert_cmpint (hb_set_get_max (s), ==, HB_SET_VALUE_INVALID);
   g_assert (!hb_set_has (s, 13));
   g_assert_cmpint (hb_set_get_population (s), ==, 0);
   g_assert_cmpint (hb_set_get_min (s), ==, HB_SET_VALUE_INVALID);
   g_assert_cmpint (hb_set_get_max (s), ==, HB_SET_VALUE_INVALID);
   g_assert (!hb_set_has (s, 13));
+  next = 53043;
   g_assert (!hb_set_next (s, &next));
   g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
   g_assert (!hb_set_next (s, &next));
   g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
+  next = 07734;
+  g_assert (!hb_set_previous (s, &next));
+  g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
   g_assert (hb_set_is_empty (s));
 }
 
 static void
 test_not_empty (hb_set_t *s)
 {
   g_assert (hb_set_is_empty (s));
 }
 
 static void
 test_not_empty (hb_set_t *s)
 {
-  hb_codepoint_t next = HB_SET_VALUE_INVALID;
+  hb_codepoint_t next;
   g_assert_cmpint (hb_set_get_population (s), !=, 0);
   g_assert_cmpint (hb_set_get_min (s), !=, HB_SET_VALUE_INVALID);
   g_assert_cmpint (hb_set_get_max (s), !=, HB_SET_VALUE_INVALID);
   g_assert_cmpint (hb_set_get_population (s), !=, 0);
   g_assert_cmpint (hb_set_get_min (s), !=, HB_SET_VALUE_INVALID);
   g_assert_cmpint (hb_set_get_max (s), !=, HB_SET_VALUE_INVALID);
+  next = HB_SET_VALUE_INVALID;
   g_assert (hb_set_next (s, &next));
   g_assert_cmpint (next, !=, HB_SET_VALUE_INVALID);
   g_assert (hb_set_next (s, &next));
   g_assert_cmpint (next, !=, HB_SET_VALUE_INVALID);
+  next = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_previous (s, &next));
+  g_assert_cmpint (next, !=, HB_SET_VALUE_INVALID);
 }
 
 static void
 }
 
 static void
@@ -76,12 +84,6 @@ test_set_basic (void)
   g_assert_cmpint (hb_set_get_min (s), ==, 10);
   g_assert_cmpint (hb_set_get_max (s), ==, 29);
 
   g_assert_cmpint (hb_set_get_min (s), ==, 10);
   g_assert_cmpint (hb_set_get_max (s), ==, 29);
 
-  hb_set_invert (s);
-  test_not_empty (s);
-  g_assert (!hb_set_has (s, 13));
-  g_assert_cmpint (hb_set_get_min (s), ==, 0);
-
-  hb_set_invert (s);
   test_not_empty (s);
   g_assert (hb_set_has (s, 13));
   g_assert_cmpint (hb_set_get_population (s), ==, 20);
   test_not_empty (s);
   g_assert (hb_set_has (s, 13));
   g_assert_cmpint (hb_set_get_population (s), ==, 20);
@@ -92,18 +94,56 @@ test_set_basic (void)
   test_not_empty (s);
   g_assert (!hb_set_has (s, 13));
 
   test_not_empty (s);
   g_assert (!hb_set_has (s, 13));
 
+  hb_set_add_range (s, 200, 800);
+  test_not_empty (s);
+  g_assert (!hb_set_has (s, 100));
+  g_assert (!hb_set_has (s, 199));
+  g_assert (hb_set_has (s, 200));
+  g_assert (hb_set_has (s, 201));
+  g_assert (hb_set_has (s, 243));
+  g_assert (hb_set_has (s, 254));
+  g_assert (hb_set_has (s, 255));
+  g_assert (hb_set_has (s, 256));
+  g_assert (hb_set_has (s, 257));
+  g_assert (hb_set_has (s, 511));
+  g_assert (hb_set_has (s, 512));
+  g_assert (hb_set_has (s, 600));
+  g_assert (hb_set_has (s, 767));
+  g_assert (hb_set_has (s, 768));
+  g_assert (hb_set_has (s, 769));
+  g_assert (hb_set_has (s, 782));
+  g_assert (hb_set_has (s, 798));
+  g_assert (hb_set_has (s, 799));
+  g_assert (hb_set_has (s, 800));
+  g_assert (!hb_set_has (s, 801));
+  g_assert (!hb_set_has (s, 802));
+
   hb_set_destroy (s);
 }
 
   hb_set_destroy (s);
 }
 
+
+// static inline void
+// print_set (hb_set_t *s)
+// {
+//   hb_codepoint_t next;
+//   printf ("{");
+//   for (next = HB_SET_VALUE_INVALID; hb_set_next (s, &next); )
+//     printf ("%d, ", next);
+//   printf ("}\n");
+// }
+
 static void
 test_set_algebra (void)
 {
   hb_set_t *s = hb_set_create ();
   hb_set_t *o = hb_set_create ();
 static void
 test_set_algebra (void)
 {
   hb_set_t *s = hb_set_create ();
   hb_set_t *o = hb_set_create ();
+  hb_set_t *o2 = hb_set_create ();
 
   hb_set_add (o, 13);
   hb_set_add (o, 19);
 
 
   hb_set_add (o, 13);
   hb_set_add (o, 19);
 
+  hb_set_add (o2, 0x660E);
+
   test_empty (s);
   g_assert (!hb_set_is_equal (s, o));
   hb_set_set (s, o);
   test_empty (s);
   g_assert (!hb_set_is_equal (s, o));
   hb_set_set (s, o);
@@ -122,6 +162,13 @@ test_set_algebra (void)
 
   hb_set_clear (s);
   test_empty (s);
 
   hb_set_clear (s);
   test_empty (s);
+  g_assert_cmpint (hb_set_get_population (s), ==, 0);
+  hb_set_union (s, o2);
+  g_assert_cmpint (hb_set_get_population (s), ==, 1);
+  g_assert (hb_set_has (s, 0x660E));
+
+  hb_set_clear (s);
+  test_empty (s);
   hb_set_add_range (s, 10, 17);
   g_assert (!hb_set_is_equal (s, o));
   hb_set_intersect (s, o);
   hb_set_add_range (s, 10, 17);
   g_assert (!hb_set_is_equal (s, o));
   hb_set_intersect (s, o);
@@ -155,7 +202,56 @@ test_set_algebra (void)
   g_assert (!hb_set_has (s, 13));
   g_assert (hb_set_has (s, 19));
 
   g_assert (!hb_set_has (s, 13));
   g_assert (hb_set_has (s, 19));
 
+  /* https://github.com/harfbuzz/harfbuzz/issues/579 */
+  hb_set_clear (s);
+  test_empty (s);
+  hb_set_add_range (s, 886, 895);
+  hb_set_add (s, 1024);
+  hb_set_add (s, 1152);
+  hb_set_clear (o);
+  test_empty (o);
+  hb_set_add (o, 889);
+  hb_set_add (o, 1024);
+  g_assert (!hb_set_is_equal (s, o));
+  hb_set_intersect (o, s);
+  test_not_empty (o);
+  g_assert (!hb_set_is_equal (s, o));
+  g_assert_cmpint (hb_set_get_population (o), ==, 2);
+  g_assert (hb_set_has (o, 889));
+  g_assert (hb_set_has (o, 1024));
+  hb_set_clear (o);
+  test_empty (o);
+  hb_set_add_range (o, 887, 889);
+  hb_set_add (o, 1121);
+  g_assert (!hb_set_is_equal (s, o));
+  hb_set_intersect (o, s);
+  test_not_empty (o);
+  g_assert (!hb_set_is_equal (s, o));
+  g_assert_cmpint (hb_set_get_population (o), ==, 3);
+  g_assert (hb_set_has (o, 887));
+  g_assert (hb_set_has (o, 888));
+  g_assert (hb_set_has (o, 889));
+
+  hb_set_clear (s);
+  test_empty (s);
+  hb_set_add_range (s, 886, 895);
+  hb_set_add (s, 1014);
+  hb_set_add (s, 1017);
+  hb_set_add (s, 1024);
+  hb_set_add (s, 1113);
+  hb_set_add (s, 1121);
+  g_assert_cmpint (hb_set_get_population (s), ==, 15);
+
+  hb_set_clear (o);
+  test_empty (o);
+  hb_set_add (o, 889);
+  g_assert_cmpint (hb_set_get_population (o), ==, 1);
+  hb_set_intersect (o, s);
+  g_assert_cmpint (hb_set_get_population (o), ==, 1);
+  g_assert (hb_set_has (o, 889));
+
   hb_set_destroy (s);
   hb_set_destroy (s);
+  hb_set_destroy (o);
 }
 
 static void
 }
 
 static void
@@ -167,6 +263,8 @@ test_set_iter (void)
   hb_set_add (s, 13);
   hb_set_add_range (s, 6, 6);
   hb_set_add_range (s, 10, 15);
   hb_set_add (s, 13);
   hb_set_add_range (s, 6, 6);
   hb_set_add_range (s, 10, 15);
+  hb_set_add (s, 1100);
+  hb_set_add (s, 1200);
   hb_set_add (s, 20005);
 
   test_not_empty (s);
   hb_set_add (s, 20005);
 
   test_not_empty (s);
@@ -184,10 +282,35 @@ test_set_iter (void)
   g_assert (hb_set_next (s, &next));
   g_assert_cmpint (next, ==, 15);
   g_assert (hb_set_next (s, &next));
   g_assert (hb_set_next (s, &next));
   g_assert_cmpint (next, ==, 15);
   g_assert (hb_set_next (s, &next));
+  g_assert_cmpint (next, ==, 1100);
+  g_assert (hb_set_next (s, &next));
+  g_assert_cmpint (next, ==, 1200);
+  g_assert (hb_set_next (s, &next));
   g_assert_cmpint (next, ==, 20005);
   g_assert (!hb_set_next (s, &next));
   g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
 
   g_assert_cmpint (next, ==, 20005);
   g_assert (!hb_set_next (s, &next));
   g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
 
+  next = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_previous (s, &next));
+  g_assert_cmpint (next, ==, 20005);
+  g_assert (hb_set_previous (s, &next));
+  g_assert_cmpint (next, ==, 1200);
+  g_assert (hb_set_previous (s, &next));
+  g_assert_cmpint (next, ==, 1100);
+  g_assert (hb_set_previous (s, &next));
+  g_assert_cmpint (next, ==, 15);
+  g_assert (hb_set_previous (s, &next));
+  g_assert (hb_set_previous (s, &next));
+  g_assert_cmpint (next, ==, 13);
+  g_assert (hb_set_previous (s, &next));
+  g_assert (hb_set_previous (s, &next));
+  g_assert (hb_set_previous (s, &next));
+  g_assert_cmpint (next, ==, 10);
+  g_assert (hb_set_previous (s, &next));
+  g_assert_cmpint (next, ==, 6);
+  g_assert (!hb_set_previous (s, &next));
+  g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
+
   first = last = HB_SET_VALUE_INVALID;
   g_assert (hb_set_next_range (s, &first, &last));
   g_assert_cmpint (first, ==, 6);
   first = last = HB_SET_VALUE_INVALID;
   g_assert (hb_set_next_range (s, &first, &last));
   g_assert_cmpint (first, ==, 6);
@@ -196,12 +319,38 @@ test_set_iter (void)
   g_assert_cmpint (first, ==, 10);
   g_assert_cmpint (last,  ==, 15);
   g_assert (hb_set_next_range (s, &first, &last));
   g_assert_cmpint (first, ==, 10);
   g_assert_cmpint (last,  ==, 15);
   g_assert (hb_set_next_range (s, &first, &last));
+  g_assert_cmpint (first, ==, 1100);
+  g_assert_cmpint (last,  ==, 1100);
+  g_assert (hb_set_next_range (s, &first, &last));
+  g_assert_cmpint (first, ==, 1200);
+  g_assert_cmpint (last,  ==, 1200);
+  g_assert (hb_set_next_range (s, &first, &last));
   g_assert_cmpint (first, ==, 20005);
   g_assert_cmpint (last,  ==, 20005);
   g_assert (!hb_set_next_range (s, &first, &last));
   g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID);
   g_assert_cmpint (last,  ==, HB_SET_VALUE_INVALID);
 
   g_assert_cmpint (first, ==, 20005);
   g_assert_cmpint (last,  ==, 20005);
   g_assert (!hb_set_next_range (s, &first, &last));
   g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID);
   g_assert_cmpint (last,  ==, HB_SET_VALUE_INVALID);
 
+  first = last = HB_SET_VALUE_INVALID;
+  g_assert (hb_set_previous_range (s, &first, &last));
+  g_assert_cmpint (first, ==, 20005);
+  g_assert_cmpint (last,  ==, 20005);
+  g_assert (hb_set_previous_range (s, &first, &last));
+  g_assert_cmpint (first, ==, 1200);
+  g_assert_cmpint (last,  ==, 1200);
+  g_assert (hb_set_previous_range (s, &first, &last));
+  g_assert_cmpint (first, ==, 1100);
+  g_assert_cmpint (last,  ==, 1100);
+  g_assert (hb_set_previous_range (s, &first, &last));
+  g_assert_cmpint (first, ==, 10);
+  g_assert_cmpint (last,  ==, 15);
+  g_assert (hb_set_previous_range (s, &first, &last));
+  g_assert_cmpint (first, ==, 6);
+  g_assert_cmpint (last,  ==, 6);
+  g_assert (!hb_set_previous_range (s, &first, &last));
+  g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID);
+  g_assert_cmpint (last,  ==, HB_SET_VALUE_INVALID);
+
   hb_set_destroy (s);
 }
 
   hb_set_destroy (s);
 }
 
diff --git a/test/api/test-subset-cmap.c b/test/api/test-subset-cmap.c
new file mode 100644 (file)
index 0000000..0771579
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Roderick Sheeter
+ */
+
+#include <stdbool.h>
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for cmap subsetting */
+
+static void
+test_subset_cmap (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Roboto-Regular.abc.ttf");
+  hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Roboto-Regular.ac.cmap-format12-only.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_set_add (codepoints, 97);
+  hb_set_add (codepoints, 99);
+  hb_face_t *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 ('c','m','a','p'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_cmap_noop (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.cmap-format12-only.ttf");
+
+  hb_set_t *codepoints = hb_set_create();
+  hb_set_add (codepoints, 97);
+  hb_set_add (codepoints, 98);
+  hb_set_add (codepoints, 99);
+  hb_face_t *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 ('c','m','a','p'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+}
+
+// TODO(rsheeter) test cmap to no codepoints
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_cmap);
+  hb_test_add (test_subset_cmap_noop);
+
+  return hb_test_run();
+}
diff --git a/test/api/test-subset-glyf.c b/test/api/test-subset-glyf.c
new file mode 100644 (file)
index 0000000..8e17e8d
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#include <stdbool.h>
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for hb-subset-glyf.h */
+
+static void check_maxp_field (uint8_t *raw_maxp, unsigned int offset, uint16_t expected_value)
+{
+  uint16_t actual_value = (raw_maxp[offset] << 8) + raw_maxp[offset + 1];
+  g_assert_cmpuint(expected_value, ==, actual_value);
+}
+
+static void check_maxp_num_glyphs (hb_face_t *face, uint16_t expected_num_glyphs, bool hints)
+{
+  hb_blob_t *maxp_blob = hb_face_reference_table (face, HB_TAG ('m','a','x', 'p'));
+
+  unsigned int maxp_len;
+  uint8_t *raw_maxp = (uint8_t *) hb_blob_get_data(maxp_blob, &maxp_len);
+
+  check_maxp_field (raw_maxp, 4, expected_num_glyphs); // numGlyphs
+  if (!hints)
+  {
+    check_maxp_field (raw_maxp, 14, 1); // maxZones
+    check_maxp_field (raw_maxp, 16, 0); // maxTwilightPoints
+    check_maxp_field (raw_maxp, 18, 0); // maxStorage
+    check_maxp_field (raw_maxp, 20, 0); // maxFunctionDefs
+    check_maxp_field (raw_maxp, 22, 0); // maxInstructionDefs
+    check_maxp_field (raw_maxp, 24, 0); // maxStackElements
+    check_maxp_field (raw_maxp, 26, 0); // maxSizeOfInstructions
+  }
+
+  hb_blob_destroy (maxp_blob);
+}
+
+static void
+test_subset_glyf (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Roboto-Regular.abc.ttf");
+  hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Roboto-Regular.ac.ttf");
+
+  hb_set_t *codepoints = hb_set_create();
+  hb_set_add (codepoints, 97);
+  hb_set_add (codepoints, 99);
+  hb_face_t *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','l','y','f'));
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('l','o','c', 'a'));
+  check_maxp_num_glyphs(face_abc_subset, 3, true);
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_glyf_with_components (void)
+{
+  hb_face_t *face_components = hb_subset_test_open_font ("fonts/Roboto-Regular.components.ttf");
+  hb_face_t *face_subset = hb_subset_test_open_font ("fonts/Roboto-Regular.components.subset.ttf");
+
+  hb_set_t *codepoints = hb_set_create();
+  hb_set_add (codepoints, 0x1fc);
+  hb_face_t *face_generated_subset = hb_subset_test_create_subset (face_components, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_subset, face_generated_subset, HB_TAG ('g','l','y','f'));
+  hb_subset_test_check (face_subset, face_generated_subset, HB_TAG ('l','o','c', 'a'));
+  check_maxp_num_glyphs(face_generated_subset, 4, true);
+
+  hb_face_destroy (face_generated_subset);
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_components);
+}
+
+static void
+test_subset_glyf_noop (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf");
+
+  hb_set_t *codepoints = hb_set_create();
+  hb_set_add (codepoints, 97);
+  hb_set_add (codepoints, 98);
+  hb_set_add (codepoints, 99);
+  hb_face_t *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','l','y','f'));
+  hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('l','o','c', 'a'));
+  check_maxp_num_glyphs(face_abc_subset, 4, true);
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+}
+
+static void
+test_subset_glyf_strip_hints_simple (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Roboto-Regular.abc.ttf");
+  hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Roboto-Regular.ac.nohints.ttf");
+
+  hb_set_t *codepoints = hb_set_create();
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'c');
+  hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
+  *hb_subset_input_drop_hints(input) = true;
+  hb_face_t *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 ('l','o','c', 'a'));
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('g','l','y','f'));
+  check_maxp_num_glyphs(face_abc_subset, 3, false);
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_glyf_strip_hints_composite (void)
+{
+  hb_face_t *face_components = hb_subset_test_open_font ("fonts/Roboto-Regular.components.ttf");
+  hb_face_t *face_subset = hb_subset_test_open_font ("fonts/Roboto-Regular.components.1fc.nohints.ttf");
+
+  hb_set_t *codepoints = hb_set_create();
+  hb_set_add (codepoints, 0x1fc);
+  hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
+  *hb_subset_input_drop_hints(input) = true;
+
+  hb_face_t *face_generated_subset = hb_subset_test_create_subset (face_components, input);
+  hb_set_destroy (codepoints);
+
+  hb_subset_test_check (face_subset, face_generated_subset, HB_TAG ('g','l','y','f'));
+  hb_subset_test_check (face_subset, face_generated_subset, HB_TAG ('l','o','c', 'a'));
+  check_maxp_num_glyphs(face_generated_subset, 4, false);
+
+  hb_face_destroy (face_generated_subset);
+  hb_face_destroy (face_subset);
+  hb_face_destroy (face_components);
+}
+
+// TODO(grieger): test for long loca generation.
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_glyf_noop);
+  hb_test_add (test_subset_glyf);
+  hb_test_add (test_subset_glyf_strip_hints_simple);
+  hb_test_add (test_subset_glyf_strip_hints_composite);
+  hb_test_add (test_subset_glyf_with_components);
+
+  return hb_test_run();
+}
diff --git a/test/api/test-subset-hdmx.c b/test/api/test-subset-hdmx.c
new file mode 100644 (file)
index 0000000..5211dbc
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#include <stdbool.h>
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for hdmx subsetting */
+
+
+static void
+test_subset_hdmx_simple_subset (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Roboto-Regular.abc.ttf");
+  hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Roboto-Regular.ac.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'c');
+  hb_face_t *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','d','m','x'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_hdmx_noop (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf");
+
+  hb_set_t *codepoints = hb_set_create();
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'b');
+  hb_set_add (codepoints, 'c');
+  hb_face_t *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','d','m','x'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_hdmx_simple_subset);
+  hb_test_add (test_subset_hdmx_noop);
+
+  return hb_test_run();
+}
diff --git a/test/api/test-subset-hmtx.c b/test/api/test-subset-hmtx.c
new file mode 100644 (file)
index 0000000..2b76452
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Roderick Sheeter
+ */
+
+#include <stdbool.h>
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for hmtx subsetting */
+
+static void check_num_hmetrics(hb_face_t *face, uint16_t expected_num_hmetrics)
+{
+  hb_blob_t *hhea_blob = hb_face_reference_table (face, HB_TAG ('h','h','e','a'));
+  hb_blob_t *hmtx_blob = hb_face_reference_table (face, HB_TAG ('h','m','t','x'));
+
+  // TODO I sure wish I could just use the hmtx table struct!
+  unsigned int hhea_len;
+  uint8_t *raw_hhea = (uint8_t *) hb_blob_get_data(hhea_blob, &hhea_len);
+  uint16_t num_hmetrics = (raw_hhea[hhea_len - 2] << 8) + raw_hhea[hhea_len - 1];
+  g_assert_cmpuint(expected_num_hmetrics, ==, num_hmetrics);
+
+  hb_blob_destroy (hhea_blob);
+  hb_blob_destroy (hmtx_blob);
+}
+
+static void
+test_subset_hmtx_simple_subset (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Roboto-Regular.abc.ttf");
+  hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Roboto-Regular.ac.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'c');
+  hb_face_t *face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  check_num_hmetrics(face_abc_subset, 3); /* nothing has same width */
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('h','m','t','x'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+
+static void
+test_subset_hmtx_monospace (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Inconsolata-Regular.abc.ttf");
+  hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Inconsolata-Regular.ac.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'c');
+  hb_face_t *face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  check_num_hmetrics(face_abc_subset, 1); /* everything has same width */
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('h','m','t','x'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+
+static void
+test_subset_hmtx_keep_num_metrics (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Inconsolata-Regular.abc.widerc.ttf");
+  hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Inconsolata-Regular.ac.widerc.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'c');
+  hb_face_t *face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  check_num_hmetrics(face_abc_subset, 3); /* c is wider */
+  hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('h','m','t','x'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_hmtx_decrease_num_metrics (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Inconsolata-Regular.abc.widerc.ttf");
+  hb_face_t *face_ab = hb_subset_test_open_font ("fonts/Inconsolata-Regular.ab.ttf");
+
+  hb_set_t *codepoints = hb_set_create ();
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'b');
+  hb_face_t *face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  check_num_hmetrics(face_abc_subset, 1); /* everything left has same width */
+  hb_subset_test_check (face_ab, face_abc_subset, HB_TAG ('h','m','t','x'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_ab);
+}
+
+static void
+test_subset_hmtx_noop (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf");
+
+  hb_set_t *codepoints = hb_set_create();
+  hb_set_add (codepoints, 'a');
+  hb_set_add (codepoints, 'b');
+  hb_set_add (codepoints, 'c');
+  hb_face_t *face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+  hb_set_destroy (codepoints);
+
+  check_num_hmetrics(face_abc_subset, 4); /* nothing has same width */
+  hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('h','m','t','x'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_hmtx_simple_subset);
+  hb_test_add (test_subset_hmtx_monospace);
+  hb_test_add (test_subset_hmtx_keep_num_metrics);
+  hb_test_add (test_subset_hmtx_decrease_num_metrics);
+  hb_test_add (test_subset_hmtx_noop);
+
+  return hb_test_run();
+}
diff --git a/test/api/test-subset-os2.c b/test/api/test-subset-os2.c
new file mode 100644 (file)
index 0000000..e9db9be
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger
+ */
+
+#include <stdbool.h>
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+static void
+test_subset_os2 (void)
+{
+  hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf");
+  hb_face_t *face_b = hb_subset_test_open_font("fonts/Roboto-Regular.b.ttf");
+
+  hb_set_t *codepoints = hb_set_create();
+  hb_set_add (codepoints, 98);
+  hb_face_t *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_b, face_abc_subset, HB_TAG ('O','S','/','2'));
+
+  hb_face_destroy (face_abc_subset);
+  hb_face_destroy (face_abc);
+  hb_face_destroy (face_b);
+}
+
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_subset_os2);
+
+  return hb_test_run();
+}
diff --git a/test/fuzzing/CMakeLists.txt b/test/fuzzing/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e31c744
--- /dev/null
@@ -0,0 +1,18 @@
+if (HB_CHECK)
+  file (READ "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.am" MAKEFILEAM)
+  extract_make_variable (hb_fuzzer_SOURCES ${MAKEFILEAM})
+
+  # TODO: enable these two
+  #extract_make_variable (FUZZING_CPPFLAGS ${MAKEFILEAM}) # extracting regex fail
+  #add_executable (hb-fuzzer # it should be run only after ragel execution
+  #  ${project_sources} ${project_extra_sources} ${project_headers}
+  #  ${hb_fuzzer_SOURCES})
+
+  add_executable (hb-fuzzer ${hb_fuzzer_SOURCES})
+  target_link_libraries (hb-fuzzer harfbuzz)
+
+  target_compile_definitions(hb-fuzzer PUBLIC ${FUZZING_CPPFLAGS})
+  add_test (NAME hb-fuzzer
+    COMMAND python run-fuzzer-tests.py $<TARGET_FILE:hb-fuzzer>
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endif ()
index 3ea8605..a7f7362 100644 (file)
@@ -14,6 +14,8 @@ $(top_builddir)/src/libharfbuzz-fuzzing.la: lib
 
 EXTRA_DIST += \
        README \
 
 EXTRA_DIST += \
        README \
+       run-fuzzer-tests.py \
+       CMakeLists.txt \
        $(NULL)
 
 check_PROGRAMS = \
        $(NULL)
 
 check_PROGRAMS = \
@@ -45,9 +47,6 @@ hb_fuzzer_DEPENDENCIES = \
        $(NULL)
 
 check:
        $(NULL)
 
 check:
-       cat $(srcdir)/../shaping/tests/fuzzed.tests | \
-       cut -d: -f1 | while read x; do \
-               ./hb-fuzzer $(srcdir)/../shaping/$$x; \
-       done
+       EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" $(srcdir)/run-fuzzer-tests.py
 
 -include $(top_srcdir)/git.mk
 
 -include $(top_srcdir)/git.mk
index 59e7f8e..7e9d952 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # Process this file with automake to produce Makefile.in
 VPATH = @srcdir@
 
 # Process this file with automake to produce Makefile.in
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -81,16 +91,16 @@ build_triplet = @build@
 host_triplet = @host@
 check_PROGRAMS = hb-fuzzer$(EXEEXT) $(am__EXEEXT_1)
 subdir = test/fuzzing
 host_triplet = @host@
 check_PROGRAMS = hb-fuzzer$(EXEEXT) $(am__EXEEXT_1)
 subdir = test/fuzzing
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-       $(top_srcdir)/depcomp README
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-       $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
@@ -185,6 +195,7 @@ am__define_uniq_tagged_files = \
   done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
   done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
@@ -201,6 +212,12 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
@@ -228,6 +245,8 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
@@ -267,6 +286,7 @@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -275,6 +295,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -331,6 +352,7 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -351,6 +373,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -360,7 +383,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 NULL = 
-EXTRA_DIST = README $(NULL)
+EXTRA_DIST = README run-fuzzer-tests.py CMakeLists.txt $(NULL)
 CLEANFILES = 
 DISTCLEANFILES = 
 MAINTAINERCLEANFILES = 
 CLEANFILES = 
 DISTCLEANFILES = 
 MAINTAINERCLEANFILES = 
@@ -408,7 +431,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/fuzzing/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits test/fuzzing/Makefile
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/fuzzing/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits test/fuzzing/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -711,6 +733,8 @@ uninstall-am:
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
        tags tags-am uninstall uninstall-am
 
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
        tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # Convenience targets:
 lib:
 
 # Convenience targets:
 lib:
@@ -719,10 +743,7 @@ lib:
 $(top_builddir)/src/libharfbuzz-fuzzing.la: lib
 
 check:
 $(top_builddir)/src/libharfbuzz-fuzzing.la: lib
 
 check:
-       cat $(srcdir)/../shaping/tests/fuzzed.tests | \
-       cut -d: -f1 | while read x; do \
-               ./hb-fuzzer $(srcdir)/../shaping/$$x; \
-       done
+       EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" $(srcdir)/run-fuzzer-tests.py
 
 -include $(top_srcdir)/git.mk
 
 
 -include $(top_srcdir)/git.mk
 
index c858f5d..af99cf9 100644 (file)
@@ -18,4 +18,4 @@ The smaller the faster.
 For more details consult the following locations:
   - http://llvm.org/docs/LibFuzzer.html or
   - https://github.com/google/libfuzzer-bot/tree/master/harfbuzz
 For more details consult the following locations:
   - http://llvm.org/docs/LibFuzzer.html or
   - https://github.com/google/libfuzzer-bot/tree/master/harfbuzz
-  - https://github.com/behdad/harfbuzz/issues/139
+  - https://github.com/harfbuzz/harfbuzz/issues/139
diff --git a/test/fuzzing/run-fuzzer-tests.py b/test/fuzzing/run-fuzzer-tests.py
new file mode 100755 (executable)
index 0000000..9455a4b
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+
+from __future__ import print_function
+import sys, os, subprocess
+
+srcdir = os.environ.get ("srcdir", ".")
+EXEEXT = os.environ.get ("EXEEXT", "")
+top_builddir = os.environ.get ("top_builddir", ".")
+hb_fuzzer = os.path.join (top_builddir, "hb-fuzzer" + EXEEXT)
+
+if not os.path.exists (hb_fuzzer):
+       if len (sys.argv) == 1 or not os.path.exists (sys.argv[1]):
+               print ("""Failed to find hb-fuzzer binary automatically,
+please provide it as the first argument to the tool""")
+               sys.exit (1)
+
+       hb_fuzzer = sys.argv[1]
+
+print ('hb_fuzzer:', hb_fuzzer)
+fails = 0
+
+for line in open (os.path.join (srcdir, "..", "shaping", "data", "in-house", "tests", "fuzzed.tests")):
+       font = line.split (":")[0]
+
+       p = subprocess.Popen ([hb_fuzzer, os.path.join (srcdir, "..", "shaping", font)])
+
+       if p.wait () != 0:
+               fails = fails + 1
+
+if fails:
+       print ("%i fuzzer related tests failed." % fails)
+       sys.exit (1)
diff --git a/test/shaping/CMakeLists.txt b/test/shaping/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4bdc5c9
--- /dev/null
@@ -0,0 +1,17 @@
+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 run-tests.py $<TARGET_FILE:hb-shape> "data/in-house/${test}"
+      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  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 run-tests.py $<TARGET_FILE:hb-shape> "data/text-rendering-tests/${test}"
+      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  endforeach ()
+endif ()
index 89578e1..7320336 100644 (file)
@@ -3,33 +3,25 @@
 NULL =
 EXTRA_DIST =
 CLEANFILES =
 NULL =
 EXTRA_DIST =
 CLEANFILES =
-DISTCLEANFILES =
-MAINTAINERCLEANFILES =
+SUBDIRS = data
 
 # Convenience targets:
 lib:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
 
 
 # Convenience targets:
 lib:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
 
-manifests:
-       @$(srcdir)/hb-manifest-update "$(srcdir)/texts" "$(srcdir)/fonts" "$(srcdir)/tests"
-
 EXTRA_DIST += \
        README.md \
 EXTRA_DIST += \
        README.md \
+       CMakeLists.txt \
        hb-diff \
        hb-diff-colorize \
        hb-diff-filter-failures \
        hb-diff \
        hb-diff-colorize \
        hb-diff-filter-failures \
-       hb-diff-ngrams \
        hb-diff-stat \
        hb-diff-stat \
-       hb-manifest-read \
-       hb-manifest-update \
        hb-unicode-decode \
        hb-unicode-encode \
        hb-unicode-prettyname \
        record-test.sh \
        hb-unicode-decode \
        hb-unicode-encode \
        hb-unicode-prettyname \
        record-test.sh \
-       run-tests.sh \
-       texts/in-tree \
-       fonts/sha1sum \
-       $(TESTS) \
+       run-tests.py \
+       texts/in-house \
        $(NULL)
 
 # TODO Figure out Python stuff
        $(NULL)
 
 # TODO Figure out Python stuff
@@ -40,57 +32,4 @@ CLEANFILES += \
        hb_test_tools.py[co] \
        $(NULL)
 
        hb_test_tools.py[co] \
        $(NULL)
 
-TESTS = \
-       tests/arabic-fallback-shaping.tests \
-       tests/arabic-feature-order.tests \
-       tests/arabic-like-joining.tests \
-       tests/automatic-fractions.tests \
-       tests/cluster.tests \
-       tests/color-fonts.tests \
-       tests/context-matching.tests \
-       tests/cursive-positioning.tests \
-       tests/default-ignorables.tests \
-       tests/fallback-positioning.tests \
-       tests/fuzzed.tests \
-       tests/hangul-jamo.tests \
-       tests/hyphens.tests \
-       tests/indic-joiner-candrabindu.tests \
-       tests/indic-old-spec.tests \
-       tests/indic-pref-blocking.tests \
-       tests/language-tags.tests \
-       tests/ligature-id.tests \
-       tests/mark-filtering-sets.tests \
-       tests/mongolian-variation-selector.tests \
-       tests/spaces.tests \
-       tests/simple.tests \
-       tests/use.tests \
-       tests/use-marchen.tests \
-       tests/vertical.tests \
-       tests/zero-width-marks.tests \
-       $(NULL)
-
-TEST_EXTENSIONS = \
-       .tests \
-       $(NULL)
-
-AM_TESTS_ENVIRONMENT = \
-       EXEEXT="$(EXEEXT)"; \
-       export EXEEXT; \
-       srcdir="$(srcdir)"; \
-       export srcdir; \
-       builddir="$(builddir)"; \
-       export builddir; \
-       $(NULL)
-
-if AUTOMAKE_OLDER_THAN_1_13
-TESTS_ENVIRONMENT = \
-       $(AM_TESTS_ENVIRONMENT) \
-       $(TESTS_LOG_COMPILER) \
-       $(NULL)
-endif
-
-TESTS_LOG_COMPILER = sh $(srcdir)/run-tests.sh
-
-.PHONY: manifests
-
 -include $(top_srcdir)/git.mk
 -include $(top_srcdir)/git.mk
index e9748ba..ce11b9e 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # Process this file with automake to produce Makefile.in
 VPATH = @srcdir@
 
 # Process this file with automake to produce Makefile.in
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -79,33 +89,17 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-TESTS = tests/arabic-fallback-shaping.tests \
-       tests/arabic-feature-order.tests \
-       tests/arabic-like-joining.tests \
-       tests/automatic-fractions.tests tests/cluster.tests \
-       tests/color-fonts.tests tests/context-matching.tests \
-       tests/cursive-positioning.tests tests/default-ignorables.tests \
-       tests/fallback-positioning.tests tests/fuzzed.tests \
-       tests/hangul-jamo.tests tests/hyphens.tests \
-       tests/indic-joiner-candrabindu.tests \
-       tests/indic-old-spec.tests tests/indic-pref-blocking.tests \
-       tests/language-tags.tests tests/ligature-id.tests \
-       tests/mark-filtering-sets.tests \
-       tests/mongolian-variation-selector.tests tests/spaces.tests \
-       tests/simple.tests tests/use.tests tests/use-marchen.tests \
-       tests/vertical.tests tests/zero-width-marks.tests \
-       $(am__EXEEXT_1)
 subdir = test/shaping
 subdir = test/shaping
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-       $(top_srcdir)/test-driver
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-       $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
@@ -124,215 +118,74 @@ am__v_at_0 = @
 am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
 am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       distdir
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__tty_colors_dummy = \
-  mgn= red= grn= lgn= blu= brg= std=; \
-  am__color_tests=no
-am__tty_colors = { \
-  $(am__tty_colors_dummy); \
-  if test "X$(AM_COLOR_TESTS)" = Xno; then \
-    am__color_tests=no; \
-  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
-    am__color_tests=yes; \
-  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
-    am__color_tests=yes; \
-  fi; \
-  if test $$am__color_tests = yes; then \
-    red='\e[0;31m'; \
-    grn='\e[0;32m'; \
-    lgn='\e[1;32m'; \
-    blu='\e[1;34m'; \
-    mgn='\e[0;35m'; \
-    brg='\e[1m'; \
-    std='\e[m'; \
-  fi; \
-}
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__recheck_rx = ^[    ]*:recheck:[    ]*
-am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
-am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
-# A command that, given a newline-separated list of test names on the
-# standard input, print the name of the tests that are to be re-run
-# upon "make recheck".
-am__list_recheck_tests = $(AWK) '{ \
-  recheck = 1; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-        { \
-          if ((getline line2 < ($$0 ".log")) < 0) \
-           recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
-        { \
-          recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
-        { \
-          break; \
-        } \
-    }; \
-  if (recheck) \
-    print $$0; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# A command that, given a newline-separated list of test names on the
-# standard input, create the global log from their .trs and .log files.
-am__create_global_log = $(AWK) ' \
-function fatal(msg) \
-{ \
-  print "fatal: making $@: " msg | "cat >&2"; \
-  exit 1; \
-} \
-function rst_section(header) \
-{ \
-  print header; \
-  len = length(header); \
-  for (i = 1; i <= len; i = i + 1) \
-    printf "="; \
-  printf "\n\n"; \
-} \
-{ \
-  copy_in_global_log = 1; \
-  global_test_result = "RUN"; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-         fatal("failed to read from " $$0 ".trs"); \
-      if (line ~ /$(am__global_test_result_rx)/) \
-        { \
-          sub("$(am__global_test_result_rx)", "", line); \
-          sub("[       ]*$$", "", line); \
-          global_test_result = line; \
-        } \
-      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
-        copy_in_global_log = 0; \
-    }; \
-  if (copy_in_global_log) \
-    { \
-      rst_section(global_test_result ": " $$0); \
-      while ((rc = (getline line < ($$0 ".log"))) != 0) \
-      { \
-        if (rc < 0) \
-          fatal("failed to read from " $$0 ".log"); \
-        print line; \
-      }; \
-      printf "\n"; \
-    }; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# Restructured Text title.
-am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
-# Solaris 10 'make', and several other traditional 'make' implementations,
-# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
-# by disabling -e (using the XSI extension "set +e") if it's set.
-am__sh_e_setup = case $$- in *e*) set +e;; esac
-# Default flags passed to test drivers.
-am__common_driver_flags = \
-  --color-tests "$$am__color_tests" \
-  --enable-hard-errors "$$am__enable_hard_errors" \
-  --expect-failure "$$am__expect_failure"
-# To be inserted before the command running the test.  Creates the
-# directory for the log if needed.  Stores in $dir the directory
-# containing $f, in $tst the test, in $log the log.  Executes the
-# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
-# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
-# will run the test scripts (or their associated LOG_COMPILER, if
-# thy have one).
-am__check_pre = \
-$(am__sh_e_setup);                                     \
-$(am__vpath_adj_setup) $(am__vpath_adj)                        \
-$(am__tty_colors);                                     \
-srcdir=$(srcdir); export srcdir;                       \
-case "$@" in                                           \
-  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
-    *) am__odir=.;;                                    \
-esac;                                                  \
-test "x$$am__odir" = x"." || test -d "$$am__odir"      \
-  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
-if test -f "./$$f"; then dir=./;                       \
-elif test -f "$$f"; then dir=;                         \
-else dir="$(srcdir)/"; fi;                             \
-tst=$$dir$$f; log='$@';                                \
-if test -n '$(DISABLE_HARD_ERRORS)'; then              \
-  am__enable_hard_errors=no;                           \
-else                                                   \
-  am__enable_hard_errors=yes;                          \
-fi;                                                    \
-case " $(XFAIL_TESTS) " in                             \
-  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
-    am__expect_failure=yes;;                           \
-  *)                                                   \
-    am__expect_failure=no;;                            \
-esac;                                                  \
-$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
-# A shell command to get the names of the tests scripts with any registered
-# extension removed (i.e., equivalently, the names of the test logs, with
-# the '.log' extension removed).  The result is saved in the shell variable
-# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
-# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
-# since that might cause problem with VPATH rewrites for suffix-less tests.
-# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
-am__set_TESTS_bases = \
-  bases='$(TEST_LOGS)'; \
-  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
-  bases=`echo $$bases`
-RECHECK_LOGS = $(TEST_LOGS)
-AM_RECURSIVE_TARGETS = check recheck
-am__EXEEXT_1 =
-TEST_SUITE_LOG = test-suite.log
-am__test_logs1 = $(TESTS:=.log)
-am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
-TEST_LOGS = $(am__test_logs2:.tests.log=.log)
-TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
-TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
-       $(TESTS_LOG_FLAGS)
-am__set_b = \
-  case '$@' in \
-    */*) \
-      case '$*' in \
-        */*) b='$*';; \
-          *) b=`echo '$@' | sed 's/\.log$$//'`; \
-       esac;; \
-    *) \
-      b='$*';; \
-  esac
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -348,6 +201,12 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
@@ -375,6 +234,8 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
@@ -414,6 +275,7 @@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -422,6 +284,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -478,6 +341,7 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -498,6 +362,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -509,38 +374,15 @@ top_srcdir = @top_srcdir@
 NULL = 
 
 # TODO Figure out Python stuff
 NULL = 
 
 # TODO Figure out Python stuff
-EXTRA_DIST = README.md hb-diff hb-diff-colorize \
-       hb-diff-filter-failures hb-diff-ngrams hb-diff-stat \
-       hb-manifest-read hb-manifest-update hb-unicode-decode \
+EXTRA_DIST = README.md CMakeLists.txt hb-diff hb-diff-colorize \
+       hb-diff-filter-failures hb-diff-stat hb-unicode-decode \
        hb-unicode-encode hb-unicode-prettyname record-test.sh \
        hb-unicode-encode hb-unicode-prettyname record-test.sh \
-       run-tests.sh texts/in-tree fonts/sha1sum $(TESTS) $(NULL) \
-       hb_test_tools.py $(NULL)
+       run-tests.py texts/in-house $(NULL) hb_test_tools.py $(NULL)
 CLEANFILES = hb_test_tools.py[co] $(NULL)
 CLEANFILES = hb_test_tools.py[co] $(NULL)
-DISTCLEANFILES = 
-MAINTAINERCLEANFILES = 
-TEST_EXTENSIONS = \
-       .tests \
-       $(NULL)
-
-AM_TESTS_ENVIRONMENT = \
-       EXEEXT="$(EXEEXT)"; \
-       export EXEEXT; \
-       srcdir="$(srcdir)"; \
-       export srcdir; \
-       builddir="$(builddir)"; \
-       export builddir; \
-       $(NULL)
-
-@AUTOMAKE_OLDER_THAN_1_13_TRUE@TESTS_ENVIRONMENT = \
-@AUTOMAKE_OLDER_THAN_1_13_TRUE@        $(AM_TESTS_ENVIRONMENT) \
-@AUTOMAKE_OLDER_THAN_1_13_TRUE@        $(TESTS_LOG_COMPILER) \
-@AUTOMAKE_OLDER_THAN_1_13_TRUE@        $(NULL)
-
-TESTS_LOG_COMPILER = sh $(srcdir)/run-tests.sh
-all: all-am
+SUBDIRS = data
+all: all-recursive
 
 .SUFFIXES:
 
 .SUFFIXES:
-.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
@@ -553,7 +395,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits test/shaping/Makefile
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits test/shaping/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -577,168 +418,105 @@ mostlyclean-libtool:
 
 clean-libtool:
        -rm -rf .libs _libs
 
 clean-libtool:
        -rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-# Recover from deleted '.trs' file; this should ensure that
-# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
-# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
-# to avoid problems with "make -n".
-.log.trs:
-       rm -f $< $@
-       $(MAKE) $(AM_MAKEFLAGS) $<
-
-# Leading 'am--fnord' is there to ensure the list of targets does not
-# expand to empty, as could happen e.g. with make check TESTS=''.
-am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
-am--force-recheck:
-       @:
-
-$(TEST_SUITE_LOG): $(TEST_LOGS)
-       @$(am__set_TESTS_bases); \
-       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
-       redo_bases=`for i in $$bases; do \
-                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
-                   done`; \
-       if test -n "$$redo_bases"; then \
-         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
-         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
-         if $(am__make_dryrun); then :; else \
-           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
-         fi; \
-       fi; \
-       if test -n "$$am__remaking_logs"; then \
-         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
-              "recursion detected" >&2; \
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
        else \
        else \
-         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+         failcom='exit 1'; \
        fi; \
        fi; \
-       if $(am__make_dryrun); then :; else \
-         st=0;  \
-         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
-         for i in $$redo_bases; do \
-           test -f $$i.trs && test -r $$i.trs \
-             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
-           test -f $$i.log && test -r $$i.log \
-             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
-         done; \
-         test $$st -eq 0 || exit 1; \
-       fi
-       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
-       ws='[   ]'; \
-       results=`for b in $$bases; do echo $$b.trs; done`; \
-       test -n "$$results" || results=/dev/null; \
-       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
-       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
-       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
-       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
-       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
-       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
-       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
-       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
-         success=true; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
        else \
        else \
-         success=false; \
+         include_option=--include; \
+         empty_fix=; \
        fi; \
        fi; \
-       br='==================='; br=$$br$$br$$br$$br; \
-       result_count () \
-       { \
-           if test x"$$1" = x"--maybe-color"; then \
-             maybe_colorize=yes; \
-           elif test x"$$1" = x"--no-color"; then \
-             maybe_colorize=no; \
-           else \
-             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
-           fi; \
-           shift; \
-           desc=$$1 count=$$2; \
-           if test $$maybe_colorize = yes && test $$count -gt 0; then \
-             color_start=$$3 color_end=$$std; \
-           else \
-             color_start= color_end=; \
-           fi; \
-           echo "$${color_start}# $$desc $$count$${color_end}"; \
-       }; \
-       create_testsuite_report () \
-       { \
-         result_count $$1 "TOTAL:" $$all   "$$brg"; \
-         result_count $$1 "PASS: " $$pass  "$$grn"; \
-         result_count $$1 "SKIP: " $$skip  "$$blu"; \
-         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
-         result_count $$1 "FAIL: " $$fail  "$$red"; \
-         result_count $$1 "XPASS:" $$xpass "$$red"; \
-         result_count $$1 "ERROR:" $$error "$$mgn"; \
-       }; \
-       {                                                               \
-         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
-           $(am__rst_title);                                           \
-         create_testsuite_report --no-color;                           \
-         echo;                                                         \
-         echo ".. contents:: :depth: 2";                               \
-         echo;                                                         \
-         for b in $$bases; do echo $$b; done                           \
-           | $(am__create_global_log);                                 \
-       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
-       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
-       if $$success; then                                              \
-         col="$$grn";                                                  \
-        else                                                           \
-         col="$$red";                                                  \
-         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
-       fi;                                                             \
-       echo "$${col}$$br$${std}";                                      \
-       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
-       echo "$${col}$$br$${std}";                                      \
-       create_testsuite_report --maybe-color;                          \
-       echo "$$col$$br$$std";                                          \
-       if $$success; then :; else                                      \
-         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
-         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
-           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
-         fi;                                                           \
-         echo "$$col$$br$$std";                                        \
-       fi;                                                             \
-       $$success || exit 1
-
-check-TESTS:
-       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
-       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
-       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-       @set +e; $(am__set_TESTS_bases); \
-       log_list=`for i in $$bases; do echo $$i.log; done`; \
-       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
-       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
-       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
-       exit $$?;
-recheck: all 
-       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-       @set +e; $(am__set_TESTS_bases); \
-       bases=`for i in $$bases; do echo $$i; done \
-                | $(am__list_recheck_tests)` || exit 1; \
-       log_list=`for i in $$bases; do echo $$i.log; done`; \
-       log_list=`echo $$log_list`; \
-       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
-               am__force_recheck=am--force-recheck \
-               TEST_LOGS="$$log_list"; \
-       exit $$?
-.tests.log:
-       @p='$<'; \
-       $(am__set_b); \
-       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
-       --log-file $$b.log --trs-file $$b.trs \
-       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
-       "$$tst" $(AM_TESTS_FD_REDIRECT)
-@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
-@am__EXEEXT_TRUE@      @p='$<'; \
-@am__EXEEXT_TRUE@      $(am__set_b); \
-@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
-@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
-@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
-@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 
 distdir: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -770,20 +548,45 @@ distdir: $(DISTFILES)
            || exit 1; \
          fi; \
        done
            || exit 1; \
          fi; \
        done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
 check-am: all-am
 check-am: all-am
-       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
+check: check-recursive
 all-am: Makefile
 all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
 
 install-am: all-am
        @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
 
 install-am: all-am
        @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
-installcheck: installcheck-am
+installcheck: installcheck-recursive
 install-strip:
        if test -z '$(STRIP)'; then \
          $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
 install-strip:
        if test -z '$(STRIP)'; then \
          $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
@@ -795,9 +598,6 @@ install-strip:
            "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
        fi
 mostlyclean-generic:
            "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
        fi
 mostlyclean-generic:
-       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
-       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
-       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
 
 clean-generic:
        -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
 
 clean-generic:
        -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
@@ -805,103 +605,98 @@ clean-generic:
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
        -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
        -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
 
 maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
-       -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-am
+clean: clean-recursive
 
 clean-am: clean-generic clean-libtool mostlyclean-am
 
 
 clean-am: clean-generic clean-libtool mostlyclean-am
 
-distclean: distclean-am
+distclean: distclean-recursive
        -rm -f Makefile
        -rm -f Makefile
-distclean-am: clean-am distclean-generic
+distclean-am: clean-am distclean-generic distclean-tags
 
 
-dvi: dvi-am
+dvi: dvi-recursive
 
 dvi-am:
 
 
 dvi-am:
 
-html: html-am
+html: html-recursive
 
 html-am:
 
 
 html-am:
 
-info: info-am
+info: info-recursive
 
 info-am:
 
 install-data-am:
 
 
 info-am:
 
 install-data-am:
 
-install-dvi: install-dvi-am
+install-dvi: install-dvi-recursive
 
 install-dvi-am:
 
 install-exec-am:
 
 
 install-dvi-am:
 
 install-exec-am:
 
-install-html: install-html-am
+install-html: install-html-recursive
 
 install-html-am:
 
 
 install-html-am:
 
-install-info: install-info-am
+install-info: install-info-recursive
 
 install-info-am:
 
 install-man:
 
 
 install-info-am:
 
 install-man:
 
-install-pdf: install-pdf-am
+install-pdf: install-pdf-recursive
 
 install-pdf-am:
 
 
 install-pdf-am:
 
-install-ps: install-ps-am
+install-ps: install-ps-recursive
 
 install-ps-am:
 
 installcheck-am:
 
 
 install-ps-am:
 
 installcheck-am:
 
-maintainer-clean: maintainer-clean-am
+maintainer-clean: maintainer-clean-recursive
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
-mostlyclean: mostlyclean-am
+mostlyclean: mostlyclean-recursive
 
 mostlyclean-am: mostlyclean-generic mostlyclean-libtool
 
 
 mostlyclean-am: mostlyclean-generic mostlyclean-libtool
 
-pdf: pdf-am
+pdf: pdf-recursive
 
 pdf-am:
 
 
 pdf-am:
 
-ps: ps-am
+ps: ps-recursive
 
 ps-am:
 
 uninstall-am:
 
 
 ps-am:
 
 uninstall-am:
 
-.MAKE: check-am install-am install-strip
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+       check-am clean clean-generic clean-libtool cscopelist-am ctags \
+       ctags-am distclean distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       installdirs-am maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am tags tags-am uninstall uninstall-am
 
 
-.PHONY: all all-am check check-TESTS check-am clean clean-generic \
-       clean-libtool cscopelist-am ctags-am distclean \
-       distclean-generic distclean-libtool distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
-       uninstall uninstall-am
+.PRECIOUS: Makefile
 
 
 # Convenience targets:
 lib:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
 
 
 
 # Convenience targets:
 lib:
        @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
 
-manifests:
-       @$(srcdir)/hb-manifest-update "$(srcdir)/texts" "$(srcdir)/fonts" "$(srcdir)/tests"
-
-.PHONY: manifests
-
 -include $(top_srcdir)/git.mk
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 -include $(top_srcdir)/git.mk
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
index d1df634..99498e6 100644 (file)
@@ -23,18 +23,19 @@ what this does is:
   * If the outputs differ, perhaps it is because the font does not have
     glyph names; it then compares the output of `hb-view` for both fonts.
   * If the outputs differ, recording fails.  Otherwise, it will move the
   * If the outputs differ, perhaps it is because the font does not have
     glyph names; it then compares the output of `hb-view` for both fonts.
   * If the outputs differ, recording fails.  Otherwise, it will move the
-    subset font file into `fonts/sha1sum` and name it after its hash,
-    and prints out the test case input, which you can then redirect to
-    an existing or new test file in `tests`, eg.:
+    subset font file into `data/in-house/fonts` and name it after its
+    hash, and print out the test case input, which you can then redirect
+    to an existing or new test file in `data/in-house/tests` using `-o=`,
+    e.g.:
 ```sh
 ```sh
-$ ./hb-unicode-encode 41 42 43 627 | ./record-test.sh ../../util/hb-shape font.ttf >> tests/test-name.test
+$ ./hb-unicode-encode 41 42 43 627 | ./record-test.sh -o=data/in-house/tests/test-name.test ../../util/hb-shape font.ttf
 ```
 
 ```
 
-If you created a new test file, add it to `Makefile.am` so it is run.
-Check that `make check` does indeed run it, and that the test passes.
-When everything looks good, `git add` the new font as well as new
-test file if you created any.  You can see what new files are there
-by running `git status tests fonts/sha1sum`.  And commit!
+If you created a new test file, add it to `data/in-house/Makefile.sources`
+so it is run.  Check that `make check` does indeed run it, and that the
+test passes.  When everything looks good, `git add` the new font as well
+as the new test file if you created any.  You can see what new files are
+there by running `git status data/in-house`.  And commit!
 
 *Note!*  Please only add tests using Open Source fonts, preferably under
 OFL or similar license.
 
 *Note!*  Please only add tests using Open Source fonts, preferably under
 OFL or similar license.
diff --git a/test/shaping/data/Makefile.am b/test/shaping/data/Makefile.am
new file mode 100644 (file)
index 0000000..4f2c113
--- /dev/null
@@ -0,0 +1,13 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+SUBDIRS = \
+       in-house \
+       text-rendering-tests \
+       $(NULL)
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+-include $(top_srcdir)/git.mk
similarity index 57%
rename from win32/Makefile.in
rename to test/shaping/data/Makefile.in
index f7a08c2..091056c 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
 VPATH = @srcdir@
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -77,20 +89,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-subdir = win32
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-       $(srcdir)/config.h.win32.in
+subdir = test/shaping/data
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-       $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = config.h.win32
+CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@@ -106,13 +118,74 @@ am__v_at_0 = @
 am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
 am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       distdir
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -128,6 +201,12 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
@@ -155,6 +234,8 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
@@ -194,6 +275,7 @@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -202,6 +284,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -258,6 +341,7 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -278,6 +362,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -286,22 +371,13 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-EXTRA_DIST = \
-       build-rules-msvc.mak \
-       config-msvc.mak \
-       config.h.win32 \
-       create-lists.bat \
-       create-lists-msvc.mak \
-       detectenv-msvc.mak \
-       generate-msvc.mak \
-       hb-introspection-msvc.mak \
-       info-msvc.mak \
-       install.mak \
-       introspection-msvc.mak \
-       Makefile.vc \
-       README.txt
-
-all: all-am
+NULL = 
+SUBDIRS = \
+       in-house \
+       text-rendering-tests \
+       $(NULL)
+
+all: all-recursive
 
 .SUFFIXES:
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 
 .SUFFIXES:
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
@@ -313,10 +389,9 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
              exit 1;; \
          esac; \
        done; \
              exit 1;; \
          esac; \
        done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits win32/Makefile'; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/data/Makefile'; \
        $(am__cd) $(top_srcdir) && \
        $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --gnits win32/Makefile
-.PRECIOUS: Makefile
+         $(AUTOMAKE) --gnits test/shaping/data/Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -334,20 +409,111 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
-config.h.win32: $(top_builddir)/config.status $(srcdir)/config.h.win32.in
-       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 
 mostlyclean-libtool:
        -rm -f *.lo
 
 clean-libtool:
        -rm -rf .libs _libs
 
 mostlyclean-libtool:
        -rm -f *.lo
 
 clean-libtool:
        -rm -rf .libs _libs
-tags TAGS:
-
-ctags CTAGS:
 
 
-cscope cscopelist:
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
+       else \
+         failcom='exit 1'; \
+       fi; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 
 distdir: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -379,19 +545,45 @@ distdir: $(DISTFILES)
            || exit 1; \
          fi; \
        done
            || exit 1; \
          fi; \
        done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
 check-am: all-am
 check-am: all-am
-check: check-am
+check: check-recursive
 all-am: Makefile
 all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
 
 install-am: all-am
        @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
 
 install-am: all-am
        @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
-installcheck: installcheck-am
+installcheck: installcheck-recursive
 install-strip:
        if test -z '$(STRIP)'; then \
          $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
 install-strip:
        if test -z '$(STRIP)'; then \
          $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
@@ -413,86 +605,93 @@ distclean-generic:
 maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
 maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
+clean: clean-recursive
 
 clean-am: clean-generic clean-libtool mostlyclean-am
 
 
 clean-am: clean-generic clean-libtool mostlyclean-am
 
-distclean: distclean-am
+distclean: distclean-recursive
        -rm -f Makefile
        -rm -f Makefile
-distclean-am: clean-am distclean-generic
+distclean-am: clean-am distclean-generic distclean-tags
 
 
-dvi: dvi-am
+dvi: dvi-recursive
 
 dvi-am:
 
 
 dvi-am:
 
-html: html-am
+html: html-recursive
 
 html-am:
 
 
 html-am:
 
-info: info-am
+info: info-recursive
 
 info-am:
 
 install-data-am:
 
 
 info-am:
 
 install-data-am:
 
-install-dvi: install-dvi-am
+install-dvi: install-dvi-recursive
 
 install-dvi-am:
 
 install-exec-am:
 
 
 install-dvi-am:
 
 install-exec-am:
 
-install-html: install-html-am
+install-html: install-html-recursive
 
 install-html-am:
 
 
 install-html-am:
 
-install-info: install-info-am
+install-info: install-info-recursive
 
 install-info-am:
 
 install-man:
 
 
 install-info-am:
 
 install-man:
 
-install-pdf: install-pdf-am
+install-pdf: install-pdf-recursive
 
 install-pdf-am:
 
 
 install-pdf-am:
 
-install-ps: install-ps-am
+install-ps: install-ps-recursive
 
 install-ps-am:
 
 installcheck-am:
 
 
 install-ps-am:
 
 installcheck-am:
 
-maintainer-clean: maintainer-clean-am
+maintainer-clean: maintainer-clean-recursive
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
-mostlyclean: mostlyclean-am
+mostlyclean: mostlyclean-recursive
 
 mostlyclean-am: mostlyclean-generic mostlyclean-libtool
 
 
 mostlyclean-am: mostlyclean-generic mostlyclean-libtool
 
-pdf: pdf-am
+pdf: pdf-recursive
 
 pdf-am:
 
 
 pdf-am:
 
-ps: ps-am
+ps: ps-recursive
 
 ps-am:
 
 uninstall-am:
 
 
 ps-am:
 
 uninstall-am:
 
-.MAKE: install-am install-strip
+.MAKE: $(am__recursive_targets) install-am install-strip
 
 
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       cscopelist-am ctags-am distclean distclean-generic \
-       distclean-libtool distdir dvi dvi-am html html-am info info-am \
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+       check-am clean clean-generic clean-libtool cscopelist-am ctags \
+       ctags-am distclean distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
        install install-am install-data install-data-am install-dvi \
        install-dvi-am install-exec install-exec-am install-html \
        install-html-am install-info install-info-am install-man \
        install-pdf install-pdf-am install-ps install-ps-am \
        install-strip installcheck installcheck-am installdirs \
        install install-am install-data install-data-am install-dvi \
        install-dvi-am install-exec install-exec-am install-html \
        install-html-am install-info install-info-am install-man \
        install-pdf install-pdf-am install-ps install-ps-am \
        install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags-am uninstall uninstall-am
+       installdirs-am maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
 
 
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
 
 -include $(top_srcdir)/git.mk
 
 
 -include $(top_srcdir)/git.mk
 
diff --git a/test/shaping/data/in-house/COPYING b/test/shaping/data/in-house/COPYING
new file mode 100644 (file)
index 0000000..52c48c4
--- /dev/null
@@ -0,0 +1,95 @@
+The following license applies to many of the fonts in this folder.
+
+
+This Font Software is licensed under the SIL Open Font License,
+Version 1.1.
+
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font
+creation efforts of academic and linguistic communities, and to
+provide a free and open framework in which fonts may be shared and
+improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply to
+any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software
+components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to,
+deleting, or substituting -- in part or in whole -- any of the
+components of the Original Version, by changing formats or by porting
+the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed,
+modify, redistribute, and sell modified and unmodified copies of the
+Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the
+corresponding Copyright Holder. This restriction only applies to the
+primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created using
+the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/test/shaping/data/in-house/Makefile.am b/test/shaping/data/in-house/Makefile.am
new file mode 100644 (file)
index 0000000..8a2a076
--- /dev/null
@@ -0,0 +1,20 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+EXTRA_DIST = \
+       COPYING \
+       fonts \
+       $(TESTS) \
+       $(NULL)
+
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+
+include Makefile.sources
+
+-include $(top_srcdir)/git.mk
diff --git a/test/shaping/data/in-house/Makefile.in b/test/shaping/data/in-house/Makefile.in
new file mode 100644 (file)
index 0000000..14a07ae
--- /dev/null
@@ -0,0 +1,917 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = tests/arabic-fallback-shaping.tests \
+       tests/arabic-feature-order.tests \
+       tests/arabic-like-joining.tests tests/arabic-mark-order.tests \
+       tests/arabic-stch.tests tests/automatic-fractions.tests \
+       tests/cluster.tests tests/color-fonts.tests \
+       tests/context-matching.tests tests/cursive-positioning.tests \
+       tests/default-ignorables.tests tests/emoji-flag-tags.tests \
+       tests/fallback-positioning.tests tests/fuzzed.tests \
+       tests/hangul-jamo.tests tests/hyphens.tests \
+       tests/indic-consonant-with-stacker.tests \
+       tests/indic-init.tests tests/indic-joiner-candrabindu.tests \
+       tests/indic-joiners.tests tests/indic-old-spec.tests \
+       tests/indic-pref-blocking.tests \
+       tests/indic-script-extensions.tests \
+       tests/indic-special-cases.tests tests/indic-syllable.tests \
+       tests/language-tags.tests tests/ligature-id.tests \
+       tests/mark-attachment.tests tests/mark-filtering-sets.tests \
+       tests/mongolian-variation-selector.tests \
+       tests/myanmar-syllable.tests tests/spaces.tests \
+       tests/simple.tests tests/tibetan-contractions-1.tests \
+       tests/tibetan-contractions-2.tests tests/tibetan-vowels.tests \
+       tests/use.tests tests/use-marchen.tests \
+       tests/use-syllable.tests tests/variations-rvrn.tests \
+       tests/vertical.tests tests/zero-width-marks.tests \
+       $(am__EXEEXT_1)
+subdir = test/shaping/data/in-house
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red='\e[0;31m'; \
+    grn='\e[0;32m'; \
+    lgn='\e[1;32m'; \
+    blu='\e[1;34m'; \
+    mgn='\e[0;35m'; \
+    brg='\e[1m'; \
+    std='\e[m'; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[    ]*:recheck:[    ]*
+am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
+am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+           recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[       ]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);                                     \
+$(am__vpath_adj_setup) $(am__vpath_adj)                        \
+$(am__tty_colors);                                     \
+srcdir=$(srcdir); export srcdir;                       \
+case "$@" in                                           \
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
+    *) am__odir=.;;                                    \
+esac;                                                  \
+test "x$$am__odir" = x"." || test -d "$$am__odir"      \
+  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
+if test -f "./$$f"; then dir=./;                       \
+elif test -f "$$f"; then dir=;                         \
+else dir="$(srcdir)/"; fi;                             \
+tst=$$dir$$f; log='$@';                                \
+if test -n '$(DISABLE_HARD_ERRORS)'; then              \
+  am__enable_hard_errors=no;                           \
+else                                                   \
+  am__enable_hard_errors=yes;                          \
+fi;                                                    \
+case " $(XFAIL_TESTS) " in                             \
+  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
+    am__expect_failure=yes;;                           \
+  *)                                                   \
+    am__expect_failure=no;;                            \
+esac;                                                  \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+am__EXEEXT_1 =
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.tests.log=.log)
+TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
+       $(TESTS_LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+       $(top_srcdir)/test-driver COPYING
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_CONFIG = @ICU_CONFIG@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+EXTRA_DIST = \
+       COPYING \
+       fonts \
+       $(TESTS) \
+       $(NULL)
+
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+DISABLED_TESTS = \
+       $(NULL)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/data/in-house/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits test/shaping/data/in-house/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+       rm -f $< $@
+       $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+       @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+       @$(am__set_TESTS_bases); \
+       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+       redo_bases=`for i in $$bases; do \
+                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+                   done`; \
+       if test -n "$$redo_bases"; then \
+         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+         if $(am__make_dryrun); then :; else \
+           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+         fi; \
+       fi; \
+       if test -n "$$am__remaking_logs"; then \
+         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+              "recursion detected" >&2; \
+       elif test -n "$$redo_logs"; then \
+         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+       fi; \
+       if $(am__make_dryrun); then :; else \
+         st=0;  \
+         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+         for i in $$redo_bases; do \
+           test -f $$i.trs && test -r $$i.trs \
+             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+           test -f $$i.log && test -r $$i.log \
+             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+         done; \
+         test $$st -eq 0 || exit 1; \
+       fi
+       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+       ws='[   ]'; \
+       results=`for b in $$bases; do echo $$b.trs; done`; \
+       test -n "$$results" || results=/dev/null; \
+       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+         success=true; \
+       else \
+         success=false; \
+       fi; \
+       br='==================='; br=$$br$$br$$br$$br; \
+       result_count () \
+       { \
+           if test x"$$1" = x"--maybe-color"; then \
+             maybe_colorize=yes; \
+           elif test x"$$1" = x"--no-color"; then \
+             maybe_colorize=no; \
+           else \
+             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+           fi; \
+           shift; \
+           desc=$$1 count=$$2; \
+           if test $$maybe_colorize = yes && test $$count -gt 0; then \
+             color_start=$$3 color_end=$$std; \
+           else \
+             color_start= color_end=; \
+           fi; \
+           echo "$${color_start}# $$desc $$count$${color_end}"; \
+       }; \
+       create_testsuite_report () \
+       { \
+         result_count $$1 "TOTAL:" $$all   "$$brg"; \
+         result_count $$1 "PASS: " $$pass  "$$grn"; \
+         result_count $$1 "SKIP: " $$skip  "$$blu"; \
+         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+         result_count $$1 "FAIL: " $$fail  "$$red"; \
+         result_count $$1 "XPASS:" $$xpass "$$red"; \
+         result_count $$1 "ERROR:" $$error "$$mgn"; \
+       }; \
+       {                                                               \
+         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
+           $(am__rst_title);                                           \
+         create_testsuite_report --no-color;                           \
+         echo;                                                         \
+         echo ".. contents:: :depth: 2";                               \
+         echo;                                                         \
+         for b in $$bases; do echo $$b; done                           \
+           | $(am__create_global_log);                                 \
+       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
+       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
+       if $$success; then                                              \
+         col="$$grn";                                                  \
+        else                                                           \
+         col="$$red";                                                  \
+         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
+       fi;                                                             \
+       echo "$${col}$$br$${std}";                                      \
+       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
+       echo "$${col}$$br$${std}";                                      \
+       create_testsuite_report --maybe-color;                          \
+       echo "$$col$$br$$std";                                          \
+       if $$success; then :; else                                      \
+         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
+         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
+           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+         fi;                                                           \
+         echo "$$col$$br$$std";                                        \
+       fi;                                                             \
+       $$success || exit 1
+
+check-TESTS:
+       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+       exit $$?;
+recheck: all 
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       bases=`for i in $$bases; do echo $$i; done \
+                | $(am__list_recheck_tests)` || exit 1; \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       log_list=`echo $$log_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+               am__force_recheck=am--force-recheck \
+               TEST_LOGS="$$log_list"; \
+       exit $$?
+.tests.log:
+       @p='$<'; \
+       $(am__set_b); \
+       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
+@am__EXEEXT_TRUE@      @p='$<'; \
+@am__EXEEXT_TRUE@      $(am__set_b); \
+@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean clean-generic \
+       clean-libtool cscopelist-am ctags-am distclean \
+       distclean-generic distclean-libtool distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
+       uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/shaping/data/in-house/Makefile.sources b/test/shaping/data/in-house/Makefile.sources
new file mode 100644 (file)
index 0000000..1922fd4
--- /dev/null
@@ -0,0 +1,47 @@
+TESTS = \
+       tests/arabic-fallback-shaping.tests \
+       tests/arabic-feature-order.tests \
+       tests/arabic-like-joining.tests \
+       tests/arabic-mark-order.tests \
+       tests/arabic-stch.tests \
+       tests/automatic-fractions.tests \
+       tests/cluster.tests \
+       tests/color-fonts.tests \
+       tests/context-matching.tests \
+       tests/cursive-positioning.tests \
+       tests/default-ignorables.tests \
+       tests/emoji-flag-tags.tests \
+       tests/fallback-positioning.tests \
+       tests/fuzzed.tests \
+       tests/hangul-jamo.tests \
+       tests/hyphens.tests \
+       tests/indic-consonant-with-stacker.tests \
+       tests/indic-init.tests \
+       tests/indic-joiner-candrabindu.tests \
+       tests/indic-joiners.tests \
+       tests/indic-old-spec.tests \
+       tests/indic-pref-blocking.tests \
+       tests/indic-script-extensions.tests \
+       tests/indic-special-cases.tests \
+       tests/indic-syllable.tests \
+       tests/language-tags.tests \
+       tests/ligature-id.tests \
+       tests/mark-attachment.tests \
+       tests/mark-filtering-sets.tests \
+       tests/mongolian-variation-selector.tests \
+       tests/myanmar-syllable.tests \
+       tests/spaces.tests \
+       tests/simple.tests \
+       tests/tibetan-contractions-1.tests \
+       tests/tibetan-contractions-2.tests \
+       tests/tibetan-vowels.tests \
+       tests/use.tests \
+       tests/use-marchen.tests \
+       tests/use-syllable.tests \
+       tests/variations-rvrn.tests \
+       tests/vertical.tests \
+       tests/zero-width-marks.tests \
+       $(NULL)
+
+DISABLED_TESTS = \
+       $(NULL)
diff --git a/test/shaping/data/in-house/fonts/074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf b/test/shaping/data/in-house/fonts/074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf
new file mode 100644 (file)
index 0000000..ad8ad84
Binary files /dev/null and b/test/shaping/data/in-house/fonts/074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf differ
diff --git a/test/shaping/data/in-house/fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf b/test/shaping/data/in-house/fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf
new file mode 100644 (file)
index 0000000..b1e4cdb
Binary files /dev/null and b/test/shaping/data/in-house/fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf differ
diff --git a/test/shaping/data/in-house/fonts/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf b/test/shaping/data/in-house/fonts/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf
new file mode 100644 (file)
index 0000000..d060ea9
Binary files /dev/null and b/test/shaping/data/in-house/fonts/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf differ
diff --git a/test/shaping/data/in-house/fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf b/test/shaping/data/in-house/fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf
new file mode 100644 (file)
index 0000000..200afb3
Binary files /dev/null and b/test/shaping/data/in-house/fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf differ
diff --git a/test/shaping/data/in-house/fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf b/test/shaping/data/in-house/fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf
new file mode 100644 (file)
index 0000000..76d9c30
Binary files /dev/null and b/test/shaping/data/in-house/fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf differ
diff --git a/test/shaping/data/in-house/fonts/233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf b/test/shaping/data/in-house/fonts/233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf
new file mode 100644 (file)
index 0000000..999f296
Binary files /dev/null and b/test/shaping/data/in-house/fonts/233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf differ
diff --git a/test/shaping/data/in-house/fonts/243798dd281c1c77c065958e1ff467420faa9bde.ttf b/test/shaping/data/in-house/fonts/243798dd281c1c77c065958e1ff467420faa9bde.ttf
new file mode 100644 (file)
index 0000000..dd8506e
Binary files /dev/null and b/test/shaping/data/in-house/fonts/243798dd281c1c77c065958e1ff467420faa9bde.ttf differ
diff --git a/test/shaping/data/in-house/fonts/24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf b/test/shaping/data/in-house/fonts/24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf
new file mode 100644 (file)
index 0000000..dc290ad
Binary files /dev/null and b/test/shaping/data/in-house/fonts/24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf differ
diff --git a/test/shaping/data/in-house/fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf b/test/shaping/data/in-house/fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf
new file mode 100644 (file)
index 0000000..c4b4791
Binary files /dev/null and b/test/shaping/data/in-house/fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf differ
diff --git a/test/shaping/data/in-house/fonts/319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf b/test/shaping/data/in-house/fonts/319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf
new file mode 100644 (file)
index 0000000..53044b7
Binary files /dev/null and b/test/shaping/data/in-house/fonts/319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf differ
diff --git a/test/shaping/data/in-house/fonts/341421e629668b1a1242245d39238ca48432d35d.ttf b/test/shaping/data/in-house/fonts/341421e629668b1a1242245d39238ca48432d35d.ttf
new file mode 100644 (file)
index 0000000..5b82bb5
Binary files /dev/null and b/test/shaping/data/in-house/fonts/341421e629668b1a1242245d39238ca48432d35d.ttf differ
diff --git a/test/shaping/data/in-house/fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf b/test/shaping/data/in-house/fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf
new file mode 100644 (file)
index 0000000..214a195
Binary files /dev/null and b/test/shaping/data/in-house/fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf differ
diff --git a/test/shaping/data/in-house/fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf b/test/shaping/data/in-house/fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf
new file mode 100644 (file)
index 0000000..2cacb68
Binary files /dev/null and b/test/shaping/data/in-house/fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf differ
diff --git a/test/shaping/data/in-house/fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf b/test/shaping/data/in-house/fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf
new file mode 100644 (file)
index 0000000..d7db1de
Binary files /dev/null and b/test/shaping/data/in-house/fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf differ
diff --git a/test/shaping/data/in-house/fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf b/test/shaping/data/in-house/fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf
new file mode 100644 (file)
index 0000000..0f691e1
Binary files /dev/null and b/test/shaping/data/in-house/fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf differ
diff --git a/test/shaping/data/in-house/fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf b/test/shaping/data/in-house/fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf
new file mode 100644 (file)
index 0000000..d7f2bdb
Binary files /dev/null and b/test/shaping/data/in-house/fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf differ
diff --git a/test/shaping/data/in-house/fonts/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf b/test/shaping/data/in-house/fonts/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf
new file mode 100644 (file)
index 0000000..837e8d2
Binary files /dev/null and b/test/shaping/data/in-house/fonts/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf differ
diff --git a/test/shaping/data/in-house/fonts/55c88ebbe938680b08f92c3de20713183e0c7481.ttf b/test/shaping/data/in-house/fonts/55c88ebbe938680b08f92c3de20713183e0c7481.ttf
new file mode 100644 (file)
index 0000000..f654067
Binary files /dev/null and b/test/shaping/data/in-house/fonts/55c88ebbe938680b08f92c3de20713183e0c7481.ttf differ
diff --git a/test/shaping/data/in-house/fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf b/test/shaping/data/in-house/fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf
new file mode 100644 (file)
index 0000000..2fc9e9c
Binary files /dev/null and b/test/shaping/data/in-house/fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf differ
diff --git a/test/shaping/data/in-house/fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf b/test/shaping/data/in-house/fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf
new file mode 100644 (file)
index 0000000..70f0513
Binary files /dev/null and b/test/shaping/data/in-house/fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf differ
diff --git a/test/shaping/data/in-house/fonts/663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf b/test/shaping/data/in-house/fonts/663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf
new file mode 100644 (file)
index 0000000..8f7fda5
Binary files /dev/null and b/test/shaping/data/in-house/fonts/663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf differ
diff --git a/test/shaping/data/in-house/fonts/81c368a33816fb20e9f647e8f24e2180f4720263.ttf b/test/shaping/data/in-house/fonts/81c368a33816fb20e9f647e8f24e2180f4720263.ttf
new file mode 100644 (file)
index 0000000..59198b2
Binary files /dev/null and b/test/shaping/data/in-house/fonts/81c368a33816fb20e9f647e8f24e2180f4720263.ttf differ
diff --git a/test/shaping/data/in-house/fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf b/test/shaping/data/in-house/fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf
new file mode 100644 (file)
index 0000000..a541546
Binary files /dev/null and b/test/shaping/data/in-house/fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf differ
diff --git a/test/shaping/data/in-house/fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf b/test/shaping/data/in-house/fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf
new file mode 100644 (file)
index 0000000..a8fd495
Binary files /dev/null and b/test/shaping/data/in-house/fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf differ
diff --git a/test/shaping/data/in-house/fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf b/test/shaping/data/in-house/fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf
new file mode 100644 (file)
index 0000000..23da109
Binary files /dev/null and b/test/shaping/data/in-house/fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf differ
diff --git a/test/shaping/data/in-house/fonts/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf b/test/shaping/data/in-house/fonts/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf
new file mode 100644 (file)
index 0000000..6198614
Binary files /dev/null and b/test/shaping/data/in-house/fonts/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf differ
diff --git a/test/shaping/data/in-house/fonts/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf b/test/shaping/data/in-house/fonts/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf
new file mode 100644 (file)
index 0000000..89b6257
Binary files /dev/null and b/test/shaping/data/in-house/fonts/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf differ
diff --git a/test/shaping/data/in-house/fonts/94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf b/test/shaping/data/in-house/fonts/94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf
new file mode 100644 (file)
index 0000000..baf544f
Binary files /dev/null and b/test/shaping/data/in-house/fonts/94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf differ
diff --git a/test/shaping/data/in-house/fonts/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf b/test/shaping/data/in-house/fonts/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf
new file mode 100644 (file)
index 0000000..78518c0
Binary files /dev/null and b/test/shaping/data/in-house/fonts/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf differ
diff --git a/test/shaping/data/in-house/fonts/98b7887cff91f722b92a8ff800120954606354f9.ttf b/test/shaping/data/in-house/fonts/98b7887cff91f722b92a8ff800120954606354f9.ttf
new file mode 100644 (file)
index 0000000..4835c76
Binary files /dev/null and b/test/shaping/data/in-house/fonts/98b7887cff91f722b92a8ff800120954606354f9.ttf differ
diff --git a/test/shaping/data/in-house/fonts/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf b/test/shaping/data/in-house/fonts/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf
new file mode 100644 (file)
index 0000000..3fb9951
Binary files /dev/null and b/test/shaping/data/in-house/fonts/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf differ
diff --git a/test/shaping/data/in-house/fonts/a014549f766436cf55b2ceb40e462038938ee899.ttf b/test/shaping/data/in-house/fonts/a014549f766436cf55b2ceb40e462038938ee899.ttf
new file mode 100644 (file)
index 0000000..9a34ba5
Binary files /dev/null and b/test/shaping/data/in-house/fonts/a014549f766436cf55b2ceb40e462038938ee899.ttf differ
diff --git a/test/shaping/data/in-house/fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf b/test/shaping/data/in-house/fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf
new file mode 100644 (file)
index 0000000..7d0809e
Binary files /dev/null and b/test/shaping/data/in-house/fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf differ
diff --git a/test/shaping/data/in-house/fonts/a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf b/test/shaping/data/in-house/fonts/a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf
new file mode 100644 (file)
index 0000000..7930a96
Binary files /dev/null and b/test/shaping/data/in-house/fonts/a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf differ
diff --git a/test/shaping/data/in-house/fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf b/test/shaping/data/in-house/fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf
new file mode 100644 (file)
index 0000000..5945b16
Binary files /dev/null and b/test/shaping/data/in-house/fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf differ
diff --git a/test/shaping/data/in-house/fonts/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf b/test/shaping/data/in-house/fonts/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf
new file mode 100644 (file)
index 0000000..531f255
Binary files /dev/null and b/test/shaping/data/in-house/fonts/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf differ
diff --git a/test/shaping/data/in-house/fonts/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf b/test/shaping/data/in-house/fonts/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf
new file mode 100644 (file)
index 0000000..eb37400
Binary files /dev/null and b/test/shaping/data/in-house/fonts/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf differ
diff --git a/test/shaping/data/in-house/fonts/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf b/test/shaping/data/in-house/fonts/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf
new file mode 100644 (file)
index 0000000..ce017a3
Binary files /dev/null and b/test/shaping/data/in-house/fonts/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf differ
diff --git a/test/shaping/data/in-house/fonts/bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf b/test/shaping/data/in-house/fonts/bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf
new file mode 100644 (file)
index 0000000..4cf9a32
Binary files /dev/null and b/test/shaping/data/in-house/fonts/bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf differ
diff --git a/test/shaping/data/in-house/fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf b/test/shaping/data/in-house/fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf
new file mode 100644 (file)
index 0000000..351fc3a
Binary files /dev/null and b/test/shaping/data/in-house/fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf differ
diff --git a/test/shaping/data/in-house/fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf b/test/shaping/data/in-house/fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf
new file mode 100644 (file)
index 0000000..112146e
Binary files /dev/null and b/test/shaping/data/in-house/fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf differ
diff --git a/test/shaping/data/in-house/fonts/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf b/test/shaping/data/in-house/fonts/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf
new file mode 100644 (file)
index 0000000..ba80928
Binary files /dev/null and b/test/shaping/data/in-house/fonts/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf differ
diff --git a/test/shaping/data/in-house/fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf b/test/shaping/data/in-house/fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf
new file mode 100644 (file)
index 0000000..ada70f7
Binary files /dev/null and b/test/shaping/data/in-house/fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf differ
diff --git a/test/shaping/data/in-house/fonts/e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf b/test/shaping/data/in-house/fonts/e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf
new file mode 100644 (file)
index 0000000..66a9001
Binary files /dev/null and b/test/shaping/data/in-house/fonts/e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf differ
diff --git a/test/shaping/data/in-house/fonts/ef2511f215aa3ca847cbfffbf861793b42170875.ttf b/test/shaping/data/in-house/fonts/ef2511f215aa3ca847cbfffbf861793b42170875.ttf
new file mode 100644 (file)
index 0000000..6a3af46
Binary files /dev/null and b/test/shaping/data/in-house/fonts/ef2511f215aa3ca847cbfffbf861793b42170875.ttf differ
diff --git a/test/shaping/data/in-house/fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf b/test/shaping/data/in-house/fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf
new file mode 100644 (file)
index 0000000..93c2f58
Binary files /dev/null and b/test/shaping/data/in-house/fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf differ
diff --git a/test/shaping/data/in-house/tests/arabic-fallback-shaping.tests b/test/shaping/data/in-house/tests/arabic-fallback-shaping.tests
new file mode 100644 (file)
index 0000000..274829c
--- /dev/null
@@ -0,0 +1 @@
+../fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf::U+0633,U+064F,U+0644,U+064E,U+0651,U+0627,U+0651,U+0650,U+0645,U+062A,U+06CC:[uni06CC.fina=10+1655|uni062A.medi=9+868|uni0645.init=8+1098|uni0650=2@221,0+0|uni0651=2@260,736+0|uni064E=2@935,1259+0|uni0651=2@974,736+0|uni06440627.fina=2+1470|uni064F=0@558,-10+0|uni0633.init=0+1585]
diff --git a/test/shaping/data/in-house/tests/arabic-feature-order.tests b/test/shaping/data/in-house/tests/arabic-feature-order.tests
new file mode 100644 (file)
index 0000000..0f7f58e
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf::U+1820,U+180B:[uni2048.E81A=0+1550]
+../fonts/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf::U+1820,U+180B:[uni2048.E81A=0+1550]
+../fonts/a919b33197965846f21074b24e30250d67277bce.ttf::U+0644,U+0644,U+0647:[Lellah=0+1503]
+../fonts/bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf::U+0644,U+064E,U+0670,U+0653,U+0626:[afii57414.zz04=4+1202|uni0670_uni0653=0@50,350+0|afii57454=0@550,1425+0|afii57444.calt=0+1065]
diff --git a/test/shaping/data/in-house/tests/arabic-like-joining.tests b/test/shaping/data/in-house/tests/arabic-like-joining.tests
new file mode 100644 (file)
index 0000000..2e34186
--- /dev/null
@@ -0,0 +1 @@
+../fonts/5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf::U+1E922,U+1E923,U+1E924,U+1E925,U+1E926,U+1E927,U+1E928,U+1E929,U+1E92A,U+1E92B,U+1E92C,U+1E92D,U+1E92E,U+1E92F,U+1E930,U+1E931,U+1E932,U+1E933,U+1E934,U+1E935,U+1E936,U+1E937,U+1E938,U+1E939,U+1E93A,U+1E93B,U+1E93C,U+1E93D,U+1E93E,U+1E93F,U+1E940,U+1E941,U+1E942,U+1E943:[sha_adlam.fina=33+711|kpo_adlam.medi=32+573|zal_adlam.medi=31+773|gbe_adlam.medi=30+594|kha_adlam.medi=29+686|va_adlam.medi=28+621|nha_adlam.medi=27+587|tu_adlam.medi=26+772|nya_adlam.medi=25+577|ga_adlam.medi=24+552|qaaf_adlam.medi=23+694|ha_adlam.medi=22+600|chi_adlam.medi=21+662|jiim_adlam.medi=20+781|u_adlam.medi=19+678|ya_adlam.medi=18+553|kaf_adlam.medi=17+808|nun_adlam.medi=16+561|waw_adlam.medi=15+651|yhe_adlam.medi=14+674|dha_adlam.medi=13+674|o_adlam.medi=12+640|i_adlam.medi=11+657|fa_adlam.medi=10+590|e_adlam.medi=9+628|ra_adlam.medi=8+599|bhe_adlam.medi=7+594|pe_adlam.medi=6+492|sinnyiiyhe_adlam.medi=5+777|ba_adlam.medi=4+655|miim_adlam.medi=3+525|laam_adlam.medi=2+554|daali_adlam.medi=1+600|alif_adlam.init=0+597]
diff --git a/test/shaping/data/in-house/tests/arabic-mark-order.tests b/test/shaping/data/in-house/tests/arabic-mark-order.tests
new file mode 100644 (file)
index 0000000..18ddb88
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf::U+064A,U+064E,U+0670,U+0653,U+0640,U+0654,U+064E,U+0627:[afii57415.zz04=7+481|afii57454=4@25,975+0|uni0654=4@-50,50+0|afii57440=4+650|uni0670_uni0653=0@75,400+0|afii57454=0@750,1125+0|afii57450.calt=0+1331]
+../fonts/24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf::U+0628,U+0618,U+0619,U+064E,U+064F,U+0654,U+0658,U+0653,U+0654,U+0651,U+0656,U+0651,U+065C,U+0655,U+0650:[uni0653.small=0@266,2508+0|uni0654=0@308,2151+0|uni0655=0@518,-1544+0|uni065C=0@501,-1453+0|uni0656=0@573,-659+0|uni0650=0@500,133+0|uni0619=0@300,1807+0|uni0618=0@357,1674+0|uni0651064E=0@387,1178+0|uni0651=0@402,764+0|uni0658=0@424,404+0|uni0654064F=0@540,-435+0|uni0628=0+1352]
+../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf::U+0649,U+0655,U+034F,U+0650:[uni0650.small2=0@727,-774+0|space=0+0|uni0655=0@727,-209+0|uni0649=0+1566]
+../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf::U+0649,U+0655,U+0650:[uni0650.small2=0@727,-774+0|uni0655=0@727,-209+0|uni0649=0+1566]
+../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf::U+0649,U+0650,U+0655:[uni0650.small2=0@727,-774+0|uni0655=0@727,-209+0|uni0649=0+1566]
+../fonts/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf::U+0649,U+0650,U+034F,U+0655:[uni0655=0+0|space=0+0|uni0650=0@166,0+0|uni0649=0+1566]
diff --git a/test/shaping/data/in-house/tests/arabic-stch.tests b/test/shaping/data/in-house/tests/arabic-stch.tests
new file mode 100644 (file)
index 0000000..1ba8f60
--- /dev/null
@@ -0,0 +1 @@
+../fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf:--no-glyph-names:U+0718,U+070F,U+0718,U+0718,U+002E:[1=4+168|3=3+502|3=2+502|4=1@-1004,0+0|5=1@-876,0+0|5=1@-799,0+0|5=1@-722,0+0|5=1@-645,0+0|4=1@-566,0+0|5=1@-438,0+0|5=1@-361,0+0|5=1@-284,0+0|5=1@-207,0+0|4=1@-128,0+0|3=0+502]
diff --git a/test/shaping/data/in-house/tests/automatic-fractions.tests b/test/shaping/data/in-house/tests/automatic-fractions.tests
new file mode 100644 (file)
index 0000000..58ec26c
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf::U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036:[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600]
+../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf:--direction=l --script=arab:U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036:[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600]
+../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf:--direction=l:U+0661,U+0662,U+0663,U+2044,U+0664,U+0665,U+0666:[uni0661.numr=0+600|uni0662.numr=1+600|uni0663.numr=2+600|fraction=3+252|uni0664.small=4+600|uni0665.small=5+600|uni0666.small=6+600]
diff --git a/test/shaping/data/in-house/tests/cluster.tests b/test/shaping/data/in-house/tests/cluster.tests
new file mode 100644 (file)
index 0000000..fd0a0fe
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf:--cluster-level=2:U+0078,U+030A,U+0058,U+030A:[gid2=0+1083|gid3=1@-1131,-8+0|gid1=2+1200|gid3=3@-1190,349+0]
+../fonts/43ef465752be9af900745f72fe29cb853a1401a5.ttf:--cluster-level=1:U+05D4,U+05B7,U+05E9,U+05BC,U+05C1,U+05B8,U+05DE,U+05B4,U+05DD:[uni05DD=8+1359|uni05B4=7@111,0+0|uni05DE=6+1391|uni05B8=5+0|uni05BC=3+0|uni05C1=3+0|uni05E9=2+1451|uni05B7=1@28,0+0|uni05D4=0+1338]
diff --git a/test/shaping/data/in-house/tests/color-fonts.tests b/test/shaping/data/in-house/tests/color-fonts.tests
new file mode 100644 (file)
index 0000000..e7311bc
--- /dev/null
@@ -0,0 +1 @@
+../fonts/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf:--font-funcs=ot --show-extents:U+1F42F:[gid1=0+2963<0,2178,2963,-2788>]
diff --git a/test/shaping/data/in-house/tests/context-matching.tests b/test/shaping/data/in-house/tests/context-matching.tests
new file mode 100644 (file)
index 0000000..5673edc
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
+../fonts/d629e7fedc0b350222d7987345fe61613fa3929a.ttf::U+0915,U+093F,U+0915,U+093F:[ivowelsign03deva=0+530|kadeva=0+1561|ivowelsign03deva=2+530|kadeva=2+1561]
+../fonts/f499fbc23865022234775c43503bba2e63978fe1.ttf::U+09B0,U+09CD,U+09A5,U+09CD,U+09AF,U+09C0:[gid1=0+1320|gid13=0+523|gid18=0+545]
diff --git a/test/shaping/data/in-house/tests/cursive-positioning.tests b/test/shaping/data/in-house/tests/cursive-positioning.tests
new file mode 100644 (file)
index 0000000..74d283d
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf::U+0643,U+0645,U+0645,U+062B,U+0644:[gid8=4+738|gid5=3@441,1197+0|gid6=3@0,432+405|gid9=2@0,477+452|gid9=1@0,977+452|gid10=0@20,1577+207]
+../fonts/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf::U+0643,U+0645,U+0645,U+062B,U+0644:[gid8=4+738|gid5=3@441,1197+0|gid6=3@0,432+405|gid9=2@0,477+500|gid9=1@0,577+452|gid10=0@20,1177+207]
+#../fonts/706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf::U+0B1F,U+0B4D,U+0B1A,U+0B4D,U+0B1A:[ttaorya=0+1307|casubscriptorya=0@-242,104+-231|casubscriptnarroworya=0@20,104+507]
+../fonts/07f054357ff8638bac3711b422a1e31180bba863.ttf:--font-funcs=ot --no-glyph-names:U+0606,U+06E1:[2=0@40,502+0|1=0+1000]
diff --git a/test/shaping/data/in-house/tests/default-ignorables.tests b/test/shaping/data/in-house/tests/default-ignorables.tests
new file mode 100644 (file)
index 0000000..a27b67a
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/051d92f8bc6ff724511b296c27623f824de256e9.ttf::U+0075,U+0361,U+034F,U+0301,U+0069:[gid2=0+1266|gid7=0@-617,442+0|gid5=0@-7,0+0|gid1=4+528]
+../fonts/bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf::U+0020,U+06CC,U+064E,U+034F,U+0651:[uni0651=1+0|space=1+0|uni064E=1@236,-432+0|uni06CC=1+1266|space=0+452]
diff --git a/test/shaping/data/in-house/tests/emoji-flag-tags.tests b/test/shaping/data/in-house/tests/emoji-flag-tags.tests
new file mode 100644 (file)
index 0000000..189de55
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0055,U+E0053,U+E0064,U+E0065,U+E007F:[u1F3F4=0+2126|space=1+0|space=2+0|space=3+0|space=4+0|space=5+0]
+../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0064,U+E0065,U+E007F:[de=0+3200]
diff --git a/test/shaping/data/in-house/tests/fallback-positioning.tests b/test/shaping/data/in-house/tests/fallback-positioning.tests
new file mode 100644 (file)
index 0000000..5047d84
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf::U+0078,U+0301,U+0058,U+0301:[x=0+1030|acutecomb=0@-21,-27+0|X=2+1295|acutecomb=2@-147,320+0]
+../fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf::U+0061,U+035C,U+0062:[uni0061=0+512|uni035C=0@-64,-128+0|uni0062=2+512]
diff --git a/test/shaping/data/in-house/tests/fuzzed.tests b/test/shaping/data/in-house/tests/fuzzed.tests
new file mode 100644 (file)
index 0000000..43a1933
--- /dev/null
@@ -0,0 +1,23 @@
+../fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/641bd9db850193064d17575053ae2bf8ec149ddc.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf:--font-funcs=ot:U+0041:[gid0=0+4352]
+../fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf:--font-funcs=ot:U+0041:[gid0=0+1024]
+../fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf:--font-funcs=ot:U+0041:[gid0=0+1000|gid1=0+1000|gid8=0+1000|gid3=0+1000|gid0=0+1000|gid1=0+1000|gid1=0+1000|gid8=0+1000|gid3=0+1000|gid0=0+1000|gid1=0+1000|gid8=0+1000|gid3=0+1000|gid0=0+1000|gid1=0+1000|gid1=0+1000]
+../fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/3511ff5c1647150595846ac414c595cccac34f18.ttf:--font-funcs=ot --no-positions --no-clusters --no-glyph-names:U+0041:[0|512|15104|11004|3408|18244|17872|17961|0|992|15616|0|14151|20559|20992|5440|256|0|10|8960|256|1024|1490|0|768|4096|256|2216|0|256|256|0|768|10752|11004|3408|18244|17734|53248|256|0|512|14848|10793|57344|768|18227|20285|20480|0|256|0|810|0|11004|3408|18244|17734|53289|57344|768|15667|71|0|20559|21248|256|0|2816|2776|0|51516|0|32|26209|28005|65249|29690|0|51548|0|2454|28783|29556|1291|3458|80|0|2804|210|28786|25968|45763|50546|0|59136|0|38144|256|0|2560|30208|52224|580|17996|21504|6734|108|116|24846|1024|0|255|65280|256|0|8704|1345|23109|8192|10823|21076|8192|12877|20300|8192|6738|20301|8192|16980|21067|8251|18944|255|65280|15360|256|255|65280|256|768|255|65280|256|768|255|65280|256|1024|12|65280|256|1280|255|65280|256|1536|1899|25970|110|11264|27502|29285|12907|25974|28160|14443|25970|28288|3|118|18259|21826|45716|46369|0|0|1|16|17|256|4|16|18244|17734|28|12|0|284|0|28|18256|20307|45114|47616|226|10296|0|57927|1|0|0|21248|5440|256|0|10|768|256|1024|512|0|297|16|24833|28774|10794|2304|29|32|42|64515|42|42|64525|20551|17477|18128|10720|3|61|3408|18244|17734|53289|57344|768|15616|512|55|10576|20307|0|255|56063|53504|42|42|64525|12288|18176|80|20307|1|0|62]
+../fonts/fab39d60d758cb586db5a504f218442cd1395725.ttf:--font-funcs=ot:U+0041,U+0041:[gid0=0+1000|gid0=1+1000]
+../fonts/205edd09bd3d141cc9580f650109556cc28b22cb.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/217a934cfe15c548b572c203dceb2befdf026462.ttf:--font-funcs=ot:U+0061,U+0061,U+0061:[]
+../fonts/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf:--font-funcs=ot:U+FFFD,U+E0100,U+FFFD,U+E0010:[]
+../fonts/a34a9191d9376bda419836effeef7e75c1386016.ttf:--font-funcs=ot:U+0041:[]
+../fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf:--font-funcs=ot:U+0041:[gid0=0+1229]
+../fonts/b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/243798dd281c1c77c065958e1ff467420faa9bde.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf:--font-funcs=ot --no-positions --no-clusters --no-glyph-names:U+0041:[0|0|2|0|0|2|0|0|2|0|0|2|0|0|2|0|0|2|0|0|0|2|0|0|0|2|0|0|2|0|0|2|0|0|2|0|0|2|0|0|0|2|0|0|2|0|0|2|0|0|2|0]
+../fonts/ef2511f215aa3ca847cbfffbf861793b42170875.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
+../fonts/233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
diff --git a/test/shaping/data/in-house/tests/hangul-jamo.tests b/test/shaping/data/in-house/tests/hangul-jamo.tests
new file mode 100644 (file)
index 0000000..6e2fecc
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf::U+115F,U+11A2:[gid3=0+920|gid4=0+0]
+../fonts/7e14e7883ed152baa158b80e207b66114c823a8b.ttf::U+11A2:[gid1=0+920]
diff --git a/test/shaping/data/in-house/tests/hyphens.tests b/test/shaping/data/in-house/tests/hyphens.tests
new file mode 100644 (file)
index 0000000..acfe8f4
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf::U+2010:[gid1=0+739]
+../fonts/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf::U+2011:[gid1=0+739]
diff --git a/test/shaping/data/in-house/tests/indic-consonant-with-stacker.tests b/test/shaping/data/in-house/tests/indic-consonant-with-stacker.tests
new file mode 100644 (file)
index 0000000..43a3f27
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/a014549f766436cf55b2ceb40e462038938ee899.ttf:--no-glyph-names:U+0CF1,U+0C95:[2=0+1129|3=1+358]
+../fonts/55c88ebbe938680b08f92c3de20713183e0c7481.ttf:--no-glyph-names:U+0CF2,U+0CAA:[2=0+1539|3=1+245]
+../fonts/341421e629668b1a1242245d39238ca48432d35d.ttf:--no-glyph-names:U+0CF1:[1=0+1129]
+../fonts/663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf:--no-glyph-names:U+0CF2:[1=0+1539]
diff --git a/test/shaping/data/in-house/tests/indic-init.tests b/test/shaping/data/in-house/tests/indic-init.tests
new file mode 100644 (file)
index 0000000..fee8635
--- /dev/null
@@ -0,0 +1 @@
+../fonts/1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf:--no-glyph-names:U+09AC,U+09C7,U+09AC,U+09C7:[3=0+273|1=0+460|2=2+307|1=2+460]
diff --git a/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests b/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests
new file mode 100644 (file)
index 0000000..87b3603
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200D,U+0B01:[omorya=0+1450]
+../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200C,U+0B01:[oorya=0+1309|space=0+0|candrabinduorya=0+0]
diff --git a/test/shaping/data/in-house/tests/indic-joiners.tests b/test/shaping/data/in-house/tests/indic-joiners.tests
new file mode 100644 (file)
index 0000000..57107d5
--- /dev/null
@@ -0,0 +1,2 @@
+../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=1+0|uni17ca=1+0|uni17b8=1@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]
diff --git a/test/shaping/data/in-house/tests/indic-old-spec.tests b/test/shaping/data/in-house/tests/indic-old-spec.tests
new file mode 100644 (file)
index 0000000..cd56319
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf::U+0C9A,U+0CCD,U+0C9A,U+0CCD:[U0C9A_U0CCD.haln=0+1066|U0C9A_0CCD.blwf=0+0]
+../fonts/270b89df543a7e48e206a2d830c0e10e5265c630.ttf::U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D:[glyph201=0+1183|U0D4D=0+0]
diff --git a/test/shaping/data/in-house/tests/indic-pref-blocking.tests b/test/shaping/data/in-house/tests/indic-pref-blocking.tests
new file mode 100644 (file)
index 0000000..516753d
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/226bc2deab3846f1a682085f70c67d0421014144.ttf::U+0D2F,U+0D4D,U+0D30,U+0D46:[evowelsignmlym=0+1465|rapostmlym=0+499|yamlym=0+2120]
+../fonts/e207635780b42f898d58654b65098763e340f5c7.ttf::U+0D2F,U+0D4D,U+0D30,U+0D46:[yamlym=0+2120|viramamlym=0+0|evowelsignmlym=0+1465|ramlym=0+1507]
diff --git a/test/shaping/data/in-house/tests/indic-script-extensions.tests b/test/shaping/data/in-house/tests/indic-script-extensions.tests
new file mode 100644 (file)
index 0000000..0589627
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/3493e92eaded2661cadde752a39f9d58b11f0326.ttf::U+0BA4,U+0BC6,U+1133C,U+0BAA,U+1133C,U+0BC6,U+1133C:[u0BC6=0+2093|u1133C=0+0|u0BA4=0+1863|u0BC6=3+2093|u1133C=3+0|u0BAA=3+1706|u1133C=3+0]
+../fonts/b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf:--no-glyph-names:U+0BAA,U+11301,U+11303:[1=0+535|2=0+0|3=0+310]
diff --git a/test/shaping/data/in-house/tests/indic-special-cases.tests b/test/shaping/data/in-house/tests/indic-special-cases.tests
new file mode 100644 (file)
index 0000000..f51651f
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf::U+0CB0,U+0CCD,U+0C95:[gid1=0+1176|gid5=0+1161]
+../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf::U+0CB0,U+200D,U+0CCD,U+0C95:[gid2=0+1334|gid6=0+358]
+../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf::U+0CB0,U+0CCD,U+200D,U+0C95:[gid2=0+1334|gid6=0+358]
diff --git a/test/shaping/data/in-house/tests/indic-syllable.tests b/test/shaping/data/in-house/tests/indic-syllable.tests
new file mode 100644 (file)
index 0000000..4c7d651
--- /dev/null
@@ -0,0 +1,8 @@
+../fonts/54674a3111d209fb6be0ed31745314b7a8d2c244.ttf::U+0BA4,U+0BCD,U+00B3:[taprehalftamil=0+1509|uni00B3=2+674]
+../fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf::U+0CF1:[gid1=0+1129]
+../fonts/3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf::U+0CF2:[gid2=0+1539]
+../fonts/87f85d17d26f1fe9ad28d7365101958edaefb967.ttf:--font-funcs=ot:U+0980,U+0981:[anjibeng=0+520|candrabindubeng=0+0]
+../fonts/85fe0be440c64ac77699e21c2f1bd933a919167e.ttf::U+0A15,U+0A51,U+0A47:[kaguru=0+1273|udaatguru=0@75,0+0|eematraguru=0@-40,0+0]
+../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf::U+0A51:[uni25CC=0+1044|udaatguru=0+0]
+../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf::U+25CC,U+0A51:[uni25CC=0+1044|udaatguru=0+0]
+../fonts/81c368a33816fb20e9f647e8f24e2180f4720263.ttf:--no-glyph-names:U+0C80,U+0C82:[1=0+502|2=0+502]
diff --git a/test/shaping/data/in-house/tests/language-tags.tests b/test/shaping/data/in-house/tests/language-tags.tests
new file mode 100644 (file)
index 0000000..4c62113
--- /dev/null
@@ -0,0 +1,12 @@
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=fa:U+004A:[gid2=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=ja:U+004A:[gid2=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh:U+004A:[gid4=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-cn:U+004A:[gid4=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-sg:U+004A:[gid4=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-tw:U+004A:[gid5=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-hans:U+004A:[gid4=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-hant:U+004A:[gid5=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-hant-hk:U+004A:[gid6=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-HK:U+004A:[gid6=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-mo:U+004A:[gid6=0+1000]
+../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-Hant-mo:U+004A:[gid6=0+1000]
diff --git a/test/shaping/data/in-house/tests/ligature-id.tests b/test/shaping/data/in-house/tests/ligature-id.tests
new file mode 100644 (file)
index 0000000..3daaca3
--- /dev/null
@@ -0,0 +1,36 @@
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|space=3+213|u0995_u09B0_u09CD.blwf.vatu=4+643|u0995_u09CD.half_u09B2.pres=7+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|space=6+213|u0995_u09B0_u09CD.blwf.vatu=7+643|u0995_u09CD.half_u09B2.pres=10+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|space=9+213|u0995_u09B0_u09CD.blwf.vatu=10+643|u0995_u09CD.half_u09B2.pres=13+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|space=12+213|u0995_u09B0_u09CD.blwf.vatu=13+643|u0995_u09CD.half_u09B2.pres=16+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|space=15+213|u0995_u09B0_u09CD.blwf.vatu=16+643|u0995_u09CD.half_u09B2.pres=19+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|space=18+213|u0995_u09B0_u09CD.blwf.vatu=19+643|u0995_u09CD.half_u09B2.pres=22+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|space=21+213|u0995_u09B0_u09CD.blwf.vatu=22+643|u0995_u09CD.half_u09B2.pres=25+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|space=24+213|u0995_u09B0_u09CD.blwf.vatu=25+643|u0995_u09CD.half_u09B2.pres=28+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|space=27+213|u0995_u09B0_u09CD.blwf.vatu=28+643|u0995_u09CD.half_u09B2.pres=31+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|space=30+213|u0995_u09B0_u09CD.blwf.vatu=31+643|u0995_u09CD.half_u09B2.pres=34+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|space=33+213|u0995_u09B0_u09CD.blwf.vatu=34+643|u0995_u09CD.half_u09B2.pres=37+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|space=36+213|u0995_u09B0_u09CD.blwf.vatu=37+643|u0995_u09CD.half_u09B2.pres=40+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|space=39+213|u0995_u09B0_u09CD.blwf.vatu=40+643|u0995_u09CD.half_u09B2.pres=43+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|space=42+213|u0995_u09B0_u09CD.blwf.vatu=43+643|u0995_u09CD.half_u09B2.pres=46+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|space=45+213|u0995_u09B0_u09CD.blwf.vatu=46+643|u0995_u09CD.half_u09B2.pres=49+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|space=48+213|u0995_u09B0_u09CD.blwf.vatu=49+643|u0995_u09CD.half_u09B2.pres=52+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|space=51+213|u0995_u09B0_u09CD.blwf.vatu=52+643|u0995_u09CD.half_u09B2.pres=55+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|space=54+213|u0995_u09B0_u09CD.blwf.vatu=55+643|u0995_u09CD.half_u09B2.pres=58+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|space=57+213|u0995_u09B0_u09CD.blwf.vatu=58+643|u0995_u09CD.half_u09B2.pres=61+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|space=60+213|u0995_u09B0_u09CD.blwf.vatu=61+643|u0995_u09CD.half_u09B2.pres=64+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|space=63+213|u0995_u09B0_u09CD.blwf.vatu=64+643|u0995_u09CD.half_u09B2.pres=67+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|space=66+213|u0995_u09B0_u09CD.blwf.vatu=67+643|u0995_u09CD.half_u09B2.pres=70+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|space=69+213|u0995_u09B0_u09CD.blwf.vatu=70+643|u0995_u09CD.half_u09B2.pres=73+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|space=72+213|u0995_u09B0_u09CD.blwf.vatu=73+643|u0995_u09CD.half_u09B2.pres=76+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|space=75+213|u0995_u09B0_u09CD.blwf.vatu=76+643|u0995_u09CD.half_u09B2.pres=79+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|space=78+213|u0995_u09B0_u09CD.blwf.vatu=79+643|u0995_u09CD.half_u09B2.pres=82+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|space=81+213|u0995_u09B0_u09CD.blwf.vatu=82+643|u0995_u09CD.half_u09B2.pres=85+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|space=84+213|u0995_u09B0_u09CD.blwf.vatu=85+643|u0995_u09CD.half_u09B2.pres=88+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|space=87+213|u0995_u09B0_u09CD.blwf.vatu=88+643|u0995_u09CD.half_u09B2.pres=91+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|space=90+213|u0995_u09B0_u09CD.blwf.vatu=91+643|u0995_u09CD.half_u09B2.pres=94+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|space=93+213|u0995_u09B0_u09CD.blwf.vatu=94+643|u0995_u09CD.half_u09B2.pres=97+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|space=96+213|u0995_u09B0_u09CD.blwf.vatu=97+643|u0995_u09CD.half_u09B2.pres=100+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|space=99+213|u0995_u09B0_u09CD.blwf.vatu=100+643|u0995_u09CD.half_u09B2.pres=103+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|u0995_u09CD.half_u0995.pres=99+566|space=102+213|u0995_u09B0_u09CD.blwf.vatu=103+643|u0995_u09CD.half_u09B2.pres=106+602]
+../fonts/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|u0995_u09CD.half_u0995.pres=99+566|u0995_u09CD.half_u0995.pres=102+566|space=105+213|u0995_u09B0_u09CD.blwf.vatu=106+643|u0995_u09CD.half_u09B2.pres=109+602]
+../fonts/a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf::U+1004,U+103A,U+1039,U+101B,U+103D,U+102D:[uni101B103D=0+450|uni1004103A1039102D=0@-50,0+0]
diff --git a/test/shaping/data/in-house/tests/mark-attachment.tests b/test/shaping/data/in-house/tests/mark-attachment.tests
new file mode 100644 (file)
index 0000000..9a9b8ff
--- /dev/null
@@ -0,0 +1 @@
+../fonts/98b7887cff91f722b92a8ff800120954606354f9.ttf::U+100F,U+103C,U+102F,U+1036:[uni103C102F=0+150|uni100F=0+550|uni1036=0@-150,0+0]
diff --git a/test/shaping/data/in-house/tests/mark-filtering-sets.tests b/test/shaping/data/in-house/tests/mark-filtering-sets.tests
new file mode 100644 (file)
index 0000000..d30e021
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+062A,U+0629:[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph837=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
+../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+0646,U+0629:[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph836=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
+../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+0626,U+0629:[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph847=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
+../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+062B,U+0629:[glyph837=3@299,1520+0|uni06C1.1=3+502|glyph838=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
+../fonts/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+0679,U+0629:[glyph837=3@299,1520+0|uni06C1.1=3+502|glyph842=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
diff --git a/test/shaping/data/in-house/tests/mongolian-variation-selector.tests b/test/shaping/data/in-house/tests/mongolian-variation-selector.tests
new file mode 100644 (file)
index 0000000..efb4cf4
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf::U+1826,U+180B,U+1826:[uni1826.E85E_ue.init1=0+599|uni1826.E856_ue.fina=2+750]
+../fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf::U+1820,U+180B:[uni1820.E821_a.isol1=0+1199]
+../fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf::U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837,U+0020,U+182D,U+182D,U+180B,U+0020,U+182D,U+180C,U+0020,U+182D,U+180D,U+200D,U+0020,U+182D,U+200D,U+182D,U+180B,U+200D,U+0020,U+182D,U+180C,U+200D,U+0020,U+182D,U+180D,U+200D,U+0020,U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D,U+0020,U+200D,U+182D,U+180C,U+200D,U+0020,U+200D,U+182D,U+180D,U+200D,U+0020,U+200D,U+182D,U+200D,U+182D,U+180B,U+0020,U+200D,U+182D,U+180C,U+0020,U+1820,U+200C,U+182D,U+1820,U+1837,U+0020,U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D,U+0020,U+200D,U+182D,U+1824,U+182F,U+1822,U+0020,U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828:[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750|space=11+500|uni182D.E8E2_g.init=12+1000|uni182D.E8E8_g.fina1=13+1250|space=15+500|uni182D.EA1B_g.isol2=16+1000|space=18+500|uni182D.EA1E_g.init3=19+650|space=19+0|space=22+500|uni182D.E8E2_g.init=23+1000|space=23+0|uni182D.E8E5_g.medi1=25+800|space=25+0|space=28+500|uni182D.EA1D_g.init2=29+950|space=29+0|space=32+500|uni182D.EA1E_g.init3=33+650|space=33+0|space=36+500|space=36+0|uni182D.E8E4_g.medi=38+800|space=38+0|space=38+0|uni182D.E8E5_g.medi1=41+800|space=41+0|space=44+500|space=44+0|uni182D.E8E6_g.medi2=46+650|space=46+0|space=49+500|space=49+0|uni182D.E8E6_g.medi2=51+650|space=51+0|space=54+500|space=54+0|uni182D.E8E4_g.medi=56+800|space=56+0|uni182D.E8E8_g.fina1=58+1250|space=60+500|space=60+0|uni182D.E8E9_g.fina2=62+1050|space=64+500|uni1820.E820_a.isol=65+1550|space=65+0|uni182D.E8E2_g.init=67+1000|uni1820.E823_a.medi=68+400|uni1837.E931_r.fina=69+750|space=70+500|uni1830.E90B_s.init=71+850|uni1824.E844_u.medi=72+600|uni1837.E930_r.medi=73+600|space=73+0|space=73+0|uni182D.E8E5_g.medi1=76+800|uni1820.E823_a.medi=77+400|space=77+0|space=79+500|space=79+0|uni182D.E8E5_g.medi1=81+800|uni1824.E844_u.medi=82+600|uni182F.E908_l.medi=83+400|uni1822.E837_i.fina=84+600|space=85+500|uni182A1820.E875_ba.init=86+1000|uni1822.E836_i.medi2=88+1000|uni182D.E8E8_g.fina1=89+1250|space=90+0|uni1820.E827_a.fina2=91+600|uni202F.nobreak=92+500|uni1836.E92B_y.init1=93+500|uni1822.E834_i.medi=94+500|uni1828.E866_n.fina=95+850]
+../fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf::U+180A,U+1868,U+180A,U+1868,U+180B,U+180A,U+1868,U+180C,U+180A,U+1868,U+180D,U+180A:[gid1=0+268|gid10=1+778|gid1=2+268|gid9=3+575|gid1=5+268|gid10=6+778|gid1=8+268|gid8=9+575|gid1=11+268]
diff --git a/test/shaping/data/in-house/tests/myanmar-syllable.tests b/test/shaping/data/in-house/tests/myanmar-syllable.tests
new file mode 100644 (file)
index 0000000..4666ef9
--- /dev/null
@@ -0,0 +1 @@
+../fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf:--no-glyph-names:U+101D,U+FE00,U+1031,U+FE00,U+1031,U+FE00:[6=0+465|6=0+465|5=0+502]
diff --git a/test/shaping/data/in-house/tests/simple.tests b/test/shaping/data/in-house/tests/simple.tests
new file mode 100644 (file)
index 0000000..64cae0e
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf:--shaper=ot:U+0056,U+0041,U+0042,U+0045,U+0061,U+0062,U+0063,U+0064:[V=0+1142|A=1+1295|B=2+1295|E=3+1123|a=4+1126|b=5+1164|c=6+1072|d=7+1164]
+../fonts/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf:--shaper=fallback:U+0056,U+0041,U+0042,U+0045,U+0061,U+0062,U+0063,U+0064:[V=0+1295|A=1+1295|B=2+1295|E=3+1123|a=4+1126|b=5+1164|c=6+1072|d=7+1164]
diff --git a/test/shaping/data/in-house/tests/spaces.tests b/test/shaping/data/in-house/tests/spaces.tests
new file mode 100644 (file)
index 0000000..3ebaac5
--- /dev/null
@@ -0,0 +1,17 @@
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+0020:[gid1=0+560]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+00A0:[gid1=0+560]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+1680:[gid0=0+692]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2000:[gid1=0+1024]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2001:[gid1=0+2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2002:[gid1=0+1024]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2003:[gid1=0+2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2004:[gid1=0+683]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2005:[gid1=0+512]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2006:[gid1=0+341]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2007:[gid1=0+560]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2008:[gid1=0+560]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2009:[gid1=0+410]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+200A:[gid1=0+128]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+202F:[gid1=0+280]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+205F:[gid1=0+455]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+3000:[gid1=0+2048]
diff --git a/test/shaping/data/in-house/tests/tibetan-contractions-1.tests b/test/shaping/data/in-house/tests/tibetan-contractions-1.tests
new file mode 100644 (file)
index 0000000..ccc0c9c
--- /dev/null
@@ -0,0 +1,60 @@
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+FEFF,U+0F40,U+0F72,U+0F72,U+0F0B,U+0F66,U+0FAD,U+0F7C,U+0F7C,U+0F0B:[uni0F40=0+680|uni0F720F72=0+0|uni0F0B=4+190|uni0F660FAD=5+680|uni0F7D=5+0|uni0F0B=9+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0F74,U+0F72,U+0F66,U+0F0B:[uni0F400F740F72=0+680|uni0F66=3+680|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0F74,U+0F7A,U+0F53,U+0F0B:[uni0F400F74=0+680|uni0F7A=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0F74,U+0F7C,U+0F56,U+0F39,U+0F0B:[uni0F400F74=0+680|uni0F7C=0+0|uni0F56=3+610|uni0F39=3+0|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0F74,U+0F72,U+0F42,U+0F66,U+0F0B:[uni0F400F740F72=0+680|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0F74,U+0F7A,U+0F66,U+0F0B:[uni0F400F74=0+680|uni0F7A=0+0|uni0F66=3+680|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0FB3,U+0F74,U+0F7A,U+0F56,U+0F66,U+0F0B:[uni0F400FB30F740F7A=0+660|uni0F56=4+610|uni0F66=5+680|uni0F0B=6+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F40,U+0FB3,U+0F74,U+0F7C,U+0F42,U+0F0B:[uni0F400FB30F74=0+660|uni0F7C=0+0|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F40,U+0F7C,U+0F7C,U+0F42,U+0F0B:[uni0F51=0+600|uni0F400F7D=1+680|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F40,U+0F7C,U+0F7C,U+0F62,U+0F0B:[uni0F51=0+600|uni0F400F7D=1+680|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F40,U+0FB1,U+0F7C,U+0F72,U+0F62,U+0F0B:[uni0F51=0+600|uni0F400FB10F7C0F72=1+660|uni0F62=5+620|uni0F0B=6@-65,0+130]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F66,U+0F90,U+0FB1,U+0F74,U+0F7A,U+0F0B:[uni0F660F900FB10F74=0+680|uni0F7A=0+0|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F66,U+0F90,U+0FB1,U+0F7A,U+0F7A,U+0F51,U+0F0B:[uni0F56=0+610|uni0F660F900FB1=1+660|uni0F7B=1+0|uni0F51=6+600|uni0F0B=7@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F66,U+0F90,U+0FB1,U+0F7A,U+0F7A,U+0F7A,U+0F51,U+0F0B:[uni0F56=0+610|uni0F660F900FB1=1+660|uni0F7B0F7A=1+0|uni0F51=7+600|uni0F0B=8@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0F58,U+0F66,U+0F74,U+0F7E,U+0F0B:[uni0F41=0+660|uni0F58=1+660|uni0F660F740F7E=2+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0F74,U+0F7C,U+0F66,U+0F39,U+0F0B:[uni0F410F74=0+680|uni0F7C=0+0|uni0F66=3+680|uni0F39=3+0|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0FB1,U+0F74,U+0F7C,U+0F42,U+0F0B:[uni0F410FB10F74=0+670|uni0F7C=0+0|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0FB2,U+0F74,U+0F7A,U+0F51,U+0F0B:[uni0F410FB20F74=0+660|uni0F7A=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0FB2,U+0F74,U+0F72,U+0F44,U+0F0B:[uni0F410FB20F74=0+660|uni0F72=0+0|uni0F44=4+560|uni0F0B=5@-20,0+110]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0FB2,U+0F74,U+0F7C,U+0F51,U+0F0B:[uni0F410FB20F74=0+660|uni0F7C=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F41,U+0FB2,U+0F74,U+0F7E,U+0F51,U+0F0B:[uni0F410FB20F740F7E=0+660|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F58,U+0F41,U+0FB1,U+0F7A,U+0F7A,U+0F7A,U+0F53,U+0F0B:[uni0F58=0+660|uni0F410FB1=1+680|uni0F7B0F7A=1+0|uni0F53=6+590|uni0F0B=7@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F60,U+0F41,U+0F7C,U+0F7C,U+0F62,U+0F0B:[uni0F60=0+600|uni0F410F7D=1+660|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0F74,U+0F7C,U+0F42,U+0F0B:[uni0F420F74=0+680|uni0F7C=0+0|uni0F42=3+680|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB1,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F420FB10F74=0+700|uni0F72=0+0|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F74,U+0F72,U+0F53,U+0F0B:[uni0F420FB20F74=0+680|uni0F72=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F74,U+0F72,U+0F0B:[uni0F420FB20F74=0+680|uni0F72=0+0|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F74,U+0F7C,U+0F53,U+0F0B:[uni0F420FB20F74=0+680|uni0F7C=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F74,U+0F7C,U+0F56,U+0F0B:[uni0F420FB20F74=0+680|uni0F7C=0+0|uni0F56=4+610|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F7C,U+0F72,U+0F53,U+0F0B:[uni0F420FB2=0+680|uni0F7C0F72=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0FB2,U+0F7C,U+0F7A,U+0F62,U+0F0B:[uni0F420FB2=0+680|uni0F7C0F7A=0+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F42,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F51=0+600|uni0F420F740F72=1+680|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F42,U+0F74,U+0F7A,U+0F53,U+0F0B:[uni0F51=0+600|uni0F420F74=1+680|uni0F7A=1+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F42,U+0F74,U+0F7A,U+0F42,U+0F66,U+0F0B:[uni0F51=0+600|uni0F420F74=1+680|uni0F7A=1+0|uni0F42=4+680|uni0F66=5+680|uni0F0B=6+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F42,U+0FB3,U+0F7C,U+0F7A,U+0F44,U+0F0B:[uni0F51=0+600|uni0F420FB3=1+680|uni0F7C0F7A=1+0|uni0F44=5+560|uni0F0B=6@-20,0+110]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F58,U+0F42,U+0F7C,U+0F7C,U+0F53,U+0F0B:[uni0F58=0+660|uni0F420F7D=1+680|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F44,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F440F74=0+610|uni0F72=0+0|uni0F42=3+680|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F51,U+0F42,U+0FB2,U+0F74,U+0F7C,U+0F56,U+0F0B:[uni0F51=0+600|uni0F420FB20F74=1+680|uni0F7C=1+0|uni0F56=5+610|uni0F0B=6+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F45,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F56=0+610|uni0F450F740F72=1+630|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F45,U+0F74,U+0F72,U+0F66,U+0F0B:[uni0F56=0+610|uni0F450F740F72=1+630|uni0F66=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F45,U+0FB2,U+0F74,U+0F42,U+0F0B:[uni0F56=0+610|uni0F450FB20F74=1+640|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F45,U+0F74,U+0F72,U+0F0B:[uni0F56=0+610|uni0F450F740F72=1+630|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F45,U+0F74,U+0F7E,U+0F0B:[uni0F56=0+610|uni0F450F740F7E=1+630|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0F74,U+0F72,U+0F63,U+0F0B:[uni0F460F74=0+650|uni0F72=0+0|uni0F63=3+700|uni0F0B=4+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0F74,U+0F7C,U+0F51,U+0F0B:[uni0F460F74=0+650|uni0F7C=0+0|uni0F51=3+600|uni0F0B=4@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0F74,U+0F7C,U+0F51,U+0F0B:[uni0F460F74=0+650|uni0F7C=0+0|uni0F51=3+600|uni0F0B=4@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0F74,U+0F7E,U+0F51,U+0F0B:[uni0F460F740F7E=0+650|uni0F51=3+600|uni0F0B=4@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0F39,U+0F74,U+0F7C,U+0F51,U+0F0B:[uni0F46=0+620|uni0F39=0+0|uni0F74=0+0|uni0F7C=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0FB2,U+0F74,U+0F72,U+0F53,U+0F0B:[uni0F460FB20F740F72=0+660|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F46,U+0FB2,U+0F74,U+0F7C,U+0F63,U+0F0B:[uni0F460FB20F74=0+660|uni0F7C=0+0|uni0F63=4+700|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F58,U+0F46,U+0F7C,U+0F7A,U+0F53,U+0F0B:[uni0F58=0+660|uni0F46=1+620|uni0F7C0F7A=1+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F60,U+0F46,U+0FB1,U+0F7C,U+0F72,U+0F62,U+0F0B:[uni0F60=0+600|uni0F460FB10F7C0F72=1+660|uni0F62=5+620|uni0F0B=6@-65,0+130]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F47,U+0F7C,U+0F7C,U+0F0B:[uni0F470F7D=0+570|uni0F0B=3+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F62,U+0F97,U+0F74,U+0F7A,U+0F53,U+0F39,U+0F0B:[uni0F620F970F74=0+600|uni0F7A=0+0|uni0F53=4+590|uni0F39=4+0|uni0F0B=6+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F49,U+0F74,U+0F72,U+0F0B:[uni0F490F74=0+580|uni0F72=0+0|uni0F0B=3+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F49,U+0F74,U+0F72,U+0F44,U+0F0B:[uni0F490F74=0+580|uni0F72=0+0|uni0F44=3+560|uni0F0B=4@-20,0+110]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F58,U+0F49,U+0F72,U+0F7E,U+0F51,U+0F0B:[uni0F58=0+660|uni0F49=1+580|uni0F720F7E=1+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F42,U+0F4F,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F42=0+680|uni0F4F0F740F72=1+600|uni0F42=4+680|uni0F0B=5+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F56,U+0F4F,U+0F44,U+0F7C,U+0F7E,U+0F66,U+0F0B:[uni0F56=0+610|uni0F4F=1+560|uni0F44=2+560|uni0F7C0F7E=2+0|uni0F66=5+680|uni0F0B=6+190]
+../fonts/a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf::U+0F50,U+0F39,U+0F74,U+0F7A,U+0F4A,U+0F0B:[uni0F50=0+600|uni0F39=0+0|uni0F74=0+0|uni0F7A=0+0|uni0F4A=4+590|uni0F0B=5+190]
diff --git a/test/shaping/data/in-house/tests/tibetan-contractions-2.tests b/test/shaping/data/in-house/tests/tibetan-contractions-2.tests
new file mode 100644 (file)
index 0000000..b44445c
--- /dev/null
@@ -0,0 +1,53 @@
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F50,U+0F74,U+0F72,U+0F53,U+0F0B:[uni0F500F74=0+600|uni0F72=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F50,U+0F74,U+0F7C,U+0F44,U+0F0B:[uni0F58=0+660|uni0F500F74=1+600|uni0F7C=1+0|uni0F44=4+560|uni0F0B=5@-20,0+110]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F50,U+0F7C,U+0F7A,U+0F44,U+0F0B:[uni0F58=0+660|uni0F50=1+600|uni0F7C0F7A=1+0|uni0F44=4+560|uni0F0B=5@-20,0+110]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F50,U+0F7C,U+0F72,U+0F66,U+0F0B:[uni0F58=0+660|uni0F50=1+600|uni0F7C0F72=1+0|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F51,U+0F74,U+0F62,U+0FB2,U+0F7C,U+0F51,U+0F0B:[uni0F510F74=0+600|uni0F620FB2=2+600|uni0F7C=2+0|uni0F51=5+600|uni0F0B=6@-70,0+106]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F51,U+0FB2,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F510FB20F74=0+600|uni0F72=0+0|uni0F42=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F51,U+0F74,U+0F7A,U+0F53,U+0F0B:[uni0F42=0+680|uni0F510F740F7A=1+600|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F56,U+0F51,U+0F7B,U+0F42,U+0F66,U+0F0B:[uni0F56=0+610|uni0F510F7B=1+579|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F60,U+0F51,U+0F74,U+0F7A,U+0F51,U+0F0B:[uni0F60=0+600|uni0F510F740F7A=1+600|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F62,U+0FA1,U+0F7C,U+0F7A,U+0F0B:[uni0F620FA10F7C0F7A=0+580|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0FA1,U+0F74,U+0F72,U+0F56,U+0F0B:[uni0F660FA10F74=0+680|uni0F72=0+0|uni0F56=4+610|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F53,U+0F74,U+0F7C,U+0F42,U+0F66,U+0F0B:[uni0F530F74=0+600|uni0F7C=0+0|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F53,U+0F74,U+0F7C,U+0F62,U+0F0B:[uni0F530F74=0+600|uni0F7C=0+0|uni0F62=3+620|uni0F0B=4@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F53,U+0FB1,U+0F7C,U+0F7E,U+0F62,U+0F0B:[uni0F42=0+680|uni0F530FB1=1+600|uni0F7C0F7E=1+0|uni0F62=5+620|uni0F0B=6@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F51,U+0F54,U+0F74,U+0F7C,U+0F42,U+0F66,U+0F0B:[uni0F51=0+600|uni0F540F74=1+610|uni0F7C=1+0|uni0F42=4+680|uni0F66=5+680|uni0F0B=6+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F56,U+0FB1,U+0F74,U+0F7E,U+0F56,U+0F0B:[uni0F560FB10F74=0+620|uni0F7E=0+0|uni0F56=4+610|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F56,U+0FB3,U+0F74,U+0F7C,U+0F53,U+0F0B:[uni0F560FB30F74=0+650|uni0F7C=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F56,U+0FB3,U+0F7C,U+0F7C,U+0F53,U+0F0B:[uni0F560FB3=0+650|uni0F7D=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F51,U+0F56,U+0F74,U+0F7C,U+0F51,U+0F0B:[uni0F51=0+600|uni0F560F74=1+610|uni0F7C=1+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F51,U+0F56,U+0F74,U+0F7C,U+0F56,U+0F66,U+0F0B:[uni0F51=0+600|uni0F560F74=1+610|uni0F7C=1+0|uni0F56=4+610|uni0F66=5+680|uni0F0B=6+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F74,U+0F7A,U+0F42,U+0F66,U+0F0B:[uni0F580F74=0+680|uni0F7A=0+0|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F74,U+0F72,U+0F42,U+0F0B:[uni0F580F74=0+680|uni0F72=0+0|uni0F42=3+680|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F74,U+0F7A,U+0F42,U+0F66,U+0F0B:[uni0F580F74=0+680|uni0F7A=0+0|uni0F42=3+680|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F74,U+0F7A,U+0F53,U+0F0B:[uni0F580F74=0+680|uni0F7A=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F9F,U+0F7C,U+0F7A,U+0F42,U+0F0B:[uni0F580F9F0F7C0F7A=0+660|uni0F42=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F7C,U+0F7A,U+0F44,U+0F0B:[uni0F58=0+660|uni0F7C0F7A=0+0|uni0F44=3+560|uni0F0B=4@-20,0+110]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F59,U+0F74,U+0F7C,U+0F62,U+0F0B:[uni0F42=0+680|uni0F590F74=1+620|uni0F7C=1+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F58,U+0F5A,U+0FAE,U+0F74,U+0F7E,U+0F66,U+0F0B:[uni0F58=0+660|uni0F5A0FAE0F740F7E=1+620|uni0F66=5+680|uni0F0B=6+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F62,U+0FAB,U+0F74,U+0F7A,U+0F66,U+0F0B:[uni0F620FAB0F74=0+660|uni0F7A=0+0|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F62,U+0FAB,U+0F74,U+0F7A,U+0F53,U+0F0B:[uni0F620FAB0F74=0+660|uni0F7A=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F5E,U+0F74,U+0F7C,U+0F63,U+0F0B:[uni0F5E0F74=0+660|uni0F7C=0+0|uni0F63=3+700|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5E,U+0F74,U+0F7C,U+0F42,U+0F0B:[uni0F42=0+680|uni0F5E0F74=1+660|uni0F7C=1+0|uni0F42=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5E,U+0F74,U+0F7C,U+0F58,U+0F66,U+0F0B:[uni0F42=0+680|uni0F5E0F74=1+660|uni0F7C=1+0|uni0F58=4+660|uni0F66=5+680|uni0F0B=6+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5F,U+0F74,U+0F7C,U+0F0B:[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7C=1+0|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5F,U+0F74,U+0F72,U+0F44,U+0F0B:[uni0F42=0+680|uni0F5F0F740F72=1+610|uni0F44=4+560|uni0F0B=5@-20,0+110]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5F,U+0F74,U+0F7A,U+0F62,U+0F0B:[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7A=1+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5F,U+0F74,U+0F7A,U+0F62,U+0F0B:[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7A=1+0|uni0F62=4+620|uni0F0B=5@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F42,U+0F5F,U+0F74,U+0F7A,U+0F51,U+0F0B:[uni0F42=0+680|uni0F5F0F74=1+610|uni0F7A=1+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F60,U+0F7C,U+0F7A,U+0F62,U+0F0B:[uni0F60=0+600|uni0F7C0F7A=0+0|uni0F62=3+620|uni0F0B=4@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F61,U+0F72,U+0F7A,U+0F0B:[uni0F61=0+700|uni0F720F7A=0+0|uni0F0B=3+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F61,U+0F7A,U+0F7A,U+0F66,U+0F0B:[uni0F61=0+700|uni0F7B=0+0|uni0F66=3+680|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F62,U+0F72,U+0F53,U+0F7C,U+0F7A,U+0F0B:[uni0F620F72=0+620|uni0F530F7C0F7A=2+590|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F62,U+0F74,U+0F7C,U+0F63,U+0F0B:[uni0F620F74=0+601|uni0F7C=0+0|uni0F63=3+700|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0F7A,U+0F7E,U+0F53,U+0F0B:[uni0F66=0+680|uni0F7A0F7E=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0F7A,U+0F7E,U+0F51,U+0F60,U+0F0B:[uni0F66=0+680|uni0F7A0F7E=0+0|uni0F51=3+600|uni0F60=4+600|uni0F0B=5@-40,0+150]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0F7C,U+0F7C,U+0F56,U+0F0B:[uni0F660F7D=0+680|uni0F56=3+610|uni0F0B=4+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0F7C,U+0F7C,U+0F62,U+0F0B:[uni0F660F7D=0+680|uni0F62=3+620|uni0F0B=4@-65,0+130]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0FB2,U+0F7C,U+0F7A,U+0F66,U+0F0B:[uni0F660FB2=0+680|uni0F7C0F7A=0+0|uni0F66=4+680|uni0F0B=5+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0FB3,U+0F7C,U+0F7C,U+0F51,U+0F0B:[uni0F660FB3=0+680|uni0F7D=0+0|uni0F51=4+600|uni0F0B=5@-70,0+106]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F66,U+0FB3,U+0F7C,U+0F7C,U+0F53,U+0F0B:[uni0F660FB3=0+680|uni0F7D=0+0|uni0F53=4+590|uni0F0B=5@-30,0+160]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F56,U+0F66,U+0F99,U+0F7C,U+0F7E,U+0F51,U+0F66,U+0F0B:[uni0F56=0+610|uni0F660F99=1+670|uni0F7C0F7E=1+0|uni0F51=5+600|uni0F66=6+680|uni0F0B=7+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F63,U+0FB7,U+0FB1,U+0F7C,U+0F42,U+0F66,U+0F0B:[uni0F630FB70FB1=0+680|uni0F7C=0+0|uni0F42=4+680|uni0F66=5+680|uni0F0B=6+190]
+../fonts/2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf::U+0F68,U+0FB1,U+0F7C,U+0F53,U+0F0B:[uni0F680FB1=0+740|uni0F7C=0+0|uni0F53=3+590|uni0F0B=4@-30,0+160]
diff --git a/test/shaping/data/in-house/tests/tibetan-vowels.tests b/test/shaping/data/in-house/tests/tibetan-vowels.tests
new file mode 100644 (file)
index 0000000..0bb0743
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F72:[uni0F680F72=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F74:[uni0F680F74=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7A:[uni0F680F7A=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7C:[uni0F680F7C=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F71,U+0F72:[uni0F680F710F72=0+720]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F71,U+0F74:[uni0F680F75=0+720]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7B:[uni0F680F7B=0+720]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7D:[uni0F680F7D=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7E:[uni0F680F7E=0+730]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F68,U+0F7F:[uni0F68=0+730|uni0F7F=0+408]
+../fonts/82f4f3b57bb55344e72e70231380202a52af5805.ttf::U+0F00:[uni0F00=0+730]
diff --git a/test/shaping/data/in-house/tests/use-marchen.tests b/test/shaping/data/in-house/tests/use-marchen.tests
new file mode 100644 (file)
index 0000000..850c3e7
--- /dev/null
@@ -0,0 +1,35 @@
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8F:[u11C8F=0+3000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C71:[u11C71=0+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11CB5:[u11C8A=0+2000|u11CB5=0@-2000,0+0]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C84,U+11C71:[u11C84=0+2200|u11C71=1+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C7E,U+11C8A:[u11C7E=0+2600|u11C8A=1+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11C92,U+11CA9:[u11C8A.11C92.11CA9=0+2600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11C94,U+11CA9:[u11C8A.11C94.11CA9=0+2600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C92,U+11CA9:[u11C8D.11C92.11CA9=0+2600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C94,U+11CA9:[u11C8D.11C94.11CA9=0+2600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C9E,U+11CA9:[u11C8D.11C9E.11CA9=0+3200]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA0,U+11CA9:[u11C8D.11CA0.11CA9=0+3000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C92,U+11CAA:[u11C8D.11C92.11CAA=0+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C94,U+11CAA:[u11C8D.11C94.11CAA=0+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C9D,U+11CAA:[u11C8D.11C9D.11CAA=0+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C9E,U+11CAA:[u11C8D.11C9E.11CAA=0+2600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA0,U+11CAA:[u11C8D.11CA0.11CAA=0+2400]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C72,U+11CAA:[u11C80=0+2400|u11C72.11CAA=1+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8C,U+11CB1,U+11C8D:[u11C8C.11CB1=0+2793|u11C8D=2+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C7C,U+11CB3:[u11C80=0+2400|u11C7C.11CB3=1+2200]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C7F,U+11CB2,U+11C7D:[u11C7F.11CB2=0+2400|u11C7D=2+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CB2,U+11C81:[u11C8D.11CB2=0+2000|u11C81=2+2400]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8C,U+11CB4,U+11C74:[u11C8C.11CB4=0+2800|u11C74=2+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11CA1,U+11CA9,U+11C71:[u11C8A.11CA1.11CA9=0+3000|u11C71=3+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA1,U+11CA9,U+11C71:[u11C8D.11CA1.11CA9=0+3000|u11C71=3+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA1,U+11CAA,U+11C71:[u11C8D.11CA1.11CAA=0+2400|u11C71=3+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8F,U+11CB0,U+11CB4,U+11CB6:[u11C8F.11CB0.11CB4=0+3600|u11CB6=0@-3200,0+0]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8E,U+11CB0,U+11CB2,U+11CB5:[u11C8E.11CB0.11CB2=0+2000|u11CB5=0@-2000,0+0]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C74,U+11C89,U+11CB2,U+11C75:[u11C74=0+2000|u11C89.11CB2=1+2000|u11C75=3+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C7C,U+11CAA,U+11CB2,U+11C75:[u11C7C.11CAA.11CB2=0+2200|u11C75=3+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C81,U+11C74,U+11CB2,U+11C8B:[u11C81=0+2400|u11C74.11CB2=1+2000|u11C8B=3+2400]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8B,U+11CB3,U+11C74,U+11C8D:[u11C8B.11CB3=0+2400|u11C74=2+2000|u11C8D=3+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C83,U+11CB4,U+11C74,U+11C8D:[u11C83.11CB4=0+2800|u11C74=2+2000|u11C8D=3+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8B,U+11CB3,U+11C74,U+11C8D,U+11C71:[u11C8B.11CB3=0+2400|u11C74=2+2000|u11C8D=3+2000|u11C71=4+1600]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C76,U+11CB1,U+11C75,U+11C8D:[u11C80=0+2400|u11C76.11CB1=1+3200|u11C75=3+2000|u11C8D=4+2000]
+../fonts/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C8D,U+11C94,U+11CAA,U+11CB1,U+11C74,U+11C8D:[u11C80=0+2400|u11C8D.11C94.11CAA.11CB1.shorti=1+2600|u11C74=5+2000|u11C8D=6+2000]
diff --git a/test/shaping/data/in-house/tests/use-syllable.tests b/test/shaping/data/in-house/tests/use-syllable.tests
new file mode 100644 (file)
index 0000000..5d2fab3
--- /dev/null
@@ -0,0 +1,8 @@
+../fonts/96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf::U+AA00,U+AA2D,U+AA29:[a_cham=0+1121|uSign_cham=0@14,0+0|.notdef=0+600]
+../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf::U+AA00,U+AA34,U+AA36:[raMedial_cham_pre=0+400|a_cham=0+1121|waMedial_cham=0@-32,0+0]
+../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf::U+AA00,U+AA35,U+AA33:[a_cham=0+1121|laMedial_cham=0@-32,0+0|yaMedial_cham=0+542]
+../fonts/e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf::U+AA00,U+AA35,U+AA36:[a_cham=0+1121|laMedial_waMedial_cham=0@43,0+0]
+../fonts/074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf:--no-glyph-names:U+11320,U+20F0,U+11367:[3=0+502|1=0@33,0+0|4=0@300,8+0]
+../fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf:--no-glyph-names:U+A8AC,U+A8B4,U+A8B5:[2=0+377|3=0+242|4=0+210]
+../fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf:--no-glyph-names:U+1BC7,U+1BEA,U+1BF3:[1=0+749|2=0+402|4=0+535|3=0+401]
+../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf::U+11064,U+1107F,U+11052,U+11065,U+1107F,U+11053:[brm_num100.1=0+2224|brm_num1000.2=3+1834]
diff --git a/test/shaping/data/in-house/tests/use.tests b/test/shaping/data/in-house/tests/use.tests
new file mode 100644 (file)
index 0000000..172946c
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf::U+1B1B,U+1B44,U+1B13,U+1B3E:[gid3=0+990|gid7=0+2473|gid5=0@-293,-400+0]
+../fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
+../fonts/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+1211|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
+../fonts/6ff0fbead4462d9f229167b4e6839eceb8465058.ttf:--font-funcs=ot:U+11103,U+11128:[u11103=0+837|u11128=0+0]
+../fonts/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]
diff --git a/test/shaping/data/in-house/tests/variations-rvrn.tests b/test/shaping/data/in-house/tests/variations-rvrn.tests
new file mode 100644 (file)
index 0000000..78ebb92
--- /dev/null
@@ -0,0 +1,100 @@
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=1:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=11:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=21:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=31:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=41:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=51:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=61:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=71:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=81:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=91:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=101:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=111:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=121:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=131:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=141:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=151:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=161:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=171:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=181:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=191:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=201:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=211:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=221:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=231:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=241:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=251:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=261:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=271:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=281:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=291:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=301:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=311:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=321:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=331:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=341:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=351:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=361:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=371:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=381:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=391:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=401:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=411:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=421:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=431:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=441:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=451:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=461:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=471:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=481:U+0072:[rvrn_base=0+1529]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=491:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=501:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=511:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=521:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=531:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=541:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=551:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=561:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=571:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=581:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=591:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=601:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=611:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=621:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=631:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=641:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=651:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=661:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=671:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=681:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=691:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=701:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=711:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=721:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=731:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=741:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=751:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=761:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=771:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=781:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=791:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=801:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=811:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=821:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=831:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=841:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=851:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=861:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=871:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=881:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=891:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=901:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=911:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=921:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=931:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=941:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=951:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=961:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=971:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=981:U+0072:[rvrn_subst=0+1825]
+../fonts/d23d76ea0909c14972796937ba072b5a40c1e257.ttf:--variations=FVTT=991:U+0072:[rvrn_subst=0+1825]
diff --git a/test/shaping/data/in-house/tests/vertical.tests b/test/shaping/data/in-house/tests/vertical.tests
new file mode 100644 (file)
index 0000000..17df28e
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/191826b9643e3f124d865d617ae609db6a2ce203.ttf:--direction=t --font-funcs=ft:U+300C:[uni300C.vert=0@-512,-578+0,-1024]
+../fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf:--direction=t --font-funcs=ft:U+0041,U+0042:[gid1=0@-654,-2128+0,-2789|gid2=1@-665,-2125+0,-2789]
+../fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf:--direction=t --font-funcs=ot:U+0041,U+0042:[gid1=0@-654,-2189+0,-2789|gid2=1@-665,-2189+0,-2789]
diff --git a/test/shaping/data/in-house/tests/zero-width-marks.tests b/test/shaping/data/in-house/tests/zero-width-marks.tests
new file mode 100644 (file)
index 0000000..1a3474a
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/bb9473d2403488714043bcfb946c9f78b86ad627.ttf::U+1030:[circledash=0+636|u1030.med=0@-162,0+0]
+../fonts/8454d22037f892e76614e1645d066689a0200e61.ttf::U+05E0,U+05B8,U+0591,U+05DA,U+05B0:[uni05DA05B0=3+991|uni2009=0+200|uni0591=0@75,0+0|uni05B8=0@495,0+0|uni05E0=0+683]
+../fonts/45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0@20,0+0|gid1=2+1264]
+../fonts/7a37dc4d5bf018456aea291cee06daf004c0221c.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0@20,0+1000|gid1=2+1264]
+../fonts/8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0+0|gid1=2+1264]
+../fonts/bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0+0|gid1=2+1264]
+../fonts/ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0@-1029,340+0|gid3=2+1083|gid6=2@-992,0+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+0|gid5=8+528|gid6=8@-693,0+0|gid2=10+528|gid2=11+528]
+../fonts/cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0@-1029,340+1200|gid3=2+1083|gid6=2@-992,0+1200|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+1200|gid5=8+528|gid6=8@-693,0+1200|gid2=10+528|gid2=11+528]
+../fonts/fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0+0|gid3=2+1083|gid6=2+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6+0|gid5=8+528|gid6=8+0|gid2=10+528|gid2=11+528]
+../fonts/56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0@-1029,340+0|gid3=2+1083|gid6=2@-992,0+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+0|gid5=8+528|gid6=8@-693,0+0|gid2=10+528|gid2=11+528]
+../fonts/a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf::U+0041,U+0042,U+0041:[A=0+1368|B=1+0|A=2+1368]
diff --git a/test/shaping/data/text-rendering-tests/COPYING b/test/shaping/data/text-rendering-tests/COPYING
new file mode 100644 (file)
index 0000000..7758b2e
--- /dev/null
@@ -0,0 +1,13 @@
+Copyright 2016 Unicode Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the “License”);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an “AS IS” BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/test/shaping/data/text-rendering-tests/Makefile.am b/test/shaping/data/text-rendering-tests/Makefile.am
new file mode 100644 (file)
index 0000000..cad0358
--- /dev/null
@@ -0,0 +1,26 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+update:
+       (cd $(srcdir) && ./update.sh)
+
+EXTRA_DIST = \
+       README \
+       COPYING \
+       update.sh \
+       extract-tests.py \
+       fonts \
+       $(TESTS) \
+       $(NULL)
+
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+
+include Makefile.sources
+
+-include $(top_srcdir)/git.mk
diff --git a/test/shaping/data/text-rendering-tests/Makefile.in b/test/shaping/data/text-rendering-tests/Makefile.in
new file mode 100644 (file)
index 0000000..8e95f3f
--- /dev/null
@@ -0,0 +1,939 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = tests/AVAR-1.tests tests/CFF-1.tests tests/CFF2-1.tests \
+       tests/CFF-2.tests tests/CMAP-1.tests tests/CMAP-2.tests \
+       tests/CVAR-1.tests tests/CVAR-2.tests tests/GLYF-1.tests \
+       tests/GPOS-1.tests tests/GPOS-2.tests tests/GPOS-3.tests \
+       tests/GPOS-4.tests tests/GPOS-5.tests tests/GSUB-1.tests \
+       tests/GSUB-2.tests tests/GVAR-1.tests tests/GVAR-2.tests \
+       tests/GVAR-3.tests tests/GVAR-4.tests tests/GVAR-5.tests \
+       tests/GVAR-6.tests tests/GVAR-7.tests tests/GVAR-8.tests \
+       tests/GVAR-9.tests tests/HVAR-1.tests tests/HVAR-2.tests \
+       tests/KERN-1.tests tests/KERN-2.tests tests/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_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red='\e[0;31m'; \
+    grn='\e[0;32m'; \
+    lgn='\e[1;32m'; \
+    blu='\e[1;34m'; \
+    mgn='\e[0;35m'; \
+    brg='\e[1m'; \
+    std='\e[m'; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[    ]*:recheck:[    ]*
+am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
+am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+           recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[       ]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);                                     \
+$(am__vpath_adj_setup) $(am__vpath_adj)                        \
+$(am__tty_colors);                                     \
+srcdir=$(srcdir); export srcdir;                       \
+case "$@" in                                           \
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
+    *) am__odir=.;;                                    \
+esac;                                                  \
+test "x$$am__odir" = x"." || test -d "$$am__odir"      \
+  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
+if test -f "./$$f"; then dir=./;                       \
+elif test -f "$$f"; then dir=;                         \
+else dir="$(srcdir)/"; fi;                             \
+tst=$$dir$$f; log='$@';                                \
+if test -n '$(DISABLE_HARD_ERRORS)'; then              \
+  am__enable_hard_errors=no;                           \
+else                                                   \
+  am__enable_hard_errors=yes;                          \
+fi;                                                    \
+case " $(XFAIL_TESTS) " in                             \
+  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
+    am__expect_failure=yes;;                           \
+  *)                                                   \
+    am__expect_failure=no;;                            \
+esac;                                                  \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+am__EXEEXT_1 =
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.tests.log=.log)
+TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
+       $(TESTS_LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+       $(top_srcdir)/test-driver COPYING README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_CONFIG = @ICU_CONFIG@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+EXTRA_DIST = \
+       README \
+       COPYING \
+       update.sh \
+       extract-tests.py \
+       fonts \
+       $(TESTS) \
+       $(NULL)
+
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+DISBALED_TESTS = \
+       tests/CMAP-3.tests \
+       tests/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-25.tests \
+       tests/MORX-26.tests \
+       tests/MORX-2.tests \
+       tests/MORX-3.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/SHARAN-1.tests \
+       tests/SHBALI-1.tests \
+       tests/SHBALI-2.tests \
+       tests/SHKNDA-2.tests \
+       tests/SHKNDA-3.tests \
+       $(NULL)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/data/text-rendering-tests/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits test/shaping/data/text-rendering-tests/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+       rm -f $< $@
+       $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+       @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+       @$(am__set_TESTS_bases); \
+       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+       redo_bases=`for i in $$bases; do \
+                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+                   done`; \
+       if test -n "$$redo_bases"; then \
+         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+         if $(am__make_dryrun); then :; else \
+           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+         fi; \
+       fi; \
+       if test -n "$$am__remaking_logs"; then \
+         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+              "recursion detected" >&2; \
+       elif test -n "$$redo_logs"; then \
+         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+       fi; \
+       if $(am__make_dryrun); then :; else \
+         st=0;  \
+         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+         for i in $$redo_bases; do \
+           test -f $$i.trs && test -r $$i.trs \
+             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+           test -f $$i.log && test -r $$i.log \
+             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+         done; \
+         test $$st -eq 0 || exit 1; \
+       fi
+       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+       ws='[   ]'; \
+       results=`for b in $$bases; do echo $$b.trs; done`; \
+       test -n "$$results" || results=/dev/null; \
+       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+         success=true; \
+       else \
+         success=false; \
+       fi; \
+       br='==================='; br=$$br$$br$$br$$br; \
+       result_count () \
+       { \
+           if test x"$$1" = x"--maybe-color"; then \
+             maybe_colorize=yes; \
+           elif test x"$$1" = x"--no-color"; then \
+             maybe_colorize=no; \
+           else \
+             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+           fi; \
+           shift; \
+           desc=$$1 count=$$2; \
+           if test $$maybe_colorize = yes && test $$count -gt 0; then \
+             color_start=$$3 color_end=$$std; \
+           else \
+             color_start= color_end=; \
+           fi; \
+           echo "$${color_start}# $$desc $$count$${color_end}"; \
+       }; \
+       create_testsuite_report () \
+       { \
+         result_count $$1 "TOTAL:" $$all   "$$brg"; \
+         result_count $$1 "PASS: " $$pass  "$$grn"; \
+         result_count $$1 "SKIP: " $$skip  "$$blu"; \
+         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+         result_count $$1 "FAIL: " $$fail  "$$red"; \
+         result_count $$1 "XPASS:" $$xpass "$$red"; \
+         result_count $$1 "ERROR:" $$error "$$mgn"; \
+       }; \
+       {                                                               \
+         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
+           $(am__rst_title);                                           \
+         create_testsuite_report --no-color;                           \
+         echo;                                                         \
+         echo ".. contents:: :depth: 2";                               \
+         echo;                                                         \
+         for b in $$bases; do echo $$b; done                           \
+           | $(am__create_global_log);                                 \
+       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
+       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
+       if $$success; then                                              \
+         col="$$grn";                                                  \
+        else                                                           \
+         col="$$red";                                                  \
+         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
+       fi;                                                             \
+       echo "$${col}$$br$${std}";                                      \
+       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
+       echo "$${col}$$br$${std}";                                      \
+       create_testsuite_report --maybe-color;                          \
+       echo "$$col$$br$$std";                                          \
+       if $$success; then :; else                                      \
+         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
+         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
+           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+         fi;                                                           \
+         echo "$$col$$br$$std";                                        \
+       fi;                                                             \
+       $$success || exit 1
+
+check-TESTS:
+       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+       exit $$?;
+recheck: all 
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       bases=`for i in $$bases; do echo $$i; done \
+                | $(am__list_recheck_tests)` || exit 1; \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       log_list=`echo $$log_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+               am__force_recheck=am--force-recheck \
+               TEST_LOGS="$$log_list"; \
+       exit $$?
+.tests.log:
+       @p='$<'; \
+       $(am__set_b); \
+       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
+@am__EXEEXT_TRUE@      @p='$<'; \
+@am__EXEEXT_TRUE@      $(am__set_b); \
+@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean clean-generic \
+       clean-libtool cscopelist-am ctags-am distclean \
+       distclean-generic distclean-libtool distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
+       uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+update:
+       (cd $(srcdir) && ./update.sh)
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/shaping/data/text-rendering-tests/Makefile.sources b/test/shaping/data/text-rendering-tests/Makefile.sources
new file mode 100644 (file)
index 0000000..f77c1bc
--- /dev/null
@@ -0,0 +1,66 @@
+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/CVAR-1.tests \
+       tests/CVAR-2.tests \
+       tests/GLYF-1.tests \
+       tests/GPOS-1.tests \
+       tests/GPOS-2.tests \
+       tests/GPOS-3.tests \
+       tests/GPOS-4.tests \
+       tests/GPOS-5.tests \
+       tests/GSUB-1.tests \
+       tests/GSUB-2.tests \
+       tests/GVAR-1.tests \
+       tests/GVAR-2.tests \
+       tests/GVAR-3.tests \
+       tests/GVAR-4.tests \
+       tests/GVAR-5.tests \
+       tests/GVAR-6.tests \
+       tests/GVAR-7.tests \
+       tests/GVAR-8.tests \
+       tests/GVAR-9.tests \
+       tests/HVAR-1.tests \
+       tests/HVAR-2.tests \
+       tests/KERN-1.tests \
+       tests/KERN-2.tests \
+       tests/SHBALI-3.tests \
+       tests/SHKNDA-1.tests \
+       $(NULL)
+
+DISBALED_TESTS = \
+       tests/CMAP-3.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-25.tests \
+       tests/MORX-26.tests \
+       tests/MORX-2.tests \
+       tests/MORX-3.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/SHARAN-1.tests \
+       tests/SHBALI-1.tests \
+       tests/SHBALI-2.tests \
+       tests/SHKNDA-2.tests \
+       tests/SHKNDA-3.tests \
+       $(NULL)
diff --git a/test/shaping/data/text-rendering-tests/README b/test/shaping/data/text-rendering-tests/README
new file mode 100644 (file)
index 0000000..c46d3ff
--- /dev/null
@@ -0,0 +1,7 @@
+Tests in this directory are automatically imported from the
+text-rendering-tests repository owned by Unicode Consortium:
+
+  https://github.com/unicode-org/text-rendering-tests
+
+To import the latest version of that test suite just run
+"make update" from a build in a git checkout.
diff --git a/test/shaping/data/text-rendering-tests/extract-tests.py b/test/shaping/data/text-rendering-tests/extract-tests.py
new file mode 100755 (executable)
index 0000000..8e5909f
--- /dev/null
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+
+from __future__ import print_function
+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'))
+       vars = 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 vars:
+               opts = opts + ' --variations=%s' % vars
+       print ("../fonts/%s:%s:%s:%s" % (font, opts, unistr(text), glyphstr(glyphs)))
+
+sys.exit(0 if found else 1)
diff --git a/test/shaping/data/text-rendering-tests/fonts/AdobeVFPrototype-Subset.otf b/test/shaping/data/text-rendering-tests/fonts/AdobeVFPrototype-Subset.otf
new file mode 100644 (file)
index 0000000..5cc7279
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/AdobeVFPrototype-Subset.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/FDArrayTest257.otf b/test/shaping/data/text-rendering-tests/fonts/FDArrayTest257.otf
new file mode 100644 (file)
index 0000000..a97b1f4
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/FDArrayTest257.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/FDArrayTest65535.otf b/test/shaping/data/text-rendering-tests/fonts/FDArrayTest65535.otf
new file mode 100644 (file)
index 0000000..835beb2
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/FDArrayTest65535.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/NotoSansBalinese-Regular.ttf b/test/shaping/data/text-rendering-tests/fonts/NotoSansBalinese-Regular.ttf
new file mode 100644 (file)
index 0000000..0b0f58f
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/NotoSansBalinese-Regular.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/NotoSansKannada-Regular.ttf b/test/shaping/data/text-rendering-tests/fonts/NotoSansKannada-Regular.ttf
new file mode 100644 (file)
index 0000000..7366f37
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/NotoSansKannada-Regular.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/NotoSerifKannada-Regular.ttf b/test/shaping/data/text-rendering-tests/fonts/NotoSerifKannada-Regular.ttf
new file mode 100644 (file)
index 0000000..30ca550
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/NotoSerifKannada-Regular.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/Selawik-README.md b/test/shaping/data/text-rendering-tests/fonts/Selawik-README.md
new file mode 100644 (file)
index 0000000..9c5a80f
--- /dev/null
@@ -0,0 +1,60 @@
+# Overview
+This version of Selawik is a test case and demonstration of OpenType 1.8 Font Variations technology and tables. It also includes some handy debugging characters.
+
+This version of Selawik is intended for testing only, and is not recommended for shipping in applications, etc. For that, it is better to use the main branch of [Selawik](https://github.com/Microsoft/Selawik).
+
+# Features
+
+* Full TrueType hinting with VTT source tables included. See [Hinting](#hinting) for details.
+* All tables required for OpenType 1.8 are present (see [Table Status](#table-status), below). This includes cvar (varied CVTs), GPOS/GDEF (kerning varies), and avar (coordinate space warping to match Segoe UI).
+
+       Note: This version of Selawik does not include an MVAR because its vertical metrics do not change anywhere in the design space, thus there is no need for MVAR. A future release will contain an axis that varies vertical metrics as an excuse to have an MVAR.
+
+* Numerous interesting debugging glyphs (requires liga to be enabled). For example, \axis1 will show the current normalized wght coordinate. See [Debugging Glyphs](#debugging-glyphs) for details.
+* 1 axis: weight
+
+## Table status
+The following tables are currently supported:
+
+- [x] fvar
+- [x] gvar
+- [x] cvar
+- [x] avar (to match Segoe UI weights and metrics)
+- [x] STAT
+- [x] GPOS/GDEF - kerning
+- [x] HVAR
+
+Not yet complete: 
+
+- [ ] GSUB/GDEF - to change dollar signs in the bold
+- [ ] MVAR (future release)
+
+## To do
+* Add a second axis that varies vertical metrics so we need an MVAR table. This axis will not be one of the standard axes listed in the [OpenType 1.8 specification] (https://www.microsoft.com/typography/otspec/fvar.htm), so that it becomes an example of out to do a foundry-defined axis.
+* Add Feature Variations (GPOS/GDEF) to switch dollar sign glyphs across weights.
+
+
+# Debugging glyphs
+Thanks to Greg Hitchcock's TrueType coding wizardry, this font includes many glyphs that are helpful for debugging implementations of variable fonts. It has a number of substitutions implemented as liga features:
+
+Feature | Description
+-------- | ----------
+\axis1 | Shows the normalized coordinate on the wght axis for the currently selected instance (e.g. 1.0 for bold, -1.0 for light, or something in between).
+\axis2 | Shows 0 because this font doesn't yet have a second axis.
+\axis1hex | Same as \axis1 but in hex.
+\axis2hex | Same as \axis2 but in hex.
+\pointsize | Shows the point size passed to the TrueType rasterizer. Note that depending on how the application calls the rasterizer, this may not be what you expect - e.g. on Safari on MacOS, this is always 1024.
+\ppem | Shows the pixels per em passed to the TrueType rastersize. Note that depending on how the application calls the rasterizer, this may not be what you expect - e.g. on Safari on MacOS, this is always 1024.
+\ttversion | Shows the version of the TrueType rasterizer.
+\ttmode | Shows the current TrueType rasterizer mode flags.
+\boldtest | A glyph to help you detect artificial emboldening. The glyph has a vertical bar and a circle. The vertical bar's weight varies with the weight of the rest of the font: it gets bolder at bolder weights, lighter at lighter weights. The circle changes weight (and size) in opposition to the rest of the font: lighter at bold weights and vice versa. Thus, if you use this character and see both the circle and bar look bold, you're not looking at a true bold instance, but an algorithmically emboldened one.
+\family | Shows the family name of the font.
+\version | Shows the version of this font
+
+
+
+
+# Hinting
+This version of Selawik is primarily hinted with the light Latin hinting style Microsoft recommends for variable Latin fonts. The VTT Light Latin autohinter was used to create the first round of hints, which were then reviewed and touched up. 
+
+This hinting style only uses CVTs for vertical metrics anchors (ascender, descender, cap height, x-height, and baseline). While this makes for an easy job hinting a Latin font, it makes for a poor test case because Selawik doesn't vary vertical metrics with weight, thus doesn't vary CVTs, thus doesn't need a cvar. So, to make it more interesting, we added CVT-based stem hints to the lowercase only. This provided the need to vary CVTs and thus require a cvar. Note that this was only done for testing purposes. For variable fonts, Microsoft recommends the light hinting style using the `ResYDist()` command instead of a CVT-based stem hint. 
diff --git a/test/shaping/data/text-rendering-tests/fonts/Selawik-variable.ttf b/test/shaping/data/text-rendering-tests/fonts/Selawik-variable.ttf
new file mode 100644 (file)
index 0000000..ff347e0
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/Selawik-variable.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestAVAR.ttf b/test/shaping/data/text-rendering-tests/fonts/TestAVAR.ttf
new file mode 100644 (file)
index 0000000..5df9867
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestAVAR.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestCMAP14.otf b/test/shaping/data/text-rendering-tests/fonts/TestCMAP14.otf
new file mode 100644 (file)
index 0000000..da485d9
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestCMAP14.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestCMAPMacTurkish.ttf b/test/shaping/data/text-rendering-tests/fonts/TestCMAPMacTurkish.ttf
new file mode 100644 (file)
index 0000000..4f89b09
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestCMAPMacTurkish.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestCVARGVAROne.ttf b/test/shaping/data/text-rendering-tests/fonts/TestCVARGVAROne.ttf
new file mode 100644 (file)
index 0000000..84cd1ea
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestCVARGVAROne.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestCVARGVARTwo.ttf b/test/shaping/data/text-rendering-tests/fonts/TestCVARGVARTwo.ttf
new file mode 100644 (file)
index 0000000..f20918a
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestCVARGVARTwo.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGLYFOne.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGLYFOne.ttf
new file mode 100644 (file)
index 0000000..8f634d9
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGLYFOne.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGPOSFour.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGPOSFour.ttf
new file mode 100644 (file)
index 0000000..bd929b5
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGPOSFour.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGPOSOne.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGPOSOne.ttf
new file mode 100644 (file)
index 0000000..ea74dd0
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGPOSOne.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGPOSThree.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGPOSThree.ttf
new file mode 100644 (file)
index 0000000..158a77a
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGPOSThree.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGPOSTwo.otf b/test/shaping/data/text-rendering-tests/fonts/TestGPOSTwo.otf
new file mode 100644 (file)
index 0000000..76d04eb
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGPOSTwo.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGSUBOne.otf b/test/shaping/data/text-rendering-tests/fonts/TestGSUBOne.otf
new file mode 100644 (file)
index 0000000..9be638f
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGSUBOne.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGVAREight.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGVAREight.ttf
new file mode 100644 (file)
index 0000000..271dc4b
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGVAREight.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGVARFour.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGVARFour.ttf
new file mode 100644 (file)
index 0000000..3524f37
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGVARFour.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGVARNine.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGVARNine.ttf
new file mode 100644 (file)
index 0000000..0ecd326
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGVARNine.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGVAROne.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGVAROne.ttf
new file mode 100644 (file)
index 0000000..e155d8f
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGVAROne.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGVARThree.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGVARThree.ttf
new file mode 100644 (file)
index 0000000..ac2d7eb
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGVARThree.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGVARTwo.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGVARTwo.ttf
new file mode 100644 (file)
index 0000000..bd144c6
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestGVARTwo.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestHVAROne.otf b/test/shaping/data/text-rendering-tests/fonts/TestHVAROne.otf
new file mode 100644 (file)
index 0000000..a87395c
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestHVAROne.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestHVARTwo.ttf b/test/shaping/data/text-rendering-tests/fonts/TestHVARTwo.ttf
new file mode 100644 (file)
index 0000000..2e81f94
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestHVARTwo.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestKERNOne.otf b/test/shaping/data/text-rendering-tests/fonts/TestKERNOne.otf
new file mode 100644 (file)
index 0000000..35369d1
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestKERNOne.otf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf
new file mode 100644 (file)
index 0000000..9255e99
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXEighteen.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXEighteen.ttf
new file mode 100644 (file)
index 0000000..91c364f
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXEighteen.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf
new file mode 100644 (file)
index 0000000..92b889c
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXFour.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXFour.ttf
new file mode 100644 (file)
index 0000000..0028972
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXFour.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf
new file mode 100644 (file)
index 0000000..31c30c0
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf
new file mode 100644 (file)
index 0000000..4371df4
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXOne.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXOne.ttf
new file mode 100644 (file)
index 0000000..88b8dec
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXOne.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXSeventeen.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXSeventeen.ttf
new file mode 100644 (file)
index 0000000..9dd3a84
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXSeventeen.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXSixteen.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXSixteen.ttf
new file mode 100644 (file)
index 0000000..e34e1fe
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXSixteen.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf
new file mode 100644 (file)
index 0000000..5827ec5
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf
new file mode 100644 (file)
index 0000000..f3c6f0f
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThree.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThree.ttf
new file mode 100644 (file)
index 0000000..56984f2
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThree.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwelve.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwelve.ttf
new file mode 100644 (file)
index 0000000..b1e4bc4
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwelve.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwenty.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwenty.ttf
new file mode 100644 (file)
index 0000000..769e29b
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwenty.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfive.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfive.ttf
new file mode 100644 (file)
index 0000000..e3fadf5
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfive.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyone.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyone.ttf
new file mode 100644 (file)
index 0000000..4101680
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyone.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentysix.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentysix.ttf
new file mode 100644 (file)
index 0000000..603b1c6
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentysix.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentythree.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentythree.ttf
new file mode 100644 (file)
index 0000000..df34912
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentythree.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentytwo.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentytwo.ttf
new file mode 100644 (file)
index 0000000..4459e8a
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentytwo.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwo.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwo.ttf
new file mode 100644 (file)
index 0000000..39f2db5
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwo.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestShapeAran.ttf b/test/shaping/data/text-rendering-tests/fonts/TestShapeAran.ttf
new file mode 100644 (file)
index 0000000..c73f569
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestShapeAran.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestShapeEthi.ttf b/test/shaping/data/text-rendering-tests/fonts/TestShapeEthi.ttf
new file mode 100644 (file)
index 0000000..391dddd
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestShapeEthi.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/Zycon.ttf b/test/shaping/data/text-rendering-tests/fonts/Zycon.ttf
new file mode 100644 (file)
index 0000000..3a6761b
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/Zycon.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/tests/AVAR-1.tests b/test/shaping/data/text-rendering-tests/tests/AVAR-1.tests
new file mode 100644 (file)
index 0000000..19223eb
--- /dev/null
@@ -0,0 +1,17 @@
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=100:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=150:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=200:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=250:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=300:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=350:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=400:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=450:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=500:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=550:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=600:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=650:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=700:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=750:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=800:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=850:U+2A01:[gid1]
+../fonts/TestAVAR.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=900:U+2A01:[gid1]
diff --git a/test/shaping/data/text-rendering-tests/tests/CFF-1.tests b/test/shaping/data/text-rendering-tests/tests/CFF-1.tests
new file mode 100644 (file)
index 0000000..6788253
--- /dev/null
@@ -0,0 +1,13 @@
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[gid66]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+211D:[gid30]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+24EA:[gid235]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2460:[gid97]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2461:[gid98]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+4EFF:[gid256]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+FF21:[gid34]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+10133:[gid52]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1D4D0:[gid209]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F33A:[gid59]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F33B:[gid60]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F4A7:[gid168]
+../fonts/FDArrayTest257.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F95D:[gid94]
diff --git a/test/shaping/data/text-rendering-tests/tests/CFF-2.tests b/test/shaping/data/text-rendering-tests/tests/CFF-2.tests
new file mode 100644 (file)
index 0000000..6f190a8
--- /dev/null
@@ -0,0 +1,13 @@
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[gid66]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+211D:[gid8478]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+24EA:[gid9451]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2460:[gid9313]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2461:[gid9314]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+4EFF:[gid20224]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+FF21:[gid65314]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+10133:[gid308]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1D4D0:[gid54481]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F33A:[gid62267]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F33B:[gid62268]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F4A7:[gid62632]
+../fonts/FDArrayTest65535.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1F95D:[gid63838]
diff --git a/test/shaping/data/text-rendering-tests/tests/CFF2-1.tests b/test/shaping/data/text-rendering-tests/tests/CFF2-1.tests
new file mode 100644 (file)
index 0000000..84cb14d
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=100:U+0024:[dollar]
+../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200:U+0024:[dollar]
+../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+0024:[dollar]
+../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+0024:[dollar]
+../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500:U+0024:[dollar]
+../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+0024:[dollar]
+../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700:U+0024:[dollar]
+../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=800:U+0024:[dollar.nostroke]
+../fonts/AdobeVFPrototype-Subset.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=900:U+0024:[dollar.nostroke]
diff --git a/test/shaping/data/text-rendering-tests/tests/CMAP-1.tests b/test/shaping/data/text-rendering-tests/tests/CMAP-1.tests
new file mode 100644 (file)
index 0000000..337b9f8
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+82A6:[uni82A6_uE0100]
+../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+82A6,U+E0100:[uni82A6_uE0100]
+../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+82A6,U+E0101:[uni82A6_uE0101]
+../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+82A6,U+E0102:[uni82A6_uE0100]
diff --git a/test/shaping/data/text-rendering-tests/tests/CMAP-2.tests b/test/shaping/data/text-rendering-tests/tests/CMAP-2.tests
new file mode 100644 (file)
index 0000000..861f2e4
--- /dev/null
@@ -0,0 +1,2 @@
+../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2269:[uni2269]
+../fonts/TestCMAP14.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+2269,U+FE00:[uni2269FE00]
diff --git a/test/shaping/data/text-rendering-tests/tests/CVAR-1.tests b/test/shaping/data/text-rendering-tests/tests/CVAR-1.tests
new file mode 100644 (file)
index 0000000..c874a14
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/TestCVARGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=28,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@595,0|uni006E@1126,0]
+../fonts/TestCVARGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=94,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@635,0|uni006E@1212,0]
+../fonts/TestCVARGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=194,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@691,0|uni006E@1331,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/CVAR-2.tests b/test/shaping/data/text-rendering-tests/tests/CVAR-2.tests
new file mode 100644 (file)
index 0000000..6bd42e1
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/TestCVARGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=28,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@595,0|uni006E@1126,0]
+../fonts/TestCVARGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=94,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@635,0|uni006E@1212,0]
+../fonts/TestCVARGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=194,wdth=100,opsz=72:U+0068,U+006F,U+006E:[uni0068|uni006F@691,0|uni006E@1331,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GLYF-1.tests b/test/shaping/data/text-rendering-tests/tests/GLYF-1.tests
new file mode 100644 (file)
index 0000000..bdc0346
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestGLYFOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0123:[gcommaabove]
diff --git a/test/shaping/data/text-rendering-tests/tests/GPOS-1.tests b/test/shaping/data/text-rendering-tests/tests/GPOS-1.tests
new file mode 100644 (file)
index 0000000..221d16b
--- /dev/null
@@ -0,0 +1,19 @@
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0104,U+004A:[Aogonek|J@732,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0104,U+0067:[Aogonek|g@692,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0104,U+0123:[Aogonek|gcommaabove@692,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0104,U+006A:[Aogonek|j@752,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0104,U+0237:[Aogonek|dotlessj@752,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0051,U+0237:[Q|dotlessj@734,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0105,U+006A:[aogonek|j@588,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0105,U+0237:[aogonek|dotlessj@588,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0067,U+0237:[g|dotlessj@563,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0123,U+0237:[gcommaabove|dotlessj@563,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0131,U+0237:[dotlessi|dotlessj@334,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0173,U+0237:[uogonek|dotlessj@656,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0076,U+0237:[v|dotlessj@587,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+0061:[V|a@594,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+00E1:[V|aacute@594,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+0105:[V|aogonek@594,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+0066:[V|f@634,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+FB02:[V|fl@634,0]
+../fonts/TestGPOSOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0056,U+002E:[V|period@504,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GPOS-2.tests b/test/shaping/data/text-rendering-tests/tests/GPOS-2.tests
new file mode 100644 (file)
index 0000000..03fcc36
--- /dev/null
@@ -0,0 +1,3 @@
+../fonts/TestGPOSTwo.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+25EF:[uni25EF]
+../fonts/TestGPOSTwo.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+263C:[sun]
+../fonts/TestGPOSTwo.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+25EF,U+263C:[uni25EF|sun]
diff --git a/test/shaping/data/text-rendering-tests/tests/GPOS-3.tests b/test/shaping/data/text-rendering-tests/tests/GPOS-3.tests
new file mode 100644 (file)
index 0000000..32aeb6e
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1208:[uni1208]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1208,U+135E:[uni1208|uni135E@303,0]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1208,U+135F:[uni1208|uni135F@303,0]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1208,U+135D:[uni1208|uni135D@303,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GPOS-4.tests b/test/shaping/data/text-rendering-tests/tests/GPOS-4.tests
new file mode 100644 (file)
index 0000000..fd77542
--- /dev/null
@@ -0,0 +1,4 @@
+../fonts/TestGPOSThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0075,U+0308,U+0301:[u|uni0308@529,-31|acutecomb@537,138]
+../fonts/TestGPOSThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0075,U+0308,U+0304:[u|uni0308@529,-31|uni0304@526,138]
+../fonts/TestGPOSThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0075,U+0308,U+0308:[u|uni0308@529,-31|uni0308@529,138]
+../fonts/TestGPOSThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0075,U+0308,U+0308,U+0308:[u|uni0308@529,-31|uni0308@529,138|uni0308@529,307]
diff --git a/test/shaping/data/text-rendering-tests/tests/GPOS-5.tests b/test/shaping/data/text-rendering-tests/tests/GPOS-5.tests
new file mode 100644 (file)
index 0000000..2d7ce14
--- /dev/null
@@ -0,0 +1,5 @@
+../fonts/TestGPOSFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=100:U+0634,U+0652:[uni0652@663,144|uni0634]
+../fonts/TestGPOSFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+0634,U+0652:[uni0652@680,165|uni0634]
+../fonts/TestGPOSFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+0634,U+0652:[uni0652@730,246|uni0634]
+../fonts/TestGPOSFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700:U+0634,U+0652:[uni0652@750,282|uni0634]
+../fonts/TestGPOSFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=900:U+0634,U+0652:[uni0652@784,351|uni0634]
diff --git a/test/shaping/data/text-rendering-tests/tests/GSUB-1.tests b/test/shaping/data/text-rendering-tests/tests/GSUB-1.tests
new file mode 100644 (file)
index 0000000..e33a6f1
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestGSUBOne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0061,U+0020,U+0061:[a.alt|space@500,0|a@1000,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GSUB-2.tests b/test/shaping/data/text-rendering-tests/tests/GSUB-2.tests
new file mode 100644 (file)
index 0000000..34c8deb
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1373:[uni1373]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+136B:[uni136B]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1375:[uni1375]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+136D:[uni136D]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1373,U+136B:[uni1373.init|uni136B.fina@621,0]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1375,U+136D:[uni1375.init|uni136D.fina@662,0]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+137B:[uni137B]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1373,U+136B,U+137B:[uni1373.init|uni136B.medi@621,0|uni137B.fina@1102,0]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1373,U+136B,U+137B,U+1373,U+136B:[uni1373.init|uni136B.medi@621,0|uni137B.medi@1102,0|uni1373.medi@1489,0|uni136B.fina@2110,0]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1373,U+136B,U+137B,U+1375,U+136D:[uni1373.init|uni136B.medi@621,0|uni137B.medi@1102,0|uni1375.medi@1489,0|uni136D.fina@2157,0]
+../fonts/TestShapeEthi.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1375,U+136D,U+137B,U+1373,U+136B:[uni1375.init|uni136D.medi@662,0|uni137B.medi@1203,0|uni1373.medi@1590,0|uni136B.fina@2211,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-1.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-1.tests
new file mode 100644 (file)
index 0000000..fc00a4e
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+5F4C:[gid2]
+../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350:U+5F4C:[gid2]
+../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+5F4C:[gid2]
+../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450:U+5F4C:[gid2]
+../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500:U+5F4C:[gid2]
+../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=550:U+5F4C:[gid2]
+../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+5F4C:[gid2]
+../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=650:U+5F4C:[gid2]
+../fonts/TestGVAROne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700:U+5F4C:[gid2]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-2.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-2.tests
new file mode 100644 (file)
index 0000000..10e22e4
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+5F4C:[gid2]
+../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350:U+5F4C:[gid2]
+../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+5F4C:[gid2]
+../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450:U+5F4C:[gid2]
+../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500:U+5F4C:[gid2]
+../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=550:U+5F4C:[gid2]
+../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+5F4C:[gid2]
+../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=650:U+5F4C:[gid2]
+../fonts/TestGVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700:U+5F4C:[gid2]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-3.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-3.tests
new file mode 100644 (file)
index 0000000..c3b8049
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+5F4C:[gid2]
+../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350:U+5F4C:[gid2]
+../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+5F4C:[gid2]
+../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450:U+5F4C:[gid2]
+../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=500:U+5F4C:[gid2]
+../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=550:U+5F4C:[gid2]
+../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+5F4C:[gid2]
+../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=650:U+5F4C:[gid2]
+../fonts/TestGVARThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=700:U+5F4C:[gid2]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-4.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-4.tests
new file mode 100644 (file)
index 0000000..1c0964d
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-1.0,T1=0.0:U+1F98E:[gid5]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.8,T1=0.1:U+1F98E:[gid5]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.6,T1=0.2:U+1F98E:[gid5]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.4,T1=0.3:U+1F98E:[gid5]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.2,T1=0.4:U+1F98E:[gid5]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.0,T1=0.5:U+1F98E:[gid5]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.2,T1=0.6:U+1F98E:[gid5]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.4,T1=0.7:U+1F98E:[gid5]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.6,T1=0.8:U+1F98E:[gid5]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.8,T1=0.9:U+1F98E:[gid5]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=1.0,T1=1.0:U+1F98E:[gid5]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-5.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-5.tests
new file mode 100644 (file)
index 0000000..b2ff710
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-1.0:U+1F31D:[gid15]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.8:U+1F31D:[gid15]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.6:U+1F31D:[gid15]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.4:U+1F31D:[gid15]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=-0.2:U+1F31D:[gid15]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.0:U+1F31D:[gid15]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.2:U+1F31D:[gid15]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.4:U+1F31D:[gid15]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.6:U+1F31D:[gid15]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=0.8:U+1F31D:[gid15]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=M1=1.0:U+1F31D:[gid15]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-6.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-6.tests
new file mode 100644 (file)
index 0000000..f96292b
--- /dev/null
@@ -0,0 +1,11 @@
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.0:U+1F422:[gid12]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.1:U+1F422:[gid12]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.2:U+1F422:[gid12]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.3:U+1F422:[gid12]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.4:U+1F422:[gid12]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.5:U+1F422:[gid12]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.6:U+1F422:[gid12]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.7:U+1F422:[gid12]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.8:U+1F422:[gid12]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=0.9:U+1F422:[gid12]
+../fonts/Zycon.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=T1=1.0:U+1F422:[gid12]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-7.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-7.tests
new file mode 100644 (file)
index 0000000..594da3b
--- /dev/null
@@ -0,0 +1,7 @@
+../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=150:U+004F,U+0049,U+004F:[uni004F|uni0049@706,0|uni004F@1072,0]
+../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200:U+004F,U+0049,U+004F:[uni004F|uni0049@707,0|uni004F@1074,0]
+../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=250:U+004F,U+0049,U+004F:[uni004F|uni0049@707,0|uni004F@1075,0]
+../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=300:U+004F,U+0049,U+004F:[uni004F|uni0049@707,0|uni004F@1076,0]
+../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=350:U+004F,U+0049,U+004F:[uni004F|uni0049@707,0|uni004F@1077,0]
+../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+004F,U+0049,U+004F:[uni004F|uni0049@707,0|uni004F@1078,0]
+../fonts/TestGVARFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=450:U+004F,U+0049,U+004F:[uni004F|uni0049@706,0|uni004F@1079,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-8.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-8.tests
new file mode 100644 (file)
index 0000000..e5c8209
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=0.0:U+0048:[H]
+../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.2:U+0048:[H]
+../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.4:U+0048:[H]
+../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.6:U+0048:[H]
+../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-0.8:U+0048:[H]
+../fonts/TestGVAREight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=HV=-1.0:U+0048:[H]
diff --git a/test/shaping/data/text-rendering-tests/tests/GVAR-9.tests b/test/shaping/data/text-rendering-tests/tests/GVAR-9.tests
new file mode 100644 (file)
index 0000000..19e2ed8
--- /dev/null
@@ -0,0 +1,10 @@
+../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=-1.0:U+0041:[A]
+../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=-0.5:U+0041:[A]
+../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.0:U+0041:[A]
+../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.5:U+0041:[A]
+../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.6:U+0041:[A]
+../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.7:U+0041:[A]
+../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.8:U+0041:[A]
+../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.9:U+0041:[A]
+../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=0.944444:U+0041:[A]
+../fonts/TestGVARNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=TEST=1.0:U+0041:[A]
diff --git a/test/shaping/data/text-rendering-tests/tests/HVAR-1.tests b/test/shaping/data/text-rendering-tests/tests/HVAR-1.tests
new file mode 100644 (file)
index 0000000..189d9f0
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=0:U+0041,U+0042,U+0043:[A|B@520,0|C@1094,0]
+../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200:U+0041,U+0042,U+0043:[A|B@533,0|C@1115,0]
+../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+0041,U+0042,U+0043:[A|B@546,0|C@1135,0]
+../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+0041,U+0042,U+0043:[A|B@558,0|C@1155,0]
+../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=800:U+0041,U+0042,U+0043:[A|B@571,0|C@1175,0]
+../fonts/TestHVAROne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=1000:U+0041,U+0042,U+0043:[A|B@584,0|C@1196,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/HVAR-2.tests b/test/shaping/data/text-rendering-tests/tests/HVAR-2.tests
new file mode 100644 (file)
index 0000000..db93be9
--- /dev/null
@@ -0,0 +1,6 @@
+../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=0:U+0041,U+0042:[uni0041|uni0042@450,0]
+../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=200:U+0041,U+0042:[uni0041|uni0042@515,0]
+../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=400:U+0041,U+0042:[uni0041|uni0042@584,0]
+../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=600:U+0041,U+0042:[uni0041|uni0042@673,0]
+../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=800:U+0041,U+0042:[uni0041|uni0042@761,0]
+../fonts/TestHVARTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft --variations=wght=1000:U+0041,U+0042:[uni0041|uni0042@850,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/KERN-1.tests b/test/shaping/data/text-rendering-tests/tests/KERN-1.tests
new file mode 100644 (file)
index 0000000..f0c0214
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestKERNOne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0131,U+0054,U+0075,U+0054,U+0075,U+0054,U+0131:[dotlessi|T|u@400,0|T@600,0|u@1000,0|T@1200,0|dotlessi@1600,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/KERN-2.tests b/test/shaping/data/text-rendering-tests/tests/KERN-2.tests
new file mode 100644 (file)
index 0000000..fdffa4a
--- /dev/null
@@ -0,0 +1 @@
+../fonts/TestKERNOne.otf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0075,U+0131,U+0131,U+0054,U+0131,U+0131,U+0054,U+0131,U+0131,U+0075:[u|dotlessi@400,0|dotlessi@1100,0|T@1100,0|dotlessi@1500,0|dotlessi@2200,0|T@2200,0|dotlessi@2600,0|dotlessi@3300,0|u@3500,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/SHBALI-3.tests b/test/shaping/data/text-rendering-tests/tests/SHBALI-3.tests
new file mode 100644 (file)
index 0000000..a0f3a32
--- /dev/null
@@ -0,0 +1,9 @@
+../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B6B:[gid102|gid107@560,-10]
+../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B6C:[gid102|gid108@573,49]
+../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B6D:[gid102|gid109@652,-10]
+../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B6E:[gid102|gid110@652,-98]
+../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B6F:[gid102|gid111@667,-10]
+../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B70:[gid102|gid112@667,-10]
+../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B71:[gid102|gid113@667,-10]
+../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B72:[gid102|gid114@667,-10]
+../fonts/NotoSansBalinese-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+1B66,U+1B73:[gid102|gid115@599,-10]
diff --git a/test/shaping/data/text-rendering-tests/tests/SHKNDA-1.tests b/test/shaping/data/text-rendering-tests/tests/SHKNDA-1.tests
new file mode 100644 (file)
index 0000000..adb5aa7
--- /dev/null
@@ -0,0 +1,34 @@
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB2,U+0CCD,U+0CB2,U+0CBF:[knLI|knLAc2@757,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C9F,U+0CCD,U+0CB8,U+0CCD:[knTT|knSAc2@1021,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB3,U+0CBF:[knLLI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA1,U+0CBF:[knDDI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAE,U+0CC6:[knME]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB0,U+0CBF:[knRI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C96,U+0CCD,U+0CAF,U+0CC6:[knKHE|knYAc2@846,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAB,U+0CCD,U+0CB0,U+0CBF:[knPHI|knRAc2@735,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA8,U+0CC6:[knNE]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C97,U+0CBF:[knGI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB7,U+0CCD,U+0C9F,U+0CBF:[knSSI|knTTAc2@746,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAF,U+0CBF,U+0C82:[knYI|knAnusvara@1252,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C9A,U+0CC0:[knCI|knLengthmark@766,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA8,U+0CBF:[knNI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C97,U+0CCD,U+0CB2,U+0CBF:[knGI|knLAc2@621,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB7,U+0CBF:[knSSI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C97,U+0CC6:[knGE]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA6,U+0CCD,U+0CB5,U+0CBF:[knDI|knVAc2@740,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA4,U+0CC0:[knTI|knLengthmark@613,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAE,U+0CBF:[knMI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB2,U+0CBF:[knLI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C97,U+0CBF:[knGI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA8,U+0CCD:[knN]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAC,U+0CBF:[knBI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB2,U+0CBF:[knLI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA8,U+0CCD,U+0CA8,U+0CBF,U+0C82:[knNI|knNAc2@678,0|knAnusvara@755,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB2,U+0CCD,U+0CB2,U+0CBF:[knLI|knLAc2@757,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA7,U+0CBF:[knDHI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CAA,U+0CCC:[knPA.base|knmAU@739,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CB5,U+0CBF,U+0C82:[knVI|knAnusvara@749,0]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA1,U+0CBF:[knDDI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0C9F,U+0CBF:[knTTI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA8,U+0CBF:[knNI]
+../fonts/NotoSerifKannada-Regular.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0CA7,U+0CBF:[knDHI]
diff --git a/test/shaping/data/text-rendering-tests/update.sh b/test/shaping/data/text-rendering-tests/update.sh
new file mode 100755 (executable)
index 0000000..47545bc
--- /dev/null
@@ -0,0 +1,46 @@
+#!/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"
diff --git a/test/shaping/fonts/sha1sum/6466d38c62e73a39202435a4f73bf5d6acbb73c0.ttf b/test/shaping/fonts/sha1sum/6466d38c62e73a39202435a4f73bf5d6acbb73c0.ttf
deleted file mode 100644 (file)
index 33c4229..0000000
Binary files a/test/shaping/fonts/sha1sum/6466d38c62e73a39202435a4f73bf5d6acbb73c0.ttf and /dev/null differ
diff --git a/test/shaping/fonts/sha1sum/7ef276fc886ea502a03b9b0e5c8b547d5dc2b61c.ttf b/test/shaping/fonts/sha1sum/7ef276fc886ea502a03b9b0e5c8b547d5dc2b61c.ttf
deleted file mode 100644 (file)
index fb4534a..0000000
Binary files a/test/shaping/fonts/sha1sum/7ef276fc886ea502a03b9b0e5c8b547d5dc2b61c.ttf and /dev/null differ
diff --git a/test/shaping/hb-diff-ngrams b/test/shaping/hb-diff-ngrams
deleted file mode 100755 (executable)
index c02f541..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env python
-
-from hb_test_tools import *
-
-UtilMains.process_multiple_files (DiffSinks.print_ngrams)
diff --git a/test/shaping/hb-manifest-read b/test/shaping/hb-manifest-read
deleted file mode 100755 (executable)
index b1b36ba..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env python
-
-from hb_test_tools import *
-
-UtilMains.process_multiple_args (FilterHelpers.filter_printer_function (Manifest.read), mnemonic="DIR")
diff --git a/test/shaping/hb-manifest-update b/test/shaping/hb-manifest-update
deleted file mode 100755 (executable)
index eeb84b8..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env python
-
-from hb_test_tools import *
-
-UtilMains.process_multiple_args (Manifest.update_recursive, mnemonic="DIR")
index 052974d..f7e5943 100644 (file)
@@ -7,6 +7,9 @@ from itertools import *
 diff_symbols = "-+=*&^%$#@!~/"
 diff_colors = ['red', 'green', 'blue']
 
 diff_symbols = "-+=*&^%$#@!~/"
 diff_colors = ['red', 'green', 'blue']
 
+def codepoints(s):
+       return (ord (u) for u in s)
+
 try:
        unichr = unichr
 
 try:
        unichr = unichr
 
@@ -43,6 +46,28 @@ try:
                                except UnicodeDecodeError:
                                        raise ValueError('unichr() arg not in range(0x110000)')
 
                                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 0xFFFC
+                               else:
+                                       if high_surrogate:
+                                               yield 0xFFFC
+                                               high_surrogate = None
+                                       if 0xD800 <= cp <= 0xDBFF:
+                                               high_surrogate = cp
+                                       else:
+                                               yield cp
+                                               high_surrogate = None
+                       if high_surrogate:
+                               yield 0xFFFC
+
 except NameError:
        unichr = chr
 
 except NameError:
        unichr = chr
 
@@ -268,32 +293,6 @@ class DiffSinks:
                total = passed + failed
                print ("%d out of %d tests passed.  %d failed (%g%%)" % (passed, total, failed, 100. * failed / total))
 
                total = passed + failed
                print ("%d out of %d tests passed.  %d failed (%g%%)" % (passed, total, failed, 100. * failed / total))
 
-       @staticmethod
-       def print_ngrams (f, ns=(1,2,3)):
-               gens = tuple (Ngram.generator (n) for n in ns)
-               allstats = Stats ()
-               allgrams = {}
-               for key, lines in DiffHelpers.separate_test_cases (f):
-                       test = Test (lines)
-                       allstats.add (test)
-
-                       for gen in gens:
-                               for ngram in gen (test.unicodes):
-                                       if ngram not in allgrams:
-                                               allgrams[ngram] = Stats ()
-                                       allgrams[ngram].add (test)
-
-               importantgrams = {}
-               for ngram, stats in allgrams.iteritems ():
-                       if stats.failed.count >= 30: # for statistical reasons
-                               importantgrams[ngram] = stats
-               allgrams = importantgrams
-               del importantgrams
-
-               for ngram, stats in allgrams.iteritems ():
-                       print ("zscore: %9f failed: %6d passed: %6d ngram: <%s>" % (stats.zscore (allstats), stats.failed.count, stats.passed.count, ','.join ("U+%04X" % u for u in ngram)))
-
-
 
 class Test:
 
 
 class Test:
 
@@ -456,12 +455,12 @@ class Unicode:
 
        @staticmethod
        def decode (s):
 
        @staticmethod
        def decode (s):
-               return u','.join ("U+%04X" % ord (u) for u in tounicode (s, 'utf-8'))
+               return u','.join ("U+%04X" % cp for cp in codepoints (tounicode (s, 'utf-8')))
 
        @staticmethod
        def parse (s):
                s = re.sub (r"0[xX]", " ", s)
 
        @staticmethod
        def parse (s):
                s = re.sub (r"0[xX]", " ", s)
-               s = re.sub (r"[<+>{},;&#\\xXuUnNiI\n    ]", " ", s)
+               s = re.sub (r"[<+>{},;&#\\xXuUnNiI\n\t]", " ", s)
                return [int (x, 16) for x in s.split ()]
 
        @staticmethod
                return [int (x, 16) for x in s.split ()]
 
        @staticmethod
index cf17c54..f31d30b 100755 (executable)
@@ -1,7 +1,12 @@
 #!/bin/bash
 
 #!/bin/bash
 
-dir=`mktemp --directory`
+dir=`mktemp -d`
 
 
+out=/dev/stdout
+if test "x${1:0:3}" == 'x-o='; then
+       out=${1:3}
+       shift
+fi
 hb_shape=$1
 shift
 fontfile=$1
 hb_shape=$1
 shift
 fontfile=$1
@@ -11,7 +16,7 @@ if test "x${fontfile:0:1}" == 'x-'; then
 fi
 shift
 if ! echo "$hb_shape" | grep -q 'hb-shape'; then
 fi
 shift
 if ! echo "$hb_shape" | grep -q 'hb-shape'; then
-       echo "Specify hb-shape (not hb-view, etc)." >&2
+       echo "Specify hb-shape (not hb-view, etc): got "$hb_shape"." >&2
        exit 1
 fi
 options=
        exit 1
 fi
 options=
@@ -41,12 +46,15 @@ if test $? != 0; then
        echo "hb-shape failed." >&2
        exit 2
 fi
        echo "hb-shape failed." >&2
        exit 2
 fi
+glyph_names=`echo "$text" | $hb_shape $options --no-clusters --no-positions "$fontfile" | sed 's/[][]//g; s/|/,/g'`
 
 cp "$fontfile" "$dir/font.ttf"
 
 cp "$fontfile" "$dir/font.ttf"
-pyftsubset \
+fonttools subset \
        --glyph-names \
        --no-hinting \
        --glyph-names \
        --no-hinting \
+       --layout-features='*' \
        "$dir/font.ttf" \
        "$dir/font.ttf" \
+       --glyphs="$glyph_names" \
        --text="$text"
 if ! test -s "$dir/font.subset.ttf"; then
        echo "Subsetter didn't produce nonempty subset font in $dir/font.subset.ttf" >&2
        --text="$text"
 if ! test -s "$dir/font.subset.ttf"; then
        echo "Subsetter didn't produce nonempty subset font in $dir/font.subset.ttf" >&2
@@ -64,8 +72,8 @@ if ! test "x$glyphs" = "x$glyphs_subset"; then
        echo "$text" | $hb_view $options "$dir/font.subset.ttf" --output-format=png --output-file="$dir/subset.png"
        if ! cmp "$dir/orig.png" "$dir/subset.png"; then
                echo "Images differ.  Please inspect $dir/*.png." >&2
        echo "$text" | $hb_view $options "$dir/font.subset.ttf" --output-format=png --output-file="$dir/subset.png"
        if ! cmp "$dir/orig.png" "$dir/subset.png"; then
                echo "Images differ.  Please inspect $dir/*.png." >&2
-               echo "$glyphs"
-               echo "$glyphs_subset"
+               echo "$glyphs" >> "$out"
+               echo "$glyphs_subset" >> "$out"
                exit 2
        fi
        echo "Yep; all good." >&2
                exit 2
        fi
        echo "Yep; all good." >&2
@@ -75,7 +83,7 @@ if ! test "x$glyphs" = "x$glyphs_subset"; then
 fi
 
 sha1sum=`sha1sum "$dir/font.subset.ttf" | cut -d' ' -f1`
 fi
 
 sha1sum=`sha1sum "$dir/font.subset.ttf" | cut -d' ' -f1`
-subset="fonts/sha1sum/$sha1sum.ttf"
+subset="data/in-house/fonts/$sha1sum.ttf"
 mv "$dir/font.subset.ttf" "$subset"
 
 # There ought to be an easier way to do this, but it escapes me...
 mv "$dir/font.subset.ttf" "$subset"
 
 # There ought to be an easier way to do this, but it escapes me...
@@ -86,8 +94,12 @@ echo "$glyphs" > "$glyphs_file"
 # Open the "file"s
 exec 3<"$unicodes_file"
 exec 4<"$glyphs_file"
 # Open the "file"s
 exec 3<"$unicodes_file"
 exec 4<"$glyphs_file"
+relative_subset="$subset"
+if test "$out" != "/dev/stdout"; then
+       relative_subset="$(/usr/bin/python -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
 while read uline <&3 && read gline <&4; do
-       echo "$subset:$options:$uline:$gline"
+       echo "$relative_subset:$options:$uline:$gline" >> "$out"
 done
 
 
 done
 
 
diff --git a/test/shaping/run-tests.py b/test/shaping/run-tests.py
new file mode 100755 (executable)
index 0000000..c65e714
--- /dev/null
@@ -0,0 +1,98 @@
+#!/usr/bin/env python
+
+from __future__ import print_function
+import sys, os, subprocess
+
+
+def cmd(command):
+       p = subprocess.Popen (
+               command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+       p.wait ()
+       print (p.stderr.read (), end="") # file=sys.stderr
+       return p.stdout.read ().decode ("utf-8").strip (), p.returncode
+
+
+args = sys.argv[1:]
+if not args or sys.argv[1].find('hb-shape') == -1 or not os.path.exists (sys.argv[1]):
+       print ("""First argument does not seem to point to usable hb-shape.""")
+       sys.exit (1)
+hb_shape, args = args[0], args[1:]
+
+extra_options = "--verify"
+
+fails = 0
+
+reference = False
+if len (args) and args[0] == "--reference":
+       reference = True
+       args = args[1:]
+
+if not len (args):
+       args = ['-']
+
+for filename in args:
+       if not reference:
+               if filename == '-':
+                       print ("Running tests from standard input")
+               else:
+                       print ("Running tests in " + filename)
+
+       if filename == '-':
+               f = sys.stdin
+       else:
+               f = open (filename)
+
+       for line in f:
+               fontfile, options, unicodes, glyphs_expected = line.split (":")
+               cwd = os.path.dirname(filename)
+               fontfile = os.path.normpath (os.path.join (cwd, fontfile))
+
+               if line.startswith ("#"):
+                       if not reference:
+                               print ("# %s %s --unicodes %s" % (hb_shape, fontfile, unicodes))
+                       continue
+
+               if not reference:
+                       print ("%s %s %s %s --unicodes %s" %
+                                        (hb_shape, fontfile, extra_options, options, unicodes))
+
+               glyphs1, returncode = cmd ([hb_shape, "--font-funcs=ft",
+                       fontfile, extra_options, "--unicodes",
+                       unicodes] + (options.split (' ') if options else []))
+
+               if returncode:
+                       print ("hb-shape --font-funcs=ft failed.") # file=sys.stderr
+                       fails = fails + 1
+                       #continue
+
+               glyphs2, returncode = cmd ([hb_shape, "--font-funcs=ot",
+                       fontfile, extra_options, "--unicodes",
+                       unicodes] + (options.split (' ') if options else []))
+
+               if returncode:
+                       print ("ERROR: hb-shape --font-funcs=ot failed.") # file=sys.stderr
+                       fails = fails + 1
+                       #continue
+
+               if glyphs1 != glyphs2:
+                       print ("FT funcs: " + glyphs1) # file=sys.stderr
+                       print ("OT funcs: " + glyphs2) # file=sys.stderr
+                       fails = fails + 1
+
+               if reference:
+                       print (":".join ([fontfile, options, unicodes, glyphs1]))
+                       continue
+
+               if glyphs1.strip() != glyphs_expected.strip():
+                       print ("Actual:   " + glyphs1) # file=sys.stderr
+                       print ("Expected: " + glyphs_expected) # file=sys.stderr
+                       fails = fails + 1
+
+if fails != 0:
+       if not reference:
+               print (str (fails) + " tests failed.") # file=sys.stderr
+       sys.exit (1)
+
+else:
+       if not reference:
+               print ("All tests passed.")
diff --git a/test/shaping/run-tests.sh b/test/shaping/run-tests.sh
deleted file mode 100755 (executable)
index 021c6f8..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/sh
-
-test "x$srcdir" = x && srcdir=.
-test "x$builddir" = x && builddir=.
-test "x$top_builddir" = x && top_builddir=../..
-
-hb_shape=$top_builddir/util/hb-shape$EXEEXT
-
-fails=0
-
-reference=false
-if test "x$1" = x--reference; then
-       reference=true
-       shift
-fi
-
-if test $# = 0; then
-       set /dev/stdin
-fi
-
-for f in "$@"; do
-       $reference || echo "Running tests in $f"
-       while IFS=: read fontfile options unicodes glyphs_expected; do
-               if echo "$fontfile" | grep -q '^#'; then
-                       $reference || echo "Skipping $fontfile:$unicodes"
-                       continue
-               fi
-               $reference || echo "Testing $fontfile:$unicodes"
-               glyphs=`$srcdir/hb-unicode-encode "$unicodes" | $hb_shape $options "$srcdir/$fontfile"`
-               if test $? != 0; then
-                       echo "hb-shape failed." >&2
-                       fails=$((fails+1))
-                       continue
-               fi
-               if $reference; then
-                       echo "$fontfile:$options:$unicodes:$glyphs"
-                       continue
-               fi
-               if ! test "x$glyphs" = "x$glyphs_expected"; then
-                       echo "Actual:   $glyphs" >&2
-                       echo "Expected: $glyphs_expected" >&2
-                       fails=$((fails+1))
-               fi
-       done < "$f"
-done
-
-if test $fails != 0; then
-       $reference || echo "$fails tests failed."
-       exit 1
-else
-       $reference || echo "All tests passed."
-fi
diff --git a/test/shaping/tests/arabic-fallback-shaping.tests b/test/shaping/tests/arabic-fallback-shaping.tests
deleted file mode 100644 (file)
index 6f1cb8b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-fonts/sha1sum/df768b9c257e0c9c35786c47cae15c46571d56be.ttf::U+0633,U+064F,U+0644,U+064E,U+0651,U+0627,U+0651,U+0650,U+0645,U+062A,U+06CC:[uni06CC.fina=10+1655|uni062A.medi=9+868|uni0645.init=8+1098|uni0650=2@221,0+0|uni0651=2@260,736+0|uni064E=2@935,1259+0|uni0651=2@974,736+0|uni06440627.fina=2+1470|uni064F=0@558,-10+0|uni0633.init=0+1585]
diff --git a/test/shaping/tests/arabic-feature-order.tests b/test/shaping/tests/arabic-feature-order.tests
deleted file mode 100644 (file)
index e60ab1a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-fonts/sha1sum/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf::U+1820,U+180B:[uni2048.E81A=0+1550]
-fonts/sha1sum/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf::U+1820,U+180B:[uni2048.E81A=0+1550]
-fonts/sha1sum/a919b33197965846f21074b24e30250d67277bce.ttf::U+0644,U+0644,U+0647:[Lellah=0+1503]
diff --git a/test/shaping/tests/arabic-like-joining.tests b/test/shaping/tests/arabic-like-joining.tests
deleted file mode 100644 (file)
index ec994d0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-fonts/sha1sum/5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf::U+1E922,U+1E923,U+1E924,U+1E925,U+1E926,U+1E927,U+1E928,U+1E929,U+1E92A,U+1E92B,U+1E92C,U+1E92D,U+1E92E,U+1E92F,U+1E930,U+1E931,U+1E932,U+1E933,U+1E934,U+1E935,U+1E936,U+1E937,U+1E938,U+1E939,U+1E93A,U+1E93B,U+1E93C,U+1E93D,U+1E93E,U+1E93F,U+1E940,U+1E941,U+1E942,U+1E943:[sha_adlam.fina=33+711|kpo_adlam.medi=32+573|zal_adlam.medi=31+773|gbe_adlam.medi=30+594|kha_adlam.medi=29+686|va_adlam.medi=28+621|nha_adlam.medi=27+587|tu_adlam.medi=26+772|nya_adlam.medi=25+577|ga_adlam.medi=24+552|qaaf_adlam.medi=23+694|ha_adlam.medi=22+600|chi_adlam.medi=21+662|jiim_adlam.medi=20+781|u_adlam.medi=19+678|ya_adlam.medi=18+553|kaf_adlam.medi=17+808|nun_adlam.medi=16+561|waw_adlam.medi=15+651|yhe_adlam.medi=14+674|dha_adlam.medi=13+674|o_adlam.medi=12+640|i_adlam.medi=11+657|fa_adlam.medi=10+590|e_adlam.medi=9+628|ra_adlam.medi=8+599|bhe_adlam.medi=7+594|pe_adlam.medi=6+492|sinnyiiyhe_adlam.medi=5+777|ba_adlam.medi=4+655|miim_adlam.medi=3+525|laam_adlam.medi=2+554|daali_adlam.medi=1+600|alif_adlam.init=0+597]
diff --git a/test/shaping/tests/automatic-fractions.tests b/test/shaping/tests/automatic-fractions.tests
deleted file mode 100644 (file)
index f9510e2..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-fonts/sha1sum/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf::U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036:[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600]
-fonts/sha1sum/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf:--direction=l --script=arab:U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036:[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600]
-fonts/sha1sum/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf:--direction=l:U+0661,U+0662,U+0663,U+2044,U+0664,U+0665,U+0666:[uni0661.numr=0+600|uni0662.numr=1+600|uni0663.numr=2+600|fraction=3+252|uni0664.small=4+600|uni0665.small=5+600|uni0666.small=6+600]
diff --git a/test/shaping/tests/cluster.tests b/test/shaping/tests/cluster.tests
deleted file mode 100644 (file)
index 24f04dd..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-fonts/sha1sum/6466d38c62e73a39202435a4f73bf5d6acbb73c0.ttf:--cluster-level=2:U+0078,U+030A,U+0058,U+030A:[gid2=0+1083|gid4=1@-555,-8+0|gid1=2+1200|gid4=3@-614,349+0]
-fonts/sha1sum/43ef465752be9af900745f72fe29cb853a1401a5.ttf:--cluster-level=1:U+05D4,U+05B7,U+05E9,U+05BC,U+05C1,U+05B8,U+05DE,U+05B4,U+05DD:[uni05DD=8+1359|uni05B4=7@111,0+0|uni05DE=6+1391|uni05B8=5+0|uni05BC=3+0|uni05C1=3+0|uni05E9=2+1451|uni05B7=1@28,0+0|uni05D4=0+1338]
diff --git a/test/shaping/tests/color-fonts.tests b/test/shaping/tests/color-fonts.tests
deleted file mode 100644 (file)
index 397796a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-fonts/sha1sum/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf:--font-funcs=ot --show-extents:U+1F42F:[gid1=0+2963<0,2178,2963,-2788>]
diff --git a/test/shaping/tests/context-matching.tests b/test/shaping/tests/context-matching.tests
deleted file mode 100644 (file)
index e20616e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-fonts/sha1sum/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
-fonts/sha1sum/d629e7fedc0b350222d7987345fe61613fa3929a.ttf::U+0915,U+093F,U+0915,U+093F:[ivowelsign03deva=0+530|kadeva=0+1561|ivowelsign03deva=2+530|kadeva=2+1561]
-fonts/sha1sum/f499fbc23865022234775c43503bba2e63978fe1.ttf::U+09B0,U+09CD,U+09A5,U+09CD,U+09AF,U+09C0:[gid1=0+1320|gid13=0+523|gid18=0+545]
diff --git a/test/shaping/tests/cursive-positioning.tests b/test/shaping/tests/cursive-positioning.tests
deleted file mode 100644 (file)
index ce63bd1..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-fonts/sha1sum/c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf::U+0643,U+0645,U+0645,U+062B,U+0644:[gid8=4+738|gid5=3@441,1197+0|gid6=3@0,432+405|gid9=2@0,477+452|gid9=1@0,977+452|gid10=0@20,1577+207]
-fonts/sha1sum/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf::U+0643,U+0645,U+0645,U+062B,U+0644:[gid8=4+738|gid5=3@441,1197+0|gid6=3@0,432+405|gid9=2@0,477+500|gid9=1@0,577+452|gid10=0@20,1177+207]
-#fonts/sha1sum/706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf::U+0B1F,U+0B4D,U+0B1A,U+0B4D,U+0B1A:[ttaorya=0+1307|casubscriptorya=0@-242,104+-231|casubscriptnarroworya=0@20,104+507]
-fonts/sha1sum/07f054357ff8638bac3711b422a1e31180bba863.ttf:--font-funcs=ot --no-glyph-names:U+0606,U+06E1:[2=0@40,502+0|1=0+1000]
diff --git a/test/shaping/tests/default-ignorables.tests b/test/shaping/tests/default-ignorables.tests
deleted file mode 100644 (file)
index 2d3ce97..0000000
+++ /dev/null
@@ -1 +0,0 @@
-fonts/sha1sum/051d92f8bc6ff724511b296c27623f824de256e9.ttf::U+0075,U+0361,U+034F,U+0301,U+0069:[gid2=0+1266|gid7=0@-617,442+0|gid5=0@-7,0+0|gid1=4+528]
diff --git a/test/shaping/tests/fallback-positioning.tests b/test/shaping/tests/fallback-positioning.tests
deleted file mode 100644 (file)
index 499db7d..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-fonts/sha1sum/7ef276fc886ea502a03b9b0e5c8b547d5dc2b61c.ttf:--font-funcs=ft:U+0078,U+0301,U+0058,U+0301:[x=0+1030|acutecomb=0@-45,-32+0|X=2+1295|acutecomb=2@-171,310+0]
-fonts/sha1sum/7ef276fc886ea502a03b9b0e5c8b547d5dc2b61c.ttf:--font-funcs=ot:U+0078,U+0301,U+0058,U+0301:[gid2=0+1030|gid4=0@-21,-27+0|gid1=2+1295|gid4=2@-147,321+0]
diff --git a/test/shaping/tests/fuzzed.tests b/test/shaping/tests/fuzzed.tests
deleted file mode 100644 (file)
index 1f51e44..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-fonts/sha1sum/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-fonts/sha1sum/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-fonts/sha1sum/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-fonts/sha1sum/641bd9db850193064d17575053ae2bf8ec149ddc.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-fonts/sha1sum/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf:--font-funcs=ot:U+0041:[gid0=0+4352]
-fonts/sha1sum/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf:--font-funcs=ot:U+0041:[gid0=0+1024]
-fonts/sha1sum/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf:--font-funcs=ot:U+0041:[gid0=0+1000|gid1=0+1000|gid8=0+1000|gid3=0+1000|gid0=0+1000|gid1=0+1000|gid1=0+1000|gid8=0+1000|gid3=0+1000|gid0=0+1000|gid1=0+1000|gid8=0+1000|gid3=0+1000|gid0=0+1000|gid1=0+1000|gid1=0+1000]
-fonts/sha1sum/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-fonts/sha1sum/3511ff5c1647150595846ac414c595cccac34f18.ttf:--font-funcs=ot:U+0041:[gid0=0+1000|gid512=0+1000|gid15104=0+1000|gid11004=0+1000|gid3408=0+1000|gid18244=0+1000|gid17872=0+1000|gid17961=0+1000|gid0=0+1000|gid992=0+1000|gid15616=0+1000|gid0=0+1000|gid14151=0+1000|gid20559=0+1000|gid20992=0+1000|gid5440=0+1000|gid256=0+1000|gid0=0+1000|gid10=0+1000|gid8960=0+1000|gid256=0+1000|gid1024=0+1000|gid1490=0+1000|gid0=0+1000|gid768=0+1000|gid4096=0+1000|gid256=0+1000|gid2216=0+1000|gid0=0+1000|gid256=0+1000|gid256=0+1000|gid0=0+1000|gid768=0+1000|gid10752=0+1000|gid11004=0+1000|gid3408=0+1000|gid18244=0+1000|gid17734=0+1000|gid53248=0+1000|gid256=0+1000|gid0=0+1000|gid512=0+1000|gid14848=0+1000|gid10793=0+1000|gid57344=0+1000|gid768=0+1000|gid18227=0+1000|gid20285=0+1000|gid20480=0+1000|gid0=0+1000|gid256=0+1000|gid0=0+1000|gid810=0+1000|gid0=0+1000|gid11004=0+1000|gid3408=0+1000|gid18244=0+1000|gid17734=0+1000|gid53289=0+1000|gid57344=0+1000|gid768=0+1000|gid15667=0+1000|gid71=0+1000|gid0=0+1000|gid20559=0+1000|gid21248=0+1000|gid256=0+1000|gid0=0+1000|gid2816=0+1000|gid2776=0+1000|gid0=0+1000|gid51516=0+1000|gid0=0+1000|gid32=0+1000|gid26209=0+1000|gid28005=0+1000|gid65249=0+1000|gid29690=0+1000|gid0=0+1000|gid51548=0+1000|gid0=0+1000|gid2454=0+1000|gid28783=0+1000|gid29556=0+1000|gid1291=0+1000|gid3458=0+1000|gid80=0+1000|gid0=0+1000|gid2804=0+1000|gid210=0+1000|gid28786=0+1000|gid25968=0+1000|gid45763=0+1000|gid50546=0+1000|gid0=0+1000|gid59136=0+1000|gid0=0+1000|gid38144=0+1000|gid256=0+1000|gid0=0+1000|gid2560=0+1000|gid30208=0+1000|gid52224=0+1000|gid580=0+1000|gid17996=0+1000|gid21504=0+1000|gid6734=0+1000|gid108=0+1000|gid116=0+1000|gid24846=0+1000|gid1024=0+1000|gid0=0+1000|gid255=0+1000|gid65280=0+1000|gid256=0+1000|gid0=0+1000|gid8704=0+1000|gid1345=0+1000|gid23109=0+1000|gid8192=0+1000|gid10823=0+1000|gid21076=0+1000|gid8192=0+1000|gid12877=0+1000|gid20300=0+1000|gid8192=0+1000|gid6738=0+1000|gid20301=0+1000|gid8192=0+1000|gid16980=0+1000|gid21067=0+1000|gid8251=0+1000|gid18944=0+1000|gid255=0+1000|gid65280=0+1000|gid15360=0+1000|gid256=0+1000|gid255=0+1000|gid65280=0+1000|gid256=0+1000|gid768=0+1000|gid255=0+1000|gid65280=0+1000|gid256=0+1000|gid768=0+1000|gid255=0+1000|gid65280=0+1000|gid256=0+1000|gid1024=0+1000|gid12=0+1000|gid65280=0+1000|gid256=0+1000|gid1280=0+1000|gid255=0+1000|gid65280=0+1000|gid256=0+1000|gid1536=0+1000|gid1899=0+1000|gid25970=0+1000|gid110=0+1000|gid11264=0+1000|gid27502=0+1000|gid29285=0+1000|gid12907=0+1000|gid25974=0+1000|gid28160=0+1000|gid14443=0+1000|gid25970=0+1000|gid28288=0+1000|gid3=0+1000|gid118=0+1000|gid18259=0+1000|gid21826=0+1000|gid45716=0+1000|gid46369=0+1000|gid0=0+1000|gid0=0+1000|gid1=0+1000|gid16=0+1000|gid17=0+1000|gid256=0+1000|gid4=0+1000|gid16=0+1000|gid18244=0+1000|gid17734=0+1000|gid28=0+1000|gid12=0+1000|gid0=0+1000|gid284=0+1000|gid0=0+1000|gid28=0+1000|gid18256=0+1000|gid20307=0+1000|gid45114=0+1000|gid47616=0+1000|gid226=0+1000|gid10296=0+1000|gid0=0+1000|gid57927=0+1000|gid1=0+1000|gid0=0+1000|gid0=0+1000|gid21248=0+1000|gid5440=0+1000|gid256=0+1000|gid0=0+1000|gid10=0+1000|gid768=0+1000|gid256=0+1000|gid1024=0+1000|gid512=0+1000|gid0=0+1000|gid297=0+1000|gid16=0+1000|gid24833=0+1000|gid28774=0+1000|gid10794=0+1000|gid2304=0+1000|gid29=0+1000|gid32=0+1000|gid42=0+1000|gid64515=0+1000|gid42=0+1000|gid42=0+1000|gid64525=0+1000|gid20551=0+1000|gid17477=0+1000|gid18128=0+1000|gid10720=0+1000|gid3=0+1000|gid61=0+1000|gid3408=0+1000|gid18244=0+1000|gid17734=0+1000|gid53289=0+1000|gid57344=0+1000|gid768=0+1000|gid15616=0+1000|gid512=0+1000|gid55=0+1000|gid10576=0+1000|gid20307=0+1000|gid0=0+1000|gid255=0+1000|gid56063=0+1000|gid53504=0+1000|gid42=0+1000|gid42=0+1000|gid64525=0+1000|gid12288=0+1000|gid18176=0+1000|gid80=0+1000|gid20307=0+1000|gid1=0+1000|gid0=0+1000|gid62=0+1000]
-fonts/sha1sum/fab39d60d758cb586db5a504f218442cd1395725.ttf:--font-funcs=ot:U+0041,U+0041:[gid0=0+1000|gid0=1+1000]
-fonts/sha1sum/205edd09bd3d141cc9580f650109556cc28b22cb.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-fonts/sha1sum/217a934cfe15c548b572c203dceb2befdf026462.ttf:--font-funcs=ot:U+0061,U+0061,U+0061:[]
-fonts/sha1sum/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf:--font-funcs=ot:U+FFFD,U+E0100,U+FFFD,U+E0010:[]
-fonts/sha1sum/a34a9191d9376bda419836effeef7e75c1386016.ttf:--font-funcs=ot:U+0041:[]
-fonts/sha1sum/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf:--font-funcs=ot:U+0041:[gid0=0+1229]
-fonts/sha1sum/b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-fonts/sha1sum/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
diff --git a/test/shaping/tests/hangul-jamo.tests b/test/shaping/tests/hangul-jamo.tests
deleted file mode 100644 (file)
index fe9973f..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-fonts/sha1sum/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf::U+115F,U+11A2:[gid3=0+920|gid4=0+0]
-fonts/sha1sum/7e14e7883ed152baa158b80e207b66114c823a8b.ttf::U+11A2:[gid1=0+920]
diff --git a/test/shaping/tests/hyphens.tests b/test/shaping/tests/hyphens.tests
deleted file mode 100644 (file)
index d2cb186..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-fonts/sha1sum/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf::U+2010:[gid1=0+739]
-fonts/sha1sum/1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf::U+2011:[gid1=0+739]
diff --git a/test/shaping/tests/indic-joiner-candrabindu.tests b/test/shaping/tests/indic-joiner-candrabindu.tests
deleted file mode 100644 (file)
index 80ad8ce..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-fonts/sha1sum/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200D,U+0B01:[omorya=0+1450]
-fonts/sha1sum/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200C,U+0B01:[oorya=0+1309|space=0+0|candrabinduorya=0+0]
diff --git a/test/shaping/tests/indic-old-spec.tests b/test/shaping/tests/indic-old-spec.tests
deleted file mode 100644 (file)
index 5410a6a..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-fonts/sha1sum/57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf::U+0C9A,U+0CCD,U+0C9A,U+0CCD:[U0C9A_U0CCD.haln=0+1066|U0C9A_0CCD.blwf=0+0]
-fonts/sha1sum/270b89df543a7e48e206a2d830c0e10e5265c630.ttf::U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D:[glyph201=0+1183|U0D4D=0+0]
diff --git a/test/shaping/tests/indic-pref-blocking.tests b/test/shaping/tests/indic-pref-blocking.tests
deleted file mode 100644 (file)
index 204b92a..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-fonts/sha1sum/226bc2deab3846f1a682085f70c67d0421014144.ttf::U+0D2F,U+0D4D,U+0D30,U+0D46:[evowelsignmlym=0+1465|rapostmlym=0+499|yamlym=0+2120]
-fonts/sha1sum/e207635780b42f898d58654b65098763e340f5c7.ttf::U+0D2F,U+0D4D,U+0D30,U+0D46:[yamlym=0+2120|viramamlym=0+0|evowelsignmlym=0+1465|ramlym=0+1507]
diff --git a/test/shaping/tests/language-tags.tests b/test/shaping/tests/language-tags.tests
deleted file mode 100644 (file)
index 17adafa..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=fa:U+004A:[gid2=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=ja:U+004A:[gid2=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh:U+004A:[gid4=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-cn:U+004A:[gid4=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-sg:U+004A:[gid4=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-tw:U+004A:[gid5=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-hans:U+004A:[gid4=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-hant:U+004A:[gid5=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-hant-hk:U+004A:[gid6=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-HK:U+004A:[gid6=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-mo:U+004A:[gid6=0+1000]
-fonts/sha1sum/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-Hant-mo:U+004A:[gid6=0+1000]
diff --git a/test/shaping/tests/ligature-id.tests b/test/shaping/tests/ligature-id.tests
deleted file mode 100644 (file)
index a1ce2bb..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|space=3+213|u0995_u09B0_u09CD.blwf.vatu=4+643|u0995_u09CD.half_u09B2.pres=7+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|space=6+213|u0995_u09B0_u09CD.blwf.vatu=7+643|u0995_u09CD.half_u09B2.pres=10+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|space=9+213|u0995_u09B0_u09CD.blwf.vatu=10+643|u0995_u09CD.half_u09B2.pres=13+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|space=12+213|u0995_u09B0_u09CD.blwf.vatu=13+643|u0995_u09CD.half_u09B2.pres=16+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|space=15+213|u0995_u09B0_u09CD.blwf.vatu=16+643|u0995_u09CD.half_u09B2.pres=19+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|space=18+213|u0995_u09B0_u09CD.blwf.vatu=19+643|u0995_u09CD.half_u09B2.pres=22+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|space=21+213|u0995_u09B0_u09CD.blwf.vatu=22+643|u0995_u09CD.half_u09B2.pres=25+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|space=24+213|u0995_u09B0_u09CD.blwf.vatu=25+643|u0995_u09CD.half_u09B2.pres=28+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|space=27+213|u0995_u09B0_u09CD.blwf.vatu=28+643|u0995_u09CD.half_u09B2.pres=31+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|space=30+213|u0995_u09B0_u09CD.blwf.vatu=31+643|u0995_u09CD.half_u09B2.pres=34+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|space=33+213|u0995_u09B0_u09CD.blwf.vatu=34+643|u0995_u09CD.half_u09B2.pres=37+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|space=36+213|u0995_u09B0_u09CD.blwf.vatu=37+643|u0995_u09CD.half_u09B2.pres=40+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|space=39+213|u0995_u09B0_u09CD.blwf.vatu=40+643|u0995_u09CD.half_u09B2.pres=43+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|space=42+213|u0995_u09B0_u09CD.blwf.vatu=43+643|u0995_u09CD.half_u09B2.pres=46+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|space=45+213|u0995_u09B0_u09CD.blwf.vatu=46+643|u0995_u09CD.half_u09B2.pres=49+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|space=48+213|u0995_u09B0_u09CD.blwf.vatu=49+643|u0995_u09CD.half_u09B2.pres=52+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|space=51+213|u0995_u09B0_u09CD.blwf.vatu=52+643|u0995_u09CD.half_u09B2.pres=55+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|space=54+213|u0995_u09B0_u09CD.blwf.vatu=55+643|u0995_u09CD.half_u09B2.pres=58+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|space=57+213|u0995_u09B0_u09CD.blwf.vatu=58+643|u0995_u09CD.half_u09B2.pres=61+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|space=60+213|u0995_u09B0_u09CD.blwf.vatu=61+643|u0995_u09CD.half_u09B2.pres=64+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|space=63+213|u0995_u09B0_u09CD.blwf.vatu=64+643|u0995_u09CD.half_u09B2.pres=67+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|space=66+213|u0995_u09B0_u09CD.blwf.vatu=67+643|u0995_u09CD.half_u09B2.pres=70+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|space=69+213|u0995_u09B0_u09CD.blwf.vatu=70+643|u0995_u09CD.half_u09B2.pres=73+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|space=72+213|u0995_u09B0_u09CD.blwf.vatu=73+643|u0995_u09CD.half_u09B2.pres=76+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|space=75+213|u0995_u09B0_u09CD.blwf.vatu=76+643|u0995_u09CD.half_u09B2.pres=79+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|space=78+213|u0995_u09B0_u09CD.blwf.vatu=79+643|u0995_u09CD.half_u09B2.pres=82+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|space=81+213|u0995_u09B0_u09CD.blwf.vatu=82+643|u0995_u09CD.half_u09B2.pres=85+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|space=84+213|u0995_u09B0_u09CD.blwf.vatu=85+643|u0995_u09CD.half_u09B2.pres=88+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|space=87+213|u0995_u09B0_u09CD.blwf.vatu=88+643|u0995_u09CD.half_u09B2.pres=91+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|space=90+213|u0995_u09B0_u09CD.blwf.vatu=91+643|u0995_u09CD.half_u09B2.pres=94+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|space=93+213|u0995_u09B0_u09CD.blwf.vatu=94+643|u0995_u09CD.half_u09B2.pres=97+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|space=96+213|u0995_u09B0_u09CD.blwf.vatu=97+643|u0995_u09CD.half_u09B2.pres=100+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|space=99+213|u0995_u09B0_u09CD.blwf.vatu=100+643|u0995_u09CD.half_u09B2.pres=103+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|u0995_u09CD.half_u0995.pres=99+566|space=102+213|u0995_u09B0_u09CD.blwf.vatu=103+643|u0995_u09CD.half_u09B2.pres=106+602]
-fonts/sha1sum/1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf::U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0995,U+09CD,U+0995,U+0020,U+0995,U+09CD,U+09B0,U+0995,U+09CD,U+09B2:[u0995_u09CD.half_u0995.pres=0+566|u0995_u09CD.half_u0995.pres=3+566|u0995_u09CD.half_u0995.pres=6+566|u0995_u09CD.half_u0995.pres=9+566|u0995_u09CD.half_u0995.pres=12+566|u0995_u09CD.half_u0995.pres=15+566|u0995_u09CD.half_u0995.pres=18+566|u0995_u09CD.half_u0995.pres=21+566|u0995_u09CD.half_u0995.pres=24+566|u0995_u09CD.half_u0995.pres=27+566|u0995_u09CD.half_u0995.pres=30+566|u0995_u09CD.half_u0995.pres=33+566|u0995_u09CD.half_u0995.pres=36+566|u0995_u09CD.half_u0995.pres=39+566|u0995_u09CD.half_u0995.pres=42+566|u0995_u09CD.half_u0995.pres=45+566|u0995_u09CD.half_u0995.pres=48+566|u0995_u09CD.half_u0995.pres=51+566|u0995_u09CD.half_u0995.pres=54+566|u0995_u09CD.half_u0995.pres=57+566|u0995_u09CD.half_u0995.pres=60+566|u0995_u09CD.half_u0995.pres=63+566|u0995_u09CD.half_u0995.pres=66+566|u0995_u09CD.half_u0995.pres=69+566|u0995_u09CD.half_u0995.pres=72+566|u0995_u09CD.half_u0995.pres=75+566|u0995_u09CD.half_u0995.pres=78+566|u0995_u09CD.half_u0995.pres=81+566|u0995_u09CD.half_u0995.pres=84+566|u0995_u09CD.half_u0995.pres=87+566|u0995_u09CD.half_u0995.pres=90+566|u0995_u09CD.half_u0995.pres=93+566|u0995_u09CD.half_u0995.pres=96+566|u0995_u09CD.half_u0995.pres=99+566|u0995_u09CD.half_u0995.pres=102+566|space=105+213|u0995_u09B0_u09CD.blwf.vatu=106+643|u0995_u09CD.half_u09B2.pres=109+602]
diff --git a/test/shaping/tests/mark-filtering-sets.tests b/test/shaping/tests/mark-filtering-sets.tests
deleted file mode 100644 (file)
index 7b5c910..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-fonts/sha1sum/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+062A,U+0629:[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph837=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
-fonts/sha1sum/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+0646,U+0629:[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph836=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
-fonts/sha1sum/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+0626,U+0629:[glyph837=3@299,1170+0|uni06C1.1=3+502|glyph847=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
-fonts/sha1sum/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+062B,U+0629:[glyph837=3@299,1520+0|uni06C1.1=3+502|glyph838=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
-fonts/sha1sum/f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf::U+062A,U+062E,U+0679,U+0629:[glyph837=3@299,1520+0|uni06C1.1=3+502|glyph842=2@149,690+0|uni0628.8=2+532|glyph836=1@-51,1259+0|glyph514=1+196|glyph837=0@655,1751+0|glyph112=0@0,-358+905]
diff --git a/test/shaping/tests/mongolian-variation-selector.tests b/test/shaping/tests/mongolian-variation-selector.tests
deleted file mode 100644 (file)
index 0a2e580..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-fonts/sha1sum/37033cc5cf37bb223d7355153016b6ccece93b28.ttf::U+1826,U+180B,U+1826:[uni1826.E85E_ue.init1=0+599|uni1826.E856_ue.fina=2+750]
-fonts/sha1sum/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf::U+1820,U+180B:[uni1820.E821_a.isol1=0+1199]
-fonts/sha1sum/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf::U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837,U+0020,U+182D,U+182D,U+180B,U+0020,U+182D,U+180C,U+0020,U+182D,U+180D,U+200D,U+0020,U+182D,U+200D,U+182D,U+180B,U+200D,U+0020,U+182D,U+180C,U+200D,U+0020,U+182D,U+180D,U+200D,U+0020,U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D,U+0020,U+200D,U+182D,U+180C,U+200D,U+0020,U+200D,U+182D,U+180D,U+200D,U+0020,U+200D,U+182D,U+200D,U+182D,U+180B,U+0020,U+200D,U+182D,U+180C,U+0020,U+1820,U+200C,U+182D,U+1820,U+1837,U+0020,U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D,U+0020,U+200D,U+182D,U+1824,U+182F,U+1822,U+0020,U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828:[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750|space=11+500|uni182D.E8E2_g.init=12+1000|uni182D.E8E8_g.fina1=13+1250|space=15+500|uni182D.EA1B_g.isol2=16+1000|space=18+500|uni182D.EA1E_g.init3=19+650|space=19+0|space=22+500|uni182D.E8E2_g.init=23+1000|space=23+0|uni182D.E8E5_g.medi1=25+800|space=25+0|space=28+500|uni182D.EA1D_g.init2=29+950|space=29+0|space=32+500|uni182D.EA1E_g.init3=33+650|space=33+0|space=36+500|space=36+0|uni182D.E8E4_g.medi=38+800|space=38+0|space=38+0|uni182D.E8E5_g.medi1=41+800|space=41+0|space=44+500|space=44+0|uni182D.E8E6_g.medi2=46+650|space=46+0|space=49+500|space=49+0|uni182D.E8E6_g.medi2=51+650|space=51+0|space=54+500|space=54+0|uni182D.E8E4_g.medi=56+800|space=56+0|uni182D.E8E8_g.fina1=58+1250|space=60+500|space=60+0|uni182D.E8E9_g.fina2=62+1050|space=64+500|uni1820.E820_a.isol=65+1550|space=65+0|uni182D.E8E2_g.init=67+1000|uni1820.E823_a.medi=68+400|uni1837.E931_r.fina=69+750|space=70+500|uni1830.E90B_s.init=71+850|uni1824.E844_u.medi=72+600|uni1837.E930_r.medi=73+600|space=73+0|space=73+0|uni182D.E8E5_g.medi1=76+800|uni1820.E823_a.medi=77+400|space=77+0|space=79+500|space=79+0|uni182D.E8E5_g.medi1=81+800|uni1824.E844_u.medi=82+600|uni182F.E908_l.medi=83+400|uni1822.E837_i.fina=84+600|space=85+500|uni182A1820.E875_ba.init=86+1000|uni1822.E836_i.medi2=88+1000|uni182D.E8E8_g.fina1=89+1250|space=90+0|uni1820.E827_a.fina2=91+600|uni202F.nobreak=92+500|uni1836.E92B_y.init1=93+500|uni1822.E834_i.medi=94+500|uni1828.E866_n.fina=95+850]
-fonts/sha1sum/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf::U+180A,U+1868,U+180A,U+1868,U+180B,U+180A,U+1868,U+180C,U+180A,U+1868,U+180D,U+180A:[gid1=0+268|gid10=1+778|gid1=2+268|gid9=3+575|gid1=5+268|gid10=6+778|gid1=8+268|gid8=9+575|gid1=11+268]
diff --git a/test/shaping/tests/simple.tests b/test/shaping/tests/simple.tests
deleted file mode 100644 (file)
index bebe008..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-fonts/sha1sum/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf:--shaper=ot:U+0056,U+0041,U+0042,U+0045,U+0061,U+0062,U+0063,U+0064:[V=0+1142|A=1+1295|B=2+1295|E=3+1123|a=4+1126|b=5+1164|c=6+1072|d=7+1164]
-fonts/sha1sum/49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf:--shaper=fallback:U+0056,U+0041,U+0042,U+0045,U+0061,U+0062,U+0063,U+0064:[V=0+1295|A=1+1295|B=2+1295|E=3+1123|a=4+1126|b=5+1164|c=6+1072|d=7+1164]
diff --git a/test/shaping/tests/spaces.tests b/test/shaping/tests/spaces.tests
deleted file mode 100644 (file)
index cb386de..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+0020:[gid1=0+560]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+00A0:[gid1=0+560]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+1680:[gid0=0+692]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2000:[gid1=0+1024]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2001:[gid1=0+2048]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2002:[gid1=0+1024]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2003:[gid1=0+2048]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2004:[gid1=0+683]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2005:[gid1=0+512]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2006:[gid1=0+341]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2007:[gid1=0+560]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2008:[gid1=0+560]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+2009:[gid1=0+410]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+200A:[gid1=0+128]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+202F:[gid1=0+280]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+205F:[gid1=0+455]
-fonts/sha1sum/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+3000:[gid1=0+2048]
diff --git a/test/shaping/tests/use-marchen.tests b/test/shaping/tests/use-marchen.tests
deleted file mode 100644 (file)
index 6497178..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8F:[u11C8F=0+3000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C71:[u11C71=0+1600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11CB5:[u11C8A=0+2000|u11CB5=0@-2000,0+0]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C84,U+11C71:[u11C84=0+2200|u11C71=1+1600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C7E,U+11C8A:[u11C7E=0+2600|u11C8A=1+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11C92,U+11CA9:[u11C8A.11C92.11CA9=0+2600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11C94,U+11CA9:[u11C8A.11C94.11CA9=0+2600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C92,U+11CA9:[u11C8D.11C92.11CA9=0+2600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C94,U+11CA9:[u11C8D.11C94.11CA9=0+2600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C9E,U+11CA9:[u11C8D.11C9E.11CA9=0+3200]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA0,U+11CA9:[u11C8D.11CA0.11CA9=0+3000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C92,U+11CAA:[u11C8D.11C92.11CAA=0+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C94,U+11CAA:[u11C8D.11C94.11CAA=0+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C9D,U+11CAA:[u11C8D.11C9D.11CAA=0+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11C9E,U+11CAA:[u11C8D.11C9E.11CAA=0+2600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA0,U+11CAA:[u11C8D.11CA0.11CAA=0+2400]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C72,U+11CAA:[u11C80=0+2400|u11C72.11CAA=1+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8C,U+11CB1,U+11C8D:[u11C8C.11CB1=0+2793|u11C8D=2+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C7C,U+11CB3:[u11C80=0+2400|u11C7C.11CB3=1+2200]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C7F,U+11CB2,U+11C7D:[u11C7F.11CB2=0+2400|u11C7D=2+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CB2,U+11C81:[u11C8D.11CB2=0+2000|u11C81=2+2400]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8C,U+11CB4,U+11C74:[u11C8C.11CB4=0+2800|u11C74=2+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8A,U+11CA1,U+11CA9,U+11C71:[u11C8A.11CA1.11CA9=0+3000|u11C71=3+1600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA1,U+11CA9,U+11C71:[u11C8D.11CA1.11CA9=0+3000|u11C71=3+1600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8D,U+11CA1,U+11CAA,U+11C71:[u11C8D.11CA1.11CAA=0+2400|u11C71=3+1600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8F,U+11CB0,U+11CB4,U+11CB6:[u11C8F.11CB0.11CB4=0+3600|u11CB6=0@-3200,0+0]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8E,U+11CB0,U+11CB2,U+11CB5:[u11C8E.11CB0.11CB2=0+2000|u11CB5=0@-2000,0+0]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C74,U+11C89,U+11CB2,U+11C75:[u11C74=0+2000|u11C89.11CB2=1+2000|u11C75=3+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C7C,U+11CAA,U+11CB2,U+11C75:[u11C7C.11CAA.11CB2=0+2200|u11C75=3+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C81,U+11C74,U+11CB2,U+11C8B:[u11C81=0+2400|u11C74.11CB2=1+2000|u11C8B=3+2400]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8B,U+11CB3,U+11C74,U+11C8D:[u11C8B.11CB3=0+2400|u11C74=2+2000|u11C8D=3+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C83,U+11CB4,U+11C74,U+11C8D:[u11C83.11CB4=0+2800|u11C74=2+2000|u11C8D=3+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C8B,U+11CB3,U+11C74,U+11C8D,U+11C71:[u11C8B.11CB3=0+2400|u11C74=2+2000|u11C8D=3+2000|u11C71=4+1600]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C76,U+11CB1,U+11C75,U+11C8D:[u11C80=0+2400|u11C76.11CB1=1+3200|u11C75=3+2000|u11C8D=4+2000]
-fonts/sha1sum/85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf::U+11C80,U+11C8D,U+11C94,U+11CAA,U+11CB1,U+11C74,U+11C8D:[u11C80=0+2400|u11C8D.11C94.11CAA.11CB1.shorti=1+2600|u11C74=5+2000|u11C8D=6+2000]
diff --git a/test/shaping/tests/use.tests b/test/shaping/tests/use.tests
deleted file mode 100644 (file)
index bfce117..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-fonts/sha1sum/fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf::U+1B1B,U+1B44,U+1B13,U+1B3E:[gid3=0+990|gid7=0+2473|gid5=0@-293,-400+0]
-fonts/sha1sum/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
-fonts/sha1sum/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+1211|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
-fonts/sha1sum/6ff0fbead4462d9f229167b4e6839eceb8465058.ttf:--font-funcs=ot:U+11103,U+11128:[gid1=0+837|gid2=0+0]
diff --git a/test/shaping/tests/vertical.tests b/test/shaping/tests/vertical.tests
deleted file mode 100644 (file)
index 3586080..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-fonts/sha1sum/191826b9643e3f124d865d617ae609db6a2ce203.ttf:--direction=t:U+300C:[uni300C.vert=0@-512,-578+0,-1024]
-fonts/sha1sum/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf:--direction=t --font-funcs=ft:U+0041,U+0042:[gid1=0@-654,-2128+0,-2789|gid2=1@-665,-2125+0,-2789]
-fonts/sha1sum/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf:--direction=t --font-funcs=ot:U+0041,U+0042:[gid1=0@-654,-2189+0,-2789|gid2=1@-665,-2189+0,-2789]
diff --git a/test/shaping/tests/zero-width-marks.tests b/test/shaping/tests/zero-width-marks.tests
deleted file mode 100644 (file)
index c08f26b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-fonts/sha1sum/bb9473d2403488714043bcfb946c9f78b86ad627.ttf::U+1030:[circledash=0+636|u1030.med=0@-162,0+0]
-fonts/sha1sum/8454d22037f892e76614e1645d066689a0200e61.ttf::U+05E0,U+05B8,U+0591,U+05DA,U+05B0:[uni05DA05B0=3+991|uni2009=0+200|uni0591=0@75,0+0|uni05B8=0@495,0+0|uni05E0=0+683]
-fonts/sha1sum/45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0@20,0+0|gid1=2+1264]
-fonts/sha1sum/7a37dc4d5bf018456aea291cee06daf004c0221c.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0@20,0+1000|gid1=2+1264]
-fonts/sha1sum/8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0+0|gid1=2+1264]
-fonts/sha1sum/bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf::U+0E01,U+0E34,U+0E01:[gid1=0+1264|gid2=0+0|gid1=2+1264]
-fonts/sha1sum/ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0@-1029,340+0|gid3=2+1083|gid6=2@-992,0+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+0|gid5=8+528|gid6=8@-693,0+0|gid2=10+528|gid2=11+528]
-fonts/sha1sum/cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0@-1029,340+1200|gid3=2+1083|gid6=2@-992,0+1200|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+1200|gid5=8+528|gid6=8@-693,0+1200|gid2=10+528|gid2=11+528]
-fonts/sha1sum/fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0+0|gid3=2+1083|gid6=2+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6+0|gid5=8+528|gid6=8+0|gid2=10+528|gid2=11+528]
-fonts/sha1sum/56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf::U+0058,U+0303,U+0078,U+0303,U+006A,U+006A,U+006A,U+0303,U+006A,U+0303,U+006A,U+006A:[gid1=0+1200|gid6=0@-1029,340+0|gid3=2+1083|gid6=2@-992,0+0|gid2=4+528|gid2=5+528|gid5=6+528|gid6=6@-693,0+0|gid5=8+528|gid6=8@-693,0+0|gid2=10+528|gid2=11+528]
-fonts/sha1sum/a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf::U+0041,U+0042,U+0041:[A=0+1368|B=1+0|A=2+1368]
@@ -1,8 +1,8 @@
-‫دَر فارسی گَچْ‌پَژْ هست. این «ی» فارسی است.‬\r
-‫حرف «ع» را به چٰهار شکلِ «ع‍» و «‍ع‍» و «‍ع» و «‌ع‌» می‌توان نشان داد.‬\r
-‫تشخیصِ اِعْ‌ًٌَُراب ناهمخوان از وظایف حروفْ‌چین است.‬\r
-‫دو اِعراب همخوان مانند « َ» و « ّ» به شکل « َّ» باهم ترکیب می‌شوند.‬\r
-‫لازم است حروف‌چین رفتار درستی با کشیدهٔ یونی‌کدی داشته باشد.‬\r
-‫مثلاً بتواند کلـمهٔ «پیِٓـــــــچ» یا حروف «ــٖٓـ» را به درستی نمایش دهد.‬\r
-‫حرف «لام» و «الف» باید به شکل لیگاتوری نمایش داده شوند.‬\r
+‫دَر فارسی گَچْ‌پَژْ هست. این «ی» فارسی است.‬
+‫حرف «ع» را به چٰهار شکلِ «ع‍» و «‍ع‍» و «‍ع» و «‌ع‌» می‌توان نشان داد.‬
+‫تشخیصِ اِعْ‌ًٌَُراب ناهمخوان از وظایف حروفْ‌چین است.‬
+‫دو اِعراب همخوان مانند « َ» و « ّ» به شکل « َّ» باهم ترکیب می‌شوند.‬
+‫لازم است حروف‌چین رفتار درستی با کشیدهٔ یونی‌کدی داشته باشد.‬
+‫مثلاً بتواند کلـمهٔ «پیِٓـــــــچ» یا حروف «ــٖٓـ» را به درستی نمایش دهد.‬
+‫حرف «لام» و «الف» باید به شکل لیگاتوری نمایش داده شوند.‬
 ‫کلمهٔ «بَلَاٰ» از آزمون‌های سطح پائین حروف‌چین است.‬
\ No newline at end of file
 ‫کلمهٔ «بَلَاٰ» از آزمون‌های سطح پائین حروف‌چین است.‬
\ No newline at end of file
diff --git a/test/shaping/texts/in-house/shaper-arabic/script-syriac/misc/abbreviation-mark.txt b/test/shaping/texts/in-house/shaper-arabic/script-syriac/misc/abbreviation-mark.txt
new file mode 100644 (file)
index 0000000..52bdbea
--- /dev/null
@@ -0,0 +1,11 @@
+ܐܒ
+ܐ܏
+ܐ܏ܒ
+ܐ܏ܒܓ
+ܐ܏ܒܓܕ
+ܐ܏ܒܓܕܐ
+ܐ܏ܒܓܕܐܐܐܐܐܐܐܐܐ
+ܐ܏ܒܓܕܐ܏ܐܐܐ܏ܐ܏ܐܐܐܐ
+ܐ܏ܒܓܕܓܓܓܓܓܓ
+ܐ܏ܒܓ
+܏ܫܘabcܒ.
 ᨉᨙᨄ
 
 ᨆᨙᨒᨚ ᨀ ᨌᨛᨙᨆ
 ᨉᨙᨄ
 
 ᨆᨙᨒᨚ ᨀ ᨌᨛᨙᨆ
-ᨔᨙᨉᨗ   
-ᨉᨘᨓ      
-ᨈᨛᨒᨘ   
-ᨕᨛᨄ      
-ᨒᨗᨆ      
-ᨕᨛᨊᨛ   
-ᨄᨗᨈᨘ   
-ᨕᨑᨘᨓ   
-ᨕᨙᨔᨑ   
-ᨔᨄᨘᨒᨚ        
-ᨉᨘᨓᨄᨘᨒᨚ  
-ᨈᨛᨒᨘᨄᨘᨒᨚ       
-ᨄᨈᨄᨘᨒᨚ     
-ᨒᨗᨆᨄᨘᨒᨚ  
-ᨕᨛᨊᨛᨄᨘᨒᨚᨊ    
-ᨄᨗᨈᨘᨄᨘᨒᨚ       
-ᨕᨑᨘᨓᨄᨘᨒᨚᨊ    
-ᨕᨙᨔᨑᨄᨘᨒᨚᨊ    
-ᨔᨗᨑᨈᨘ        
-ᨔᨗᨔᨛᨅᨘ     
-ᨔᨗᨒᨔ   
-ᨔᨗᨀᨚᨈᨗ     
+ᨔᨙᨉᨗ
+ᨉᨘᨓ
+ᨈᨛᨒᨘ
+ᨕᨛᨄ
+ᨒᨗᨆ
+ᨕᨛᨊᨛ
+ᨄᨗᨈᨘ
+ᨕᨑᨘᨓ
+ᨕᨙᨔᨑ
+ᨔᨄᨘᨒᨚ
+ᨉᨘᨓᨄᨘᨒᨚ
+ᨈᨛᨒᨘᨄᨘᨒᨚ
+ᨄᨈᨄᨘᨒᨚ
+ᨒᨗᨆᨄᨘᨒᨚ
+ᨕᨛᨊᨛᨄᨘᨒᨚᨊ
+ᨄᨗᨈᨘᨄᨘᨒᨚ
+ᨕᨑᨘᨓᨄᨘᨒᨚᨊ
+ᨕᨙᨔᨑᨄᨘᨒᨚᨊ
+ᨔᨗᨑᨈᨘ
+ᨔᨗᨔᨛᨅᨘ
+ᨔᨗᨒᨔ
+ᨔᨗᨀᨚᨈᨗ
 
 ᨅᨔ ᨕᨘᨁᨗ
 
 ᨅᨔ ᨆᨀᨔᨑ
 
 ᨅᨔ ᨕᨘᨁᨗ
 
 ᨅᨔ ᨆᨀᨔᨑ
-ᨅᨒ 
-ᨅᨚᨒᨚ   
-ᨅᨅ 
-ᨌᨗᨄᨘᨑᨘ     
-ᨉᨚᨕᨙ   
-ᨕᨗᨐᨚ   
-ᨒᨚᨄᨚ   
-ᨔᨒᨚ      
-ᨈ ᨅᨙᨙ  
-ᨈᨙᨊ      
-ᨀᨑᨕᨙ   
-ᨕᨄ ᨀᨑᨙᨅ?   
-ᨒᨀᨙᨀᨚ ᨆᨕᨙ?     
-ᨅᨒ 
-ᨅᨚᨈᨚ   
-ᨑᨈᨔ      
-ᨅᨈᨒ      
-ᨅᨗᨒ      
-ᨁᨙᨒᨙ ᨁᨙᨒᨙ      
-ᨀᨚᨀᨚ   
-ᨍᨑ 
-ᨅᨙᨅᨙ   
-ᨆᨚᨈᨙᨑᨙ     
-ᨂᨑᨙ      
+ᨅᨒ
+ᨅᨚᨒᨚ
+ᨅᨅ
+ᨌᨗᨄᨘᨑᨘ
+ᨉᨚᨕᨙ
+ᨕᨗᨐᨚ
+ᨒᨚᨄᨚ
+ᨔᨒᨚ
+ᨈ ᨅᨙᨙ
+ᨈᨙᨊ
+ᨀᨑᨕᨙ
+ᨕᨄ ᨀᨑᨙᨅ?
+ᨒᨀᨙᨀᨚ ᨆᨕᨙ?
+ᨅᨒ
+ᨅᨚᨈᨚ
+ᨑᨈᨔ
+ᨅᨈᨒ
+ᨅᨗᨒ
+ᨁᨙᨒᨙ ᨁᨙᨒᨙ
+ᨀᨚᨀᨚ
+ᨍᨑ
+ᨅᨙᨅᨙ
+ᨆᨚᨈᨙᨑᨙ
+ᨂᨑᨙ
diff --git a/test/shaping/texts/in-tree/shaper-arabic/script-syriac/misc/abbreviation-mark.txt b/test/shaping/texts/in-tree/shaper-arabic/script-syriac/misc/abbreviation-mark.txt
deleted file mode 100644 (file)
index a450678..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-ܐܒ 
-ܐ܏ 
-ܐ܏ܒ 
-ܐ܏ܒܓ 
-ܐ܏ܒܓܕ 
-ܐ܏ܒܓܕܐ 
-ܐ܏ܒܓܕܐܐܐܐܐܐܐܐܐ 
-ܐ܏ܒܓܕܐ܏ܐܐܐ܏ܐ܏ܐܐܐܐ 
-ܐ܏ܒܓܕܓܓܓܓܓܓ 
-ܐ܏ܒܓ 
-܏ܫܘabcܒ.
diff --git a/test/subset/CMakeLists.txt b/test/subset/CMakeLists.txt
new file mode 100644 (file)
index 0000000..ea04105
--- /dev/null
@@ -0,0 +1,10 @@
+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 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 ()
diff --git a/test/subset/Makefile.am b/test/subset/Makefile.am
new file mode 100644 (file)
index 0000000..336d33d
--- /dev/null
@@ -0,0 +1,22 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+EXTRA_DIST =
+CLEANFILES =
+SUBDIRS = data
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+EXTRA_DIST += \
+       CMakeLists.txt \
+       run-tests.py \
+       subset_test_suite.py \
+       $(NULL)
+
+CLEANFILES += \
+       subset_test_suite.py[co] \
+       $(NULL)
+
+-include $(top_srcdir)/git.mk
diff --git a/test/subset/Makefile.in b/test/subset/Makefile.in
new file mode 100644 (file)
index 0000000..76487ce
--- /dev/null
@@ -0,0 +1,699 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = test/subset
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_CONFIG = @ICU_CONFIG@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+EXTRA_DIST = CMakeLists.txt run-tests.py subset_test_suite.py $(NULL)
+CLEANFILES = subset_test_suite.py[co] $(NULL)
+SUBDIRS = data
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/subset/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits test/subset/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
+       else \
+         failcom='exit 1'; \
+       fi; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+       check-am clean clean-generic clean-libtool cscopelist-am ctags \
+       ctags-am distclean distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       installdirs-am maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am
new file mode 100644 (file)
index 0000000..0b00134
--- /dev/null
@@ -0,0 +1,24 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+EXTRA_DIST =
+CLEANFILES =
+SUBDIRS =
+
+EXTRA_DIST = \
+       $(TESTS) \
+       expected/basics \
+       expected/full-font \
+       fonts \
+       profiles \
+       $(NULL)
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../run-tests.py $(top_builddir)/util/hb-subset$(EXEEXT)
+include Makefile.sources
+
+-include $(top_srcdir)/git.mk
diff --git a/test/subset/data/Makefile.in b/test/subset/data/Makefile.in
new file mode 100644 (file)
index 0000000..1fd8753
--- /dev/null
@@ -0,0 +1,1078 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = tests/basics.tests tests/full-font.tests $(am__EXEEXT_1)
+XFAIL_TESTS = $(am__EXEEXT_1)
+subdir = test/subset/data
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       check recheck distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red='\e[0;31m'; \
+    grn='\e[0;32m'; \
+    lgn='\e[1;32m'; \
+    blu='\e[1;34m'; \
+    mgn='\e[0;35m'; \
+    brg='\e[1m'; \
+    std='\e[m'; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[    ]*:recheck:[    ]*
+am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
+am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+           recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[       ]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);                                     \
+$(am__vpath_adj_setup) $(am__vpath_adj)                        \
+$(am__tty_colors);                                     \
+srcdir=$(srcdir); export srcdir;                       \
+case "$@" in                                           \
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
+    *) am__odir=.;;                                    \
+esac;                                                  \
+test "x$$am__odir" = x"." || test -d "$$am__odir"      \
+  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
+if test -f "./$$f"; then dir=./;                       \
+elif test -f "$$f"; then dir=;                         \
+else dir="$(srcdir)/"; fi;                             \
+tst=$$dir$$f; log='$@';                                \
+if test -n '$(DISABLE_HARD_ERRORS)'; then              \
+  am__enable_hard_errors=no;                           \
+else                                                   \
+  am__enable_hard_errors=yes;                          \
+fi;                                                    \
+case " $(XFAIL_TESTS) " in                             \
+  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
+    am__expect_failure=yes;;                           \
+  *)                                                   \
+    am__expect_failure=no;;                            \
+esac;                                                  \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+am__EXEEXT_1 =
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.tests.log=.log)
+TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
+       $(TESTS_LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+       $(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_CONFIG = @ICU_CONFIG@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL = 
+EXTRA_DIST = \
+       $(TESTS) \
+       expected/basics \
+       expected/full-font \
+       fonts \
+       profiles \
+       $(NULL)
+
+CLEANFILES = 
+SUBDIRS = 
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../run-tests.py $(top_builddir)/util/hb-subset$(EXEEXT)
+DISABLED_TESTS = \
+       $(NULL)
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/subset/data/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits test/subset/data/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
+       else \
+         failcom='exit 1'; \
+       fi; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+       rm -f $< $@
+       $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+       @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+       @$(am__set_TESTS_bases); \
+       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+       redo_bases=`for i in $$bases; do \
+                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+                   done`; \
+       if test -n "$$redo_bases"; then \
+         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+         if $(am__make_dryrun); then :; else \
+           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+         fi; \
+       fi; \
+       if test -n "$$am__remaking_logs"; then \
+         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+              "recursion detected" >&2; \
+       elif test -n "$$redo_logs"; then \
+         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+       fi; \
+       if $(am__make_dryrun); then :; else \
+         st=0;  \
+         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+         for i in $$redo_bases; do \
+           test -f $$i.trs && test -r $$i.trs \
+             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+           test -f $$i.log && test -r $$i.log \
+             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+         done; \
+         test $$st -eq 0 || exit 1; \
+       fi
+       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+       ws='[   ]'; \
+       results=`for b in $$bases; do echo $$b.trs; done`; \
+       test -n "$$results" || results=/dev/null; \
+       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+         success=true; \
+       else \
+         success=false; \
+       fi; \
+       br='==================='; br=$$br$$br$$br$$br; \
+       result_count () \
+       { \
+           if test x"$$1" = x"--maybe-color"; then \
+             maybe_colorize=yes; \
+           elif test x"$$1" = x"--no-color"; then \
+             maybe_colorize=no; \
+           else \
+             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+           fi; \
+           shift; \
+           desc=$$1 count=$$2; \
+           if test $$maybe_colorize = yes && test $$count -gt 0; then \
+             color_start=$$3 color_end=$$std; \
+           else \
+             color_start= color_end=; \
+           fi; \
+           echo "$${color_start}# $$desc $$count$${color_end}"; \
+       }; \
+       create_testsuite_report () \
+       { \
+         result_count $$1 "TOTAL:" $$all   "$$brg"; \
+         result_count $$1 "PASS: " $$pass  "$$grn"; \
+         result_count $$1 "SKIP: " $$skip  "$$blu"; \
+         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+         result_count $$1 "FAIL: " $$fail  "$$red"; \
+         result_count $$1 "XPASS:" $$xpass "$$red"; \
+         result_count $$1 "ERROR:" $$error "$$mgn"; \
+       }; \
+       {                                                               \
+         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
+           $(am__rst_title);                                           \
+         create_testsuite_report --no-color;                           \
+         echo;                                                         \
+         echo ".. contents:: :depth: 2";                               \
+         echo;                                                         \
+         for b in $$bases; do echo $$b; done                           \
+           | $(am__create_global_log);                                 \
+       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
+       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
+       if $$success; then                                              \
+         col="$$grn";                                                  \
+        else                                                           \
+         col="$$red";                                                  \
+         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
+       fi;                                                             \
+       echo "$${col}$$br$${std}";                                      \
+       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
+       echo "$${col}$$br$${std}";                                      \
+       create_testsuite_report --maybe-color;                          \
+       echo "$$col$$br$$std";                                          \
+       if $$success; then :; else                                      \
+         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
+         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
+           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+         fi;                                                           \
+         echo "$$col$$br$$std";                                        \
+       fi;                                                             \
+       $$success || exit 1
+
+check-TESTS:
+       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+       exit $$?;
+recheck: all 
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       bases=`for i in $$bases; do echo $$i; done \
+                | $(am__list_recheck_tests)` || exit 1; \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       log_list=`echo $$log_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+               am__force_recheck=am--force-recheck \
+               TEST_LOGS="$$log_list"; \
+       exit $$?
+.tests.log:
+       @p='$<'; \
+       $(am__set_b); \
+       $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
+@am__EXEEXT_TRUE@      @p='$<'; \
+@am__EXEEXT_TRUE@      $(am__set_b); \
+@am__EXEEXT_TRUE@      $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+check-am: all-am
+       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+       check-TESTS check-am clean clean-generic clean-libtool \
+       cscopelist-am ctags ctags-am distclean distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs installdirs-am maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
+       uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources
new file mode 100644 (file)
index 0000000..bc81393
--- /dev/null
@@ -0,0 +1,10 @@
+TESTS = \
+       tests/basics.tests \
+       tests/full-font.tests \
+       $(NULL)
+
+XFAIL_TESTS = \
+       $(NULL)
+
+DISABLED_TESTS = \
+       $(NULL)
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.default.61,62,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.default.61,62,63.ttf
new file mode 100644 (file)
index 0000000..02cd7ef
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.default.61,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.default.61,63.ttf
new file mode 100644 (file)
index 0000000..4942ad0
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.default.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.default.61.ttf
new file mode 100644 (file)
index 0000000..08fe771
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.61.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.default.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.default.62.ttf
new file mode 100644 (file)
index 0000000..8d7e6b2
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.62.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.default.63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.default.63.ttf
new file mode 100644 (file)
index 0000000..0f3a934
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.default.63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf
new file mode 100644 (file)
index 0000000..70206ad
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,63.ttf
new file mode 100644 (file)
index 0000000..c74c029
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61,63.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61.ttf
new file mode 100644 (file)
index 0000000..8ba816d
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.61.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.62.ttf
new file mode 100644 (file)
index 0000000..837438a
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.62.ttf differ
diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.63.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.63.ttf
new file mode 100644 (file)
index 0000000..311737a
Binary files /dev/null and b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints.63.ttf differ
diff --git a/test/subset/data/expected/full-font/Roboto-Regular.default.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.default.1FC,21,41,20,62,63.ttf
new file mode 100644 (file)
index 0000000..60e361d
Binary files /dev/null and b/test/subset/data/expected/full-font/Roboto-Regular.default.1FC,21,41,20,62,63.ttf differ
diff --git a/test/subset/data/expected/full-font/Roboto-Regular.default.61,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.default.61,62,63.ttf
new file mode 100644 (file)
index 0000000..1fc430a
Binary files /dev/null and b/test/subset/data/expected/full-font/Roboto-Regular.default.61,62,63.ttf differ
diff --git a/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf
new file mode 100644 (file)
index 0000000..98f01e1
Binary files /dev/null and b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf differ
diff --git a/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.61,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.61,62,63.ttf
new file mode 100644 (file)
index 0000000..ea212f0
Binary files /dev/null and b/test/subset/data/expected/full-font/Roboto-Regular.drop-hints.61,62,63.ttf differ
diff --git a/test/subset/data/fonts/Roboto-Regular.abc.ttf b/test/subset/data/fonts/Roboto-Regular.abc.ttf
new file mode 100644 (file)
index 0000000..9d791f7
Binary files /dev/null and b/test/subset/data/fonts/Roboto-Regular.abc.ttf differ
diff --git a/test/subset/data/fonts/Roboto-Regular.ttf b/test/subset/data/fonts/Roboto-Regular.ttf
new file mode 100644 (file)
index 0000000..2c97eea
Binary files /dev/null and b/test/subset/data/fonts/Roboto-Regular.ttf differ
diff --git a/test/subset/data/profiles/default.txt b/test/subset/data/profiles/default.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/subset/data/profiles/drop-hints.txt b/test/subset/data/profiles/drop-hints.txt
new file mode 100644 (file)
index 0000000..e5cd974
--- /dev/null
@@ -0,0 +1 @@
+--no-hinting
diff --git a/test/subset/data/tests/basics.tests b/test/subset/data/tests/basics.tests
new file mode 100644 (file)
index 0000000..9725445
--- /dev/null
@@ -0,0 +1,13 @@
+FONTS:
+Roboto-Regular.abc.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+
+SUBSETS:
+abc
+b
+c
+ac
+a
diff --git a/test/subset/data/tests/full-font.tests b/test/subset/data/tests/full-font.tests
new file mode 100644 (file)
index 0000000..f0a262b
--- /dev/null
@@ -0,0 +1,11 @@
+FONTS:
+Roboto-Regular.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+
+SUBSETS:
+abc
+Ǽ!A bc
+
diff --git a/test/subset/run-tests.py b/test/subset/run-tests.py
new file mode 100755 (executable)
index 0000000..56cd7b4
--- /dev/null
@@ -0,0 +1,133 @@
+#!/usr/bin/env python
+
+# Runs a subsetting test suite. Compares the results of subsetting via harfbuz
+# to subsetting via fonttools.
+
+from __future__ import print_function
+
+import io
+from difflib import unified_diff
+import os
+import re
+import subprocess
+import sys
+import tempfile
+
+from subset_test_suite import SubsetTestSuite
+
+
+def cmd(command):
+       p = subprocess.Popen (
+               command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+       p.wait ()
+       print (p.stderr.read (), end="") # file=sys.stderr
+       return p.stdout.read (), p.returncode
+
+def read_binary(file_path):
+       with open(file_path, 'rb') as f:
+               return f.read()
+
+def fail_test(test, cli_args, message):
+       print ('ERROR: %s' % message)
+       print ('Test State:')
+       print ('  test.font_path    %s' % os.path.abspath(test.font_path))
+       print ('  test.profile_path %s' % os.path.abspath(test.profile_path))
+       print ('  test.unicodes     %s' % test.unicodes())
+       expected_file = os.path.join(test_suite.get_output_directory(),
+                                    test.get_font_name())
+       print ('  expected_file     %s' % os.path.abspath(expected_file))
+       return 1
+
+def run_test(test, should_check_ots):
+       out_file = os.path.join(tempfile.mkdtemp(), test.get_font_name() + '-subset.ttf')
+       cli_args = [hb_subset,
+                   "--font-file=" + test.font_path,
+                   "--output-file=" + out_file,
+                   "--unicodes=%s" % test.unicodes()]
+       cli_args.extend (test.get_profile_flags())
+       print (' '.join(cli_args))
+       _, return_code = cmd(cli_args)
+
+       if return_code:
+               return fail_test(test, cli_args, "%s returned %d" % (' '.join(cli_args), return_code))
+
+       expected_ttx, return_code = run_ttx(os.path.join(test_suite.get_output_directory(),
+                                           test.get_font_name()))
+       if return_code:
+               return fail_test(test, cli_args, "ttx (expected) returned %d" % (return_code))
+
+       actual_ttx, return_code = run_ttx(out_file)
+       if return_code:
+               return fail_test(test, cli_args, "ttx (actual) returned %d" % (return_code))
+
+       expected_ttx = strip_check_sum (expected_ttx)
+       actual_ttx = strip_check_sum (actual_ttx)
+
+       if not actual_ttx == expected_ttx:
+               for line in unified_diff(expected_ttx.splitlines(1), actual_ttx.splitlines(1)):
+                       sys.stdout.write(line)
+               sys.stdout.flush()
+               return fail_test(test, cli_args, 'ttx for expected and actual does not match.')
+
+       if should_check_ots:
+               print ("Checking output with ots-sanitize.")
+               if not check_ots(out_file):
+                       return fail_test(test, cli_args, 'ots for subsetted file fails.')
+
+       return 0
+
+def run_ttx(file):
+       cli_args = ["ttx",
+                   "-o-",
+                   file]
+       return cmd(cli_args)
+
+def strip_check_sum (ttx_string):
+       return re.sub ('checkSumAdjustment value=["]0x([0-9a-fA-F])+["]',
+                      'checkSumAdjustment value="0x00000000"',
+                      ttx_string, count=1)
+
+def has_ots():
+       _, returncode = cmd(["which", "ots-sanitize"])
+       if returncode:
+               print("OTS is not present, skipping all ots checks.")
+               return False
+       return True
+
+def check_ots (path):
+       ots_report, returncode = cmd(["ots-sanitize", path])
+       if returncode:
+               print("OTS Failure: %s" % ots_report);
+               return False
+       return True
+
+args = sys.argv[1:]
+if not args or sys.argv[1].find('hb-subset') == -1 or not os.path.exists (sys.argv[1]):
+       print ("First argument does not seem to point to usable hb-subset.")
+       sys.exit (1)
+hb_subset, args = args[0], args[1:]
+
+if not len(args):
+       print ("No tests supplied.")
+       sys.exit (1)
+
+_, returncode = cmd(["which", "ttx"])
+if returncode:
+       print("TTX is not present, skipping test.")
+       sys.exit (77)
+
+has_ots = has_ots()
+
+fails = 0
+for path in args:
+       with io.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)
+else:
+       print ("All tests passed.")
diff --git a/test/subset/subset_test_suite.py b/test/subset/subset_test_suite.py
new file mode 100644 (file)
index 0000000..3538650
--- /dev/null
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+
+import io
+import os
+
+# A single test in a subset test suite. Identifies a font
+# a subsetting profile, and a subset to be cut.
+class Test:
+       def __init__(self, font_path, profile_path, subset):
+               self.font_path = font_path
+               self.profile_path = profile_path
+               self.subset = subset
+
+       def unicodes(self):
+               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();
+
+       def get_font_name(self):
+               font_base_name = os.path.basename(self.font_path)
+               font_base_name_parts = os.path.splitext(font_base_name)
+               profile_name = os.path.splitext(os.path.basename(self.profile_path))[0]
+
+               return "%s.%s.%s%s" % (font_base_name_parts[0],
+                                      profile_name,
+                                      self.unicodes(),
+                                      font_base_name_parts[1])
+
+# A group of tests to perform on the subsetter. Each test
+# Identifies a font a subsetting profile, and a subset to be cut.
+class SubsetTestSuite:
+
+       def __init__(self, test_path, definition):
+               self.test_path = test_path
+               self.fonts = set()
+               self.profiles = set()
+               self.subsets = set()
+               self._parse(definition)
+
+       def get_output_directory(self):
+               test_name = os.path.splitext(os.path.basename(self.test_path))[0]
+               data_dir = os.path.join(os.path.dirname(self.test_path), "..")
+
+               output_dir = os.path.normpath(os.path.join(data_dir, "expected", test_name))
+               if not os.path.exists(output_dir):
+                       os.mkdir(output_dir)
+               if not os.path.isdir(output_dir):
+                       raise Error("%s is not a directory." % output_dir)
+
+               return output_dir
+
+       def tests(self):
+               for font in self.fonts:
+                       font = os.path.join(self._base_path(), "fonts", font)
+                       for profile in self.profiles:
+                               profile = os.path.join(self._base_path(), "profiles", profile)
+                               for subset in self.subsets:
+                                       yield Test(font, profile, subset)
+
+       def _base_path(self):
+               return os.path.dirname(os.path.dirname(self.test_path))
+
+       def _parse(self, definition):
+               destinations = {
+                               "FONTS:": self.fonts,
+                               "PROFILES:": self.profiles,
+                               "SUBSETS:": self.subsets
+               }
+
+               current_destination = None
+               for line in definition.splitlines():
+                       line = line.strip()
+
+                       if line.startswith("#"):
+                               continue
+
+                       if not line:
+                               continue
+
+                       if line in destinations:
+                               current_destination = destinations[line]
+                       elif current_destination is not None:
+                               current_destination.add(line)
+                       else:
+                               raise Exception("Failed to parse test suite file.")
index 2543a60..d4ab9cd 100644 (file)
@@ -1,5 +1,6 @@
 # Process this file with automake to produce Makefile.in
 
 # Process this file with automake to produce Makefile.in
 
+NULL =
 EXTRA_DIST =
 CLEANFILES =
 DISTCLEANFILES =
 EXTRA_DIST =
 CLEANFILES =
 DISTCLEANFILES =
@@ -45,6 +46,10 @@ endif # HAVE_FREETYPE
 hb_shape_SOURCES = $(HB_SHAPE_sources)
 bin_PROGRAMS += hb-shape
 
 hb_shape_SOURCES = $(HB_SHAPE_sources)
 bin_PROGRAMS += hb-shape
 
+hb_subset_SOURCES = $(HB_SUBSET_CLI_sources)
+hb_subset_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+bin_PROGRAMS += hb-subset
+
 if HAVE_OT
 hb_ot_shape_closure_SOURCES = $(HB_OT_SHAPE_CLOSURE_sources)
 bin_PROGRAMS += hb-ot-shape-closure
 if HAVE_OT
 hb_ot_shape_closure_SOURCES = $(HB_OT_SHAPE_CLOSURE_sources)
 bin_PROGRAMS += hb-ot-shape-closure
index f6fe331..21092cf 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # Process this file with automake to produce Makefile.in
 
 VPATH = @srcdir@
 # Process this file with automake to produce Makefile.in
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -80,27 +90,27 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(srcdir)/Makefile.sources $(srcdir)/Makefile.in \
-       $(srcdir)/Makefile.am $(top_srcdir)/depcomp
 bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__append_1 = hb-view
 bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__append_1 = hb-view
-@HAVE_GLIB_TRUE@am__append_2 = hb-shape
+@HAVE_GLIB_TRUE@am__append_2 = hb-shape hb-subset
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__append_3 = hb-ot-shape-closure
 subdir = util
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__append_3 = hb-ot-shape-closure
 subdir = util
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-       $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \
-       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
+       $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__EXEEXT_1 = hb-view$(EXEEXT)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__EXEEXT_1 = hb-view$(EXEEXT)
-@HAVE_GLIB_TRUE@am__EXEEXT_2 = hb-shape$(EXEEXT)
+@HAVE_GLIB_TRUE@am__EXEEXT_2 = hb-shape$(EXEEXT) hb-subset$(EXEEXT)
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__EXEEXT_3 =  \
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ hb-ot-shape-closure$(EXEEXT)
 am__installdirs = "$(DESTDIR)$(bindir)"
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__EXEEXT_3 =  \
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ hb-ot-shape-closure$(EXEEXT)
 am__installdirs = "$(DESTDIR)$(bindir)"
@@ -131,20 +141,27 @@ hb_shape_LDADD = $(LDADD)
 hb_shape_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la \
        $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
        $(am__DEPENDENCIES_1)
 hb_shape_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la \
        $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
        $(am__DEPENDENCIES_1)
+am__hb_subset_SOURCES_DIST = hb-subset.cc options.cc options.hh \
+       main-font-text.hh
+am__objects_4 = hb-subset.$(OBJEXT) options.$(OBJEXT) $(am__objects_1)
+@HAVE_GLIB_TRUE@am_hb_subset_OBJECTS = $(am__objects_4)
+hb_subset_OBJECTS = $(am_hb_subset_OBJECTS)
+am__DEPENDENCIES_2 = $(top_builddir)/src/libharfbuzz.la \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+       $(am__DEPENDENCIES_1)
+@HAVE_GLIB_TRUE@hb_subset_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@       $(top_builddir)/src/libharfbuzz-subset.la
 am__hb_view_SOURCES_DIST = hb-view.cc options.cc options.hh \
        main-font-text.hh shape-consumer.hh ansi-print.cc \
        ansi-print.hh helper-cairo.cc helper-cairo.hh \
        helper-cairo-ansi.cc helper-cairo-ansi.hh view-cairo.cc \
        view-cairo.hh
 am__hb_view_SOURCES_DIST = hb-view.cc options.cc options.hh \
        main-font-text.hh shape-consumer.hh ansi-print.cc \
        ansi-print.hh helper-cairo.cc helper-cairo.hh \
        helper-cairo-ansi.cc helper-cairo-ansi.hh view-cairo.cc \
        view-cairo.hh
-am__objects_4 = hb-view.$(OBJEXT) options.$(OBJEXT) \
+am__objects_5 = hb-view.$(OBJEXT) options.$(OBJEXT) \
        ansi-print.$(OBJEXT) helper-cairo.$(OBJEXT) \
        helper-cairo-ansi.$(OBJEXT) view-cairo.$(OBJEXT) \
        $(am__objects_1)
        ansi-print.$(OBJEXT) helper-cairo.$(OBJEXT) \
        helper-cairo-ansi.$(OBJEXT) view-cairo.$(OBJEXT) \
        $(am__objects_1)
-@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am_hb_view_OBJECTS = $(am__objects_4)
+@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am_hb_view_OBJECTS = $(am__objects_5)
 hb_view_OBJECTS = $(am_hb_view_OBJECTS)
 hb_view_OBJECTS = $(am_hb_view_OBJECTS)
-am__DEPENDENCIES_2 = $(top_builddir)/src/libharfbuzz.la \
-       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-       $(am__DEPENDENCIES_1)
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@hb_view_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@hb_view_DEPENDENCIES = $(am__DEPENDENCIES_2) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1) \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(am__DEPENDENCIES_1) \
@@ -202,9 +219,10 @@ am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
 SOURCES = $(hb_ot_shape_closure_SOURCES) $(hb_shape_SOURCES) \
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
 SOURCES = $(hb_ot_shape_closure_SOURCES) $(hb_shape_SOURCES) \
-       $(hb_view_SOURCES)
+       $(hb_subset_SOURCES) $(hb_view_SOURCES)
 DIST_SOURCES = $(am__hb_ot_shape_closure_SOURCES_DIST) \
 DIST_SOURCES = $(am__hb_ot_shape_closure_SOURCES_DIST) \
-       $(am__hb_shape_SOURCES_DIST) $(am__hb_view_SOURCES_DIST)
+       $(am__hb_shape_SOURCES_DIST) $(am__hb_subset_SOURCES_DIST) \
+       $(am__hb_view_SOURCES_DIST)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -229,6 +247,8 @@ am__define_uniq_tagged_files = \
   done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
   done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+       $(top_srcdir)/depcomp
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
@@ -245,6 +265,12 @@ CAIRO_LIBS = @CAIRO_LIBS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
 CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
 CORETEXT_LIBS = @CORETEXT_LIBS@
 CPP = @CPP@
@@ -272,6 +298,8 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
 FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
 FREETYPE_DEPS = @FREETYPE_DEPS@
 FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
 GIT = @GIT@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_DEPS = @GLIB_DEPS@
@@ -311,6 +339,7 @@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
 INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
 INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
@@ -319,6 +348,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -375,6 +405,7 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -395,6 +426,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -403,11 +435,11 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
+NULL = 
 EXTRA_DIST = 
 CLEANFILES = 
 DISTCLEANFILES = 
 MAINTAINERCLEANFILES = 
 EXTRA_DIST = 
 CLEANFILES = 
 DISTCLEANFILES = 
 MAINTAINERCLEANFILES = 
-NULL = 
 HB_VIEW_sources = \
        hb-view.cc \
        options.cc \
 HB_VIEW_sources = \
        hb-view.cc \
        options.cc \
@@ -439,6 +471,13 @@ HB_OT_SHAPE_CLOSURE_sources = \
        main-font-text.hh \
        $(NULL)
 
        main-font-text.hh \
        $(NULL)
 
+HB_SUBSET_CLI_sources = \
+       hb-subset.cc \
+       options.cc \
+       options.hh \
+       main-font-text.hh \
+       $(NULL)
+
 AM_CPPFLAGS = \
        -DHB_DISABLE_DEPRECATED \
        -I$(top_srcdir)/src/ \
 AM_CPPFLAGS = \
        -DHB_DISABLE_DEPRECATED \
        -I$(top_srcdir)/src/ \
@@ -463,6 +502,8 @@ LDADD = \
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(NULL)
 
 @HAVE_GLIB_TRUE@hb_shape_SOURCES = $(HB_SHAPE_sources)
 @HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@       $(NULL)
 
 @HAVE_GLIB_TRUE@hb_shape_SOURCES = $(HB_SHAPE_sources)
+@HAVE_GLIB_TRUE@hb_subset_SOURCES = $(HB_SUBSET_CLI_sources)
+@HAVE_GLIB_TRUE@hb_subset_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@hb_ot_shape_closure_SOURCES = $(HB_OT_SHAPE_CLOSURE_sources)
 all: all-am
 
 @HAVE_GLIB_TRUE@@HAVE_OT_TRUE@hb_ot_shape_closure_SOURCES = $(HB_OT_SHAPE_CLOSURE_sources)
 all: all-am
 
@@ -480,7 +521,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__c
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits util/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits util/Makefile
        echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits util/Makefile'; \
        $(am__cd) $(top_srcdir) && \
          $(AUTOMAKE) --gnits util/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
        @case '$?' in \
          *config.status*) \
@@ -489,7 +529,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
-$(srcdir)/Makefile.sources:
+$(srcdir)/Makefile.sources $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -573,6 +613,10 @@ hb-shape$(EXEEXT): $(hb_shape_OBJECTS) $(hb_shape_DEPENDENCIES) $(EXTRA_hb_shape
        @rm -f hb-shape$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(hb_shape_OBJECTS) $(hb_shape_LDADD) $(LIBS)
 
        @rm -f hb-shape$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(hb_shape_OBJECTS) $(hb_shape_LDADD) $(LIBS)
 
+hb-subset$(EXEEXT): $(hb_subset_OBJECTS) $(hb_subset_DEPENDENCIES) $(EXTRA_hb_subset_DEPENDENCIES) 
+       @rm -f hb-subset$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(hb_subset_OBJECTS) $(hb_subset_LDADD) $(LIBS)
+
 hb-view$(EXEEXT): $(hb_view_OBJECTS) $(hb_view_DEPENDENCIES) $(EXTRA_hb_view_DEPENDENCIES) 
        @rm -f hb-view$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(hb_view_OBJECTS) $(hb_view_LDADD) $(LIBS)
 hb-view$(EXEEXT): $(hb_view_OBJECTS) $(hb_view_DEPENDENCIES) $(EXTRA_hb_view_DEPENDENCIES) 
        @rm -f hb-view$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(hb_view_OBJECTS) $(hb_view_LDADD) $(LIBS)
@@ -586,6 +630,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ansi-print.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-ot-shape-closure.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-shape.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ansi-print.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-ot-shape-closure.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-shape.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-subset.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-view.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helper-cairo-ansi.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helper-cairo.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb-view.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helper-cairo-ansi.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helper-cairo.Po@am__quote@
@@ -828,6 +873,8 @@ uninstall-am: uninstall-binPROGRAMS
        mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
        uninstall-am uninstall-binPROGRAMS
 
        mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
        uninstall-am uninstall-binPROGRAMS
 
+.PRECIOUS: Makefile
+
 
 # Convenience targets:
 lib:
 
 # Convenience targets:
 lib:
index 368fdb0..6c815d2 100644 (file)
@@ -1,5 +1,3 @@
-NULL =
-
 HB_VIEW_sources = \
        hb-view.cc \
        options.cc \
 HB_VIEW_sources = \
        hb-view.cc \
        options.cc \
@@ -30,3 +28,10 @@ HB_OT_SHAPE_CLOSURE_sources = \
        options.hh \
        main-font-text.hh \
        $(NULL)
        options.hh \
        main-font-text.hh \
        $(NULL)
+
+HB_SUBSET_CLI_sources = \
+       hb-subset.cc \
+       options.cc \
+       options.hh \
+       main-font-text.hh \
+       $(NULL)
index e0ce7b3..0daee1f 100644 (file)
@@ -353,7 +353,7 @@ block_best (const biimage_t &bi, bool *inverse)
        } else
          qs += quad[i][j];
     if (qs < score) {
        } else
          qs += quad[i][j];
     if (qs < score) {
-      const char *c = NULL;
+      const char *c = nullptr;
       bool inv = false;
       switch (q) {
        case 1:  c = "▟"; inv = true;  break;
       bool inv = false;
       switch (q) {
        case 1:  c = "▟"; inv = true;  break;
index dad4d4c..1ea5b37 100644 (file)
@@ -27,6 +27,7 @@
 #ifndef ANSI_PRINT_HH
 #define ANSI_PRINT_HH
 
 #ifndef ANSI_PRINT_HH
 #define ANSI_PRINT_HH
 
+#include "hb-private.hh"
 #include <hb.h> /* for int types */
 
 void
 #include <hb.h> /* for int types */
 
 void
index 859f9a6..77ca201 100644 (file)
@@ -43,8 +43,8 @@ struct shape_closure_consumer_t : option_group_t
   {
     GOptionEntry entries[] =
     {
   {
     GOptionEntry entries[] =
     {
-      {"no-glyph-names",       0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE,    &this->show_glyph_names,        "Use glyph indices instead of names",   NULL},
-      {NULL}
+      {"no-glyph-names",       0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE,    &this->show_glyph_names,        "Use glyph indices instead of names",   nullptr},
+      {nullptr}
     };
     parser->add_group (entries,
                       "format",
     };
     parser->add_group (entries,
                       "format",
@@ -53,14 +53,15 @@ struct shape_closure_consumer_t : option_group_t
                       this);
   }
 
                       this);
   }
 
-  void init (const font_options_t *font_opts)
+  void init (hb_buffer_t  *buffer_,
+            const font_options_t *font_opts)
   {
     glyphs = hb_set_create ();
     font = hb_font_reference (font_opts->get_font ());
     failed = false;
   {
     glyphs = hb_set_create ();
     font = hb_font_reference (font_opts->get_font ());
     failed = false;
+    buffer = hb_buffer_reference (buffer_);
   }
   }
-  void consume_line (hb_buffer_t  *buffer,
-                    const char   *text,
+  void consume_line (const char   *text,
                     unsigned int  text_len,
                     const char   *text_before,
                     const char   *text_after)
                     unsigned int  text_len,
                     const char   *text_before,
                     const char   *text_after)
@@ -92,9 +93,11 @@ struct shape_closure_consumer_t : option_group_t
   {
     printf ("\n");
     hb_font_destroy (font);
   {
     printf ("\n");
     hb_font_destroy (font);
-    font = NULL;
+    font = nullptr;
     hb_set_destroy (glyphs);
     hb_set_destroy (glyphs);
-    glyphs = NULL;
+    glyphs = nullptr;
+    hb_buffer_destroy (buffer);
+    buffer = nullptr;
   }
 
   bool failed;
   }
 
   bool failed;
@@ -105,6 +108,7 @@ struct shape_closure_consumer_t : option_group_t
 
   hb_set_t *glyphs;
   hb_font_t *font;
 
   hb_set_t *glyphs;
   hb_font_t *font;
+  hb_buffer_t *buffer;
 };
 
 int
 };
 
 int
index 75c3793..337cd43 100644 (file)
@@ -33,16 +33,16 @@ struct output_buffer_t
   output_buffer_t (option_parser_t *parser)
                  : options (parser, hb_buffer_serialize_list_formats ()),
                    format (parser),
   output_buffer_t (option_parser_t *parser)
                  : options (parser, hb_buffer_serialize_list_formats ()),
                    format (parser),
-                   gs (NULL),
+                   gs (nullptr),
                    line_no (0),
                    line_no (0),
-                   font (NULL),
+                   font (nullptr),
                    output_format (HB_BUFFER_SERIALIZE_FORMAT_INVALID),
                    format_flags (HB_BUFFER_SERIALIZE_FLAG_DEFAULT) {}
 
                    output_format (HB_BUFFER_SERIALIZE_FORMAT_INVALID),
                    format_flags (HB_BUFFER_SERIALIZE_FLAG_DEFAULT) {}
 
-  void init (const font_options_t *font_opts)
+  void init (hb_buffer_t *buffer, const font_options_t *font_opts)
   {
     options.get_file_handle ();
   {
     options.get_file_handle ();
-    gs = g_string_new (NULL);
+    gs = g_string_new (nullptr);
     line_no = 0;
     font = hb_font_reference (font_opts->get_font ());
 
     line_no = 0;
     font = hb_font_reference (font_opts->get_font ());
 
@@ -72,9 +72,16 @@ struct output_buffer_t
       flags |= HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS;
     if (!format.show_positions)
       flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
       flags |= HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS;
     if (!format.show_positions)
       flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
+    if (!format.show_advances)
+      flags |= HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES;
     if (format.show_extents)
       flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS;
     if (format.show_extents)
       flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS;
+    if (format.show_flags)
+      flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS;
     format_flags = (hb_buffer_serialize_flags_t) flags;
     format_flags = (hb_buffer_serialize_flags_t) flags;
+
+    if (format.trace)
+      hb_buffer_set_message_func (buffer, message_func, this, nullptr);
   }
   void new_line (void)
   {
   }
   void new_line (void)
   {
@@ -89,13 +96,10 @@ struct output_buffer_t
     format.serialize_buffer_of_text (buffer, line_no, text, text_len, font, gs);
     fprintf (options.fp, "%s", gs->str);
   }
     format.serialize_buffer_of_text (buffer, line_no, text, text_len, font, gs);
     fprintf (options.fp, "%s", gs->str);
   }
-  void shape_failed (hb_buffer_t  *buffer,
-                    const char   *text,
-                    unsigned int  text_len,
-                    hb_bool_t     utf8_clusters)
+  void error (const char *message)
   {
     g_string_set_size (gs, 0);
   {
     g_string_set_size (gs, 0);
-    format.serialize_message (line_no, "msg: all shapers failed", gs);
+    format.serialize_message (line_no, "error", message, gs);
     fprintf (options.fp, "%s", gs->str);
   }
   void consume_glyphs (hb_buffer_t  *buffer,
     fprintf (options.fp, "%s", gs->str);
   }
   void consume_glyphs (hb_buffer_t  *buffer,
@@ -108,14 +112,40 @@ struct output_buffer_t
                                       output_format, format_flags, gs);
     fprintf (options.fp, "%s", gs->str);
   }
                                       output_format, format_flags, gs);
     fprintf (options.fp, "%s", gs->str);
   }
-  void finish (const font_options_t *font_opts)
+  void finish (hb_buffer_t *buffer, const font_options_t *font_opts)
   {
   {
+    hb_buffer_set_message_func (buffer, nullptr, nullptr, nullptr);
     hb_font_destroy (font);
     g_string_free (gs, true);
     hb_font_destroy (font);
     g_string_free (gs, true);
-    gs = NULL;
-    font = NULL;
+    gs = nullptr;
+    font = nullptr;
+  }
+
+  static hb_bool_t
+  message_func (hb_buffer_t *buffer,
+               hb_font_t *font,
+               const char *message,
+               void *user_data)
+  {
+    output_buffer_t *that = (output_buffer_t *) user_data;
+    that->trace (buffer, font, message);
+    return true;
   }
 
   }
 
+  void
+  trace (hb_buffer_t *buffer,
+        hb_font_t *font,
+        const char *message)
+  {
+    g_string_set_size (gs, 0);
+    format.serialize_line_no (line_no, gs);
+    g_string_append_printf (gs, "trace: %s     buffer: ", message);
+    format.serialize_glyphs (buffer, font, output_format, format_flags, gs);
+    g_string_append_c (gs, '\n');
+    fprintf (options.fp, "%s", gs->str);
+  }
+
+
   protected:
   output_options_t options;
   format_options_t format;
   protected:
   output_options_t options;
   format_options_t format;
diff --git a/util/hb-subset.cc b/util/hb-subset.cc
new file mode 100644 (file)
index 0000000..2061755
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * Copyright © 2010  Behdad Esfahbod
+ * Copyright © 2011,2012  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Rod Sheeter
+ */
+
+#include <stdio.h>
+
+#include "main-font-text.hh"
+#include "hb-subset.h"
+#include "hb-subset-private.hh"
+
+/*
+ * Command line interface to the harfbuzz font subsetter.
+ */
+
+struct subset_consumer_t
+{
+  subset_consumer_t (option_parser_t *parser)
+      : failed (false), options (parser), subset_options (parser), font (nullptr), input (nullptr) {}
+
+  void init (hb_buffer_t  *buffer_,
+             const font_options_t *font_opts)
+  {
+    font = hb_font_reference (font_opts->get_font ());
+    input = hb_subset_input_create_or_fail ();
+  }
+
+  void consume_line (const char   *text,
+                     unsigned int  text_len,
+                     const char   *text_before,
+                     const char   *text_after)
+  {
+    // TODO(Q1) does this only get called with at least 1 codepoint?
+    hb_set_t *codepoints = hb_subset_input_unicode_set (input);
+    gchar *c = (gchar *)text;
+    do {
+      gunichar cp = g_utf8_get_char(c);
+      hb_codepoint_t hb_cp = cp;
+      hb_set_add (codepoints, hb_cp);
+    } while ((c = g_utf8_find_next_char(c, text + text_len)) != nullptr);
+  }
+
+  hb_bool_t
+  write_file (const char *output_file, hb_blob_t *blob) {
+    unsigned int data_length;
+    const char* data = hb_blob_get_data (blob, &data_length);
+
+    FILE *fp_out = fopen(output_file, "wb");
+    if (fp_out == nullptr) {
+      fprintf(stderr, "Unable to open output file\n");
+      return false;
+    }
+    int bytes_written = fwrite(data, 1, data_length, fp_out);
+
+    fclose (fp_out);
+
+    if (bytes_written == -1) {
+      fprintf(stderr, "Unable to write output file\n");
+      return false;
+    }
+    if ((unsigned int) bytes_written != data_length) {
+      fprintf(stderr, "Expected %u bytes written, got %d\n", data_length,
+              bytes_written);
+      return false;
+    }
+    return true;
+  }
+
+  void finish (const font_options_t *font_opts)
+  {
+    input->drop_hints = subset_options.drop_hints;
+
+    hb_subset_profile_t *subset_profile = hb_subset_profile_create();
+    hb_face_t *face = hb_font_get_face (font);
+
+    hb_face_t *new_face = hb_subset(face, subset_profile, input);
+    hb_blob_t *result = hb_face_reference_blob (new_face);
+
+    failed = !hb_blob_get_length (result);
+    if (!failed)
+      write_file (options.output_file, result);
+
+    hb_subset_profile_destroy (subset_profile);
+    hb_subset_input_destroy (input);
+    hb_blob_destroy (result);
+    hb_face_destroy (new_face);
+    hb_font_destroy (font);
+  }
+
+  public:
+  bool failed;
+
+  private:
+  output_options_t options;
+  subset_options_t subset_options;
+  hb_font_t *font;
+  hb_subset_input_t *input;
+};
+
+int
+main (int argc, char **argv)
+{
+  main_font_text_t<subset_consumer_t, 10, 0> driver;
+  return driver.main (argc, argv);
+}
index eeaaa50..cf18ea4 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
-#include <cairo.h>
-
 #ifndef HELPER_CAIRO_ANSI_HH
 #define HELPER_CAIRO_ANSI_HH
 
 #ifndef HELPER_CAIRO_ANSI_HH
 #define HELPER_CAIRO_ANSI_HH
 
+#include "hb-private.hh"
+
+#include <cairo.h>
 
 cairo_status_t
 helper_cairo_surface_write_to_ansi_stream (cairo_surface_t     *surface,
 
 cairo_status_t
 helper_cairo_surface_write_to_ansi_stream (cairo_surface_t     *surface,
index 2e2952b..b9f4985 100644 (file)
@@ -79,7 +79,7 @@ helper_cairo_create_scaled_font (const font_options_t *font_opts)
   /* We cannot use the FT_Face from hb_font_t, as doing so will confuse hb_font_t because
    * cairo will reset the face size.  As such, create new face...
    * TODO Perhaps add API to hb-ft to encapsulate this code. */
   /* We cannot use the FT_Face from hb_font_t, as doing so will confuse hb_font_t because
    * cairo will reset the face size.  As such, create new face...
    * TODO Perhaps add API to hb-ft to encapsulate this code. */
-  FT_Face ft_face = NULL;//hb_ft_font_get_face (font);
+  FT_Face ft_face = nullptr;//hb_ft_font_get_face (font);
   if (!ft_face)
   {
     if (!ft_library)
   if (!ft_face)
   {
     if (!ft_library)
@@ -103,6 +103,7 @@ helper_cairo_create_scaled_font (const font_options_t *font_opts)
   }
   else
   {
   }
   else
   {
+#ifdef HAVE_FT_SET_VAR_BLEND_COORDINATES
     unsigned int num_coords;
     const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
     if (num_coords)
     unsigned int num_coords;
     const int *coords = hb_font_get_var_coords_normalized (font, &num_coords);
     if (num_coords)
@@ -116,6 +117,7 @@ helper_cairo_create_scaled_font (const font_options_t *font_opts)
        free (ft_coords);
       }
     }
        free (ft_coords);
       }
     }
+#endif
 
     cairo_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0);
   }
 
     cairo_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0);
   }
@@ -325,7 +327,7 @@ const char *helper_cairo_supported_formats[] =
     "eps",
    #endif
   #endif
     "eps",
    #endif
   #endif
-  NULL
+  nullptr
 };
 
 cairo_t *
 };
 
 cairo_t *
@@ -337,12 +339,12 @@ helper_cairo_create_context (double w, double h,
   cairo_surface_t *(*constructor) (cairo_write_func_t write_func,
                                   void *closure,
                                   double width,
   cairo_surface_t *(*constructor) (cairo_write_func_t write_func,
                                   void *closure,
                                   double width,
-                                  double height) = NULL;
+                                  double height) = nullptr;
   cairo_surface_t *(*constructor2) (cairo_write_func_t write_func,
                                    void *closure,
                                    double width,
                                    double height,
   cairo_surface_t *(*constructor2) (cairo_write_func_t write_func,
                                    void *closure,
                                    double width,
                                    double height,
-                                   cairo_content_t content) = NULL;
+                                   cairo_content_t content) = nullptr;
 
   const char *extension = out_opts->output_format;
   if (!extension) {
 
   const char *extension = out_opts->output_format;
   if (!extension) {
@@ -471,8 +473,8 @@ helper_cairo_line_from_buffer (helper_cairo_line_t *l,
   memset (l, 0, sizeof (*l));
 
   l->num_glyphs = hb_buffer_get_length (buffer);
   memset (l, 0, sizeof (*l));
 
   l->num_glyphs = hb_buffer_get_length (buffer);
-  hb_glyph_info_t *hb_glyph = hb_buffer_get_glyph_infos (buffer, NULL);
-  hb_glyph_position_t *hb_position = hb_buffer_get_glyph_positions (buffer, NULL);
+  hb_glyph_info_t *hb_glyph = hb_buffer_get_glyph_infos (buffer, nullptr);
+  hb_glyph_position_t *hb_position = hb_buffer_get_glyph_positions (buffer, nullptr);
   l->glyphs = cairo_glyph_allocate (l->num_glyphs + 1);
 
   if (text) {
   l->glyphs = cairo_glyph_allocate (l->num_glyphs + 1);
 
   if (text) {
index 27b6eb3..50bc0af 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
+#ifndef HELPER_CAIRO_HH
+#define HELPER_CAIRO_HH
+
+#include "hb-private.hh"
 #include "options.hh"
 
 #include <cairo.h>
 
 #include "options.hh"
 
 #include <cairo.h>
 
-#ifndef HELPER_CAIRO_HH
-#define HELPER_CAIRO_HH
-
 
 cairo_scaled_font_t *
 helper_cairo_create_scaled_font (const font_options_t *font_opts);
 
 cairo_scaled_font_t *
 helper_cairo_create_scaled_font (const font_options_t *font_opts);
index 55de567..3390371 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
-#include "options.hh"
-
 #ifndef HB_MAIN_FONT_TEXT_HH
 #define HB_MAIN_FONT_TEXT_HH
 
 #ifndef HB_MAIN_FONT_TEXT_HH
 #define HB_MAIN_FONT_TEXT_HH
 
+#include "hb-private.hh"
+#include "options.hh"
+
 /* main() body for utilities taking font and processing text.*/
 
 static char *
 locale_to_utf8 (char *s)
 {
   char *t;
 /* main() body for utilities taking font and processing text.*/
 
 static char *
 locale_to_utf8 (char *s)
 {
   char *t;
-  GError *error = NULL;
+  GError *error = nullptr;
 
 
-  t = g_locale_to_utf8 (s, -1, NULL, NULL, &error);
+  t = g_locale_to_utf8 (s, -1, nullptr, nullptr, &error);
   if (!t)
   {
      fail (true, "Failed converting text to UTF-8");
   if (!t)
   {
      fail (true, "Failed converting text to UTF-8");
@@ -46,23 +47,6 @@ locale_to_utf8 (char *s)
   return t;
 }
 
   return t;
 }
 
-static hb_bool_t
-message_func (hb_buffer_t *buffer,
-             hb_font_t *font,
-             const char *message,
-             void *user_data)
-{
-  fprintf (stderr, "HB: %s\n", message);
-  char buf[4096];
-  hb_buffer_serialize_glyphs (buffer, 0, hb_buffer_get_length (buffer),
-                             buf, sizeof (buf), NULL,
-                             font,
-                             HB_BUFFER_SERIALIZE_FORMAT_TEXT,
-                             HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
-  fprintf (stderr, "HB: buffer [%s]\n", buf);
-  return true;
-}
-
 template <typename consumer_t, int default_font_size, int subpixel_bits>
 struct main_font_text_t
 {
 template <typename consumer_t, int default_font_size, int subpixel_bits>
 struct main_font_text_t
 {
@@ -87,16 +71,14 @@ struct main_font_text_t
     if (!input.text && !input.text_file)
       input.text_file = g_strdup ("-");
 
     if (!input.text && !input.text_file)
       input.text_file = g_strdup ("-");
 
-    consumer.init (&font_opts);
-
     hb_buffer_t *buffer = hb_buffer_create ();
     hb_buffer_t *buffer = hb_buffer_create ();
-    if (debug)
-      hb_buffer_set_message_func (buffer, message_func, NULL, NULL);
+    consumer.init (buffer, &font_opts);
+    hb_buffer_destroy (buffer);
+
     unsigned int text_len;
     const char *text;
     while ((text = input.get_line (&text_len)))
     unsigned int text_len;
     const char *text;
     while ((text = input.get_line (&text_len)))
-      consumer.consume_line (buffer, text, text_len, input.text_before, input.text_after);
-    hb_buffer_destroy (buffer);
+      consumer.consume_line (text, text_len, input.text_before, input.text_after);
 
     consumer.finish (&font_opts);
 
 
     consumer.finish (&font_opts);
 
index 0f2e207..db7115c 100644 (file)
@@ -70,7 +70,7 @@ hb_bool_t debug = false;
 static gchar *
 shapers_to_string (void)
 {
 static gchar *
 shapers_to_string (void)
 {
-  GString *shapers = g_string_new (NULL);
+  GString *shapers = g_string_new (nullptr);
   const char **shaper_list = hb_shape_list_shapers ();
 
   for (; *shaper_list; shaper_list++) {
   const char **shaper_list = hb_shape_list_shapers ();
 
   for (; *shaper_list; shaper_list++) {
@@ -106,11 +106,11 @@ option_parser_t::add_main_options (void)
   GOptionEntry entries[] =
   {
     {"version",                0, G_OPTION_FLAG_NO_ARG,
   GOptionEntry entries[] =
   {
     {"version",                0, G_OPTION_FLAG_NO_ARG,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &show_version,       "Show version numbers",                 NULL},
-    {"debug",          0, 0, G_OPTION_ARG_NONE,        &debug,                         "Free all resources before exit",       NULL},
-    {NULL}
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &show_version,       "Show version numbers",                 nullptr},
+    {"debug",          0, 0, G_OPTION_ARG_NONE,        &debug,                         "Free all resources before exit",       nullptr},
+    {nullptr}
   };
   };
-  g_option_context_add_main_entries (context, entries, NULL);
+  g_option_context_add_main_entries (context, entries, nullptr);
 }
 
 static gboolean
 }
 
 static gboolean
@@ -121,7 +121,7 @@ pre_parse (GOptionContext *context G_GNUC_UNUSED,
 {
   option_group_t *option_group = (option_group_t *) data;
   option_group->pre_parse (error);
 {
   option_group_t *option_group = (option_group_t *) data;
   option_group->pre_parse (error);
-  return *error == NULL;
+  return *error == nullptr;
 }
 
 static gboolean
 }
 
 static gboolean
@@ -132,7 +132,7 @@ post_parse (GOptionContext *context G_GNUC_UNUSED,
 {
   option_group_t *option_group = static_cast<option_group_t *>(data);
   option_group->post_parse (error);
 {
   option_group_t *option_group = static_cast<option_group_t *>(data);
   option_group->post_parse (error);
-  return *error == NULL;
+  return *error == nullptr;
 }
 
 void
 }
 
 void
@@ -143,7 +143,7 @@ option_parser_t::add_group (GOptionEntry   *entries,
                            option_group_t *option_group)
 {
   GOptionGroup *group = g_option_group_new (name, description, help_description,
                            option_group_t *option_group)
 {
   GOptionGroup *group = g_option_group_new (name, description, help_description,
-                                           static_cast<gpointer>(option_group), NULL);
+                                           static_cast<gpointer>(option_group), nullptr);
   g_option_group_add_entries (group, entries);
   g_option_group_set_parse_hooks (group, pre_parse, post_parse);
   g_option_context_add_group (context, group);
   g_option_group_add_entries (group, entries);
   g_option_group_set_parse_hooks (group, pre_parse, post_parse);
   g_option_context_add_group (context, group);
@@ -154,10 +154,10 @@ option_parser_t::parse (int *argc, char ***argv)
 {
   setlocale (LC_ALL, "");
 
 {
   setlocale (LC_ALL, "");
 
-  GError *parse_error = NULL;
+  GError *parse_error = nullptr;
   if (!g_option_context_parse (context, argc, argv, &parse_error))
   {
   if (!g_option_context_parse (context, argc, argv, &parse_error))
   {
-    if (parse_error != NULL) {
+    if (parse_error != nullptr) {
       fail (true, "%s", parse_error->message);
       //g_error_free (parse_error);
     } else
       fail (true, "%s", parse_error->message);
       //g_error_free (parse_error);
     } else
@@ -225,7 +225,7 @@ parse_features (const char *name G_GNUC_UNUSED,
 
   shape_opts->num_features = 0;
   g_free (shape_opts->features);
 
   shape_opts->num_features = 0;
   g_free (shape_opts->features);
-  shape_opts->features = NULL;
+  shape_opts->features = nullptr;
 
   if (!*s)
     return true;
 
   if (!*s)
     return true;
@@ -240,6 +240,8 @@ parse_features (const char *name G_GNUC_UNUSED,
   } while (p);
 
   shape_opts->features = (hb_feature_t *) calloc (shape_opts->num_features, sizeof (*shape_opts->features));
   } while (p);
 
   shape_opts->features = (hb_feature_t *) calloc (shape_opts->num_features, sizeof (*shape_opts->features));
+  if (!shape_opts->features)
+    return false;
 
   /* now do the actual parsing */
   p = s;
 
   /* now do the actual parsing */
   p = s;
@@ -248,7 +250,7 @@ parse_features (const char *name G_GNUC_UNUSED,
     char *end = strchr (p, ',');
     if (hb_feature_from_string (p, end ? end - p : -1, &shape_opts->features[shape_opts->num_features]))
       shape_opts->num_features++;
     char *end = strchr (p, ',');
     if (hb_feature_from_string (p, end ? end - p : -1, &shape_opts->features[shape_opts->num_features]))
       shape_opts->num_features++;
-    p = end ? end + 1 : NULL;
+    p = end ? end + 1 : nullptr;
   }
 
   return true;
   }
 
   return true;
@@ -266,7 +268,7 @@ parse_variations (const char *name G_GNUC_UNUSED,
 
   font_opts->num_variations = 0;
   g_free (font_opts->variations);
 
   font_opts->num_variations = 0;
   g_free (font_opts->variations);
-  font_opts->variations = NULL;
+  font_opts->variations = nullptr;
 
   if (!*s)
     return true;
 
   if (!*s)
     return true;
@@ -281,6 +283,8 @@ parse_variations (const char *name G_GNUC_UNUSED,
   } while (p);
 
   font_opts->variations = (hb_variation_t *) calloc (font_opts->num_variations, sizeof (*font_opts->variations));
   } while (p);
 
   font_opts->variations = (hb_variation_t *) calloc (font_opts->num_variations, sizeof (*font_opts->variations));
+  if (!font_opts->variations)
+    return false;
 
   /* now do the actual parsing */
   p = s;
 
   /* now do the actual parsing */
   p = s;
@@ -289,24 +293,86 @@ parse_variations (const char *name G_GNUC_UNUSED,
     char *end = strchr (p, ',');
     if (hb_variation_from_string (p, end ? end - p : -1, &font_opts->variations[font_opts->num_variations]))
       font_opts->num_variations++;
     char *end = strchr (p, ',');
     if (hb_variation_from_string (p, end ? end - p : -1, &font_opts->variations[font_opts->num_variations]))
       font_opts->num_variations++;
-    p = end ? end + 1 : NULL;
+    p = end ? end + 1 : nullptr;
   }
 
   return true;
 }
 
   }
 
   return true;
 }
 
+static gboolean
+parse_text (const char *name G_GNUC_UNUSED,
+           const char *arg,
+           gpointer    data,
+           GError    **error G_GNUC_UNUSED)
+{
+  text_options_t *text_opts = (text_options_t *) data;
+
+  if (text_opts->text)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                "Either --text or --unicodes can be provided but not both");
+    return false;
+  }
+
+  text_opts->text = g_strdup (arg);
+  return true;
+}
+
+
+static gboolean
+parse_unicodes (const char *name G_GNUC_UNUSED,
+               const char *arg,
+               gpointer    data,
+               GError    **error G_GNUC_UNUSED)
+{
+  text_options_t *text_opts = (text_options_t *) data;
+
+  if (text_opts->text)
+  {
+    g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                "Either --text or --unicodes can be provided but not both");
+    return false;
+  }
+
+  GString *gs = g_string_new (nullptr);
+  char *s = (char *) arg;
+  char *p;
+
+  while (s && *s)
+  {
+    while (*s && strchr ("<+>{},;&#\\xXuUnNiI\n\t", *s))
+      s++;
+
+    errno = 0;
+    hb_codepoint_t u = strtoul (s, &p, 16);
+    if (errno || s == p)
+    {
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "Failed parsing Unicode values at: '%s'", s);
+      return false;
+    }
+
+    g_string_append_unichar (gs, u);
+
+    s = p;
+  }
+
+  text_opts->text = g_string_free (gs, FALSE);
+  return true;
+}
+
 
 void
 view_options_t::add_options (option_parser_t *parser)
 {
   GOptionEntry entries[] =
   {
 
 void
 view_options_t::add_options (option_parser_t *parser)
 {
   GOptionEntry entries[] =
   {
-    {"annotate",       0, 0, G_OPTION_ARG_NONE,        &this->annotate,                "Annotate output rendering",                            NULL},
+    {"annotate",       0, 0, G_OPTION_ARG_NONE,        &this->annotate,                "Annotate output rendering",                            nullptr},
     {"background",     0, 0, G_OPTION_ARG_STRING,      &this->back,                    "Set background color (default: " DEFAULT_BACK ")",     "rrggbb/rrggbbaa"},
     {"foreground",     0, 0, G_OPTION_ARG_STRING,      &this->fore,                    "Set foreground color (default: " DEFAULT_FORE ")",     "rrggbb/rrggbbaa"},
     {"line-space",     0, 0, G_OPTION_ARG_DOUBLE,      &this->line_space,              "Set space between lines (default: 0)",                 "units"},
     {"margin",         0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_margin,       "Margin around output (default: " G_STRINGIFY(DEFAULT_MARGIN) ")","one to four numbers"},
     {"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"},
     {"margin",         0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_margin,       "Margin around output (default: " G_STRINGIFY(DEFAULT_MARGIN) ")","one to four numbers"},
-    {NULL}
+    {nullptr}
   };
   parser->add_group (entries,
                     "view",
   };
   parser->add_group (entries,
                     "view",
@@ -321,21 +387,23 @@ shape_options_t::add_options (option_parser_t *parser)
   GOptionEntry entries[] =
   {
     {"list-shapers",   0, G_OPTION_FLAG_NO_ARG,
   GOptionEntry entries[] =
   {
     {"list-shapers",   0, G_OPTION_FLAG_NO_ARG,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &list_shapers,       "List available shapers and quit",      NULL},
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &list_shapers,       "List available shapers and quit",      nullptr},
     {"shaper",         0, G_OPTION_FLAG_HIDDEN,
     {"shaper",         0, G_OPTION_FLAG_HIDDEN,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_shapers,      "Hidden duplicate of --shapers",        NULL},
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_shapers,      "Hidden duplicate of --shapers",        nullptr},
     {"shapers",                0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_shapers,      "Set comma-separated list of shapers to try","list"},
     {"direction",      0, 0, G_OPTION_ARG_STRING,      &this->direction,               "Set text direction (default: auto)",   "ltr/rtl/ttb/btt"},
     {"language",       0, 0, G_OPTION_ARG_STRING,      &this->language,                "Set text language (default: $LANG)",   "langstr"},
     {"script",         0, 0, G_OPTION_ARG_STRING,      &this->script,                  "Set text script (default: auto)",      "ISO-15924 tag"},
     {"shapers",                0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_shapers,      "Set comma-separated list of shapers to try","list"},
     {"direction",      0, 0, G_OPTION_ARG_STRING,      &this->direction,               "Set text direction (default: auto)",   "ltr/rtl/ttb/btt"},
     {"language",       0, 0, G_OPTION_ARG_STRING,      &this->language,                "Set text language (default: $LANG)",   "langstr"},
     {"script",         0, 0, G_OPTION_ARG_STRING,      &this->script,                  "Set text script (default: auto)",      "ISO-15924 tag"},
-    {"bot",            0, 0, G_OPTION_ARG_NONE,        &this->bot,                     "Treat text as beginning-of-paragraph", NULL},
-    {"eot",            0, 0, G_OPTION_ARG_NONE,        &this->eot,                     "Treat text as end-of-paragraph",       NULL},
-    {"preserve-default-ignorables",0, 0, G_OPTION_ARG_NONE,    &this->preserve_default_ignorables,     "Preserve Default-Ignorable characters",        NULL},
-    {"utf8-clusters",  0, 0, G_OPTION_ARG_NONE,        &this->utf8_clusters,           "Use UTF8 byte indices, not char indices",      NULL},
+    {"bot",            0, 0, G_OPTION_ARG_NONE,        &this->bot,                     "Treat text as beginning-of-paragraph", nullptr},
+    {"eot",            0, 0, G_OPTION_ARG_NONE,        &this->eot,                     "Treat text as end-of-paragraph",       nullptr},
+    {"preserve-default-ignorables",0, 0, G_OPTION_ARG_NONE,    &this->preserve_default_ignorables,     "Preserve Default-Ignorable characters",        nullptr},
+    {"remove-default-ignorables",0, 0, G_OPTION_ARG_NONE,      &this->remove_default_ignorables,       "Remove Default-Ignorable characters",  nullptr},
+    {"utf8-clusters",  0, 0, G_OPTION_ARG_NONE,        &this->utf8_clusters,           "Use UTF8 byte indices, not char indices",      nullptr},
     {"cluster-level",  0, 0, G_OPTION_ARG_INT,         &this->cluster_level,           "Cluster merging level (default: 0)",   "0/1/2"},
     {"cluster-level",  0, 0, G_OPTION_ARG_INT,         &this->cluster_level,           "Cluster merging level (default: 0)",   "0/1/2"},
-    {"normalize-glyphs",0, 0, G_OPTION_ARG_NONE,       &this->normalize_glyphs,        "Rearrange glyph clusters in nominal order",    NULL},
+    {"normalize-glyphs",0, 0, G_OPTION_ARG_NONE,       &this->normalize_glyphs,        "Rearrange glyph clusters in nominal order",    nullptr},
+    {"verify",         0, 0, G_OPTION_ARG_NONE,        &this->verify,                  "Perform sanity checks on shaping results",     nullptr},
     {"num-iterations", 0, 0, G_OPTION_ARG_INT,         &this->num_iterations,          "Run shaper N times (default: 1)",      "N"},
     {"num-iterations", 0, 0, G_OPTION_ARG_INT,         &this->num_iterations,          "Run shaper N times (default: 1)",      "N"},
-    {NULL}
+    {nullptr}
   };
   parser->add_group (entries,
                     "shape",
   };
   parser->add_group (entries,
                     "shape",
@@ -382,7 +450,7 @@ shape_options_t::add_options (option_parser_t *parser)
   GOptionEntry entries2[] =
   {
     {"features",       0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_features,     features_help,  "list"},
   GOptionEntry entries2[] =
   {
     {"features",       0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_features,     features_help,  "list"},
-    {NULL}
+    {nullptr}
   };
   parser->add_group (entries2,
                     "features",
   };
   parser->add_group (entries2,
                     "features",
@@ -408,19 +476,39 @@ parse_font_size (const char *name G_GNUC_UNUSED,
     case 2: return true;
     default:
       g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
     case 2: return true;
     default:
       g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
-                  "%s argument should be one to four space-separated numbers",
+                  "%s argument should be one or two space-separated numbers",
                   name);
       return false;
   }
 }
                   name);
       return false;
   }
 }
+
+static gboolean
+parse_font_ppem (const char *name G_GNUC_UNUSED,
+                const char *arg,
+                gpointer    data,
+                GError    **error G_GNUC_UNUSED)
+{
+  font_options_t *font_opts = (font_options_t *) data;
+  switch (sscanf (arg, "%d%*[ ,]%d", &font_opts->x_ppem, &font_opts->y_ppem)) {
+    case 1: font_opts->y_ppem = font_opts->x_ppem;
+    case 2: return true;
+    default:
+      g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+                  "%s argument should be one or two space-separated numbers",
+                  name);
+      return false;
+  }
+}
+
 void
 font_options_t::add_options (option_parser_t *parser)
 {
 void
 font_options_t::add_options (option_parser_t *parser)
 {
-  char *text = NULL;
+  char *text = nullptr;
 
   {
 
   {
-    ASSERT_STATIC (ARRAY_LENGTH_CONST (supported_font_funcs) > 0);
-    GString *s = g_string_new (NULL);
+    static_assert ((ARRAY_LENGTH_CONST (supported_font_funcs) > 0),
+                  "No supported font-funcs found.");
+    GString *s = g_string_new (nullptr);
     g_string_printf (s, "Set font functions implementation to use (default: %s)\n\n    Supported font function implementations are: %s",
                     supported_font_funcs[0].name,
                     supported_font_funcs[0].name);
     g_string_printf (s, "Set font functions implementation to use (default: %s)\n\n    Supported font function implementations are: %s",
                     supported_font_funcs[0].name,
                     supported_font_funcs[0].name);
@@ -444,12 +532,14 @@ font_options_t::add_options (option_parser_t *parser)
 
   GOptionEntry entries[] =
   {
 
   GOptionEntry entries[] =
   {
-    {"font-file",      0, 0, G_OPTION_ARG_STRING,      &this->font_file,               "Set font file-name",                   "filename"},
-    {"face-index",     0, 0, G_OPTION_ARG_INT,         &this->face_index,              "Set face index (default: 0)",          "index"},
+    {"font-file",      0, 0, G_OPTION_ARG_STRING,      &this->font_file,               "Set font file-name",                           "filename"},
+    {"face-index",     0, 0, G_OPTION_ARG_INT,         &this->face_index,              "Set face index (default: 0)",                  "index"},
     {"font-size",      0, default_font_size ? 0 : G_OPTION_FLAG_HIDDEN,
     {"font-size",      0, default_font_size ? 0 : G_OPTION_FLAG_HIDDEN,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_font_size,    font_size_text,                         "1/2 numbers or 'upem'"},
-    {"font-funcs",     0, 0, G_OPTION_ARG_STRING,      &this->font_funcs,              text,                                   "impl"},
-    {NULL}
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_font_size,    font_size_text,                                 "1/2 integers or 'upem'"},
+    {"font-ppem",      0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_font_ppem,    "Set x,y pixels per EM (default: 0; disabled)", "1/2 integers"},
+    {"font-ptem",      0, 0, G_OPTION_ARG_DOUBLE,      &this->ptem,                    "Set font point-size (default: 0; disabled)",   "point-size"},
+    {"font-funcs",     0, 0, G_OPTION_ARG_STRING,      &this->font_funcs,              text,                                           "impl"},
+    {nullptr}
   };
   parser->add_group (entries,
                     "font",
   };
   parser->add_group (entries,
                     "font",
@@ -472,11 +562,11 @@ font_options_t::add_options (option_parser_t *parser)
   GOptionEntry entries2[] =
   {
     {"variations",     0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_variations,   variations_help,        "list"},
   GOptionEntry entries2[] =
   {
     {"variations",     0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_variations,   variations_help,        "list"},
-    {NULL}
+    {nullptr}
   };
   parser->add_group (entries2,
                     "variations",
   };
   parser->add_group (entries2,
                     "variations",
-                    "Varitions options:",
+                    "Variations options:",
                     "Options for font variations used",
                     this);
 }
                     "Options for font variations used",
                     this);
 }
@@ -486,11 +576,12 @@ text_options_t::add_options (option_parser_t *parser)
 {
   GOptionEntry entries[] =
   {
 {
   GOptionEntry entries[] =
   {
-    {"text",           0, 0, G_OPTION_ARG_STRING,      &this->text,                    "Set input text",                       "string"},
+    {"text",           0, 0, G_OPTION_ARG_CALLBACK,    (gpointer) &parse_text,         "Set input text",                       "string"},
     {"text-file",      0, 0, G_OPTION_ARG_STRING,      &this->text_file,               "Set input text file-name\n\n    If no text is provided, standard input is used for input.\n",          "filename"},
     {"text-file",      0, 0, G_OPTION_ARG_STRING,      &this->text_file,               "Set input text file-name\n\n    If no text is provided, standard input is used for input.\n",          "filename"},
+    {"unicodes",      'u', 0, G_OPTION_ARG_CALLBACK,   (gpointer) &parse_unicodes,             "Set input Unicode codepoints",         "list of hex numbers"},
     {"text-before",    0, 0, G_OPTION_ARG_STRING,      &this->text_before,             "Set text context before each line",    "string"},
     {"text-after",     0, 0, G_OPTION_ARG_STRING,      &this->text_after,              "Set text context after each line",     "string"},
     {"text-before",    0, 0, G_OPTION_ARG_STRING,      &this->text_before,             "Set text context before each line",    "string"},
     {"text-after",     0, 0, G_OPTION_ARG_STRING,      &this->text_after,              "Set text context after each line",     "string"},
-    {NULL}
+    {nullptr}
   };
   parser->add_group (entries,
                     "text",
   };
   parser->add_group (entries,
                     "text",
@@ -504,7 +595,7 @@ output_options_t::add_options (option_parser_t *parser)
 {
   const char *text;
 
 {
   const char *text;
 
-  if (NULL == supported_formats)
+  if (nullptr == supported_formats)
     text = "Set output serialization format";
   else
   {
     text = "Set output serialization format";
   else
   {
@@ -516,9 +607,9 @@ output_options_t::add_options (option_parser_t *parser)
 
   GOptionEntry entries[] =
   {
 
   GOptionEntry entries[] =
   {
-    {"output-file",    0, 0, G_OPTION_ARG_STRING,      &this->output_file,             "Set output file-name (default: stdout)","filename"},
-    {"output-format",  0, 0, G_OPTION_ARG_STRING,      &this->output_format,           text,                                   "format"},
-    {NULL}
+    {"output-file",   'o', 0, G_OPTION_ARG_STRING,     &this->output_file,             "Set output file-name (default: stdout)","filename"},
+    {"output-format", 'O', 0, G_OPTION_ARG_STRING,     &this->output_format,           text,                                   "format"},
+    {nullptr}
   };
   parser->add_group (entries,
                     "output",
   };
   parser->add_group (entries,
                     "output",
@@ -535,7 +626,7 @@ font_options_t::get_font (void) const
   if (font)
     return font;
 
   if (font)
     return font;
 
-  hb_blob_t *blob = NULL;
+  hb_blob_t *blob = nullptr;
 
   /* Create the blob */
   {
 
   /* Create the blob */
   {
@@ -551,7 +642,7 @@ font_options_t::get_font (void) const
 
     if (0 == strcmp (font_file, "-")) {
       /* read it */
 
     if (0 == strcmp (font_file, "-")) {
       /* read it */
-      GString *gs = g_string_new (NULL);
+      GString *gs = g_string_new (nullptr);
       char buf[BUFSIZ];
 #if defined(_WIN32) || defined(__CYGWIN__)
       setmode (fileno (stdin), O_BINARY);
       char buf[BUFSIZ];
 #if defined(_WIN32) || defined(__CYGWIN__)
       setmode (fileno (stdin), O_BINARY);
@@ -569,7 +660,7 @@ font_options_t::get_font (void) const
       destroy = (hb_destroy_func_t) g_free;
       mm = HB_MEMORY_MODE_WRITABLE;
     } else {
       destroy = (hb_destroy_func_t) g_free;
       mm = HB_MEMORY_MODE_WRITABLE;
     } else {
-      GError *error = NULL;
+      GError *error = nullptr;
       GMappedFile *mf = g_mapped_file_new (font_file, false, &error);
       if (mf) {
        font_data = g_mapped_file_get_contents (mf);
       GMappedFile *mf = g_mapped_file_new (font_file, false, &error);
       if (mf) {
        font_data = g_mapped_file_get_contents (mf);
@@ -588,7 +679,7 @@ font_options_t::get_font (void) const
        /* GMappedFile is buggy, it doesn't fail if file isn't regular.
         * Try reading.
         * https://bugzilla.gnome.org/show_bug.cgi?id=659212 */
        /* GMappedFile is buggy, it doesn't fail if file isn't regular.
         * Try reading.
         * https://bugzilla.gnome.org/show_bug.cgi?id=659212 */
-        GError *error = NULL;
+        GError *error = nullptr;
        gsize l;
        if (g_file_get_contents (font_file, &font_data, &l, &error)) {
          len = l;
        gsize l;
        if (g_file_get_contents (font_file, &font_data, &l, &error)) {
          len = l;
@@ -620,6 +711,9 @@ font_options_t::get_font (void) const
   if (font_size_y == FONT_SIZE_UPEM)
     font_size_y = hb_face_get_upem (face);
 
   if (font_size_y == FONT_SIZE_UPEM)
     font_size_y = hb_face_get_upem (face);
 
+  hb_font_set_ppem (font, x_ppem, y_ppem);
+  hb_font_set_ptem (font, ptem);
+
   int scale_x = (int) scalbnf (font_size_x, subpixel_bits);
   int scale_y = (int) scalbnf (font_size_y, subpixel_bits);
   hb_font_set_scale (font, scale_x, scale_y);
   int scale_x = (int) scalbnf (font_size_x, subpixel_bits);
   int scale_y = (int) scalbnf (font_size_y, subpixel_bits);
   hb_font_set_scale (font, scale_x, scale_y);
@@ -627,7 +721,7 @@ font_options_t::get_font (void) const
 
   hb_font_set_variations (font, variations, num_variations);
 
 
   hb_font_set_variations (font, variations, num_variations);
 
-  void (*set_font_funcs) (hb_font_t *) = NULL;
+  void (*set_font_funcs) (hb_font_t *) = nullptr;
   if (!font_funcs)
   {
     set_font_funcs = supported_font_funcs[0].func;
   if (!font_funcs)
   {
     set_font_funcs = supported_font_funcs[0].func;
@@ -642,7 +736,7 @@ font_options_t::get_font (void) const
       }
     if (!set_font_funcs)
     {
       }
     if (!set_font_funcs)
     {
-      GString *s = g_string_new (NULL);
+      GString *s = g_string_new (nullptr);
       for (unsigned int i = 0; i < ARRAY_LENGTH (supported_font_funcs); i++)
       {
         if (i)
       for (unsigned int i = 0; i < ARRAY_LENGTH (supported_font_funcs); i++)
       {
         if (i)
@@ -673,7 +767,7 @@ text_options_t::get_line (unsigned int *len)
 
     if (!line_len) {
       *len = 0;
 
     if (!line_len) {
       *len = 0;
-      return NULL;
+      return nullptr;
     }
 
     const char *ret = line;
     }
 
     const char *ret = line;
@@ -706,9 +800,15 @@ text_options_t::get_line (unsigned int *len)
       fail (false, "Failed opening text file `%s': %s",
            text_file, strerror (errno));
 
       fail (false, "Failed opening text file `%s': %s",
            text_file, strerror (errno));
 
-    gs = g_string_new (NULL);
+    gs = g_string_new (nullptr);
   }
 
   }
 
+#ifdef HAVE_SETLINEBUF
+  setlinebuf (fp);
+#else
+  setvbuf(fp, NULL, _IOLBF, BUFSIZ);
+#endif
+
   g_string_set_size (gs, 0);
   char buf[BUFSIZ];
   while (fgets (buf, sizeof (buf), fp)) {
   g_string_set_size (gs, 0);
   char buf[BUFSIZ];
   while (fgets (buf, sizeof (buf), fp)) {
@@ -724,7 +824,7 @@ text_options_t::get_line (unsigned int *len)
     fail (false, "Failed reading text: %s",
          strerror (errno));
   *len = gs->len;
     fail (false, "Failed reading text: %s",
          strerror (errno));
   *len = gs->len;
-  return !*len && feof (fp) ? NULL : gs->str;
+  return !*len && feof (fp) ? nullptr : gs->str;
 }
 
 
 }
 
 
@@ -746,6 +846,12 @@ output_options_t::get_file_handle (void)
     fail (false, "Cannot open output file `%s': %s",
          g_filename_display_name (output_file), strerror (errno));
 
     fail (false, "Cannot open output file `%s': %s",
          g_filename_display_name (output_file), strerror (errno));
 
+#ifdef HAVE_SETLINEBUF
+  setlinebuf (fp);
+#else
+  setvbuf(fp, NULL, _IOLBF, BUFSIZ);
+#endif
+
   return fp;
 }
 
   return fp;
 }
 
@@ -760,24 +866,41 @@ parse_verbose (const char *name G_GNUC_UNUSED,
   return true;
 }
 
   return true;
 }
 
+static gboolean
+parse_ned (const char *name G_GNUC_UNUSED,
+          const char *arg G_GNUC_UNUSED,
+          gpointer    data G_GNUC_UNUSED,
+          GError    **error G_GNUC_UNUSED)
+{
+  format_options_t *format_opts = (format_options_t *) data;
+  format_opts->show_clusters = format_opts->show_advances = false;
+  return true;
+}
+
 void
 format_options_t::add_options (option_parser_t *parser)
 {
   GOptionEntry entries[] =
   {
 void
 format_options_t::add_options (option_parser_t *parser)
 {
   GOptionEntry entries[] =
   {
-    {"show-text",      0, 0, G_OPTION_ARG_NONE,        &this->show_text,               "Prefix each line of output with its corresponding input text",         NULL},
-    {"show-unicode",   0, 0, G_OPTION_ARG_NONE,        &this->show_unicode,            "Prefix each line of output with its corresponding input codepoint(s)", NULL},
-    {"show-line-num",  0, 0, G_OPTION_ARG_NONE,        &this->show_line_num,           "Prefix each line of output with its corresponding input line number",  NULL},
-    {"verbose",                0, G_OPTION_FLAG_NO_ARG,
-                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_verbose,      "Prefix each line of output with all of the above",                     NULL},
+    {"show-text",      0, 0, G_OPTION_ARG_NONE,        &this->show_text,               "Prefix each line of output with its corresponding input text",         nullptr},
+    {"show-unicode",   0, 0, G_OPTION_ARG_NONE,        &this->show_unicode,            "Prefix each line of output with its corresponding input codepoint(s)", nullptr},
+    {"show-line-num",  0, 0, G_OPTION_ARG_NONE,        &this->show_line_num,           "Prefix each line of output with its corresponding input line number",  nullptr},
+    {"verbose",              'v', G_OPTION_FLAG_NO_ARG,
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_verbose,      "Prefix each line of output with all of the above",                     nullptr},
     {"no-glyph-names", 0, G_OPTION_FLAG_REVERSE,
     {"no-glyph-names", 0, G_OPTION_FLAG_REVERSE,
-                             G_OPTION_ARG_NONE,        &this->show_glyph_names,        "Output glyph indices instead of names",                                NULL},
+                             G_OPTION_ARG_NONE,        &this->show_glyph_names,        "Output glyph indices instead of names",                                nullptr},
     {"no-positions",   0, G_OPTION_FLAG_REVERSE,
     {"no-positions",   0, G_OPTION_FLAG_REVERSE,
-                             G_OPTION_ARG_NONE,        &this->show_positions,          "Do not output glyph positions",                                        NULL},
+                             G_OPTION_ARG_NONE,        &this->show_positions,          "Do not output glyph positions",                                        nullptr},
+    {"no-advances",    0, G_OPTION_FLAG_REVERSE,
+                             G_OPTION_ARG_NONE,        &this->show_advances,           "Do not output glyph advances",                                         nullptr},
     {"no-clusters",    0, G_OPTION_FLAG_REVERSE,
     {"no-clusters",    0, G_OPTION_FLAG_REVERSE,
-                             G_OPTION_ARG_NONE,        &this->show_clusters,           "Do not output cluster indices",                                        NULL},
-    {"show-extents",   0, 0, G_OPTION_ARG_NONE,        &this->show_extents,            "Output glyph extents",                                                 NULL},
-    {NULL}
+                             G_OPTION_ARG_NONE,        &this->show_clusters,           "Do not output cluster indices",                                        nullptr},
+    {"show-extents",   0, 0, G_OPTION_ARG_NONE,        &this->show_extents,            "Output glyph extents",                                                 nullptr},
+    {"show-flags",     0, 0, G_OPTION_ARG_NONE,        &this->show_flags,              "Output glyph flags",                                                   nullptr},
+    {"ned",          'v', G_OPTION_FLAG_NO_ARG,
+                             G_OPTION_ARG_CALLBACK,    (gpointer) &parse_ned,          "No Extra Data; Do not output clusters or advances",                    nullptr},
+    {"trace",        'V', 0, G_OPTION_ARG_NONE,        &this->trace,                   "Output interim shaping results",                                       nullptr},
+    {nullptr}
   };
   parser->add_group (entries,
                     "output-syntax",
   };
   parser->add_group (entries,
                     "output-syntax",
@@ -794,7 +917,7 @@ format_options_t::serialize_unicode (hb_buffer_t *buffer,
                                     GString     *gs)
 {
   unsigned int num_glyphs = hb_buffer_get_length (buffer);
                                     GString     *gs)
 {
   unsigned int num_glyphs = hb_buffer_get_length (buffer);
-  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL);
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
 
   g_string_append_c (gs, '<');
   for (unsigned int i = 0; i < num_glyphs; i++)
 
   g_string_append_c (gs, '<');
   for (unsigned int i = 0; i < num_glyphs; i++)
@@ -818,7 +941,8 @@ format_options_t::serialize_glyphs (hb_buffer_t *buffer,
   unsigned int num_glyphs = hb_buffer_get_length (buffer);
   unsigned int start = 0;
 
   unsigned int num_glyphs = hb_buffer_get_length (buffer);
   unsigned int start = 0;
 
-  while (start < num_glyphs) {
+  while (start < num_glyphs)
+  {
     char buf[1024];
     unsigned int consumed;
     start += hb_buffer_serialize_glyphs (buffer, start, num_glyphs,
     char buf[1024];
     unsigned int consumed;
     start += hb_buffer_serialize_glyphs (buffer, start, num_glyphs,
@@ -845,7 +969,8 @@ format_options_t::serialize_buffer_of_text (hb_buffer_t  *buffer,
                                            hb_font_t    *font,
                                            GString      *gs)
 {
                                            hb_font_t    *font,
                                            GString      *gs)
 {
-  if (show_text) {
+  if (show_text)
+  {
     serialize_line_no (line_no, gs);
     g_string_append_c (gs, '(');
     g_string_append_len (gs, text, text_len);
     serialize_line_no (line_no, gs);
     g_string_append_c (gs, '(');
     g_string_append_len (gs, text, text_len);
@@ -853,7 +978,8 @@ format_options_t::serialize_buffer_of_text (hb_buffer_t  *buffer,
     g_string_append_c (gs, '\n');
   }
 
     g_string_append_c (gs, '\n');
   }
 
-  if (show_unicode) {
+  if (show_unicode)
+  {
     serialize_line_no (line_no, gs);
     serialize_unicode (buffer, gs);
     g_string_append_c (gs, '\n');
     serialize_line_no (line_no, gs);
     serialize_unicode (buffer, gs);
     g_string_append_c (gs, '\n');
@@ -861,11 +987,12 @@ format_options_t::serialize_buffer_of_text (hb_buffer_t  *buffer,
 }
 void
 format_options_t::serialize_message (unsigned int  line_no,
 }
 void
 format_options_t::serialize_message (unsigned int  line_no,
+                                    const char   *type,
                                     const char   *msg,
                                     GString      *gs)
 {
   serialize_line_no (line_no, gs);
                                     const char   *msg,
                                     GString      *gs)
 {
   serialize_line_no (line_no, gs);
-  g_string_append_printf (gs, "%s", msg);
+  g_string_append_printf (gs, "%s: %s", type, msg);
   g_string_append_c (gs, '\n');
 }
 void
   g_string_append_c (gs, '\n');
 }
 void
@@ -882,3 +1009,18 @@ format_options_t::serialize_buffer_of_glyphs (hb_buffer_t  *buffer,
   serialize_glyphs (buffer, font, output_format, format_flags, gs);
   g_string_append_c (gs, '\n');
 }
   serialize_glyphs (buffer, font, output_format, format_flags, gs);
   g_string_append_c (gs, '\n');
 }
+
+void
+subset_options_t::add_options (option_parser_t *parser)
+{
+  GOptionEntry entries[] =
+  {
+    {"no-hinting", 0, 0, G_OPTION_ARG_NONE,  &this->drop_hints,   "Whether to drop hints",   nullptr},
+    {nullptr}
+  };
+  parser->add_group (entries,
+         "subset",
+         "Subset options:",
+         "Options subsetting",
+         this);
+}
index 9ed4fd0..467350a 100644 (file)
 #ifndef OPTIONS_HH
 #define OPTIONS_HH
 
 #ifndef OPTIONS_HH
 #define OPTIONS_HH
 
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include "hb-private.hh"
 
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
 #include <stdio.h>
 
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
 #include <stdio.h>
+#include <assert.h>
 #include <math.h>
 #include <locale.h>
 #include <errno.h>
 #include <math.h>
 #include <locale.h>
 #include <errno.h>
 # define g_mapped_file_unref g_mapped_file_free
 #endif
 
 # define g_mapped_file_unref g_mapped_file_free
 #endif
 
-
-/* A few macros copied from hb-private.hh. */
-
-#if __GNUC__ >= 4
-#define HB_UNUSED      __attribute__((unused))
-#else
-#define HB_UNUSED
-#endif
-
-#undef MIN
-template <typename Type> static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; }
-
-#undef MAX
-template <typename Type> static inline Type MAX (const Type &a, const Type &b) { return a > b ? a : b; }
-
-#undef  ARRAY_LENGTH
-template <typename Type, unsigned int n>
-static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
-/* A const version, but does not detect erratically being called on pointers. */
-#define ARRAY_LENGTH_CONST(__array) ((signed int) (sizeof (__array) / sizeof (__array[0])))
-
-#define _ASSERT_STATIC1(_line, _cond)  HB_UNUSED typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1]
-#define _ASSERT_STATIC0(_line, _cond)  _ASSERT_STATIC1 (_line, (_cond))
-#define ASSERT_STATIC(_cond)           _ASSERT_STATIC0 (__LINE__, (_cond))
-
-
 void fail (hb_bool_t suggest_help, const char *format, ...) G_GNUC_NORETURN G_GNUC_PRINTF (2, 3);
 
 void fail (hb_bool_t suggest_help, const char *format, ...) G_GNUC_NORETURN G_GNUC_PRINTF (2, 3);
 
-
 extern hb_bool_t debug;
 
 struct option_group_t
 extern hb_bool_t debug;
 
 struct option_group_t
@@ -110,7 +81,7 @@ struct option_parser_t
   }
   ~option_parser_t (void) {
     g_option_context_free (context);
   }
   ~option_parser_t (void) {
     g_option_context_free (context);
-    g_ptr_array_foreach (to_free, (GFunc) g_free, NULL);
+    g_ptr_array_foreach (to_free, (GFunc) g_free, nullptr);
     g_ptr_array_free (to_free, TRUE);
   }
 
     g_ptr_array_free (to_free, TRUE);
   }
 
@@ -150,8 +121,8 @@ struct view_options_t : option_group_t
 {
   view_options_t (option_parser_t *parser) {
     annotate = false;
 {
   view_options_t (option_parser_t *parser) {
     annotate = false;
-    fore = NULL;
-    back = NULL;
+    fore = nullptr;
+    back = nullptr;
     line_space = 0;
     margin.t = margin.r = margin.b = margin.l = DEFAULT_MARGIN;
 
     line_space = 0;
     margin.t = margin.r = margin.b = margin.l = DEFAULT_MARGIN;
 
@@ -179,14 +150,15 @@ struct shape_options_t : option_group_t
 {
   shape_options_t (option_parser_t *parser)
   {
 {
   shape_options_t (option_parser_t *parser)
   {
-    direction = language = script = NULL;
-    bot = eot = preserve_default_ignorables = false;
-    features = NULL;
+    direction = language = script = nullptr;
+    bot = eot = preserve_default_ignorables = remove_default_ignorables = false;
+    features = nullptr;
     num_features = 0;
     num_features = 0;
-    shapers = NULL;
+    shapers = nullptr;
     utf8_clusters = false;
     cluster_level = HB_BUFFER_CLUSTER_LEVEL_DEFAULT;
     normalize_glyphs = false;
     utf8_clusters = false;
     cluster_level = HB_BUFFER_CLUSTER_LEVEL_DEFAULT;
     normalize_glyphs = false;
+    verify = false;
     num_iterations = 1;
 
     add_options (parser);
     num_iterations = 1;
 
     add_options (parser);
@@ -207,14 +179,26 @@ struct shape_options_t : option_group_t
     hb_buffer_set_direction (buffer, hb_direction_from_string (direction, -1));
     hb_buffer_set_script (buffer, hb_script_from_string (script, -1));
     hb_buffer_set_language (buffer, hb_language_from_string (language, -1));
     hb_buffer_set_direction (buffer, hb_direction_from_string (direction, -1));
     hb_buffer_set_script (buffer, hb_script_from_string (script, -1));
     hb_buffer_set_language (buffer, hb_language_from_string (language, -1));
-    hb_buffer_set_flags (buffer, (hb_buffer_flags_t) (HB_BUFFER_FLAG_DEFAULT |
-                        (bot ? HB_BUFFER_FLAG_BOT : 0) |
-                        (eot ? HB_BUFFER_FLAG_EOT : 0) |
-                        (preserve_default_ignorables ? HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES : 0)));
+    hb_buffer_set_flags (buffer, (hb_buffer_flags_t)
+                                (HB_BUFFER_FLAG_DEFAULT |
+                                 (bot ? HB_BUFFER_FLAG_BOT : 0) |
+                                 (eot ? HB_BUFFER_FLAG_EOT : 0) |
+                                 (preserve_default_ignorables ? HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES : 0) |
+                                 (remove_default_ignorables ? HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES : 0) |
+                                 0));
     hb_buffer_set_cluster_level (buffer, cluster_level);
     hb_buffer_guess_segment_properties (buffer);
   }
 
     hb_buffer_set_cluster_level (buffer, cluster_level);
     hb_buffer_guess_segment_properties (buffer);
   }
 
+  static void copy_buffer_properties (hb_buffer_t *dst, hb_buffer_t *src)
+  {
+    hb_segment_properties_t props;
+    hb_buffer_get_segment_properties (src, &props);
+    hb_buffer_set_segment_properties (dst, &props);
+    hb_buffer_set_flags (dst, hb_buffer_get_flags (src));
+    hb_buffer_set_cluster_level (dst, hb_buffer_get_cluster_level (src));
+  }
+
   void populate_buffer (hb_buffer_t *buffer, const char *text, int text_len,
                        const char *text_before, const char *text_after)
   {
   void populate_buffer (hb_buffer_t *buffer, const char *text, int text_len,
                        const char *text_before, const char *text_after)
   {
@@ -232,7 +216,7 @@ struct shape_options_t : option_group_t
       /* Reset cluster values to refer to Unicode character index
        * instead of UTF-8 index. */
       unsigned int num_glyphs = hb_buffer_get_length (buffer);
       /* Reset cluster values to refer to Unicode character index
        * instead of UTF-8 index. */
       unsigned int num_glyphs = hb_buffer_get_length (buffer);
-      hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL);
+      hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, nullptr);
       for (unsigned int i = 0; i < num_glyphs; i++)
       {
        info->cluster = i;
       for (unsigned int i = 0; i < num_glyphs; i++)
       {
        info->cluster = i;
@@ -243,12 +227,188 @@ struct shape_options_t : option_group_t
     setup_buffer (buffer);
   }
 
     setup_buffer (buffer);
   }
 
-  hb_bool_t shape (hb_font_t *font, hb_buffer_t *buffer)
+  hb_bool_t shape (hb_font_t *font, hb_buffer_t *buffer, const char **error=nullptr)
   {
   {
-    hb_bool_t res = hb_shape_full (font, buffer, features, num_features, shapers);
+    hb_buffer_t *text_buffer = nullptr;
+    if (verify)
+    {
+      text_buffer = hb_buffer_create ();
+      hb_buffer_append (text_buffer, buffer, 0, -1);
+    }
+
+    if (!hb_shape_full (font, buffer, features, num_features, shapers))
+    {
+      if (error)
+        *error = "all shapers failed.";
+      goto fail;
+    }
+
     if (normalize_glyphs)
       hb_buffer_normalize_glyphs (buffer);
     if (normalize_glyphs)
       hb_buffer_normalize_glyphs (buffer);
-    return res;
+
+    if (verify && !verify_buffer (buffer, text_buffer, font, error))
+      goto fail;
+
+    if (text_buffer)
+      hb_buffer_destroy (text_buffer);
+
+    return true;
+
+  fail:
+    if (text_buffer)
+      hb_buffer_destroy (text_buffer);
+
+    return false;
+  }
+
+  bool verify_buffer (hb_buffer_t  *buffer,
+                     hb_buffer_t  *text_buffer,
+                     hb_font_t    *font,
+                     const char  **error=nullptr)
+  {
+    if (!verify_buffer_monotone (buffer, error))
+      return false;
+    if (!verify_buffer_safe_to_break (buffer, text_buffer, font, error))
+      return false;
+    return true;
+  }
+
+  bool verify_buffer_monotone (hb_buffer_t *buffer, const char **error=nullptr)
+  {
+    /* Check that clusters are monotone. */
+    if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES ||
+       cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
+    {
+      bool is_forward = HB_DIRECTION_IS_FORWARD (hb_buffer_get_direction (buffer));
+
+      unsigned int num_glyphs;
+      hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, &num_glyphs);
+
+      for (unsigned int i = 1; i < num_glyphs; i++)
+       if (info[i-1].cluster != info[i].cluster &&
+           (info[i-1].cluster < info[i].cluster) != is_forward)
+       {
+         if (error)
+           *error = "clusters are not monotone.";
+         return false;
+       }
+    }
+
+    return true;
+  }
+
+  bool verify_buffer_safe_to_break (hb_buffer_t  *buffer,
+                                   hb_buffer_t  *text_buffer,
+                                   hb_font_t    *font,
+                                   const char  **error=nullptr)
+  {
+    if (cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES &&
+       cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
+    {
+      /* Cannot perform this check without monotone clusters.
+       * Then again, unsafe-to-break flag is much harder to use without
+       * monotone clusters. */
+      return true;
+    }
+
+    /* Check that breaking up shaping at safe-to-break is indeed safe. */
+
+    hb_buffer_t *fragment = hb_buffer_create ();
+    hb_buffer_t *reconstruction = hb_buffer_create ();
+    copy_buffer_properties (reconstruction, buffer);
+
+    unsigned int num_glyphs;
+    hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, &num_glyphs);
+
+    unsigned int num_chars;
+    hb_glyph_info_t *text = hb_buffer_get_glyph_infos (text_buffer, &num_chars);
+
+    /* Chop text and shape fragments. */
+    bool forward = HB_DIRECTION_IS_FORWARD (hb_buffer_get_direction (buffer));
+    unsigned int start = 0;
+    unsigned int text_start = forward ? 0 : num_chars;
+    unsigned int text_end = text_start;
+    for (unsigned int end = 1; end < num_glyphs + 1; end++)
+    {
+      if (end < num_glyphs &&
+         (info[end].cluster == info[end-1].cluster ||
+          info[end-(forward?0:1)].mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK))
+         continue;
+
+      /* Shape segment corresponding to glyphs start..end. */
+      if (end == num_glyphs)
+      {
+        if (forward)
+         text_end = num_chars;
+       else
+         text_start = 0;
+      }
+      else
+      {
+       if (forward)
+       {
+         unsigned int cluster = info[end].cluster;
+         while (text_end < num_chars && text[text_end].cluster < cluster)
+           text_end++;
+       }
+       else
+       {
+         unsigned int cluster = info[end - 1].cluster;
+         while (text_start && text[text_start - 1].cluster >= cluster)
+           text_start--;
+       }
+      }
+      assert (text_start < text_end);
+
+      if (0)
+       printf("start %d end %d text start %d end %d\n", start, end, text_start, text_end);
+
+      hb_buffer_clear_contents (fragment);
+      copy_buffer_properties (fragment, buffer);
+
+      /* TODO: Add pre/post context text. */
+      hb_buffer_flags_t flags = hb_buffer_get_flags (fragment);
+      if (0 < text_start)
+        flags = (hb_buffer_flags_t) (flags & ~HB_BUFFER_FLAG_BOT);
+      if (text_end < num_chars)
+        flags = (hb_buffer_flags_t) (flags & ~HB_BUFFER_FLAG_EOT);
+      hb_buffer_set_flags (fragment, flags);
+
+      hb_buffer_append (fragment, text_buffer, text_start, text_end);
+      if (!hb_shape_full (font, fragment, features, num_features, shapers))
+      {
+       if (error)
+         *error = "all shapers failed while shaping fragment.";
+       hb_buffer_destroy (reconstruction);
+       hb_buffer_destroy (fragment);
+       return false;
+      }
+      hb_buffer_append (reconstruction, fragment, 0, -1);
+
+      start = end;
+      if (forward)
+       text_start = text_end;
+      else
+       text_end = text_start;
+    }
+
+    bool ret = true;
+    hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
+    if (diff)
+    {
+      if (error)
+       *error = "Safe-to-break test failed.";
+      ret = false;
+
+      /* Return the reconstructed result instead so it can be inspected. */
+      hb_buffer_set_length (buffer, 0);
+      hb_buffer_append (buffer, reconstruction, 0, -1);
+    }
+
+    hb_buffer_destroy (reconstruction);
+    hb_buffer_destroy (fragment);
+
+    return ret;
   }
 
   void shape_closure (const char *text, int text_len,
   }
 
   void shape_closure (const char *text, int text_len,
@@ -270,6 +430,7 @@ struct shape_options_t : option_group_t
   hb_bool_t bot;
   hb_bool_t eot;
   hb_bool_t preserve_default_ignorables;
   hb_bool_t bot;
   hb_bool_t eot;
   hb_bool_t preserve_default_ignorables;
+  hb_bool_t remove_default_ignorables;
 
   hb_feature_t *features;
   unsigned int num_features;
 
   hb_feature_t *features;
   unsigned int num_features;
@@ -277,6 +438,7 @@ struct shape_options_t : option_group_t
   hb_bool_t utf8_clusters;
   hb_buffer_cluster_level_t cluster_level;
   hb_bool_t normalize_glyphs;
   hb_bool_t utf8_clusters;
   hb_buffer_cluster_level_t cluster_level;
   hb_bool_t normalize_glyphs;
+  hb_bool_t verify;
   unsigned int num_iterations;
 };
 
   unsigned int num_iterations;
 };
 
@@ -287,16 +449,19 @@ struct font_options_t : option_group_t
                  int default_font_size_,
                  unsigned int subpixel_bits_)
   {
                  int default_font_size_,
                  unsigned int subpixel_bits_)
   {
-    variations = NULL;
+    variations = nullptr;
     num_variations = 0;
     default_font_size = default_font_size_;
     num_variations = 0;
     default_font_size = default_font_size_;
+    x_ppem = 0;
+    y_ppem = 0;
+    ptem = 0.;
     subpixel_bits = subpixel_bits_;
     subpixel_bits = subpixel_bits_;
-    font_file = NULL;
+    font_file = nullptr;
     face_index = 0;
     font_size_x = font_size_y = default_font_size;
     face_index = 0;
     font_size_x = font_size_y = default_font_size;
-    font_funcs = NULL;
+    font_funcs = nullptr;
 
 
-    font = NULL;
+    font = nullptr;
 
     add_options (parser);
   }
 
     add_options (parser);
   }
@@ -316,6 +481,9 @@ struct font_options_t : option_group_t
   hb_variation_t *variations;
   unsigned int num_variations;
   int default_font_size;
   hb_variation_t *variations;
   unsigned int num_variations;
   int default_font_size;
+  int x_ppem;
+  int y_ppem;
+  double ptem;
   unsigned int subpixel_bits;
   mutable double font_size_x;
   mutable double font_size_y;
   unsigned int subpixel_bits;
   mutable double font_size_x;
   mutable double font_size_y;
@@ -329,15 +497,15 @@ struct font_options_t : option_group_t
 struct text_options_t : option_group_t
 {
   text_options_t (option_parser_t *parser) {
 struct text_options_t : option_group_t
 {
   text_options_t (option_parser_t *parser) {
-    text_before = NULL;
-    text_after = NULL;
+    text_before = nullptr;
+    text_after = nullptr;
 
 
-    text = NULL;
-    text_file = NULL;
+    text = nullptr;
+    text_file = nullptr;
 
 
-    fp = NULL;
-    gs = NULL;
-    line = NULL;
+    fp = nullptr;
+    gs = nullptr;
+    line = nullptr;
     line_len = (unsigned int) -1;
 
     add_options (parser);
     line_len = (unsigned int) -1;
 
     add_options (parser);
@@ -380,13 +548,13 @@ struct text_options_t : option_group_t
 struct output_options_t : option_group_t
 {
   output_options_t (option_parser_t *parser,
 struct output_options_t : option_group_t
 {
   output_options_t (option_parser_t *parser,
-                   const char **supported_formats_ = NULL) {
-    output_file = NULL;
-    output_format = NULL;
+                   const char **supported_formats_ = nullptr) {
+    output_file = nullptr;
+    output_format = nullptr;
     supported_formats = supported_formats_;
     explicit_output_format = false;
 
     supported_formats = supported_formats_;
     explicit_output_format = false;
 
-    fp = NULL;
+    fp = nullptr;
 
     add_options (parser);
   }
 
     add_options (parser);
   }
@@ -414,7 +582,7 @@ struct output_options_t : option_group_t
     }
 
     if (output_file && 0 == strcmp (output_file, "-"))
     }
 
     if (output_file && 0 == strcmp (output_file, "-"))
-      output_file = NULL; /* STDOUT */
+      output_file = nullptr; /* STDOUT */
   }
 
   FILE *get_file_handle (void);
   }
 
   FILE *get_file_handle (void);
@@ -432,11 +600,14 @@ struct format_options_t : option_group_t
   format_options_t (option_parser_t *parser) {
     show_glyph_names = true;
     show_positions = true;
   format_options_t (option_parser_t *parser) {
     show_glyph_names = true;
     show_positions = true;
+    show_advances = true;
     show_clusters = true;
     show_text = false;
     show_unicode = false;
     show_line_num = false;
     show_extents = false;
     show_clusters = true;
     show_text = false;
     show_unicode = false;
     show_line_num = false;
     show_extents = false;
+    show_flags = false;
+    trace = false;
 
     add_options (parser);
   }
 
     add_options (parser);
   }
@@ -459,6 +630,7 @@ struct format_options_t : option_group_t
                                 hb_font_t    *font,
                                 GString      *gs);
   void serialize_message (unsigned int  line_no,
                                 hb_font_t    *font,
                                 GString      *gs);
   void serialize_message (unsigned int  line_no,
+                         const char   *type,
                          const char   *msg,
                          GString      *gs);
   void serialize_buffer_of_glyphs (hb_buffer_t  *buffer,
                          const char   *msg,
                          GString      *gs);
   void serialize_buffer_of_glyphs (hb_buffer_t  *buffer,
@@ -473,11 +645,28 @@ struct format_options_t : option_group_t
 
   hb_bool_t show_glyph_names;
   hb_bool_t show_positions;
 
   hb_bool_t show_glyph_names;
   hb_bool_t show_positions;
+  hb_bool_t show_advances;
   hb_bool_t show_clusters;
   hb_bool_t show_text;
   hb_bool_t show_unicode;
   hb_bool_t show_line_num;
   hb_bool_t show_extents;
   hb_bool_t show_clusters;
   hb_bool_t show_text;
   hb_bool_t show_unicode;
   hb_bool_t show_line_num;
   hb_bool_t show_extents;
+  hb_bool_t show_flags;
+  hb_bool_t trace;
+};
+
+struct subset_options_t : option_group_t
+{
+  subset_options_t (option_parser_t *parser)
+  {
+    drop_hints = false;
+
+    add_options (parser);
+  }
+
+  void add_options (option_parser_t *parser);
+
+  hb_bool_t drop_hints;
 };
 
 /* fallback implementation for scalbn()/scalbnf() for pre-2013 MSVC */
 };
 
 /* fallback implementation for scalbn()/scalbnf() for pre-2013 MSVC */
index 422c8cd..fa419f1 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
-#include "options.hh"
-
 #ifndef HB_SHAPE_CONSUMER_HH
 #define HB_SHAPE_CONSUMER_HH
 
 #ifndef HB_SHAPE_CONSUMER_HH
 #define HB_SHAPE_CONSUMER_HH
 
+#include "hb-private.hh"
+#include "options.hh"
+
 
 template <typename output_t>
 struct shape_consumer_t
 
 template <typename output_t>
 struct shape_consumer_t
@@ -37,16 +38,19 @@ struct shape_consumer_t
                  : failed (false),
                    shaper (parser),
                    output (parser),
                  : failed (false),
                    shaper (parser),
                    output (parser),
-                   font (NULL) {}
+                   font (nullptr),
+                   buffer (nullptr) {}
 
 
-  void init (const font_options_t *font_opts)
+  void init (hb_buffer_t  *buffer_,
+            const font_options_t *font_opts)
   {
     font = hb_font_reference (font_opts->get_font ());
   {
     font = hb_font_reference (font_opts->get_font ());
-    output.init (font_opts);
     failed = false;
     failed = false;
+    buffer = hb_buffer_reference (buffer_);
+
+    output.init (buffer, font_opts);
   }
   }
-  void consume_line (hb_buffer_t  *buffer,
-                    const char   *text,
+  void consume_line (const char   *text,
                     unsigned int  text_len,
                     const char   *text_before,
                     const char   *text_after)
                     unsigned int  text_len,
                     const char   *text_before,
                     const char   *text_after)
@@ -55,14 +59,19 @@ struct shape_consumer_t
 
     for (unsigned int n = shaper.num_iterations; n; n--)
     {
 
     for (unsigned int n = shaper.num_iterations; n; n--)
     {
+      const char *error = nullptr;
+
       shaper.populate_buffer (buffer, text, text_len, text_before, text_after);
       if (n == 1)
        output.consume_text (buffer, text, text_len, shaper.utf8_clusters);
       shaper.populate_buffer (buffer, text, text_len, text_before, text_after);
       if (n == 1)
        output.consume_text (buffer, text, text_len, shaper.utf8_clusters);
-      if (!shaper.shape (font, buffer)) {
+      if (!shaper.shape (font, buffer, &error))
+      {
        failed = true;
        failed = true;
-       hb_buffer_set_length (buffer, 0);
-       output.shape_failed (buffer, text, text_len, shaper.utf8_clusters);
-       return;
+       output.error (error);
+       if (hb_buffer_get_content_type (buffer) == HB_BUFFER_CONTENT_TYPE_GLYPHS)
+         break;
+       else
+         return;
       }
     }
 
       }
     }
 
@@ -70,9 +79,11 @@ struct shape_consumer_t
   }
   void finish (const font_options_t *font_opts)
   {
   }
   void finish (const font_options_t *font_opts)
   {
-    output.finish (font_opts);
+    output.finish (buffer, font_opts);
     hb_font_destroy (font);
     hb_font_destroy (font);
-    font = NULL;
+    font = nullptr;
+    hb_buffer_destroy (buffer);
+    buffer = nullptr;
   }
 
   public:
   }
 
   public:
@@ -83,6 +94,7 @@ struct shape_consumer_t
   output_t output;
 
   hb_font_t *font;
   output_t output;
 
   hb_font_t *font;
+  hb_buffer_t *buffer;
 };
 
 
 };
 
 
index f55d4bb..d28c3cd 100644 (file)
  * Google Author(s): Behdad Esfahbod
  */
 
  * Google Author(s): Behdad Esfahbod
  */
 
-#include "options.hh"
-#include "helper-cairo.hh"
-
 #ifndef VIEW_CAIRO_HH
 #define VIEW_CAIRO_HH
 
 #ifndef VIEW_CAIRO_HH
 #define VIEW_CAIRO_HH
 
+#include "hb-private.hh"
+#include "options.hh"
+#include "helper-cairo.hh"
+
 
 struct view_cairo_t
 {
 
 struct view_cairo_t
 {
@@ -43,7 +44,7 @@ struct view_cairo_t
       cairo_debug_reset_static_data ();
   }
 
       cairo_debug_reset_static_data ();
   }
 
-  void init (const font_options_t *font_opts)
+  void init (hb_buffer_t *buffer, const font_options_t *font_opts)
   {
     lines = g_array_new (false, false, sizeof (helper_cairo_line_t));
     scale_bits = -font_opts->subpixel_bits;
   {
     lines = g_array_new (false, false, sizeof (helper_cairo_line_t));
     scale_bits = -font_opts->subpixel_bits;
@@ -57,12 +58,9 @@ struct view_cairo_t
                     hb_bool_t     utf8_clusters)
   {
   }
                     hb_bool_t     utf8_clusters)
   {
   }
-  void shape_failed (hb_buffer_t  *buffer,
-                    const char   *text,
-                    unsigned int  text_len,
-                    hb_bool_t     utf8_clusters)
+  void error (const char *message)
   {
   {
-    fail (false, "all shapers failed");
+    g_printerr ("%s: %s\n", g_get_prgname (), message);
   }
   void consume_glyphs (hb_buffer_t  *buffer,
                       const char   *text,
   }
   void consume_glyphs (hb_buffer_t  *buffer,
                       const char   *text,
@@ -74,7 +72,7 @@ struct view_cairo_t
     helper_cairo_line_from_buffer (&l, buffer, text, text_len, scale_bits, utf8_clusters);
     g_array_append_val (lines, l);
   }
     helper_cairo_line_from_buffer (&l, buffer, text, text_len, scale_bits, utf8_clusters);
     g_array_append_val (lines, l);
   }
-  void finish (const font_options_t *font_opts)
+  void finish (hb_buffer_t *buffer, const font_options_t *font_opts)
   {
     render (font_opts);
 
   {
     render (font_opts);
 
diff --git a/win32/Makefile.am b/win32/Makefile.am
deleted file mode 100644 (file)
index 63ba468..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-EXTRA_DIST = \
-       build-rules-msvc.mak \
-       config-msvc.mak \
-       config.h.win32 \
-       create-lists.bat \
-       create-lists-msvc.mak \
-       detectenv-msvc.mak \
-       generate-msvc.mak \
-       hb-introspection-msvc.mak \
-       info-msvc.mak \
-       install.mak \
-       introspection-msvc.mak \
-       Makefile.vc \
-       README.txt
-
--include $(top_srcdir)/git.mk
diff --git a/win32/Makefile.vc b/win32/Makefile.vc
deleted file mode 100644 (file)
index 05778ae..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-# NMake Makefile for building HarfBuzz as a DLL on Windows
-
-# The items below this line should not be changed, unless one is maintaining
-# the NMake Makefiles.  Customizations can be done in the following NMake Makefile
-# portions (please see comments in the these files to see what can be customized):
-#
-# detectenv-msvc.mak
-# config-msvc.mak
-
-!include detectenv-msvc.mak
-
-# Include the Makefile portions with the source listings
-!include ..\src\Makefile.sources
-!include ..\src\hb-ucdn\Makefile.sources
-!include ..\util\Makefile.sources
-
-# We need to include the sources in ..\src\hb-ucdn indirectly
-!if [call create-lists.bat header hb_ucdn_srcs.mak hb_ucdn_SRCS]
-!endif
-
-!if [for %c in ($(LIBHB_UCDN_sources)) do @call create-lists.bat file hb_ucdn_srcs.mak hb-ucdn\%c]
-!endif
-
-!if [call create-lists.bat footer hb_ucdn_srcs.mak]
-!endif
-
-!include hb_ucdn_srcs.mak
-
-!if [del /f /q hb_ucdn_srcs.mak]
-!endif
-
-# Include the Makefile portion that enables features based on user input
-!include config-msvc.mak
-
-!if "$(VALID_CFGSET)" == "TRUE"
-
-# Include the Makefile portion to convert the source and header lists
-# into the lists we need for compilation and introspection
-!include create-lists-msvc.mak
-
-all: $(HB_LIBS) $(HB_UTILS) $(EXTRA_TARGETS) all-build-info
-
-tests: all $(HB_TESTS)
-
-# Include the build rules for sources, DLLs and executables
-!include build-rules-msvc.mak
-
-# Include the rules for build directory creation and code generation
-!include generate-msvc.mak
-
-# Generate the introspection files
-
-!if "$(INTROSPECTION)" == "1"
-# Include the rules for building the introspection files
-!include introspection-msvc.mak
-!include hb-introspection-msvc.mak
-!endif
-
-!include install.mak
-
-!else
-all: help
-       @echo You need to specify a valid configuration, via
-       @echo CFG=release or CFG=debug
-!endif
-
-!include info-msvc.mak
diff --git a/win32/README.txt b/win32/README.txt
deleted file mode 100644 (file)
index dc31e8b..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-Instructions for building HarfBuzz on Visual Studio\r
-===================================================\r
-Building the HarfBuzz DLL on Windows is now also supported using Visual Studio\r
-versions 2008 through 2015, in both 32-bit and 64-bit (x64) flavors, via NMake\r
-Makefiles.\r
-\r
-The following are instructions for performing such a build, as there is a\r
-number of build configurations supported for the build.  Note that for all\r
-build configurations, the OpenType and Simple TrueType layout (fallback)\r
-backends are enabled, and this is the base configuration that is built if no\r
-options (see below) are specified.  A 'clean' target is provided-it is recommended\r
-that one cleans the build and redo the build if any configuration option changed.\r
-An 'install' target is also provided to copy the built items in their appropriate\r
-locations under $(PREFIX), which is described below.\r
-\r
-Invoke the build by issuing the command:\r
-nmake /f Makefile.vc CFG=[release|debug] [PREFIX=...] <option1=1 option2=1 ...>\r
-where:\r
-\r
-CFG: Required.  Choose from a release or debug build.  Note that \r
-     all builds generate a .pdb file for each .dll and .exe built--this refers\r
-     to the C/C++ runtime that the build uses.\r
-\r
-PREFIX: Optional.  Base directory of where the third-party headers, libraries\r
-        and needed tools can be found, i.e. headers in $(PREFIX)\include,\r
-        libraries in $(PREFIX)\lib and tools in $(PREFIX)\bin.  If not\r
-        specified, $(PREFIX) is set as $(srcroot)\..\vs$(X)\$(platform), where\r
-        $(platform) is win32 for 32-bit builds or x64 for 64-bit builds, and\r
-        $(X) is the short version of the Visual Studio used, as follows:\r
-        2008: 9\r
-        2010: 10\r
-        2012: 11\r
-        2013: 12\r
-        2015: 14\r
-\r
-Explanation of options, set by <option>=1:\r
-------------------------------------------\r
-GLIB: Enable GLib support in HarfBuzz, which also uses the GLib unicode\r
-      callback if the bundled UCDN unicode callback is disabled.  This requires the\r
-      GLib libraries, and is required for building all tool and test programs.\r
-\r
-GOBJECT: Enable building the HarfBuzz-GObject DLL, and thus implies GLib\r
-         support.  This requires the GObject libraries and glib-mkenums script,\r
-         along with PERL to generate the enum sources and headers, which is\r
-         required for the build.\r
-\r
-INTROSPECTION: Enable build of introspection files, for making HarfBuzz\r
-               bindings for other programming languages available, such as\r
-               Python, available.  This requires the GObject-Introspection\r
-               libraries and tools, along with the Python interpretor that was\r
-               used during the build of GObject-Introspection.  Please see\r
-               $(srcroot)\README.python for more related details.  This implies\r
-               the build of the HarfBuzz-GObject DLL, along with GLib support.\r
-\r
-FREETYPE: Enable the FreeType font callbacks.  Requires the FreeType2 library.\r
-\r
-CAIRO: Enable Cairo support.  Requires the Cairo library.\r
-\r
-CAIRO_FT: Enable the build of the hb-view tool, which makes use of Cairo, and\r
-          thus implies FreeType font callback support and Cairo support.\r
-          Requires Cairo libraries built with FreeType support.  Note that the\r
-          hb-view tool requires GLib support as well.\r
-\r
-GRAPHITE2: Enable the Graphite2 shaper, requires the SIL Graphite2 library.\r
-\r
-ICU: Enables the build of ICU Unicode functions. Requires the ICU libraries.\r
-\r
-UNISCRIBE: Enable Uniscribe platform shaper support.\r
-\r
-DIRECTWRITE: Enable DirectWrite platform shaper support,\r
-             requires a rather recent Windows SDK, and at least Windows Vista/\r
-             Server 2008 with SP2 and platform update.\r
-\r
-PYTHON: Full path to the Python interpretor to be used, if it is not in %PATH%.\r
-\r
-PERL: Full path to the PERL interpretor to be used, if it is not in %PATH%.\r
-\r
-LIBTOOL_DLL_NAME: Enable libtool-style DLL names.\r
diff --git a/win32/build-rules-msvc.mak b/win32/build-rules-msvc.mak
deleted file mode 100644 (file)
index bfe0286..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-# NMake Makefile portion for compilation rules
-# Items in here should not need to be edited unless
-# one is maintaining the NMake build files.  The format
-# of NMake Makefiles here are different from the GNU
-# Makefiles.  Please see the comments about these formats.
-
-# Inference rules for compiling the .obj files.
-# Used for libs and programs with more than a single source file.
-# Format is as follows
-# (all dirs must have a trailing '\'):
-#
-# {$(srcdir)}.$(srcext){$(destdir)}.obj::
-#      $(CC)|$(CXX) $(cflags) /Fo$(destdir) /c @<<
-# $<
-# <<
-{..\src\}.cc{$(CFG)\$(PLAT)\harfbuzz\}.obj::
-       $(CXX) $(CFLAGS) $(HB_DEFINES) $(HB_LIB_CFLAGS) /Fo$(CFG)\$(PLAT)\harfbuzz\ /c @<<
-$<
-<<
-
-{..\src\hb-ucdn\}.c{$(CFG)\$(PLAT)\harfbuzz\}.obj::
-       $(CC) $(CFLAGS) /Fo$(CFG)\$(PLAT)\harfbuzz\ /c @<<
-$<
-<<
-
-{..\util\}.cc{$(CFG)\$(PLAT)\util\}.obj::
-       $(CXX) $(CFLAGS) $(HB_DEFINES) $(HB_CFLAGS) /Fo$(CFG)\$(PLAT)\util\ /c @<<
-$<
-<<
-
-# Inference rules for building the test programs
-# Used for programs with a single source file.
-# Format is as follows
-# (all dirs must have a trailing '\'):
-#
-# {$(srcdir)}.$(srcext){$(destdir)}.exe::
-#      $(CC)|$(CXX) $(cflags) $< /Fo$*.obj  /Fe$@ [/link $(linker_flags) $(dep_libs)]
-{..\src\}.cc{$(CFG)\$(PLAT)\}.exe:
-       $(CXX) $(CFLAGS) $(HB_DEFINES) $(HB_CFLAGS) $< /Fo$*.obj  /Fe$@ /link $(LDFLAGS) $(CFG)\$(PLAT)\harfbuzz.lib $(HB_TESTS_DEP_LIBS)
-
-{..\test\api\}.c{$(CFG)\$(PLAT)\}.exe:
-       $(CXX) $(CFLAGS) $(HB_DEFINES) $(HB_CFLAGS) /DSRCDIR="\"../../../test/api\"" $< /Fo$*.obj /Fe$@ /link $(LDFLAGS) $(CFG)\$(PLAT)\harfbuzz.lib $(HB_TESTS_DEP_LIBS)
-
-# Rules for building .lib files
-$(CFG)\$(PLAT)\harfbuzz.lib: $(HARFBUZZ_DLL_FILENAME).dll
-$(CFG)\$(PLAT)\harfbuzz-gobject.lib: $(HARFBUZZ_GOBJECT_DLL_FILENAME).dll
-
-# Rules for linking DLLs
-# Format is as follows (the mt command is needed for MSVC 2005/2008 builds):
-# $(dll_name_with_path): $(dependent_libs_files_objects_and_items)
-#      link /DLL [$(linker_flags)] [$(dependent_libs)] [/def:$(def_file_if_used)] [/implib:$(lib_name_if_needed)] -out:$@ @<<
-# $(dependent_objects)
-# <<
-#      @-if exist $@.manifest mt /manifest $@.manifest /outputresource:$@;2
-$(HARFBUZZ_DLL_FILENAME).dll: config.h $(harfbuzz_dll_OBJS) $(CFG)\$(PLAT)\harfbuzz
-       link /DLL $(LDFLAGS) $(HB_DEP_LIBS) /implib:$(CFG)\$(PLAT)\harfbuzz.lib -out:$@ @<<
-$(harfbuzz_dll_OBJS)
-<<
-       @-if exist $@.manifest mt /manifest $@.manifest /outputresource:$@;2
-
-$(HARFBUZZ_GOBJECT_DLL_FILENAME).dll: $(CFG)\$(PLAT)\harfbuzz.lib $(harfbuzz_gobject_OBJS) $(CFG)\$(PLAT)\harfbuzz-gobject
-       link /DLL $(LDFLAGS) $(CFG)\$(PLAT)\harfbuzz.lib $(HB_GOBJECT_DEP_LIBS) /implib:$(CFG)\$(PLAT)\harfbuzz-gobject.lib -out:$@ @<<
-$(harfbuzz_gobject_OBJS)
-<<
-       @-if exist $@.manifest mt /manifest $@.manifest /outputresource:$@;2
-
-# Rules for linking Executables
-# Format is as follows (the mt command is needed for MSVC 2005/2008 builds):
-# $(dll_name_with_path): $(dependent_libs_files_objects_and_items)
-#      link [$(linker_flags)] [$(dependent_libs)] -out:$@ @<<
-# $(dependent_objects)
-# <<
-#      @-if exist $@.manifest mt /manifest $@.manifest /outputresource:$@;1
-$(CFG)\$(PLAT)\hb-view.exe: $(CFG)\$(PLAT)\harfbuzz.lib $(CFG)\$(PLAT)\util $(hb_view_OBJS)
-       link $(LDFLAGS) $(CFG)\$(PLAT)\harfbuzz.lib $(HB_UTILS_DEP_LIBS) -out:$@ @<<
-$(hb_view_OBJS)
-<<
-       @-if exist $@.manifest mt /manifest $@.manifest /outputresource:$@;1
-
-$(CFG)\$(PLAT)\hb-shape.exe: $(CFG)\$(PLAT)\harfbuzz.lib $(CFG)\$(PLAT)\util $(hb_shape_OBJS)
-       link $(LDFLAGS) $(CFG)\$(PLAT)\harfbuzz.lib $(HB_UTILS_DEP_LIBS) -out:$@ @<<
-$(hb_shape_OBJS)
-<<
-       @-if exist $@.manifest mt /manifest $@.manifest /outputresource:$@;1
-
-$(CFG)\$(PLAT)\hb-ot-shape-closure.exe: $(CFG)\$(PLAT)\harfbuzz.lib $(CFG)\$(PLAT)\util $(hb_ot_shape_closure_OBJS)
-       link $(LDFLAGS) $(CFG)\$(PLAT)\harfbuzz.lib $(HB_UTILS_DEP_LIBS) -out:$@ @<<
-$(hb_ot_shape_closure_OBJS)
-<<
-       @-if exist $@.manifest mt /manifest $@.manifest /outputresource:$@;1
-
-# Other .obj files requiring individual attention, that could not be covered by the inference rules.
-# Format is as follows (all dirs must have a trailing '\'):
-#
-# $(obj_file):
-#      $(CC)|$(CXX) $(cflags) /Fo$(obj_destdir) /c @<<
-# $(srcfile)
-# <<
-$(CFG)\$(PLAT)\harfbuzz-gobject\hb-gobject-structs.obj:        $(CFG)\$(PLAT)\harfbuzz-gobject $(HB_GOBJECT_ENUM_GENERATED_SOURCES)
-       $(CXX) $(CFLAGS) $(HB_DEFINES) $(HB_LIB_CFLAGS) /I$(CFG)\$(PLAT)\harfbuzz-gobject /Fo$(CFG)\$(PLAT)\harfbuzz-gobject\ /c @<<
-..\src\hb-gobject-structs.cc
-<<
-
-$(CFG)\$(PLAT)\harfbuzz-gobject\hb-gobject-enums.obj: $(CFG)\$(PLAT)\harfbuzz-gobject $(HB_GOBJECT_ENUM_GENERATED_SOURCES)
-       $(CXX) $(CFLAGS) $(HB_DEFINES) $(HB_LIB_CFLAGS) /I$(CFG)\$(PLAT)\harfbuzz-gobject /Fo$(CFG)\$(PLAT)\harfbuzz-gobject\ /c @<<
-$(CFG)\$(PLAT)\harfbuzz-gobject\hb-gobject-enums.cc
-<<
-
-clean:
-       @-if exist $(CFG)\$(PLAT)\HarfBuzz-0.0.typelib del /f /q $(CFG)\$(PLAT)\HarfBuzz-0.0.typelib
-       @-if exist $(CFG)\$(PLAT)\HarfBuzz-0.0.gir del /f /q $(CFG)\$(PLAT)\HarfBuzz-0.0.gir
-       @-if exist $(CFG)\$(PLAT)\hb_list del /f /q $(CFG)\$(PLAT)\hb_list
-       @-del /f /q $(CFG)\$(PLAT)\*.pdb
-       @-if exist $(CFG)\$(PLAT)\.exe.manifest del /f /q $(CFG)\$(PLAT)\*.exe.manifest
-       @-if exist $(CFG)\$(PLAT)\.exe del /f /q $(CFG)\$(PLAT)\*.exe
-       @-del /f /q $(CFG)\$(PLAT)\*.dll.manifest
-       @-del /f /q $(CFG)\$(PLAT)\*.dll
-       @-del /f /q $(CFG)\$(PLAT)\*.ilk
-       @-del /f /q $(CFG)\$(PLAT)\*.obj
-       @-if exist $(CFG)\$(PLAT)\util del /f /q $(CFG)\$(PLAT)\util\*.obj
-       @-if exist $(CFG)\$(PLAT)\harfbuzz-gobject del /f /q $(CFG)\$(PLAT)\harfbuzz-gobject\*.obj
-       @-del /f /q $(CFG)\$(PLAT)\harfbuzz\*.obj
-       @-rmdir /s /q $(CFG)\$(PLAT)
-       @-if exist $(CFG)\$(PLAT)\harfbuzz-gobject\hb-gobject-enums.h del $(CFG)\$(PLAT)\harfbuzz-gobject\hb-gobject-enums.h
-       @-if exist $(CFG)\$(PLAT)\harfbuzz-gobject\hb-gobject-enums.cc del $(CFG)\$(PLAT)\harfbuzz-gobject\hb-gobject-enums.cc
-       @-del vc$(VSVER)0.pdb
-       @-del config.h
diff --git a/win32/config-msvc.mak b/win32/config-msvc.mak
deleted file mode 100644 (file)
index 6865bed..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-# NMake Makefile portion for enabling features for Windows builds
-
-# You may change these lines to customize the .lib files that will be linked to
-# Additional Libraries for building HarfBuzz-ICU
-# icudt.lib may be required for static ICU builds
-HB_ICU_DEP_LIBS = icuuc.lib
-
-# GLib is required for all utility programs and tests
-HB_GLIB_LIBS = glib-2.0.lib
-
-# Needed for building HarfBuzz-GObject
-HB_GOBJECT_DEP_LIBS = gobject-2.0.lib $(HB_GLIB_LIBS)
-
-# Freetype is needed for building FreeType support and hb-view
-!if "$(CFG)" == "debug"
-FREETYPE_LIB = freetyped.lib
-!else
-FREETYPE_LIB = freetype.lib
-!endif
-
-# Cairo is needed for building hb-view
-CAIRO_LIB = cairo.lib
-
-# Graphite2 is needed for building SIL Graphite2 support
-GRAPHITE2_LIB = graphite2.lib
-
-# Uniscribe is needed for Uniscribe shaping support
-UNISCRIBE_LIB = usp10.lib gdi32.lib rpcrt4.lib user32.lib
-
-# Directwrite is needed for DirectWrite shaping support
-DIRECTWRITE_LIB = dwrite.lib
-
-# Please do not change anything beneath this line unless maintaining the NMake Makefiles
-# Bare minimum features and sources built into HarfBuzz on Windows
-HB_DEFINES =
-HB_CFLAGS = /DHAVE_CONFIG_H
-HB_UCDN_CFLAGS = /I..\src\hb-ucdn
-HB_SOURCES =   \
-       $(HB_BASE_sources)                      \
-       $(HB_BASE_RAGEL_GENERATED_sources)      \
-       $(HB_FALLBACK_sources)                  \
-       $(HB_OT_sources)                        \
-       $(HB_OT_RAGEL_GENERATED_sources)
-
-
-HB_HEADERS =   \
-       $(HB_BASE_headers)              \
-       $(HB_NODIST_headers)    \
-       $(HB_OT_headers)
-
-# Minimal set of (system) libraries needed for the HarfBuzz DLL
-HB_DEP_LIBS =
-
-# We build the HarfBuzz DLL/LIB at least
-HB_LIBS = $(CFG)\$(PLAT)\harfbuzz.lib
-
-# Note: All the utility and test programs require GLib support to be present!
-HB_UTILS =
-HB_UTILS_DEP_LIBS = $(HB_GLIB_LIBS)
-HB_TESTS =
-HB_TESTS_DEP_LIBS = $(HB_GLIB_LIBS)
-
-# Use libtool-style DLL names, if desired
-!if "$(LIBTOOL_DLL_NAME)" == "1"
-HARFBUZZ_DLL_FILENAME = $(CFG)\$(PLAT)\libharfbuzz-0
-HARFBUZZ_GOBJECT_DLL_FILENAME = $(CFG)\$(PLAT)\libharfbuzz-gobject-0
-!else
-HARFBUZZ_DLL_FILENAME = $(CFG)\$(PLAT)\harfbuzz-vs$(VSVER)
-HARFBUZZ_GOBJECT_DLL_FILENAME = $(CFG)\$(PLAT)\harfbuzz-gobject-vs$(VSVER)
-!endif
-
-# Enable Introspection (enables HarfBuzz-Gobject as well)
-!if "$(INTROSPECTION)" == "1"
-GOBJECT = 1
-CHECK_PACKAGE = gobject-2.0
-EXTRA_TARGETS = $(CFG)\$(PLAT)\HarfBuzz-0.0.gir $(CFG)\$(PLAT)\HarfBuzz-0.0.typelib
-!else
-EXTRA_TARGETS =
-!endif
-
-# Enable HarfBuzz-GObject (enables GLib support as well)
-!if "$(GOBJECT)" == "1"
-GLIB = 1
-HB_LIBS =      \
-       $(HB_LIBS)      \
-       $(CFG)\$(PLAT)\harfbuzz-gobject.lib
-
-HB_GOBJECT_ENUM_GENERATED_SOURCES = \
-       $(CFG)\$(PLAT)\harfbuzz-gobject\hb-gobject-enums.cc     \
-       $(CFG)\$(PLAT)\harfbuzz-gobject\hb-gobject-enums.h
-
-!endif
-
-# Enable cairo-ft (enables cairo and freetype as well)
-!if "$(CAIRO_FT)" == "1"
-HB_DEFINES = $(HB_DEFINES) /DHAVE_CAIRO_FT=1
-CAIRO = 1
-FREETYPE = 1
-!if "$(GLIB)" == "1"
-HB_UTILS = \
-       $(HB_UTILS)     \
-       $(CFG)\$(PLAT)\hb-view.exe
-
-HB_UTILS_DEP_LIBS = $(HB_UTILS_DEP_LIBS) $(CAIRO_LIB) $(FREETYPE_LIB)
-!else
-!if [echo Warning: GLib support not enabled, hb-view not built]
-!endif
-!endif
-!endif
-
-# Enable cairo
-!if "$(CAIRO)" == "1"
-HB_DEFINES = $(HB_DEFINES) /DHAVE_CAIRO=1
-!endif
-
-# Enable freetype if desired
-!if "$(FREETYPE)" == "1"
-!if "$(FREETYPE_DIR)" != ""
-HB_CFLAGS = $(HB_CFLAGS) /I$(FREETYPE_DIR)
-!endif
-HB_DEFINES = $(HB_DEFINES) /DHAVE_FREETYPE=1
-HB_SOURCES = $(HB_SOURCES) $(HB_FT_sources)
-HB_HEADERS = $(HB_HEADERS) $(HB_FT_headers)
-HB_DEP_LIBS = $(HB_DEP_LIBS) $(FREETYPE_LIB)
-!endif
-
-# Enable graphite2 if desired
-!if "$(GRAPHITE2)" == "1"
-HB_DEFINES = $(HB_DEFINES) /DHAVE_GRAPHITE2=1
-HB_SOURCES = $(HB_SOURCES) $(HB_GRAPHITE2_sources)
-HB_HEADERS = $(HB_HEADERS) $(HB_GRAPHITE2_headers)
-HB_DEP_LIBS = $(HB_DEP_LIBS) $(GRAPHITE2_LIB)
-!endif
-
-# Always enable UCDN unless explicitly disabled
-!if "$(NO_UCDN)" != "1"
-HB_DEFINES = $(HB_DEFINES) /DHAVE_UCDN=1
-HB_CFLAGS =            \
-       $(HB_CFLAGS)            \
-       $(HB_UCDN_CFLAGS)
-
-HB_SOURCES = $(HB_SOURCES) $(hb_ucdn_SRCS) $(HB_UCDN_sources)
-!endif
-
-# Enable GLib if desired
-!if "$(GLIB)" == "1"
-HB_DEFINES = $(HB_DEFINES) /DHAVE_GLIB=1
-HB_CFLAGS =    \
-       $(HB_CFLAGS)                                    \
-       /FImsvc_recommended_pragmas.h   \
-       /I$(PREFIX)\include\glib-2.0    \
-       /I$(PREFIX)\lib\glib-2.0\include
-
-HB_SOURCES = $(HB_SOURCES) $(HB_GLIB_sources)
-HB_HEADERS = $(HB_HEADERS) $(HB_GLIB_headers)
-HB_DEP_LIBS = $(HB_DEP_LIBS) $(HB_GLIB_LIBS)
-
-HB_UTILS = \
-       $(HB_UTILS)                                     \
-       $(CFG)\$(PLAT)\hb-shape.exe     \
-       $(CFG)\$(PLAT)\hb-ot-shape-closure.exe
-
-HB_TESTS = \
-       $(HB_TESTS)     \
-       $(CFG)\$(PLAT)\main.exe                                         \
-       $(CFG)\$(PLAT)\test.exe                                         \
-       $(CFG)\$(PLAT)\test-buffer-serialize.exe        \
-       $(CFG)\$(PLAT)\test-size-params.exe                     \
-       $(CFG)\$(PLAT)\test-would-substitute.exe        \
-       $(CFG)\$(PLAT)\test-blob.exe                            \
-       $(CFG)\$(PLAT)\test-buffer.exe                          \
-       $(CFG)\$(PLAT)\test-common.exe                          \
-       $(CFG)\$(PLAT)\test-font.exe                            \
-       $(CFG)\$(PLAT)\test-object.exe                          \
-       $(CFG)\$(PLAT)\test-set.exe                                     \
-       $(CFG)\$(PLAT)\test-shape.exe                           \
-       $(CFG)\$(PLAT)\test-unicode.exe                         \
-       $(CFG)\$(PLAT)\test-version.exe
-
-!else
-
-# Define some of the macros in GLib's msvc_recommended_pragmas.h
-# to reduce some unneeded build-time warnings
-HB_CFLAGS =    \
-       $(HB_CFLAGS)                    \
-       /wd4244                         \
-       /D_CRT_SECURE_NO_WARNINGS       \
-       /D_CRT_NONSTDC_NO_WARNINGS
-
-!endif
-
-!if "$(ICU)" == "1"
-# use ICU for Unicode functions
-# and define some of the macros in GLib's msvc_recommended_pragmas.h
-# to reduce some unneeded build-time warnings
-HB_DEFINES = $(HB_DEFINES) /DHAVE_ICU=1 /DHAVE_ICU_BUILTIN=1
-
-# We don't want ICU to re-define int8_t in VS 2008, will cause build breakage
-# as we define it in hb-common.h, and we ought to use the definitions there.
-!if "$(VSVER)" == "9"
-HB_CFLAGS =    $(HB_CFLAGS) /DU_HAVE_INT8_T
-!endif
-
-HB_SOURCES = $(HB_SOURCES) $(HB_ICU_sources)
-HB_HEADERS = $(HB_HEADERS) $(HB_ICU_headers)
-HB_DEP_LIBS = $(HB_DEP_LIBS) $(HB_ICU_DEP_LIBS)
-!endif
-
-!if "$(UNISCRIBE)" == "1"
-HB_CFLAGS = $(HB_CFLAGS) /DHAVE_UNISCRIBE
-HB_SOURCES = $(HB_SOURCES) $(HB_UNISCRIBE_sources)
-HB_HEADERS = $(HB_HEADERS) $(HB_UNISCRIBE_headers)
-HB_DEP_LIBS = $(HB_DEP_LIBS) $(UNISCRIBE_LIB)
-!endif
-
-!if "$(DIRECTWRITE)" == "1"
-HB_CFLAGS = $(HB_CFLAGS) /DHAVE_DIRECTWRITE
-HB_SOURCES = $(HB_SOURCES) $(HB_DIRECTWRITE_sources)
-HB_HEADERS = $(HB_HEADERS) $(HB_DIRECTWRITE_headers)
-HB_DEP_LIBS = $(HB_DEP_LIBS) $(DIRECTWRITE_LIB)
-!endif
-
-HB_LIB_CFLAGS = $(HB_CFLAGS) /DHB_EXTERN="__declspec (dllexport) extern"
diff --git a/win32/config.h.win32 b/win32/config.h.win32
deleted file mode 100644 (file)
index 1dffc8d..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* The normal alignment of `struct{char;}', in bytes. */
-#define ALIGNOF_STRUCT_CHAR__ 1
-
-/* Define to 1 if you have the `atexit' function. */
-#define HAVE_ATEXIT 1
-
-/* Have cairo graphics library */
-/* #undef HAVE_CAIRO */
-
-/* Have cairo-ft support in cairo graphics library */
-/* #undef HAVE_CAIRO_FT */
-
-/* Have Core Text backend */
-/* #undef HAVE_CORETEXT */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-/* #undef HAVE_DLFCN_H */
-
-/* Have DirectWrite Library */
-/* #undef HAVE_DIRECTWRITE */
-
-/* Have simple TrueType Layout backend */
-#define HAVE_FALLBACK 1
-
-/* Have fontconfig library */
-/* #undef HAVE_FONTCONFIG */
-
-/* Have FreeType 2 library */
-/* #undef HAVE_FREETYPE */
-
-/* Define to 1 if you have the `getpagesize' function. */
-/* #undef HAVE_GETPAGESIZE */
-
-/* Have glib2 library */
-/* #undef HAVE_GLIB */
-
-/* Have gobject2 library */
-/* #undef HAVE_GOBJECT */
-
-/* Have Graphite2 library */
-/* #undef HAVE_GRAPHITE2 */
-
-/* Have ICU library */
-/* #undef HAVE_ICU */
-
-/* Have Intel __sync_* atomic primitives */
-/* #undef HAVE_INTEL_ATOMIC_PRIMITIVES */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#if !defined (_MSC_VER) || (_MSC_VER >= 1800)
-#define HAVE_INTTYPES_H 1
-#endif
-
-/* Define to 1 if you have the `isatty' function. */
-#define HAVE_ISATTY 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the `mmap' function. */
-/* #undef HAVE_MMAP */
-
-/* Define to 1 if you have the `mprotect' function. */
-/* #undef HAVE_MPROTECT */
-
-/* Have native OpenType Layout backend */
-#define HAVE_OT 1
-
-/* Have POSIX threads */
-/* #undef HAVE_PTHREAD */
-
-/* Have PTHREAD_PRIO_INHERIT. */
-/* #undef HAVE_PTHREAD_PRIO_INHERIT */
-
-/* Define to 1 if you have the <sched.h> header file. */
-/* #undef HAVE_SCHED_H */
-
-/* Have sched_yield */
-/* #undef HAVE_SCHED_YIELD */
-
-/* Have Solaris __machine_*_barrier and atomic_* operations */
-/* #undef HAVE_SOLARIS_ATOMIC_OPS */
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#if !defined (_MSC_VER) || (_MSC_VER >= 1600)
-#define HAVE_STDINT_H 1
-#endif
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#ifndef _MSC_VER
-#define HAVE_STRINGS_H 1
-#endif
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `sysconf' function. */
-/* #undef HAVE_SYSCONF */
-
-/* Define to 1 if you have the <sys/mman.h> header file. */
-/* #undef HAVE_SYS_MMAN_H */
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Have UCDN Unicode functions */
-/* #undef HAVE_UCDN */
-
-/* Have Uniscribe library */
-/* #undef HAVE_UNISCRIBE */
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#ifndef _MSC_VER
-#define HAVE_UNISTD_H 1
-#endif
-
-/* Define to 1 if you have the <usp10.h> header file. */
-#define HAVE_USP10_H 1
-
-/* Define to 1 if you have the <windows.h> header file. */
-#define HAVE_WINDOWS_H 1
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#define LT_OBJDIR ".libs/"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "https://github.com/behdad/harfbuzz/issues/new"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "HarfBuzz"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "HarfBuzz 1.4.6"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "harfbuzz"
-
-/* Define to the home page for this package. */
-#define PACKAGE_URL "http://harfbuzz.org/"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.4.6"
-
-/* Define to necessary symbol if this constant uses a non-standard name on
-   your system. */
-/* #undef PTHREAD_CREATE_JOINABLE */
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
diff --git a/win32/config.h.win32.in b/win32/config.h.win32.in
deleted file mode 100644 (file)
index 435c1bb..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* The normal alignment of `struct{char;}', in bytes. */
-#define ALIGNOF_STRUCT_CHAR__ 1
-
-/* Define to 1 if you have the `atexit' function. */
-#define HAVE_ATEXIT 1
-
-/* Have cairo graphics library */
-/* #undef HAVE_CAIRO */
-
-/* Have cairo-ft support in cairo graphics library */
-/* #undef HAVE_CAIRO_FT */
-
-/* Have Core Text backend */
-/* #undef HAVE_CORETEXT */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-/* #undef HAVE_DLFCN_H */
-
-/* Have DirectWrite Library */
-/* #undef HAVE_DIRECTWRITE */
-
-/* Have simple TrueType Layout backend */
-#define HAVE_FALLBACK 1
-
-/* Have fontconfig library */
-/* #undef HAVE_FONTCONFIG */
-
-/* Have FreeType 2 library */
-/* #undef HAVE_FREETYPE */
-
-/* Define to 1 if you have the `getpagesize' function. */
-/* #undef HAVE_GETPAGESIZE */
-
-/* Have glib2 library */
-/* #undef HAVE_GLIB */
-
-/* Have gobject2 library */
-/* #undef HAVE_GOBJECT */
-
-/* Have Graphite2 library */
-/* #undef HAVE_GRAPHITE2 */
-
-/* Have ICU library */
-/* #undef HAVE_ICU */
-
-/* Have Intel __sync_* atomic primitives */
-/* #undef HAVE_INTEL_ATOMIC_PRIMITIVES */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#if !defined (_MSC_VER) || (_MSC_VER >= 1800)
-#define HAVE_INTTYPES_H 1
-#endif
-
-/* Define to 1 if you have the `isatty' function. */
-#define HAVE_ISATTY 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the `mmap' function. */
-/* #undef HAVE_MMAP */
-
-/* Define to 1 if you have the `mprotect' function. */
-/* #undef HAVE_MPROTECT */
-
-/* Have native OpenType Layout backend */
-#define HAVE_OT 1
-
-/* Have POSIX threads */
-/* #undef HAVE_PTHREAD */
-
-/* Have PTHREAD_PRIO_INHERIT. */
-/* #undef HAVE_PTHREAD_PRIO_INHERIT */
-
-/* Define to 1 if you have the <sched.h> header file. */
-/* #undef HAVE_SCHED_H */
-
-/* Have sched_yield */
-/* #undef HAVE_SCHED_YIELD */
-
-/* Have Solaris __machine_*_barrier and atomic_* operations */
-/* #undef HAVE_SOLARIS_ATOMIC_OPS */
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#if !defined (_MSC_VER) || (_MSC_VER >= 1600)
-#define HAVE_STDINT_H 1
-#endif
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#ifndef _MSC_VER
-#define HAVE_STRINGS_H 1
-#endif
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `sysconf' function. */
-/* #undef HAVE_SYSCONF */
-
-/* Define to 1 if you have the <sys/mman.h> header file. */
-/* #undef HAVE_SYS_MMAN_H */
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Have UCDN Unicode functions */
-/* #undef HAVE_UCDN */
-
-/* Have Uniscribe library */
-/* #undef HAVE_UNISCRIBE */
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#ifndef _MSC_VER
-#define HAVE_UNISTD_H 1
-#endif
-
-/* Define to 1 if you have the <usp10.h> header file. */
-#define HAVE_USP10_H 1
-
-/* Define to 1 if you have the <windows.h> header file. */
-#define HAVE_WINDOWS_H 1
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#define LT_OBJDIR ".libs/"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "@PACKAGE_NAME@"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "@PACKAGE_NAME@ @PACKAGE_VERSION@"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "@PACKAGE_TARNAME@"
-
-/* Define to the home page for this package. */
-#define PACKAGE_URL "@PACKAGE_URL@"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "@PACKAGE_VERSION@"
-
-/* Define to necessary symbol if this constant uses a non-standard name on
-   your system. */
-/* #undef PTHREAD_CREATE_JOINABLE */
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
diff --git a/win32/create-lists-msvc.mak b/win32/create-lists-msvc.mak
deleted file mode 100644 (file)
index dbd2a57..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-# Convert the source listing to object (.obj) listing in
-# another NMake Makefile module, include it, and clean it up.
-# This is a "fact-of-life" regarding NMake Makefiles...
-# This file does not need to be changed unless one is maintaining the NMake Makefiles
-
-# For those wanting to add things here:
-# To add a list, do the following:
-# # $(description_of_list)
-# if [call create-lists.bat header $(makefile_snippet_file) $(variable_name)]
-# endif
-#
-# if [call create-lists.bat file $(makefile_snippet_file) $(file_name)]
-# endif
-#
-# if [call create-lists.bat footer $(makefile_snippet_file)]
-# endif
-# ... (repeat the if [call ...] lines in the above order if needed)
-# !include $(makefile_snippet_file)
-#
-# (add the following after checking the entries in $(makefile_snippet_file) is correct)
-# (the batch script appends to $(makefile_snippet_file), you will need to clear the file unless the following line is added)
-#!if [del /f /q $(makefile_snippet_file)]
-#!endif
-
-# In order to obtain the .obj filename that is needed for NMake Makefiles to build DLLs/static LIBs or EXEs, do the following
-# instead when doing 'if [call create-lists.bat file $(makefile_snippet_file) $(file_name)]'
-# (repeat if there are multiple $(srcext)'s in $(source_list), ignore any headers):
-# !if [for %c in ($(source_list)) do @if "%~xc" == ".$(srcext)" @call create-lists.bat file $(makefile_snippet_file) $(intdir)\%~nc.obj]
-#
-# $(intdir)\%~nc.obj needs to correspond to the rules added in build-rules-msvc.mak
-# %~xc gives the file extension of a given file, %c in this case, so if %c is a.cc, %~xc means .cc
-# %~nc gives the file name of a given file without extension, %c in this case, so if %c is a.cc, %~nc means a
-
-NULL=
-
-# For HarfBuzz
-!if [call create-lists.bat header hb_objs.mak harfbuzz_dll_OBJS]
-!endif
-
-!if [for %c in ($(HB_SOURCES)) do @if "%~xc" == ".cc" @call create-lists.bat file hb_objs.mak ^$(CFG)\^$(PLAT)\harfbuzz\%~nc.obj]
-!endif
-
-!if [for %c in ($(HB_SOURCES)) do @if "%~xc" == ".c" @call create-lists.bat file hb_objs.mak ^$(CFG)\^$(PLAT)\harfbuzz\%~nc.obj]
-!endif
-
-!if [call create-lists.bat footer hb_objs.mak]
-!endif
-
-# For HarfBuzz-GObject
-!if "$(GOBJECT)" == "1"
-
-!if [call create-lists.bat header hb_objs.mak harfbuzz_gobject_OBJS]
-!endif
-
-!if [for %c in ($(HB_GOBJECT_sources) $(HB_GOBJECT_ENUM_sources)) do @if "%~xc" == ".cc" @call create-lists.bat file hb_objs.mak ^$(CFG)\^$(PLAT)\harfbuzz-gobject\%~nc.obj]
-!endif
-
-!if [call create-lists.bat footer hb_objs.mak]
-!endif
-!endif
-
-# For the utility programs (GLib support is required)
-!if "$(GLIB)" == "1"
-
-# For hb-view, Cairo-FT support is required
-!if "$(CAIRO_FT)" == "1"
-
-!if [call create-lists.bat header hb_objs.mak hb_view_OBJS]
-!endif
-
-!if [for %c in ($(HB_VIEW_sources)) do @if "%~xc" == ".cc" @call create-lists.bat file hb_objs.mak ^$(CFG)\^$(PLAT)\util\%~nc.obj]
-!endif
-
-!if [call create-lists.bat footer hb_objs.mak]
-!endif
-!endif
-
-# For hb-shape
-!if [call create-lists.bat header hb_objs.mak hb_shape_OBJS]
-!endif
-
-!if [for %c in ($(HB_SHAPE_sources)) do @if "%~xc" == ".cc" @call create-lists.bat file hb_objs.mak ^$(CFG)\^$(PLAT)\util\%~nc.obj]
-!endif
-
-!if [call create-lists.bat footer hb_objs.mak]
-!endif
-
-# For hb-ot-shape-closure
-
-!if [call create-lists.bat header hb_objs.mak hb_ot_shape_closure_OBJS]
-!endif
-
-!if [for %c in ($(HB_OT_SHAPE_CLOSURE_sources)) do @if "%~xc" == ".cc" @call create-lists.bat file hb_objs.mak ^$(CFG)\^$(PLAT)\util\%~nc.obj]
-!endif
-
-!if [call create-lists.bat footer hb_objs.mak]
-!endif
-
-!endif
-
-!include hb_objs.mak
-
-!if [del /f /q hb_objs.mak]
-!endif
-
-# Gather the list of headers and sources for introspection and glib-mkenums
-!if [call create-lists.bat header hb_srcs.mak HB_ACTUAL_HEADERS]
-!endif
-
-!if [for %h in ($(HB_HEADERS)) do @call create-lists.bat file hb_srcs.mak ..\src\%h]
-!endif
-
-!if [call create-lists.bat footer hb_srcs.mak]
-!endif
-
-# Gather the lists of sources for introspection
-!if [call create-lists.bat header hb_srcs.mak HB_ACTUAL_SOURCES]
-!endif
-
-!if [for %s in ($(HB_SOURCES)) do @call create-lists.bat file hb_srcs.mak ..\src\%s]
-!endif
-
-!if [call create-lists.bat footer hb_srcs.mak]
-!endif
-
-!if [call create-lists.bat header hb_srcs.mak HB_GOBJECT_ACTUAL_SOURCES]
-!endif
-
-!if [for %s in ($(HB_GOBJECT_sources) $(HB_GOBJECT_STRUCTS_headers)) do @call create-lists.bat file hb_srcs.mak ..\src\%s]
-!endif
-
-!if [call create-lists.bat footer hb_srcs.mak]
-!endif
-
-!include hb_srcs.mak
-
-!if [del /f /q hb_srcs.mak]
-!endif
diff --git a/win32/create-lists.bat b/win32/create-lists.bat
deleted file mode 100644 (file)
index ef60d5c..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-@echo off
-rem Simple .bat script for creating the NMake Makefile snippets.
-
-if not "%1" == "header" if not "%1" == "file" if not "%1" == "footer" goto :error_cmd
-if "%2" == "" goto error_no_destfile
-
-if "%1" == "header" goto :header
-if "%1" == "file" goto :addfile
-if "%1" == "footer" goto :footer
-
-:header
-if "%3" == "" goto error_var
-echo %3 =      \>>%2
-goto done
-
-:addfile
-if "%3" == "" goto error_file
-echo.  %3      \>>%2
-goto done
-
-:footer
-echo.  $(NULL)>>%2
-echo.>>%2
-goto done
-
-:error_cmd
-echo Specified command '%1' was invalid.  Valid commands are: header file footer.
-goto done
-
-:error_no_destfile
-echo Destination NMake snippet file must be specified
-goto done
-
-:error_var
-echo A name must be specified for using '%1'.
-goto done
-
-:error_file
-echo A file must be specified for using '%1'.
-goto done
-
-:done
\ No newline at end of file
diff --git a/win32/detectenv-msvc.mak b/win32/detectenv-msvc.mak
deleted file mode 100644 (file)
index d108052..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-# Change this (or specify PREFIX= when invoking this NMake Makefile) if
-# necessary, so that the libs and headers of the dependent third-party
-# libraries can be located.  For instance, if building from GLib's
-# included Visual Studio projects, this should be able to locate the GLib
-# build out-of-the-box if they were not moved.  GLib's headers will be
-# found in $(GLIB_PREFIX)\include\glib-2.0 and
-# $(GLIB_PREFIX)\lib\glib-2.0\include and its import library will be found
-# in $(GLIB_PREFIX)\lib.
-
-!if "$(PREFIX)" == ""
-PREFIX = ..\..\vs$(VSVER)\$(PLAT)
-!endif
-
-# Location of the PERL interpretor, for running glib-mkenums.  glib-mkenums
-# needs to be found in $(PREFIX)\bin.  Using either a 32-bit or x64 PERL
-# interpretor are supported for either a 32-bit or x64 build.
-
-!if "$(PERL)" == ""
-PERL = perl
-!endif
-
-# Location of the Python interpretor, for building introspection.  The complete set
-# of Python Modules for introspection (the giscanner Python scripts and the _giscanner.pyd
-# compiled module) needs to be found in $(PREFIX)\lib\gobject-introspection\giscanner, and
-# the g-ir-scanner Python script and g-ir-compiler utility program needs to be found
-# in $(PREFIX)\bin, together with any DLLs they will depend on, if those DLLs are not already
-# in your PATH.
-# Note that the Python interpretor and the introspection modules and utility progam must
-# correspond to the build type (i.e. 32-bit Release for 32-bit Release builds, and so on).
-#
-# For introspection, currently only Python 2.7.x is supported.  This may change when Python 3.x
-# support is added upstream in gobject-introspection--when this happens, the _giscanner.pyd must
-# be the one that is built against the release series of Python that is used here.
-
-!if "$(PYTHON)" == ""
-PYTHON = python
-!endif
-
-# Location of the pkg-config utility program, for building introspection.  It needs to be able
-# to find the pkg-config (.pc) files so that the correct libraries and headers for the needed libraries
-# can be located, using PKG_CONFIG_PATH.  Using either a 32-bit or x64 pkg-config are supported for
-# either a 32-bit or x64 build.
-
-!if "$(PKG_CONFIG)" == ""
-PKG_CONFIG = pkg-config
-!endif
-
-# The items below this line should not be changed, unless one is maintaining
-# the NMake Makefiles.  The exception is for the CFLAGS_ADD line(s) where one
-# could use his/her desired compiler optimization flags, if he/she knows what is
-# being done.
-
-# Check to see we are configured to build with MSVC (MSDEVDIR, MSVCDIR or
-# VCINSTALLDIR) or with the MS Platform SDK (MSSDK or WindowsSDKDir)
-!if !defined(VCINSTALLDIR) && !defined(WINDOWSSDKDIR)
-MSG = ^
-This Makefile is only for Visual Studio 2008 and later.^
-You need to ensure that the Visual Studio Environment is properly set up^
-before running this Makefile.
-!error $(MSG)
-!endif
-
-ERRNUL  = 2>NUL
-_HASH=^#
-
-!if ![echo VCVERSION=_MSC_VER > vercl.x] \
-    && ![echo $(_HASH)if defined(_M_IX86) >> vercl.x] \
-    && ![echo PLAT=Win32 >> vercl.x] \
-    && ![echo $(_HASH)elif defined(_M_AMD64) >> vercl.x] \
-    && ![echo PLAT=x64 >> vercl.x] \
-    && ![echo $(_HASH)endif >> vercl.x] \
-    && ![cl -nologo -TC -P vercl.x $(ERRNUL)]
-!include vercl.i
-!if ![echo VCVER= ^\> vercl.vc] \
-    && ![set /a $(VCVERSION) / 100 - 6 >> vercl.vc]
-!include vercl.vc
-!endif
-!endif
-!if ![del $(ERRNUL) /q/f vercl.x vercl.i vercl.vc]
-!endif
-
-!if $(VCVERSION) > 1499 && $(VCVERSION) < 1600
-VSVER = 9
-!elseif $(VCVERSION) > 1599 && $(VCVERSION) < 1700
-VSVER = 10
-!elseif $(VCVERSION) > 1699 && $(VCVERSION) < 1800
-VSVER = 11
-!elseif $(VCVERSION) > 1799 && $(VCVERSION) < 1900
-VSVER = 12
-!elseif $(VCVERSION) > 1899 && $(VCVERSION) < 1910
-VSVER = 14
-!elseif $(VCVERSION) > 1909 && $(VCVERSION) < 2000
-VSVER = 15
-!else
-VSVER = 0
-!endif
-
-!if "$(VSVER)" == "0"
-MSG = ^
-This NMake Makefile set supports Visual Studio^
-9 (2008) through 14 (2015).  Your Visual Studio^
-version is not supported.
-!error $(MSG)
-!endif
-
-VALID_CFGSET = FALSE
-!if "$(CFG)" == "release" || "$(CFG)" == "debug"
-VALID_CFGSET = TRUE
-!endif
-
-# One may change these items, but be sure to test
-# the resulting binaries
-!if "$(CFG)" == "release"
-CFLAGS_ADD = /MD /O2 /GL /MP
-!if $(VSVER) > 9 && $(VSVER) < 14
-# Undocumented "enhance optimized debugging" switch. Became documented
-# as "/Zo" in VS 2013 Update 3, and is turned on by default in VS 2015.
-CFLAGS_ADD = $(CFLAGS_ADD) /d2Zi+
-!endif
-!else
-CFLAGS_ADD = /MDd /Od
-!endif
-
-!if "$(PLAT)" == "x64"
-LDFLAGS_ARCH = /machine:x64
-!elseif "$(PLAT)" == "arm"
-LDFLAGS_ARCH = /machine:arm
-CFLAGS_ADD = $(CFLAGS_ADD) /DWINAPI_FAMILY=3
-!else
-LDFLAGS_ARCH = /machine:x86
-!endif
-
-!if "$(VALID_CFGSET)" == "TRUE"
-CFLAGS = $(CFLAGS_ADD) /W3 /Zi /I.. /I..\src /I. /I$(PREFIX)\include
-
-!if "$(ADDITIONAL_LIB_DIR)" != ""
-ADDITIONAL_LIB_ARG = /libpath:$(ADDITIONAL_LIB_DIR)
-!endif
-LDFLAGS_BASE = $(LDFLAGS_ARCH) /libpath:$(PREFIX)\lib $(ADDITIONAL_LIB_ARG) /DEBUG
-
-!if "$(CFG)" == "debug"
-LDFLAGS = $(LDFLAGS_BASE)
-!else
-LDFLAGS = $(LDFLAGS_BASE) /opt:ref /LTCG
-!endif
-!endif
diff --git a/win32/generate-msvc.mak b/win32/generate-msvc.mak
deleted file mode 100644 (file)
index 32214eb..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-# NMake Makefile portion for code generation and
-# intermediate build directory creation
-# Items in here should not need to be edited unless
-# one is maintaining the NMake build files.
-
-# Copy the pre-defined config.h.win32
-config.h: config.h.win32
-       @-copy $@.win32 $@
-
-# Generate the enumeration sources and headers
-# sed is not normally available on Windows, but since
-# we are already using PERL, use PERL one-liners.
-!if "$(GOBJECT)" == "1"
-$(HB_GOBJECT_ENUM_GENERATED_SOURCES): ..\src\hb-gobject-enums.h.tmpl ..\src\hb-gobject-enums.cc.tmpl $(HB_ACTUAL_HEADERS)
-       $(PERL) $(PREFIX)\bin\glib-mkenums \
-               --identifier-prefix hb_ --symbol-prefix hb_gobject \
-               --template ..\src\$(@F).tmpl  $(HB_ACTUAL_HEADERS) > $@
-       $(PERL) -p -i.tmp1 -e "s/_t_get_type/_get_type/g" $@
-       $(PERL) -p -i.tmp2 -e "s/_T \(/ (/g" $@
-       @-del $@.tmp1
-       @-del $@.tmp2
-!endif
-
-# Create the build directories
-$(CFG)\$(PLAT)\harfbuzz $(CFG)\$(PLAT)\harfbuzz-gobject $(CFG)\$(PLAT)\util:
-       @-md $@
diff --git a/win32/hb-introspection-msvc.mak b/win32/hb-introspection-msvc.mak
deleted file mode 100644 (file)
index 67a0c5e..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-
-!if "$(BUILD_INTROSPECTION)" == "TRUE"
-# Create the file list for introspection (to avoid the dreaded command-line-too-long problem on Windows)
-$(CFG)\$(PLAT)\hb_list: $(HB_ACTUAL_HEADERS) $(HB_ACTUAL_SOURCES) $(HB_GOBJECT_ENUM_GENERATED_SOURCES) $(HB_GOBJECT_ACTUAL_SOURCES)
-       @for %f in ($(HB_ACTUAL_HEADERS) $(HB_ACTUAL_SOURCES) $(HB_GOBJECT_ENUM_GENERATED_SOURCES) $(HB_GOBJECT_ACTUAL_SOURCES)) do @echo %f >> $@
-
-$(CFG)\$(PLAT)\HarfBuzz-0.0.gir: $(CFG)\$(PLAT)\harfbuzz-gobject.lib $(CFG)\$(PLAT)\hb_list
-       @set LIB=$(CFG)\$(PLAT);$(PREFIX)\lib;$(LIB)
-       @set PATH=$(CFG)\$(PLAT);$(PREFIX)\bin;$(PATH)
-       @-echo Generating $@...
-       $(PYTHON) $(G_IR_SCANNER)       \
-       --verbose -no-libtool   \
-       -I..\src -n hb --identifier-prefix=hb_ --warn-all       \
-       --namespace=HarfBuzz    \
-       --nsversion=0.0 \
-       --include=GObject-2.0   \
-       --library=harfbuzz-gobject      \
-       --library=harfbuzz      \
-       --add-include-path=$(G_IR_INCLUDEDIR)   \
-       --pkg-export=harfbuzz   \
-       --cflags-begin  \
-       $(CFLAGS) $(HB_DEFINES) $(HB_CFLAGS)    \
-       -DHB_H \
-       -DHB_H_IN \
-       -DHB_OT_H \
-       -DHB_OT_H_IN \
-       -DHB_GOBJECT_H \
-       -DHB_GOBJECT_H_IN \
-       --cflags-end    \
-       --filelist=$(CFG)\$(PLAT)\hb_list       \
-       -o $@
-
-$(CFG)\$(PLAT)\HarfBuzz-0.0.typelib: $(CFG)\$(PLAT)\HarfBuzz-0.0.gir
-       @copy $*.gir $(@B).gir
-       $(PREFIX)\bin\g-ir-compiler     \
-       --includedir=$(CFG)\$(PLAT) --debug --verbose   \
-       $(@B).gir       \
-       -o $@
-       @del $(@B).gir
-!else
-!error $(ERROR_MSG)
-!endif
diff --git a/win32/info-msvc.mak b/win32/info-msvc.mak
deleted file mode 100644 (file)
index 70daf76..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-# NMake Makefile portion for displaying config info
-
-INC_FEATURES = Fallback OT
-BUILT_TOOLS =
-BUILT_LIBRARIES = HarfBuzz
-
-!if "$(NO_UCDN)" != "1"
-UNICODE_IMPL = ucdn
-!elseif "$(GLIB)" == "1"
-UNICODE_IMPL = GLib
-!elseif "$(ICU)" == "1"
-UNICODE_IMPL = ICU
-!endif
-
-!if "$(GLIB)" == "1"
-INC_FEATURES = $(INC_FEATURES) GLib
-BUILT_TOOLS = hb-shape.exe hb-ot-shape-closure.exe
-!if "$(CAIRO_FT)" == "1"
-BUILT_TOOLS = hb-view.exe $(BUILT_TOOLS)
-!endif
-!endif
-!if "$(ICU)" == "1"
-INC_FEATURES = $(INC_FEATURES) ICU
-!endif
-
-!if "$(FREETYPE)" == "1"
-INC_FEATURES = $(INC_FEATURES) FreeType
-!endif
-
-!if "$(GRAPHITE2)" == "1"
-INC_FEATURES = $(INC_FEATURES) Graphite2
-!endif
-
-!if "$(UNISCRIBE)" == "1"
-INC_FEATURES = $(INC_FEATURES) Uniscribe
-!endif
-
-!if "$(DIRECTWRITE)" == "1"
-INC_FEATURES = $(INC_FEATURES) DirectWrite
-!endif
-
-!if "$(GOBJECT)" == "1"
-BUILT_LIBRARIES = $(BUILT_LIBRARIES) HarfBuzz-GObject
-!endif
-
-!if "$(INTROSPECTION)" == "1"
-BUILD_INTROSPECTION = yes
-!else
-BUILD_INTROSPECTION = no
-!endif
-
-build-info-hb:
-       @echo.
-       @echo ==================================
-       @echo Configuration for HarfBuzz Library
-       @echo ==================================
-       @echo Unicode Implementation: $(UNICODE_IMPL)
-       @echo Enabled Features: $(INC_FEATURES)
-
-all-build-info: build-info-hb
-       @echo.
-       @echo ----------------
-       @echo Other build info
-       @echo ----------------
-       @echo Built Libraries: $(BUILT_LIBRARIES)
-       @echo Built Tools: $(BUILT_TOOLS)
-       @echo Introspection: $(BUILD_INTROSPECTION)
-
-help:
-       @echo.
-       @echo =============================
-       @echo Building HarfBuzz Using NMake
-       @echo =============================
-       @echo nmake /f Makefile.vc CFG=[release^|debug] ^<PREFIX=PATH^> OPTION=1 ...
-       @echo.
-       @echo Where:
-       @echo ------
-       @echo CFG: Required, use CFG=release for an optimized build and CFG=debug
-       @echo for a debug build.  PDB files are generated for all builds.
-       @echo.
-       @echo PREFIX: Optional, the path where dependent libraries and tools may be
-       @echo found, default is ^$(srcrootdir)\..\vs^$(short_vs_ver)\^$(platform),
-       @echo where ^$(short_vs_ver) is 9 for VS 2008, 10 for VS 2010 and so on; and
-       @echo ^$(platform) is Win32 for 32-bit builds and x64 for x64 builds.
-       @echo.
-       @echo OPTION: Optional, may be any of the following, use OPTION=1 to enable;
-       @echo multiple OPTION's may be used.  If no OPTION is specified, a default
-       @echo HarfBuzz DLL is built with OpenType and support with a bundled
-       @echo Unicode implementation (UCDN).
-       @echo ======
-       @echo.
-       @echo CAIRO_FT:
-       @echo Enables Cairo-Freetype support, needed for the build of the hb-view utility.
-       @echo Implies FreeType2 support and also requires Cairo built with FreeType2
-       @echo support; GLib2 support must also be enabled.
-       @echo.
-       @echo DIRECTWRITE:
-       @echo Enable DirectWrite support, requires a recent enough Windows SDK.
-       @echo.
-       @echo FREETYPE:
-       @echo Enable FreeType2 support, requires the FreeType2 library
-       @echo.
-       @echo GLIB:
-       @echo Enable GLib2 support, with GLib Unicode support, requires the GNOME GLib2
-       @echo library.  Enables the build of utility programs.
-       @echo.
-       @echo GOBJECT:
-       @echo Enable the HarfBuzz-GObject library, also implies GLib2 support,
-       @echo requires the GNOME GLib2 libraries and tools, notably the glib-mkenums
-       @echo tool script, which will require a PERL interpreter (use
-       @echo PERL=^$(PATH_TO_PERL_INTERPRETOR)) if it is not already in your PATH).
-       @echo.
-       @echo GRAPHITE2:
-       @echo Enable graphite2 support, requires the SIL Graphite2 library
-       @echo.
-       @echo ICU:
-       @echo Enable build with ICU Unicode functions, requires the International
-       @echo Components for Unicode (ICU) libraries.
-       @echo.
-       @echo INTROSPECTION:
-       @echo Enable the build of introspection files, also implies GObject/GLib2 support,
-       @echo requires the GNOME gobject-introspection libraries and tools.  You will need
-       @echo to ensure the pkg-config (.pc) files can be found for GObject-2.0 and the
-       @echo Python interpreter (that was used to build the gobject-introspection tools)
-       @echo can be found by setting PKG_CONFIG_PATH beforehand, and passing in PYTHON=
-       @echo ^$(PATH_TO_PYTHON_INTERPRETOR) respectively, if python.exe is not already
-       @echo in your PATH.
-       @echo.
-       @echo LIBTOOL_DLL_NAME:
-       @echo Use a libtool-style DLL name to mimic the DLL file naming generated by
-       @echo MinGW builds.
-       @echo.
-       @echo NO_UCDN:
-       @echo Do not use the bundled Unicode callback, which is the default.  GLib or
-       @echo ICU-based unicode callback is therefore required.
-       @echo
-       @echo UNISCRIBE:
-       @echo Enable Uniscribe support.
-       @echo.
-       @echo Note that GLib2 support is required for all utility and test programs.
-       @echo ======
-       @echo A 'clean' target is supported to remove all generated files, intermediate
-       @echo object files and binaries for the specified configuration.
-       @echo.
-       @echo A 'tests' target is supported to build the test programs, if GLib2 support
-       @echo is enabled.  Use after building the libraries and utilities.
-       @echo.
-       @echo An 'install' target is supported to copy the build (DLLs, utility programs,
-       @echo LIBs, along with the introspection files if applicable) to appropriate
-       @echo locations under ^$(PREFIX).
-       @echo ======
-       @echo.
-       
diff --git a/win32/install.mak b/win32/install.mak
deleted file mode 100644 (file)
index e0a38e3..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-# NMake Makefile snippet for copying the built libraries, utilities and headers to
-# a path under $(PREFIX).
-
-install: all
-       @if not exist $(PREFIX)\bin\ mkdir $(PREFIX)\bin
-       @if not exist $(PREFIX)\lib\ mkdir $(PREFIX)\lib
-       @if not exist $(PREFIX)\include\harfbuzz\ mkdir $(PREFIX)\include\harfbuzz
-       @copy /b $(HARFBUZZ_DLL_FILENAME).dll $(PREFIX)\bin
-       @copy /b $(HARFBUZZ_DLL_FILENAME).pdb $(PREFIX)\bin
-       @copy /b $(CFG)\$(PLAT)\harfbuzz.lib $(PREFIX)\lib
-       @if exist $(HARFBUZZ_GOBJECT_DLL_FILENAME).dll copy /b $(HARFBUZZ_GOBJECT_DLL_FILENAME).dll $(PREFIX)\bin
-       @if exist $(HARFBUZZ_GOBJECT_DLL_FILENAME).dll copy /b $(HARFBUZZ_GOBJECT_DLL_FILENAME).pdb $(PREFIX)\bin
-       @if exist $(HARFBUZZ_GOBJECT_DLL_FILENAME).dll copy /b $(CFG)\$(PLAT)\harfbuzz-gobject.lib $(PREFIX)\lib
-       @if exist $(CFG)\$(PLAT)\hb-view.exe copy /b $(CFG)\$(PLAT)\hb-view.exe $(PREFIX)\bin
-       @if exist $(CFG)\$(PLAT)\hb-view.exe copy /b $(CFG)\$(PLAT)\hb-view.pdb $(PREFIX)\bin
-       @if exist $(CFG)\$(PLAT)\hb-ot-shape-closure.exe copy /b $(CFG)\$(PLAT)\hb-ot-shape-closure.exe $(PREFIX)\bin
-       @if exist $(CFG)\$(PLAT)\hb-ot-shape-closure.exe copy /b $(CFG)\$(PLAT)\hb-ot-shape-closure.pdb $(PREFIX)\bin
-       @if exist $(CFG)\$(PLAT)\hb-shape.exe copy /b $(CFG)\$(PLAT)\hb-shape.exe $(PREFIX)\bin
-       @if exist $(CFG)\$(PLAT)\hb-shape.exe copy /b $(CFG)\$(PLAT)\hb-shape.pdb $(PREFIX)\bin
-       @for %h in ($(HB_ACTUAL_HEADERS)) do @copy %h $(PREFIX)\include\harfbuzz
-       @if exist $(HARFBUZZ_GOBJECT_DLL_FILENAME).dll for %h in ($(HB_GOBJECT_headers)) do @copy ..\src\%h $(PREFIX)\include\harfbuzz
-       @if exist $(HARFBUZZ_GOBJECT_DLL_FILENAME).dll copy $(CFG)\$(PLAT)\harfbuzz-gobject\hb-gobject-enums.h $(PREFIX)\include\harfbuzz
-       @rem Copy the generated introspection files
-       @if exist $(CFG)\$(PLAT)\HarfBuzz-0.0.gir copy $(CFG)\$(PLAT)\HarfBuzz-0.0.gir $(PREFIX)\share\gir-1.0
-       @if exist $(CFG)\$(PLAT)\HarfBuzz-0.0.typelib copy /b $(CFG)\$(PLAT)\HarfBuzz-0.0.typelib $(PREFIX)\lib\girepository-1.0
diff --git a/win32/introspection-msvc.mak b/win32/introspection-msvc.mak
deleted file mode 100644 (file)
index d32f7cf..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-# Common NMake Makefile module for checking the build environment is sane
-# for building introspection files under MSVC/NMake.
-# This can be copied from $(gi_srcroot)\build\win32 for GNOME items
-# that support MSVC builds and introspection under MSVC.
-
-# Can override with env vars as needed
-# You will need to have built gobject-introspection for this to work.
-# Change or pass in or set the following to suit your environment
-
-!if "$(PREFIX)" == ""
-PREFIX = ..\..\..\vs$(VSVER)\$(PLAT)
-!endif
-
-# Note: The PYTHON must be the Python release series that was used to build
-# the GObject-introspection scanner Python module!
-# Either having python.exe your PATH will work or passing in
-# PYTHON=<full path to your Python interpretor> will do
-
-# This is required, and gobject-introspection needs to be built
-# before this can be successfully run.
-!if "$(PYTHON)" == ""
-PYTHON=python
-!endif
-
-# Don't change anything following this line!
-
-GIR_SUBDIR = share\gir-1.0
-GIR_TYPELIBDIR = lib\girepository-1.0
-G_IR_SCANNER = $(PREFIX)\bin\g-ir-scanner
-G_IR_COMPILER = $(PREFIX)\bin\g-ir-compiler.exe
-G_IR_INCLUDEDIR = $(PREFIX)\$(GIR_SUBDIR)
-G_IR_TYPELIBDIR = $(PREFIX)\$(GIR_TYPELIBDIR)
-
-VALID_PKG_CONFIG_PATH = FALSE
-
-MSG_INVALID_PKGCONFIG = You must set or specifiy a valid PKG_CONFIG_PATH
-MSG_INVALID_CFG = You need to specify or set CFG to be release or debug to use this Makefile to build the Introspection Files
-
-ERROR_MSG =
-
-BUILD_INTROSPECTION = TRUE
-
-!if ![pkg-config --print-errors --errors-to-stdout $(CHECK_PACKAGE) > pkgconfig.x]     \
-       && ![setlocal]  \
-       && ![set file="pkgconfig.x"]    \
-       && ![FOR %A IN (%file%) DO @echo PKG_CHECK_SIZE=%~zA > pkgconfig.chksize]       \
-       && ![del $(ERRNUL) /q/f pkgconfig.x]
-!endif
-
-!include pkgconfig.chksize
-!if "$(PKG_CHECK_SIZE)" == "0"
-VALID_PKG_CONFIG_PATH = TRUE
-!else
-VALID_PKG_CONFIG_PATH = FALSE
-!endif
-
-!if ![del $(ERRNUL) /q/f pkgconfig.chksize]
-!endif
-
-VALID_CFGSET = FALSE
-!if "$(CFG)" == "release" || "$(CFG)" == "debug"
-VALID_CFGSET = TRUE
-!endif
-
-!if "$(VALID_PKG_CONFIG_PATH)" != "TRUE"
-BUILD_INTROSPECTION = FALSE
-ERROR_MSG = $(MSG_INVALID_PKGCONFIG)
-!endif
-
-!if "$(VALID_CFGSET)" != "TRUE"
-BUILD_INTROSPECTION = FALSE
-ERROR_MSG = $(MSG_INVALID_CFG)
-!endif